X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fl2%2Fl2_fib.h;h=a958023eaea8921bd0bd21fade703bb47adfc668;hb=b54d081873ac975e06be2569a17e6150779e3018;hp=50fd474087b228567b4b079a6cd9b99c2bbbe298;hpb=3b93be5d76cbcb5dc3d3aee5c72a797014a346f9;p=vpp.git 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);