X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fsession%2Fsession_lookup.c;h=a8845996a0851e99536bbf84d94e4f3431c76503;hb=0028e6f31624246e831b5b1a13dc46ab1d864fa7;hp=b74973d726b0084afc6e3f40e9acd696cfd2eae0;hpb=a04ebb88e5fd726a9d343cc288c1858e69cf7872;p=vpp.git diff --git a/src/vnet/session/session_lookup.c b/src/vnet/session/session_lookup.c index b74973d726b..a8845996a08 100644 --- a/src/vnet/session/session_lookup.c +++ b/src/vnet/session/session_lookup.c @@ -156,25 +156,28 @@ make_v6_ss_kv_from_tc (session_kv6_t * kv, transport_connection_t * tc) } static session_table_t * -session_table_get_or_alloc (u8 fib_proto, u8 fib_index) +session_table_get_or_alloc (u8 fib_proto, u32 fib_index) { session_table_t *st; u32 table_index; - if (vec_len (fib_index_to_table_index[fib_proto]) <= fib_index) + ASSERT (fib_index != ~0); + if (vec_len (fib_index_to_table_index[fib_proto]) > fib_index && + fib_index_to_table_index[fib_proto][fib_index] != ~0) + { + table_index = fib_index_to_table_index[fib_proto][fib_index]; + return session_table_get (table_index); + } + else { st = session_table_alloc (); table_index = session_table_index (st); - vec_validate (fib_index_to_table_index[fib_proto], fib_index); + vec_validate_init_empty (fib_index_to_table_index[fib_proto], fib_index, + ~0); fib_index_to_table_index[fib_proto][fib_index] = table_index; st->active_fib_proto = fib_proto; session_table_init (st, fib_proto); return st; } - else - { - table_index = fib_index_to_table_index[fib_proto][fib_index]; - return session_table_get (table_index); - } } static session_table_t * @@ -211,6 +214,14 @@ session_lookup_get_index_for_fib (u32 fib_proto, u32 fib_index) return fib_index_to_table_index[fib_proto][fib_index]; } +u32 +session_lookup_get_or_alloc_index_for_fib (u32 fib_proto, u32 fib_index) +{ + session_table_t *st; + st = session_table_get_or_alloc (fib_proto, fib_index); + return session_table_index (st); +} + /** * Add transport connection to a session table * @@ -300,6 +311,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 +375,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 +691,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 +734,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); } /** @@ -1007,9 +1046,7 @@ session_lookup_connection4 (u32 fib_index, ip4_address_t * lcl, /** * Lookup session with ip4 and transport layer information * - * Important note: this may look into another thread's pool table and - * register as 'peeker'. Caller should call @ref session_pool_remove_peeker as - * if needed as soon as possible. + * Important note: this may look into another thread's pool table * * Lookup logic is similar to that of @ref session_lookup_connection_wt4 but * this returns a session as opposed to a transport connection and it does not @@ -1261,8 +1298,21 @@ session_lookup_safe6 (u32 fib_index, ip6_address_t * lcl, ip6_address_t * rmt, return 0; } -int -vnet_session_rule_add_del (session_rule_add_del_args_t * args) +transport_connection_t * +session_lookup_connection (u32 fib_index, ip46_address_t * lcl, + ip46_address_t * rmt, u16 lcl_port, u16 rmt_port, + u8 proto, u8 is_ip4) +{ + if (is_ip4) + return session_lookup_connection4 (fib_index, &lcl->ip4, &rmt->ip4, + lcl_port, rmt_port, proto); + else + return session_lookup_connection6 (fib_index, &lcl->ip6, &rmt->ip6, + lcl_port, rmt_port, proto); +} + +session_error_t +vnet_session_rule_add_del (session_rule_add_del_args_t *args) { app_namespace_t *app_ns = app_namespace_get (args->appns_index); session_rules_table_t *srt; @@ -1272,14 +1322,14 @@ vnet_session_rule_add_del (session_rule_add_del_args_t * args) int rv = 0; if (!app_ns) - return VNET_API_ERROR_APP_INVALID_NS; + return SESSION_E_INVALID_NS; if (args->scope > 3) - return VNET_API_ERROR_INVALID_VALUE; + return SESSION_E_INVALID; if (args->transport_proto != TRANSPORT_PROTO_TCP && args->transport_proto != TRANSPORT_PROTO_UDP) - return VNET_API_ERROR_INVALID_VALUE; + return SESSION_E_INVALID; if ((args->scope & SESSION_RULE_SCOPE_GLOBAL) || args->scope == 0) { @@ -1315,7 +1365,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); } @@ -1400,6 +1450,7 @@ session_rule_command_fn (vlib_main_t * vm, unformat_input_t * input, vlib_cli_command_t * cmd) { u32 proto = ~0, lcl_port, rmt_port, action = 0, lcl_plen = 0, rmt_plen = 0; + clib_error_t *error = 0; u32 appns_index, scope = 0; ip46_address_t lcl_ip, rmt_ip; u8 is_ip4 = 1, conn_set = 0; @@ -1408,6 +1459,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) @@ -1447,29 +1500,32 @@ session_rule_command_fn (vlib_main_t * vm, unformat_input_t * input, else if (unformat (input, "tag %_%v%_", &tag)) ; else - return clib_error_return (0, "unknown input `%U'", - format_unformat_error, input); + { + error = clib_error_return (0, "unknown input `%U'", + format_unformat_error, input); + goto done; + } } if (proto == ~0) { vlib_cli_output (vm, "proto must be set"); - return 0; + goto done; } if (is_add && !conn_set && action == ~0) { vlib_cli_output (vm, "connection and action must be set for add"); - return 0; + goto done; } if (!is_add && !tag && !conn_set) { vlib_cli_output (vm, "connection or tag must be set for delete"); - return 0; + goto done; } if (vec_len (tag) > SESSION_RULE_TAG_MAX_LEN) { vlib_cli_output (vm, "tag too long (max u64)"); - return 0; + goto done; } if (ns_id) @@ -1478,7 +1534,7 @@ session_rule_command_fn (vlib_main_t * vm, unformat_input_t * input, if (!app_ns) { vlib_cli_output (vm, "namespace %v does not exist", ns_id); - return 0; + goto done; } } else @@ -1505,10 +1561,12 @@ session_rule_command_fn (vlib_main_t * vm, unformat_input_t * input, .scope = scope, }; if ((rv = vnet_session_rule_add_del (&args))) - return clib_error_return (0, "rule add del returned %u", rv); + error = clib_error_return (0, "rule add del returned %u", rv); +done: + vec_free (ns_id); vec_free (tag); - return 0; + return error; } /* *INDENT-OFF* */ @@ -1558,6 +1616,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)