diff options
author | Klement Sekera <ksekera@cisco.com> | 2020-10-02 14:12:37 +0000 |
---|---|---|
committer | Damjan Marion <dmarion@me.com> | 2020-10-02 22:20:59 +0000 |
commit | 149fd3fbd069a5f7be86e68472578ee7af229cb6 (patch) | |
tree | 9c815f7e1edf9f7cbb2c86e93459e4989ba21f00 | |
parent | 1c556d19d0b7a0f9d130ddfb07041cb2cafb8a8d (diff) |
lldp: set interface MAC address when enabled
Type: improvement
Change-Id: I4f2dc4e4c1c467fb9acd0fed231c56fcd54c8da9
Signed-off-by: Klement Sekera <ksekera@cisco.com>
-rw-r--r-- | src/plugins/lldp/lldp.h | 2 | ||||
-rw-r--r-- | src/plugins/lldp/lldp_cli.c | 15 | ||||
-rw-r--r-- | src/plugins/lldp/lldp_output.c | 21 |
3 files changed, 28 insertions, 10 deletions
diff --git a/src/plugins/lldp/lldp.h b/src/plugins/lldp/lldp.h index df03dcea6ce..e0550dad96d 100644 --- a/src/plugins/lldp/lldp.h +++ b/src/plugins/lldp/lldp.h @@ -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__ */ diff --git a/src/plugins/lldp/lldp_cli.c b/src/plugins/lldp/lldp_cli.c index 0d196f4e394..da45ba3043b 100644 --- a/src/plugins/lldp/lldp_cli.c +++ b/src/plugins/lldp/lldp_cli.c @@ -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; diff --git a/src/plugins/lldp/lldp_output.c b/src/plugins/lldp/lldp_output.c index dc03faf4d5c..deff723b4b3 100644 --- a/src/plugins/lldp/lldp_output.c +++ b/src/plugins/lldp/lldp_output.c @@ -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) */ |