Improve l2_macs_events API to provide MAC move information
[vpp.git] / src / vnet / l2 / l2_fib.h
index 49a8b5b..ad7035b 100644 (file)
@@ -25,7 +25,7 @@
  * The size of the hash table
  */
 #define L2FIB_NUM_BUCKETS (64 * 1024)
-#define L2FIB_MEMORY_SIZE (256<<20)
+#define L2FIB_MEMORY_SIZE (512<<20)
 
 /* Ager scan interval is 1 minute for aging */
 #define L2FIB_AGE_SCAN_INTERVAL                (60.0)
@@ -118,7 +118,8 @@ typedef struct
       u8 bvi:1;                        /* mac is for a bridged virtual interface */
       u8 filter:1;             /* drop packets to/from this mac */
       u8 lrn_evt:1;            /* MAC learned to be sent in L2 MAC event */
-      u8 unused:3;
+      u8 lrn_mov:1;            /* MAC learned is a MAC move */
+      u8 unused:2;
 
       u8 timestamp;            /* timestamp for aging */
       l2fib_seq_num_t sn;      /* bd/int seq num */
@@ -129,6 +130,14 @@ typedef struct
 
 STATIC_ASSERT_SIZEOF (l2fib_entry_result_t, 8);
 
+/* L2 MAC event entry action enums (see mac_entry definition in l2.api) */
+typedef enum
+{
+  MAC_EVENT_ACTION_ADD = 0,
+  MAC_EVENT_ACTION_DELETE = 1,
+  MAC_EVENT_ACTION_MOVE = 2,
+} l2_mac_event_action_t;
+
 /**
  * Compute the hash for the given key and return
  * the corresponding bucket index
@@ -148,7 +157,12 @@ l2fib_compute_hash_bucket (l2fib_entry_key_t * key)
   return result % L2FIB_NUM_BUCKETS;
 }
 
-always_inline u64
+/**
+ * make address sanitizer skip this:
+ * The 6-Bytes mac-address is cast into an 8-Bytes u64, with 2 additional Bytes.
+ * l2fib_make_key() does read those two Bytes but does not use them.
+ */
+always_inline u64 __attribute__ ((no_sanitize_address))
 l2fib_make_key (u8 * mac_address, u16 bd_index)
 {
   u64 temp;
@@ -371,24 +385,24 @@ l2fib_lookup_4 (BVT (clib_bihash) * mac_table,
 void l2fib_clear_table (void);
 
 void
-l2fib_add_entry (u64 mac,
+l2fib_add_entry (u8 * mac,
                 u32 bd_index,
                 u32 sw_if_index, u8 static_mac, u8 drop_mac, u8 bvi_mac);
 
 static inline void
-l2fib_add_fwd_entry (u64 mac, u32 bd_index, u32 sw_if_index, u8 static_mac,
+l2fib_add_fwd_entry (u8 * mac, u32 bd_index, u32 sw_if_index, u8 static_mac,
                     u8 bvi_mac)
 {
   l2fib_add_entry (mac, bd_index, sw_if_index, static_mac, 0, bvi_mac);
 }
 
 static inline void
-l2fib_add_filter_entry (u64 mac, u32 bd_index)
+l2fib_add_filter_entry (u8 * mac, u32 bd_index)
 {
   l2fib_add_entry (mac, bd_index, ~0, 1, 1, 0);
 }
 
-u32 l2fib_del_entry (u64 mac, u32 bd_index);
+u32 l2fib_del_entry (u8 * mac, u32 bd_index);
 
 void l2fib_start_ager_scan (vlib_main_t * vm);