aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeale Ranns <neale@graphiant.com>2022-03-25 08:51:58 +0000
committerFlorin Coras <florin.coras@gmail.com>2022-03-30 18:31:21 +0000
commit80af13d7405c5d9b2510244aa1318bdef6c41fcf (patch)
tree27e2eb570977b8609be480eed2ca6bc7f9cff1aa
parent299571aca34d36e637e43cfbba6275662d0d7795 (diff)
ip: Reference count the enabling the punt feature
Type: fix otherwise punt features are applied multiple times to the same packet if enabled multiple times Signed-off-by: Neale Ranns <neale@graphiant.com> Change-Id: If0cbd9065275f68a10fd6d35e4f7a7c7508245e0
-rw-r--r--src/vnet/ip/ip4_punt_drop.c9
-rw-r--r--src/vnet/ip/ip6_punt_drop.c9
2 files changed, 14 insertions, 4 deletions
diff --git a/src/vnet/ip/ip4_punt_drop.c b/src/vnet/ip/ip4_punt_drop.c
index 89803afb9dd..f2985a244aa 100644
--- a/src/vnet/ip/ip4_punt_drop.c
+++ b/src/vnet/ip/ip4_punt_drop.c
@@ -312,6 +312,8 @@ VLIB_CLI_COMMAND (ip4_punt_policer_command, static) =
#ifndef CLIB_MARCH_VARIANT
+static u32 ip4_punt_redirect_enable_counts;
+
void
ip4_punt_redirect_add_paths (u32 rx_sw_if_index,
const fib_route_path_t *rpaths)
@@ -320,13 +322,16 @@ ip4_punt_redirect_add_paths (u32 rx_sw_if_index,
rx_sw_if_index,
FIB_FORW_CHAIN_TYPE_UNICAST_IP4, rpaths);
- vnet_feature_enable_disable ("ip4-punt", "ip4-punt-redirect", 0, 1, 0, 0);
+ if (1 == ++ip4_punt_redirect_enable_counts)
+ vnet_feature_enable_disable ("ip4-punt", "ip4-punt-redirect", 0, 1, 0, 0);
}
void
ip4_punt_redirect_del (u32 rx_sw_if_index)
{
- vnet_feature_enable_disable ("ip4-punt", "ip4-punt-redirect", 0, 0, 0, 0);
+ ASSERT (ip4_punt_redirect_enable_counts);
+ if (0 == --ip4_punt_redirect_enable_counts)
+ vnet_feature_enable_disable ("ip4-punt", "ip4-punt-redirect", 0, 0, 0, 0);
ip_punt_redirect_del (FIB_PROTOCOL_IP4, rx_sw_if_index);
}
diff --git a/src/vnet/ip/ip6_punt_drop.c b/src/vnet/ip/ip6_punt_drop.c
index ab5203d3d6d..32a2ab760ff 100644
--- a/src/vnet/ip/ip6_punt_drop.c
+++ b/src/vnet/ip/ip6_punt_drop.c
@@ -301,6 +301,8 @@ VNET_FEATURE_INIT (ip6_punt_redirect_node, static) = {
#ifndef CLIB_MARCH_VARIANT
+static u32 ip6_punt_redirect_enable_counts;
+
void
ip6_punt_redirect_add_paths (u32 rx_sw_if_index,
const fib_route_path_t *rpaths)
@@ -309,13 +311,16 @@ ip6_punt_redirect_add_paths (u32 rx_sw_if_index,
rx_sw_if_index,
FIB_FORW_CHAIN_TYPE_UNICAST_IP6, rpaths);
- vnet_feature_enable_disable ("ip6-punt", "ip6-punt-redirect", 0, 1, 0, 0);
+ if (1 == ++ip6_punt_redirect_enable_counts)
+ vnet_feature_enable_disable ("ip6-punt", "ip6-punt-redirect", 0, 1, 0, 0);
}
void
ip6_punt_redirect_del (u32 rx_sw_if_index)
{
- vnet_feature_enable_disable ("ip6-punt", "ip6-punt-redirect", 0, 0, 0, 0);
+ ASSERT (ip6_punt_redirect_enable_counts);
+ if (0 == --ip6_punt_redirect_enable_counts)
+ vnet_feature_enable_disable ("ip6-punt", "ip6-punt-redirect", 0, 0, 0, 0);
ip_punt_redirect_del (FIB_PROTOCOL_IP6, rx_sw_if_index);
}