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>
This commit is contained in:
Adrian Pistol
2023-05-14 00:00:41 +02:00
committed by Neale Ranns
parent 06f1290703
commit ae48ffb503
2 changed files with 37 additions and 5 deletions

View File

@ -22,6 +22,14 @@
#include <vnet/adj/adj_midchain.h> #include <vnet/adj/adj_midchain.h>
#include <vnet/dpo/classify_dpo.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 u8
mpls_sw_interface_is_enabled (u32 sw_if_index) 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]); 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 int
mpls_sw_interface_enable_disable (mpls_main_t *mm, u32 sw_if_index, mpls_sw_interface_enable_disable (mpls_main_t *mm, u32 sw_if_index,
u8 is_enable) 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) else if (hi->l3_if_count)
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); return (0);
} }

View File

@ -23,14 +23,18 @@
#include <vnet/fib/fib_node.h> #include <vnet/fib/fib_node.h>
#include <vnet/adj/adj.h> #include <vnet/adj/adj.h>
struct mpls_main_t;
/** /**
* @brief Definition of a callback for receiving MPLS interface state change * @brief Definition of a callback for receiving MPLS interface state change
* notifications * notifications
*/ */
typedef void (*mpls_interface_state_change_callback_t) (u32 sw_if_index, typedef void (mpls_interface_state_change_function_t) (struct mpls_main_t *mm,
u32 is_enable); uword opaque,
u32 sw_if_index,
u32 is_enable);
typedef struct typedef struct mpls_main_t
{ {
/* MPLS FIB index for each software interface */ /* MPLS FIB index for each software interface */
u32 *fib_index_by_sw_if_index; 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_mpls_header;
unformat_function_t unformat_pg_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, int mpls_sw_interface_enable_disable (mpls_main_t *mm, u32 sw_if_index,
u8 is_enable); u8 is_enable);
u8 mpls_sw_interface_is_enabled (u32 sw_if_index);
int mpls_dest_cmp (void *a1, void *a2); int mpls_dest_cmp (void *a1, void *a2);
int mpls_fib_index_cmp (void *a1, void *a2); int mpls_fib_index_cmp (void *a1, void *a2);