acl: rework headers to enable out-of-tree usage
[vpp.git] / src / plugins / acl / fa_node.h
index e41dd0a..c4a971a 100644 (file)
@@ -5,7 +5,7 @@
 #include <vppinfra/bihash_16_8.h>
 #include <vppinfra/bihash_40_8.h>
 
-#include <plugins/acl/exported_types.h>
+#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,