X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Finterface.h;h=f6f486e4591286bcb8ac35ccd7a8d93c4235189a;hb=53fffa1;hp=d869b0c70a22a13e28ae8acbfdfc7738a1c76fa2;hpb=1855b8e48d95289cc9f0a6e339f2148d64ac705c;p=vpp.git diff --git a/src/vnet/interface.h b/src/vnet/interface.h index d869b0c70a2..f6f486e4591 100644 --- a/src/vnet/interface.h +++ b/src/vnet/interface.h @@ -40,7 +40,8 @@ #ifndef included_vnet_interface_h #define included_vnet_interface_h -#include +#include +#include #include struct vnet_main_t; @@ -69,7 +70,8 @@ typedef clib_error_t *(vnet_subif_add_del_function_t) /* Interface set mac address callback. */ typedef clib_error_t *(vnet_interface_set_mac_address_function_t) - (struct vnet_hw_interface_t * hi, char *address); + (struct vnet_hw_interface_t * hi, + const u8 * old_address, const u8 * new_address); /* Interface set rx mode callback. */ typedef clib_error_t *(vnet_interface_set_rx_mode_function_t) @@ -89,7 +91,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, @@ -108,6 +110,7 @@ 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; +#ifndef CLIB_MARCH_VARIANT #define _VNET_INTERFACE_FUNCTION_DECL_PRIO(f,tag,p) \ \ static void __vnet_interface_function_init_##tag##_##f (void) \ @@ -146,6 +149,12 @@ static void __vnet_interface_function_deinit_##tag##_##f (void) \ next = next->next_interface_function; \ } \ } +#else +/* create unused pointer to silence compiler warnings and get whole + function optimized out */ +#define _VNET_INTERFACE_FUNCTION_DECL_PRIO(f,tag,p) \ +static __clib_unused void * __clib_unused_##f = f; +#endif #define _VNET_INTERFACE_FUNCTION_DECL(f,tag) \ _VNET_INTERFACE_FUNCTION_DECL_PRIO(f,tag,VNET_ITF_FUNC_PRIORITY_LOW) @@ -195,6 +204,9 @@ typedef struct _vnet_device_class /* Transmit function. */ vlib_node_function_t *tx_function; + /* Transmit function candidate registration with priority */ + vlib_node_fn_registration_t *tx_fn_registrations; + /* Error strings indexed by error code for this node. */ char **tx_function_error_strings; @@ -245,6 +257,7 @@ typedef struct _vnet_device_class vnet_interface_set_mac_address_function_t *mac_addr_change_function; } vnet_device_class_t; +#ifndef CLIB_MARCH_VARIANT #define VNET_DEVICE_CLASS(x,...) \ __VA_ARGS__ vnet_device_class_t x; \ static void __vnet_add_device_class_registration_##x (void) \ @@ -264,6 +277,30 @@ static void __vnet_rm_device_class_registration_##x (void) \ &x, next_class_registration); \ } \ __VA_ARGS__ vnet_device_class_t x +#else +/* create unused pointer to silence compiler warnings and get whole + function optimized out */ +#define VNET_DEVICE_CLASS(x,...) \ +static __clib_unused vnet_device_class_t __clib_unused_##x +#endif + +#define VNET_DEVICE_CLASS_TX_FN(devclass) \ +uword CLIB_MARCH_SFX (devclass##_tx_fn)(); \ +static vlib_node_fn_registration_t \ + CLIB_MARCH_SFX(devclass##_tx_fn_registration) = \ + { .function = &CLIB_MARCH_SFX (devclass##_tx_fn), }; \ + \ +static void __clib_constructor \ +CLIB_MARCH_SFX (devclass##_tx_fn_multiarch_register) (void) \ +{ \ + extern vnet_device_class_t devclass; \ + vlib_node_fn_registration_t *r; \ + r = &CLIB_MARCH_SFX (devclass##_tx_fn_registration); \ + r->priority = CLIB_MARCH_FN_PRIORITY(); \ + r->next_registration = devclass.tx_fn_registrations; \ + devclass.tx_fn_registrations = r; \ +} \ +uword CLIB_CPU_OPTIMIZED CLIB_MARCH_SFX (devclass##_tx_fn) #define VLIB_DEVICE_TX_FUNCTION_CLONE_TEMPLATE(arch, fn, tgt) \ uword \ @@ -393,7 +430,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); @@ -446,57 +483,41 @@ 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), +} 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 +{ + /* Interface name. */ + u8 *name; - /* rx mode flags */ -#define VNET_HW_INTERFACE_FLAG_SUPPORTS_INT_MODE (1 << 16) + /* flags */ + vnet_hw_interface_flags_t flags; - /* 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). */ @@ -650,7 +671,8 @@ 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), @@ -694,8 +716,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; @@ -836,7 +856,7 @@ 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)) + while (clib_atomic_test_and_set (im->sw_if_counter_lock)) /* zzzz */ ; } @@ -844,7 +864,7 @@ 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_atomic_release (im->sw_if_counter_lock); } void vnet_pcap_drop_trace_filter_add_del (u32 error_index, int is_add);