X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fplugins%2Facl%2Ffa_node.h;h=c4a971aada300b8c950ef0422c186ee61423b00c;hb=dcb5eb5a18bf42cb4d39ae29822664f2cb57622c;hp=e41dd0ad6fd200824a7281e75a962bd9e77c354a;hpb=22f9fb1286d2469819cfcef68ffdc258f4d52c24;p=vpp.git diff --git a/src/plugins/acl/fa_node.h b/src/plugins/acl/fa_node.h index e41dd0ad6fd..c4a971aada3 100644 --- a/src/plugins/acl/fa_node.h +++ b/src/plugins/acl/fa_node.h @@ -5,7 +5,7 @@ #include #include -#include +#include "exported_types.h" // #define FA_NODE_VERBOSE_DEBUG 3 @@ -38,6 +38,11 @@ typedef union { }; } fa_packet_info_t; +typedef enum { + FA_SK_L4_FLAG_IS_INPUT = (1 << 0), + FA_SK_L4_FLAG_IS_SLOWPATH = (1 << 1), +} fa_session_l4_key_l4_flags_t; + typedef union { u64 as_u64; struct { @@ -45,9 +50,7 @@ typedef union { union { struct { u8 proto; - u8 is_input: 1; - u8 is_slowpath: 1; - u8 reserved0: 6; + u8 l4_flags; u16 lsb_of_sw_if_index; }; u32 non_port_l4_data; @@ -55,6 +58,13 @@ typedef union { }; } fa_session_l4_key_t; + +static_always_inline +int is_session_l4_key_u64_slowpath(u64 l4key) { + fa_session_l4_key_t k = { .as_u64 = l4key }; + return (k.l4_flags & FA_SK_L4_FLAG_IS_SLOWPATH) ? 1 : 0; +} + typedef union { struct { union { @@ -79,6 +89,19 @@ typedef union { }; } fa_5tuple_t; +static_always_inline u8 * +format_fa_session_l4_key(u8 * s, va_list * args) +{ + fa_session_l4_key_t *l4 = va_arg (*args, fa_session_l4_key_t *); + int is_input = (l4->l4_flags & FA_SK_L4_FLAG_IS_INPUT) ? 1 : 0; + int is_slowpath = (l4->l4_flags & FA_SK_L4_FLAG_IS_SLOWPATH) ? 1 : 0; + + return (format (s, "l4 lsb_of_sw_if_index %d proto %d l4_is_input %d l4_slow_path %d l4_flags 0x%02x port %d -> %d", + l4->lsb_of_sw_if_index, + l4->proto, is_input, is_slowpath, + l4->l4_flags, l4->port[0], l4->port[1])); +} + typedef struct { fa_5tuple_t info; /* (5+1)*8 = 48 bytes */ u64 last_active_time; /* +8 bytes = 56 */ @@ -145,6 +168,12 @@ CT_ASSERT_EQUAL(fa_5tuple_opaque_t_must_match_5tuple, sizeof(fa_5tuple_opaque_t) typedef struct { /* The pool of sessions managed by this worker */ fa_session_t *fa_sessions_pool; + /* incoming session change requests from other workers */ + clib_spinlock_t pending_session_change_request_lock; + u64 *pending_session_change_requests; + u64 *wip_session_change_requests; + u64 rcvd_session_change_requests; + u64 sent_session_change_requests; /* per-worker ACL_N_TIMEOUTS of conn lists */ u32 *fa_conn_list_head; u32 *fa_conn_list_tail; @@ -194,6 +223,15 @@ typedef struct { * Set to copy of a "generation" counter in main thread so we can sync the interrupts. */ int interrupt_generation; + /* + * work in progress data for the pipelined node operation + */ + vlib_buffer_t *bufs[VLIB_FRAME_SIZE]; + u32 sw_if_indices[VLIB_FRAME_SIZE]; + fa_5tuple_t fa_5tuples[VLIB_FRAME_SIZE]; + u64 hashes[VLIB_FRAME_SIZE]; + u16 nexts[VLIB_FRAME_SIZE]; + } acl_fa_per_worker_data_t; @@ -203,7 +241,7 @@ typedef enum { } acl_fa_next_t; -enum +typedef enum { ACL_FA_CLEANER_RESCHEDULE = 1, ACL_FA_CLEANER_DELETE_BY_SW_IF_INDEX,