X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Finterface.h;h=7556bc5544eadeec08cf583800cc085c8f1f034b;hb=fe7d4a2e31529eed5416b38b520fdc84687df03c;hp=00a7353d701ba91be09d364c10007876af7e640c;hpb=871dc4287d8c05ff76106dba4f5f8654c24347fe;p=vpp.git diff --git a/src/vnet/interface.h b/src/vnet/interface.h index 00a7353d701..7556bc5544e 100644 --- a/src/vnet/interface.h +++ b/src/vnet/interface.h @@ -76,6 +76,11 @@ typedef clib_error_t *(vnet_interface_set_rx_mode_function_t) (struct vnet_main_t * vnm, u32 if_index, u32 queue_id, vnet_hw_interface_rx_mode mode); +/* Interface set l2 mode callback. */ +typedef clib_error_t *(vnet_interface_set_l2_mode_function_t) + (struct vnet_main_t * vnm, struct vnet_hw_interface_t * hi, + i32 l2_if_adjust); + typedef enum vnet_interface_function_priority_t_ { VNET_ITF_FUNC_PRIORITY_LOW, @@ -101,6 +106,31 @@ static void __vnet_interface_function_init_##tag##_##f (void) \ init_function.next_interface_function = vnm->tag##_functions[p]; \ vnm->tag##_functions[p] = &init_function; \ init_function.fp = (void *) &f; \ +} \ +static void __vnet_interface_function_deinit_##tag##_##f (void) \ + __attribute__((__destructor__)) ; \ + \ +static void __vnet_interface_function_deinit_##tag##_##f (void) \ +{ \ + vnet_main_t * vnm = vnet_get_main(); \ + _vnet_interface_function_list_elt_t *next; \ + if (vnm->tag##_functions[p]->fp == (void *) &f) \ + { \ + vnm->tag##_functions[p] = \ + vnm->tag##_functions[p]->next_interface_function; \ + return; \ + } \ + next = vnm->tag##_functions[p]; \ + while (next->next_interface_function) \ + { \ + if (next->next_interface_function->fp == (void *) &f) \ + { \ + next->next_interface_function = \ + next->next_interface_function->next_interface_function; \ + return; \ + } \ + next = next->next_interface_function; \ + } \ } #define _VNET_INTERFACE_FUNCTION_DECL(f,tag) \ @@ -140,6 +170,9 @@ typedef struct _vnet_device_class /* Function to call interface rx mode is changed */ vnet_interface_set_rx_mode_function_t *rx_mode_change_function; + /* Function to call interface l2 mode is changed */ + vnet_interface_set_l2_mode_function_t *set_l2_mode_function; + /* Redistribute flag changes/existence of this interface class. */ u32 redistribute; @@ -200,6 +233,14 @@ static void __vnet_add_device_class_registration_##x (void) \ x.next_class_registration = vnm->device_class_registrations; \ vnm->device_class_registrations = &x; \ } \ +static void __vnet_rm_device_class_registration_##x (void) \ + __attribute__((__destructor__)) ; \ +static void __vnet_rm_device_class_registration_##x (void) \ +{ \ + vnet_main_t * vnm = vnet_get_main(); \ + VLIB_REMOVE_FROM_LINKED_LIST (vnm->device_class_registrations, \ + &x, next_class_registration); \ +} \ __VA_ARGS__ vnet_device_class_t x #define VLIB_DEVICE_TX_FUNCTION_CLONE_TEMPLATE(arch, fn, tgt) \ @@ -368,6 +409,14 @@ static void __vnet_add_hw_interface_class_registration_##x (void) \ x.next_class_registration = vnm->hw_interface_class_registrations; \ vnm->hw_interface_class_registrations = &x; \ } \ +static void __vnet_rm_hw_interface_class_registration_##x (void) \ + __attribute__((__destructor__)) ; \ +static void __vnet_rm_hw_interface_class_registration_##x (void) \ +{ \ + vnet_main_t * vnm = vnet_get_main(); \ + VLIB_REMOVE_FROM_LINKED_LIST (vnm->hw_interface_class_registrations,\ + &x, next_class_registration); \ +} \ __VA_ARGS__ vnet_hw_interface_class_t x /* Hardware-interface. This corresponds to a physical wire @@ -556,11 +605,15 @@ typedef struct typedef enum { + /* THe BVI interface */ + VNET_FLOOD_CLASS_BVI, /* Always flood */ VNET_FLOOD_CLASS_NORMAL, VNET_FLOOD_CLASS_TUNNEL_MASTER, /* Does not flood when tunnel master is in the same L2 BD */ - VNET_FLOOD_CLASS_TUNNEL_NORMAL + VNET_FLOOD_CLASS_TUNNEL_NORMAL, + /* Never flood to this type */ + VNET_FLOOD_CLASS_NO_FLOOD, } vnet_flood_class_t; /* Software-interface. This corresponds to a Ethernet VLAN, ATM vc, a