X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Finterface.h;h=f82cf9d2485395a0cdbef6de1cbef892c3d9a004;hb=17ff3c1;hp=2344348bf0082869ca267c977656fb8967bf0777;hpb=4403690cda44134af3b9ea78d33a5cbf78a5acc9;p=vpp.git diff --git a/src/vnet/interface.h b/src/vnet/interface.h index 2344348bf00..f82cf9d2485 100644 --- a/src/vnet/interface.h +++ b/src/vnet/interface.h @@ -48,6 +48,16 @@ struct vnet_hw_interface_t; struct vnet_sw_interface_t; struct ip46_address_t; +typedef enum +{ + VNET_HW_INTERFACE_RX_MODE_UNKNOWN, + 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; + /* Interface up/down callback. */ typedef clib_error_t *(vnet_interface_function_t) (struct vnet_main_t * vnm, u32 if_index, u32 flags); @@ -61,6 +71,30 @@ typedef clib_error_t *(vnet_subif_add_del_function_t) typedef clib_error_t *(vnet_interface_set_mac_address_function_t) (struct vnet_hw_interface_t * hi, char *address); +/* Interface set rx mode callback. */ +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_FLOW_DEV_OP_ADD_FLOW, + VNET_FLOW_DEV_OP_DEL_FLOW, + VNET_FLOW_DEV_OP_GET_COUNTER, + VNET_FLOW_DEV_OP_RESET_COUNTER, +} vnet_flow_dev_op_t; + +/* Interface flow opeations callback. */ +typedef int (vnet_flow_dev_ops_function_t) (struct vnet_main_t * vnm, + vnet_flow_dev_op_t op, + u32 hw_if_index, u32 index, + uword * private_data); + typedef enum vnet_interface_function_priority_t_ { VNET_ITF_FUNC_PRIORITY_LOW, @@ -74,21 +108,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) \ @@ -101,14 +120,44 @@ 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) \ _VNET_INTERFACE_FUNCTION_DECL(f,hw_interface_link_up_down) -#define VNET_HW_INTERFACE_LINK_UP_DOWN_FUNCTION_PRIO(f,p) \ +#define VNET_HW_INTERFACE_LINK_UP_DOWN_FUNCTION_PRIO(f,p) \ _VNET_INTERFACE_FUNCTION_DECL_PRIO(f,hw_interface_link_up_down,p) +#define VNET_SW_INTERFACE_MTU_CHANGE_FUNCTION(f) \ + _VNET_INTERFACE_FUNCTION_DECL(f,sw_interface_mtu_change) #define VNET_SW_INTERFACE_ADD_DEL_FUNCTION(f) \ _VNET_INTERFACE_FUNCTION_DECL(f,sw_interface_add_del) #define VNET_SW_INTERFACE_ADMIN_UP_DOWN_FUNCTION(f) \ @@ -134,6 +183,12 @@ typedef struct _vnet_device_class /* Function to call when sub-interface is added/deleted */ vnet_subif_add_del_function_t *subif_add_del_function; + /* 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; @@ -150,6 +205,9 @@ typedef struct _vnet_device_class int (*name_renumber) (struct vnet_hw_interface_t * hi, u32 new_dev_instance); + /* Interface flow offload operations */ + vnet_flow_dev_ops_function_t *flow_ops_function; + /* Format device instance as name. */ format_function_t *format_device_name; @@ -162,6 +220,9 @@ typedef struct _vnet_device_class /* Trace buffer format for TX function. */ format_function_t *format_tx_trace; + /* Format flow offload entry */ + format_function_t *format_flow; + /* Function to clear hardware counters for device. */ void (*clear_counters) (u32 dev_class_instance); @@ -180,9 +241,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; @@ -197,6 +255,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) \ @@ -252,6 +318,11 @@ typedef enum vnet_link_t_ [VNET_LINK_NSH] = "nsh", \ } +#define FOR_EACH_VNET_LINK(_link) \ + for (_link = VNET_LINK_IP4; \ + _link <= VNET_LINK_NSH; \ + _link++) + /** * @brief Number of link types. Not part of the enum so it does not have to be included in * switch statements @@ -365,6 +436,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 @@ -390,23 +469,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). */ @@ -430,6 +520,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; @@ -445,14 +539,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; @@ -475,6 +561,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; @@ -490,17 +577,10 @@ typedef enum /* A sub-interface. */ VNET_SW_INTERFACE_TYPE_SUB, + VNET_SW_INTERFACE_TYPE_P2P, + VNET_SW_INTERFACE_TYPE_PIPE, } vnet_sw_interface_type_t; -typedef enum -{ - VNET_HW_INTERFACE_RX_MODE_UNKNOWN, - VNET_HW_INTERFACE_RX_MODE_POLLING, - VNET_HW_INTERFACE_RX_MODE_INTERRUPT, - VNET_HW_INTERFACE_RX_MODE_ADAPTIVE, - VNET_HW_INTERFACE_NUM_RX_MODES, -} vnet_hw_interface_rx_mode; - typedef struct { /* @@ -532,15 +612,42 @@ 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; +/* Per protocol MTU */ +typedef enum +{ + VNET_MTU_L3, /* Default payload MTU (without L2 headers) */ + VNET_MTU_IP4, /* Per-protocol MTUs overriding default */ + VNET_MTU_IP6, + VNET_MTU_MPLS, + VNET_N_MTU +} vnet_mtu_t; + +extern vnet_mtu_t vnet_link_to_mtu (vnet_link_t link); + /* Software-interface. This corresponds to a Ethernet VLAN, ATM vc, a tunnel, etc. Configuration (e.g. IP address) gets attached to software interface. */ @@ -562,9 +669,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; @@ -578,14 +688,17 @@ typedef struct u32 link_speed; - union - { - /* VNET_SW_INTERFACE_TYPE_HARDWARE. */ - u32 hw_if_index; + /* VNET_SW_INTERFACE_TYPE_HARDWARE. */ + u32 hw_if_index; + + /* MTU for network layer (not including L2 headers) */ + u32 mtu[VNET_N_MTU]; + + /* VNET_SW_INTERFACE_TYPE_SUB. */ + vnet_sub_interface_t sub; - /* 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; } vnet_sw_interface_t; @@ -605,10 +718,64 @@ 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++) + +#define foreach_simple_interface_counter_name \ + _(DROP, drops, if) \ + _(PUNT, punt, if) \ + _(IP4, ip4, if) \ + _(IP6, ip6, if) \ + _(RX_NO_BUF, rx-no-buf, if) \ + _(RX_MISS, rx-miss, if) \ + _(RX_ERROR, rx-error, if) \ + _(TX_ERROR, tx-error, if) + +#define foreach_combined_interface_counter_name \ + _(RX, rx, if) \ + _(RX_UNICAST, rx-unicast, if) \ + _(RX_MULTICAST, rx-multicast, if) \ + _(RX_BROADCAST, rx-broadcast, if) \ + _(TX, tx, if) \ + _(TX_UNICAST, tx-unicast-miss, if) \ + _(TX_MULTICAST, tx-multicast, if) \ + _(TX_BROADCAST, tx-broadcast, if) + +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;