session: separate local session logic
[vpp.git] / src / vnet / session / session_api.c
index 015b29f..5780787 100755 (executable)
@@ -17,6 +17,7 @@
 #include <vlibmemory/api.h>
 #include <vnet/session/application.h>
 #include <vnet/session/application_interface.h>
+#include <vnet/session/application_local.h>
 #include <vnet/session/session_rules_table.h>
 #include <vnet/session/session_table.h>
 #include <vnet/session/session.h>
@@ -917,7 +918,8 @@ done:
         rmp->handle = a->handle;
         if (app && application_has_global_scope (app))
             {
-              s = listen_session_get_from_handle (a->handle);
+              app_listener_t* al = app_listener_get_w_handle(a->handle);
+              s = app_listener_get_session(al);
               tc = listen_session_get_transport (s);
               rmp->lcl_is_ip4 = tc->is_ip4;
               rmp->lcl_port = tc->lcl_port;
@@ -1247,7 +1249,8 @@ vl_api_unbind_sock_t_handler (vl_api_unbind_sock_t * mp)
 {
   vl_api_unbind_sock_reply_t *rmp;
   vnet_unlisten_args_t _a, *a = &_a;
-  application_t *app;
+  app_worker_t *app_wrk;
+  application_t *app = 0;
   int rv = 0;
 
   if (session_manager_is_enabled () == 0)
@@ -1268,6 +1271,34 @@ vl_api_unbind_sock_t_handler (vl_api_unbind_sock_t * mp)
 
 done:
   REPLY_MACRO (VL_API_UNBIND_SOCK_REPLY);
+
+  /*
+   * Send reply over msg queue
+   */
+  svm_msg_q_msg_t _msg, *msg = &_msg;
+  session_unlisten_reply_msg_t *ump;
+  svm_msg_q_t *app_mq;
+  session_event_t *evt;
+
+  if (!app)
+    return;
+
+  app_wrk = application_get_worker (app, a->wrk_map_index);
+  if (!app_wrk)
+    return;
+
+  app_mq = app_wrk->event_queue;
+  if (mq_try_lock_and_alloc_msg (app_mq, msg))
+    return;
+
+  evt = svm_msg_q_msg_data (app_mq, msg);
+  clib_memset (evt, 0, sizeof (*evt));
+  evt->event_type = SESSION_CTRL_EVT_UNLISTEN_REPLY;
+  ump = (session_unlisten_reply_msg_t *) evt->data;
+  ump->context = mp->context;
+  ump->handle = mp->handle;
+  ump->retval = rv;
+  svm_msg_q_add_and_unlock (app_mq, msg);
 }
 
 static void