devices: add multi-queue support for af-packet
[vpp.git] / src / vnet / devices / af_packet / af_packet.h
index b4621f6..4cae700 100644 (file)
  *------------------------------------------------------------------
  */
 
-#include <vppinfra/lock.h>
+#include <linux/if_packet.h>
 
+#include <vppinfra/lock.h>
 #include <vlib/log.h>
 
+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;
+  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
@@ -54,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;
 
@@ -67,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;