diff options
author | Adrian Pistol <vifino@posteo.net> | 2023-05-14 00:00:41 +0200 |
---|---|---|
committer | Neale Ranns <neale@graphiant.com> | 2023-05-21 23:07:48 +0000 |
commit | ae48ffb503bce4d78e8549bde2adbdeabb60fe8e (patch) | |
tree | e6c056eccc789774a84e23b9ca8648eee158a071 /src/vnet/mpls | |
parent | 06f1290703c368c5779f500c66bb7247e271ee2d (diff) |
mpls: implement state change callbacks
There was already a basic type defined, but nothing more.
This implements callbacks similar to
ip4_enable_disable_interface_callback_t.
Type: feature
Change-Id: I34fcb146ca68af4eb8cdd244529eb149f884284d
Signed-off-by: Adrian Pistol <vifino@posteo.net>
Diffstat (limited to 'src/vnet/mpls')
-rw-r--r-- | src/vnet/mpls/interface.c | 25 | ||||
-rw-r--r-- | src/vnet/mpls/mpls.h | 17 |
2 files changed, 37 insertions, 5 deletions
diff --git a/src/vnet/mpls/interface.c b/src/vnet/mpls/interface.c index 5e80b9d0532..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,6 +42,17 @@ 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) @@ -81,6 +100,12 @@ mpls_sw_interface_enable_disable (mpls_main_t *mm, u32 sw_if_index, 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); } diff --git a/src/vnet/mpls/mpls.h b/src/vnet/mpls/mpls.h index 885901f89a4..6baaaad95ba 100644 --- a/src/vnet/mpls/mpls.h +++ b/src/vnet/mpls/mpls.h @@ -23,14 +23,18 @@ #include <vnet/fib/fib_node.h> #include <vnet/adj/adj.h> +struct mpls_main_t; + /** * @brief Definition of a callback for receiving MPLS interface state change * notifications */ -typedef void (*mpls_interface_state_change_callback_t) (u32 sw_if_index, - u32 is_enable); +typedef void (mpls_interface_state_change_function_t) (struct mpls_main_t *mm, + uword opaque, + u32 sw_if_index, + u32 is_enable); -typedef struct +typedef struct mpls_main_t { /* MPLS FIB index for each software interface */ u32 *fib_index_by_sw_if_index; @@ -77,11 +81,14 @@ unformat_function_t unformat_mpls_unicast_label; unformat_function_t unformat_mpls_header; unformat_function_t unformat_pg_mpls_header; +u8 mpls_sw_interface_is_enabled (u32 sw_if_index); + +void mpls_interface_state_change_add_callback ( + mpls_interface_state_change_function_t *function, uword opaque); + int mpls_sw_interface_enable_disable (mpls_main_t *mm, u32 sw_if_index, u8 is_enable); -u8 mpls_sw_interface_is_enabled (u32 sw_if_index); - int mpls_dest_cmp (void *a1, void *a2); int mpls_fib_index_cmp (void *a1, void *a2); |