From patchwork Mon Mar 19 15:20:54 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: 36277 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 2D2601AFF4; Mon, 19 Mar 2018 16:22:05 +0100 (CET) Received: from mail-wm0-f67.google.com (mail-wm0-f67.google.com [74.125.82.67]) by dpdk.org (Postfix) with ESMTP id 3F86DAAEB for ; Mon, 19 Mar 2018 16:22:02 +0100 (CET) Received: by mail-wm0-f67.google.com with SMTP id x82so3621726wmg.1 for ; Mon, 19 Mar 2018 08:22:02 -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=YF6PXmFCVEQIXiX1cqHqxAYjY7UDc1/P6Pw3hRe7eP4=; b=Is92Kkutori8Gz5BTggo3bNhLyGpLEDHUiWEsGnrPGkb+8hmE5PbXWuxXqnmtgtuh5 5bJ7Hx8DyKKVrp6ckUOWn0Vc9VTLUzDOwddd+obvPvepeAevJCu0kYr4SuKSFTeXKKXO X+j8+z7Um7ZnvFlAfoSlctTCoDc5bfd92KKC95wqMrFIDDYT0vVVHhgBlnirV3TEzug1 A0KrdDuywsPapGSLDexNyJLhLM8yMRIIzpTKYyuLBnQN0PhySmShEr/qkUuDmE4Us7FW sTazVMQkI8QKobiglrMO9MBKX1Log/H31H0S8dE+JeSdhqtPh/Nx4KMeKP9GJvN1SEeG x+xQ== 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=YF6PXmFCVEQIXiX1cqHqxAYjY7UDc1/P6Pw3hRe7eP4=; b=ZgskrK+XddomUbDFleqf8XC/Ow6D229g8xzTzrLO8qt/YvKdfbFyV3067z6Iy3AANo AQXQbKmAtwbWK3oNW0cG+gKrVHPRCrimHhQc/n0MUsTOQYXtuxb35uXtOoJAhKNmdGOW Yj7zkBoQU9362zXyv8m+ZXI/EtFmb9YGh1B0EYPbZrVA2RxZMBVaWmmdWw4D8OPd8Wo2 f9rAUVPwUIW6//ceFv+gyaKfyvTq6lIJAY+tjTEjqf1ZHurnvHNxrLg72FZPjd6ScHB7 uURQXPqp8xDL9SzHpoGLDFxre1oSwe+qB7GcLl08BABM+GwtMqTdG/rFjKM/WigemLko F+BA== X-Gm-Message-State: AElRT7HGrR2rElzT9FJsoyxfM6vlwFJZli4Rki77od/7KpJmEICnGaul BbpBkxWXUwZ+6J9qzPzO44Ql X-Google-Smtp-Source: AG47ELsL68KHY2YvpOqgA+ENJc10IVUBLwDCEuTUDa/Qn9rdXOFcDzbrlf+LTBUmpamdW4mpNGWrxA== X-Received: by 10.28.94.75 with SMTP id s72mr9572658wmb.126.1521472921884; Mon, 19 Mar 2018 08:22:01 -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 59sm392566wro.35.2018.03.19.08.22.01 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 19 Mar 2018 08:22:01 -0700 (PDT) From: Nelio Laranjeiro To: Adrien Mazarguil , Yongseok Koh Cc: dev@dpdk.org Date: Mon, 19 Mar 2018 16:20:54 +0100 Message-Id: <7fb0c0b3f11aca8d2b9594b808b753561cb8837b.1521472647.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 v2 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 21edefc0f..562d219fa 100644 --- a/drivers/net/mlx5/mlx5_nl.c +++ b/drivers/net/mlx5/mlx5_nl.c @@ -527,3 +527,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",