18
18
#include <vnet/session/application.h>
19
19
#include <vnet/session/application_interface.h>
20
20
#include <hs_apps/proxy.h>
21
+ #include <vnet/tcp/tcp.h>
21
22
22
23
proxy_main_t proxy_main ;
23
24
25
+ #define TCP_MSS 1460
26
+
24
27
typedef struct
25
28
{
26
29
char uri [128 ];
@@ -189,7 +192,7 @@ proxy_rx_callback (session_t * s)
189
192
proxy_session_t * ps ;
190
193
int proxy_index ;
191
194
uword * p ;
192
- svm_fifo_t * active_open_tx_fifo ;
195
+ svm_fifo_t * ao_tx_fifo ;
193
196
194
197
ASSERT (s -> thread_index == thread_index );
195
198
@@ -199,20 +202,23 @@ proxy_rx_callback (session_t * s)
199
202
if (PREDICT_TRUE (p != 0 ))
200
203
{
201
204
clib_spinlock_unlock_if_init (& pm -> sessions_lock );
202
- active_open_tx_fifo = s -> rx_fifo ;
205
+ ao_tx_fifo = s -> rx_fifo ;
203
206
204
207
/*
205
208
* Send event for active open tx fifo
206
209
*/
207
- if (svm_fifo_set_event (active_open_tx_fifo ))
210
+ if (svm_fifo_set_event (ao_tx_fifo ))
208
211
{
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 ;
211
214
if (session_send_io_evt_to_thread_custom (& ao_session_index ,
212
215
ao_thread_index ,
213
216
SESSION_IO_EVT_TX ))
214
217
clib_warning ("failed to enqueue tx evt" );
215
218
}
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 );
216
222
}
217
223
else
218
224
{
@@ -257,12 +263,48 @@ proxy_rx_callback (session_t * s)
257
263
return 0 ;
258
264
}
259
265
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
+
260
301
static session_cb_vft_t proxy_session_cb_vft = {
261
302
.session_accept_callback = proxy_accept_callback ,
262
303
.session_disconnect_callback = proxy_disconnect_callback ,
263
304
.session_connected_callback = proxy_connected_callback ,
264
305
.add_segment_callback = proxy_add_segment_callback ,
265
306
.builtin_app_rx_callback = proxy_rx_callback ,
307
+ .builtin_app_tx_callback = proxy_tx_callback ,
266
308
.session_reset_callback = proxy_reset_callback
267
309
};
268
310
@@ -358,6 +400,44 @@ active_open_rx_callback (session_t * s)
358
400
SESSION_IO_EVT_TX );
359
401
}
360
402
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
+
361
441
return 0 ;
362
442
}
363
443
@@ -367,7 +447,8 @@ static session_cb_vft_t active_open_clients = {
367
447
.session_connected_callback = active_open_connected_callback ,
368
448
.session_accept_callback = active_open_create_callback ,
369
449
.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 ,
371
452
};
372
453
/* *INDENT-ON* */
373
454
0 commit comments