Add support for RTE_FLOW_ACTION_TYPE_MARK Signed-off-by: Ajit Khaparde <ajit.khapa...@broadcom.com> --- drivers/net/bnxt/bnxt.h | 1 + drivers/net/bnxt/bnxt_ethdev.c | 8 ++++++ drivers/net/bnxt/bnxt_filter.h | 3 ++ drivers/net/bnxt/bnxt_flow.c | 35 ++++++++++++++++++------ drivers/net/bnxt/bnxt_hwrm.c | 2 ++ drivers/net/bnxt/bnxt_rxr.c | 41 +++++++++++++++++++++++++++- drivers/net/bnxt/bnxt_rxr.h | 11 ++++++++ drivers/net/bnxt/bnxt_rxtx_vec_sse.c | 8 +++++- 8 files changed, 98 insertions(+), 11 deletions(-)
diff --git a/drivers/net/bnxt/bnxt.h b/drivers/net/bnxt/bnxt.h index ab18e8acd..bd8f66039 100644 --- a/drivers/net/bnxt/bnxt.h +++ b/drivers/net/bnxt/bnxt.h @@ -653,6 +653,7 @@ struct bnxt { /* Struct to hold adapter error recovery related info */ struct bnxt_error_recovery_info *recovery_info; + uint32_t *mark_table; }; int bnxt_mtu_set_op(struct rte_eth_dev *eth_dev, uint16_t new_mtu); diff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c index 1b4ed293d..64f88e968 100644 --- a/drivers/net/bnxt/bnxt_ethdev.c +++ b/drivers/net/bnxt/bnxt_ethdev.c @@ -458,6 +458,9 @@ static int bnxt_init_chip(struct bnxt *bp) } bnxt_print_link_info(bp->eth_dev); + bp->mark_table = rte_zmalloc("bnxt_mark_table", + sizeof(uint16_t) * 64 * 1024, + 0); return 0; err_free: @@ -956,6 +959,7 @@ static void bnxt_dev_stop_op(struct rte_eth_dev *eth_dev) bnxt_int_handler(eth_dev); bnxt_shutdown_nic(bp); bnxt_hwrm_if_change(bp, 0); + memset(bp->mark_table, 0, sizeof(uint16_t) * 64 * 1024); bp->dev_stopped = 1; bp->rx_cosq_cnt = 0; } @@ -975,6 +979,10 @@ static void bnxt_dev_close_op(struct rte_eth_dev *eth_dev) rte_free(bp->grp_info); bp->grp_info = NULL; } + if (bp->mark_table != NULL) { + rte_free(bp->mark_table); + bp->mark_table = NULL; + } bnxt_dev_uninit(eth_dev); } diff --git a/drivers/net/bnxt/bnxt_filter.h b/drivers/net/bnxt/bnxt_filter.h index 9db3e7487..8cafa8fe6 100644 --- a/drivers/net/bnxt/bnxt_filter.h +++ b/drivers/net/bnxt/bnxt_filter.h @@ -23,9 +23,11 @@ struct bnxt; #define BNXT_FLOW_L2_INNER_DST_VALID_FLAG BIT(4) #define BNXT_FLOW_L2_DROP_FLAG BIT(5) #define BNXT_FLOW_PARSE_INNER_FLAG BIT(6) +#define BNXT_FLOW_MARK_FLAG BIT(7) struct bnxt_filter_info { STAILQ_ENTRY(bnxt_filter_info) next; + uint32_t flow_id; uint64_t fw_l2_filter_id; struct bnxt_filter_info *matching_l2_fltr_ptr; uint64_t fw_em_filter_id; @@ -77,6 +79,7 @@ struct bnxt_filter_info { uint16_t ip_addr_type; uint16_t ethertype; uint32_t priority; + uint32_t mark; }; struct bnxt_filter_info *bnxt_alloc_filter(struct bnxt *bp); diff --git a/drivers/net/bnxt/bnxt_flow.c b/drivers/net/bnxt/bnxt_flow.c index 7bd6811f1..4381cd73a 100644 --- a/drivers/net/bnxt/bnxt_flow.c +++ b/drivers/net/bnxt/bnxt_flow.c @@ -1033,6 +1033,8 @@ bnxt_validate_and_parse_flow(struct rte_eth_dev *dev, filter->flags = HWRM_CFA_EM_FLOW_ALLOC_INPUT_FLAGS_PATH_RX; use_ntuple = bnxt_filter_type_check(pattern, error); + +start: switch (act->type) { case RTE_FLOW_ACTION_TYPE_QUEUE: /* Allow this flow. Redirect to a VNIC. */ @@ -1410,6 +1412,12 @@ bnxt_validate_and_parse_flow(struct rte_eth_dev *dev, PMD_DRV_LOG(DEBUG, "L2 filter created\n"); bnxt_update_filter_flags_en(filter, filter1, use_ntuple); break; + case RTE_FLOW_ACTION_TYPE_MARK: + filter->valid_flags |= BNXT_FLOW_MARK_FLAG; + filter->mark = ((const struct rte_flow_action_mark *) + act->conf)->id; + PMD_DRV_LOG(DEBUG, "Mark the flow %d\n", filter->mark); + break; default: rte_flow_error_set(error, EINVAL, @@ -1427,15 +1435,8 @@ bnxt_validate_and_parse_flow(struct rte_eth_dev *dev, done: act = bnxt_flow_non_void_action(++act); - if (act->type != RTE_FLOW_ACTION_TYPE_END) { - rte_flow_error_set(error, - EINVAL, - RTE_FLOW_ERROR_TYPE_ACTION, - act, - "Invalid action."); - rc = -rte_errno; - goto ret; - } + while (act->type != RTE_FLOW_ACTION_TYPE_END) + goto start; return rc; ret: @@ -1749,6 +1750,17 @@ bnxt_flow_create(struct rte_eth_dev *dev, STAILQ_INSERT_TAIL(&vnic->filter, filter, next); PMD_DRV_LOG(DEBUG, "Successfully created flow.\n"); STAILQ_INSERT_TAIL(&vnic->flow_list, flow, next); + if (filter->valid_flags & BNXT_FLOW_MARK_FLAG) { + uint16_t fid = 0; + + if (filter->filter_type == HWRM_CFA_NTUPLE_FILTER) + fid = filter->fw_ntuple_filter_id >> 48; + else if (filter->filter_type == HWRM_CFA_L2_FILTER) + fid = filter->fw_l2_filter_id >> 48; + + PMD_DRV_LOG(DEBUG, "Mark action enabled for flow\n"); + bp->mark_table[fid] = filter->mark; + } bnxt_release_flow_lock(bp); return flow; } @@ -1862,6 +1874,11 @@ bnxt_flow_destroy(struct rte_eth_dev *dev, if (ret == 0) PMD_DRV_LOG(ERR, "Could not find matching flow\n"); + if (filter->valid_flags & BNXT_FLOW_MARK_FLAG) { + bp->mark_table[filter->flow_id] = 0; + filter->flow_id = 0; + } + if (filter->filter_type == HWRM_CFA_EM_FILTER) ret = bnxt_hwrm_clear_em_filter(bp, filter); if (filter->filter_type == HWRM_CFA_NTUPLE_FILTER) diff --git a/drivers/net/bnxt/bnxt_hwrm.c b/drivers/net/bnxt/bnxt_hwrm.c index d0dcd561c..64dc78ae6 100644 --- a/drivers/net/bnxt/bnxt_hwrm.c +++ b/drivers/net/bnxt/bnxt_hwrm.c @@ -473,6 +473,7 @@ int bnxt_hwrm_set_l2_filter(struct bnxt *bp, HWRM_CHECK_RESULT(); filter->fw_l2_filter_id = rte_le_to_cpu_64(resp->l2_filter_id); + filter->flow_id = rte_le_to_cpu_32(resp->flow_id); HWRM_UNLOCK(); return rc; @@ -4283,6 +4284,7 @@ int bnxt_hwrm_set_ntuple_filter(struct bnxt *bp, HWRM_CHECK_RESULT(); filter->fw_ntuple_filter_id = rte_le_to_cpu_64(resp->ntuple_filter_id); + filter->flow_id = rte_le_to_cpu_32(resp->flow_id); HWRM_UNLOCK(); return rc; diff --git a/drivers/net/bnxt/bnxt_rxr.c b/drivers/net/bnxt/bnxt_rxr.c index 3b713c242..1ae0c3c38 100644 --- a/drivers/net/bnxt/bnxt_rxr.c +++ b/drivers/net/bnxt/bnxt_rxr.c @@ -489,7 +489,8 @@ static int bnxt_rx_pkt(struct rte_mbuf **rx_pkt, mbuf->hash.rss = rxcmp->rss_hash; mbuf->ol_flags |= PKT_RX_RSS_HASH; } else { - mbuf->hash.fdir.id = rxcmp1->cfa_code; + mbuf->hash.fdir.id = bnxt_get_cfa_code_or_mark_id(rxq->bp, + rxcmp1); mbuf->ol_flags |= PKT_RX_FDIR | PKT_RX_FDIR_ID; } #ifdef RTE_LIBRTE_IEEE1588 @@ -895,3 +896,41 @@ int bnxt_init_one_rx_ring(struct bnxt_rx_queue *rxq) return 0; } + +uint32_t bnxt_get_cfa_code_or_mark_id(struct bnxt *bp, + struct rx_pkt_cmpl_hi *rxcmp1) +{ + uint32_t cfa_code = 0; + uint8_t meta_fmt = 0; + uint16_t flags2 = 0; + uint32_t meta = 0; + + cfa_code = rte_le_to_cpu_16(rxcmp1->cfa_code); + if (!cfa_code) + return 0; + + if (cfa_code && !bp->mark_table[cfa_code]) + return cfa_code; + + flags2 = rte_le_to_cpu_16(rxcmp1->flags2); + meta = rte_le_to_cpu_32(rxcmp1->metadata); + if (meta) { + meta >>= BNXT_RX_META_CFA_CODE_SHIFT; + + /* + * The flags field holds extra bits of info from [6:4] + * which indicate if the flow is in TCAM or EM or EEM + */ + meta_fmt = (flags2 & BNXT_CFA_META_FMT_MASK) >> + BNXT_CFA_META_FMT_SHFT; + + /* + * meta_fmt == 4 => 'b100 => 'b10x => EM. + * meta_fmt == 5 => 'b101 => 'b10x => EM + VLAN + * meta_fmt == 6 => 'b110 => 'b11x => EEM + * meta_fmt == 7 => 'b111 => 'b11x => EEM + VLAN. + */ + meta_fmt >>= BNXT_CFA_META_FMT_EM_EEM_SHFT; + } + return bp->mark_table[cfa_code]; +} diff --git a/drivers/net/bnxt/bnxt_rxr.h b/drivers/net/bnxt/bnxt_rxr.h index 76bf88d70..bf860020c 100644 --- a/drivers/net/bnxt/bnxt_rxr.h +++ b/drivers/net/bnxt/bnxt_rxr.h @@ -226,4 +226,15 @@ uint16_t bnxt_recv_pkts_vec(void *rx_queue, struct rte_mbuf **rx_pkts, int bnxt_rxq_vec_setup(struct bnxt_rx_queue *rxq); #endif +uint32_t bnxt_get_cfa_code_or_mark_id(struct bnxt *bp, + struct rx_pkt_cmpl_hi *rxcmp1); +#define BNXT_RX_META_CFA_CODE_SHIFT 19 +#define BNXT_CFA_CODE_META_SHIFT 16 +#define BNXT_RX_META_CFA_CODE_INT_ACT_REC_BIT 0x8000000 +#define BNXT_RX_META_CFA_CODE_EEM_BIT 0x4000000 +#define BNXT_CFA_META_FMT_MASK 0x70 +#define BNXT_CFA_META_FMT_SHFT 4 +#define BNXT_CFA_META_FMT_EM_EEM_SHFT 1 +#define BNXT_CFA_META_FMT_EEM 3 + #endif diff --git a/drivers/net/bnxt/bnxt_rxtx_vec_sse.c b/drivers/net/bnxt/bnxt_rxtx_vec_sse.c index 22d9f9e84..ce00da633 100644 --- a/drivers/net/bnxt/bnxt_rxtx_vec_sse.c +++ b/drivers/net/bnxt/bnxt_rxtx_vec_sse.c @@ -280,8 +280,14 @@ bnxt_recv_pkts_vec(void *rx_queue, struct rte_mbuf **rx_pkts, rte_compiler_barrier(); - if (rxcmp->flags_type & RX_PKT_CMPL_FLAGS_RSS_VALID) + if (rxcmp->flags_type & RX_PKT_CMPL_FLAGS_RSS_VALID) { mbuf->ol_flags |= PKT_RX_RSS_HASH; + } else { + mbuf->hash.fdir.id = + bnxt_get_cfa_code_or_mark_id(rxq->bp, + rxcmp1); + mbuf->ol_flags |= PKT_RX_FDIR | PKT_RX_FDIR_ID; + } if (rxcmp1->flags2 & RX_PKT_CMPL_FLAGS2_META_FORMAT_VLAN) { -- 2.21.0 (Apple Git-122.2)