From patchwork Wed Dec 21 10:01:14 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?N=C3=A9lio_Laranjeiro?= X-Patchwork-Id: 18354 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [IPv6:::1]) by dpdk.org (Postfix) with ESMTP id D67F510C16; Wed, 21 Dec 2016 11:01:51 +0100 (CET) Received: from mail-wm0-f47.google.com (mail-wm0-f47.google.com [74.125.82.47]) by dpdk.org (Postfix) with ESMTP id CC04910BF1 for ; Wed, 21 Dec 2016 11:01:38 +0100 (CET) Received: by mail-wm0-f47.google.com with SMTP id t79so153885394wmt.0 for ; Wed, 21 Dec 2016 02:01:38 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=6wind-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :in-reply-to:references; bh=CztupcVFJ5ZapFVQlnz0HJylMMYnNw1WWUY6W8HBr7U=; b=gpcQOsyplzITnlLS+bUmV6LaN51lhKC3lRpNYj4ITev2xXFhJFJJJBM4Atncq2Ztga OsYsRg6qDbfiyvmWn/iPiGMpX+Gln32D0OLMeTQoqAjvLeXv5WWRkjEJZMqZCLcU9JAP r6f9T9rLtHK7W63/O98Xc7qtnbDHc1fg6boQ4omCHRYI44VvX+QW6WzZ0r3NVbormml2 I+GYwiovB6hGtANihLpvjJhO7fOtvv1RqfXJtL6loRexXgG0+Dtv+4j0cQgMezGFAt1p bdcoAUgIPisxqLOs2aZ9gBbYFlK+s5YhPwkCXtullpaHyD2Qju77+UxAjg7qZCI+ryQL rv8A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:in-reply-to:references; bh=CztupcVFJ5ZapFVQlnz0HJylMMYnNw1WWUY6W8HBr7U=; b=dWOt61gOa8/V2LOg6xg8na/OjHyqgPr6WDeOoDLORLw/AXr2qKxKq2yZF/rK77+MYa /laCtfUS7kt0dK30oWZkeAtSYqWawTlwOQHb86Eo9NsW0R7pWUCrTzrYhCz0oPN9tH1a j/0tpGsecCAGSbiOhtr1Jh/TAAF5eXNERDdB6sKVbbUFF+lBUPyCZdaUYaD1390iaoK5 hwCVadMAFuj2mSgbSeGc8fTCu5Dzy3J/ptPKAxtqMie+i1NOcX6dChQG0Ner7qwrM4Om +2+TAyW337OHy0vUZpAaH8y6WYeTRC50ntUkYtNg7NaUqLwgXB5N9QEisWoVTeKJUQgI xnjg== X-Gm-Message-State: AIkVDXLqMjm5ZQ0EpuPaPHnvgGdd8HivK6XHaOrA3v9E3n2SdQQRglqOhQ3EyjyYbr1KOsqP X-Received: by 10.28.187.11 with SMTP id l11mr3853375wmf.72.1482314498326; Wed, 21 Dec 2016 02:01:38 -0800 (PST) Received: from ping.vm.6wind.com (guy78-3-82-239-227-177.fbx.proxad.net. [82.239.227.177]) by smtp.gmail.com with ESMTPSA id up5sm29615714wjc.12.2016.12.21.02.01.37 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 21 Dec 2016 02:01:37 -0800 (PST) From: Nelio Laranjeiro To: dev@dpdk.org Cc: Adrien Mazarguil Date: Wed, 21 Dec 2016 11:01:14 +0100 Message-Id: <655c7b26837824f7e2d727adaa11663986afe2d6.1482314020.git.nelio.laranjeiro@6wind.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: References: In-Reply-To: References: Subject: [dpdk-dev] [PATCH v2 4/4] net/mlx5: add VLAN filter support in rte_flow 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" Signed-off-by: Nelio Laranjeiro --- drivers/net/mlx5/mlx5_flow.c | 59 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 57 insertions(+), 2 deletions(-) diff --git a/drivers/net/mlx5/mlx5_flow.c b/drivers/net/mlx5/mlx5_flow.c index 44e2fb8..fec1950 100644 --- a/drivers/net/mlx5/mlx5_flow.c +++ b/drivers/net/mlx5/mlx5_flow.c @@ -185,6 +185,9 @@ priv_flow_validate(struct priv *priv, .dst_port = -1, }, }; + const struct rte_flow_item_vlan vlan_mask = { + .tci = -1, + }; if (attr->group) { rte_flow_error_set(error, ENOTSUP, @@ -229,11 +232,32 @@ priv_flow_validate(struct priv *priv, sizeof(eth_mask)); if (err) goto exit_item_not_supported; - } else if (items->type == RTE_FLOW_ITEM_TYPE_IPV4) { + } else if (items->type == RTE_FLOW_ITEM_TYPE_VLAN) { if (!ilast) goto exit_item_not_supported; else if (ilast->type != RTE_FLOW_ITEM_TYPE_ETH) goto exit_item_not_supported; + if (((const struct rte_flow_item_vlan *)items)->tci > + ETHER_MAX_VLAN_ID) { + rte_flow_error_set(error, ENOTSUP, + RTE_FLOW_ERROR_TYPE_ITEM, + items, + "wrong VLAN tci value"); + goto exit; + } + ilast = items; + err = mlx5_flow_item_validate( + items, + (const uint8_t *)&vlan_mask, + sizeof(vlan_mask)); + if (err) + goto exit_item_not_supported; + } else if (items->type == RTE_FLOW_ITEM_TYPE_IPV4) { + if (!ilast) + goto exit_item_not_supported; + else if (ilast->type != RTE_FLOW_ITEM_TYPE_ETH && + ilast->type != RTE_FLOW_ITEM_TYPE_VLAN) + goto exit_item_not_supported; ilast = items; err = mlx5_flow_item_validate( items, @@ -244,7 +268,8 @@ priv_flow_validate(struct priv *priv, } else if (items->type == RTE_FLOW_ITEM_TYPE_IPV6) { if (!ilast) goto exit_item_not_supported; - else if (ilast->type != RTE_FLOW_ITEM_TYPE_ETH) + else if (ilast->type != RTE_FLOW_ITEM_TYPE_ETH && + ilast->type != RTE_FLOW_ITEM_TYPE_VLAN) goto exit_item_not_supported; ilast = items; err = mlx5_flow_item_validate( @@ -376,6 +401,28 @@ mlx5_flow_create_eth(const struct rte_flow_item *item, } /** + * Convert VLAN item to Verbs specification. + * + * @param item[in] + * Item specification. + * @param eth[in, out] + * Verbs Ethernet specification structure. + */ +static void +mlx5_flow_create_vlan(const struct rte_flow_item *item, + struct ibv_exp_flow_spec_eth *eth) +{ + const struct rte_flow_item_vlan *spec = item->spec; + const struct rte_flow_item_vlan *mask = item->mask; + + if (spec) + eth->val.vlan_tag = spec->tci; + if (mask) + eth->mask.vlan_tag = mask->tci; + eth->val.vlan_tag &= eth->mask.vlan_tag; +} + +/** * Convert IPv4 item to Verbs specification. * * @param item[in] @@ -704,6 +751,14 @@ priv_flow_create(struct priv *priv, flow_size += eth_size; ++ibv_attr->num_of_specs; ibv_attr->priority = 2; + } else if (items->type == RTE_FLOW_ITEM_TYPE_VLAN) { + struct ibv_exp_flow_spec_eth *eth; + unsigned int eth_size = + sizeof(struct ibv_exp_flow_spec_eth); + + eth = (void *)((uintptr_t)ibv_attr + flow_size - + eth_size); + mlx5_flow_create_vlan(items, eth); } else if (items->type == RTE_FLOW_ITEM_TYPE_IPV4) { struct ibv_exp_flow_spec_ipv4 *ipv4; unsigned int ipv4_size =