Improve l2_macs_events API to provide MAC move information 31/11131/3
authorJohn Lo <loj@cisco.com>
Wed, 14 Mar 2018 01:53:18 +0000 (21:53 -0400)
committerDave Barach <openvpp@barachs.net>
Wed, 14 Mar 2018 12:07:48 +0000 (12:07 +0000)
Change mac_entry layout in l2_macs_event API message so the MAC
entry can be either add, delete or move where the sw_if_index of
an existing MAC entry changed. Also added a 8-bit flags field
in mac_entry for any future expansion.

Change-Id: I3bf9e1cf2556f2938202025a5d0772c2ce2fc99f
Signed-off-by: John Lo <loj@cisco.com>
src/vat/api_format.c
src/vnet/l2/l2.api
src/vnet/l2/l2_fib.c
src/vnet/l2/l2_fib.h
src/vnet/l2/l2_learn.c
test/test_l2_fib.py

index 7bb463c..97e67f9 100644 (file)
@@ -1348,9 +1348,9 @@ vl_api_l2_macs_event_t_handler (vl_api_l2_macs_event_t * mp)
   for (i = 0; i < n_macs; i++)
     {
       vl_api_mac_entry_t *mac = &mp->mac[i];
-      errmsg (" [%d] sw_if_index %d  mac_addr %U  is_del %d \n",
+      errmsg (" [%d] sw_if_index %d  mac_addr %U  action %d \n",
              i + 1, ntohl (mac->sw_if_index),
-             format_ethernet_address, mac->mac_addr, mac->is_del);
+             format_ethernet_address, mac->mac_addr, mac->action);
       if (i == 1000)
        break;
     }
index 3fb6de0..0ff4a2d 100644 (file)
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-option version = "2.0.0";
+option version = "2.0.1";
 
 /** \brief Reply to l2_xconnect_dump 
     @param context - sender context which was passed in the request
@@ -158,14 +158,16 @@ autoreply define want_l2_macs_events
 /** \brief Entry for learned or aged MAC in L2 MAC Events
     @param sw_if_index - sw_if_index in the domain
     @param mac_addr - mac_address
-    @is_del - 0 => newly learned MAC, 1 => aged out MAC
+    @param action - 0 => newly learned MAC, 1 => MAC deleted by ager
+                    3 => MAC move (sw_if_index changed)
+    @param flags - flag bits to provide other info, not yet used
 */
 typeonly define mac_entry
 {
   u32 sw_if_index;
   u8  mac_addr[6];
-  u8  is_del;
-  u8  spare;
+  u8  action;
+  u8  flags;
 };
 
 /** \brief L2 MAC event for a list of learned or aged MACs
index 55cffc8..99d99c5 100644 (file)
@@ -1037,11 +1037,13 @@ l2fib_scan (vlib_main_t * vm, f64 start_time, u8 event_only)
                      /* copy mac entry to event msg */
                      clib_memcpy (mp->mac[evt_idx].mac_addr, key.fields.mac,
                                   6);
-                     mp->mac[evt_idx].is_del = 0;
+                     mp->mac[evt_idx].action = result.fields.lrn_mov ?
+                       MAC_EVENT_ACTION_MOVE : MAC_EVENT_ACTION_ADD;
                      mp->mac[evt_idx].sw_if_index =
                        htonl (result.fields.sw_if_index);
-                     /* clear event bit and update mac entry */
+                     /* clear event bits and update mac entry */
                      result.fields.lrn_evt = 0;
+                     result.fields.lrn_mov = 0;
                      BVT (clib_bihash_kv) kv;
                      kv.key = key.raw;
                      kv.value = result.raw;
@@ -1078,7 +1080,7 @@ l2fib_scan (vlib_main_t * vm, f64 start_time, u8 event_only)
                {
                  /* copy mac entry to event msg */
                  clib_memcpy (mp->mac[evt_idx].mac_addr, key.fields.mac, 6);
-                 mp->mac[evt_idx].is_del = 1;
+                 mp->mac[evt_idx].action = MAC_EVENT_ACTION_DELETE;
                  mp->mac[evt_idx].sw_if_index =
                    htonl (result.fields.sw_if_index);
                  evt_idx++;
index 60c197f..ad7035b 100644 (file)
@@ -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
index 6ece1a3..04e0721 100644 (file)
@@ -207,6 +207,7 @@ l2learn_process (vlib_node_runtime_t * node,
          result0->fields.age_not = 0;
        }
       result0->fields.lrn_evt = (msm->client_pid != 0);
+      result0->fields.lrn_mov = (msm->client_pid != 0);
       counter_base[L2LEARN_ERROR_MAC_MOVE] += 1;
     }
 
index ba2f787..abab0f1 100644 (file)
@@ -70,6 +70,11 @@ from scapy.layers.inet import IP, UDP
 from framework import VppTestCase, VppTestRunner
 from util import Host, ppp
 
+# from src/vnet/l2/l2_fib.h
+MAC_EVENT_ACTION_ADD = 0
+MAC_EVENT_ACTION_DELETE = 1
+MAC_EVENT_ACTION_MOVE = 2
+
 
 class TestL2fib(VppTestCase):
     """ L2 FIB Test Case """
@@ -483,7 +488,7 @@ class TestL2fib(VppTestCase):
         evs = self.vapi.collect_events()
         learned_macs = {
             e.mac[i].mac_addr for e in evs for i in range(e.n_macs)
-            if not e.mac[i].is_del}
+            if e.mac[i].action == MAC_EVENT_ACTION_ADD}
         macs = {h.bin_mac for swif in self.bd_ifs(bd1)
                 for h in hosts[self.pg_interfaces[swif].sw_if_index]}
         self.vapi.want_macs_learn_events(enable_disable=0)
@@ -507,7 +512,7 @@ class TestL2fib(VppTestCase):
         self.assertGreater(len(evs), 0)
         learned_macs = {
             e.mac[i].mac_addr for e in evs for i in range(e.n_macs)
-            if not e.mac[i].is_del}
+            if e.mac[i].action == MAC_EVENT_ACTION_ADD}
         macs = {h.bin_mac for swif in self.bd_ifs(bd1)
                 for h in hosts[self.pg_interfaces[swif].sw_if_index]}