From patchwork Fri Mar 3 12:27:39 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pascal Mazon X-Patchwork-Id: 21292 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 3818FD586; Fri, 3 Mar 2017 13:29:00 +0100 (CET) Received: from proxy.6wind.com (host.76.145.23.62.rev.coltfrance.com [62.23.145.76]) by dpdk.org (Postfix) with ESMTP id BF9FF591E for ; Fri, 3 Mar 2017 13:28:34 +0100 (CET) Received: from 6wind.com (unknown [10.16.0.184]) by proxy.6wind.com (Postfix) with SMTP id F1DE024D73; Fri, 3 Mar 2017 13:28:28 +0100 (CET) Received: by 6wind.com (sSMTP sendmail emulation); Fri, 03 Mar 2017 13:28:27 +0100 From: Pascal Mazon To: keith.wiles@intel.com Cc: dev@dpdk.org, Pascal Mazon Date: Fri, 3 Mar 2017 13:27:39 +0100 Message-Id: <562c8406484ecc8c4ca661b27ba7b4fdde2711ec.1488542158.git.pascal.mazon@6wind.com> X-Mailer: git-send-email 2.8.0.rc0 In-Reply-To: References: Subject: [dpdk-dev] [PATCH 2/4] net/tap: reflect tap flags on the remote 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" Synchronize PROMISC and ALLMULTI flags to the remote netdevice if possible. Leave the IFF_UP flag as it is, however. Signed-off-by: Pascal Mazon Acked-by: Olga Shern --- drivers/net/tap/rte_eth_tap.c | 36 +++++++++++++++++++++++------------- drivers/net/tap/tap.h | 1 + 2 files changed, 24 insertions(+), 13 deletions(-) diff --git a/drivers/net/tap/rte_eth_tap.c b/drivers/net/tap/rte_eth_tap.c index 327fefd0d3a1..c77f206b4f60 100644 --- a/drivers/net/tap/rte_eth_tap.c +++ b/drivers/net/tap/rte_eth_tap.c @@ -249,7 +249,7 @@ pmd_tx_burst(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts) } static int -tap_link_set_flags(struct pmd_internals *pmd, short flags, int add) +tap_netdev_set_flags(const char *iface, short flags, int add) { struct ifreq ifr; int err, s; @@ -266,11 +266,11 @@ tap_link_set_flags(struct pmd_internals *pmd, short flags, int add) return -1; } memset(&ifr, 0, sizeof(ifr)); - snprintf(ifr.ifr_name, IFNAMSIZ, "%s", pmd->name); + snprintf(ifr.ifr_name, IFNAMSIZ, "%s", iface); err = ioctl(s, SIOCGIFFLAGS, &ifr); if (err < 0) { RTE_LOG(WARNING, PMD, "Unable to get %s device flags: %s\n", - pmd->name, strerror(errno)); + iface, strerror(errno)); close(s); return -1; } @@ -288,6 +288,7 @@ tap_link_set_flags(struct pmd_internals *pmd, short flags, int add) close(s); return 0; + } static int @@ -296,7 +297,7 @@ tap_link_set_down(struct rte_eth_dev *dev) struct pmd_internals *pmd = dev->data->dev_private; dev->data->dev_link.link_status = ETH_LINK_DOWN; - return tap_link_set_flags(pmd, IFF_UP | IFF_NOARP, 0); + return tap_netdev_set_flags(pmd->name, IFF_UP | IFF_NOARP, 0); } static int @@ -305,7 +306,7 @@ tap_link_set_up(struct rte_eth_dev *dev) struct pmd_internals *pmd = dev->data->dev_private; dev->data->dev_link.link_status = ETH_LINK_UP; - return tap_link_set_flags(pmd, IFF_UP | IFF_NOARP, 1); + return tap_netdev_set_flags(pmd->name, IFF_UP | IFF_NOARP, 1); } static int @@ -476,9 +477,11 @@ tap_promisc_enable(struct rte_eth_dev *dev) struct pmd_internals *pmd = dev->data->dev_private; dev->data->promiscuous = 1; - tap_link_set_flags(pmd, IFF_PROMISC, 1); - if (pmd->remote_if_index) + tap_netdev_set_flags(pmd->name, IFF_PROMISC, 1); + if (pmd->remote_if_index) { tap_flow_implicit_create(pmd, TAP_REMOTE_PROMISC); + tap_netdev_set_flags(pmd->remote_iface, IFF_PROMISC, 1); + } } static void @@ -487,9 +490,11 @@ tap_promisc_disable(struct rte_eth_dev *dev) struct pmd_internals *pmd = dev->data->dev_private; dev->data->promiscuous = 0; - tap_link_set_flags(pmd, IFF_PROMISC, 0); - if (pmd->remote_if_index) + tap_netdev_set_flags(pmd->name, IFF_PROMISC, 0); + if (pmd->remote_if_index) { tap_flow_implicit_destroy(dev, TAP_REMOTE_PROMISC); + tap_netdev_set_flags(pmd->remote_iface, IFF_PROMISC, 0); + } } static void @@ -498,9 +503,11 @@ tap_allmulti_enable(struct rte_eth_dev *dev) struct pmd_internals *pmd = dev->data->dev_private; dev->data->all_multicast = 1; - tap_link_set_flags(pmd, IFF_ALLMULTI, 1); - if (pmd->remote_if_index) + tap_netdev_set_flags(pmd->name, IFF_ALLMULTI, 1); + if (pmd->remote_if_index) { tap_flow_implicit_create(pmd, TAP_REMOTE_ALLMULTI); + tap_netdev_set_flags(pmd->remote_iface, IFF_ALLMULTI, 1); + } } static void @@ -509,9 +516,11 @@ tap_allmulti_disable(struct rte_eth_dev *dev) struct pmd_internals *pmd = dev->data->dev_private; dev->data->all_multicast = 0; - tap_link_set_flags(pmd, IFF_ALLMULTI, 0); - if (pmd->remote_if_index) + tap_netdev_set_flags(pmd->name, IFF_ALLMULTI, 0); + if (pmd->remote_if_index) { tap_flow_implicit_destroy(dev, TAP_REMOTE_ALLMULTI); + tap_netdev_set_flags(pmd->remote_iface, IFF_ALLMULTI, 0); + } } static void @@ -924,6 +933,7 @@ eth_dev_tap_create(const char *name, char *tap_name, char *remote_iface) */ pmd->nlsk_fd = nl_init(); if (strlen(remote_iface)) { + strncpy(pmd->remote_iface, remote_iface, RTE_ETH_NAME_MAX_LEN); pmd->remote_if_index = if_nametoindex(remote_iface); if (!pmd->remote_if_index) RTE_LOG(ERR, PMD, "Could not find %s ifindex: " diff --git a/drivers/net/tap/tap.h b/drivers/net/tap/tap.h index a5f83d4feea3..2afd0f9a4a58 100644 --- a/drivers/net/tap/tap.h +++ b/drivers/net/tap/tap.h @@ -64,6 +64,7 @@ struct tx_queue { struct pmd_internals { char name[RTE_ETH_NAME_MAX_LEN]; /* Internal Tap device name */ + char remote_iface[RTE_ETH_NAME_MAX_LEN]; /* Remote netdevice name */ int nlsk_fd; /* Netlink socket fd */ uint16_t nb_queues; /* Number of queues supported */ struct ether_addr eth_addr; /* Mac address of the device port */