Single UDP datagram may contain multiple QUIC datagrams. In order to
facilitate handling of such cases, 'first' flag in the ngx_quic_header_t
structure is introduced.
qc = ngx_quic_get_connection(c);
/* A stateless reset uses an entire UDP datagram */
- if (pkt->raw->start != pkt->data) {
+ if (!pkt->first) {
return NGX_DECLINED;
}
ngx_quic_input(ngx_connection_t *c, ngx_buf_t *b, ngx_quic_conf_t *conf)
{
size_t size;
- u_char *p;
+ u_char *p, *start;
ngx_int_t rc;
ngx_uint_t good;
ngx_quic_header_t pkt;
size = b->last - b->pos;
- p = b->pos;
+ p = start = b->pos;
while (p < b->last) {
pkt.data = p;
pkt.len = b->last - p;
pkt.log = c->log;
+ pkt.first = (p == start) ? 1 : 0;
pkt.flags = p[0];
pkt.raw->pos++;
pkt->decrypted = 1;
- if (ngx_quic_update_paths(c, pkt) != NGX_OK) {
- return NGX_ERROR;
+ if (pkt->first) {
+ if (ngx_quic_update_paths(c, pkt) != NGX_OK) {
+ return NGX_ERROR;
+ }
}
if (c->ssl == NULL) {
update:
- if (pkt->raw->start == pkt->data) {
- len = pkt->raw->last - pkt->raw->start;
-
- } else {
- len = 0;
- }
+ len = pkt->raw->last - pkt->raw->start;
/* TODO: this may be too late in some cases;
* for example, if error happens during decrypt(), we cannot
unsigned decrypted:1;
unsigned validated:1;
unsigned retried:1;
+ unsigned first:1;
} ngx_quic_header_t;