+ if ((!pppoe_proto_spec && pppoe_proto_mask) ||
+ (pppoe_proto_spec && !pppoe_proto_mask)) {
+ rte_flow_error_set(error, EINVAL,
+ RTE_FLOW_ERROR_TYPE_ITEM,
+ item,
+ "Invalid pppoe proto item");
+ return 0;
+ }
+ if (pppoe_proto_spec && pppoe_proto_mask) {
+ if (pppoe_valid)
+ t--;
+ list[t].type = ICE_PPPOE;
+ if (pppoe_proto_mask->proto_id) {
+ list[t].h_u.pppoe_hdr.ppp_prot_id =
+ pppoe_proto_spec->proto_id;
+ list[t].m_u.pppoe_hdr.ppp_prot_id =
+ pppoe_proto_mask->proto_id;
+ input_set |= ICE_INSET_PPPOE_PROTO;
+ }
+ t++;
+ }
+ break;
+
+ case RTE_FLOW_ITEM_TYPE_ESP:
+ esp_spec = item->spec;
+ esp_mask = item->mask;
+ if ((esp_spec && !esp_mask) ||
+ (!esp_spec && esp_mask)) {
+ rte_flow_error_set(error, EINVAL,
+ RTE_FLOW_ERROR_TYPE_ITEM,
+ item,
+ "Invalid esp item");
+ return 0;
+ }
+ /* Check esp mask and update input set */
+ if (esp_mask && esp_mask->hdr.seq) {
+ rte_flow_error_set(error, EINVAL,
+ RTE_FLOW_ERROR_TYPE_ITEM,
+ item,
+ "Invalid esp mask");
+ return 0;
+ }
+
+ if (!esp_spec && !esp_mask && !input_set) {
+ profile_rule = 1;
+ 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;
+ else if (ipv4_valiad)
+ return 0;
+ } else if (esp_spec && esp_mask &&
+ esp_mask->hdr.spi){
+ if (udp_valiad)
+ list[t].type = ICE_NAT_T;
+ else
+ list[t].type = ICE_ESP;
+ list[t].h_u.esp_hdr.spi =
+ esp_spec->hdr.spi;
+ list[t].m_u.esp_hdr.spi =
+ esp_mask->hdr.spi;
+ input_set |= ICE_INSET_ESP_SPI;
+ t++;
+ }
+
+ if (!profile_rule) {
+ if (ipv6_valiad && udp_valiad)
+ *tun_type = ICE_SW_TUN_IPV6_NAT_T;
+ else if (ipv4_valiad && udp_valiad)
+ *tun_type = ICE_SW_TUN_IPV4_NAT_T;
+ else if (ipv6_valiad)
+ *tun_type = ICE_SW_TUN_IPV6_ESP;
+ else if (ipv4_valiad)
+ *tun_type = ICE_SW_TUN_IPV4_ESP;
+ }
+ break;
+
+ case RTE_FLOW_ITEM_TYPE_AH:
+ ah_spec = item->spec;
+ ah_mask = item->mask;
+ if ((ah_spec && !ah_mask) ||
+ (!ah_spec && ah_mask)) {
+ rte_flow_error_set(error, EINVAL,
+ RTE_FLOW_ERROR_TYPE_ITEM,
+ item,
+ "Invalid ah item");
+ return 0;
+ }
+ /* Check ah mask and update input set */
+ if (ah_mask &&
+ (ah_mask->next_hdr ||
+ ah_mask->payload_len ||
+ ah_mask->seq_num ||
+ ah_mask->reserved)) {
+ rte_flow_error_set(error, EINVAL,
+ RTE_FLOW_ERROR_TYPE_ITEM,
+ item,
+ "Invalid ah mask");
+ return 0;
+ }
+
+ if (!ah_spec && !ah_mask && !input_set) {
+ profile_rule = 1;
+ 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;
+ else if (ipv4_valiad)
+ return 0;
+ } else if (ah_spec && ah_mask &&
+ ah_mask->spi){
+ list[t].type = ICE_AH;
+ list[t].h_u.ah_hdr.spi =
+ ah_spec->spi;
+ list[t].m_u.ah_hdr.spi =
+ ah_mask->spi;
+ input_set |= ICE_INSET_AH_SPI;
+ t++;
+ }
+
+ if (!profile_rule) {
+ if (udp_valiad)
+ return 0;
+ else if (ipv6_valiad)
+ *tun_type = ICE_SW_TUN_IPV6_AH;
+ else if (ipv4_valiad)
+ *tun_type = ICE_SW_TUN_IPV4_AH;
+ }
+ break;
+
+ case RTE_FLOW_ITEM_TYPE_L2TPV3OIP:
+ l2tp_spec = item->spec;
+ l2tp_mask = item->mask;
+ if ((l2tp_spec && !l2tp_mask) ||
+ (!l2tp_spec && l2tp_mask)) {