From: Jie Liu <[email protected]> This patch refactors flow tunnel port handling and adds support for PF bond devices:
- Refactor tunnel port functions from pattern module to flow module: * Move sxe2_flow_parse_pattern_ipip from sxe2_flow_parse_pattern.c * Move sxe2_flow_add_udp_tunnel_port from sxe2_flow_parse_pattern.c * Move sxe2_flow_add_tunnel_port from public API to static function * Remove public function declaration from header file * Keep functions internal to flow module for better encapsulation - Add PF bond device support in flow source split processing: * Add bond_member_cnt field to sxe2_adapter structure * Handle SXE2_DEV_T_PF_BOND device type in sxe2_flow_src_split_proc * Populate flow_src_vsi for all bond members - Enhance ACL engine support in flow actions: * Add ACL engine support in flow action checks * Allow PASSTHRU action for ACL engine Signed-off-by: Jie Liu <[email protected]> --- drivers/net/sxe2/sxe2_ethdev.h | 1 + drivers/net/sxe2/sxe2_flow.c | 144 ++++++++++++++++++++- drivers/net/sxe2/sxe2_flow_parse_action.c | 18 ++- drivers/net/sxe2/sxe2_flow_parse_pattern.c | 113 ---------------- drivers/net/sxe2/sxe2_flow_parse_pattern.h | 7 - 5 files changed, 151 insertions(+), 132 deletions(-) diff --git a/drivers/net/sxe2/sxe2_ethdev.h b/drivers/net/sxe2/sxe2_ethdev.h index d0a0f41ceb..36f4cc9353 100644 --- a/drivers/net/sxe2/sxe2_ethdev.h +++ b/drivers/net/sxe2/sxe2_ethdev.h @@ -340,6 +340,7 @@ struct sxe2_adapter { bool flow_isolate_cfg; uint16_t dev_port_id; bool is_dev_repr; + uint16_t bond_member_cnt; uint64_t cap_flags; enum sxe2_dev_type dev_type; struct rte_ether_addr mac_addr; diff --git a/drivers/net/sxe2/sxe2_flow.c b/drivers/net/sxe2/sxe2_flow.c index 3cf98dd294..af85cb0d2b 100644 --- a/drivers/net/sxe2/sxe2_flow.c +++ b/drivers/net/sxe2/sxe2_flow.c @@ -285,14 +285,16 @@ static int32_t sxe2_flow_meta_proc(struct rte_eth_dev *dev, attr, "Only support priority 0."); ret = -rte_errno; goto l_end; - } else if (!adapter->switchdev_info.is_switchdev) { - PMD_LOG_ERR(DRV, "Legacy mode only support priority 0."); - rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_ATTR_PRIORITY, - attr, "Legacy mode only priority 0."); - ret = -rte_errno; - goto l_end; } else { - flow->meta.flow_prio = attr->priority; + if (!adapter->switchdev_info.is_switchdev) { + PMD_LOG_ERR(DRV, "Legacy mode only support priority 0."); + rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_ATTR_PRIORITY, + attr, "Legacy mode only priority 0."); + ret = -rte_errno; + goto l_end; + } else { + flow->meta.flow_prio = attr->priority; + } } } @@ -347,6 +349,21 @@ static int32_t sxe2_flow_src_split_proc(struct rte_eth_dev *dev, flow_src_vsi[SXE2_MAX_DRV_TYPE_KERNEL][idx] = UINT16_MAX; } + if (adapter->dev_type == SXE2_DEV_T_PF_BOND) { + flow_bond_num = adapter->bond_member_cnt; + for (idx = 0; idx < flow_bond_num; idx++) { + flow_src_vsi[SXE2_MAX_DRV_TYPE_DPDK][idx] = + adapter->vsi_ctxt.bond_member_dpdk_vsi_id[idx]; + flow_src_vsi[SXE2_MAX_DRV_TYPE_KERNEL][idx] = + adapter->vsi_ctxt.bond_member_kernel_vsi_id[idx]; + } + } else { + flow_src_vsi[SXE2_MAX_DRV_TYPE_DPDK][0] = + adapter->vsi_ctxt.dpdk_vsi_id; + flow_src_vsi[SXE2_MAX_DRV_TYPE_KERNEL][0] = + adapter->vsi_ctxt.kernel_vsi_id; + } + flow_src_vsi[SXE2_MAX_DRV_TYPE_DPDK][0] = adapter->vsi_ctxt.dpdk_vsi_id; flow_src_vsi[SXE2_MAX_DRV_TYPE_KERNEL][0] = adapter->vsi_ctxt.kernel_vsi_id; if (flow->engine_type == SXE2_FLOW_ENGINE_FNAV || @@ -550,6 +567,119 @@ int32_t sxe2_flow_init_udp_tunnel_port(struct rte_eth_dev *dev) return ret; } +static int32_t sxe2_flow_add_udp_tunnel_port(struct sxe2_adapter *adapter, + enum sxe2_flow_udp_tunnel_protocol proto, + struct sxe2_flow *flow, + BITMAP_TYPE *flow_type) +{ + int32_t ret = 0; + uint16_t tun_port; + + tun_port = adapter->flow_ctxt.tunnel_port_list[proto]; + if (tun_port == 0xffff || tun_port == 0) { + ret = -EINVAL; + PMD_LOG_ERR(DRV, "UDP tunnel port not initialized, proto: %d", proto); + goto l_end; + } + if (!sxe2_test_bit(SXE2_EXPANSION_OUTER_UDP, flow_type)) { + ret = -EINVAL; + PMD_LOG_ERR(DRV, "UDP must be over tunnel"); + goto l_end; + } + sxe2_set_bit(SXE2_FLOW_FLD_ID_UDP_DST_PORT, flow->pattern_outer.map_spec); + flow->pattern_outer.item_spec.udp.dest = rte_cpu_to_be_16(tun_port); +l_end: + return ret; +} + +static int32_t sxe2_flow_parse_pattern_ipip(struct sxe2_flow *flow, BITMAP_TYPE *flow_type) +{ + sxe2_set_bit(SXE2_EXPANSION_IPIP, flow_type); + if (sxe2_test_bit(SXE2_EXPANSION_OUTER_IPV4, flow_type)) { + sxe2_set_bit(SXE2_FLOW_FLD_ID_IPV4_PROT, flow->pattern_outer.map_spec); + if (sxe2_test_bit(SXE2_EXPANSION_IPV4, flow_type)) + flow->pattern_outer.item_spec.ipv4.protocol = SXE2_FLOW_IP_PROTOCOL_IPV4; + if (sxe2_test_bit(SXE2_EXPANSION_IPV6, flow_type)) + flow->pattern_outer.item_spec.ipv4.protocol = SXE2_FLOW_IP_PROTOCOL_IPV6; + } + if (sxe2_test_bit(SXE2_EXPANSION_OUTER_IPV6, flow_type)) { + sxe2_set_bit(SXE2_FLOW_FLD_ID_IPV6_PROT, flow->pattern_outer.map_spec); + if (sxe2_test_bit(SXE2_EXPANSION_ETH, flow_type)) { + flow->pattern_outer.item_spec.ipv6.nexthdr = SXE2_FLOW_IP_PROTOCOL_ETH; + } else { + if (sxe2_test_bit(SXE2_EXPANSION_IPV4, flow_type)) + flow->pattern_outer.item_spec.ipv6.nexthdr = + SXE2_FLOW_IP_PROTOCOL_IPV4; + if (sxe2_test_bit(SXE2_EXPANSION_IPV6, flow_type)) + flow->pattern_outer.item_spec.ipv6.nexthdr = + SXE2_FLOW_IP_PROTOCOL_IPV6; + } + } + return 0; +} + +static int32_t sxe2_flow_add_tunnel_port(struct rte_eth_dev *dev, + struct rte_flow_error *error, + struct sxe2_flow *flow, BITMAP_TYPE *flow_type, + enum sxe2_flow_tunnel_type tunnel_type) +{ + int32_t ret = 0; + enum sxe2_flow_udp_tunnel_protocol proto = SXE2_FLOW_UDP_TUNNEL_MAX; + struct sxe2_adapter *adapter = SXE2_DEV_PRIVATE_TO_ADAPTER(dev); + struct sxe2_flow_pattern *pattern = &flow->pattern_outer; + switch (tunnel_type) { + case SXE2_FLOW_TUNNEL_TYPE_VXLAN: + if (sxe2_test_bit(SXE2_EXPANSION_ETH, flow_type)) { + proto = SXE2_FLOW_UDP_TUNNEL_PROTOCOL_VXLAN; + } else if (sxe2_test_bit(SXE2_EXPANSION_IPV4, flow_type) || + sxe2_test_bit(SXE2_EXPANSION_IPV6, flow_type)) { + proto = SXE2_FLOW_UDP_TUNNEL_PROTOCOL_VXLAN_GPE; + } + break; + case SXE2_FLOW_TUNNEL_TYPE_GTPU: + proto = SXE2_FLOW_UDP_TUNNEL_PROTOCOL_GTP_U; + break; + case SXE2_FLOW_TUNNEL_TYPE_GENEVE: + proto = SXE2_FLOW_UDP_TUNNEL_PROTOCOL_GENEVE; + break; + case SXE2_FLOW_TUNNEL_TYPE_GRE: + if (sxe2_test_bit(SXE2_EXPANSION_OUTER_UDP, flow_type)) { + proto = SXE2_FLOW_UDP_TUNNEL_PROTOCOL_NVGRE; + } else { + if (sxe2_test_bit(SXE2_EXPANSION_OUTER_IPV4, flow_type)) { + pattern->item_spec.ipv4.protocol = SXE2_FLOW_IP_PROTOCOL_GRE; + sxe2_set_bit(SXE2_FLOW_FLD_ID_IPV4_PROT, pattern->map_spec); + } + if (sxe2_test_bit(SXE2_EXPANSION_OUTER_IPV6, flow_type)) { + pattern->item_spec.ipv6.nexthdr = SXE2_FLOW_IP_PROTOCOL_GRE; + sxe2_set_bit(SXE2_FLOW_FLD_ID_IPV6_PROT, pattern->map_spec); + } + } + break; + case SXE2_FLOW_TUNNEL_TYPE_IPIP: + ret = sxe2_flow_parse_pattern_ipip(flow, flow_type); + break; + default: + break; + } + if (proto != SXE2_FLOW_UDP_TUNNEL_MAX) { + ret = sxe2_flow_add_udp_tunnel_port(adapter, proto, flow, flow_type); + if (ret != 0) { + rte_flow_error_set(error, EINVAL, + RTE_FLOW_ERROR_TYPE_ITEM, + NULL, "Failed to add udp port for tunnel."); + PMD_LOG_ERR(DRV, "Failed to add udp port for tunnel, ret %d.", ret); + goto l_end; + } + } + if (tunnel_type != SXE2_FLOW_TUNNEL_TYPE_NONE) { + if (!sxe2_test_bit(SXE2_EXPANSION_OUTER_UDP, flow_type)) + sxe2_set_bit(SXE2_FLOW_HDR_IPV_OTHER, pattern->hdrs); + } +l_end: + return ret; +} + static int32_t sxe2_flowlist_add_tunnel_port(struct rte_eth_dev *dev, struct rte_flow *flow_list, struct rte_flow_error *error) diff --git a/drivers/net/sxe2/sxe2_flow_parse_action.c b/drivers/net/sxe2/sxe2_flow_parse_action.c index cdd6fcfdcd..867d90ae1d 100644 --- a/drivers/net/sxe2/sxe2_flow_parse_action.c +++ b/drivers/net/sxe2/sxe2_flow_parse_action.c @@ -25,15 +25,21 @@ static int32_t sxe2_flow_check_rss_action_attr(const struct rte_flow_action_rss goto l_end; } - if (rss->level > 2) + if (rss->level > 2) { rte_flow_error_set(error, ENOTSUP, RTE_FLOW_ERROR_TYPE_ACTION, NULL, "RSS level is could not be greater than 2"); - if (rss->key_len) + goto l_end; + } + if (rss->key_len) { rte_flow_error_set(error, ENOTSUP, RTE_FLOW_ERROR_TYPE_ACTION, NULL, "a nonzero RSS key_len is not supported"); - if (rss->queue_num) + goto l_end; + } + if (rss->queue_num) { rte_flow_error_set(error, ENOTSUP, RTE_FLOW_ERROR_TYPE_ACTION, NULL, "a non-NULL RSS queue is not supported"); + goto l_end; + } ret = 0; l_end: return ret; @@ -953,7 +959,8 @@ static int32_t sxe2_flow_check_actions(struct rte_eth_dev *dev __rte_unused, str } } - if (engine_type == SXE2_FLOW_ENGINE_FNAV) { + if (engine_type == SXE2_FLOW_ENGINE_FNAV || + engine_type == SXE2_FLOW_ENGINE_ACL) { if (vsi_num) { flow->action.q_region.q_index = 0; flow->action.q_region.region = 7; @@ -988,7 +995,8 @@ int32_t sxe2_flow_parse_action(struct rte_eth_dev *dev, case RTE_FLOW_ACTION_TYPE_VOID: break; case RTE_FLOW_ACTION_TYPE_PASSTHRU: - if (engine_type == SXE2_FLOW_ENGINE_FNAV) { + if (engine_type == SXE2_FLOW_ENGINE_FNAV || + engine_type == SXE2_FLOW_ENGINE_ACL) { sxe2_set_bit(SXE2_FLOW_ACTION_PASSTHRU, flow->action.act_types); action_num[SXE2_FLOW_ACTION_PASSTHRU]++; } else { diff --git a/drivers/net/sxe2/sxe2_flow_parse_pattern.c b/drivers/net/sxe2/sxe2_flow_parse_pattern.c index f5bf8922c6..189abb1a33 100644 --- a/drivers/net/sxe2/sxe2_flow_parse_pattern.c +++ b/drivers/net/sxe2/sxe2_flow_parse_pattern.c @@ -1637,119 +1637,6 @@ static int32_t sxe2_flow_parse_pattern_vxlan_gpe(const struct rte_flow_item *ite return ret; } -static int32_t sxe2_flow_parse_pattern_ipip(struct sxe2_flow *flow, BITMAP_TYPE *flow_type) -{ - sxe2_set_bit(SXE2_EXPANSION_IPIP, flow_type); - if (sxe2_test_bit(SXE2_EXPANSION_OUTER_IPV4, flow_type)) { - sxe2_set_bit(SXE2_FLOW_FLD_ID_IPV4_PROT, flow->pattern_outer.map_spec); - if (sxe2_test_bit(SXE2_EXPANSION_IPV4, flow_type)) - flow->pattern_outer.item_spec.ipv4.protocol = SXE2_FLOW_IP_PROTOCOL_IPV4; - if (sxe2_test_bit(SXE2_EXPANSION_IPV6, flow_type)) - flow->pattern_outer.item_spec.ipv4.protocol = SXE2_FLOW_IP_PROTOCOL_IPV6; - } - if (sxe2_test_bit(SXE2_EXPANSION_OUTER_IPV6, flow_type)) { - sxe2_set_bit(SXE2_FLOW_FLD_ID_IPV6_PROT, flow->pattern_outer.map_spec); - if (sxe2_test_bit(SXE2_EXPANSION_ETH, flow_type)) { - flow->pattern_outer.item_spec.ipv6.nexthdr = SXE2_FLOW_IP_PROTOCOL_ETH; - } else { - if (sxe2_test_bit(SXE2_EXPANSION_IPV4, flow_type)) - flow->pattern_outer.item_spec.ipv6.nexthdr = - SXE2_FLOW_IP_PROTOCOL_IPV4; - if (sxe2_test_bit(SXE2_EXPANSION_IPV6, flow_type)) - flow->pattern_outer.item_spec.ipv6.nexthdr = - SXE2_FLOW_IP_PROTOCOL_IPV6; - } - } - return 0; -} - -static int32_t sxe2_flow_add_udp_tunnel_port(struct sxe2_adapter *adapter, - enum sxe2_flow_udp_tunnel_protocol proto, - struct sxe2_flow *flow, - BITMAP_TYPE *flow_type) -{ - int32_t ret = 0; - uint16_t tun_port; - - tun_port = adapter->flow_ctxt.tunnel_port_list[proto]; - if (tun_port == 0xffff || tun_port == 0) { - ret = -EINVAL; - PMD_LOG_ERR(DRV, "UDP tunnel port not initialized, proto: %d", proto); - goto l_end; - } - if (!sxe2_test_bit(SXE2_EXPANSION_OUTER_UDP, flow_type)) { - ret = -EINVAL; - PMD_LOG_ERR(DRV, "UDP must be over tunnel"); - goto l_end; - } - sxe2_set_bit(SXE2_FLOW_FLD_ID_UDP_DST_PORT, flow->pattern_outer.map_spec); - flow->pattern_outer.item_spec.udp.dest = rte_cpu_to_be_16(tun_port); -l_end: - return ret; -} - -int32_t sxe2_flow_add_tunnel_port(struct rte_eth_dev *dev, - struct rte_flow_error *error, - struct sxe2_flow *flow, BITMAP_TYPE *flow_type, - enum sxe2_flow_tunnel_type tunnel_type) -{ - int32_t ret = 0; - enum sxe2_flow_udp_tunnel_protocol proto = SXE2_FLOW_UDP_TUNNEL_MAX; - struct sxe2_adapter *adapter = SXE2_DEV_PRIVATE_TO_ADAPTER(dev); - struct sxe2_flow_pattern *pattern = &flow->pattern_outer; - switch (tunnel_type) { - case SXE2_FLOW_TUNNEL_TYPE_VXLAN: - if (sxe2_test_bit(SXE2_EXPANSION_ETH, flow_type)) { - proto = SXE2_FLOW_UDP_TUNNEL_PROTOCOL_VXLAN; - } else if (sxe2_test_bit(SXE2_EXPANSION_IPV4, flow_type) || - sxe2_test_bit(SXE2_EXPANSION_IPV6, flow_type)) { - proto = SXE2_FLOW_UDP_TUNNEL_PROTOCOL_VXLAN_GPE; - } - break; - case SXE2_FLOW_TUNNEL_TYPE_GTPU: - proto = SXE2_FLOW_UDP_TUNNEL_PROTOCOL_GTP_U; - break; - case SXE2_FLOW_TUNNEL_TYPE_GENEVE: - proto = SXE2_FLOW_UDP_TUNNEL_PROTOCOL_GENEVE; - break; - case SXE2_FLOW_TUNNEL_TYPE_GRE: - if (sxe2_test_bit(SXE2_EXPANSION_OUTER_UDP, flow_type)) { - proto = SXE2_FLOW_UDP_TUNNEL_PROTOCOL_NVGRE; - } else { - if (sxe2_test_bit(SXE2_EXPANSION_OUTER_IPV4, flow_type)) { - pattern->item_spec.ipv4.protocol = SXE2_FLOW_IP_PROTOCOL_GRE; - sxe2_set_bit(SXE2_FLOW_FLD_ID_IPV4_PROT, pattern->map_spec); - } - if (sxe2_test_bit(SXE2_EXPANSION_OUTER_IPV6, flow_type)) { - pattern->item_spec.ipv6.nexthdr = SXE2_FLOW_IP_PROTOCOL_GRE; - sxe2_set_bit(SXE2_FLOW_FLD_ID_IPV6_PROT, pattern->map_spec); - } - } - break; - case SXE2_FLOW_TUNNEL_TYPE_IPIP: - ret = sxe2_flow_parse_pattern_ipip(flow, flow_type); - break; - default: - break; - } - if (proto != SXE2_FLOW_UDP_TUNNEL_MAX) { - ret = sxe2_flow_add_udp_tunnel_port(adapter, proto, flow, flow_type); - if (ret != 0) { - rte_flow_error_set(error, EINVAL, - RTE_FLOW_ERROR_TYPE_ITEM, - NULL, "Failed to add udp port for tunnel."); - PMD_LOG_ERR(DRV, "Failed to add udp port for tunnel, ret %d.", ret); - goto l_end; - } - } - if (tunnel_type != SXE2_FLOW_TUNNEL_TYPE_NONE) { - if (!sxe2_test_bit(SXE2_EXPANSION_OUTER_UDP, flow_type)) - sxe2_set_bit(SXE2_FLOW_HDR_IPV_OTHER, pattern->hdrs); - } -l_end: - return ret; -} - struct sxe2_flow_parse_pattern_ops sxe2_flow_parse_pattern_list[] = { [SXE2_EXPANSION_OUTER_ETH] = { .is_inner = false, diff --git a/drivers/net/sxe2/sxe2_flow_parse_pattern.h b/drivers/net/sxe2/sxe2_flow_parse_pattern.h index 8442c35cae..6872a767dd 100644 --- a/drivers/net/sxe2/sxe2_flow_parse_pattern.h +++ b/drivers/net/sxe2/sxe2_flow_parse_pattern.h @@ -36,11 +36,4 @@ int32_t sxe2_flow_parse_pattern(struct rte_eth_dev *dev, const struct rte_flow_item patterns[], struct rte_flow_error *error, struct sxe2_flow *flow); - -int32_t sxe2_flow_add_tunnel_port(struct rte_eth_dev *dev, - struct rte_flow_error *error, - struct sxe2_flow *flow, - BITMAP_TYPE *flow_type, - enum sxe2_flow_tunnel_type tunnel_type); - #endif /* SXE2_FLOW_PARSE_PATTERN_H_ */ -- 2.52.0

