X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fsession%2Fsession_lookup.c;h=33fcb4250caa41efbfd32ddb36a91e9b3ff5b747;hb=288eaab5964b9211350acad8d742fae4789577fe;hp=c410dab121fa764684814f069a0f9ad48e5284ed;hpb=053a0e44edb21713e0825f9c09ba4af12e686b38;p=vpp.git diff --git a/src/vnet/session/session_lookup.c b/src/vnet/session/session_lookup.c index c410dab121f..33fcb4250ca 100644 --- a/src/vnet/session/session_lookup.c +++ b/src/vnet/session/session_lookup.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 Cisco and/or its affiliates. + * Copyright (c) 2017-2019 Cisco and/or its affiliates. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at: @@ -338,7 +338,7 @@ session_lookup_del_connection (transport_connection_t * tc) } int -session_lookup_del_session (stream_session_t * s) +session_lookup_del_session (session_t * s) { transport_proto_t tp = session_get_transport_proto (s); transport_connection_t *ts; @@ -371,7 +371,7 @@ session_lookup_action_to_handle (u32 action_index) } } -static stream_session_t * +static session_t * session_lookup_app_listen_session (u32 app_index, u8 fib_proto, u8 transport_proto) { @@ -384,7 +384,7 @@ session_lookup_app_listen_session (u32 app_index, u8 fib_proto, fib_proto, transport_proto); } -static stream_session_t * +static session_t * session_lookup_action_to_session (u32 action_index, u8 fib_proto, u8 transport_proto) { @@ -396,7 +396,7 @@ session_lookup_action_to_session (u32 action_index, u8 fib_proto, } /** UNUSED */ -stream_session_t * +session_t * session_lookup_rules_table_session4 (session_table_t * st, u8 proto, ip4_address_t * lcl, u16 lcl_port, ip4_address_t * rmt, u16 rmt_port) @@ -412,7 +412,7 @@ session_lookup_rules_table_session4 (session_table_t * st, u8 proto, } /** UNUSED */ -stream_session_t * +session_t * session_lookup_rules_table_session6 (session_table_t * st, u8 proto, ip6_address_t * lcl, u16 lcl_port, ip6_address_t * rmt, u16 rmt_port) @@ -614,7 +614,7 @@ session_lookup_local_endpoint (u32 table_index, session_endpoint_t * sep) return SESSION_INVALID_HANDLE; } -static inline stream_session_t * +static inline session_t * session_lookup_listener4_i (session_table_t * st, ip4_address_t * lcl, u16 lcl_port, u8 proto, u8 use_wildcard) { @@ -655,7 +655,7 @@ session_lookup_listener4_i (session_table_t * st, ip4_address_t * lcl, return 0; } -stream_session_t * +session_t * session_lookup_listener4 (u32 fib_index, ip4_address_t * lcl, u16 lcl_port, u8 proto) { @@ -666,7 +666,7 @@ session_lookup_listener4 (u32 fib_index, ip4_address_t * lcl, u16 lcl_port, return session_lookup_listener4_i (st, lcl, lcl_port, proto, 0); } -static stream_session_t * +static session_t * session_lookup_listener6_i (session_table_t * st, ip6_address_t * lcl, u16 lcl_port, u8 proto, u8 ip_wildcard) { @@ -698,7 +698,7 @@ session_lookup_listener6_i (session_table_t * st, ip6_address_t * lcl, return 0; } -stream_session_t * +session_t * session_lookup_listener6 (u32 fib_index, ip6_address_t * lcl, u16 lcl_port, u8 proto) { @@ -712,7 +712,7 @@ session_lookup_listener6 (u32 fib_index, ip6_address_t * lcl, u16 lcl_port, /** * Lookup listener, exact or proxy (inaddr_any:0) match */ -stream_session_t * +session_t * session_lookup_listener (u32 table_index, session_endpoint_t * sep) { session_table_t *st; @@ -852,11 +852,11 @@ transport_connection_t * session_lookup_connection_wt4 (u32 fib_index, ip4_address_t * lcl, ip4_address_t * rmt, u16 lcl_port, u16 rmt_port, u8 proto, u32 thread_index, - u8 * is_filtered) + u8 * result) { session_table_t *st; session_kv4_t kv4; - stream_session_t *s; + session_t *s; u32 action_index; int rv; @@ -871,7 +871,11 @@ session_lookup_connection_wt4 (u32 fib_index, ip4_address_t * lcl, rv = clib_bihash_search_inline_16_8 (&st->v4_session_hash, &kv4); if (rv == 0) { - ASSERT ((u32) (kv4.value >> 32) == thread_index); + if (PREDICT_FALSE ((u32) (kv4.value >> 32) != thread_index)) + { + *result = SESSION_LOOKUP_RESULT_WRONG_THREAD; + return 0; + } s = session_get (kv4.value & 0xFFFFFFFFULL, thread_index); return tp_vfts[proto].get_connection (s->connection_index, thread_index); @@ -891,8 +895,11 @@ session_lookup_connection_wt4 (u32 fib_index, ip4_address_t * lcl, rmt, lcl_port, rmt_port); if (session_lookup_action_index_is_valid (action_index)) { - if ((*is_filtered = (action_index == SESSION_RULES_TABLE_ACTION_DROP))) - return 0; + if (action_index == SESSION_RULES_TABLE_ACTION_DROP) + { + *result = SESSION_LOOKUP_RESULT_FILTERED; + return 0; + } if ((s = session_lookup_action_to_session (action_index, FIB_PROTOCOL_IP4, proto))) return tp_vfts[proto].get_listener (s->connection_index); @@ -912,9 +919,8 @@ session_lookup_connection_wt4 (u32 fib_index, ip4_address_t * lcl, /** * Lookup connection with ip4 and transport layer information * - * Not optimized. This is used on the fast path so it needs to be fast. - * Thereby, duplication of code and 'hacks' allowed. Lookup logic is identical - * to that of @ref session_lookup_connection_wt4 + * Not optimized. Lookup logic is identical to that of + * @ref session_lookup_connection_wt4 * * @param fib_index index of the fib wherein the connection was received * @param lcl local ip4 address @@ -932,7 +938,7 @@ session_lookup_connection4 (u32 fib_index, ip4_address_t * lcl, { session_table_t *st; session_kv4_t kv4; - stream_session_t *s; + session_t *s; u32 action_index; int rv; @@ -997,13 +1003,13 @@ session_lookup_connection4 (u32 fib_index, ip4_address_t * lcl, * * Typically used by dgram connections */ -stream_session_t * +session_t * session_lookup_safe4 (u32 fib_index, ip4_address_t * lcl, ip4_address_t * rmt, u16 lcl_port, u16 rmt_port, u8 proto) { session_table_t *st; session_kv4_t kv4; - stream_session_t *s; + session_t *s; u32 action_index; int rv; @@ -1070,10 +1076,10 @@ transport_connection_t * session_lookup_connection_wt6 (u32 fib_index, ip6_address_t * lcl, ip6_address_t * rmt, u16 lcl_port, u16 rmt_port, u8 proto, u32 thread_index, - u8 * is_filtered) + u8 * result) { session_table_t *st; - stream_session_t *s; + session_t *s; session_kv6_t kv6; u32 action_index; int rv; @@ -1087,6 +1093,11 @@ session_lookup_connection_wt6 (u32 fib_index, ip6_address_t * lcl, if (rv == 0) { ASSERT ((u32) (kv6.value >> 32) == thread_index); + if (PREDICT_FALSE ((u32) (kv6.value >> 32) != thread_index)) + { + *result = SESSION_LOOKUP_RESULT_WRONG_THREAD; + return 0; + } s = session_get (kv6.value & 0xFFFFFFFFULL, thread_index); return tp_vfts[proto].get_connection (s->connection_index, thread_index); @@ -1102,8 +1113,11 @@ session_lookup_connection_wt6 (u32 fib_index, ip6_address_t * lcl, rmt, lcl_port, rmt_port); if (session_lookup_action_index_is_valid (action_index)) { - if ((*is_filtered = (action_index == SESSION_RULES_TABLE_ACTION_DROP))) - return 0; + if (action_index == SESSION_RULES_TABLE_ACTION_DROP) + { + *result = SESSION_LOOKUP_RESULT_FILTERED; + return 0; + } if ((s = session_lookup_action_to_session (action_index, FIB_PROTOCOL_IP6, proto))) return tp_vfts[proto].get_listener (s->connection_index); @@ -1140,7 +1154,7 @@ session_lookup_connection6 (u32 fib_index, ip6_address_t * lcl, u8 proto) { session_table_t *st; - stream_session_t *s; + session_t *s; session_kv6_t kv6; u32 action_index; int rv; @@ -1197,13 +1211,13 @@ session_lookup_connection6 (u32 fib_index, ip6_address_t * lcl, * * Typically used by dgram connections */ -stream_session_t * +session_t * session_lookup_safe6 (u32 fib_index, ip6_address_t * lcl, ip6_address_t * rmt, u16 lcl_port, u16 rmt_port, u8 proto) { session_table_t *st; session_kv6_t kv6; - stream_session_t *s; + session_t *s; u32 action_index; int rv; @@ -1302,7 +1316,7 @@ 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; v4_connection_key_t *key = (v4_connection_key_t *) kvp->key; - stream_session_t *session; + session_t *session; app_worker_t *app_wrk; const u8 *app_name; u8 *str = 0;