X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Finterface.h;h=d462e1e8448820aee6b5f5c17d28ea122bf1e262;hb=70083ee;hp=1c9855581f0c0e66ddd23c7e9573db32307ce88c;hpb=e3a395c8406a292becb719495052374449fcd152;p=vpp.git diff --git a/src/vnet/interface.h b/src/vnet/interface.h index 1c9855581f0..d462e1e8448 100644 --- a/src/vnet/interface.h +++ b/src/vnet/interface.h @@ -54,6 +54,7 @@ typedef enum VNET_HW_INTERFACE_RX_MODE_POLLING, VNET_HW_INTERFACE_RX_MODE_INTERRUPT, VNET_HW_INTERFACE_RX_MODE_ADAPTIVE, + VNET_HW_INTERFACE_RX_MODE_DEFAULT, VNET_HW_INTERFACE_NUM_RX_MODES, } vnet_hw_interface_rx_mode; @@ -75,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, @@ -88,21 +94,6 @@ typedef struct _vnet_interface_function_list_elt clib_error_t *(*fp) (struct vnet_main_t * vnm, u32 if_index, u32 flags); } _vnet_interface_function_list_elt_t; -#define _VNET_INTERFACE_FUNCTION_DECL(f,tag) \ - \ -static void __vnet_interface_function_init_##tag##_##f (void) \ - __attribute__((__constructor__)) ; \ - \ -static void __vnet_interface_function_init_##tag##_##f (void) \ -{ \ - vnet_main_t * vnm = vnet_get_main(); \ - static _vnet_interface_function_list_elt_t init_function; \ - init_function.next_interface_function = \ - vnm->tag##_functions[VNET_ITF_FUNC_PRIORITY_LOW]; \ - vnm->tag##_functions[VNET_ITF_FUNC_PRIORITY_LOW] = &init_function; \ - init_function.fp = (void *) &f; \ -} - #define _VNET_INTERFACE_FUNCTION_DECL_PRIO(f,tag,p) \ \ static void __vnet_interface_function_init_##tag##_##f (void) \ @@ -115,8 +106,36 @@ 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) \ + _VNET_INTERFACE_FUNCTION_DECL_PRIO(f,tag,VNET_ITF_FUNC_PRIORITY_LOW) + #define VNET_HW_INTERFACE_ADD_DEL_FUNCTION(f) \ _VNET_INTERFACE_FUNCTION_DECL(f,hw_interface_add_del) #define VNET_HW_INTERFACE_LINK_UP_DOWN_FUNCTION(f) \ @@ -151,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; @@ -197,9 +219,6 @@ typedef struct _vnet_device_class /* Link-list of all device classes set up by constructors created below */ struct _vnet_device_class *next_class_registration; - /* Splice vnet_interface_output_node into TX path */ - u8 flatten_output_chains; - /* Function to set mac address. */ vnet_interface_set_mac_address_function_t *mac_addr_change_function; } vnet_device_class_t; @@ -214,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) \ @@ -382,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 @@ -407,23 +442,34 @@ typedef struct vnet_hw_interface_t #define VNET_HW_INTERFACE_FLAG_SPEED_10M (1 << 3) #define VNET_HW_INTERFACE_FLAG_SPEED_100M (1 << 4) #define VNET_HW_INTERFACE_FLAG_SPEED_1G (1 << 5) -#define VNET_HW_INTERFACE_FLAG_SPEED_10G (1 << 6) -#define VNET_HW_INTERFACE_FLAG_SPEED_40G (1 << 7) -#define VNET_HW_INTERFACE_FLAG_SPEED_100G (1 << 8) +#define VNET_HW_INTERFACE_FLAG_SPEED_2_5G (1 << 6) +#define VNET_HW_INTERFACE_FLAG_SPEED_5G (1 << 7) +#define VNET_HW_INTERFACE_FLAG_SPEED_10G (1 << 8) +#define VNET_HW_INTERFACE_FLAG_SPEED_20G (1 << 9) +#define VNET_HW_INTERFACE_FLAG_SPEED_25G (1 << 10) +#define VNET_HW_INTERFACE_FLAG_SPEED_40G (1 << 11) +#define VNET_HW_INTERFACE_FLAG_SPEED_50G (1 << 12) +#define VNET_HW_INTERFACE_FLAG_SPEED_56G (1 << 13) +#define VNET_HW_INTERFACE_FLAG_SPEED_100G (1 << 14) #define VNET_HW_INTERFACE_FLAG_SPEED_MASK \ (VNET_HW_INTERFACE_FLAG_SPEED_10M | \ VNET_HW_INTERFACE_FLAG_SPEED_100M | \ VNET_HW_INTERFACE_FLAG_SPEED_1G | \ + VNET_HW_INTERFACE_FLAG_SPEED_2_5G | \ + VNET_HW_INTERFACE_FLAG_SPEED_5G | \ VNET_HW_INTERFACE_FLAG_SPEED_10G | \ + VNET_HW_INTERFACE_FLAG_SPEED_20G | \ + VNET_HW_INTERFACE_FLAG_SPEED_25G | \ VNET_HW_INTERFACE_FLAG_SPEED_40G | \ + VNET_HW_INTERFACE_FLAG_SPEED_50G | \ + VNET_HW_INTERFACE_FLAG_SPEED_56G | \ VNET_HW_INTERFACE_FLAG_SPEED_100G) - /* l2output node flags */ -#define VNET_HW_INTERFACE_FLAG_L2OUTPUT_SHIFT 9 -#define VNET_HW_INTERFACE_FLAG_L2OUTPUT_MAPPED (1 << 9) - /* rx mode flags */ -#define VNET_HW_INTERFACE_FLAG_SUPPORTS_INT_MODE (1 << 10) +#define VNET_HW_INTERFACE_FLAG_SUPPORTS_INT_MODE (1 << 16) + + /* tx checksum offload */ +#define VNET_HW_INTERFACE_FLAG_SUPPORTS_TX_L4_CKSUM_OFFLOAD (1 << 17) /* Hardware address as vector. Zero (e.g. zero-length vector) if no address for this class (e.g. PPP). */ @@ -447,6 +493,10 @@ typedef struct vnet_hw_interface_t /* Software index for this hardware interface. */ u32 sw_if_index; + /* Next index in interface-output node for this interface + used by node function vnet_per_buffer_interface_output() */ + u32 output_node_next_index; + /* Maximum transmit rate for this interface in bits/sec. */ f64 max_rate_bits_per_sec; @@ -462,14 +512,6 @@ typedef struct vnet_hw_interface_t /* Largest packet size for this interface. */ u32 max_packet_bytes; - /* Number of extra bytes that go on the wire. - Packet length on wire - = max (length + per_packet_overhead_bytes, min_packet_bytes). */ - u32 per_packet_overhead_bytes; - - /* Receive and transmit layer 3 packet size limits (MRU/MTU). */ - u32 max_l3_packet_bytes[VLIB_N_RX_TX]; - /* Hash table mapping sub interface id to sw_if_index. */ uword *sub_interface_sw_if_index_by_id; @@ -492,6 +534,7 @@ typedef struct vnet_hw_interface_t /* vnet_hw_interface_rx_mode by queue */ u8 *rx_mode_by_queue; + vnet_hw_interface_rx_mode default_rx_mode; /* device input device_and_queue runtime index */ uword *dq_runtime_index_by_queue; @@ -507,6 +550,7 @@ typedef enum /* A sub-interface. */ VNET_SW_INTERFACE_TYPE_SUB, + VNET_SW_INTERFACE_TYPE_P2P, } vnet_sw_interface_type_t; typedef struct @@ -540,13 +584,28 @@ typedef struct } eth; } vnet_sub_interface_t; +typedef struct +{ + /* + * Subinterface ID. A number 0-N to uniquely identify + * this subinterface under the main interface + */ + u32 id; + u32 pool_index; + u8 client_mac[6]; +} vnet_p2p_sub_interface_t; + 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 @@ -570,9 +629,12 @@ typedef struct #define VNET_SW_INTERFACE_FLAG_BOND_SLAVE (1 << 4) -/* Interface does not appear in CLI/API */ + /* Interface does not appear in CLI/API */ #define VNET_SW_INTERFACE_FLAG_HIDDEN (1 << 5) + /* Interface in ERROR state */ +#define VNET_SW_INTERFACE_FLAG_ERROR (1 << 6) + /* Index for this interface. */ u32 sw_if_index; @@ -586,6 +648,9 @@ typedef struct u32 link_speed; + /* Receive and transmit layer 3 packet size limits (MRU/MTU). */ + u32 max_l3_packet_bytes[VLIB_N_RX_TX]; + union { /* VNET_SW_INTERFACE_TYPE_HARDWARE. */ @@ -593,6 +658,9 @@ typedef struct /* VNET_SW_INTERFACE_TYPE_SUB. */ vnet_sub_interface_t sub; + + /* VNET_SW_INTERFACE_TYPE_P2P. */ + vnet_p2p_sub_interface_t p2p; }; vnet_flood_class_t flood_class; @@ -613,10 +681,44 @@ typedef enum VNET_N_SIMPLE_INTERFACE_COUNTER = 9, /* Combined counters. */ VNET_INTERFACE_COUNTER_RX = 0, - VNET_INTERFACE_COUNTER_TX = 1, - VNET_N_COMBINED_INTERFACE_COUNTER = 2, + VNET_INTERFACE_COUNTER_RX_UNICAST = 1, + VNET_INTERFACE_COUNTER_RX_MULTICAST = 2, + VNET_INTERFACE_COUNTER_RX_BROADCAST = 3, + VNET_INTERFACE_COUNTER_TX = 4, + VNET_INTERFACE_COUNTER_TX_UNICAST = 5, + VNET_INTERFACE_COUNTER_TX_MULTICAST = 6, + VNET_INTERFACE_COUNTER_TX_BROADCAST = 7, + VNET_N_COMBINED_INTERFACE_COUNTER = 8, } vnet_interface_counter_type_t; +#define foreach_rx_combined_interface_counter(_x) \ + for (_x = VNET_INTERFACE_COUNTER_RX; \ + _x <= VNET_INTERFACE_COUNTER_RX_BROADCAST; \ + _x++) + +#define foreach_tx_combined_interface_counter(_x) \ + for (_x = VNET_INTERFACE_COUNTER_TX; \ + _x <= VNET_INTERFACE_COUNTER_TX_BROADCAST; \ + _x++) + +typedef enum +{ + COLLECT_SIMPLE_STATS = 0, + COLLECT_DETAILED_STATS = 1, +} vnet_interface_stats_collection_mode_e; + +extern int collect_detailed_interface_stats_flag; + +static inline int +collect_detailed_interface_stats (void) +{ + return collect_detailed_interface_stats_flag; +} + +void collect_detailed_interface_stats_flag_set (void); +void collect_detailed_interface_stats_flag_clear (void); + + typedef struct { u32 output_node_index;