diff options
Diffstat (limited to 'src/vnet/l2/l2_fib.h')
-rw-r--r-- | src/vnet/l2/l2_fib.h | 86 |
1 files changed, 68 insertions, 18 deletions
diff --git a/src/vnet/l2/l2_fib.h b/src/vnet/l2/l2_fib.h index 50fd474087b..a958023eaea 100644 --- a/src/vnet/l2/l2_fib.h +++ b/src/vnet/l2/l2_fib.h @@ -102,24 +102,44 @@ typedef struct }; } l2fib_seq_num_t; +/** + * Flags associated with an L2 Fib Entry + * - static mac, no MAC move + * - not subject to age + * - mac is for a bridged virtual interface + * - drop packets to/from this mac + * - MAC learned to be sent in L2 MAC event + * -MAC learned is a MAC move + */ +#define foreach_l2fib_entry_result_attr \ + _(STATIC, 0, "static") \ + _(AGE_NOT, 1, "age-not") \ + _(BVI, 2, "bvi") \ + _(FILTER, 3, "filter") \ + _(LRN_EVT, 4, "learn-event") \ + _(LRN_MOV, 5, "learn-move") + +typedef enum l2fib_entry_result_flags_t_ +{ + L2FIB_ENTRY_RESULT_FLAG_NONE = 0, +#define _(a,v,s) L2FIB_ENTRY_RESULT_FLAG_##a = (1 << v), + foreach_l2fib_entry_result_attr +#undef _ +} __attribute__ ((packed)) l2fib_entry_result_flags_t; + +STATIC_ASSERT_SIZEOF (l2fib_entry_result_flags_t, 1); + /* * The l2fib entry results */ -typedef struct +typedef struct l2fib_entry_result_t_ { union { struct { u32 sw_if_index; /* output sw_if_index (L3 intf if bvi==1) */ - - u8 static_mac:1; /* static mac, no MAC move */ - u8 age_not:1; /* not subject to age */ - u8 bvi:1; /* mac is for a bridged virtual interface */ - u8 filter:1; /* drop packets to/from this mac */ - u8 lrn_evt:1; /* MAC learned to be sent in L2 MAC event */ - u8 lrn_mov:1; /* MAC learned is a MAC move */ - u8 unused:2; + l2fib_entry_result_flags_t flags; u8 timestamp; /* timestamp for aging */ l2fib_seq_num_t sn; /* bd/int seq num */ @@ -130,6 +150,41 @@ typedef struct STATIC_ASSERT_SIZEOF (l2fib_entry_result_t, 8); +#define _(a,v,s) \ + always_inline int \ + l2fib_entry_result_is_set_##a (const l2fib_entry_result_t *r) { \ + return (r->fields.flags & L2FIB_ENTRY_RESULT_FLAG_##a); \ + } +foreach_l2fib_entry_result_attr +#undef _ +#define _(a,v,s) \ + always_inline void \ + l2fib_entry_result_set_##a (l2fib_entry_result_t *r) { \ + r->fields.flags |= L2FIB_ENTRY_RESULT_FLAG_##a; \ + } + foreach_l2fib_entry_result_attr +#undef _ +#define _(a,v,s) \ + always_inline void \ + l2fib_entry_result_clear_##a (l2fib_entry_result_t *r) { \ + r->fields.flags &= ~L2FIB_ENTRY_RESULT_FLAG_##a; \ + } + foreach_l2fib_entry_result_attr +#undef _ + static inline void +l2fib_entry_result_set_bits (l2fib_entry_result_t * r, + l2fib_entry_result_flags_t bits) +{ + r->fields.flags |= bits; +} + +static inline void +l2fib_entry_result_clear_bits (l2fib_entry_result_t * r, + l2fib_entry_result_flags_t bits) +{ + r->fields.flags &= ~bits; +} + /* L2 MAC event entry action enums (see mac_entry definition in l2.api) */ typedef enum { @@ -387,19 +442,14 @@ void l2fib_clear_table (void); void l2fib_add_entry (u8 * mac, u32 bd_index, - u32 sw_if_index, u8 static_mac, u8 drop_mac, u8 bvi_mac); - -static inline void -l2fib_add_fwd_entry (u8 * mac, u32 bd_index, u32 sw_if_index, u8 static_mac, - u8 bvi_mac) -{ - l2fib_add_entry (mac, bd_index, sw_if_index, static_mac, 0, bvi_mac); -} + u32 sw_if_index, l2fib_entry_result_flags_t flags); static inline void l2fib_add_filter_entry (u8 * mac, u32 bd_index) { - l2fib_add_entry (mac, bd_index, ~0, 1, 1, 0); + l2fib_add_entry (mac, bd_index, ~0, + (L2FIB_ENTRY_RESULT_FLAG_FILTER | + L2FIB_ENTRY_RESULT_FLAG_STATIC)); } u32 l2fib_del_entry (u8 * mac, u32 bd_index, u32 sw_if_index); |