X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fsession%2Fsession_lookup.c;h=9ce0b1a22eb97b348cb798e6b958391ffc2317d6;hb=f8f516a8b0ccab2f5d9796f90419bf2661c750af;hp=2e4e96a4dea0c36f9d065fda6053b524e0e50a31;hpb=dff48db0782444125f68cab14d91e7bb4109286a;p=vpp.git diff --git a/src/vnet/session/session_lookup.c b/src/vnet/session/session_lookup.c index 2e4e96a4dea..9ce0b1a22eb 100644 --- a/src/vnet/session/session_lookup.c +++ b/src/vnet/session/session_lookup.c @@ -127,10 +127,10 @@ make_v4_proxy_kv (session_kv4_t * kv, ip4_address_t * lcl, u8 proto) } always_inline void -make_v4_ss_kv_from_tc (session_kv4_t * kv, transport_connection_t * t) +make_v4_ss_kv_from_tc (session_kv4_t * kv, transport_connection_t * tc) { - make_v4_ss_kv (kv, &t->lcl_ip.ip4, &t->rmt_ip.ip4, t->lcl_port, t->rmt_port, - session_type_from_proto_and_ip (t->proto, 1)); + make_v4_ss_kv (kv, &tc->lcl_ip.ip4, &tc->rmt_ip.ip4, tc->lcl_port, + tc->rmt_port, tc->proto); } always_inline void @@ -187,10 +187,10 @@ make_v6_proxy_kv (session_kv6_t * kv, ip6_address_t * lcl, u8 proto) } always_inline void -make_v6_ss_kv_from_tc (session_kv6_t * kv, transport_connection_t * t) +make_v6_ss_kv_from_tc (session_kv6_t * kv, transport_connection_t * tc) { - make_v6_ss_kv (kv, &t->lcl_ip.ip6, &t->rmt_ip.ip6, t->lcl_port, t->rmt_port, - session_type_from_proto_and_ip (t->proto, 0)); + make_v6_ss_kv (kv, &tc->lcl_ip.ip6, &tc->rmt_ip.ip6, tc->lcl_port, + tc->rmt_port, tc->proto); } static session_table_t * @@ -205,6 +205,7 @@ session_table_get_or_alloc (u8 fib_proto, u8 fib_index) vec_validate (fib_index_to_table_index[fib_proto], fib_index); 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 @@ -372,9 +373,9 @@ session_lookup_del_connection (transport_connection_t * tc) int session_lookup_del_session (stream_session_t * s) { + transport_proto_t tp = session_get_transport_proto (s); transport_connection_t *ts; - ts = tp_vfts[s->session_type].get_connection (s->connection_index, - s->thread_index); + ts = tp_vfts[tp].get_connection (s->connection_index, s->thread_index); return session_lookup_del_connection (ts); } @@ -387,17 +388,18 @@ session_lookup_action_index_is_valid (u32 action_index) return 1; } -static u32 -session_lookup_action_to_app_index (u32 action_index) +static u64 +session_lookup_action_to_handle (u32 action_index) { switch (action_index) { case SESSION_RULES_TABLE_ACTION_DROP: - return APP_DROP_INDEX; + return SESSION_DROP_HANDLE; case SESSION_RULES_TABLE_ACTION_ALLOW: case SESSION_RULES_TABLE_INVALID_INDEX: - return APP_INVALID_INDEX; + return SESSION_INVALID_HANDLE; default: + /* application index */ return action_index; } } @@ -419,12 +421,13 @@ session_lookup_action_to_session (u32 action_index, u8 fib_proto, u8 transport_proto) { u32 app_index; - app_index = session_lookup_action_to_app_index (action_index); + app_index = session_lookup_action_to_handle (action_index); /* Nothing sophisticated for now, action index is app index */ return session_lookup_app_listen_session (app_index, fib_proto, transport_proto); } +/** UNUSED */ stream_session_t * session_lookup_rules_table_session4 (session_table_t * st, u8 proto, ip4_address_t * lcl, u16 lcl_port, @@ -434,12 +437,13 @@ session_lookup_rules_table_session4 (session_table_t * st, u8 proto, u32 action_index, app_index; action_index = session_rules_table_lookup4 (srt, lcl, rmt, lcl_port, rmt_port); - app_index = session_lookup_action_to_app_index (action_index); + app_index = session_lookup_action_to_handle (action_index); /* Nothing sophisticated for now, action index is app index */ return session_lookup_app_listen_session (app_index, FIB_PROTOCOL_IP4, proto); } +/** UNUSED */ stream_session_t * session_lookup_rules_table_session6 (session_table_t * st, u8 proto, ip6_address_t * lcl, u16 lcl_port, @@ -449,7 +453,7 @@ session_lookup_rules_table_session6 (session_table_t * st, u8 proto, u32 action_index, app_index; action_index = session_rules_table_lookup6 (srt, lcl, rmt, lcl_port, rmt_port); - app_index = session_lookup_action_to_app_index (action_index); + app_index = session_lookup_action_to_handle (action_index); return session_lookup_app_listen_session (app_index, FIB_PROTOCOL_IP6, proto); } @@ -462,7 +466,7 @@ session_lookup_rules_table_session6 (session_table_t * st, u8 proto, * @param use_rules flag that indicates if the session rules of the table * should be used * @return invalid handle if nothing is found, the handle of a valid listener - * or an action_index if a rule is hit + * or an action derived handle if a rule is hit */ u64 session_lookup_endpoint_listener (u32 table_index, session_endpoint_t * sep, @@ -472,9 +476,7 @@ session_lookup_endpoint_listener (u32 table_index, session_endpoint_t * sep, session_table_t *st; u32 ai; int rv; - u8 sst; - sst = session_type_from_proto_and_ip (sep->transport_proto, sep->is_ip4); st = session_table_get (table_index); if (!st) return SESSION_INVALID_HANDLE; @@ -483,7 +485,8 @@ session_lookup_endpoint_listener (u32 table_index, session_endpoint_t * sep, session_kv4_t kv4; ip4_address_t lcl4; - make_v4_listener_kv (&kv4, &sep->ip.ip4, sep->port, sst); + make_v4_listener_kv (&kv4, &sep->ip.ip4, sep->port, + sep->transport_proto); rv = clib_bihash_search_inline_16_8 (&st->v4_session_hash, &kv4); if (rv == 0) return kv4.value; @@ -494,7 +497,7 @@ session_lookup_endpoint_listener (u32 table_index, session_endpoint_t * sep, ai = session_rules_table_lookup4 (srt, &lcl4, &sep->ip.ip4, 0, sep->port); if (session_lookup_action_index_is_valid (ai)) - return session_lookup_action_to_app_index (ai); + return session_lookup_action_to_handle (ai); } } else @@ -502,7 +505,8 @@ session_lookup_endpoint_listener (u32 table_index, session_endpoint_t * sep, session_kv6_t kv6; ip6_address_t lcl6; - make_v6_listener_kv (&kv6, &sep->ip.ip6, sep->port, sst); + make_v6_listener_kv (&kv6, &sep->ip.ip6, sep->port, + sep->transport_proto); rv = clib_bihash_search_inline_48_8 (&st->v6_session_hash, &kv6); if (rv == 0) return kv6.value; @@ -514,7 +518,7 @@ session_lookup_endpoint_listener (u32 table_index, session_endpoint_t * sep, ai = session_rules_table_lookup6 (srt, &lcl6, &sep->ip.ip6, 0, sep->port); if (session_lookup_action_index_is_valid (ai)) - return session_lookup_action_to_app_index (ai); + return session_lookup_action_to_handle (ai); } } return SESSION_INVALID_HANDLE; @@ -534,9 +538,9 @@ session_lookup_endpoint_listener (u32 table_index, session_endpoint_t * sep, * * @param table_index table where the lookup should be done * @param sep session endpoint to be looked up - * @return index that can be interpreted as an app index or drop action. + * @return session handle that can be interpreted as an adjacency */ -u32 +u64 session_lookup_local_endpoint (u32 table_index, session_endpoint_t * sep) { session_rules_table_t *srt; @@ -562,7 +566,7 @@ session_lookup_local_endpoint (u32 table_index, session_endpoint_t * sep) ai = session_rules_table_lookup4 (srt, &lcl4, &sep->ip.ip4, 0, sep->port); if (session_lookup_action_index_is_valid (ai)) - return session_lookup_action_to_app_index (ai); + return session_lookup_action_to_handle (ai); /* * Check if session endpoint is a listener @@ -571,7 +575,7 @@ session_lookup_local_endpoint (u32 table_index, session_endpoint_t * sep) sep->transport_proto); rv = clib_bihash_search_inline_16_8 (&st->v4_session_hash, &kv4); if (rv == 0) - return (u32) kv4.value; + return kv4.value; /* * Zero out the ip. Logic is that connect to local ips, say @@ -580,7 +584,7 @@ session_lookup_local_endpoint (u32 table_index, session_endpoint_t * sep) kv4.key[0] = 0; rv = clib_bihash_search_inline_16_8 (&st->v4_session_hash, &kv4); if (rv == 0) - return (u32) kv4.value; + return kv4.value; /* * Zero out the port and check if we have proxy @@ -588,7 +592,7 @@ session_lookup_local_endpoint (u32 table_index, session_endpoint_t * sep) kv4.key[1] = 0; rv = clib_bihash_search_inline_16_8 (&st->v4_session_hash, &kv4); if (rv == 0) - return (u32) kv4.value; + return kv4.value; } else { @@ -600,13 +604,13 @@ session_lookup_local_endpoint (u32 table_index, session_endpoint_t * sep) ai = session_rules_table_lookup6 (srt, &lcl6, &sep->ip.ip6, 0, sep->port); if (session_lookup_action_index_is_valid (ai)) - return session_lookup_action_to_app_index (ai); + return session_lookup_action_to_handle (ai); make_v6_listener_kv (&kv6, &sep->ip.ip6, sep->port, sep->transport_proto); rv = clib_bihash_search_inline_48_8 (&st->v6_session_hash, &kv6); if (rv == 0) - return (u32) kv6.value; + return kv6.value; /* * Zero out the ip. Same logic as above. @@ -614,7 +618,7 @@ session_lookup_local_endpoint (u32 table_index, session_endpoint_t * sep) kv6.key[0] = kv6.key[1] = 0; rv = clib_bihash_search_inline_48_8 (&st->v6_session_hash, &kv6); if (rv == 0) - return (u32) kv6.value; + return kv6.value; /* * Zero out the port. Same logic as above. @@ -622,9 +626,9 @@ session_lookup_local_endpoint (u32 table_index, session_endpoint_t * sep) kv6.key[4] = kv6.key[5] = 0; rv = clib_bihash_search_inline_48_8 (&st->v6_session_hash, &kv6); if (rv == 0) - return (u32) kv6.value; + return kv6.value; } - return APP_INVALID_INDEX; + return SESSION_INVALID_HANDLE; } static stream_session_t * @@ -633,14 +637,16 @@ session_lookup_listener4_i (session_table_t * st, ip4_address_t * lcl, { session_kv4_t kv4; int rv; + session_type_t session_type; /* * First, try a fully formed listener */ + session_type = session_type_from_proto_and_ip (proto, 1); make_v4_listener_kv (&kv4, lcl, lcl_port, proto); rv = clib_bihash_search_inline_16_8 (&st->v4_session_hash, &kv4); if (rv == 0) - return session_manager_get_listener (proto, (u32) kv4.value); + return session_manager_get_listener (session_type, (u32) kv4.value); /* * Zero out the lcl ip and check if any 0/0 port binds have been done @@ -648,7 +654,7 @@ session_lookup_listener4_i (session_table_t * st, ip4_address_t * lcl, kv4.key[0] = 0; rv = clib_bihash_search_inline_16_8 (&st->v4_session_hash, &kv4); if (rv == 0) - return session_manager_get_listener (proto, (u32) kv4.value); + return session_manager_get_listener (session_type, (u32) kv4.value); /* * Zero out port and check if we have a proxy set up for our ip @@ -656,7 +662,7 @@ session_lookup_listener4_i (session_table_t * st, ip4_address_t * lcl, make_v4_proxy_kv (&kv4, lcl, proto); rv = clib_bihash_search_inline_16_8 (&st->v4_session_hash, &kv4); if (rv == 0) - return session_manager_get_listener (proto, (u32) kv4.value); + return session_manager_get_listener (session_type, (u32) kv4.value); return 0; } @@ -678,22 +684,24 @@ session_lookup_listener6_i (session_table_t * st, ip6_address_t * lcl, { session_kv6_t kv6; int rv; + session_type_t session_type; + session_type = session_type_from_proto_and_ip (proto, 0); make_v6_listener_kv (&kv6, lcl, lcl_port, proto); rv = clib_bihash_search_inline_48_8 (&st->v6_session_hash, &kv6); if (rv == 0) - return session_manager_get_listener (proto, (u32) kv6.value); + return session_manager_get_listener (session_type, (u32) kv6.value); /* Zero out the lcl ip */ kv6.key[0] = kv6.key[1] = 0; rv = clib_bihash_search_inline_48_8 (&st->v6_session_hash, &kv6); if (rv == 0) - return session_manager_get_listener (proto, (u32) kv6.value); + return session_manager_get_listener (session_type, (u32) kv6.value); make_v6_proxy_kv (&kv6, lcl, proto); rv = clib_bihash_search_inline_48_8 (&st->v6_session_hash, &kv6); if (rv == 0) - return session_manager_get_listener (proto, (u32) kv6.value); + return session_manager_get_listener (session_type, (u32) kv6.value); return 0; } @@ -869,8 +877,8 @@ session_lookup_connection_wt4 (u32 fib_index, ip4_address_t * lcl, { ASSERT ((u32) (kv4.value >> 32) == thread_index); s = session_get (kv4.value & 0xFFFFFFFFULL, thread_index); - return tp_vfts[s->session_type].get_connection (s->connection_index, - thread_index); + return tp_vfts[proto].get_connection (s->connection_index, + thread_index); } /* @@ -878,10 +886,7 @@ session_lookup_connection_wt4 (u32 fib_index, ip4_address_t * lcl, */ rv = clib_bihash_search_inline_16_8 (&st->v4_half_open_hash, &kv4); if (rv == 0) - { - u32 sst = session_type_from_proto_and_ip (proto, 1); - return tp_vfts[sst].get_half_open (kv4.value & 0xFFFFFFFF); - } + return tp_vfts[proto].get_half_open (kv4.value & 0xFFFFFFFF); /* * Check the session rules table @@ -894,7 +899,7 @@ session_lookup_connection_wt4 (u32 fib_index, ip4_address_t * lcl, return 0; if ((s = session_lookup_action_to_session (action_index, FIB_PROTOCOL_IP4, proto))) - return tp_vfts[s->session_type].get_listener (s->connection_index); + return tp_vfts[proto].get_listener (s->connection_index); return 0; } @@ -903,7 +908,7 @@ session_lookup_connection_wt4 (u32 fib_index, ip4_address_t * lcl, */ s = session_lookup_listener4_i (st, lcl, lcl_port, proto); if (s) - return tp_vfts[s->session_type].get_listener (s->connection_index); + return tp_vfts[proto].get_listener (s->connection_index); return 0; } @@ -947,8 +952,8 @@ session_lookup_connection4 (u32 fib_index, ip4_address_t * lcl, if (rv == 0) { s = session_get_from_handle (kv4.value); - return tp_vfts[s->session_type].get_connection (s->connection_index, - s->thread_index); + return tp_vfts[proto].get_connection (s->connection_index, + s->thread_index); } /* @@ -956,10 +961,7 @@ session_lookup_connection4 (u32 fib_index, ip4_address_t * lcl, */ rv = clib_bihash_search_inline_16_8 (&st->v4_half_open_hash, &kv4); if (rv == 0) - { - u32 sst = session_type_from_proto_and_ip (proto, 1); - return tp_vfts[sst].get_half_open (kv4.value & 0xFFFFFFFF); - } + return tp_vfts[proto].get_half_open (kv4.value & 0xFFFFFFFF); /* * Check the session rules table @@ -972,7 +974,7 @@ session_lookup_connection4 (u32 fib_index, ip4_address_t * lcl, return 0; if ((s = session_lookup_action_to_session (action_index, FIB_PROTOCOL_IP4, proto))) - return tp_vfts[s->session_type].get_listener (s->connection_index); + return tp_vfts[proto].get_listener (s->connection_index); return 0; } @@ -981,7 +983,7 @@ session_lookup_connection4 (u32 fib_index, ip4_address_t * lcl, */ s = session_lookup_listener4_i (st, lcl, lcl_port, proto); if (s) - return tp_vfts[s->session_type].get_listener (s->connection_index); + return tp_vfts[proto].get_listener (s->connection_index); return 0; } @@ -1090,17 +1092,14 @@ session_lookup_connection_wt6 (u32 fib_index, ip6_address_t * lcl, { ASSERT ((u32) (kv6.value >> 32) == thread_index); s = session_get (kv6.value & 0xFFFFFFFFULL, thread_index); - return tp_vfts[s->session_type].get_connection (s->connection_index, - thread_index); + return tp_vfts[proto].get_connection (s->connection_index, + thread_index); } /* Try half-open connections */ rv = clib_bihash_search_inline_48_8 (&st->v6_half_open_hash, &kv6); if (rv == 0) - { - u32 sst = session_type_from_proto_and_ip (proto, 1); - return tp_vfts[sst].get_half_open (kv6.value & 0xFFFFFFFF); - } + return tp_vfts[proto].get_half_open (kv6.value & 0xFFFFFFFF); /* Check the session rules table */ action_index = session_rules_table_lookup6 (&st->session_rules[proto], lcl, @@ -1111,14 +1110,14 @@ session_lookup_connection_wt6 (u32 fib_index, ip6_address_t * lcl, return 0; if ((s = session_lookup_action_to_session (action_index, FIB_PROTOCOL_IP6, proto))) - return tp_vfts[s->session_type].get_listener (s->connection_index); + return tp_vfts[proto].get_listener (s->connection_index); return 0; } /* If nothing is found, check if any listener is available */ s = session_lookup_listener6_i (st, lcl, lcl_port, proto); if (s) - return tp_vfts[s->session_type].get_listener (s->connection_index); + return tp_vfts[proto].get_listener (s->connection_index); return 0; } @@ -1159,17 +1158,14 @@ session_lookup_connection6 (u32 fib_index, ip6_address_t * lcl, if (rv == 0) { s = session_get_from_handle (kv6.value); - return tp_vfts[s->session_type].get_connection (s->connection_index, - s->thread_index); + return tp_vfts[proto].get_connection (s->connection_index, + s->thread_index); } /* Try half-open connections */ rv = clib_bihash_search_inline_48_8 (&st->v6_half_open_hash, &kv6); if (rv == 0) - { - u32 sst = session_type_from_proto_and_ip (proto, 1); - return tp_vfts[sst].get_half_open (kv6.value & 0xFFFFFFFF); - } + return tp_vfts[proto].get_half_open (kv6.value & 0xFFFFFFFF); /* Check the session rules table */ action_index = session_rules_table_lookup6 (&st->session_rules[proto], lcl, @@ -1180,14 +1176,14 @@ session_lookup_connection6 (u32 fib_index, ip6_address_t * lcl, return 0; if ((s = session_lookup_action_to_session (action_index, FIB_PROTOCOL_IP6, proto))) - return tp_vfts[s->session_type].get_listener (s->connection_index); + return tp_vfts[proto].get_listener (s->connection_index); return 0; } /* If nothing is found, check if any listener is available */ s = session_lookup_listener6 (fib_index, lcl, lcl_port, proto); if (s) - return tp_vfts[s->session_type].get_listener (s->connection_index); + return tp_vfts[proto].get_listener (s->connection_index); return 0; } @@ -1241,37 +1237,6 @@ session_lookup_safe6 (u32 fib_index, ip6_address_t * lcl, ip6_address_t * rmt, return 0; } -u64 -session_lookup_local_listener_make_handle (session_endpoint_t * sep) -{ - return ((u64) SESSION_LOCAL_TABLE_PREFIX << 32 - | (u32) sep->port << 16 | (u32) sep->transport_proto << 8 - | (u32) sep->is_ip4); -} - -u8 -session_lookup_local_is_handle (u64 handle) -{ - if (handle >> 32 == SESSION_LOCAL_TABLE_PREFIX) - return 1; - return 0; -} - -int -session_lookup_local_listener_parse_handle (u64 handle, - session_endpoint_t * sep) -{ - u32 local_table_handle; - if (handle >> 32 != SESSION_LOCAL_TABLE_PREFIX) - return -1; - local_table_handle = handle & 0xFFFFFFFFULL; - sep->is_ip4 = local_table_handle & 0xff; - local_table_handle >>= 8; - sep->transport_proto = local_table_handle & 0xff; - sep->port = local_table_handle >> 8; - return 0; -} - clib_error_t * vnet_session_rule_add_del (session_rule_add_del_args_t * args) { @@ -1344,22 +1309,22 @@ format_ip4_session_lookup_kvp (u8 * s, va_list * args) stream_session_t *session; v4_connection_key_t *key = (v4_connection_key_t *) kvp->key; - char *proto = key->proto == TRANSPORT_PROTO_TCP ? "T" : "U"; if (!is_local) { session = session_get_from_handle (kvp->value); app_name = application_name_from_index (session->app_index); - str = format (0, "[%s] %U:%d->%U:%d", proto, format_ip4_address, - &key->src, clib_net_to_host_u16 (key->src_port), - format_ip4_address, &key->dst, - clib_net_to_host_u16 (key->dst_port)); + str = format (0, "[%U] %U:%d->%U:%d", format_transport_proto_short, + key->proto, format_ip4_address, &key->src, + clib_net_to_host_u16 (key->src_port), format_ip4_address, + &key->dst, clib_net_to_host_u16 (key->dst_port)); s = format (s, "%-40v%-30v", str, app_name); } else { app_name = application_name_from_index (kvp->value); - str = format (0, "[%s] %U:%d", proto, format_ip4_address, - &key->src, clib_net_to_host_u16 (key->src_port)); + str = format (0, "[%U] %U:%d", format_transport_proto_short, key->proto, + format_ip4_address, &key->src, + clib_net_to_host_u16 (key->src_port)); s = format (s, "%-30v%-30v", str, app_name); } vec_free (app_name);