hsa: hcpc fixes 21/43921/6
authorFlorin Coras <[email protected]>
Wed, 22 Oct 2025 06:14:51 +0000 (02:14 -0400)
committerDave Barach <[email protected]>
Wed, 22 Oct 2025 23:17:42 +0000 (23:17 +0000)
- force unlistens via main thread with barrier
- add connect/accept callback functions to avoid warnings

Type: fix

Change-Id: Ia27c64bb07486e8df39d164cebe07530c254b992
Signed-off-by: Florin Coras <[email protected]>
src/plugins/hs_apps/http_connect_proxy_client.c

index fa850ec..ab96626 100644 (file)
@@ -498,18 +498,13 @@ hcpc_delete_session (session_t *s, u8 is_http)
 }
 
 static void
-hcpc_http_connection_closed ()
+hcpc_http_stop_listeners_rpc (void *args)
 {
+  vlib_main_t *vm = vlib_get_main ();
   hcpc_main_t *hcpcm = &hcpc_main;
   hcpc_listener_t *l;
-  hcpc_session_t *ps;
 
-  pool_foreach (ps, hcpcm->sessions)
-    {
-      ps->state = HCPC_SESSION_CLOSED;
-      ps->intercept_diconnected = 1;
-      ps->http_disconnected = 1;
-    }
+  vlib_worker_thread_barrier_sync (vm);
 
   pool_foreach (l, hcpcm->listeners)
     {
@@ -520,6 +515,24 @@ hcpc_http_connection_closed ()
          vnet_unlisten (&a);
        }
     }
+
+  vlib_worker_thread_barrier_release (vm);
+}
+
+static void
+hcpc_http_connection_closed ()
+{
+  hcpc_main_t *hcpcm = &hcpc_main;
+  hcpc_session_t *ps;
+
+  pool_foreach (ps, hcpcm->sessions)
+    {
+      ps->state = HCPC_SESSION_CLOSED;
+      ps->intercept_diconnected = 1;
+      ps->http_disconnected = 1;
+    }
+
+  session_send_rpc_evt_to_thread (0, hcpc_http_stop_listeners_rpc, 0);
 }
 
 static void
@@ -538,6 +551,7 @@ hcpc_close_session (session_t *s, u8 is_http)
       /* http connection went down */
       if (ps->flags & HCPC_SESSION_F_IS_PARENT)
        {
+         hcpc_session_close_http (ps);
          ps->state = HCPC_SESSION_CLOSED;
          hcpcm->http_connection_handle = SESSION_INVALID_HANDLE;
          hcpc_http_connection_closed ();
@@ -1011,6 +1025,13 @@ hcpc_read_http_connect_resp (session_t *s)
 /* http side vft callbacks */
 /***************************/
 
+static int
+hcpc_http_session_accept_callback (session_t *s)
+{
+  clib_warning ("http proxy client app should not get accept events");
+  return -1;
+}
+
 static int
 hcpc_http_session_connected_callback (u32 app_index, u32 session_index,
                                      session_t *s, session_error_t err)
@@ -1373,6 +1394,7 @@ hcpc_http_alloc_session_fifos (session_t *s)
 }
 
 static session_cb_vft_t http_session_cb_vft = {
+  .session_accept_callback = hcpc_http_session_accept_callback,
   .session_connected_callback = hcpc_http_session_connected_callback,
   .session_disconnect_callback = hcpc_http_session_disconnect_callback,
   .session_transport_closed_callback =
@@ -1428,6 +1450,14 @@ hcpc_intercept_accept_callback (session_t *s)
   return 0;
 }
 
+static int
+hcpc_intercept_connected_callback (u32 app_index, u32 session_index,
+                                  session_t *s, session_error_t err)
+{
+  clib_warning ("intercept app should not get connected events");
+  return -1;
+}
+
 static void
 hcpc_intercept_session_disconnect_callback (session_t *s)
 {
@@ -1579,6 +1609,7 @@ hcpc_intercept_write_early_data (session_t *s)
 
 static session_cb_vft_t listener_session_cb_vft = {
   .session_accept_callback = hcpc_intercept_accept_callback,
+  .session_connected_callback = hcpc_intercept_connected_callback,
   .session_disconnect_callback = hcpc_intercept_session_disconnect_callback,
   .session_transport_closed_callback =
     hcpc_intercept_session_transport_closed_callback,