From 09cdea643aa181d833df15b8c96c3a812320761a Mon Sep 17 00:00:00 2001 From: Neale Ranns Date: Tue, 22 Feb 2022 14:51:08 +0000 Subject: [PATCH] linux-cp: Only enable/disable the punt feature on the 0<->1 transition Type: fix otherwise the feature is enabled n times for n lcp-pairs and the packets go n times through the feature. Signed-off-by: Neale Ranns Change-Id: I8e47e4a293d6e2711f54aa09e9545e5e07728026 --- src/plugins/linux-cp/lcp_interface.c | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/src/plugins/linux-cp/lcp_interface.c b/src/plugins/linux-cp/lcp_interface.c index 3a6a6852f37..8f0b78e7a44 100644 --- a/src/plugins/linux-cp/lcp_interface.c +++ b/src/plugins/linux-cp/lcp_interface.c @@ -308,10 +308,13 @@ lcp_itf_pair_add (u32 host_sw_if_index, u32 phy_sw_if_index, u8 *host_name, } else { - vnet_feature_enable_disable ("ip4-punt", "linux-cp-punt-l3", 0, 1, NULL, - 0); - vnet_feature_enable_disable ("ip6-punt", "linux-cp-punt-l3", 0, 1, NULL, - 0); + if (hash_elts (lip_db_by_vif) == 1) + { + vnet_feature_enable_disable ("ip4-punt", "linux-cp-punt-l3", 0, 1, + NULL, 0); + vnet_feature_enable_disable ("ip6-punt", "linux-cp-punt-l3", 0, 1, + NULL, 0); + } } /* invoke registered callbacks for pair addition */ @@ -435,12 +438,14 @@ lcp_itf_pair_del (u32 phy_sw_if_index) } else { - vnet_feature_enable_disable ("ip4-punt", "linux-cp-punt-l3", 0, 0, NULL, - 0); - vnet_feature_enable_disable ("ip6-punt", "linux-cp-punt-l3", 0, 0, NULL, - 0); + if (hash_elts (lip_db_by_vif) == 1) + { + vnet_feature_enable_disable ("ip4-punt", "linux-cp-punt-l3", 0, 0, + NULL, 0); + vnet_feature_enable_disable ("ip6-punt", "linux-cp-punt-l3", 0, 0, + NULL, 0); + } } - lip_db_by_phy[phy_sw_if_index] = INDEX_INVALID; lip_db_by_host[lip->lip_host_sw_if_index] = INDEX_INVALID; hash_unset (lip_db_by_vif, lip->lip_vif_index); -- 2.16.6