net/i40e: fix single VLAN tag to be outer VLAN tag

In current i40e codebase, if single VLAN header is added in a packet,
it's treated as inner VLAN. Generally, a single VLAN header is
treated as the outer VLAN header, so update the driver behaviour
appropriately.

Fixes: 19b16e2f64 ("ethdev: add vlan type when setting ether type")

Signed-off-by: Beilei Xing <beilei.xing@intel.com>
This commit is contained in:
Beilei Xing 2016-06-22 10:53:51 +08:00 committed by Bruce Richardson
parent 40d941a517
commit 5b2d37858d
3 changed files with 29 additions and 11 deletions

View File

@ -178,6 +178,13 @@ Drivers
info to descriptor.
Now this issue is fixed by disabling vlan stripping from inner header.
* **i40e: Fixed the type issue of a single VLAN type.**
Currently, if a single VLAN header is added in a packet, it's treated
as inner VLAN. But generally, a single VLAN header is treated as the
outer VLAN header.
This issue is fixed by changing corresponding register for single VLAN.
Libraries
~~~~~~~~~

View File

@ -927,12 +927,6 @@ eth_i40e_dev_init(struct rte_eth_dev *dev)
"VLAN ether type");
goto err_setup_pf_switch;
}
ret = i40e_vlan_tpid_set(dev, ETH_VLAN_TYPE_INNER, ETHER_TYPE_VLAN);
if (ret != I40E_SUCCESS) {
PMD_INIT_LOG(ERR, "Failed to set the default outer "
"VLAN ether type");
goto err_setup_pf_switch;
}
/* PF setup, which includes VSI setup */
ret = i40e_pf_setup(pf);
@ -2493,13 +2487,24 @@ i40e_vlan_tpid_set(struct rte_eth_dev *dev,
uint64_t reg_r = 0, reg_w = 0;
uint16_t reg_id = 0;
int ret = 0;
int qinq = dev->data->dev_conf.rxmode.hw_vlan_extend;
switch (vlan_type) {
case ETH_VLAN_TYPE_OUTER:
reg_id = 2;
if (qinq)
reg_id = 2;
else
reg_id = 3;
break;
case ETH_VLAN_TYPE_INNER:
reg_id = 3;
if (qinq)
reg_id = 3;
else {
ret = -EINVAL;
PMD_DRV_LOG(ERR,
"Unsupported vlan type in single vlan.\n");
return ret;
}
break;
default:
ret = -EINVAL;
@ -2561,8 +2566,14 @@ i40e_vlan_offload_set(struct rte_eth_dev *dev, int mask)
}
if (mask & ETH_VLAN_EXTEND_MASK) {
if (dev->data->dev_conf.rxmode.hw_vlan_extend)
if (dev->data->dev_conf.rxmode.hw_vlan_extend) {
i40e_vsi_config_double_vlan(vsi, TRUE);
/* Set global registers with default ether type value */
i40e_vlan_tpid_set(dev, ETH_VLAN_TYPE_OUTER,
ETHER_TYPE_VLAN);
i40e_vlan_tpid_set(dev, ETH_VLAN_TYPE_INNER,
ETHER_TYPE_VLAN);
}
else
i40e_vsi_config_double_vlan(vsi, FALSE);
}

View File

@ -363,8 +363,8 @@ struct rte_eth_rxmode {
*/
enum rte_vlan_type {
ETH_VLAN_TYPE_UNKNOWN = 0,
ETH_VLAN_TYPE_INNER, /**< Single VLAN, or inner VLAN. */
ETH_VLAN_TYPE_OUTER, /**< Outer VLAN. */
ETH_VLAN_TYPE_INNER, /**< Inner VLAN. */
ETH_VLAN_TYPE_OUTER, /**< Single VLAN, or outer VLAN. */
ETH_VLAN_TYPE_MAX,
};