udp/session: refactor to support dgram mode
[vpp.git] / src / vnet / session / application.c
index 7bc2c11..68bbd59 100644 (file)
@@ -442,16 +442,12 @@ application_start_listen (application_t * srv, session_endpoint_t * sep,
   session_type_t sst;
 
   sst = session_type_from_proto_and_ip (sep->transport_proto, sep->is_ip4);
-  s = listen_session_new (sst);
+  s = listen_session_new (0, sst);
   s->app_index = srv->index;
 
-  if (stream_session_listen (s, sep))
-    goto err;
-
   /* Allocate segment manager. All sessions derived out of a listen session
    * have fifos allocated by the same segment manager. */
-  sm = application_alloc_segment_manager (srv);
-  if (sm == 0)
+  if (!(sm = application_alloc_segment_manager (srv)))
     goto err;
 
   /* Add to app's listener table. Useful to find all child listeners
@@ -459,6 +455,13 @@ application_start_listen (application_t * srv, session_endpoint_t * sep,
   handle = listen_session_get_handle (s);
   hash_set (srv->listeners_table, handle, segment_manager_index (sm));
 
+  if (stream_session_listen (s, sep))
+    {
+      segment_manager_del (sm);
+      hash_unset (srv->listeners_table, handle);
+      goto err;
+    }
+
   *res = handle;
   return 0;
 
@@ -566,8 +569,7 @@ application_get_local_segment_manager_w_session (application_t * app,
   stream_session_t *listener;
   if (application_local_session_listener_has_transport (ls))
     {
-      listener = listen_session_get (ls->listener_session_type,
-                                    ls->listener_index);
+      listener = listen_session_get (ls->listener_index);
       return application_get_listen_segment_manager (app, listener);
     }
   return segment_manager_get (app->local_segment_manager);