Hello All,

Specifics:
   DPDK Version: dpdk-stable-18.11.11
   Linux Kernel: 4.19.87
   Intel 64-bit architecture

I am working on a code to support our socket based processes that need to run on our DPDK-enabled platform. I am using the virtio_user exception path mechanism to support this and initial tests seem fine.

However, I am seeing issues when we receive the packet from the virtio port, 
that
the packet_type field is not set.

In my code, I have setup my physical PMD (i40e) as etherdev 0 and etherdev 1 and have setup the virtual side with virtio as etherdev 2 and etherdev 3.

I am pairing this as etherdev 0 (physical) to etherdev 2 (virtio_user0) and
etherdev 1 (physical) to etherdev 3 (virtio_user1).

I am using the EAL function `rte_eal_hotplug_add()` as suggested in the documentation.

I have added code in my dispatch function to generate a syslog(3) to print the
contents of the packet_type field in the received mbuf.

I then generate traffic to etherdev 1 from connected host and I am seeing the following:

The inbound packet log shows -

Dec 7 21:24:45 2024 pmahan-dpdk pktdaemon-eal[27614]: CPU 2 TID 1140607382984128: [pktdaemon.NOTICE]: pkt_dpdk::switch_q_pkts()[2][1=>3][Q=0]: mbuf packet type is 0x00000091

So etherdev 1 packet (physical) has packet_type of 0x91 which translates to
   RTE_PTYPE_L2_ETHER
   RTE_PTYPE_L3_IPV4_EXT_UNKNOWN

Which has been my experience for receiving packets from the physical PMD. However, now that I have added the virtio port, the return packet does not seemed to have this value set -

Dec 7 21:24:45 2024 pmahan-dpdk pktdaemon-eal[27614]: CPU 2 TID 1140607382984128: [pktdaemon.NOTICE]: pkt_dpdk::switch_q_pkts()[2][3=>1][Q=0]: mbuf packet type is 0x00000000

I have looked into virtio PMD code and see that there is a function to fill in the packet type called `virtio_rx_offload()` but it is only called if the hardware associated with the virtual queue supports offloading and then only if the `virtio_net_hdr` has no flags or its `gso_type` is not GSO_NONE.

If I ignore the flags and just inject the packets directly, everything seems to work, but I have internal code that needs to know the basic ethernet type as well as the L3 options and I was hoping to rely on the packet_type of the mbuf instead of having to do packet groveling.

Is this an "as designed" or am I missing something in the configuration?

Thanks for any pointers,

Patrick

Reply via email to