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
2223proxy_main_t proxy_main ;
2324
25+ #define TCP_MSS 1460
26+
2427typedef 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+
260301static 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