Another round of spdy/3.1 improvements.

* Implement flow control window updates if we're receiving data (POSTs)
This commit is contained in:
Joris Vink 2014-08-10 21:39:47 +02:00
parent 1616320490
commit 4a4fa4889e
3 changed files with 16 additions and 8 deletions

View File

@ -178,6 +178,7 @@ struct connection {
u_int32_t wsize_initial; u_int32_t wsize_initial;
u_int32_t spdy_send_wsize; u_int32_t spdy_send_wsize;
u_int32_t spdy_recv_wsize;
struct netbuf_head send_queue; struct netbuf_head send_queue;
struct netbuf *snb; struct netbuf *snb;

View File

@ -78,6 +78,7 @@ kore_connection_accept(struct listener *l, struct connection **out)
c->proto = CONN_PROTO_UNKNOWN; c->proto = CONN_PROTO_UNKNOWN;
c->wsize_initial = SPDY_INIT_WSIZE; c->wsize_initial = SPDY_INIT_WSIZE;
c->spdy_send_wsize = SPDY_INIT_WSIZE; c->spdy_send_wsize = SPDY_INIT_WSIZE;
c->spdy_recv_wsize = SPDY_INIT_WSIZE;
c->idle_timer.start = 0; c->idle_timer.start = 0;
c->idle_timer.length = KORE_IDLE_TIMER_MAX; c->idle_timer.length = KORE_IDLE_TIMER_MAX;

View File

@ -39,7 +39,7 @@ static int spdy_zlib_deflate(struct connection *, u_int8_t *,
size_t, u_int8_t **, u_int32_t *); size_t, u_int8_t **, u_int32_t *);
u_int64_t spdy_idle_time = 120000; u_int64_t spdy_idle_time = 120000;
u_int32_t spdy_recv_wsize = 65536; u_int32_t spdy_recv_wsize = SPDY_INIT_WSIZE;
int int
spdy_frame_recv(struct netbuf *nb) spdy_frame_recv(struct netbuf *nb)
@ -181,7 +181,6 @@ spdy_frame_send(struct connection *c, u_int16_t type, u_int8_t flags,
switch (type) { switch (type) {
case SPDY_CTRL_FRAME_SYN_REPLY: case SPDY_CTRL_FRAME_SYN_REPLY:
case SPDY_CTRL_FRAME_WINDOW:
case SPDY_DATA_FRAME: case SPDY_DATA_FRAME:
if (s == NULL) if (s == NULL)
fatal("spdy_frame_send(): stream is NULL for %d", type); fatal("spdy_frame_send(): stream is NULL for %d", type);
@ -223,7 +222,7 @@ spdy_frame_send(struct connection *c, u_int16_t type, u_int8_t flags,
net_write16(&nb[2], type); net_write16(&nb[2], type);
net_write32(&nb[4], len); net_write32(&nb[4], len);
nb[4] = flags; nb[4] = flags;
net_write32(&nb[8], s->stream_id); net_write32(&nb[8], (s != NULL) ? s->stream_id : 0);
net_write32(&nb[12], misc); net_write32(&nb[12], misc);
length = 16; length = 16;
break; break;
@ -837,13 +836,20 @@ spdy_data_frame_recv(struct netbuf *nb)
req->flags |= HTTP_REQUEST_COMPLETE; req->flags |= HTTP_REQUEST_COMPLETE;
} }
/*
* XXX - This can be implemented better so we can stagger
* window updates a bit and not constantly hit flow control.
*/
s->recv_wsize -= data.length; s->recv_wsize -= data.length;
if (s->recv_wsize < (spdy_recv_wsize / 2)) { spdy_frame_send(c, SPDY_CTRL_FRAME_WINDOW, 0, 8, s, data.length);
spdy_frame_send(c, SPDY_CTRL_FRAME_WINDOW, s->recv_wsize += data.length;
0, 8, s, spdy_recv_wsize - s->recv_wsize);
s->recv_wsize += (spdy_recv_wsize - s->recv_wsize); c->spdy_recv_wsize -= data.length;
} spdy_frame_send(c, SPDY_CTRL_FRAME_WINDOW, 0, 8, NULL, data.length);
c->spdy_recv_wsize += data.length;
kore_debug("data frame recv: wz:%d cwz:%d", s->recv_wsize,
c->spdy_recv_wsize);
return (KORE_RESULT_OK); return (KORE_RESULT_OK);
} }