struct ngx_quic_connection_s {
+ uint32_t version;
ngx_str_t scid; /* initial client ID */
ngx_str_t dcid; /* server (our own) ID */
ngx_str_t odcid; /* original server ID */
return NULL;
}
+ qc->version = pkt->version;
+
ngx_rbtree_init(&qc->streams.tree, &qc->streams.sentinel,
ngx_quic_rbtree_insert_stream);
ngx_memzero(&pkt, sizeof(ngx_quic_header_t));
pkt.flags = NGX_QUIC_PKT_FIXED_BIT | NGX_QUIC_PKT_LONG | NGX_QUIC_PKT_RETRY;
+ pkt.version = c->quic->version;
pkt.log = c->log;
pkt.odcid = c->quic->odcid;
pkt.dcid = c->quic->scid;
return NGX_DECLINED;
}
+ if (pkt->level != ssl_encryption_application) {
+ if (pkt->version != qc->version) {
+ ngx_log_error(NGX_LOG_INFO, c->log, 0,
+ "quic version mismatch: 0x%xD", pkt->version);
+ return NGX_DECLINED;
+ }
+ }
+
if (ngx_quic_check_peer(qc, pkt) != NGX_OK) {
if (pkt->level == ssl_encryption_application) {
ngx_quic_set_packet_number(&pkt, ctx);
+ pkt.version = qc->version;
pkt.log = c->log;
pkt.level = start->level;
pkt.dcid = qc->scid;
size_t dcid_len);
static ngx_int_t ngx_quic_parse_initial_header(ngx_quic_header_t *pkt);
static ngx_int_t ngx_quic_parse_handshake_header(ngx_quic_header_t *pkt);
+static ngx_int_t ngx_quic_supported_version(uint32_t version);
static ngx_int_t ngx_quic_frame_allowed(ngx_quic_header_t *pkt,
ngx_uint_t frame_type);
return NGX_DECLINED;
}
- if (pkt->version != NGX_QUIC_VERSION) {
+ if (!ngx_quic_supported_version(pkt->version)) {
return NGX_ABORT;
}
*p++ = pkt->flags;
- p = ngx_quic_write_uint32(p, NGX_QUIC_VERSION);
+ p = ngx_quic_write_uint32(p, pkt->version);
*p++ = pkt->dcid.len;
p = ngx_cpymem(p, pkt->dcid.data, pkt->dcid.len);
*p++ = 0xff;
- p = ngx_quic_write_uint32(p, NGX_QUIC_VERSION);
+ p = ngx_quic_write_uint32(p, pkt->version);
*p++ = pkt->dcid.len;
p = ngx_cpymem(p, pkt->dcid.data, pkt->dcid.len);
}
+static ngx_int_t
+ngx_quic_supported_version(uint32_t version)
+{
+ ngx_uint_t i;
+
+ for (i = 0; i < NGX_QUIC_NVERSIONS; i++) {
+ if (ngx_quic_versions[i] == version) {
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+
#define ngx_quic_stream_bit_off(val) (((val) & 0x04) ? 1 : 0)
#define ngx_quic_stream_bit_len(val) (((val) & 0x02) ? 1 : 0)
#define ngx_quic_stream_bit_fin(val) (((val) & 0x01) ? 1 : 0)