Mercurial > hg > nginx
diff src/event/ngx_event_quic_transport.c @ 8315:fdda518d10ba quic
Proper handling of packet number in header.
- fixed setting of largest received packet number.
- sending properly truncated packet number
- added support for multi-byte packet number
author | Vladimir Homutov <vl@nginx.com> |
---|---|
date | Fri, 03 Apr 2020 14:02:16 +0300 |
parents | e10b4c61420f |
children | 853908b5a216 |
line wrap: on
line diff
--- a/src/event/ngx_event_quic_transport.c Fri Apr 03 13:49:44 2020 +0300 +++ b/src/event/ngx_event_quic_transport.c Fri Apr 03 14:02:16 2020 +0300 @@ -37,6 +37,11 @@ #endif +#define ngx_quic_write_uint24(p, s) \ + ((p)[0] = (u_char) ((s) >> 16), \ + (p)[1] = (u_char) ((s) >> 8), \ + (p)[2] = (u_char) (s), \ + (p) + 3) #define ngx_quic_write_uint16_aligned(p, s) \ (*(uint16_t *) (p) = htons((uint16_t) (s)), (p) + sizeof(uint16_t)) @@ -362,11 +367,24 @@ ngx_quic_build_int(&p, pkt->token.len); } - ngx_quic_build_int(&p, pkt_len + 1); // length (inc. pnl) + ngx_quic_build_int(&p, pkt_len + pkt->num_len); *pnp = p; - *p++ = pkt->number; // XXX: uint64 + switch (pkt->num_len) { + case 1: + *p++ = pkt->trunc; + break; + case 2: + p = ngx_quic_write_uint16(p, pkt->trunc); + break; + case 3: + p = ngx_quic_write_uint24(p, pkt->trunc); + break; + case 4: + p = ngx_quic_write_uint32(p, pkt->trunc); + break; + } return p - start; } @@ -380,13 +398,26 @@ p = start = out; - *p++ = 0x40; + *p++ = pkt->flags; p = ngx_cpymem(p, pkt->scid.data, pkt->scid.len); *pnp = p; - *p++ = pkt->number; // XXX: uint64 + switch (pkt->num_len) { + case 1: + *p++ = pkt->trunc; + break; + case 2: + p = ngx_quic_write_uint16(p, pkt->trunc); + break; + case 3: + p = ngx_quic_write_uint24(p, pkt->trunc); + break; + case 4: + p = ngx_quic_write_uint32(p, pkt->trunc); + break; + } return p - start; }