devices: add multi-queue support for af-packet
[vpp.git] / src / vnet / devices / af_packet / af_packet.h
index d7d16b9..4cae700 100644 (file)
  *------------------------------------------------------------------
  */
 
+#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,
@@ -32,29 +38,70 @@ typedef struct
   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;
-  af_packet_if_mode_t mode;
+  u32 dev_instance;
+
+  af_packet_ring_t *rings;
 } af_packet_if_t;
 
 typedef struct
@@ -80,6 +127,8 @@ typedef struct
   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 */