diff options
author | Alexander Chernavin <achernavin@netgate.com> | 2022-02-04 10:15:31 +0000 |
---|---|---|
committer | Matthew Smith <mgsmith@netgate.com> | 2022-03-03 13:44:19 +0000 |
commit | adac308aa8033de28ec9e627af2ed517f37aba6a (patch) | |
tree | 7eed0d3956802fb567c0410d449cfb1fea8dbbdb /src/plugins/linux-cp/lcp_interface.c | |
parent | 53f8a272a63444b61b700690a2f438fa5066f37b (diff) |
linux-cp: reflect hw link state on tap on pair creation
Type: fix
Currently, a tap interface created to be a member of a linux-cp pair has
default link state (down) and default link speed (10Mb/s). Then the
plugin monitors the link state of the paired hardware interface and if
it changes, the new link state is reflected on the tap interface. And
when the new link state is "up", the link speed is also reflected on the
tap interface.
The problem is that this scheme implies that the hardware interface's
link state is "down" at the moment of the linux-cp pair creation and
then changes. But there are cases when the link state is already "up" at
that moment. If that is the case, the link speed on the tap interface
will remain the default one until the link comes down and then comes up.
With this fix, when a linux-cp pair is created, reflect current link
state of the hardware interface being paired on the created tap
interface.
Signed-off-by: Alexander Chernavin <achernavin@netgate.com>
Change-Id: I73664d753f4daaa6d439c9ca898fb7363d21c06d
Diffstat (limited to 'src/plugins/linux-cp/lcp_interface.c')
-rw-r--r-- | src/plugins/linux-cp/lcp_interface.c | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/src/plugins/linux-cp/lcp_interface.c b/src/plugins/linux-cp/lcp_interface.c index 8f0b78e7a44..a822a5498d8 100644 --- a/src/plugins/linux-cp/lcp_interface.c +++ b/src/plugins/linux-cp/lcp_interface.c @@ -760,6 +760,9 @@ lcp_itf_pair_find_by_outer_vlan (u32 sup_if_index, u16 vlan, bool dot1ad) return lip_db_by_phy[match.matched_sw_if_index]; } +static clib_error_t *lcp_itf_pair_link_up_down (vnet_main_t *vnm, + u32 hw_if_index, u32 flags); + int lcp_itf_pair_create (u32 phy_sw_if_index, u8 *host_if_name, lip_host_type_t host_if_type, u8 *ns, @@ -1064,6 +1067,17 @@ lcp_itf_pair_create (u32 phy_sw_if_index, u8 *host_if_name, vnet_sw_interface_admin_up (vnm, host_sw_if_index); lcp_itf_set_link_state (lip, sw->flags & VNET_SW_INTERFACE_FLAG_ADMIN_UP); + /* + * Reflect current link state and link speed of the hardware interface on the + * TAP interface. + */ + if (host_if_type == LCP_ITF_HOST_TAP && + !vnet_sw_interface_is_sub (vnm, phy_sw_if_index)) + { + hw = vnet_get_sup_hw_interface (vnm, phy_sw_if_index); + lcp_itf_pair_link_up_down (vnm, hw->hw_if_index, hw->flags); + } + if (host_sw_if_indexp) *host_sw_if_indexp = host_sw_if_index; |