X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fsession%2Fsession_lookup.c;h=986832346fc00609d9df5def5a43227fab994d94;hb=07063b8ea;hp=854da7fdd3c9af57c3ffc673efde2d4c956e8c25;hpb=c1a4265b4b76bf7874b53e866549371c8daf70f4;p=vpp.git diff --git a/src/vnet/session/session_lookup.c b/src/vnet/session/session_lookup.c index 854da7fdd3c..986832346fc 100644 --- a/src/vnet/session/session_lookup.c +++ b/src/vnet/session/session_lookup.c @@ -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)