net/bnxt: support meta flow items to match on traffic source
Add support for items PORT_REPRESENTOR and REPRESENTED_PORT based on the existing support for item PORT_ID. The use of item PORT_ID depends on the specified direction attribute. Items PORT_REPRESENTOR and REPRESENTED_PORT, in turn, define traffic direction themselves. The former matches traffic from the driver's vNIC. The latter matches packets from either a v-port (network) or a VF's vNIC (if the driver's port is a VF representor). Signed-off-by: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
This commit is contained in:
parent
9d2a349b38
commit
a8321e0979
@ -64,6 +64,8 @@ icmp6 = Y
|
||||
pf = Y
|
||||
phy_port = Y
|
||||
port_id = Y
|
||||
port_representor = Y
|
||||
represented_port = Y
|
||||
tcp = Y
|
||||
udp = Y
|
||||
vf = Y
|
||||
|
@ -266,7 +266,7 @@ struct bnxt_ulp_rte_hdr_info ulp_hdr_info[] = {
|
||||
},
|
||||
[RTE_FLOW_ITEM_TYPE_PORT_ID] = {
|
||||
.hdr_type = BNXT_ULP_HDR_TYPE_SUPPORTED,
|
||||
.proto_hdr_func = ulp_rte_port_id_hdr_handler
|
||||
.proto_hdr_func = ulp_rte_port_hdr_handler
|
||||
},
|
||||
[RTE_FLOW_ITEM_TYPE_RAW] = {
|
||||
.hdr_type = BNXT_ULP_HDR_TYPE_NOT_SUPPORTED,
|
||||
@ -427,6 +427,14 @@ struct bnxt_ulp_rte_hdr_info ulp_hdr_info[] = {
|
||||
[RTE_FLOW_ITEM_TYPE_HIGIG2] = {
|
||||
.hdr_type = BNXT_ULP_HDR_TYPE_NOT_SUPPORTED,
|
||||
.proto_hdr_func = NULL
|
||||
},
|
||||
[RTE_FLOW_ITEM_TYPE_PORT_REPRESENTOR] = {
|
||||
.hdr_type = BNXT_ULP_HDR_TYPE_SUPPORTED,
|
||||
.proto_hdr_func = ulp_rte_port_hdr_handler
|
||||
},
|
||||
[RTE_FLOW_ITEM_TYPE_REPRESENTED_PORT] = {
|
||||
.hdr_type = BNXT_ULP_HDR_TYPE_SUPPORTED,
|
||||
.proto_hdr_func = ulp_rte_port_hdr_handler
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -400,7 +400,8 @@ bnxt_ulp_rte_parser_direction_compute(struct ulp_rte_parser_params *params)
|
||||
static int32_t
|
||||
ulp_rte_parser_svif_set(struct ulp_rte_parser_params *params,
|
||||
uint32_t ifindex,
|
||||
uint16_t mask)
|
||||
uint16_t mask,
|
||||
enum bnxt_ulp_direction_type item_dir)
|
||||
{
|
||||
uint16_t svif;
|
||||
enum bnxt_ulp_direction_type dir;
|
||||
@ -429,11 +430,14 @@ ulp_rte_parser_svif_set(struct ulp_rte_parser_params *params,
|
||||
bnxt_ulp_rte_parser_direction_compute(params);
|
||||
|
||||
/* Get the computed direction */
|
||||
dir = ULP_COMP_FLD_IDX_RD(params, BNXT_ULP_CF_IDX_DIRECTION);
|
||||
if (dir == BNXT_ULP_DIR_INGRESS) {
|
||||
dir = (item_dir != BNXT_ULP_DIR_INVALID) ? item_dir :
|
||||
ULP_COMP_FLD_IDX_RD(params, BNXT_ULP_CF_IDX_DIRECTION);
|
||||
if (dir == BNXT_ULP_DIR_INGRESS &&
|
||||
port_type != BNXT_ULP_INTF_TYPE_VF_REP) {
|
||||
svif_type = BNXT_ULP_PHY_PORT_SVIF;
|
||||
} else {
|
||||
if (port_type == BNXT_ULP_INTF_TYPE_VF_REP)
|
||||
if (port_type == BNXT_ULP_INTF_TYPE_VF_REP &&
|
||||
item_dir != BNXT_ULP_DIR_EGRESS)
|
||||
svif_type = BNXT_ULP_VF_FUNC_SVIF;
|
||||
else
|
||||
svif_type = BNXT_ULP_DRV_FUNC_SVIF;
|
||||
@ -474,7 +478,8 @@ ulp_rte_parser_implicit_match_port_process(struct ulp_rte_parser_params *params)
|
||||
}
|
||||
|
||||
/* Update the SVIF details */
|
||||
rc = ulp_rte_parser_svif_set(params, ifindex, svif_mask);
|
||||
rc = ulp_rte_parser_svif_set(params, ifindex, svif_mask,
|
||||
BNXT_ULP_DIR_INVALID);
|
||||
return rc;
|
||||
}
|
||||
|
||||
@ -522,7 +527,8 @@ ulp_rte_pf_hdr_handler(const struct rte_flow_item *item __rte_unused,
|
||||
}
|
||||
|
||||
/* Update the SVIF details */
|
||||
return ulp_rte_parser_svif_set(params, ifindex, svif_mask);
|
||||
return ulp_rte_parser_svif_set(params, ifindex, svif_mask,
|
||||
BNXT_ULP_DIR_INVALID);
|
||||
}
|
||||
|
||||
/* Function to handle the parsing of RTE Flow item VF Header. */
|
||||
@ -555,39 +561,72 @@ ulp_rte_vf_hdr_handler(const struct rte_flow_item *item,
|
||||
return rc;
|
||||
}
|
||||
/* Update the SVIF details */
|
||||
return ulp_rte_parser_svif_set(params, ifindex, mask);
|
||||
return ulp_rte_parser_svif_set(params, ifindex, mask,
|
||||
BNXT_ULP_DIR_INVALID);
|
||||
}
|
||||
|
||||
/* Function to handle the parsing of RTE Flow item port id Header. */
|
||||
/* Parse items PORT_ID, PORT_REPRESENTOR and REPRESENTED_PORT. */
|
||||
int32_t
|
||||
ulp_rte_port_id_hdr_handler(const struct rte_flow_item *item,
|
||||
struct ulp_rte_parser_params *params)
|
||||
ulp_rte_port_hdr_handler(const struct rte_flow_item *item,
|
||||
struct ulp_rte_parser_params *params)
|
||||
{
|
||||
const struct rte_flow_item_port_id *port_spec = item->spec;
|
||||
const struct rte_flow_item_port_id *port_mask = item->mask;
|
||||
enum bnxt_ulp_direction_type item_dir;
|
||||
uint16_t ethdev_id;
|
||||
uint16_t mask = 0;
|
||||
int32_t rc = BNXT_TF_RC_PARSE_ERR;
|
||||
uint32_t ifindex;
|
||||
|
||||
if (!port_spec) {
|
||||
BNXT_TF_DBG(ERR, "ParseErr:Port id is not valid\n");
|
||||
if (!item->spec) {
|
||||
BNXT_TF_DBG(ERR, "ParseErr:Port spec is not valid\n");
|
||||
return rc;
|
||||
}
|
||||
if (!port_mask) {
|
||||
BNXT_TF_DBG(ERR, "ParseErr:Phy Port mask is not valid\n");
|
||||
if (!item->mask) {
|
||||
BNXT_TF_DBG(ERR, "ParseErr:Port mask is not valid\n");
|
||||
return rc;
|
||||
}
|
||||
|
||||
switch (item->type) {
|
||||
case RTE_FLOW_ITEM_TYPE_PORT_ID: {
|
||||
const struct rte_flow_item_port_id *port_spec = item->spec;
|
||||
const struct rte_flow_item_port_id *port_mask = item->mask;
|
||||
|
||||
item_dir = BNXT_ULP_DIR_INVALID;
|
||||
ethdev_id = port_spec->id;
|
||||
mask = port_mask->id;
|
||||
break;
|
||||
}
|
||||
case RTE_FLOW_ITEM_TYPE_PORT_REPRESENTOR: {
|
||||
const struct rte_flow_item_ethdev *ethdev_spec = item->spec;
|
||||
const struct rte_flow_item_ethdev *ethdev_mask = item->mask;
|
||||
|
||||
item_dir = BNXT_ULP_DIR_INGRESS;
|
||||
ethdev_id = ethdev_spec->port_id;
|
||||
mask = ethdev_mask->port_id;
|
||||
break;
|
||||
}
|
||||
case RTE_FLOW_ITEM_TYPE_REPRESENTED_PORT: {
|
||||
const struct rte_flow_item_ethdev *ethdev_spec = item->spec;
|
||||
const struct rte_flow_item_ethdev *ethdev_mask = item->mask;
|
||||
|
||||
item_dir = BNXT_ULP_DIR_EGRESS;
|
||||
ethdev_id = ethdev_spec->port_id;
|
||||
mask = ethdev_mask->port_id;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
BNXT_TF_DBG(ERR, "ParseErr:Unexpected item\n");
|
||||
return rc;
|
||||
}
|
||||
mask = port_mask->id;
|
||||
|
||||
/* perform the conversion from dpdk port to bnxt ifindex */
|
||||
if (ulp_port_db_dev_port_to_ulp_index(params->ulp_ctx,
|
||||
port_spec->id,
|
||||
ethdev_id,
|
||||
&ifindex)) {
|
||||
BNXT_TF_DBG(ERR, "ParseErr:Portid is not valid\n");
|
||||
return rc;
|
||||
}
|
||||
/* Update the SVIF details */
|
||||
return ulp_rte_parser_svif_set(params, ifindex, mask);
|
||||
return ulp_rte_parser_svif_set(params, ifindex, mask, item_dir);
|
||||
}
|
||||
|
||||
/* Function to handle the parsing of RTE Flow item phy port Header. */
|
||||
|
@ -90,10 +90,10 @@ int32_t
|
||||
ulp_rte_vf_hdr_handler(const struct rte_flow_item *item,
|
||||
struct ulp_rte_parser_params *params);
|
||||
|
||||
/* Function to handle the parsing of RTE Flow item port id Header. */
|
||||
/* Parse items PORT_ID, PORT_REPRESENTOR and REPRESENTED_PORT. */
|
||||
int32_t
|
||||
ulp_rte_port_id_hdr_handler(const struct rte_flow_item *item,
|
||||
struct ulp_rte_parser_params *params);
|
||||
ulp_rte_port_hdr_handler(const struct rte_flow_item *item,
|
||||
struct ulp_rte_parser_params *params);
|
||||
|
||||
/* Function to handle the parsing of RTE Flow item port Header. */
|
||||
int32_t
|
||||
|
Loading…
x
Reference in New Issue
Block a user