summaryrefslogtreecommitdiffstats
path: root/src/vnet/devices/af_packet/device.c
diff options
context:
space:
mode:
authorMohsin Kazmi <sykazmi@cisco.com>2022-03-18 16:58:31 +0000
committerDamjan Marion <dmarion@me.com>2022-03-23 18:47:15 +0000
commit219cbcb29fdcd9d76d7fe00c5a5e074f8e149083 (patch)
tree8d7addee9bb3e23dff3c3998cd2b06c1a6274f21 /src/vnet/devices/af_packet/device.c
parent8d7cdc808fdb810a843b48bfcca358cf083c04e8 (diff)
devices: af-packet v3 support
Type: feature CPU usage ~20% less than v2. Performance improvement 20% more than v2. High vector rate. Change-Id: I24bc594200f42664b59d07b44d44578e61068bbc Signed-off-by: Mohsin Kazmi <sykazmi@cisco.com>
Diffstat (limited to 'src/vnet/devices/af_packet/device.c')
-rw-r--r--src/vnet/devices/af_packet/device.c21
1 files changed, 10 insertions, 11 deletions
diff --git a/src/vnet/devices/af_packet/device.c b/src/vnet/devices/af_packet/device.c
index c8e59c3566c..23b18832cc8 100644
--- a/src/vnet/devices/af_packet/device.c
+++ b/src/vnet/devices/af_packet/device.c
@@ -83,9 +83,9 @@ format_af_packet_device (u8 * s, va_list * args)
u32 rx_frame_nr = apif->rx_req->tp_frame_nr;
u32 rx_block_nr = apif->rx_req->tp_block_nr;
int block = 0;
- u8 *tx_block_start = apif->tx_ring + block * tx_block_sz;
+ u8 *tx_block_start = apif->tx_ring[block];
u32 tx_frame = apif->next_tx_frame;
- struct tpacket2_hdr *tph;
+ tpacket3_hdr_t *tph;
s = format (s, "Linux PACKET socket interface\n");
s = format (s, "%UTX block size:%d nr:%d TX frame size:%d nr:%d\n",
@@ -100,7 +100,7 @@ format_af_packet_device (u8 * s, va_list * args)
int n_send_req = 0, n_avail = 0, n_sending = 0, n_tot = 0, n_wrong = 0;
do
{
- tph = (struct tpacket2_hdr *) (tx_block_start + tx_frame * tx_frame_sz);
+ tph = (struct tpacket3_hdr *) (tx_block_start + tx_frame * tx_frame_sz);
tx_frame = (tx_frame + 1) % tx_frame_nr;
if (tph->tp_status == 0)
n_avail++;
@@ -140,13 +140,12 @@ VNET_DEVICE_CLASS_TX_FN (af_packet_device_class) (vlib_main_t * vm,
af_packet_if_t *apif =
pool_elt_at_index (apm->interfaces, rd->dev_instance);
clib_spinlock_lock_if_init (&apif->lockp);
- int block = 0;
- u32 block_size = apif->tx_req->tp_block_size;
+ u32 block = 0;
u32 frame_size = apif->tx_req->tp_frame_size;
u32 frame_num = apif->tx_req->tp_frame_nr;
- u8 *block_start = apif->tx_ring + block * block_size;
+ u8 *block_start = apif->tx_ring[block];
u32 tx_frame = apif->next_tx_frame;
- struct tpacket2_hdr *tph;
+ tpacket3_hdr_t *tph;
u32 frame_not_ready = 0;
while (n_left)
@@ -158,7 +157,7 @@ VNET_DEVICE_CLASS_TX_FN (af_packet_device_class) (vlib_main_t * vm,
u32 bi = buffers[0];
buffers++;
- tph = (struct tpacket2_hdr *) (block_start + tx_frame * frame_size);
+ tph = (struct tpacket3_hdr *) (block_start + tx_frame * frame_size);
if (PREDICT_FALSE (tph->tp_status &
(TP_STATUS_SEND_REQUEST | TP_STATUS_SENDING)))
{
@@ -170,9 +169,9 @@ VNET_DEVICE_CLASS_TX_FN (af_packet_device_class) (vlib_main_t * vm,
{
b0 = vlib_get_buffer (vm, bi);
len = b0->current_length;
- clib_memcpy_fast ((u8 *) tph +
- TPACKET_ALIGN (sizeof (struct tpacket2_hdr)) +
- offset, vlib_buffer_get_current (b0), len);
+ clib_memcpy_fast (
+ (u8 *) tph + TPACKET_ALIGN (sizeof (struct tpacket3_hdr)) + offset,
+ vlib_buffer_get_current (b0), len);
offset += len;
}
while ((bi =