From patchwork Wed Mar 21 13:40:06 2018 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: 36381 X-Patchwork-Delegate: shahafs@mellanox.com Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id C569171B4; Wed, 21 Mar 2018 14:41:15 +0100 (CET) Received: from mail-wm0-f68.google.com (mail-wm0-f68.google.com [74.125.82.68]) by dpdk.org (Postfix) with ESMTP id 4ADEE5F5F for ; Wed, 21 Mar 2018 14:41:13 +0100 (CET) Received: by mail-wm0-f68.google.com with SMTP id x82so9868965wmg.1 for ; Wed, 21 Mar 2018 06:41:13 -0700 (PDT) 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=JVtJIMC4uldgQeAYXdR/OWZCavZxUrSDmR3Q/lW6odU=; b=TmN04t2lRjmFggrEsCWJEvGq3iyynSe3TMPYEPe2WAfVl6XriQSp3M2LXMTjXADlHo l7yAlPD6o/P5rDXCWYdAGHgJ+wlJ+48hD7bisz7B72cyaYQgcn9dg15SSOpA5gA8MZ5H l55GqEiIlxhMU8gMQxXW9GHbOicT1hNj4EVr++MH6QW01SlQxdg0cdaUb3X7PbS5e0ef cVZ/Gea8Nqj7XE+4m8CDFg/lmJQhS1Xzkd3GDbRkzib8umMevM43CxJqFxlDODXLVKpK Gr8W+MjIIptfblZVkglDm/w7dBkT+SGf9cnSSw46WxV9ndJx9Jsy7WeEzI4vj8Up56z4 BImA== 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=JVtJIMC4uldgQeAYXdR/OWZCavZxUrSDmR3Q/lW6odU=; b=VmNJlec3OuyhHIgK2kfmjgEobMMBvY55cRcpM3gL8BCIwqoTVozp3LAFqnXAvxMCIQ lKcEHwc1l+qKtlOTv+jAnbAYo7D/wyNufFc0QtvGbxiYVMYM4bUTwhCBg/WsgmVPKlnK gPzkX0FPWCd2EPuF/gaeJvDY/GWQmt9sn/Pk6ReUr7K+YwC3hxAAPDILYkJiCnUOzsqt U43LsaYN4EHUy3rYKST0Sr0LJp4YrhH54DcbA6jlDiWBSJ8soIWBV/nP0YOr9KG9FFU5 NnlNygmRYg1ZxIryGCQFDz2Y3ds5xubpr0hYA/CL5D8yc+xnyRHPI6NdCBDepkhCmdcl qowQ== X-Gm-Message-State: AElRT7EAq/tHuHSwGNGIwy/bG0OzDwFjc79gYNDhV24pX5xYAzFJ5QXG WLZilLqO8QpyHbYNJXsFRXoR X-Google-Smtp-Source: AG47ELuZ9AQfDxDxcBypg4eXlb4AO5jqjLKcy8zfKt+tB7j9JLieaRb5cdKpHpKhqTwqXwMnkl6l8Q== X-Received: by 10.28.227.66 with SMTP id a63mr2580465wmh.128.1521639671847; Wed, 21 Mar 2018 06:41:11 -0700 (PDT) Received: from laranjeiro-vm.dev.6wind.com (host.78.145.23.62.rev.coltfrance.com. [62.23.145.78]) by smtp.gmail.com with ESMTPSA id m62sm6314620wmc.25.2018.03.21.06.41.11 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 21 Mar 2018 06:41:11 -0700 (PDT) From: Nelio Laranjeiro To: Adrien Mazarguil , Yongseok Koh Cc: dev@dpdk.org Date: Wed, 21 Mar 2018 14:40:06 +0100 Message-Id: <73d9075c4ac78166d5ae88bec01542d9a5af9463.1521639463.git.nelio.laranjeiro@6wind.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: References: In-Reply-To: References: Subject: [dpdk-dev] [PATCH v3 2/3] net/mlx5: use Netlink to enable promisc / all multicast mode 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" VF devices are not able to receive promisc or allmulti traffic unless it fully requests it though Netlink. This will cause the request to be processed by the PF which will handle the request and enable it. This requires the VF to be trusted by the PF. Signed-off-by: Nelio Laranjeiro Acked-by: Adrien Mazarguil --- drivers/net/mlx5/mlx5_nl.c | 94 ++++++++++++++++++++++++++++++++++++++++++ drivers/net/mlx5/mlx5_rxmode.c | 8 ++++ 2 files changed, 102 insertions(+) diff --git a/drivers/net/mlx5/mlx5_nl.c b/drivers/net/mlx5/mlx5_nl.c index cf0df0c2f..7d97e1139 100644 --- a/drivers/net/mlx5/mlx5_nl.c +++ b/drivers/net/mlx5/mlx5_nl.c @@ -528,3 +528,97 @@ mlx5_nl_mac_addr_flush(struct rte_eth_dev *dev) mlx5_nl_mac_addr_remove(dev, m); } } + +/** + * Enable promiscuous / all multicast mode through Netlink. + * + * @param dev + * Pointer to Ethernet device structure. + * @param flags + * IFF_PROMISC for promiscuous, IFF_ALLMULTI for allmulti. + * @param enable + * Nonzero to enable, disable otherwise. + * + * @return + * 0 on success, a negative errno value otherwise and rte_errno is set. + */ +static int +mlx5_nl_device_flags(struct rte_eth_dev *dev, uint32_t flags, int enable) +{ + struct priv *priv = dev->data->dev_private; + int iface_idx = mlx5_ifindex(dev); + struct { + struct nlmsghdr hdr; + struct ifinfomsg ifi; + } req = { + .hdr = { + .nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg)), + .nlmsg_type = RTM_NEWLINK, + .nlmsg_flags = NLM_F_REQUEST, + }, + .ifi = { + .ifi_flags = enable ? flags : 0, + .ifi_change = flags, + .ifi_index = iface_idx, + }, + }; + int fd; + int ret; + + assert(!(flags & ~(IFF_PROMISC | IFF_ALLMULTI))); + if (priv->nl_socket < 0) + return 0; + fd = priv->nl_socket; + ret = mlx5_nl_send(fd, &req.hdr, priv->nl_sn++); + if (ret < 0) + return ret; + return 0; +} + +/** + * Enable promiscuous mode through Netlink. + * + * @param dev + * Pointer to Ethernet device structure. + * @param enable + * Nonzero to enable, disable otherwise. + * + * @return + * 0 on success, a negative errno value otherwise and rte_errno is set. + */ +int +mlx5_nl_promisc(struct rte_eth_dev *dev, int enable) +{ + int ret = mlx5_nl_device_flags(dev, IFF_PROMISC, enable); + + if (ret) + DRV_LOG(DEBUG, + "port %u cannot %s promisc mode: Netlink error %s", + dev->data->port_id, enable ? "enable" : "disable", + strerror(rte_errno)); + return ret; +} + +/** + * Enable all multicast mode through Netlink. + * + * @param dev + * Pointer to Ethernet device structure. + * @param enable + * Nonzero to enable, disable otherwise. + * + * @return + * 0 on success, a negative errno value otherwise and rte_errno is set. + */ +int +mlx5_nl_allmulti(struct rte_eth_dev *dev, int enable) +{ + int ret = mlx5_nl_device_flags(dev, IFF_ALLMULTI, enable); + + if (ret) + DRV_LOG(DEBUG, + "port %u cannot %s allmulti mode: Netlink error %s", + dev->data->port_id, enable ? "enable" : "disable", + strerror(rte_errno)); + return ret; +} diff --git a/drivers/net/mlx5/mlx5_rxmode.c b/drivers/net/mlx5/mlx5_rxmode.c index e43a4b030..c1c0f21c7 100644 --- a/drivers/net/mlx5/mlx5_rxmode.c +++ b/drivers/net/mlx5/mlx5_rxmode.c @@ -35,6 +35,8 @@ mlx5_promiscuous_enable(struct rte_eth_dev *dev) int ret; dev->data->promiscuous = 1; + if (((struct priv *)dev->data->dev_private)->config.vf) + mlx5_nl_promisc(dev, 1); ret = mlx5_traffic_restart(dev); if (ret) DRV_LOG(ERR, "port %u cannot enable promiscuous mode: %s", @@ -53,6 +55,8 @@ mlx5_promiscuous_disable(struct rte_eth_dev *dev) int ret; dev->data->promiscuous = 0; + if (((struct priv *)dev->data->dev_private)->config.vf) + mlx5_nl_promisc(dev, 0); ret = mlx5_traffic_restart(dev); if (ret) DRV_LOG(ERR, "port %u cannot disable promiscuous mode: %s", @@ -71,6 +75,8 @@ mlx5_allmulticast_enable(struct rte_eth_dev *dev) int ret; dev->data->all_multicast = 1; + if (((struct priv *)dev->data->dev_private)->config.vf) + mlx5_nl_allmulti(dev, 1); ret = mlx5_traffic_restart(dev); if (ret) DRV_LOG(ERR, "port %u cannot enable allmulicast mode: %s", @@ -89,6 +95,8 @@ mlx5_allmulticast_disable(struct rte_eth_dev *dev) int ret; dev->data->all_multicast = 0; + if (((struct priv *)dev->data->dev_private)->config.vf) + mlx5_nl_allmulti(dev, 0); ret = mlx5_traffic_restart(dev); if (ret) DRV_LOG(ERR, "port %u cannot disable allmulicast mode: %s",