From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from rcdn-iport-4.cisco.com (rcdn-iport-4.cisco.com [173.37.86.75]) by dpdk.org (Postfix) with ESMTP id 9C9B658FE; Wed, 10 Apr 2019 07:35:05 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=cisco.com; i=@cisco.com; l=2514; q=dns/txt; s=iport; t=1554874505; x=1556084105; h=from:to:cc:subject:date:message-id; bh=dWOH9Fw5PAjIQusGiOXAsngr0Yd054TLaukk9ti3WyQ=; b=kfiFjRPUU4+31JnfQTKLezw7RgUS2lHJehJvxjDD0XjSi/8A9xL8ypTw PDLPzW5b4adOZxesjV2GEIdSnDSjyL7ZfFdqr8+8KyS1159OlfBxm4BxX 9C9iuEy4MvJekpMGzWUVOm+mKGKoG4mgEcRPQ4NGtqEa/epcb1baoWKqI g=; X-IronPort-AV: E=Sophos;i="5.60,332,1549929600"; d="scan'208";a="545635741" Received: from rcdn-core-4.cisco.com ([173.37.93.155]) by rcdn-iport-4.cisco.com with ESMTP/TLS/DHE-RSA-SEED-SHA; 10 Apr 2019 05:35:04 +0000 Received: from cisco.com (savbu-usnic-a.cisco.com [10.193.184.48]) by rcdn-core-4.cisco.com (8.15.2/8.15.2) with ESMTP id x3A5Z3F2027206; Wed, 10 Apr 2019 05:35:04 GMT Received: by cisco.com (Postfix, from userid 508933) id 6B6A120F2001; Tue, 9 Apr 2019 22:35:03 -0700 (PDT) From: Hyong Youb Kim To: Ferruh Yigit Cc: dev@dpdk.org, John Daley , Hyong Youb Kim , stable@dpdk.org Date: Tue, 9 Apr 2019 22:35:00 -0700 Message-Id: <20190410053500.27609-1-hyonkim@cisco.com> X-Mailer: git-send-email 2.16.2 X-Outbound-SMTP-Client: 10.193.184.48, savbu-usnic-a.cisco.com X-Outbound-Node: rcdn-core-4.cisco.com Subject: [dpdk-dev] [PATCH] net/enic: fix VLAN inner type matching for older hardware 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: , X-List-Received-Date: Wed, 10 Apr 2019 05:35:06 -0000 The vlan pattern handler currently assumes the NIC always strips vlan header from the L2 buffer, regardless of the vlan strip setting. But, with older VIC models, the vlan header is actually present in the L2 buffer if stripping is disabled. So in this case, the inner ether type needs to be shifted by that much. Fixes: 6ced137607d0 ("net/enic: flow API for NICs with advanced filters enabled") Cc: stable@dpdk.org Signed-off-by: Hyong Youb Kim Reviewed-by: John Daley --- drivers/net/enic/enic_flow.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/drivers/net/enic/enic_flow.c b/drivers/net/enic/enic_flow.c index 5924a01e3..b201387c3 100644 --- a/drivers/net/enic/enic_flow.c +++ b/drivers/net/enic/enic_flow.c @@ -39,6 +39,7 @@ struct copy_item_args { uint8_t *inner_ofst; uint8_t l2_proto_off; uint8_t l3_proto_off; + struct enic *enic; }; /* functions for copying items into enic filters */ @@ -723,12 +724,26 @@ enic_copy_item_vlan_v2(struct copy_item_args *arg) if (eth_mask->ether_type) return ENOTSUP; /* + * For recent models: * When packet matching, the VIC always compares vlan-stripped * L2, regardless of vlan stripping settings. So, the inner type * from vlan becomes the ether type of the eth header. + * + * Older models w/o hardware vxlan parser have a different + * behavior when vlan stripping is disabled. In this case, + * vlan tag remains in the L2 buffer. */ - eth_mask->ether_type = mask->inner_type; - eth_val->ether_type = spec->inner_type; + if (!arg->enic->vxlan && !arg->enic->ig_vlan_strip_en) { + struct vlan_hdr *vlan; + + vlan = (struct vlan_hdr *)(eth_mask + 1); + vlan->eth_proto = mask->inner_type; + vlan = (struct vlan_hdr *)(eth_val + 1); + vlan->eth_proto = spec->inner_type; + } else { + eth_mask->ether_type = mask->inner_type; + eth_val->ether_type = spec->inner_type; + } /* For TCI, use the vlan mask/val fields (little endian). */ gp->mask_vlan = rte_be_to_cpu_16(mask->tci); gp->val_vlan = rte_be_to_cpu_16(spec->tci); @@ -1082,6 +1097,7 @@ enic_copy_filter(const struct rte_flow_item pattern[], args.filter = enic_filter; args.inner_ofst = &inner_ofst; + args.enic = enic; for (; item->type != RTE_FLOW_ITEM_TYPE_END; item++) { /* Get info about how to validate and copy the item. If NULL * is returned the nic does not support the item. -- 2.16.2 From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by dpdk.space (Postfix) with ESMTP id 92D30A0096 for ; Wed, 10 Apr 2019 07:35:08 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id AEB5B5942; Wed, 10 Apr 2019 07:35:06 +0200 (CEST) Received: from rcdn-iport-4.cisco.com (rcdn-iport-4.cisco.com [173.37.86.75]) by dpdk.org (Postfix) with ESMTP id 9C9B658FE; Wed, 10 Apr 2019 07:35:05 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=cisco.com; i=@cisco.com; l=2514; q=dns/txt; s=iport; t=1554874505; x=1556084105; h=from:to:cc:subject:date:message-id; bh=dWOH9Fw5PAjIQusGiOXAsngr0Yd054TLaukk9ti3WyQ=; b=kfiFjRPUU4+31JnfQTKLezw7RgUS2lHJehJvxjDD0XjSi/8A9xL8ypTw PDLPzW5b4adOZxesjV2GEIdSnDSjyL7ZfFdqr8+8KyS1159OlfBxm4BxX 9C9iuEy4MvJekpMGzWUVOm+mKGKoG4mgEcRPQ4NGtqEa/epcb1baoWKqI g=; X-IronPort-AV: E=Sophos;i="5.60,332,1549929600"; d="scan'208";a="545635741" Received: from rcdn-core-4.cisco.com ([173.37.93.155]) by rcdn-iport-4.cisco.com with ESMTP/TLS/DHE-RSA-SEED-SHA; 10 Apr 2019 05:35:04 +0000 Received: from cisco.com (savbu-usnic-a.cisco.com [10.193.184.48]) by rcdn-core-4.cisco.com (8.15.2/8.15.2) with ESMTP id x3A5Z3F2027206; Wed, 10 Apr 2019 05:35:04 GMT Received: by cisco.com (Postfix, from userid 508933) id 6B6A120F2001; Tue, 9 Apr 2019 22:35:03 -0700 (PDT) From: Hyong Youb Kim To: Ferruh Yigit Cc: dev@dpdk.org, John Daley , Hyong Youb Kim , stable@dpdk.org Date: Tue, 9 Apr 2019 22:35:00 -0700 Message-Id: <20190410053500.27609-1-hyonkim@cisco.com> X-Mailer: git-send-email 2.16.2 X-Outbound-SMTP-Client: 10.193.184.48, savbu-usnic-a.cisco.com X-Outbound-Node: rcdn-core-4.cisco.com Subject: [dpdk-dev] [PATCH] net/enic: fix VLAN inner type matching for older hardware 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" Content-Type: text/plain; charset="UTF-8" Message-ID: <20190410053500.m1jdESeqUiCgaWpnsU-ZO7KV4Ui7-SPB6vpkeBvcx4w@z> The vlan pattern handler currently assumes the NIC always strips vlan header from the L2 buffer, regardless of the vlan strip setting. But, with older VIC models, the vlan header is actually present in the L2 buffer if stripping is disabled. So in this case, the inner ether type needs to be shifted by that much. Fixes: 6ced137607d0 ("net/enic: flow API for NICs with advanced filters enabled") Cc: stable@dpdk.org Signed-off-by: Hyong Youb Kim Reviewed-by: John Daley --- drivers/net/enic/enic_flow.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/drivers/net/enic/enic_flow.c b/drivers/net/enic/enic_flow.c index 5924a01e3..b201387c3 100644 --- a/drivers/net/enic/enic_flow.c +++ b/drivers/net/enic/enic_flow.c @@ -39,6 +39,7 @@ struct copy_item_args { uint8_t *inner_ofst; uint8_t l2_proto_off; uint8_t l3_proto_off; + struct enic *enic; }; /* functions for copying items into enic filters */ @@ -723,12 +724,26 @@ enic_copy_item_vlan_v2(struct copy_item_args *arg) if (eth_mask->ether_type) return ENOTSUP; /* + * For recent models: * When packet matching, the VIC always compares vlan-stripped * L2, regardless of vlan stripping settings. So, the inner type * from vlan becomes the ether type of the eth header. + * + * Older models w/o hardware vxlan parser have a different + * behavior when vlan stripping is disabled. In this case, + * vlan tag remains in the L2 buffer. */ - eth_mask->ether_type = mask->inner_type; - eth_val->ether_type = spec->inner_type; + if (!arg->enic->vxlan && !arg->enic->ig_vlan_strip_en) { + struct vlan_hdr *vlan; + + vlan = (struct vlan_hdr *)(eth_mask + 1); + vlan->eth_proto = mask->inner_type; + vlan = (struct vlan_hdr *)(eth_val + 1); + vlan->eth_proto = spec->inner_type; + } else { + eth_mask->ether_type = mask->inner_type; + eth_val->ether_type = spec->inner_type; + } /* For TCI, use the vlan mask/val fields (little endian). */ gp->mask_vlan = rte_be_to_cpu_16(mask->tci); gp->val_vlan = rte_be_to_cpu_16(spec->tci); @@ -1082,6 +1097,7 @@ enic_copy_filter(const struct rte_flow_item pattern[], args.filter = enic_filter; args.inner_ofst = &inner_ofst; + args.enic = enic; for (; item->type != RTE_FLOW_ITEM_TYPE_END; item++) { /* Get info about how to validate and copy the item. If NULL * is returned the nic does not support the item. -- 2.16.2