X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Finterface.h;h=e6450f5bf596774657a1d76836cb634bf40c5060;hb=e0792fdff;hp=30023ebded3f5d99594b33aa7dbd4e8f1dfe1ed3;hpb=3b81a1e5f205482b8ea30edbfd39559c4368ac4d;p=vpp.git diff --git a/src/vnet/interface.h b/src/vnet/interface.h index 30023ebded3..e6450f5bf59 100644 --- a/src/vnet/interface.h +++ b/src/vnet/interface.h @@ -40,13 +40,15 @@ #ifndef included_vnet_interface_h #define included_vnet_interface_h -#include +#include +#include #include +#include struct vnet_main_t; struct vnet_hw_interface_t; struct vnet_sw_interface_t; -struct ip46_address_t; +union ip46_address_t_; typedef enum { @@ -72,6 +74,10 @@ typedef clib_error_t *(vnet_interface_set_mac_address_function_t) (struct vnet_hw_interface_t * hi, const u8 * old_address, const u8 * new_address); +/* Interface add/del additional mac address callback */ +typedef clib_error_t *(vnet_interface_add_del_mac_address_function_t) + (struct vnet_hw_interface_t * hi, const u8 * address, u8 is_add); + /* 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, @@ -90,7 +96,7 @@ typedef enum VNET_FLOW_DEV_OP_RESET_COUNTER, } vnet_flow_dev_op_t; -/* Interface flow opeations callback. */ +/* Interface flow operations 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, @@ -130,7 +136,7 @@ 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) \ + if (vnm->tag##_functions[p]->fp == f) \ { \ vnm->tag##_functions[p] = \ vnm->tag##_functions[p]->next_interface_function; \ @@ -139,7 +145,7 @@ static void __vnet_interface_function_deinit_##tag##_##f (void) \ next = vnm->tag##_functions[p]; \ while (next->next_interface_function) \ { \ - if (next->next_interface_function->fp == (void *) &f) \ + if (next->next_interface_function->fp == f) \ { \ next->next_interface_function = \ next->next_interface_function->next_interface_function; \ @@ -173,6 +179,14 @@ static __clib_unused void * __clib_unused_##f = f; #define VNET_SW_INTERFACE_ADMIN_UP_DOWN_FUNCTION_PRIO(f,p) \ _VNET_INTERFACE_FUNCTION_DECL_PRIO(f,sw_interface_admin_up_down, p) +/** + * Tunnel description parameters + */ +typedef int (*vnet_dev_class_ip_tunnel_desc_t) (u32 sw_if_index, + union ip46_address_t_ * src, + union ip46_address_t_ * dst, + u8 * is_l2); + /* A class of hardware interface devices. */ typedef struct _vnet_device_class { @@ -234,6 +248,8 @@ typedef struct _vnet_device_class /* Format flow offload entry */ format_function_t *format_flow; + vnet_dev_class_ip_tunnel_desc_t ip_tun_desc; + /* Function to clear hardware counters for device. */ void (*clear_counters) (u32 dev_class_instance); @@ -254,6 +270,9 @@ typedef struct _vnet_device_class /* Function to set mac address. */ vnet_interface_set_mac_address_function_t *mac_addr_change_function; + + /* Function to add/delete additional MAC addresses */ + vnet_interface_add_del_mac_address_function_t *mac_addr_add_del_function; } vnet_device_class_t; #ifndef CLIB_MARCH_VARIANT @@ -301,31 +320,6 @@ CLIB_MARCH_SFX (devclass##_tx_fn_multiarch_register) (void) \ } \ uword CLIB_CPU_OPTIMIZED CLIB_MARCH_SFX (devclass##_tx_fn) -#define VLIB_DEVICE_TX_FUNCTION_CLONE_TEMPLATE(arch, fn, tgt) \ - uword \ - __attribute__ ((flatten)) \ - __attribute__ ((target (tgt))) \ - CLIB_CPU_OPTIMIZED \ - fn ## _ ## arch ( vlib_main_t * vm, \ - vlib_node_runtime_t * node, \ - vlib_frame_t * frame) \ - { return fn (vm, node, frame); } - -#define VLIB_DEVICE_TX_FUNCTION_MULTIARCH_CLONE(fn) \ - foreach_march_variant(VLIB_DEVICE_TX_FUNCTION_CLONE_TEMPLATE, fn) - -#if CLIB_DEBUG > 0 -#define VLIB_MULTIARCH_CLONE_AND_SELECT_FN(fn,...) -#define VLIB_DEVICE_TX_FUNCTION_MULTIARCH(dev, fn) -#else -#define VLIB_DEVICE_TX_FUNCTION_MULTIARCH(dev, fn) \ - VLIB_DEVICE_TX_FUNCTION_MULTIARCH_CLONE(fn) \ - CLIB_MULTIARCH_SELECT_FN(fn, static inline) \ - static void __attribute__((__constructor__)) \ - __vlib_device_tx_function_multiarch_select_##dev (void) \ - { dev.tx_function = fn ## _multiarch_select(); } -#endif - /** * Link Type: A description of the protocol of packets on the link. * On an ethernet link this maps directly into the ethertype. On a GRE tunnel @@ -405,6 +399,9 @@ typedef struct _vnet_hw_interface_class /* Function to call when link MAC changes. */ vnet_interface_set_mac_address_function_t *mac_addr_change_function; + /* Function to add/delete additional MAC addresses */ + vnet_interface_add_del_mac_address_function_t *mac_addr_add_del_function; + /* Format function to display interface name. */ format_function_t *format_interface_name; @@ -429,7 +426,7 @@ typedef struct _vnet_hw_interface_class u32 sw_if_index, vnet_link_t link_type, const void *dst_hw_address); - /* Update an adjacecny added by FIB (as opposed to via the + /* Update an adjacency added by FIB (as opposed to via the * neighbour resolution protocol). */ void (*update_adjacency) (struct vnet_main_t * vnm, u32 sw_if_index, u32 adj_index); @@ -482,57 +479,45 @@ static void __vnet_rm_hw_interface_class_registration_##x (void) \ } \ __VA_ARGS__ vnet_hw_interface_class_t x -/* Hardware-interface. This corresponds to a physical wire - that packets flow over. */ -typedef struct vnet_hw_interface_t +typedef enum vnet_hw_interface_flags_t_ { - /* Interface name. */ - u8 *name; - - u32 flags; + VNET_HW_INTERFACE_FLAG_NONE, /* Hardware link state is up. */ -#define VNET_HW_INTERFACE_FLAG_LINK_UP (1 << 0) + VNET_HW_INTERFACE_FLAG_LINK_UP = (1 << 0), /* Hardware duplex state */ -#define VNET_HW_INTERFACE_FLAG_DUPLEX_SHIFT 1 -#define VNET_HW_INTERFACE_FLAG_HALF_DUPLEX (1 << 1) -#define VNET_HW_INTERFACE_FLAG_FULL_DUPLEX (1 << 2) + VNET_HW_INTERFACE_FLAG_HALF_DUPLEX = (1 << 1), + VNET_HW_INTERFACE_FLAG_FULL_DUPLEX = (1 << 2), + + /* rx mode flags */ + VNET_HW_INTERFACE_FLAG_SUPPORTS_INT_MODE = (1 << 16), + + /* tx checksum offload */ + VNET_HW_INTERFACE_FLAG_SUPPORTS_TX_L4_CKSUM_OFFLOAD = (1 << 17), + + /* gso */ + VNET_HW_INTERFACE_FLAG_SUPPORTS_GSO = (1 << 18), +} vnet_hw_interface_flags_t; + +#define VNET_HW_INTERFACE_FLAG_DUPLEX_SHIFT 1 +#define VNET_HW_INTERFACE_FLAG_SPEED_SHIFT 3 #define VNET_HW_INTERFACE_FLAG_DUPLEX_MASK \ (VNET_HW_INTERFACE_FLAG_HALF_DUPLEX | \ VNET_HW_INTERFACE_FLAG_FULL_DUPLEX) - /* Hardware link speed */ -#define VNET_HW_INTERFACE_FLAG_SPEED_SHIFT 3 -#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_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) +/* Hardware-interface. This corresponds to a physical wire + that packets flow over. */ +typedef struct vnet_hw_interface_t +{ + CLIB_CACHE_LINE_ALIGN_MARK (cacheline0); + /* Interface name. */ + u8 *name; + + /* flags */ + vnet_hw_interface_flags_t flags; - /* rx mode flags */ -#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) + /* link speed in kbps */ + u32 link_speed; /* Hardware address as vector. Zero (e.g. zero-length vector) if no address for this class (e.g. PPP). */ @@ -602,6 +587,13 @@ typedef struct vnet_hw_interface_t /* device input device_and_queue runtime index */ uword *dq_runtime_index_by_queue; + /* numa node that hardware device connects to */ + u8 numa_node; + + /* trace */ + i32 n_trace; + + u32 trace_classify_table_index; } vnet_hw_interface_t; extern vnet_device_class_t vnet_local_interface_device_class; @@ -686,18 +678,19 @@ extern vnet_mtu_t vnet_link_to_mtu (vnet_link_t link); typedef enum vnet_sw_interface_flags_t_ { - /* Interface is "up" meaning adminstratively up. + VNET_SW_INTERFACE_FLAG_NONE = 0, + /* Interface is "up" meaning administratively up. Up in the sense of link state being up is maintained by hardware interface. */ VNET_SW_INTERFACE_FLAG_ADMIN_UP = (1 << 0), /* Interface is disabled for forwarding: punt all traffic to slow-path. */ VNET_SW_INTERFACE_FLAG_PUNT = (1 << 1), - VNET_SW_INTERFACE_FLAG_PROXY_ARP = (1 << 2), + __VNET_SW_INTERFACE_FLAG_UNSUED = (1 << 2), VNET_SW_INTERFACE_FLAG_UNNUMBERED = (1 << 3), - VNET_SW_INTERFACE_FLAG_BOND_SLAVE = (1 << 4), + __VNET_SW_INTERFACE_FLAG_UNUSED2 = (1 << 4), /* Interface does not appear in CLI/API */ VNET_SW_INTERFACE_FLAG_HIDDEN = (1 << 5), @@ -730,8 +723,6 @@ typedef struct /* this swif is unnumbered, use addresses on unnumbered_sw_if_index... */ u32 unnumbered_sw_if_index; - u32 link_speed; - /* VNET_SW_INTERFACE_TYPE_HARDWARE. */ u32 hw_if_index; @@ -790,7 +781,8 @@ typedef enum _(RX_NO_BUF, rx-no-buf, if) \ _(RX_MISS, rx-miss, if) \ _(RX_ERROR, rx-error, if) \ - _(TX_ERROR, tx-error, if) + _(TX_ERROR, tx-error, if) \ + _(MPLS, mpls, if) #define foreach_combined_interface_counter_name \ _(RX, rx, if) \ @@ -798,7 +790,7 @@ typedef enum _(RX_MULTICAST, rx-multicast, if) \ _(RX_BROADCAST, rx-broadcast, if) \ _(TX, tx, if) \ - _(TX_UNICAST, tx-unicast-miss, if) \ + _(TX_UNICAST, tx-unicast, if) \ _(TX_MULTICAST, tx-multicast, if) \ _(TX_BROADCAST, tx-broadcast, if) @@ -826,6 +818,15 @@ typedef struct u32 tx_node_index; } vnet_hw_interface_nodes_t; +typedef struct +{ + CLIB_CACHE_LINE_ALIGN_MARK (cacheline0); + u32 *split_buffers; +} vnet_interface_per_thread_data_t; + +typedef u8 *(*vnet_buffer_opquae_formatter_t) (const vlib_buffer_t * b, + u8 * s); + typedef struct { /* Hardware interfaces. */ @@ -850,20 +851,29 @@ typedef struct /* Software interface counters both simple and combined packet and byte counters. */ - volatile u32 *sw_if_counter_lock; + clib_spinlock_t sw_if_counter_lock; vlib_simple_counter_main_t *sw_if_counters; vlib_combined_counter_main_t *combined_sw_if_counters; vnet_hw_interface_nodes_t *deleted_hw_interface_nodes; - /* pcap drop tracing */ - int drop_pcap_enable; - pcap_main_t pcap_main; - u8 *pcap_filename; - u32 pcap_sw_if_index; - u32 pcap_pkts_to_capture; + /* + * pcap drop tracing + * Only the drop filter hash lives here. See ../src/vlib/main.h for + * the rest of the variables. + */ uword *pcap_drop_filter_hash; + /* Buffer metadata format helper functions */ + vnet_buffer_opquae_formatter_t *buffer_opaque_format_helpers; + vnet_buffer_opquae_formatter_t *buffer_opaque2_format_helpers; + + /* per-thread data */ + vnet_interface_per_thread_data_t *per_thread_data; + + /* enable GSO processing in packet path if this count is > 0 */ + u32 gso_interface_count; + /* feature_arc_index */ u8 output_feature_arc_index; } vnet_interface_main_t; @@ -872,21 +882,46 @@ static inline void vnet_interface_counter_lock (vnet_interface_main_t * im) { if (im->sw_if_counter_lock) - while (__sync_lock_test_and_set (im->sw_if_counter_lock, 1)) - /* zzzz */ ; + clib_spinlock_lock (&im->sw_if_counter_lock); } static inline void vnet_interface_counter_unlock (vnet_interface_main_t * im) { if (im->sw_if_counter_lock) - *im->sw_if_counter_lock = 0; + clib_spinlock_unlock (&im->sw_if_counter_lock); } void vnet_pcap_drop_trace_filter_add_del (u32 error_index, int is_add); int vnet_interface_name_renumber (u32 sw_if_index, u32 new_show_dev_instance); +uword vnet_interface_output_node (vlib_main_t * vm, + vlib_node_runtime_t * node, + vlib_frame_t * frame); + +void vnet_register_format_buffer_opaque_helper + (vnet_buffer_opquae_formatter_t fn); + +void vnet_register_format_buffer_opaque2_helper + (vnet_buffer_opquae_formatter_t fn); + +typedef struct +{ + u8 *filename; + int enable; + int status; + u32 packets_to_capture; + u32 max_bytes_per_pkt; + u8 rx_enable; + u8 tx_enable; + u8 drop_enable; + u32 sw_if_index; + int filter; +} vnet_pcap_dispatch_trace_args_t; + +int vnet_pcap_dispatch_trace_configure (vnet_pcap_dispatch_trace_args_t *); + #endif /* included_vnet_interface_h */ /*