mirror of
https://github.com/nginx/nginx.git
synced 2024-11-21 16:28:40 +00:00
Common tree insert function for QUIC and UDP connections.
Previously, ngx_udp_rbtree_insert_value() was used for plain UDP and ngx_quic_rbtree_insert_value() was used for QUIC. Because of this it was impossible to initialize connection tree in ngx_create_listening() since this function is not aware what kind of listening it creates. Now ngx_udp_rbtree_insert_value() is used for both QUIC and UDP. To make is possible, a generic key field is added to ngx_udp_connection_t. It keeps client address for UDP and connection ID for QUIC.
This commit is contained in:
parent
779bfcff5f
commit
0a3c796145
@ -72,6 +72,10 @@ ngx_create_listening(ngx_conf_t *cf, struct sockaddr *sockaddr,
|
|||||||
|
|
||||||
ngx_memcpy(ls->addr_text.data, text, len);
|
ngx_memcpy(ls->addr_text.data, text, len);
|
||||||
|
|
||||||
|
#if !(NGX_WIN32)
|
||||||
|
ngx_rbtree_init(&ls->rbtree, &ls->sentinel, ngx_udp_rbtree_insert_value);
|
||||||
|
#endif
|
||||||
|
|
||||||
ls->fd = (ngx_socket_t) -1;
|
ls->fd = (ngx_socket_t) -1;
|
||||||
ls->type = SOCK_STREAM;
|
ls->type = SOCK_STREAM;
|
||||||
|
|
||||||
|
@ -417,8 +417,8 @@ ngx_udp_rbtree_insert_value(ngx_rbtree_node_t *temp,
|
|||||||
udpt = (ngx_udp_connection_t *) temp;
|
udpt = (ngx_udp_connection_t *) temp;
|
||||||
ct = udpt->connection;
|
ct = udpt->connection;
|
||||||
|
|
||||||
rc = ngx_cmp_sockaddr(c->sockaddr, c->socklen,
|
rc = ngx_memn2cmp(udp->key.data, udpt->key.data,
|
||||||
ct->sockaddr, ct->socklen, 1);
|
udp->key.len, udpt->key.len);
|
||||||
|
|
||||||
if (rc == 0 && c->listening->wildcard) {
|
if (rc == 0 && c->listening->wildcard) {
|
||||||
rc = ngx_cmp_sockaddr(c->local_sockaddr, c->local_socklen,
|
rc = ngx_cmp_sockaddr(c->local_sockaddr, c->local_socklen,
|
||||||
@ -471,6 +471,8 @@ ngx_insert_udp_connection(ngx_connection_t *c)
|
|||||||
ngx_crc32_final(hash);
|
ngx_crc32_final(hash);
|
||||||
|
|
||||||
udp->node.key = hash;
|
udp->node.key = hash;
|
||||||
|
udp->key.data = (u_char *) c->sockaddr;
|
||||||
|
udp->key.len = c->socklen;
|
||||||
|
|
||||||
cln = ngx_pool_cleanup_add(c->pool, 0);
|
cln = ngx_pool_cleanup_add(c->pool, 0);
|
||||||
if (cln == NULL) {
|
if (cln == NULL) {
|
||||||
|
@ -27,6 +27,7 @@ struct ngx_udp_connection_s {
|
|||||||
ngx_rbtree_node_t node;
|
ngx_rbtree_node_t node;
|
||||||
ngx_connection_t *connection;
|
ngx_connection_t *connection;
|
||||||
ngx_buf_t *buffer;
|
ngx_buf_t *buffer;
|
||||||
|
ngx_str_t key;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -111,8 +111,6 @@ struct ngx_quic_stream_s {
|
|||||||
|
|
||||||
|
|
||||||
void ngx_quic_recvmsg(ngx_event_t *ev);
|
void ngx_quic_recvmsg(ngx_event_t *ev);
|
||||||
void ngx_quic_rbtree_insert_value(ngx_rbtree_node_t *temp,
|
|
||||||
ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel);
|
|
||||||
void ngx_quic_run(ngx_connection_t *c, ngx_quic_conf_t *conf);
|
void ngx_quic_run(ngx_connection_t *c, ngx_quic_conf_t *conf);
|
||||||
ngx_connection_t *ngx_quic_open_stream(ngx_connection_t *c, ngx_uint_t bidi);
|
ngx_connection_t *ngx_quic_open_stream(ngx_connection_t *c, ngx_uint_t bidi);
|
||||||
void ngx_quic_finalize_connection(ngx_connection_t *c, ngx_uint_t err,
|
void ngx_quic_finalize_connection(ngx_connection_t *c, ngx_uint_t err,
|
||||||
|
@ -179,6 +179,7 @@ ngx_quic_listen(ngx_connection_t *c, ngx_quic_connection_t *qc,
|
|||||||
|
|
||||||
qsock->udp.connection = c;
|
qsock->udp.connection = c;
|
||||||
qsock->udp.node.key = ngx_crc32_long(id.data, id.len);
|
qsock->udp.node.key = ngx_crc32_long(id.data, id.len);
|
||||||
|
qsock->udp.key = id;
|
||||||
|
|
||||||
ngx_rbtree_insert(&c->listening->rbtree, &qsock->udp.node);
|
ngx_rbtree_insert(&c->listening->rbtree, &qsock->udp.node);
|
||||||
|
|
||||||
|
@ -365,59 +365,6 @@ ngx_quic_close_accepted_connection(ngx_connection_t *c)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
ngx_quic_rbtree_insert_value(ngx_rbtree_node_t *temp,
|
|
||||||
ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel)
|
|
||||||
{
|
|
||||||
ngx_int_t rc;
|
|
||||||
ngx_connection_t *c, *ct;
|
|
||||||
ngx_rbtree_node_t **p;
|
|
||||||
ngx_quic_socket_t *qsock, *qsockt;
|
|
||||||
|
|
||||||
for ( ;; ) {
|
|
||||||
|
|
||||||
if (node->key < temp->key) {
|
|
||||||
|
|
||||||
p = &temp->left;
|
|
||||||
|
|
||||||
} else if (node->key > temp->key) {
|
|
||||||
|
|
||||||
p = &temp->right;
|
|
||||||
|
|
||||||
} else { /* node->key == temp->key */
|
|
||||||
|
|
||||||
qsock = (ngx_quic_socket_t *) node;
|
|
||||||
c = qsock->udp.connection;
|
|
||||||
|
|
||||||
qsockt = (ngx_quic_socket_t *) temp;
|
|
||||||
ct = qsockt->udp.connection;
|
|
||||||
|
|
||||||
rc = ngx_memn2cmp(qsock->sid.id, qsockt->sid.id,
|
|
||||||
qsock->sid.len, qsockt->sid.len);
|
|
||||||
|
|
||||||
if (rc == 0 && c->listening->wildcard) {
|
|
||||||
rc = ngx_cmp_sockaddr(c->local_sockaddr, c->local_socklen,
|
|
||||||
ct->local_sockaddr, ct->local_socklen, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
p = (rc < 0) ? &temp->left : &temp->right;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (*p == sentinel) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
temp = *p;
|
|
||||||
}
|
|
||||||
|
|
||||||
*p = node;
|
|
||||||
node->parent = temp;
|
|
||||||
node->left = sentinel;
|
|
||||||
node->right = sentinel;
|
|
||||||
ngx_rbt_red(node);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static ngx_connection_t *
|
static ngx_connection_t *
|
||||||
ngx_quic_lookup_connection(ngx_listening_t *ls, ngx_str_t *key,
|
ngx_quic_lookup_connection(ngx_listening_t *ls, ngx_str_t *key,
|
||||||
struct sockaddr *local_sockaddr, socklen_t local_socklen)
|
struct sockaddr *local_sockaddr, socklen_t local_socklen)
|
||||||
|
@ -1883,14 +1883,7 @@ ngx_http_add_listening(ngx_conf_t *cf, ngx_http_conf_addr_t *addr)
|
|||||||
ls->wildcard = addr->opt.wildcard;
|
ls->wildcard = addr->opt.wildcard;
|
||||||
|
|
||||||
#if (NGX_HTTP_V3)
|
#if (NGX_HTTP_V3)
|
||||||
|
|
||||||
ls->quic = addr->opt.quic;
|
ls->quic = addr->opt.quic;
|
||||||
|
|
||||||
if (ls->quic) {
|
|
||||||
ngx_rbtree_init(&ls->rbtree, &ls->sentinel,
|
|
||||||
ngx_quic_rbtree_insert_value);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return ls;
|
return ls;
|
||||||
|
@ -518,11 +518,6 @@ ngx_stream_optimize_servers(ngx_conf_t *cf, ngx_array_t *ports)
|
|||||||
ls->reuseport = addr[i].opt.reuseport;
|
ls->reuseport = addr[i].opt.reuseport;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !(NGX_WIN32)
|
|
||||||
ngx_rbtree_init(&ls->rbtree, &ls->sentinel,
|
|
||||||
ngx_udp_rbtree_insert_value);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
stport = ngx_palloc(cf->pool, sizeof(ngx_stream_port_t));
|
stport = ngx_palloc(cf->pool, sizeof(ngx_stream_port_t));
|
||||||
if (stport == NULL) {
|
if (stport == NULL) {
|
||||||
return NGX_CONF_ERROR;
|
return NGX_CONF_ERROR;
|
||||||
|
Loading…
Reference in New Issue
Block a user