Skip to content

Commit dda2dbe

Browse files
florincorasDave Barach
authored andcommitted
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 <[email protected]> Change-Id: I8f33e3cf917f8c83d412f370ca66013aa4cd6e67
1 parent 7d08e39 commit dda2dbe

File tree

1 file changed

+87
-6
lines changed

1 file changed

+87
-6
lines changed

src/plugins/hs_apps/proxy.c

Lines changed: 87 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,12 @@
1818
#include <vnet/session/application.h>
1919
#include <vnet/session/application_interface.h>
2020
#include <hs_apps/proxy.h>
21+
#include <vnet/tcp/tcp.h>
2122

2223
proxy_main_t proxy_main;
2324

25+
#define TCP_MSS 1460
26+
2427
typedef struct
2528
{
2629
char uri[128];
@@ -189,7 +192,7 @@ proxy_rx_callback (session_t * s)
189192
proxy_session_t *ps;
190193
int proxy_index;
191194
uword *p;
192-
svm_fifo_t *active_open_tx_fifo;
195+
svm_fifo_t *ao_tx_fifo;
193196

194197
ASSERT (s->thread_index == thread_index);
195198

@@ -199,20 +202,23 @@ proxy_rx_callback (session_t * s)
199202
if (PREDICT_TRUE (p != 0))
200203
{
201204
clib_spinlock_unlock_if_init (&pm->sessions_lock);
202-
active_open_tx_fifo = s->rx_fifo;
205+
ao_tx_fifo = s->rx_fifo;
203206

204207
/*
205208
* Send event for active open tx fifo
206209
*/
207-
if (svm_fifo_set_event (active_open_tx_fifo))
210+
if (svm_fifo_set_event (ao_tx_fifo))
208211
{
209-
u32 ao_thread_index = active_open_tx_fifo->master_thread_index;
210-
u32 ao_session_index = active_open_tx_fifo->master_session_index;
212+
u32 ao_thread_index = ao_tx_fifo->master_thread_index;
213+
u32 ao_session_index = ao_tx_fifo->master_session_index;
211214
if (session_send_io_evt_to_thread_custom (&ao_session_index,
212215
ao_thread_index,
213216
SESSION_IO_EVT_TX))
214217
clib_warning ("failed to enqueue tx evt");
215218
}
219+
220+
if (svm_fifo_max_enqueue (ao_tx_fifo) <= TCP_MSS)
221+
svm_fifo_add_want_deq_ntf (ao_tx_fifo, SVM_FIFO_WANT_DEQ_NOTIF);
216222
}
217223
else
218224
{
@@ -257,12 +263,48 @@ proxy_rx_callback (session_t * s)
257263
return 0;
258264
}
259265

266+
static int
267+
proxy_tx_callback (session_t * proxy_s)
268+
{
269+
proxy_main_t *pm = &proxy_main;
270+
transport_connection_t *tc;
271+
session_handle_t handle;
272+
proxy_session_t *ps;
273+
session_t *ao_s;
274+
uword *p;
275+
276+
clib_spinlock_lock_if_init (&pm->sessions_lock);
277+
278+
handle = session_handle (proxy_s);
279+
p = hash_get (pm->proxy_session_by_server_handle, handle);
280+
if (!p)
281+
return 0;
282+
283+
if (pool_is_free_index (pm->sessions, p[0]))
284+
return 0;
285+
286+
ps = pool_elt_at_index (pm->sessions, p[0]);
287+
if (ps->vpp_active_open_handle == ~0)
288+
return 0;
289+
290+
ao_s = session_get_from_handle (ps->vpp_active_open_handle);
291+
292+
/* Force ack on active open side to update rcv wnd */
293+
tc = session_get_transport (ao_s);
294+
tcp_send_ack ((tcp_connection_t *) tc);
295+
296+
clib_spinlock_unlock_if_init (&pm->sessions_lock);
297+
298+
return 0;
299+
}
300+
260301
static session_cb_vft_t proxy_session_cb_vft = {
261302
.session_accept_callback = proxy_accept_callback,
262303
.session_disconnect_callback = proxy_disconnect_callback,
263304
.session_connected_callback = proxy_connected_callback,
264305
.add_segment_callback = proxy_add_segment_callback,
265306
.builtin_app_rx_callback = proxy_rx_callback,
307+
.builtin_app_tx_callback = proxy_tx_callback,
266308
.session_reset_callback = proxy_reset_callback
267309
};
268310

@@ -358,6 +400,44 @@ active_open_rx_callback (session_t * s)
358400
SESSION_IO_EVT_TX);
359401
}
360402

403+
if (svm_fifo_max_enqueue (proxy_tx_fifo) <= TCP_MSS)
404+
svm_fifo_add_want_deq_ntf (proxy_tx_fifo, SVM_FIFO_WANT_DEQ_NOTIF);
405+
406+
return 0;
407+
}
408+
409+
static int
410+
active_open_tx_callback (session_t * ao_s)
411+
{
412+
proxy_main_t *pm = &proxy_main;
413+
transport_connection_t *tc;
414+
session_handle_t handle;
415+
proxy_session_t *ps;
416+
session_t *proxy_s;
417+
uword *p;
418+
419+
clib_spinlock_lock_if_init (&pm->sessions_lock);
420+
421+
handle = session_handle (ao_s);
422+
p = hash_get (pm->proxy_session_by_active_open_handle, handle);
423+
if (!p)
424+
return 0;
425+
426+
if (pool_is_free_index (pm->sessions, p[0]))
427+
return 0;
428+
429+
ps = pool_elt_at_index (pm->sessions, p[0]);
430+
if (ps->vpp_server_handle == ~0)
431+
return 0;
432+
433+
proxy_s = session_get_from_handle (ps->vpp_server_handle);
434+
435+
/* Force ack on proxy side to update rcv wnd */
436+
tc = session_get_transport (proxy_s);
437+
tcp_send_ack ((tcp_connection_t *) tc);
438+
439+
clib_spinlock_unlock_if_init (&pm->sessions_lock);
440+
361441
return 0;
362442
}
363443

@@ -367,7 +447,8 @@ static session_cb_vft_t active_open_clients = {
367447
.session_connected_callback = active_open_connected_callback,
368448
.session_accept_callback = active_open_create_callback,
369449
.session_disconnect_callback = active_open_disconnect_callback,
370-
.builtin_app_rx_callback = active_open_rx_callback
450+
.builtin_app_rx_callback = active_open_rx_callback,
451+
.builtin_app_tx_callback = active_open_tx_callback,
371452
};
372453
/* *INDENT-ON* */
373454

0 commit comments

Comments
 (0)