diff options
Diffstat (limited to 'src/vnet/mpls/interface.c')
-rw-r--r-- | src/vnet/mpls/interface.c | 43 |
1 files changed, 32 insertions, 11 deletions
diff --git a/src/vnet/mpls/interface.c b/src/vnet/mpls/interface.c index fd075c92d3d..fd654dca891 100644 --- a/src/vnet/mpls/interface.c +++ b/src/vnet/mpls/interface.c @@ -22,6 +22,14 @@ #include <vnet/adj/adj_midchain.h> #include <vnet/dpo/classify_dpo.h> +typedef struct +{ + mpls_interface_state_change_function_t *function; + uword function_opaque; +} mpls_interface_state_change_callback_t; + +/** Functions to call when interface becomes MPLS enabled/disabled. */ +static mpls_interface_state_change_callback_t *state_change_callbacks; u8 mpls_sw_interface_is_enabled (u32 sw_if_index) @@ -34,11 +42,20 @@ mpls_sw_interface_is_enabled (u32 sw_if_index) return (mm->mpls_enabled_by_sw_if_index[sw_if_index]); } +void +mpls_interface_state_change_add_callback ( + mpls_interface_state_change_function_t *function, uword opaque) +{ + mpls_interface_state_change_callback_t cb = { + .function = function, + .function_opaque = opaque, + }; + vec_add1 (state_change_callbacks, cb); +} + int -mpls_sw_interface_enable_disable (mpls_main_t * mm, - u32 sw_if_index, - u8 is_enable, - u8 is_api) +mpls_sw_interface_enable_disable (mpls_main_t *mm, u32 sw_if_index, + u8 is_enable) { fib_node_index_t lfib_index; vnet_main_t *vnm = vnet_get_main (); @@ -60,8 +77,7 @@ mpls_sw_interface_enable_disable (mpls_main_t * mm, if (1 != ++mm->mpls_enabled_by_sw_if_index[sw_if_index]) return (0); - fib_table_lock(lfib_index, FIB_PROTOCOL_MPLS, - (is_api? FIB_SOURCE_API: FIB_SOURCE_CLI)); + fib_table_lock (lfib_index, FIB_PROTOCOL_MPLS, FIB_SOURCE_INTERFACE); vec_validate(mm->fib_index_by_sw_if_index, sw_if_index); mm->fib_index_by_sw_if_index[sw_if_index] = lfib_index; @@ -72,9 +88,8 @@ mpls_sw_interface_enable_disable (mpls_main_t * mm, if (0 != --mm->mpls_enabled_by_sw_if_index[sw_if_index]) return (0); - fib_table_unlock(mm->fib_index_by_sw_if_index[sw_if_index], - FIB_PROTOCOL_MPLS, - (is_api? FIB_SOURCE_API: FIB_SOURCE_CLI)); + fib_table_unlock (mm->fib_index_by_sw_if_index[sw_if_index], + FIB_PROTOCOL_MPLS, FIB_SOURCE_INTERFACE); } vnet_feature_enable_disable ("mpls-input", "mpls-not-enabled", @@ -85,6 +100,12 @@ mpls_sw_interface_enable_disable (mpls_main_t * mm, else if (hi->l3_if_count) hi->l3_if_count--; + { + mpls_interface_state_change_callback_t *cb; + vec_foreach (cb, state_change_callbacks) + cb->function (mm, cb->function_opaque, sw_if_index, is_enable); + } + return (0); } @@ -118,7 +139,7 @@ mpls_interface_enable_disable (vlib_main_t * vm, goto done; } - rv = mpls_sw_interface_enable_disable(&mpls_main, sw_if_index, enable, 0); + rv = mpls_sw_interface_enable_disable (&mpls_main, sw_if_index, enable); if (VNET_API_ERROR_NO_SUCH_FIB == rv) error = clib_error_return (0, "default MPLS table must be created first"); @@ -128,7 +149,7 @@ mpls_interface_enable_disable (vlib_main_t * vm, } /*? - * This command enables an interface to accpet MPLS packets + * This command enables an interface to accept MPLS packets * * @cliexpar * @cliexstart{set interface mpls} |