lldp: set interface MAC address when enabled 18/29218/2
authorKlement Sekera <ksekera@cisco.com>
Fri, 2 Oct 2020 14:12:37 +0000 (14:12 +0000)
committerDamjan Marion <dmarion@me.com>
Fri, 2 Oct 2020 22:20:59 +0000 (22:20 +0000)
Type: improvement
Change-Id: I4f2dc4e4c1c467fb9acd0fed231c56fcd54c8da9
Signed-off-by: Klement Sekera <ksekera@cisco.com>
src/plugins/lldp/lldp.h
src/plugins/lldp/lldp_cli.c
src/plugins/lldp/lldp_output.c

index df03dce..e0550da 100644 (file)
@@ -24,11 +24,13 @@ typedef enum lldp_cfg_err
   lldp_ok,
   lldp_not_supported,
   lldp_invalid_arg,
+  lldp_internal_error,
 } lldp_cfg_err_t;
 
 lldp_cfg_err_t lldp_cfg_intf_set (u32 hw_if_index, u8 ** port_desc,
                 u8 **mgmt_ip4, u8 **mgmt_ip6, u8 **mgmt_oid, int enable);
 lldp_cfg_err_t lldp_cfg_set (u8 ** host, int hold_time, int tx_interval);
 
+extern const u8 lldp_mac_addr[6];
 
 #endif /* __included_lldp_h__ */
index 0d196f4..da45ba3 100644 (file)
@@ -39,6 +39,8 @@ lldp_cfg_err_to_clib_err (lldp_cfg_err_t e)
       return clib_error_return (0, "not supported");
     case lldp_invalid_arg:
       return clib_error_return (0, "invalid argument");
+    case lldp_internal_error:
+      return clib_error_return (0, "internal error");
     }
   return 0;
 }
@@ -99,6 +101,13 @@ lldp_cfg_intf_set (u32 hw_if_index, u8 ** port_desc, u8 ** mgmt_ip4,
          *mgmt_oid = NULL;
        }
 
+      if (!vnet_hw_interface_add_del_mac_address (lm->vnet_main, hw_if_index,
+                                                 lldp_mac_addr,
+                                                 1 /* is_add */ ))
+       {
+         return lldp_internal_error;
+       }
+
       const vnet_sw_interface_t *sw =
        vnet_get_sw_interface (lm->vnet_main, hi->sw_if_index);
       if (sw->flags & (VNET_SW_INTERFACE_FLAG_ADMIN_UP))
@@ -110,6 +119,12 @@ lldp_cfg_intf_set (u32 hw_if_index, u8 ** port_desc, u8 ** mgmt_ip4,
     {
       lldp_intf_t *n = lldp_get_intf (lm, hi->sw_if_index);
       lldp_delete_intf (lm, n);
+      if (n)
+       {
+         vnet_hw_interface_add_del_mac_address (lm->vnet_main, hw_if_index,
+                                                lldp_mac_addr,
+                                                0 /* is_add */ );
+       }
     }
 
   return lldp_ok;
index dc03faf..deff723 100644 (file)
@@ -263,6 +263,11 @@ lldp_delete_intf (lldp_main_t * lm, lldp_intf_t * n)
     }
 }
 
+
+/* 01:80:C2:00:00:0E - propagation constrained to a single
+ * physical link - stopped by all type of bridge */
+const u8 lldp_mac_addr[6] = { 0x01, 0x80, 0xC3, 0x00, 0x00, 0x0E };
+
 static clib_error_t *
 lldp_template_init (vlib_main_t * vm)
 {
@@ -274,16 +279,12 @@ lldp_template_init (vlib_main_t * vm)
 
     clib_memset (&h, 0, sizeof (h));
 
-    /*
-     * Send to 01:80:C2:00:00:0E - propagation constrained to a single
-     * physical link - stopped by all type of bridge
-     */
-    h.dst_address[0] = 0x01;
-    h.dst_address[1] = 0x80;
-    h.dst_address[2] = 0xC2;
-    /* h.dst_address[3] = 0x00; (clib_memset) */
-    /* h.dst_address[4] = 0x00; (clib_memset) */
-    h.dst_address[5] = 0x0E;
+    h.dst_address[0] = lldp_mac_addr[0];
+    h.dst_address[1] = lldp_mac_addr[1];
+    h.dst_address[2] = lldp_mac_addr[2];
+    h.dst_address[3] = lldp_mac_addr[3];
+    h.dst_address[4] = lldp_mac_addr[4];
+    h.dst_address[5] = lldp_mac_addr[5];
 
     /* leave src address blank (fill in at send time) */