/*
- * 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:
#include <vnet/session/session.h>
#include <vnet/session/application.h>
-/**
- * External vector of per transport virtual functions table
- */
-extern transport_proto_vft_t *tp_vfts;
-
/**
* Network namespace index (i.e., fib index) to session lookup table. We
* should have one per network protocol type but for now we only support IP4/6
}
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;
- ts = tp_vfts[tp].get_connection (s->connection_index, s->thread_index);
+ ts = transport_get_connection (session_get_transport_proto (s),
+ s->connection_index, s->thread_index);
return session_lookup_del_connection (ts);
}
}
}
-static stream_session_t *
+static session_t *
session_lookup_app_listen_session (u32 app_index, u8 fib_proto,
u8 transport_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)
{
}
/** 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)
}
/** 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)
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)
{
return 0;
}
-stream_session_t *
+session_t *
session_lookup_listener4 (u32 fib_index, ip4_address_t * lcl, u16 lcl_port,
u8 proto)
{
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)
{
return 0;
}
-stream_session_t *
+session_t *
session_lookup_listener6 (u32 fib_index, ip6_address_t * lcl, u16 lcl_port,
u8 proto)
{
/**
* 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;
transport_connection_t *
session_lookup_half_open_connection (u64 handle, u8 proto, u8 is_ip4)
{
- u32 sst;
-
if (handle != HALF_OPEN_LOOKUP_INVALID_VALUE)
{
- sst = session_type_from_proto_and_ip (proto, is_ip4);
- return tp_vfts[sst].get_half_open (handle & 0xFFFFFFFF);
+ u32 sst = session_type_from_proto_and_ip (proto, is_ip4);
+ return transport_get_half_open (sst, handle & 0xFFFFFFFF);
}
return 0;
}
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;
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);
+ return transport_get_connection (proto, s->connection_index,
+ thread_index);
}
/*
*/
rv = clib_bihash_search_inline_16_8 (&st->v4_half_open_hash, &kv4);
if (rv == 0)
- return tp_vfts[proto].get_half_open (kv4.value & 0xFFFFFFFF);
+ return transport_get_half_open (proto, kv4.value & 0xFFFFFFFF);
/*
* Check the session rules table
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);
+ return transport_get_listener (proto, s->connection_index);
return 0;
}
*/
s = session_lookup_listener4_i (st, lcl, lcl_port, proto, 1);
if (s)
- return tp_vfts[proto].get_listener (s->connection_index);
+ return transport_get_listener (proto, s->connection_index);
return 0;
}
/**
* 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
{
session_table_t *st;
session_kv4_t kv4;
- stream_session_t *s;
+ session_t *s;
u32 action_index;
int rv;
if (rv == 0)
{
s = session_get_from_handle (kv4.value);
- return tp_vfts[proto].get_connection (s->connection_index,
- s->thread_index);
+ return transport_get_connection (proto, s->connection_index,
+ s->thread_index);
}
/*
*/
rv = clib_bihash_search_inline_16_8 (&st->v4_half_open_hash, &kv4);
if (rv == 0)
- return tp_vfts[proto].get_half_open (kv4.value & 0xFFFFFFFF);
+ return transport_get_half_open (proto, kv4.value & 0xFFFFFFFF);
/*
* Check the session rules table
return 0;
if ((s = session_lookup_action_to_session (action_index,
FIB_PROTOCOL_IP4, proto)))
- return tp_vfts[proto].get_listener (s->connection_index);
+ return transport_get_listener (proto, s->connection_index);
return 0;
}
*/
s = session_lookup_listener4_i (st, lcl, lcl_port, proto, 1);
if (s)
- return tp_vfts[proto].get_listener (s->connection_index);
+ return transport_get_listener (proto, s->connection_index);
return 0;
}
*
* 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;
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;
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);
+ return transport_get_connection (proto, 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)
- return tp_vfts[proto].get_half_open (kv6.value & 0xFFFFFFFF);
+ return transport_get_half_open (proto, kv6.value & 0xFFFFFFFF);
/* Check the session rules table */
action_index = session_rules_table_lookup6 (&st->session_rules[proto], 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);
+ return transport_get_listener (proto, 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, 1);
if (s)
- return tp_vfts[proto].get_listener (s->connection_index);
+ return transport_get_listener (proto, s->connection_index);
return 0;
}
u8 proto)
{
session_table_t *st;
- stream_session_t *s;
+ session_t *s;
session_kv6_t kv6;
u32 action_index;
int rv;
if (rv == 0)
{
s = session_get_from_handle (kv6.value);
- return tp_vfts[proto].get_connection (s->connection_index,
- s->thread_index);
+ return transport_get_connection (proto, 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)
- return tp_vfts[proto].get_half_open (kv6.value & 0xFFFFFFFF);
+ return transport_get_half_open (proto, kv6.value & 0xFFFFFFFF);
/* Check the session rules table */
action_index = session_rules_table_lookup6 (&st->session_rules[proto], lcl,
return 0;
if ((s = session_lookup_action_to_session (action_index,
FIB_PROTOCOL_IP6, proto)))
- return tp_vfts[proto].get_listener (s->connection_index);
+ return transport_get_listener (proto, 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, 1);
if (s)
- return tp_vfts[proto].get_listener (s->connection_index);
+ return transport_get_listener (proto, s->connection_index);
return 0;
}
*
* 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;
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;
- u8 *app_name, *str = 0;
- stream_session_t *session;
+ session_t *session;
app_worker_t *app_wrk;
+ const u8 *app_name;
+ u8 *str = 0;
if (!is_local)
{
clib_net_to_host_u16 (key->src_port));
s = format (s, "%-30v%-30v", str, app_name);
}
- vec_free (app_name);
return s;
}