session: api to add new transport types
[vpp.git] / src / vnet / session / session_lookup.c
index 854da7f..9868323 100644 (file)
@@ -300,6 +300,32 @@ session_lookup_del_session_endpoint (u32 table_index,
     }
 }
 
+int
+session_lookup_del_session_endpoint2 (session_endpoint_t * sep)
+{
+  fib_protocol_t fib_proto;
+  session_table_t *st;
+  session_kv4_t kv4;
+  session_kv6_t kv6;
+
+  fib_proto = sep->is_ip4 ? FIB_PROTOCOL_IP4 : FIB_PROTOCOL_IP6;
+  st = session_table_get_for_fib_index (fib_proto, sep->fib_index);
+  if (!st)
+    return -1;
+  if (sep->is_ip4)
+    {
+      make_v4_listener_kv (&kv4, &sep->ip.ip4, sep->port,
+                          sep->transport_proto);
+      return clib_bihash_add_del_16_8 (&st->v4_session_hash, &kv4, 0);
+    }
+  else
+    {
+      make_v6_listener_kv (&kv6, &sep->ip.ip6, sep->port,
+                          sep->transport_proto);
+      return clib_bihash_add_del_48_8 (&st->v6_session_hash, &kv6, 0);
+    }
+}
+
 /**
  * Delete transport connection from session table
  *
@@ -338,6 +364,8 @@ session_lookup_del_session (session_t * s)
   transport_connection_t *ts;
   ts = transport_get_connection (session_get_transport_proto (s),
                                 s->connection_index, s->thread_index);
+  if (!ts || (ts->flags & TRANSPORT_CONNECTION_F_NO_LOOKUP))
+    return 0;
   return session_lookup_del_connection (ts);
 }
 
@@ -652,13 +680,13 @@ session_lookup_listener4_i (session_table_t * st, ip4_address_t * lcl,
 
 session_t *
 session_lookup_listener4 (u32 fib_index, ip4_address_t * lcl, u16 lcl_port,
-                         u8 proto)
+                         u8 proto, u8 use_wildcard)
 {
   session_table_t *st;
   st = session_table_get_for_fib_index (FIB_PROTOCOL_IP4, fib_index);
   if (!st)
     return 0;
-  return session_lookup_listener4_i (st, lcl, lcl_port, proto, 0);
+  return session_lookup_listener4_i (st, lcl, lcl_port, proto, use_wildcard);
 }
 
 static session_t *
@@ -695,13 +723,13 @@ session_lookup_listener6_i (session_table_t * st, ip6_address_t * lcl,
 
 session_t *
 session_lookup_listener6 (u32 fib_index, ip6_address_t * lcl, u16 lcl_port,
-                         u8 proto)
+                         u8 proto, u8 use_wildcard)
 {
   session_table_t *st;
   st = session_table_get_for_fib_index (FIB_PROTOCOL_IP6, fib_index);
   if (!st)
     return 0;
-  return session_lookup_listener6_i (st, lcl, lcl_port, proto, 1);
+  return session_lookup_listener6_i (st, lcl, lcl_port, proto, use_wildcard);
 }
 
 /**
@@ -723,6 +751,27 @@ session_lookup_listener (u32 table_index, session_endpoint_t * sep)
   return 0;
 }
 
+/**
+ * Lookup listener wildcard match
+ */
+session_t *
+session_lookup_listener_wildcard (u32 table_index, session_endpoint_t * sep)
+{
+  session_table_t *st;
+  st = session_table_get (table_index);
+  if (!st)
+    return 0;
+  if (sep->is_ip4)
+    return session_lookup_listener4_i (st, &sep->ip.ip4, sep->port,
+                                      sep->transport_proto,
+                                      1 /* use_wildcard */ );
+  else
+    return session_lookup_listener6_i (st, &sep->ip.ip6, sep->port,
+                                      sep->transport_proto,
+                                      1 /* use_wildcard */ );
+  return 0;
+}
+
 int
 session_lookup_add_half_open (transport_connection_t * tc, u64 value)
 {
@@ -1294,7 +1343,7 @@ session_lookup_set_tables_appns (app_namespace_t * app_ns)
   for (fp = 0; fp < ARRAY_LEN (fib_index_to_table_index); fp++)
     {
       fib_index = app_namespace_get_fib_index (app_ns, fp);
-      st = session_table_get_for_fib_index (fp, fib_index);
+      st = session_table_get_or_alloc (fp, fib_index);
       if (st)
        st->appns_index = app_namespace_index (app_ns);
     }
@@ -1304,7 +1353,7 @@ u8 *
 format_ip4_session_lookup_kvp (u8 * s, va_list * args)
 {
   clib_bihash_kv_16_8_t *kvp = va_arg (*args, clib_bihash_kv_16_8_t *);
-  u32 is_local = va_arg (*args, u32), app_wrk_index, session_index;
+  u32 is_local = va_arg (*args, u32);
   v4_connection_key_t *key = (v4_connection_key_t *) kvp->key;
   session_t *session;
   app_worker_t *app_wrk;
@@ -1324,8 +1373,8 @@ format_ip4_session_lookup_kvp (u8 * s, va_list * args)
     }
   else
     {
-      local_session_parse_handle (kvp->value, &app_wrk_index, &session_index);
-      app_wrk = app_worker_get (app_wrk_index);
+      session = session_get_from_handle (kvp->value);
+      app_wrk = app_worker_get (session->app_wrk_index);
       app_name = application_name_from_index (app_wrk->app_index);
       str = format (0, "[%U] %U:%d", format_transport_proto_short, key->proto,
                    format_ip4_address, &key->src,
@@ -1387,6 +1436,8 @@ session_rule_command_fn (vlib_main_t * vm, unformat_input_t * input,
   app_namespace_t *app_ns;
   int rv;
 
+  session_cli_return_if_not_enabled ();
+
   clib_memset (&lcl_ip, 0, sizeof (lcl_ip));
   clib_memset (&rmt_ip, 0, sizeof (rmt_ip));
   while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
@@ -1468,6 +1519,7 @@ session_rule_command_fn (vlib_main_t * vm, unformat_input_t * input,
 
   fib_proto = is_ip4 ? FIB_PROTOCOL_IP4 : FIB_PROTOCOL_IP6;
   session_rule_add_del_args_t args = {
+    .transport_proto = proto,
     .table_args.lcl.fp_addr = lcl_ip,
     .table_args.lcl.fp_len = lcl_plen,
     .table_args.lcl.fp_proto = fib_proto,
@@ -1536,6 +1588,8 @@ show_session_rules_command_fn (vlib_main_t * vm, unformat_input_t * input,
   session_table_t *st;
   u8 *ns_id = 0, fib_proto;
 
+  session_cli_return_if_not_enabled ();
+
   clib_memset (&lcl_ip, 0, sizeof (lcl_ip));
   clib_memset (&rmt_ip, 0, sizeof (rmt_ip));
   while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)