ip: svr: fix feature refcounts 19/22419/2
authorKlement Sekera <ksekera@cisco.com>
Mon, 30 Sep 2019 14:35:36 +0000 (14:35 +0000)
committerOle Trøan <otroan@employees.org>
Mon, 30 Sep 2019 16:45:56 +0000 (16:45 +0000)
Reference counts need to be per-interface as opposed to global. This
allows configuring the feature on more than one interface correctly.

Type: fix
Fixes: de34c35fc73226943538149fae9dbc5cfbdc6e75

Change-Id: I05534ac59fa86e67290737ec6c61df2c19acab48
Signed-off-by: Klement Sekera <ksekera@cisco.com>
src/vnet/ip/reass/ip4_sv_reass.c
src/vnet/ip/reass/ip6_sv_reass.c

index 25119e8..91a5003 100644 (file)
@@ -148,8 +148,8 @@ typedef struct
   u32 fq_index;
   u32 fq_feature_index;
 
-  // reference count for enabling/disabling feature
-  u32 feature_use_refcount;
+  // reference count for enabling/disabling feature - per interface
+  u32 *feature_use_refcount_per_intf;
 
 } ip4_sv_reass_main_t;
 
@@ -822,6 +822,8 @@ ip4_sv_reass_init_function (vlib_main_t * vm)
   rm->fq_feature_index =
     vlib_frame_queue_main_init (ip4_sv_reass_node_feature.index, 0);
 
+  rm->feature_use_refcount_per_intf = NULL;
+
   return error;
 }
 
@@ -1160,21 +1162,22 @@ int
 ip4_sv_reass_enable_disable_with_refcnt (u32 sw_if_index, int is_enable)
 {
   ip4_sv_reass_main_t *rm = &ip4_sv_reass_main;
+  vec_validate (rm->feature_use_refcount_per_intf, sw_if_index);
   if (is_enable)
     {
-      if (!rm->feature_use_refcount)
+      if (!rm->feature_use_refcount_per_intf[sw_if_index])
        {
-         ++rm->feature_use_refcount;
+         ++rm->feature_use_refcount_per_intf[sw_if_index];
          return vnet_feature_enable_disable ("ip4-unicast",
                                              "ip4-sv-reassembly-feature",
                                              sw_if_index, 1, 0, 0);
        }
-      ++rm->feature_use_refcount;
+      ++rm->feature_use_refcount_per_intf[sw_if_index];
     }
   else
     {
-      --rm->feature_use_refcount;
-      if (!rm->feature_use_refcount)
+      --rm->feature_use_refcount_per_intf[sw_if_index];
+      if (!rm->feature_use_refcount_per_intf[sw_if_index])
        return vnet_feature_enable_disable ("ip4-unicast",
                                            "ip4-sv-reassembly-feature",
                                            sw_if_index, 0, 0, 0);
index e2f425a..9b5d5b2 100644 (file)
@@ -146,8 +146,8 @@ typedef struct
   u32 fq_index;
   u32 fq_feature_index;
 
-  // reference count for enabling/disabling feature
-  u32 feature_use_refcount;
+  // reference count for enabling/disabling feature - per interface
+  u32 *feature_use_refcount_per_intf;
 } ip6_sv_reass_main_t;
 
 extern ip6_sv_reass_main_t ip6_sv_reass_main;
@@ -945,6 +945,8 @@ ip6_sv_reass_init_function (vlib_main_t * vm)
   rm->fq_feature_index =
     vlib_frame_queue_main_init (ip6_sv_reass_node_feature.index, 0);
 
+  rm->feature_use_refcount_per_intf = NULL;
+
   return error;
 }
 
@@ -1300,21 +1302,22 @@ int
 ip6_sv_reass_enable_disable_with_refcnt (u32 sw_if_index, int is_enable)
 {
   ip6_sv_reass_main_t *rm = &ip6_sv_reass_main;
+  vec_validate (rm->feature_use_refcount_per_intf, sw_if_index);
   if (is_enable)
     {
-      if (!rm->feature_use_refcount)
+      if (!rm->feature_use_refcount_per_intf[sw_if_index])
        {
-         ++rm->feature_use_refcount;
+         ++rm->feature_use_refcount_per_intf[sw_if_index];
          return vnet_feature_enable_disable ("ip6-unicast",
                                              "ip6-sv-reassembly-feature",
                                              sw_if_index, 1, 0, 0);
        }
-      ++rm->feature_use_refcount;
+      ++rm->feature_use_refcount_per_intf[sw_if_index];
     }
   else
     {
-      --rm->feature_use_refcount;
-      if (!rm->feature_use_refcount)
+      --rm->feature_use_refcount_per_intf[sw_if_index];
+      if (!rm->feature_use_refcount_per_intf[sw_if_index])
        return vnet_feature_enable_disable ("ip6-unicast",
                                            "ip6-sv-reassembly-feature",
                                            sw_if_index, 0, 0, 0);