From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from proxy.6wind.com (host.76.145.23.62.rev.coltfrance.com [62.23.145.76]) by dpdk.org (Postfix) with ESMTP id B9425CF9E for ; Tue, 14 Mar 2017 09:24:08 +0100 (CET) Received: from 6wind.com (unknown [10.16.0.184]) by proxy.6wind.com (Postfix) with SMTP id E183A2697F; Tue, 14 Mar 2017 09:24:02 +0100 (CET) Received: by 6wind.com (sSMTP sendmail emulation); Tue, 14 Mar 2017 09:23:04 +0100 From: Pascal Mazon To: keith.wiles@intel.com Cc: dev@dpdk.org, Pascal Mazon Date: Tue, 14 Mar 2017 09:22:47 +0100 Message-Id: <784398536e7bc073048eb10d73ea07a21712b6bf.1489479553.git.pascal.mazon@6wind.com> X-Mailer: git-send-email 2.8.0.rc0 In-Reply-To: References: <1488904298-31395-1-git-send-email-pascal.mazon@6wind.com> Subject: [dpdk-dev] [PATCH v4 3/8] net/tap: add MAC address management 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: , X-List-Received-Date: Tue, 14 Mar 2017 08:24:09 -0000 As soon as the netdevice is created, update pmd->mac_addr with its actual MAC address. Signed-off-by: Pascal Mazon --- doc/guides/nics/features/tap.ini | 1 + drivers/net/tap/rte_eth_tap.c | 39 +++++++++++++++++++++++++++++++++------ 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/doc/guides/nics/features/tap.ini b/doc/guides/nics/features/tap.ini index f4aca6921ddc..d9b47a003654 100644 --- a/doc/guides/nics/features/tap.ini +++ b/doc/guides/nics/features/tap.ini @@ -9,6 +9,7 @@ Jumbo frame = Y Promiscuous mode = Y Allmulticast mode = Y Basic stats = Y +Unicast MAC filter = Y Other kdrv = Y ARMv7 = Y ARMv8 = Y diff --git a/drivers/net/tap/rte_eth_tap.c b/drivers/net/tap/rte_eth_tap.c index 18edac57eead..06c1faa92dce 100644 --- a/drivers/net/tap/rte_eth_tap.c +++ b/drivers/net/tap/rte_eth_tap.c @@ -113,6 +113,10 @@ struct pmd_internals { struct tx_queue txq[RTE_PMD_TAP_MAX_QUEUES]; /* List of TX queues */ }; +static int +tap_ioctl(struct pmd_internals *pmd, unsigned long request, + struct ifreq *ifr, int set); + /* Tun/Tap allocation routine * * name is the number of the interface to use, unless NULL to take the host @@ -178,13 +182,12 @@ tun_alloc(struct pmd_internals *pmd, uint16_t qid) } if (qid == 0) { - if (ioctl(fd, SIOCGIFHWADDR, &ifr) == -1) { - RTE_LOG(ERR, PMD, "ioctl failed (SIOCGIFHWADDR) (%s)\n", - ifr.ifr_name); - goto error; - } + struct ifreq ifr; - rte_memcpy(&pmd->eth_addr, ifr.ifr_hwaddr.sa_data, ETH_ALEN); + if (tap_ioctl(pmd, SIOCGIFHWADDR, &ifr, 0) < 0) + goto error; + rte_memcpy(&pmd->eth_addr, ifr.ifr_hwaddr.sa_data, + ETHER_ADDR_LEN); } return fd; @@ -297,6 +300,9 @@ tap_ioctl(struct pmd_internals *pmd, unsigned long request, else ifr->ifr_flags &= ~req_flags; break; + case SIOCGIFHWADDR: + case SIOCSIFHWADDR: + break; default: RTE_LOG(WARNING, PMD, "%s: ioctl() called with wrong arg\n", pmd->name); @@ -499,6 +505,26 @@ tap_allmulti_disable(struct rte_eth_dev *dev) tap_ioctl(pmd, SIOCSIFFLAGS, &ifr, 0); } + +static void +tap_mac_set(struct rte_eth_dev *dev, struct ether_addr *mac_addr) +{ + struct pmd_internals *pmd = dev->data->dev_private; + struct ifreq ifr; + + if (is_zero_ether_addr(mac_addr)) { + RTE_LOG(ERR, PMD, "%s: can't set an empty MAC address\n", + dev->data->name); + return; + } + + ifr.ifr_hwaddr.sa_family = AF_LOCAL; + rte_memcpy(ifr.ifr_hwaddr.sa_data, mac_addr, ETHER_ADDR_LEN); + if (tap_ioctl(pmd, SIOCSIFHWADDR, &ifr, 1) < 0) + return; + rte_memcpy(&pmd->eth_addr, mac_addr, ETHER_ADDR_LEN); +} + static int tap_setup_queue(struct rte_eth_dev *dev, struct pmd_internals *internals, @@ -633,6 +659,7 @@ static const struct eth_dev_ops ops = { .promiscuous_disable = tap_promisc_disable, .allmulticast_enable = tap_allmulti_enable, .allmulticast_disable = tap_allmulti_disable, + .mac_addr_set = tap_mac_set, .stats_get = tap_stats_get, .stats_reset = tap_stats_reset, }; -- 2.8.0.rc0