session: Add transport vft protocol options
[vpp.git] / src / vnet / udp / udp.c
index d5166d9..d0c515a 100644 (file)
@@ -238,6 +238,7 @@ format_udp_session (u8 * s, va_list * args)
 u8 *
 format_udp_half_open_session (u8 * s, va_list * args)
 {
+  u32 __clib_unused tci = va_arg (*args, u32);
   clib_warning ("BUG");
   return 0;
 }
@@ -246,6 +247,7 @@ u8 *
 format_udp_listener_session (u8 * s, va_list * args)
 {
   u32 tci = va_arg (*args, u32);
+  u32 __clib_unused verbose = va_arg (*args, u32);
   udp_connection_t *uc = udp_listener_get (tci);
   return format (s, "%U", format_udp_connection, uc);
 }
@@ -318,11 +320,13 @@ udp_session_get_half_open (u32 conn_index)
   /* We don't poll main thread if we have workers */
   thread_index = vlib_num_workers ()? 1 : 0;
   uc = udp_connection_get (conn_index, thread_index);
+  if (!uc)
+    return 0;
   return &uc->connection;
 }
 
 /* *INDENT-OFF* */
-const static transport_proto_vft_t udp_proto = {
+static const transport_proto_vft_t udp_proto = {
   .start_listen = udp_session_bind,
   .connect = udp_open_connection,
   .stop_listen = udp_session_unbind,
@@ -337,8 +341,10 @@ const static transport_proto_vft_t udp_proto = {
   .format_connection = format_udp_session,
   .format_half_open = format_udp_half_open_session,
   .format_listener = format_udp_listener_session,
-  .tx_type = TRANSPORT_TX_DGRAM,
-  .service_type = TRANSPORT_SERVICE_CL,
+  .transport_options = {
+    .tx_type = TRANSPORT_TX_DGRAM,
+    .service_type = TRANSPORT_SERVICE_CL,
+  },
 };
 /* *INDENT-ON* */
 
@@ -352,7 +358,8 @@ udpc_connection_open (transport_endpoint_cfg_t * rmt)
   u32 uc_index;
   uc_index = udp_open_connection (rmt);
   uc = udp_connection_get (uc_index, thread_index);
-  uc->is_connected = 1;
+  if (uc)
+    uc->is_connected = 1;
   return uc_index;
 }
 
@@ -368,7 +375,7 @@ udpc_connection_listen (u32 session_index, transport_endpoint_t * lcl)
 }
 
 /* *INDENT-OFF* */
-const static transport_proto_vft_t udpc_proto = {
+static const transport_proto_vft_t udpc_proto = {
   .start_listen = udpc_connection_listen,
   .stop_listen = udp_session_unbind,
   .connect = udpc_connection_open,
@@ -383,8 +390,10 @@ const static transport_proto_vft_t udpc_proto = {
   .format_connection = format_udp_session,
   .format_half_open = format_udp_half_open_session,
   .format_listener = format_udp_listener_session,
-  .tx_type = TRANSPORT_TX_DGRAM,
-  .service_type = TRANSPORT_SERVICE_CL,
+  .transport_options = {
+    .tx_type = TRANSPORT_TX_DGRAM,
+    .service_type = TRANSPORT_SERVICE_VC,
+  },
 };
 /* *INDENT-ON* */
 
@@ -395,17 +404,9 @@ udp_init (vlib_main_t * vm)
   ip_main_t *im = &ip_main;
   vlib_thread_main_t *tm = vlib_get_thread_main ();
   u32 num_threads;
-  clib_error_t *error = 0;
   ip_protocol_info_t *pi;
   int i;
 
-  if ((error = vlib_call_init_function (vm, ip_main_init)))
-    return error;
-  if ((error = vlib_call_init_function (vm, ip4_lookup_init)))
-    return error;
-  if ((error = vlib_call_init_function (vm, ip6_lookup_init)))
-    return error;
-
   /*
    * Registrations
    */
@@ -443,10 +444,17 @@ udp_init (vlib_main_t * vm)
        clib_spinlock_init (&um->peekers_readers_locks[i]);
        clib_spinlock_init (&um->peekers_write_locks[i]);
       }
-  return error;
+  return 0;
 }
 
-VLIB_INIT_FUNCTION (udp_init);
+/* *INDENT-OFF* */
+VLIB_INIT_FUNCTION (udp_init) =
+{
+  .runs_after = VLIB_INITS("ip_main_init", "ip4_lookup_init",
+                           "ip6_lookup_init"),
+};
+/* *INDENT-ON* */
+
 
 static clib_error_t *
 show_udp_punt_fn (vlib_main_t * vm, unformat_input_t * input,