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:
Andrew Rybchenko 2021-10-13 20:34:43 +03:00 committed by Ferruh Yigit
parent 9d2a349b38
commit a8321e0979
4 changed files with 72 additions and 23 deletions

View File

@ -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

View File

@ -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
}
};

View File

@ -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. */

View File

@ -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