net/i40e: fix DDP profile DEL operation
Customized info will be updated when processing DDP package, including PCYPE/PTYPE/protocol. Previously, the customized info is updated without any check for package operation - ADD or DEL, but only covers ADD operation. In this situation, even if a package is being removed, new PCTYPE/PTYPE/protocol will still be created, it will cause wrong parsing for SW. This patch cleans new PCTYPE/PTYPE/protocol created when a package is being removed. Fixes: e163c18a15b0 ("net/i40e: update ptype and pctype info") Cc: stable@dpdk.org Signed-off-by: Beilei Xing <beilei.xing@intel.com> Acked-by: Jingjing Wu <jingjing.wu@intel.com>
This commit is contained in:
parent
e3075e969e
commit
0585f5c3d2
@ -11536,7 +11536,8 @@ i40e_find_customized_pctype(struct i40e_pf *pf, uint8_t index)
|
||||
static int
|
||||
i40e_update_customized_pctype(struct rte_eth_dev *dev, uint8_t *pkg,
|
||||
uint32_t pkg_size, uint32_t proto_num,
|
||||
struct rte_pmd_i40e_proto_info *proto)
|
||||
struct rte_pmd_i40e_proto_info *proto,
|
||||
enum rte_pmd_i40e_package_op op)
|
||||
{
|
||||
struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
|
||||
uint32_t pctype_num;
|
||||
@ -11549,6 +11550,12 @@ i40e_update_customized_pctype(struct rte_eth_dev *dev, uint8_t *pkg,
|
||||
uint32_t i, j, n;
|
||||
int ret;
|
||||
|
||||
if (op != RTE_PMD_I40E_PKG_OP_WR_ADD &&
|
||||
op != RTE_PMD_I40E_PKG_OP_WR_DEL) {
|
||||
PMD_DRV_LOG(ERR, "Unsupported operation.");
|
||||
return -1;
|
||||
}
|
||||
|
||||
ret = rte_pmd_i40e_get_ddp_info(pkg, pkg_size,
|
||||
(uint8_t *)&pctype_num, sizeof(pctype_num),
|
||||
RTE_PMD_I40E_PKG_INFO_PCTYPE_NUM);
|
||||
@ -11611,8 +11618,13 @@ i40e_update_customized_pctype(struct rte_eth_dev *dev, uint8_t *pkg,
|
||||
i40e_find_customized_pctype(pf,
|
||||
I40E_CUSTOMIZED_GTPU);
|
||||
if (new_pctype) {
|
||||
new_pctype->pctype = pctype_value;
|
||||
new_pctype->valid = true;
|
||||
if (op == RTE_PMD_I40E_PKG_OP_WR_ADD) {
|
||||
new_pctype->pctype = pctype_value;
|
||||
new_pctype->valid = true;
|
||||
} else {
|
||||
new_pctype->pctype = I40E_FILTER_PCTYPE_INVALID;
|
||||
new_pctype->valid = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -11622,8 +11634,9 @@ i40e_update_customized_pctype(struct rte_eth_dev *dev, uint8_t *pkg,
|
||||
|
||||
static int
|
||||
i40e_update_customized_ptype(struct rte_eth_dev *dev, uint8_t *pkg,
|
||||
uint32_t pkg_size, uint32_t proto_num,
|
||||
struct rte_pmd_i40e_proto_info *proto)
|
||||
uint32_t pkg_size, uint32_t proto_num,
|
||||
struct rte_pmd_i40e_proto_info *proto,
|
||||
enum rte_pmd_i40e_package_op op)
|
||||
{
|
||||
struct rte_pmd_i40e_ptype_mapping *ptype_mapping;
|
||||
uint16_t port_id = dev->data->port_id;
|
||||
@ -11636,6 +11649,17 @@ i40e_update_customized_ptype(struct rte_eth_dev *dev, uint8_t *pkg,
|
||||
bool in_tunnel;
|
||||
int ret;
|
||||
|
||||
if (op != RTE_PMD_I40E_PKG_OP_WR_ADD &&
|
||||
op != RTE_PMD_I40E_PKG_OP_WR_DEL) {
|
||||
PMD_DRV_LOG(ERR, "Unsupported operation.");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (op == RTE_PMD_I40E_PKG_OP_WR_DEL) {
|
||||
rte_pmd_i40e_ptype_mapping_reset(port_id);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* get information about new ptype num */
|
||||
ret = rte_pmd_i40e_get_ddp_info(pkg, pkg_size,
|
||||
(uint8_t *)&ptype_num, sizeof(ptype_num),
|
||||
@ -11808,7 +11832,7 @@ i40e_update_customized_ptype(struct rte_eth_dev *dev, uint8_t *pkg,
|
||||
|
||||
void
|
||||
i40e_update_customized_info(struct rte_eth_dev *dev, uint8_t *pkg,
|
||||
uint32_t pkg_size)
|
||||
uint32_t pkg_size, enum rte_pmd_i40e_package_op op)
|
||||
{
|
||||
struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
|
||||
uint32_t proto_num;
|
||||
@ -11817,6 +11841,12 @@ i40e_update_customized_info(struct rte_eth_dev *dev, uint8_t *pkg,
|
||||
uint32_t i;
|
||||
int ret;
|
||||
|
||||
if (op != RTE_PMD_I40E_PKG_OP_WR_ADD &&
|
||||
op != RTE_PMD_I40E_PKG_OP_WR_DEL) {
|
||||
PMD_DRV_LOG(ERR, "Unsupported operation.");
|
||||
return;
|
||||
}
|
||||
|
||||
/* get information about protocol number */
|
||||
ret = rte_pmd_i40e_get_ddp_info(pkg, pkg_size,
|
||||
(uint8_t *)&proto_num, sizeof(proto_num),
|
||||
@ -11850,20 +11880,23 @@ i40e_update_customized_info(struct rte_eth_dev *dev, uint8_t *pkg,
|
||||
/* Check if GTP is supported. */
|
||||
for (i = 0; i < proto_num; i++) {
|
||||
if (!strncmp(proto[i].name, "GTP", 3)) {
|
||||
pf->gtp_support = true;
|
||||
if (op == RTE_PMD_I40E_PKG_OP_WR_ADD)
|
||||
pf->gtp_support = true;
|
||||
else
|
||||
pf->gtp_support = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Update customized pctype info */
|
||||
ret = i40e_update_customized_pctype(dev, pkg, pkg_size,
|
||||
proto_num, proto);
|
||||
proto_num, proto, op);
|
||||
if (ret)
|
||||
PMD_DRV_LOG(INFO, "No pctype is updated.");
|
||||
|
||||
/* Update customized ptype info */
|
||||
ret = i40e_update_customized_ptype(dev, pkg, pkg_size,
|
||||
proto_num, proto);
|
||||
proto_num, proto, op);
|
||||
if (ret)
|
||||
PMD_DRV_LOG(INFO, "No ptype is updated.");
|
||||
|
||||
|
@ -11,6 +11,7 @@
|
||||
#include <rte_hash.h>
|
||||
#include <rte_flow_driver.h>
|
||||
#include <rte_tm_driver.h>
|
||||
#include "rte_pmd_i40e.h"
|
||||
|
||||
#define I40E_VLAN_TAG_SIZE 4
|
||||
|
||||
@ -1209,7 +1210,8 @@ void i40e_tm_conf_uninit(struct rte_eth_dev *dev);
|
||||
struct i40e_customized_pctype*
|
||||
i40e_find_customized_pctype(struct i40e_pf *pf, uint8_t index);
|
||||
void i40e_update_customized_info(struct rte_eth_dev *dev, uint8_t *pkg,
|
||||
uint32_t pkg_size);
|
||||
uint32_t pkg_size,
|
||||
enum rte_pmd_i40e_package_op op);
|
||||
int i40e_dcb_init_configure(struct rte_eth_dev *dev, bool sw_dcb);
|
||||
int i40e_flush_queue_region_all_conf(struct rte_eth_dev *dev,
|
||||
struct i40e_hw *hw, struct i40e_pf *pf, uint16_t on);
|
||||
|
@ -2401,7 +2401,7 @@ i40e_flow_fdir_get_pctype_value(struct i40e_pf *pf,
|
||||
break;
|
||||
}
|
||||
|
||||
if (cus_pctype)
|
||||
if (cus_pctype && cus_pctype->valid)
|
||||
return cus_pctype->pctype;
|
||||
|
||||
return I40E_FILTER_PCTYPE_INVALID;
|
||||
|
@ -1610,8 +1610,6 @@ rte_pmd_i40e_process_ddp_package(uint16_t port, uint8_t *buff,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
i40e_update_customized_info(dev, buff, size);
|
||||
|
||||
/* Find metadata segment */
|
||||
metadata_seg_hdr = i40e_find_segment_in_package(SEGMENT_TYPE_METADATA,
|
||||
pkg_hdr);
|
||||
@ -1715,6 +1713,10 @@ rte_pmd_i40e_process_ddp_package(uint16_t port, uint8_t *buff,
|
||||
}
|
||||
}
|
||||
|
||||
if (op == RTE_PMD_I40E_PKG_OP_WR_ADD ||
|
||||
op == RTE_PMD_I40E_PKG_OP_WR_DEL)
|
||||
i40e_update_customized_info(dev, buff, size, op);
|
||||
|
||||
rte_free(profile_info_sec);
|
||||
return status;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user