diff options
author | Florin Coras <fcoras@cisco.com> | 2020-01-27 18:34:13 +0000 |
---|---|---|
committer | Dave Barach <openvpp@barachs.net> | 2020-01-28 15:06:27 +0000 |
commit | dda2dbedab8d7fda3b90f9340a20eafdc865b04b (patch) | |
tree | 116b6a684458a85393ce80778edc36bb80c5999e | |
parent | 7d08e39a87f5805d1ef764aa0fd986490fb4f7bb (diff) |
hsa: proxy rcv wnd update acks after full fifos
Avoid rcv wnd probing after zero window advertisments by registering for
tx dequeue notifications and forcing acks that open the rcv wnd.
Type: feature
Signed-off-by: Florin Coras <fcoras@cisco.com>
Change-Id: I8f33e3cf917f8c83d412f370ca66013aa4cd6e67
-rw-r--r-- | src/plugins/hs_apps/proxy.c | 93 |
1 files changed, 87 insertions, 6 deletions
diff --git a/src/plugins/hs_apps/proxy.c b/src/plugins/hs_apps/proxy.c index e2a44e1706b..ad5b292c56d 100644 --- a/src/plugins/hs_apps/proxy.c +++ b/src/plugins/hs_apps/proxy.c @@ -18,9 +18,12 @@ #include <vnet/session/application.h> #include <vnet/session/application_interface.h> #include <hs_apps/proxy.h> +#include <vnet/tcp/tcp.h> proxy_main_t proxy_main; +#define TCP_MSS 1460 + typedef struct { char uri[128]; @@ -189,7 +192,7 @@ proxy_rx_callback (session_t * s) proxy_session_t *ps; int proxy_index; uword *p; - svm_fifo_t *active_open_tx_fifo; + svm_fifo_t *ao_tx_fifo; ASSERT (s->thread_index == thread_index); @@ -199,20 +202,23 @@ proxy_rx_callback (session_t * s) if (PREDICT_TRUE (p != 0)) { clib_spinlock_unlock_if_init (&pm->sessions_lock); - active_open_tx_fifo = s->rx_fifo; + ao_tx_fifo = s->rx_fifo; /* * Send event for active open tx fifo */ - if (svm_fifo_set_event (active_open_tx_fifo)) + if (svm_fifo_set_event (ao_tx_fifo)) { - u32 ao_thread_index = active_open_tx_fifo->master_thread_index; - u32 ao_session_index = active_open_tx_fifo->master_session_index; + u32 ao_thread_index = ao_tx_fifo->master_thread_index; + u32 ao_session_index = ao_tx_fifo->master_session_index; if (session_send_io_evt_to_thread_custom (&ao_session_index, ao_thread_index, SESSION_IO_EVT_TX)) clib_warning ("failed to enqueue tx evt"); } + + if (svm_fifo_max_enqueue (ao_tx_fifo) <= TCP_MSS) + svm_fifo_add_want_deq_ntf (ao_tx_fifo, SVM_FIFO_WANT_DEQ_NOTIF); } else { @@ -257,12 +263,48 @@ proxy_rx_callback (session_t * s) return 0; } +static int +proxy_tx_callback (session_t * proxy_s) +{ + proxy_main_t *pm = &proxy_main; + transport_connection_t *tc; + session_handle_t handle; + proxy_session_t *ps; + session_t *ao_s; + uword *p; + + clib_spinlock_lock_if_init (&pm->sessions_lock); + + handle = session_handle (proxy_s); + p = hash_get (pm->proxy_session_by_server_handle, handle); + if (!p) + return 0; + + if (pool_is_free_index (pm->sessions, p[0])) + return 0; + + ps = pool_elt_at_index (pm->sessions, p[0]); + if (ps->vpp_active_open_handle == ~0) + return 0; + + ao_s = session_get_from_handle (ps->vpp_active_open_handle); + + /* Force ack on active open side to update rcv wnd */ + tc = session_get_transport (ao_s); + tcp_send_ack ((tcp_connection_t *) tc); + + clib_spinlock_unlock_if_init (&pm->sessions_lock); + + return 0; +} + static session_cb_vft_t proxy_session_cb_vft = { .session_accept_callback = proxy_accept_callback, .session_disconnect_callback = proxy_disconnect_callback, .session_connected_callback = proxy_connected_callback, .add_segment_callback = proxy_add_segment_callback, .builtin_app_rx_callback = proxy_rx_callback, + .builtin_app_tx_callback = proxy_tx_callback, .session_reset_callback = proxy_reset_callback }; @@ -358,6 +400,44 @@ active_open_rx_callback (session_t * s) SESSION_IO_EVT_TX); } + if (svm_fifo_max_enqueue (proxy_tx_fifo) <= TCP_MSS) + svm_fifo_add_want_deq_ntf (proxy_tx_fifo, SVM_FIFO_WANT_DEQ_NOTIF); + + return 0; +} + +static int +active_open_tx_callback (session_t * ao_s) +{ + proxy_main_t *pm = &proxy_main; + transport_connection_t *tc; + session_handle_t handle; + proxy_session_t *ps; + session_t *proxy_s; + uword *p; + + clib_spinlock_lock_if_init (&pm->sessions_lock); + + handle = session_handle (ao_s); + p = hash_get (pm->proxy_session_by_active_open_handle, handle); + if (!p) + return 0; + + if (pool_is_free_index (pm->sessions, p[0])) + return 0; + + ps = pool_elt_at_index (pm->sessions, p[0]); + if (ps->vpp_server_handle == ~0) + return 0; + + proxy_s = session_get_from_handle (ps->vpp_server_handle); + + /* Force ack on proxy side to update rcv wnd */ + tc = session_get_transport (proxy_s); + tcp_send_ack ((tcp_connection_t *) tc); + + clib_spinlock_unlock_if_init (&pm->sessions_lock); + return 0; } @@ -367,7 +447,8 @@ static session_cb_vft_t active_open_clients = { .session_connected_callback = active_open_connected_callback, .session_accept_callback = active_open_create_callback, .session_disconnect_callback = active_open_disconnect_callback, - .builtin_app_rx_callback = active_open_rx_callback + .builtin_app_rx_callback = active_open_rx_callback, + .builtin_app_tx_callback = active_open_tx_callback, }; /* *INDENT-ON* */ |