From patchwork Thu Apr 5 15:07:20 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: 37314 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 A2C1A1CC87; Thu, 5 Apr 2018 17:07:32 +0200 (CEST) Received: from mail-wr0-f193.google.com (mail-wr0-f193.google.com [209.85.128.193]) by dpdk.org (Postfix) with ESMTP id 535A81CC69 for ; Thu, 5 Apr 2018 17:07:27 +0200 (CEST) Received: by mail-wr0-f193.google.com with SMTP id c24so28988242wrc.6 for ; Thu, 05 Apr 2018 08:07:27 -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=JyqJ+3CMMAnXkgjba9HKJJTmgHUgYFUuJMRTRh4l0xE=; b=hCyvYzHXQtGuOZVTmtJBuVDbd+U1GR0pZ88CE/V8HCtM6CIK6rLe8EYPOvXlZfojBi j6v54xQGthH4AdRV2E5ux5ipbcfp7sEaEwWTGDL7L/zalmAnd1LmTeNGbrcKKgaQN2sU jFJ6s74FyczWwWydCfDmmFf0YEYEIKnF8DtJayImLKHiXCyGiVRVIjRAY91c7HEmnKjC vdtmwHXI9fjSdwgNHqZitJ/4PQnljFqUlLq/cglBRtrcVSW1vaZdNGmHvG84rpq3XoVJ yU7c4aX6cqyuzz3c6sK6PI4A6LGlUcXGTHt+9QWsNAHfDmrrbLm/1n6gFWrGQUursrsA Xm2g== 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=JyqJ+3CMMAnXkgjba9HKJJTmgHUgYFUuJMRTRh4l0xE=; b=Z/T7cedWFq4k6+BuCkveOfZ+Fx9yqd10BOD/OIYiSI0fkMoR/y7UGvaW3r3jbDDjRV 6T0zZKw2UEL3xaVoV526xQhEReoF3b9u2fa/i04F/xQkpf5iS3n8EXbPaWwR3tDsc69J FZzcsWQaFXIx51/CIbHzUQikUSw+snToDJIhLMCFbJkXcshnv4Wgv4LCPaY+huJ5Tpog 6VZAFKkHVB9EK22RmDKVOhNRMH8ouScEojEXE7IW93X0CRVzCOqLRVPYhVt96UYyXXGU hW8d1THq4g4tXJFLBJ4x+zPTVFia8nYHmP4NBXfzy0UK5PrmhskokIbSMPvP7Nf4MlJo BLOw== X-Gm-Message-State: AElRT7E5XqPd4PwHeRWwvOokcJhTVTbYUuOTsmSttCkwJoL9YzcFavpr /wSyqob/O1drj3tnJCsTNl+R X-Google-Smtp-Source: AIpwx49jHfpZI2biB+BnxK0smCeUkvZrYuxMfgC1swoXmtgnYZcvMvVpYuhJ9vxE52R09CYltJTCwA== X-Received: by 10.223.181.148 with SMTP id c20mr17652459wre.65.1522940846769; Thu, 05 Apr 2018 08:07:26 -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 y100sm3514166wmh.2.2018.04.05.08.07.26 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 05 Apr 2018 08:07:26 -0700 (PDT) From: Nelio Laranjeiro To: Adrien Mazarguil , Yongseok Koh Cc: dev@dpdk.org Date: Thu, 5 Apr 2018 17:07:20 +0200 Message-Id: <0bbc1afb9311dae31c22d5103888ac940586d166.1522940682.git.nelio.laranjeiro@6wind.com> X-Mailer: git-send-email 2.17.0 In-Reply-To: References: In-Reply-To: References: Subject: [dpdk-dev] [PATCH v4 2/3] net/mlx5: use Netlink to enable promisc / allmulti 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.h | 2 + drivers/net/mlx5/mlx5_nl.c | 94 ++++++++++++++++++++++++++++++++++ drivers/net/mlx5/mlx5_rxmode.c | 8 +++ 3 files changed, 104 insertions(+) diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h index 683026b0f..50cc09946 100644 --- a/drivers/net/mlx5/mlx5.h +++ b/drivers/net/mlx5/mlx5.h @@ -312,5 +312,7 @@ int mlx5_nl_mac_addr_remove(struct rte_eth_dev *dev, struct ether_addr *mac, uint32_t index); void mlx5_nl_mac_addr_sync(struct rte_eth_dev *dev); void mlx5_nl_mac_addr_flush(struct rte_eth_dev *dev); +int mlx5_nl_promisc(struct rte_eth_dev *dev, int enable); +int mlx5_nl_allmulti(struct rte_eth_dev *dev, int enable); #endif /* RTE_PMD_MLX5_H_ */ diff --git a/drivers/net/mlx5/mlx5_nl.c b/drivers/net/mlx5/mlx5_nl.c index 2f238beb3..fe0e81710 100644 --- a/drivers/net/mlx5/mlx5_nl.c +++ b/drivers/net/mlx5/mlx5_nl.c @@ -531,3 +531,97 @@ mlx5_nl_mac_addr_flush(struct rte_eth_dev *dev) mlx5_nl_mac_addr_remove(dev, m, i); } } + +/** + * 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",