Removed ngx_quic_stream_node_t.

Now ngx_quic_stream_t is directly inserted into the tree.
This commit is contained in:
Roman Arutyunyan 2020-03-24 16:38:03 +03:00
parent 061a42d966
commit f75e4e3fef
3 changed files with 59 additions and 97 deletions

View File

@ -19,14 +19,6 @@ typedef enum {
#define NGX_QUIC_STREAM_BUFSIZE 16384 #define NGX_QUIC_STREAM_BUFSIZE 16384
typedef struct {
ngx_rbtree_node_t node;
ngx_buf_t *b;
ngx_connection_t *c;
ngx_quic_stream_t s;
} ngx_quic_stream_node_t;
typedef struct { typedef struct {
ngx_rbtree_t tree; ngx_rbtree_t tree;
ngx_rbtree_node_t sentinel; ngx_rbtree_node_t sentinel;
@ -126,9 +118,9 @@ static ngx_int_t ngx_quic_send_packet(ngx_connection_t *c,
static void ngx_quic_rbtree_insert_stream(ngx_rbtree_node_t *temp, static void ngx_quic_rbtree_insert_stream(ngx_rbtree_node_t *temp,
ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel); ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel);
static ngx_quic_stream_node_t *ngx_quic_find_stream(ngx_rbtree_t *rbtree, static ngx_quic_stream_t *ngx_quic_find_stream(ngx_rbtree_t *rbtree,
ngx_uint_t key); ngx_uint_t key);
static ngx_quic_stream_node_t *ngx_quic_create_stream(ngx_connection_t *c, static ngx_quic_stream_t *ngx_quic_create_stream(ngx_connection_t *c,
ngx_uint_t id); ngx_uint_t id);
static ssize_t ngx_quic_stream_recv(ngx_connection_t *c, u_char *buf, static ssize_t ngx_quic_stream_recv(ngx_connection_t *c, u_char *buf,
size_t size); size_t size);
@ -1053,8 +1045,8 @@ ngx_quic_handle_stream_frame(ngx_connection_t *c,
{ {
ngx_buf_t *b; ngx_buf_t *b;
ngx_event_t *rev; ngx_event_t *rev;
ngx_quic_stream_t *sn;
ngx_quic_connection_t *qc; ngx_quic_connection_t *qc;
ngx_quic_stream_node_t *sn;
qc = c->quic; qc = c->quic;
@ -1142,8 +1134,8 @@ ngx_quic_handle_stream_data_blocked_frame(ngx_connection_t *c,
size_t n; size_t n;
ngx_buf_t *b; ngx_buf_t *b;
ngx_quic_frame_t *frame; ngx_quic_frame_t *frame;
ngx_quic_stream_t *sn;
ngx_quic_connection_t *qc; ngx_quic_connection_t *qc;
ngx_quic_stream_node_t *sn;
qc = c->quic; qc = c->quic;
sn = ngx_quic_find_stream(&qc->streams.tree, f->id); sn = ngx_quic_find_stream(&qc->streams.tree, f->id);
@ -1358,20 +1350,15 @@ ngx_connection_t *
ngx_quic_create_uni_stream(ngx_connection_t *c) ngx_quic_create_uni_stream(ngx_connection_t *c)
{ {
ngx_uint_t id; ngx_uint_t id;
ngx_quic_stream_t *qs; ngx_quic_stream_t *qs, *sn;
ngx_quic_connection_t *qc; ngx_quic_connection_t *qc;
ngx_quic_stream_node_t *sn;
qs = c->qs; qs = c->qs;
qc = qs->parent->quic; qc = qs->parent->quic;
/* id = (qc->streams.id_counter << 2)
* A stream ID is a 62-bit integer that is unique for all streams | NGX_QUIC_STREAM_SERVER_INITIATED
* on a connection. | NGX_QUIC_STREAM_UNIDIRECTIONAL;
*
* 0x3 | Server-Initiated, Unidirectional
*/
id = (qc->streams.id_counter << 2) | 0x3;
ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
"creating server uni stream #%ui id %ui", "creating server uni stream #%ui id %ui",
@ -1393,7 +1380,7 @@ ngx_quic_rbtree_insert_stream(ngx_rbtree_node_t *temp,
ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel) ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel)
{ {
ngx_rbtree_node_t **p; ngx_rbtree_node_t **p;
ngx_quic_stream_node_t *qn, *qnt; ngx_quic_stream_t *qn, *qnt;
for ( ;; ) { for ( ;; ) {
@ -1407,8 +1394,8 @@ ngx_quic_rbtree_insert_stream(ngx_rbtree_node_t *temp,
} else { /* node->key == temp->key */ } else { /* node->key == temp->key */
qn = (ngx_quic_stream_node_t *) &node->color; qn = (ngx_quic_stream_t *) &node->color;
qnt = (ngx_quic_stream_node_t *) &temp->color; qnt = (ngx_quic_stream_t *) &temp->color;
if (qn->c < qnt->c) { if (qn->c < qnt->c) {
p = &temp->left; p = &temp->left;
@ -1432,7 +1419,7 @@ ngx_quic_rbtree_insert_stream(ngx_rbtree_node_t *temp,
} }
static ngx_quic_stream_node_t * static ngx_quic_stream_t *
ngx_quic_find_stream(ngx_rbtree_t *rbtree, ngx_uint_t key) ngx_quic_find_stream(ngx_rbtree_t *rbtree, ngx_uint_t key)
{ {
ngx_rbtree_node_t *node, *sentinel; ngx_rbtree_node_t *node, *sentinel;
@ -1443,7 +1430,7 @@ ngx_quic_find_stream(ngx_rbtree_t *rbtree, ngx_uint_t key)
while (node != sentinel) { while (node != sentinel) {
if (key == node->key) { if (key == node->key) {
return (ngx_quic_stream_node_t *) node; return (ngx_quic_stream_t *) node;
} }
node = (key < node->key) ? node->left : node->right; node = (key < node->key) ? node->left : node->right;
@ -1453,20 +1440,20 @@ ngx_quic_find_stream(ngx_rbtree_t *rbtree, ngx_uint_t key)
} }
static ngx_quic_stream_node_t * static ngx_quic_stream_t *
ngx_quic_create_stream(ngx_connection_t *c, ngx_uint_t id) ngx_quic_create_stream(ngx_connection_t *c, ngx_uint_t id)
{ {
size_t n; size_t n;
ngx_log_t *log; ngx_log_t *log;
ngx_pool_t *pool; ngx_pool_t *pool;
ngx_event_t *rev, *wev; ngx_event_t *rev, *wev;
ngx_quic_stream_t *sn;
ngx_pool_cleanup_t *cln; ngx_pool_cleanup_t *cln;
ngx_quic_connection_t *qc; ngx_quic_connection_t *qc;
ngx_quic_stream_node_t *sn;
qc = c->quic; qc = c->quic;
sn = ngx_pcalloc(c->pool, sizeof(ngx_quic_stream_node_t)); sn = ngx_pcalloc(c->pool, sizeof(ngx_quic_stream_t));
if (sn == NULL) { if (sn == NULL) {
return NULL; return NULL;
} }
@ -1522,10 +1509,9 @@ ngx_quic_create_stream(ngx_connection_t *c, ngx_uint_t id)
ngx_rbtree_insert(&qc->streams.tree, &sn->node); ngx_rbtree_insert(&qc->streams.tree, &sn->node);
sn->s.id = id; sn->id = id;
sn->s.unidirectional = (sn->s.id & 0x02) ? 1 : 0; sn->parent = c;
sn->s.parent = c; sn->c->qs = sn;
sn->c->qs = &sn->s;
sn->c->recv = ngx_quic_stream_recv; sn->c->recv = ngx_quic_stream_recv;
sn->c->send = ngx_quic_stream_send; sn->c->send = ngx_quic_stream_send;
@ -1552,23 +1538,11 @@ ngx_quic_stream_recv(ngx_connection_t *c, u_char *buf, size_t size)
ngx_buf_t *b; ngx_buf_t *b;
ngx_event_t *rev; ngx_event_t *rev;
ngx_quic_stream_t *qs; ngx_quic_stream_t *qs;
ngx_quic_connection_t *qc;
ngx_quic_stream_node_t *sn;
qs = c->qs; qs = c->qs;
qc = qs->parent->quic; b = qs->b;
// XXX: get direct pointer from stream structure?
sn = ngx_quic_find_stream(&qc->streams.tree, qs->id);
if (sn == NULL) {
return NGX_ERROR;
}
rev = c->read; rev = c->read;
b = sn->b;
ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
"quic recv: eof:%d, avail:%z", "quic recv: eof:%d, avail:%z",
rev->pending_eof, b->last - b->pos); rev->pending_eof, b->last - b->pos);
@ -1612,7 +1586,6 @@ ngx_quic_stream_send(ngx_connection_t *c, u_char *buf, size_t size)
ngx_quic_frame_t *frame; ngx_quic_frame_t *frame;
ngx_quic_stream_t *qs; ngx_quic_stream_t *qs;
ngx_quic_connection_t *qc; ngx_quic_connection_t *qc;
ngx_quic_stream_node_t *sn;
ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "quic send: %uz", size); ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "quic send: %uz", size);
@ -1620,13 +1593,6 @@ ngx_quic_stream_send(ngx_connection_t *c, u_char *buf, size_t size)
pc = qs->parent; pc = qs->parent;
qc = pc->quic; qc = pc->quic;
// XXX: get direct pointer from stream structure?
sn = ngx_quic_find_stream(&qc->streams.tree, qs->id);
if (sn == NULL) {
return NGX_ERROR;
}
frame = ngx_pcalloc(pc->pool, sizeof(ngx_quic_frame_t)); frame = ngx_pcalloc(pc->pool, sizeof(ngx_quic_frame_t));
if (frame == NULL) { if (frame == NULL) {
return 0; return 0;
@ -1671,25 +1637,17 @@ ngx_quic_stream_cleanup_handler(void *data)
ngx_quic_frame_t *frame; ngx_quic_frame_t *frame;
ngx_quic_stream_t *qs; ngx_quic_stream_t *qs;
ngx_quic_connection_t *qc; ngx_quic_connection_t *qc;
ngx_quic_stream_node_t *sn;
ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, "quic send fin");
qs = c->qs; qs = c->qs;
pc = qs->parent; pc = qs->parent;
qc = pc->quic; qc = pc->quic;
if ((qs->id & 0x03) == 0x02) { if ((qs->id & 0x03) == NGX_QUIC_STREAM_UNIDIRECTIONAL) {
/* do not send fin for client unidirectional streams */ /* do not send fin for client unidirectional streams */
return; return;
} }
// XXX: get direct pointer from stream structure? ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, "quic send fin");
sn = ngx_quic_find_stream(&qc->streams.tree, qs->id);
if (sn == NULL) {
return;
}
frame = ngx_pcalloc(pc->pool, sizeof(ngx_quic_frame_t)); frame = ngx_pcalloc(pc->pool, sizeof(ngx_quic_frame_t));
if (frame == NULL) { if (frame == NULL) {

View File

@ -21,6 +21,9 @@
#define NGX_QUIC_DEFAULT_ACK_DELAY_EXPONENT 3 #define NGX_QUIC_DEFAULT_ACK_DELAY_EXPONENT 3
#define NGX_QUIC_DEFAULT_MAX_ACK_DELAY 25 #define NGX_QUIC_DEFAULT_MAX_ACK_DELAY 25
#define NGX_QUIC_STREAM_SERVER_INITIATED 0x01
#define NGX_QUIC_STREAM_UNIDIRECTIONAL 0x02
typedef struct { typedef struct {
/* configurable */ /* configurable */
@ -46,10 +49,11 @@ typedef struct {
struct ngx_quic_stream_s { struct ngx_quic_stream_s {
uint64_t id; ngx_rbtree_node_t node;
ngx_uint_t unidirectional:1;
ngx_connection_t *parent; ngx_connection_t *parent;
void *data; ngx_connection_t *c;
uint64_t id;
ngx_buf_t *b;
}; };

View File

@ -414,7 +414,7 @@ ngx_http_quic_stream_handler(ngx_connection_t *c)
pc = c->qs->parent; pc = c->qs->parent;
h3c = pc->data; h3c = pc->data;
if (c->qs->unidirectional) { if (c->qs->id & NGX_QUIC_STREAM_UNIDIRECTIONAL) {
ngx_http_v3_handle_client_uni_stream(c); ngx_http_v3_handle_client_uni_stream(c);
return; return;
} }