DPDK usage discussions
 help / color / mirror / Atom feed
From: "Dey, Souvik" <sodey@rbbn.com>
To: "dev@dpdk.org" <dev@dpdk.org>, "users@dpdk.org" <users@dpdk.org>,
	"beilei.xing@intel.com" <beilei.xing@intel.com>
Cc: "ferruh.yigit@intel.com" <ferruh.yigit@intel.com>,
	"qi.z.zhang@intel.com" <qi.z.zhang@intel.com>
Subject: Re: [dpdk-users] i40eVF pmd vlan id handling
Date: Mon, 13 Apr 2020 16:03:55 -0400	[thread overview]
Message-ID: <DM6PR03MB47778C63C046C461B9C0990BCDDD0@DM6PR03MB4777.namprd03.prod.outlook.com> (raw)
In-Reply-To: <DM6PR03MB477731A44BBA4F4A8D4E8EAECDDD0@DM6PR03MB4777.namprd03.prod.outlook.com>

On debugging further it looks like that linux driver enables vlan_striping by default when VIRTCHNL_OP_ADD_VLAN is sent to the PF.

static int i40e_vc_add_vlan_msg(struct i40e_vf *vf, u8 *msg)
{
      .....
      i40e_vlan_stripping_enable(vsi);
      ....
}

Due to this when ever we enable vlan on i40e the van is stripped by default while sending it to the Guest. This could be handled by the below patch in DPDK :
In file i40e_ethdev_vf.c
static int
i40evf_add_vlan(struct rte_eth_dev *dev, uint16_t vlanid)
{
      struct i40e_vf *vf = I40EVF_DEV_PRIVATE_TO_VF(dev->data->dev_private);
      struct virtchnl_vlan_filter_list *vlan_list;
      uint8_t cmd_buffer[sizeof(struct virtchnl_vlan_filter_list) +
                                          sizeof(uint16_t)];
      int err;
      struct vf_cmd_info args;

      vlan_list = (struct virtchnl_vlan_filter_list *)cmd_buffer;
      vlan_list->vsi_id = vf->vsi_res->vsi_id;
      vlan_list->num_elements = 1;
      vlan_list->vlan_id[0] = vlanid;

      args.ops = VIRTCHNL_OP_ADD_VLAN;
      args.in_args = (u8 *)&cmd_buffer;
      args.in_args_size = sizeof(cmd_buffer);
      args.out_buffer = vf->aq_resp;
      args.out_size = I40E_AQ_BUF_SZ;
      err = i40evf_execute_vf_cmd(dev, &args);
      if (err)
            PMD_DRV_LOG(ERR, "fail to execute command OP_ADD_VLAN");
+     if (!(dev_conf->rxmode.offloads & DEV_RX_OFFLOAD_VLAN_STRIP)) {
+           i40evf_disable_vlan_strip(dev);
+     }
      return err;
}
Or we need to call . vlan_offload_set after doing . vlan_filter_set from the DPDK app ?

--
Regards,
Souvik

From: Dey, Souvik
Sent: Monday, April 13, 2020 12:04 PM
To: dev@dpdk.org; users@dpdk.org; beilei.xing@intel.com
Cc: ferruh.yigit@intel.com; qi.z.zhang@intel.com
Subject: i40eVF pmd vlan id handling

Hi All,
        I am using DPDK 18.11.2 and i40e PF linux driver on the host 2.4.6. I see there, when I enable DEV_RX_OFFLOAD_VLAN_FILTER from the DPDK app, and then configure the specific vlan id using rte_eth_dev_vlan_filter(). As per DPDK code by default when we do dev_configure, we call i40evf_init_vlan() and if we don't enable rxmode.offloads with DEV_RX_OFFLOAD_VLAN_STRIP, then we should send VIRTCHNL_OP_DISABLE_VLAN_STRIPPING command to the PF from the guest.

With more debugging enabled, when DPDK requests VLAN filtering by sending VIRTCHNL_OP_ADD_VLAN to the PF, then we see that the VF stripping is enabled also on Linux. If we don't add VLAN ID and send VIRTCHNL_OP_ADD_VLAN message down to the PF , then we do receive packets with VLAN ID set.

The same works fine in VmWare drivers, where we do receive VALN id in the packets if STRIP is disabled.

In the linux case, when we receive frames with VLAN headers, the vlan id is stripped at the PF, and the TCI will record the missing VLAN details when handed up to the DPDK driver.

With i40e debug enabled, it's clear to see the difference being reported in i40e_rxd_to_vlan_tci:


Example using VLAN on i40evf SR-IOV (vlan fails):
  PMD: i40e_rxd_to_vlan_tci(): Mbuf vlan_tci: 8, vlan_tci_outer: 0
  Port 0 pkt-len=60 nb-segs=1
    ETH:  src=00:10:E0:8D:A7:52 dst=FF:FF:FF:FF:FF:FF type=0x0806
    ARP:  hrd=1 proto=0x0800 hln=6 pln=4 op=1 (ARP Request)
          sha=00:10:E0:8D:A7:52 sip=8.8.8.102
          tha=00:00:00:00:00:00 tip=8.8.8.3

As the application requested tagging not be stripped, and the hardware driver was not able to disable strip, in my opinion either DPDK or linux driver should have a bug in handing this. Also as we see VmWare i40e driver working it could be either a extra config required for linux driver or a bug in linux driver.

I also tried to add a call to rte_vlan_insert() to reinstate the VLAN header using the data from TCI in i40e_rxd_to_vlan_tci(), but it is having performance impacts as expected. Also as rte_vlan_insert() does not support QINQ, it will have other issues too.

Can you please clarify if this is working for i40e vlan filter test and if we are missing something in the DPDK, like sending VIRTCHNL_OP_DISABLE_VLAN_STRIPPING after every VIRTCHNL_OP_ADD_VLAN if DEV_RX_OFFLOAD_VLAN_STRIP is not set by the DPDk app.

--
Regards,
Souvik


  reply	other threads:[~2020-04-13 20:04 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-04-13 16:04 Dey, Souvik
2020-04-13 20:03 ` Dey, Souvik [this message]
2020-04-14  6:37   ` Xing, Beilei
2020-04-16 14:05     ` Dey, Souvik

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=DM6PR03MB47778C63C046C461B9C0990BCDDD0@DM6PR03MB4777.namprd03.prod.outlook.com \
    --to=sodey@rbbn.com \
    --cc=beilei.xing@intel.com \
    --cc=dev@dpdk.org \
    --cc=ferruh.yigit@intel.com \
    --cc=qi.z.zhang@intel.com \
    --cc=users@dpdk.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).