From patchwork Wed Jan 22 15:20:59 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Iremonger, Bernard" X-Patchwork-Id: 65051 X-Patchwork-Delegate: xiaolong.ye@intel.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 33B7AA0532; Wed, 22 Jan 2020 16:21:32 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 482082BBD; Wed, 22 Jan 2020 16:21:31 +0100 (CET) Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by dpdk.org (Postfix) with ESMTP id 8B38D2A62 for ; Wed, 22 Jan 2020 16:21:28 +0100 (CET) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by orsmga102.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 22 Jan 2020 07:21:06 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.70,350,1574150400"; d="scan'208";a="284102602" Received: from sivswdev08.ir.intel.com (HELO localhost.localdomain) ([10.237.217.47]) by fmsmga001.fm.intel.com with ESMTP; 22 Jan 2020 07:21:04 -0800 From: Bernard Iremonger To: dev@dpdk.org, beilei.xing@intel.com, qi.z.zhang@intel.com, ferruh.yigit@intel.com, rory.sexton@intel.com, declan.doherty@intel.com Cc: Bernard Iremonger Date: Wed, 22 Jan 2020 15:20:59 +0000 Message-Id: <1579706459-27355-1-git-send-email-bernard.iremonger@intel.com> X-Mailer: git-send-email 1.7.0.7 In-Reply-To: <1579622533-15909-1-git-send-email-bernard.iremonger@intel.com> References: <1579622533-15909-1-git-send-email-bernard.iremonger@intel.com> Subject: [dpdk-dev] [PATCH v2] net/i40e: fix i40e flow director merge X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Merge of ESP and L2TP code in i40e_fdir.c added checks on cus_pctype->index which caused flow creation for ESP to fail. Added fill_ipv4_function() Refactored code to have one path for customized and non customized pctype's. Fixes: c5f8365bc85d ("net/i40e: support flow director for L2TPv3 over IP") Signed-off-by: Bernard Iremonger Acked-by: Rory Sexton --- drivers/net/i40e/i40e_fdir.c | 139 ++++++++++++++++++++----------------------- 1 file changed, 64 insertions(+), 75 deletions(-) diff --git a/drivers/net/i40e/i40e_fdir.c b/drivers/net/i40e/i40e_fdir.c index c346073..b7a207d 100644 --- a/drivers/net/i40e/i40e_fdir.c +++ b/drivers/net/i40e/i40e_fdir.c @@ -1008,6 +1008,36 @@ fill_ip6_head(const struct i40e_fdir_input *fdir_input, unsigned char *raw_pkt, } static inline int +fill_ip4_head(const struct i40e_fdir_input *fdir_input, unsigned char *raw_pkt, + uint8_t next_proto, uint8_t len, uint16_t *ether_type) +{ + struct rte_ipv4_hdr *ip4; + + ip4 = (struct rte_ipv4_hdr *)raw_pkt; + + *ether_type = rte_cpu_to_be_16(RTE_ETHER_TYPE_IPV4); + ip4->version_ihl = I40E_FDIR_IP_DEFAULT_VERSION_IHL; + /* set len to by default */ + ip4->total_length = rte_cpu_to_be_16(I40E_FDIR_IP_DEFAULT_LEN); + ip4->time_to_live = fdir_input->flow.ip4_flow.ttl ? + fdir_input->flow.ip4_flow.ttl : + I40E_FDIR_IP_DEFAULT_TTL; + ip4->type_of_service = fdir_input->flow.ip4_flow.tos; + ip4->next_proto_id = fdir_input->flow.ip4_flow.proto ? + fdir_input->flow.ip4_flow.proto : next_proto; + /** + * The source and destination fields in the transmitted packet + * need to be presented in a reversed order with respect + * to the expected received packets. + */ + ip4->src_addr = fdir_input->flow.ip4_flow.dst_ip; + ip4->dst_addr = fdir_input->flow.ip4_flow.src_ip; + len += sizeof(struct rte_ipv4_hdr); + + return len; +} + +static inline int i40e_flow_fdir_fill_eth_ip_head(struct i40e_pf *pf, const struct i40e_fdir_input *fdir_input, unsigned char *raw_pkt, @@ -1017,8 +1047,6 @@ i40e_flow_fdir_fill_eth_ip_head(struct i40e_pf *pf, static uint8_t vlan_frame[] = {0x81, 0, 0, 0}; uint16_t *ether_type; uint8_t len = 2 * sizeof(struct rte_ether_addr); - struct rte_ipv4_hdr *ip; - struct rte_ipv6_hdr *ip6; uint8_t pctype = fdir_input->pctype; bool is_customized_pctype = fdir_input->flow_ext.customized_pctype; static const uint8_t next_proto[] = { @@ -1063,93 +1091,54 @@ i40e_flow_fdir_fill_eth_ip_head(struct i40e_pf *pf, pctype == I40E_FILTER_PCTYPE_NONF_IPV4_SCTP || pctype == I40E_FILTER_PCTYPE_NONF_IPV4_OTHER || pctype == I40E_FILTER_PCTYPE_FRAG_IPV4 || - ((is_customized_pctype) && - ((cus_pctype->index == I40E_CUSTOMIZED_GTPC) || - (cus_pctype->index == I40E_CUSTOMIZED_GTPU_IPV4) || - (cus_pctype->index == I40E_CUSTOMIZED_GTPU_IPV6) || - (cus_pctype->index == I40E_CUSTOMIZED_GTPU) || - (cus_pctype->index == I40E_CUSTOMIZED_IPV4_L2TPV3)))) { - ip = (struct rte_ipv4_hdr *)raw_pkt; - - *ether_type = rte_cpu_to_be_16(RTE_ETHER_TYPE_IPV4); - ip->version_ihl = I40E_FDIR_IP_DEFAULT_VERSION_IHL; - /* set len to by default */ - ip->total_length = rte_cpu_to_be_16(I40E_FDIR_IP_DEFAULT_LEN); - ip->time_to_live = fdir_input->flow.ip4_flow.ttl ? - fdir_input->flow.ip4_flow.ttl : - I40E_FDIR_IP_DEFAULT_TTL; - ip->type_of_service = fdir_input->flow.ip4_flow.tos; - /** - * The source and destination fields in the transmitted packet - * need to be presented in a reversed order with respect - * to the expected received packets. - */ - ip->src_addr = fdir_input->flow.ip4_flow.dst_ip; - ip->dst_addr = fdir_input->flow.ip4_flow.src_ip; - - if (!is_customized_pctype) { - ip->next_proto_id = fdir_input->flow.ip4_flow.proto ? - fdir_input->flow.ip4_flow.proto : - next_proto[fdir_input->pctype]; - len += sizeof(struct rte_ipv4_hdr); + pctype == I40E_FILTER_PCTYPE_NONF_IPV6_TCP || + pctype == I40E_FILTER_PCTYPE_NONF_IPV6_UDP || + pctype == I40E_FILTER_PCTYPE_NONF_IPV6_SCTP || + pctype == I40E_FILTER_PCTYPE_NONF_IPV6_OTHER || + pctype == I40E_FILTER_PCTYPE_FRAG_IPV6 || + is_customized_pctype) { + if (pctype == I40E_FILTER_PCTYPE_NONF_IPV4_TCP || + pctype == I40E_FILTER_PCTYPE_NONF_IPV4_UDP || + pctype == I40E_FILTER_PCTYPE_NONF_IPV4_SCTP || + pctype == I40E_FILTER_PCTYPE_NONF_IPV4_OTHER || + pctype == I40E_FILTER_PCTYPE_FRAG_IPV4) { + len = fill_ip4_head(fdir_input, raw_pkt, + next_proto[pctype], len, ether_type); } else if (cus_pctype->index == I40E_CUSTOMIZED_GTPC || cus_pctype->index == I40E_CUSTOMIZED_GTPU_IPV4 || cus_pctype->index == I40E_CUSTOMIZED_GTPU_IPV6 || cus_pctype->index == I40E_CUSTOMIZED_GTPU) { - ip->next_proto_id = IPPROTO_UDP; - len += sizeof(struct rte_ipv4_hdr); + len = fill_ip4_head(fdir_input, raw_pkt, IPPROTO_UDP, + len, ether_type); } else if (cus_pctype->index == I40E_CUSTOMIZED_IPV4_L2TPV3) { - ip->next_proto_id = IPPROTO_L2TP; - len += sizeof(struct rte_ipv4_hdr); + len = fill_ip4_head(fdir_input, raw_pkt, IPPROTO_L2TP, + len, ether_type); } else if (cus_pctype->index == I40E_CUSTOMIZED_ESP_IPV4) { - ip->next_proto_id = IPPROTO_ESP; - len += sizeof(struct rte_ipv4_hdr); + len = fill_ip4_head(fdir_input, raw_pkt, IPPROTO_ESP, + len, ether_type); + } else if (cus_pctype->index == I40E_CUSTOMIZED_ESP_IPV4_UDP) { + len = fill_ip4_head(fdir_input, raw_pkt, IPPROTO_UDP, + len, ether_type); } else if (cus_pctype->index == I40E_CUSTOMIZED_ESP_IPV4_UDP) { - ip->next_proto_id = IPPROTO_UDP; - len += sizeof(struct rte_ipv4_hdr); + len = fill_ip4_head(fdir_input, raw_pkt, IPPROTO_UDP, + len, ether_type); + } else if (pctype == I40E_FILTER_PCTYPE_NONF_IPV6_TCP || + pctype == I40E_FILTER_PCTYPE_NONF_IPV6_UDP || + pctype == I40E_FILTER_PCTYPE_NONF_IPV6_SCTP || + pctype == I40E_FILTER_PCTYPE_NONF_IPV6_OTHER || + pctype == I40E_FILTER_PCTYPE_FRAG_IPV6) { + len = fill_ip6_head(fdir_input, raw_pkt, + next_proto[pctype], len, + ether_type); } else if (cus_pctype->index == I40E_CUSTOMIZED_ESP_IPV6) len = fill_ip6_head(fdir_input, raw_pkt, IPPROTO_ESP, len, ether_type); else if (cus_pctype->index == I40E_CUSTOMIZED_ESP_IPV6_UDP) len = fill_ip6_head(fdir_input, raw_pkt, IPPROTO_UDP, len, ether_type); - } else if (pctype == I40E_FILTER_PCTYPE_NONF_IPV6_TCP || - pctype == I40E_FILTER_PCTYPE_NONF_IPV6_UDP || - pctype == I40E_FILTER_PCTYPE_NONF_IPV6_SCTP || - pctype == I40E_FILTER_PCTYPE_NONF_IPV6_OTHER || - pctype == I40E_FILTER_PCTYPE_FRAG_IPV6 || - ((is_customized_pctype) && - (cus_pctype->index == I40E_CUSTOMIZED_IPV6_L2TPV3))) { - ip6 = (struct rte_ipv6_hdr *)raw_pkt; - - *ether_type = rte_cpu_to_be_16(RTE_ETHER_TYPE_IPV6); - ip6->vtc_flow = - rte_cpu_to_be_32(I40E_FDIR_IPv6_DEFAULT_VTC_FLOW | - (fdir_input->flow.ipv6_flow.tc << - I40E_FDIR_IPv6_TC_OFFSET)); - ip6->payload_len = - rte_cpu_to_be_16(I40E_FDIR_IPv6_PAYLOAD_LEN); - if (!is_customized_pctype) - ip6->proto = fdir_input->flow.ipv6_flow.proto ? - fdir_input->flow.ipv6_flow.proto : - next_proto[fdir_input->pctype]; else if (cus_pctype->index == I40E_CUSTOMIZED_IPV6_L2TPV3) - ip6->proto = IPPROTO_L2TP; - ip6->hop_limits = fdir_input->flow.ipv6_flow.hop_limits ? - fdir_input->flow.ipv6_flow.hop_limits : - I40E_FDIR_IPv6_DEFAULT_HOP_LIMITS; - /** - * The source and destination fields in the transmitted packet - * need to be presented in a reversed order with respect - * to the expected received packets. - */ - rte_memcpy(&ip6->src_addr, - &fdir_input->flow.ipv6_flow.dst_ip, - IPV6_ADDR_LEN); - rte_memcpy(&ip6->dst_addr, - &fdir_input->flow.ipv6_flow.src_ip, - IPV6_ADDR_LEN); - len += sizeof(struct rte_ipv6_hdr); + len = fill_ip6_head(fdir_input, raw_pkt, IPPROTO_L2TP, + len, ether_type); } else { PMD_DRV_LOG(ERR, "unknown pctype %u.", fdir_input->pctype); return -1;