net/ice: support IPv6 NAT-T
authorWei Zhao <wei.zhao1@intel.com>
Fri, 3 Apr 2020 04:46:05 +0000 (12:46 +0800)
committerFerruh Yigit <ferruh.yigit@intel.com>
Tue, 21 Apr 2020 11:57:06 +0000 (13:57 +0200)
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 <wei.zhao1@intel.com>
Acked-by: Qi Zhang <qi.z.zhang@intel.com>
drivers/net/ice/ice_generic_flow.c
drivers/net/ice/ice_generic_flow.h
drivers/net/ice/ice_switch_filter.c

index 04dcaba..3365aeb 100644 (file)
@@ -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,
index 8a866d2..9fe35df 100644 (file)
@@ -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[];
index 9b4b934..4248b89 100644 (file)
@@ -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: