(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,
_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) \
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;
/* 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);
[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
/* A sub-interface. */
VNET_SW_INTERFACE_TYPE_SUB,
VNET_SW_INTERFACE_TYPE_P2P,
+ VNET_SW_INTERFACE_TYPE_PIPE,
} vnet_sw_interface_type_t;
typedef struct
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. */
u32 link_speed;
- /* Receive and transmit layer 3 packet size limits (MRU/MTU). */
- u32 max_l3_packet_bytes[VLIB_N_RX_TX];
+ /* VNET_SW_INTERFACE_TYPE_HARDWARE. */
+ u32 hw_if_index;
- union
- {
- /* 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_SW_INTERFACE_TYPE_P2P. */
+ vnet_p2p_sub_interface_t p2p;
vnet_flood_class_t flood_class;
} vnet_sw_interface_t;
_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,