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);
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);
+
typedef enum vnet_interface_function_priority_t_
{
VNET_ITF_FUNC_PRIORITY_LOW,
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) \
init_function.fp = (void *) &f; \
}
+#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) \
/* 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;
+
/* Redistribute flag changes/existence of this interface class. */
u32 redistribute;
/* 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;
VNET_LINK_MPLS,
VNET_LINK_ETHERNET,
VNET_LINK_ARP,
+ VNET_LINK_NSH,
} __attribute__ ((packed)) vnet_link_t;
#define VNET_LINKS { \
[VNET_LINK_IP6] = "ipv6", \
[VNET_LINK_MPLS] = "mpls", \
[VNET_LINK_ARP] = "arp", \
+ [VNET_LINK_NSH] = "nsh", \
}
/**
* @brief Number of link types. Not part of the enum so it does not have to be included in
* switch statements
*/
-#define VNET_LINK_NUM (VNET_LINK_ARP+1)
+#define VNET_LINK_NUM (VNET_LINK_NSH+1)
/**
* @brief Convert a link to to an Ethertype
#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 << 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). */
/* 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;
#define VNET_HW_INTERFACE_BOND_INFO_NONE ((uword *) 0)
#define VNET_HW_INTERFACE_BOND_INFO_SLAVE ((uword *) ~0)
+ /* Input node */
+ u32 input_node_index;
+
+ /* input node cpu index by queue */
+ u32 *input_node_thread_index_by_queue;
+
+ /* 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;
+
} vnet_hw_interface_t;
extern vnet_device_class_t vnet_local_interface_device_class;
/* A sub-interface. */
VNET_SW_INTERFACE_TYPE_SUB,
+ VNET_SW_INTERFACE_TYPE_P2P,
} vnet_sw_interface_type_t;
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
{
/* Always flood */
#define VNET_SW_INTERFACE_FLAG_BOND_SLAVE (1 << 4)
+ /* 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;
/* 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;
/* Combined counters. */
VNET_INTERFACE_COUNTER_RX = 0,
VNET_INTERFACE_COUNTER_TX = 1,
- VNET_N_COMBINED_INTERFACE_COUNTER = 2,
+ VNET_INTERFACE_COUNTER_RX_UNICAST = 2,
+ VNET_INTERFACE_COUNTER_TX_UNICAST = 3,
+ VNET_INTERFACE_COUNTER_RX_MULTICAST = 4,
+ VNET_INTERFACE_COUNTER_TX_MULTICAST = 5,
+ VNET_INTERFACE_COUNTER_RX_BROADCAST = 6,
+ VNET_INTERFACE_COUNTER_TX_BROADCAST = 7,
+ VNET_N_COMBINED_INTERFACE_COUNTER = 8,
} vnet_interface_counter_type_t;
+#define foreach_combined_interface_counter(X) \
+ X(VNET_INTERFACE_COUNTER_RX, rx) \
+ X(VNET_INTERFACE_COUNTER_TX, tx) \
+ X(VNET_INTERFACE_COUNTER_RX_UNICAST, rx_unicast) \
+ X(VNET_INTERFACE_COUNTER_TX_UNICAST, tx_unicast) \
+ X(VNET_INTERFACE_COUNTER_RX_MULTICAST, rx_multicast) \
+ X(VNET_INTERFACE_COUNTER_TX_MULTICAST, tx_multicast) \
+ X(VNET_INTERFACE_COUNTER_RX_BROADCAST, rx_broadcast) \
+ X(VNET_INTERFACE_COUNTER_TX_BROADCAST, tx_broadcast)
+
+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;