X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fdevices%2Faf_packet%2Faf_packet.h;h=4cae700909a89118cc1c4db9601645020a5fcf8d;hb=5a7aa51f0;hp=fc35b48b85e492954cbedc0a1e1e2bc7274b1b69;hpb=ffc6bdcd38b8209050671d3d86f943c37887a7b7;p=vpp.git diff --git a/src/vnet/devices/af_packet/af_packet.h b/src/vnet/devices/af_packet/af_packet.h index fc35b48b85e..4cae700909a 100644 --- a/src/vnet/devices/af_packet/af_packet.h +++ b/src/vnet/devices/af_packet/af_packet.h @@ -17,38 +17,91 @@ *------------------------------------------------------------------ */ -#include +#include +#include #include +typedef struct tpacket_block_desc block_desc_t; +typedef struct tpacket_req3 tpacket_req3_t; +typedef struct tpacket3_hdr tpacket3_hdr_t; + +typedef enum +{ + AF_PACKET_IF_MODE_ETHERNET = 1, + AF_PACKET_IF_MODE_IP = 2 +} af_packet_if_mode_t; + typedef struct { u32 sw_if_index; u8 host_if_name[64]; } af_packet_if_detail_t; +typedef struct +{ + u8 *ring_start_addr; + u32 ring_size; +} af_packet_ring_t; + typedef struct { CLIB_CACHE_LINE_ALIGN_MARK (cacheline0); clib_spinlock_t lockp; - u8 *host_if_name; - int host_if_index; int fd; - struct tpacket_req *rx_req; - struct tpacket_req *tx_req; - u8 *rx_ring; - u8 *tx_ring; - u32 hw_if_index; - u32 sw_if_index; + union + { + tpacket_req3_t *rx_req; + tpacket_req3_t *tx_req; + }; + + union + { + u8 **rx_ring; + u8 **tx_ring; + }; + + union + { + u32 next_rx_block; + u32 next_tx_frame; + }; + + u16 queue_id; + u32 queue_index; + u32 clib_file_index; - u32 next_rx_frame; - u32 next_tx_frame; + u32 rx_frame_offset; + u16 num_rx_pkts; + u8 is_rx_pending; + vnet_hw_if_rx_mode mode; +} af_packet_queue_t; +typedef struct +{ + CLIB_CACHE_LINE_ALIGN_MARK (cacheline0); + u32 hw_if_index; + u32 sw_if_index; u32 per_interface_next_index; + af_packet_if_mode_t mode; u8 is_admin_up; - u32 queue_index; + u8 is_cksum_gso_enabled; + + af_packet_queue_t *rx_queues; + af_packet_queue_t *tx_queues; + + u8 num_rxqs; + u8 num_txqs; + + u8 *host_if_name; + int host_if_index; + u32 hdrlen; + u32 host_mtu; + u32 dev_instance; + + af_packet_ring_t *rings; } af_packet_if_t; typedef struct @@ -56,9 +109,6 @@ typedef struct CLIB_CACHE_LINE_ALIGN_MARK (cacheline0); af_packet_if_t *interfaces; - /* bitmap of pending rx interfaces */ - uword *pending_input_bitmap; - /* rx buffer cache */ u32 **rx_buffers; @@ -69,15 +119,29 @@ typedef struct vlib_log_class_t log_class; } af_packet_main_t; +typedef struct +{ + u8 *host_if_name; + u8 *hw_addr; + u32 rx_frame_size; + u32 tx_frame_size; + u32 rx_frames_per_block; + u32 tx_frames_per_block; + u8 num_rxqs; + u8 num_txqs; + af_packet_if_mode_t mode; + + /* return */ + u32 sw_if_index; +} af_packet_create_if_arg_t; + extern af_packet_main_t af_packet_main; extern vnet_device_class_t af_packet_device_class; extern vlib_node_registration_t af_packet_input_node; -int af_packet_create_if (vlib_main_t * vm, u8 * host_if_name, - u8 * hw_addr_set, u32 * sw_if_index); -int af_packet_delete_if (vlib_main_t * vm, u8 * host_if_name); -int af_packet_set_l4_cksum_offload (vlib_main_t * vm, u32 sw_if_index, - u8 set); +int af_packet_create_if (af_packet_create_if_arg_t *arg); +int af_packet_delete_if (u8 *host_if_name); +int af_packet_set_l4_cksum_offload (u32 sw_if_index, u8 set); int af_packet_dump_ifs (af_packet_if_detail_t ** out_af_packet_ifs); format_function_t format_af_packet_device_name;