nx_quic_frame.nx source
↩ module page · 80 lines · 4279 B
1// nx_quic_frame.nx -- RUNG 4 of the sovereign QUIC transport: core frames (RFC 9000 sec 19) that the
2// handshake + control path need -- CRYPTO (carries TLS), ACK (loss/recovery), PADDING, PING,
3// CONNECTION_CLOSE. With R1's DATAGRAM (0x30/0x31) this completes the QUIC WIRE FORMAT layer.
4// All frames are varint-framed (R1). No float. license_tier: ORIGINAL
5import "nx_quic_wire.nx"
6
7// CRYPTO frame (0x06): [0x06][Offset vi][Length vi][crypto data]. carries TLS 1.3 handshake bytes (R4->R6).
8func quic_crypto_encode(out: *u8, offset: i64, data: *u8, dlen: i64) -> i64 {
9 out[0] = 0x06 as u8
10 var o: i64 = 1
11 o = o + quic_varint_encode((out as i64 + o) as *u8, offset)
12 o = o + quic_varint_encode((out as i64 + o) as *u8, dlen)
13 var i: i64 = 0; while i < dlen { out[o + i] = data[i]; i = i + 1 }
14 return o + dlen
15}
16// parse CRYPTO -> info[0]=offset, info[1]=length, info[2]=data offset. 0 ok / -1.
17func quic_crypto_parse(buf: *u8, n: i64, info: *i64) -> i64 {
18 if n < 1 { return 0 - 1 }
19 if (buf[0] as i64) != 0x06 { return 0 - 1 }
20 let vb: *i64 = sys_mmap(8) as *i64
21 var o: i64 = 1
22 let c1: i64 = quic_varint_decode((buf as i64 + o) as *u8, n - o, vb); if c1 == 0 { return 0 - 1 } info[0] = vb[0]; o = o + c1
23 let c2: i64 = quic_varint_decode((buf as i64 + o) as *u8, n - o, vb); if c2 == 0 { return 0 - 1 } info[1] = vb[0]; o = o + c2
24 if o + info[1] > n { return 0 - 1 }
25 info[2] = o
26 return 0
27}
28
29// ACK frame (0x02): [0x02][Largest Ack vi][ACK Delay vi][ACK Range Count vi][First ACK Range vi][...].
30// R4 emits the single-range form (Range Count 0); parse reads largest/delay/count/first.
31func quic_ack_encode(out: *u8, largest: i64, delay: i64, first_range: i64) -> i64 {
32 out[0] = 0x02 as u8
33 var o: i64 = 1
34 o = o + quic_varint_encode((out as i64 + o) as *u8, largest)
35 o = o + quic_varint_encode((out as i64 + o) as *u8, delay)
36 o = o + quic_varint_encode((out as i64 + o) as *u8, 0)
37 o = o + quic_varint_encode((out as i64 + o) as *u8, first_range)
38 return o
39}
40// parse -> info[0]=largest, info[1]=delay, info[2]=range count, info[3]=first range. 0 ok / -1.
41func quic_ack_parse(buf: *u8, n: i64, info: *i64) -> i64 {
42 if n < 1 { return 0 - 1 }
43 if (buf[0] as i64) != 0x02 { return 0 - 1 }
44 let vb: *i64 = sys_mmap(8) as *i64
45 var o: i64 = 1
46 let a: i64 = quic_varint_decode((buf as i64 + o) as *u8, n - o, vb); if a == 0 { return 0 - 1 } info[0] = vb[0]; o = o + a
47 let b: i64 = quic_varint_decode((buf as i64 + o) as *u8, n - o, vb); if b == 0 { return 0 - 1 } info[1] = vb[0]; o = o + b
48 let c: i64 = quic_varint_decode((buf as i64 + o) as *u8, n - o, vb); if c == 0 { return 0 - 1 } info[2] = vb[0]; o = o + c
49 let d: i64 = quic_varint_decode((buf as i64 + o) as *u8, n - o, vb); if d == 0 { return 0 - 1 } info[3] = vb[0]; o = o + d
50 return 0
51}
52
53func quic_padding_byte() -> i64 { return 0x00 }
54func quic_ping_byte() -> i64 { return 0x01 }
55
56// CONNECTION_CLOSE (0x1c, transport error): [0x1c][Error Code vi][Frame Type vi][Reason Len vi][Reason].
57func quic_conn_close_encode(out: *u8, errcode: i64, frametype: i64, reason: *u8, rlen: i64) -> i64 {
58 out[0] = 0x1c as u8
59 var o: i64 = 1
60 o = o + quic_varint_encode((out as i64 + o) as *u8, errcode)
61 o = o + quic_varint_encode((out as i64 + o) as *u8, frametype)
62 o = o + quic_varint_encode((out as i64 + o) as *u8, rlen)
63 var i: i64 = 0; while i < rlen { out[o + i] = reason[i]; i = i + 1 }
64 return o + rlen
65}
66// parse -> info[0]=error code, info[1]=frame type, info[2]=reason len, info[3]=reason offset. 0/-1.
67func quic_conn_close_parse(buf: *u8, n: i64, info: *i64) -> i64 {
68 if n < 1 { return 0 - 1 }
69 if (buf[0] as i64) != 0x1c { return 0 - 1 }
70 let vb: *i64 = sys_mmap(8) as *i64
71 var o: i64 = 1
72 let a: i64 = quic_varint_decode((buf as i64 + o) as *u8, n - o, vb); if a == 0 { return 0 - 1 } info[0] = vb[0]; o = o + a
73 let b: i64 = quic_varint_decode((buf as i64 + o) as *u8, n - o, vb); if b == 0 { return 0 - 1 } info[1] = vb[0]; o = o + b
74 let c: i64 = quic_varint_decode((buf as i64 + o) as *u8, n - o, vb); if c == 0 { return 0 - 1 } info[2] = vb[0]; o = o + c
75 if o + info[2] > n { return 0 - 1 }
76 info[3] = o
77 return 0
78}
79
80func main() -> i64 { return 0 }