From: Wei Zhao Date: Fri, 3 Apr 2020 04:46:05 +0000 (+0800) Subject: net/ice: support IPv6 NAT-T X-Git-Url: http://git.droids-corp.org/?a=commitdiff_plain;h=45b53ed3701dc04c2c8d0add684b087998ee0f06;p=dpdk.git net/ice: support IPv6 NAT-T This patch add switch filter support for IPv6 NAT-T packets, it enable switch filter to direct IPv6 packets with NAT-T payload to specific action. Signed-off-by: Wei Zhao Acked-by: Qi Zhang --- diff --git a/drivers/net/ice/ice_generic_flow.c b/drivers/net/ice/ice_generic_flow.c index 04dcaba080..3365aeb863 100644 --- a/drivers/net/ice/ice_generic_flow.c +++ b/drivers/net/ice/ice_generic_flow.c @@ -1394,6 +1394,20 @@ enum rte_flow_item_type pattern_eth_ipv6_ah[] = { RTE_FLOW_ITEM_TYPE_AH, RTE_FLOW_ITEM_TYPE_END, }; +enum rte_flow_item_type pattern_eth_ipv6_udp_esp[] = { + RTE_FLOW_ITEM_TYPE_ETH, + RTE_FLOW_ITEM_TYPE_IPV6, + RTE_FLOW_ITEM_TYPE_UDP, + RTE_FLOW_ITEM_TYPE_ESP, + RTE_FLOW_ITEM_TYPE_END, +}; +enum rte_flow_item_type pattern_eth_ipv6_udp_ah[] = { + RTE_FLOW_ITEM_TYPE_ETH, + RTE_FLOW_ITEM_TYPE_IPV6, + RTE_FLOW_ITEM_TYPE_UDP, + RTE_FLOW_ITEM_TYPE_AH, + RTE_FLOW_ITEM_TYPE_END, +}; enum rte_flow_item_type pattern_eth_ipv6_l2tp[] = { RTE_FLOW_ITEM_TYPE_ETH, RTE_FLOW_ITEM_TYPE_IPV6, diff --git a/drivers/net/ice/ice_generic_flow.h b/drivers/net/ice/ice_generic_flow.h index 8a866d2ee1..9fe35df45b 100644 --- a/drivers/net/ice/ice_generic_flow.h +++ b/drivers/net/ice/ice_generic_flow.h @@ -393,9 +393,11 @@ extern enum rte_flow_item_type pattern_eth_qinq_pppoes_ipv6_icmp6[]; /* ESP */ extern enum rte_flow_item_type pattern_eth_ipv6_esp[]; +extern enum rte_flow_item_type pattern_eth_ipv6_udp_esp[]; /* AH */ extern enum rte_flow_item_type pattern_eth_ipv6_ah[]; +extern enum rte_flow_item_type pattern_eth_ipv6_udp_ah[]; /* L2TP */ extern enum rte_flow_item_type pattern_eth_ipv6_l2tp[]; diff --git a/drivers/net/ice/ice_switch_filter.c b/drivers/net/ice/ice_switch_filter.c index 9b4b9346c2..4248b8911c 100644 --- a/drivers/net/ice/ice_switch_filter.c +++ b/drivers/net/ice/ice_switch_filter.c @@ -150,8 +150,12 @@ ice_pattern_match_item ice_switch_pattern_dist_comms[] = { ICE_SW_INSET_MAC_PPPOE_PROTO, ICE_INSET_NONE}, {pattern_eth_ipv6_esp, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_ipv6_udp_esp, + ICE_INSET_NONE, ICE_INSET_NONE}, {pattern_eth_ipv6_ah, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_ipv6_udp_ah, + ICE_INSET_NONE, ICE_INSET_NONE}, {pattern_eth_ipv6_l2tp, ICE_INSET_NONE, ICE_INSET_NONE}, {pattern_eth_ipv4_pfcp, @@ -224,8 +228,12 @@ ice_pattern_match_item ice_switch_pattern_perm[] = { ICE_SW_INSET_PERM_TUNNEL_IPV4_TCP, ICE_INSET_NONE}, {pattern_eth_ipv6_esp, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_ipv6_udp_esp, + ICE_INSET_NONE, ICE_INSET_NONE}, {pattern_eth_ipv6_ah, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_ipv6_udp_ah, + ICE_INSET_NONE, ICE_INSET_NONE}, {pattern_eth_ipv6_l2tp, ICE_INSET_NONE, ICE_INSET_NONE}, {pattern_eth_ipv4_pfcp, @@ -364,6 +372,7 @@ ice_switch_inset_get(const struct rte_flow_item pattern[], uint16_t tunnel_valid = 0; uint16_t pppoe_valid = 0; uint16_t ipv6_valiad = 0; + uint16_t udp_valiad = 0; for (item = pattern; item->type != @@ -642,6 +651,7 @@ ice_switch_inset_get(const struct rte_flow_item pattern[], case RTE_FLOW_ITEM_TYPE_UDP: udp_spec = item->spec; udp_mask = item->mask; + udp_valiad = 1; if (udp_spec && udp_mask) { /* Check UDP mask and update input set*/ if (udp_mask->hdr.dgram_len || @@ -974,7 +984,9 @@ ice_switch_inset_get(const struct rte_flow_item pattern[], "Invalid esp item"); return -ENOTSUP; } - if (ipv6_valiad) + if (ipv6_valiad && udp_valiad) + *tun_type = ICE_SW_TUN_PROFID_IPV6_NAT_T; + else if (ipv6_valiad) *tun_type = ICE_SW_TUN_PROFID_IPV6_ESP; break; @@ -988,7 +1000,9 @@ ice_switch_inset_get(const struct rte_flow_item pattern[], "Invalid ah item"); return -ENOTSUP; } - if (ipv6_valiad) + if (ipv6_valiad && udp_valiad) + *tun_type = ICE_SW_TUN_PROFID_IPV6_NAT_T; + else if (ipv6_valiad) *tun_type = ICE_SW_TUN_PROFID_IPV6_AH; break; @@ -1237,6 +1251,7 @@ ice_is_profile_rule(enum ice_sw_tunnel_type tun_type) case ICE_SW_TUN_PROFID_IPV6_ESP: case ICE_SW_TUN_PROFID_IPV6_AH: case ICE_SW_TUN_PROFID_MAC_IPV6_L2TPV3: + case ICE_SW_TUN_PROFID_IPV6_NAT_T: case ICE_SW_TUN_PROFID_IPV4_PFCP_NODE: case ICE_SW_TUN_PROFID_IPV4_PFCP_SESSION: case ICE_SW_TUN_PROFID_IPV6_PFCP_NODE: