diff options
author | Nathan Skrzypczak <nathan.skrzypczak@gmail.com> | 2021-09-17 17:29:14 +0200 |
---|---|---|
committer | Neale Ranns <neale@graphiant.com> | 2021-10-11 12:04:03 +0000 |
commit | 275bd796346c3b1618170f4eda36b9a41ade9c87 (patch) | |
tree | 197df1102b0a3981c6a875100f521806a170f45c /src/plugins | |
parent | bd23b405fbe99034d75a46b060567e5adf62c04e (diff) |
ip: fix fib and mfib locks
This patches fixes an issue that could cause
fib locks to underflow: if an API user deletes
a fib and quickly recreates it, the fib may not
have been actually deleted. As a result, the
lock would not be incremented on the create call
leading to the fib potentially disappearing
afterwards - or to the lock to underflow when
the fib is deleted again.
In order to keep the existing API semantics,
we use the locks with API and CLI source as flags.
This means we need to use a different counter
for the interface-related locks.
This also prevents an issue where an interface being
bound to a vrf via API and released via CLI could
mess up the lock counter.
Finally, this will help with cleaning up the
interface-related locks on interface deletion
in a later patch.
Type: fix
Change-Id: I93030a7660646d6dd179ddf27fe4e708aa11b90e
Signed-off-by: Nathan Skrzypczak <nathan.skrzypczak@gmail.com>
Signed-off-by: Aloys Augustin <aloaugus@cisco.com>
Diffstat (limited to 'src/plugins')
-rw-r--r-- | src/plugins/gbp/gbp_itf.c | 5 | ||||
-rw-r--r-- | src/plugins/unittest/fib_test.c | 4 | ||||
-rw-r--r-- | src/plugins/unittest/mfib_test.c | 8 | ||||
-rw-r--r-- | src/plugins/unittest/session_test.c | 2 |
4 files changed, 7 insertions, 12 deletions
diff --git a/src/plugins/gbp/gbp_itf.c b/src/plugins/gbp/gbp_itf.c index 0c8f6a45a87..738a7ac2e39 100644 --- a/src/plugins/gbp/gbp_itf.c +++ b/src/plugins/gbp/gbp_itf.c @@ -232,8 +232,7 @@ gbp_itf_l3_add_and_lock_i (u32 sw_if_index, index_t gri, gbp_itf_free_fn_t ff) ip6_sw_interface_enable_disable (gi->gi_sw_if_index, 1); FOR_EACH_FIB_IP_PROTOCOL (fproto) - ip_table_bind (fproto, gi->gi_sw_if_index, - grd->grd_table_id[fproto], 1); + ip_table_bind (fproto, gi->gi_sw_if_index, grd->grd_table_id[fproto]); hash_set (gbp_itf_db, gi->gi_sw_if_index, gi - gbp_itf_pool); } @@ -312,7 +311,7 @@ gbp_itf_unlock (gbp_itf_hdl_t * gh) gbp_itf_l3_set_input_feature (*gh, GBP_ITF_L3_FEAT_NONE); FOR_EACH_FIB_IP_PROTOCOL (fproto) - ip_table_bind (fproto, gi->gi_sw_if_index, 0, 0); + ip_table_bind (fproto, gi->gi_sw_if_index, 0); ip4_sw_interface_enable_disable (gi->gi_sw_if_index, 0); ip6_sw_interface_enable_disable (gi->gi_sw_if_index, 0); diff --git a/src/plugins/unittest/fib_test.c b/src/plugins/unittest/fib_test.c index f5ee4ae69e5..26e2d247666 100644 --- a/src/plugins/unittest/fib_test.c +++ b/src/plugins/unittest/fib_test.c @@ -8564,7 +8564,7 @@ lfib_test (void) mpls_table_create(MPLS_FIB_DEFAULT_TABLE_ID, FIB_SOURCE_API, NULL); mpls_sw_interface_enable_disable(&mpls_main, tm->hw[0]->sw_if_index, - 1, 1); + 1); ip46_address_t nh_10_10_10_1 = { .ip4.as_u32 = clib_host_to_net_u32(0x0a0a0a01), @@ -9135,7 +9135,7 @@ lfib_test (void) */ mpls_sw_interface_enable_disable(&mpls_main, tm->hw[0]->sw_if_index, - 0, 1); + 0); mpls_table_delete(MPLS_FIB_DEFAULT_TABLE_ID, FIB_SOURCE_API); FIB_TEST(0 == pool_elts(mpls_disp_dpo_pool), diff --git a/src/plugins/unittest/mfib_test.c b/src/plugins/unittest/mfib_test.c index 73abd07e80c..0faa20c0934 100644 --- a/src/plugins/unittest/mfib_test.c +++ b/src/plugins/unittest/mfib_test.c @@ -1193,9 +1193,7 @@ mfib_test_i (fib_protocol_t PROTO, * MPLS enable an interface so we get the MPLS table created */ mpls_table_create(MPLS_FIB_DEFAULT_TABLE_ID, FIB_SOURCE_API, NULL); - mpls_sw_interface_enable_disable(&mpls_main, - tm->hw[0]->sw_if_index, - 1, 0); + mpls_sw_interface_enable_disable (&mpls_main, tm->hw[0]->sw_if_index, 1); lfei = fib_table_entry_update_one_path(0, // default MPLS Table &pfx_3500, @@ -1291,9 +1289,7 @@ mfib_test_i (fib_protocol_t PROTO, /* * MPLS disable the interface */ - mpls_sw_interface_enable_disable(&mpls_main, - tm->hw[0]->sw_if_index, - 0, 0); + mpls_sw_interface_enable_disable (&mpls_main, tm->hw[0]->sw_if_index, 0); mpls_table_delete(MPLS_FIB_DEFAULT_TABLE_ID, FIB_SOURCE_API); /* diff --git a/src/plugins/unittest/session_test.c b/src/plugins/unittest/session_test.c index 292f7253a67..651658e3676 100644 --- a/src/plugins/unittest/session_test.c +++ b/src/plugins/unittest/session_test.c @@ -136,7 +136,7 @@ session_create_lookpback (u32 table_id, u32 * sw_if_index, if (table_id != 0) { ip_table_create (FIB_PROTOCOL_IP4, table_id, 0, 0); - ip_table_bind (FIB_PROTOCOL_IP4, *sw_if_index, table_id, 0); + ip_table_bind (FIB_PROTOCOL_IP4, *sw_if_index, table_id); } vnet_sw_interface_set_flags (vnet_get_main (), *sw_if_index, |