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
This commit is contained in:
Florin Coras
2020-01-27 18:34:13 +00:00
committed by Dave Barach
parent 7d08e39a87
commit dda2dbedab

View File

@ -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* */