mirror of
https://github.com/nginx/nginx.git
synced 2025-08-06 14:56:15 +08:00
QUIC: do not handle empty dcid.
When a QUIC datagram arrives, its DCID is never empty. Previously, the case of empty DCID was handled. Now this code is simplified.
This commit is contained in:
parent
daf9c643d1
commit
6b70513bd8
@ -17,8 +17,7 @@ static ssize_t ngx_udp_shared_recv(ngx_connection_t *c, u_char *buf,
|
||||
size_t size);
|
||||
static ngx_int_t ngx_create_udp_connection(ngx_connection_t *c);
|
||||
static ngx_connection_t *ngx_lookup_udp_connection(ngx_listening_t *ls,
|
||||
ngx_str_t *key, struct sockaddr *sockaddr, socklen_t socklen,
|
||||
struct sockaddr *local_sockaddr, socklen_t local_socklen);
|
||||
ngx_str_t *key, struct sockaddr *local_sockaddr, socklen_t local_socklen);
|
||||
|
||||
|
||||
void
|
||||
@ -224,7 +223,24 @@ ngx_event_recvmsg(ngx_event_t *ev)
|
||||
|
||||
#endif
|
||||
|
||||
ngx_str_null(&key);
|
||||
key.data = (u_char *) sockaddr;
|
||||
key.len = socklen;
|
||||
|
||||
#if (NGX_HAVE_UNIX_DOMAIN)
|
||||
|
||||
if (sockaddr->sa_family == AF_UNIX) {
|
||||
struct sockaddr_un *saun = (struct sockaddr_un *) sockaddr;
|
||||
|
||||
if (socklen <= (socklen_t) offsetof(struct sockaddr_un, sun_path)
|
||||
|| saun->sun_path[0] == '\0')
|
||||
{
|
||||
ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ngx_cycle->log, 0,
|
||||
"unbound unix socket");
|
||||
key.len = 0;
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#if (NGX_QUIC)
|
||||
if (ls->quic) {
|
||||
@ -234,8 +250,7 @@ ngx_event_recvmsg(ngx_event_t *ev)
|
||||
}
|
||||
#endif
|
||||
|
||||
c = ngx_lookup_udp_connection(ls, &key, sockaddr, socklen,
|
||||
local_sockaddr, local_socklen);
|
||||
c = ngx_lookup_udp_connection(ls, &key, local_sockaddr, local_socklen);
|
||||
|
||||
if (c) {
|
||||
|
||||
@ -253,6 +268,13 @@ ngx_event_recvmsg(ngx_event_t *ev)
|
||||
}
|
||||
#endif
|
||||
|
||||
#if (NGX_QUIC)
|
||||
if (ls->quic) {
|
||||
c->socklen = socklen;
|
||||
ngx_memcpy(c->sockaddr, sockaddr, socklen);
|
||||
}
|
||||
#endif
|
||||
|
||||
ngx_memzero(&buf, sizeof(ngx_buf_t));
|
||||
|
||||
buf.pos = buffer;
|
||||
@ -508,11 +530,6 @@ ngx_udp_rbtree_insert_value(ngx_rbtree_node_t *temp,
|
||||
rc = ngx_memn2cmp(udp->key.data, udpt->key.data,
|
||||
udp->key.len, udpt->key.len);
|
||||
|
||||
if (rc == 0 && udp->key.len == 0) {
|
||||
rc = ngx_cmp_sockaddr(c->sockaddr, c->socklen,
|
||||
ct->sockaddr, ct->socklen, 1);
|
||||
}
|
||||
|
||||
if (rc == 0 && c->listening->wildcard) {
|
||||
rc = ngx_cmp_sockaddr(c->local_sockaddr, c->local_socklen,
|
||||
ct->local_sockaddr, ct->local_socklen, 1);
|
||||
@ -566,7 +583,8 @@ ngx_create_udp_connection(ngx_connection_t *c)
|
||||
cln->data = c;
|
||||
cln->handler = ngx_delete_udp_connection;
|
||||
|
||||
key.len = 0;
|
||||
key.data = (u_char *) c->sockaddr;
|
||||
key.len = c->socklen;
|
||||
|
||||
ngx_insert_udp_connection(c, udp, &key);
|
||||
|
||||
@ -586,10 +604,6 @@ ngx_insert_udp_connection(ngx_connection_t *c, ngx_udp_connection_t *udp,
|
||||
|
||||
ngx_crc32_update(&hash, key->data, key->len);
|
||||
|
||||
if (key->len == 0) {
|
||||
ngx_crc32_update(&hash, (u_char *) c->sockaddr, c->socklen);
|
||||
}
|
||||
|
||||
if (c->listening->wildcard) {
|
||||
ngx_crc32_update(&hash, (u_char *) c->local_sockaddr, c->local_socklen);
|
||||
}
|
||||
@ -621,7 +635,6 @@ ngx_delete_udp_connection(void *data)
|
||||
|
||||
static ngx_connection_t *
|
||||
ngx_lookup_udp_connection(ngx_listening_t *ls, ngx_str_t *key,
|
||||
struct sockaddr *sockaddr, socklen_t socklen,
|
||||
struct sockaddr *local_sockaddr, socklen_t local_socklen)
|
||||
{
|
||||
uint32_t hash;
|
||||
@ -630,33 +643,16 @@ ngx_lookup_udp_connection(ngx_listening_t *ls, ngx_str_t *key,
|
||||
ngx_rbtree_node_t *node, *sentinel;
|
||||
ngx_udp_connection_t *udp;
|
||||
|
||||
#if (NGX_HAVE_UNIX_DOMAIN)
|
||||
|
||||
if (sockaddr->sa_family == AF_UNIX) {
|
||||
struct sockaddr_un *saun = (struct sockaddr_un *) sockaddr;
|
||||
|
||||
if (socklen <= (socklen_t) offsetof(struct sockaddr_un, sun_path)
|
||||
|| saun->sun_path[0] == '\0')
|
||||
{
|
||||
ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ngx_cycle->log, 0,
|
||||
"unbound unix socket");
|
||||
return NULL;
|
||||
}
|
||||
if (key->len == 0) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
node = ls->rbtree.root;
|
||||
sentinel = ls->rbtree.sentinel;
|
||||
|
||||
ngx_crc32_init(hash);
|
||||
|
||||
ngx_crc32_update(&hash, key->data, key->len);
|
||||
|
||||
if (key->len == 0) {
|
||||
ngx_crc32_update(&hash, (u_char *) sockaddr, socklen);
|
||||
}
|
||||
|
||||
if (ls->wildcard) {
|
||||
ngx_crc32_update(&hash, (u_char *) local_sockaddr, local_socklen);
|
||||
}
|
||||
@ -683,41 +679,12 @@ ngx_lookup_udp_connection(ngx_listening_t *ls, ngx_str_t *key,
|
||||
|
||||
rc = ngx_memn2cmp(key->data, udp->key.data, key->len, udp->key.len);
|
||||
|
||||
if (rc == 0 && key->len == 0) {
|
||||
rc = ngx_cmp_sockaddr(sockaddr, socklen,
|
||||
c->sockaddr, c->socklen, 1);
|
||||
}
|
||||
|
||||
if (rc == 0 && ls->wildcard) {
|
||||
rc = ngx_cmp_sockaddr(local_sockaddr, local_socklen,
|
||||
c->local_sockaddr, c->local_socklen, 1);
|
||||
}
|
||||
|
||||
if (rc == 0) {
|
||||
if (key->len) {
|
||||
rc = ngx_cmp_sockaddr(sockaddr, socklen,
|
||||
c->sockaddr, c->socklen, 1);
|
||||
|
||||
if (rc) {
|
||||
#if (NGX_DEBUG)
|
||||
if (c->log->log_level & NGX_LOG_DEBUG_EVENT) {
|
||||
ngx_str_t addr;
|
||||
u_char text[NGX_SOCKADDR_STRLEN];
|
||||
|
||||
addr.data = text;
|
||||
addr.len = ngx_sock_ntop(sockaddr, socklen, text,
|
||||
NGX_SOCKADDR_STRLEN, 1);
|
||||
|
||||
ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
|
||||
"client migrated to %V", &addr);
|
||||
}
|
||||
#endif
|
||||
|
||||
ngx_memcpy(c->sockaddr, sockaddr, socklen);
|
||||
c->socklen = socklen;
|
||||
}
|
||||
}
|
||||
|
||||
return c;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user