interface: fix extra locking on fib/mfib table 42/31242/12
authorDmitry Vakrhushev <dmitry@netgate.com>
Thu, 11 Feb 2021 21:42:40 +0000 (00:42 +0300)
committerMatthew Smith <mgsmith@netgate.com>
Fri, 12 Mar 2021 13:47:40 +0000 (13:47 +0000)
Unlocking previeous fib/mfib table before bind it to a new.

Currently if rebind interface table from one to another,
previous table's lock wouldn't decrease the locks count.

Type: fix

Change-Id: I09340baf1c7039aed3be15ee231eded7364b213e
Signed-off-by: Dmitry Vakrhushev <dmitry@netgate.com>
src/vnet/interface_api.c

index 5b2f2fc..2cf6d9e 100644 (file)
@@ -539,18 +539,15 @@ ip_table_bind (fib_protocol_t fproto,
                      fib_index,
                      ip6_main.fib_index_by_sw_if_index[sw_if_index]);
 
-      if (0 == table_id)
-       {
-         /* reset back to default */
-         if (0 != ip6_main.fib_index_by_sw_if_index[sw_if_index])
-           fib_table_unlock (ip6_main.fib_index_by_sw_if_index[sw_if_index],
-                             FIB_PROTOCOL_IP6, src);
-         if (0 != ip6_main.mfib_index_by_sw_if_index[sw_if_index])
-           mfib_table_unlock (ip6_main.mfib_index_by_sw_if_index
-                              [sw_if_index], FIB_PROTOCOL_IP6, msrc);
-
-       }
-      else
+      /* unlock currently assigned tables */
+      if (0 != ip6_main.fib_index_by_sw_if_index[sw_if_index])
+       fib_table_unlock (ip6_main.fib_index_by_sw_if_index[sw_if_index],
+                         FIB_PROTOCOL_IP6, src);
+      if (0 != ip6_main.mfib_index_by_sw_if_index[sw_if_index])
+       mfib_table_unlock (ip6_main.mfib_index_by_sw_if_index[sw_if_index],
+                          FIB_PROTOCOL_IP6, msrc);
+
+      if (0 != table_id)
        {
          /* we need to lock the table now it's inuse */
          fib_table_lock (fib_index, FIB_PROTOCOL_IP6, src);
@@ -590,18 +587,15 @@ ip_table_bind (fib_protocol_t fproto,
                      fib_index,
                      ip4_main.fib_index_by_sw_if_index[sw_if_index]);
 
-      if (0 == table_id)
-       {
-         /* reset back to default */
-         if (0 != ip4_main.fib_index_by_sw_if_index[sw_if_index])
-           fib_table_unlock (ip4_main.fib_index_by_sw_if_index[sw_if_index],
-                             FIB_PROTOCOL_IP4, src);
-         if (0 != ip4_main.mfib_index_by_sw_if_index[sw_if_index])
-           mfib_table_unlock (ip4_main.mfib_index_by_sw_if_index
-                              [sw_if_index], FIB_PROTOCOL_IP4, msrc);
+      /* unlock currently assigned tables */
+      if (0 != ip4_main.fib_index_by_sw_if_index[sw_if_index])
+       fib_table_unlock (ip4_main.fib_index_by_sw_if_index[sw_if_index],
+                         FIB_PROTOCOL_IP4, src);
+      if (0 != ip4_main.mfib_index_by_sw_if_index[sw_if_index])
+       mfib_table_unlock (ip4_main.mfib_index_by_sw_if_index[sw_if_index],
+                          FIB_PROTOCOL_IP4, msrc);
 
-       }
-      else
+      if (0 != table_id)
        {
          /* we need to lock the table now it's inuse */
          fib_index = fib_table_find_or_create_and_lock (FIB_PROTOCOL_IP4,