diff options
Diffstat (limited to 'src/plugins/http')
-rw-r--r-- | src/plugins/http/http.c | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/src/plugins/http/http.c b/src/plugins/http/http.c index 574c34187cc..657a0b54755 100644 --- a/src/plugins/http/http.c +++ b/src/plugins/http/http.c @@ -498,6 +498,9 @@ state_wait_app (http_conn_t *hc, transport_send_params_t *sp) /* Start sending the actual data */ hc->req_state = HTTP_REQ_STATE_SEND_MORE_DATA; + ASSERT (sp->max_burst_size >= offset); + sp->max_burst_size -= offset; + return 1; error: @@ -520,6 +523,7 @@ state_send_more_data (http_conn_t *hc, transport_send_params_t *sp) session_t *ts; int sent = 0; + max_send = clib_min (max_send, sp->max_burst_size); ts = session_get_from_handle (hc->h_tc_session_handle); if ((seg = http_buffer_get_segs (hb, max_send, &n_segs))) sent = svm_fifo_enqueue_segments (ts->tx_fifo, seg, n_segs, @@ -529,6 +533,7 @@ state_send_more_data (http_conn_t *hc, transport_send_params_t *sp) { /* Ask scheduler to notify app of deq event if needed */ sp->bytes_dequeued += http_buffer_drain (hb, sent); + sp->max_burst_size -= sent; } /* Not finished sending all data */ @@ -816,6 +821,7 @@ static int http_app_tx_callback (void *session, transport_send_params_t *sp) { session_t *as = (session_t *) session; + u32 max_burst_sz, sent; http_conn_t *hc; hc = http_conn_get_w_thread (as->connection_index, as->thread_index); @@ -825,6 +831,9 @@ http_app_tx_callback (void *session, transport_send_params_t *sp) return 0; } + max_burst_sz = sp->max_burst_size * TRANSPORT_PACER_MIN_MSS; + sp->max_burst_size = max_burst_sz; + http_req_run_state_machine (hc, sp); if (hc->state == HTTP_CONN_STATE_CLOSED) @@ -832,7 +841,10 @@ http_app_tx_callback (void *session, transport_send_params_t *sp) if (!svm_fifo_max_dequeue_cons (as->rx_fifo)) http_disconnect_transport (hc); } - return 0; + + sent = max_burst_sz - sp->max_burst_size; + + return sent > 0 ? clib_max (sent / TRANSPORT_PACER_MIN_MSS, 1) : 0; } static void |