All of lore.kernel.org
 help / color / mirror / Atom feed
From: Pascal Mazon <pascal.mazon@6wind.com>
To: keith.wiles@intel.com
Cc: dev@dpdk.org, Pascal Mazon <pascal.mazon@6wind.com>
Subject: [PATCH v3 1/6] net/tap: add MAC address management ops
Date: Tue,  7 Mar 2017 17:31:33 +0100	[thread overview]
Message-ID: <1488904298-31395-2-git-send-email-pascal.mazon@6wind.com> (raw)
In-Reply-To: <cover.1488817125.git.pascal.mazon@6wind.com>

Set a random MAC address when probing the device, as to not leave an
empty MAC in pmd->eth_addr.

This MAC will be set on the tap netdevice as soon as it's been created
using tun_alloc(). As the tap_mac_add() function depend on the fd in
the first rxq, move code from tun_alloc() to tap_setup_queue(),
after it's been set.

Signed-off-by: Pascal Mazon <pascal.mazon@6wind.com>
---
 doc/guides/nics/features/tap.ini |  1 +
 drivers/net/tap/rte_eth_tap.c    | 97 ++++++++++++++++++++++++++++++++++------
 2 files changed, 85 insertions(+), 13 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 ece3a5fcc897..1e46ee36efa2 100644
--- a/drivers/net/tap/rte_eth_tap.c
+++ b/drivers/net/tap/rte_eth_tap.c
@@ -63,6 +63,8 @@
 #define RTE_PMD_TAP_MAX_QUEUES	1
 #endif
 
+#define RTE_PMD_TAP_MAX_MAC_ADDRS 1
+
 static struct rte_vdev_driver pmd_tap_drv;
 
 static const char *valid_arguments[] = {
@@ -118,7 +120,7 @@ struct pmd_internals {
  * supplied name.
  */
 static int
-tun_alloc(struct pmd_internals *pmd, uint16_t qid)
+tun_alloc(struct pmd_internals *pmd)
 {
 	struct ifreq ifr;
 #ifdef IFF_MULTI_QUEUE
@@ -176,16 +178,6 @@ tun_alloc(struct pmd_internals *pmd, uint16_t qid)
 		goto error;
 	}
 
-	if (qid == 0) {
-		if (ioctl(fd, SIOCGIFHWADDR, &ifr) == -1) {
-			RTE_LOG(ERR, PMD, "ioctl failed (SIOCGIFHWADDR) (%s)\n",
-				ifr.ifr_name);
-			goto error;
-		}
-
-		rte_memcpy(&pmd->eth_addr, ifr.ifr_hwaddr.sa_data, ETH_ALEN);
-	}
-
 	return fd;
 
 error:
@@ -365,7 +357,7 @@ tap_dev_info(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
 	struct pmd_internals *internals = dev->data->dev_private;
 
 	dev_info->if_index = internals->if_index;
-	dev_info->max_mac_addrs = 1;
+	dev_info->max_mac_addrs = RTE_PMD_TAP_MAX_MAC_ADDRS;
 	dev_info->max_rx_pktlen = (uint32_t)ETHER_MAX_VLAN_FRAME_LEN;
 	dev_info->max_rx_queues = internals->nb_queues;
 	dev_info->max_tx_queues = internals->nb_queues;
@@ -502,6 +494,69 @@ tap_allmulti_disable(struct rte_eth_dev *dev)
 	tap_link_set_flags(pmd, IFF_ALLMULTI, 0);
 }
 
+static void
+tap_mac_remove(struct rte_eth_dev *dev __rte_unused,
+	       uint32_t index __rte_unused)
+{
+	/*
+	 * A single MAC is authorized on the device and it's not possible to
+	 * leave the device without a MAC. Don't do anything, then.
+	 */
+}
+
+static void
+tap_mac_add(struct rte_eth_dev *dev, struct ether_addr *mac_addr,
+	    uint32_t index, uint32_t vmdq __rte_unused)
+{
+	struct pmd_internals *internals = dev->data->dev_private;
+	int fd = internals->rxq[0].fd;
+	struct ifreq ifr;
+
+	if (index > RTE_PMD_TAP_MAX_MAC_ADDRS - 1) {
+		RTE_LOG(ERR, PMD,
+			"%s: can't set MAC address: index %d > max %d\n",
+			dev->data->name, index, RTE_PMD_TAP_MAX_MAC_ADDRS - 1);
+		return;
+	}
+	if (is_zero_ether_addr(mac_addr)) {
+		RTE_LOG(ERR, PMD,
+			"%s: can't set an empty MAC address.\n",
+			dev->data->name);
+		return;
+	}
+	if (fd < 0) {
+		RTE_LOG(ERR, PMD,
+			"%s: can't set MAC address: device does not exist.\n",
+			dev->data->name);
+		return;
+	}
+	memset(&ifr, 0, sizeof(struct ifreq));
+	if (ioctl(fd, SIOCGIFHWADDR, &ifr) == -1) {
+		RTE_LOG(ERR, PMD, "%s: couldn't get current MAC address (%s)\n",
+			dev->data->name, strerror(errno));
+		return;
+	}
+	rte_memcpy(ifr.ifr_hwaddr.sa_data, mac_addr, ETHER_ADDR_LEN);
+	if (ioctl(fd, SIOCSIFHWADDR, &ifr) == -1) {
+		RTE_LOG(ERR, PMD, "%s: couldn't set current MAC address (%s)\n",
+			dev->data->name, strerror(errno));
+		return;
+	}
+	rte_memcpy(&dev->data->mac_addrs[index], mac_addr, ETHER_ADDR_LEN);
+}
+
+static void
+tap_mac_set(struct rte_eth_dev *dev, struct ether_addr *mac_addr)
+{
+	if (is_zero_ether_addr(mac_addr)) {
+		RTE_LOG(ERR, PMD, "%s: can't set an empty MAC address\n",
+			dev->data->name);
+		return;
+	}
+	tap_mac_remove(dev, 0);
+	tap_mac_add(dev, mac_addr, 0, 0);
+}
+
 static int
 tap_setup_queue(struct rte_eth_dev *dev,
 		struct pmd_internals *internals,
@@ -518,7 +573,7 @@ tap_setup_queue(struct rte_eth_dev *dev,
 		if (fd < 0) {
 			RTE_LOG(INFO, PMD, "Add queue to TAP %s for qid %d\n",
 				pmd->name, qid);
-			fd = tun_alloc(pmd, qid);
+			fd = tun_alloc(pmd);
 			if (fd < 0) {
 				RTE_LOG(ERR, PMD, "tun_alloc(%s, %d) failed\n",
 					pmd->name, qid);
@@ -530,6 +585,18 @@ tap_setup_queue(struct rte_eth_dev *dev,
 	rx->fd = fd;
 	tx->fd = fd;
 
+	if (qid == 0) {
+		/*
+		 * tap_setup_queue() is called for both tx and rx.
+		 * Let's use dev->data->r/tx_queues[qid] to determine if init
+		 * has already been done.
+		 */
+		if (dev->data->rx_queues[qid] && dev->data->tx_queues[qid])
+			return fd;
+
+		tap_mac_set(dev, &pmd->eth_addr);
+	}
+
 	return fd;
 }
 
@@ -636,6 +703,9 @@ static const struct eth_dev_ops ops = {
 	.promiscuous_disable    = tap_promisc_disable,
 	.allmulticast_enable    = tap_allmulti_enable,
 	.allmulticast_disable   = tap_allmulti_disable,
+	.mac_addr_remove        = tap_mac_remove,
+	.mac_addr_add           = tap_mac_add,
+	.mac_addr_set           = tap_mac_set,
 	.stats_get              = tap_stats_get,
 	.stats_reset            = tap_stats_reset,
 };
@@ -683,6 +753,7 @@ eth_dev_tap_create(const char *name, char *tap_name)
 	data->drv_name = pmd_tap_drv.driver.name;
 	data->numa_node = numa_node;
 
+	eth_random_addr((uint8_t *)&pmd->eth_addr);
 	data->dev_link = pmd_link;
 	data->mac_addrs = &pmd->eth_addr;
 	data->nb_rx_queues = pmd->nb_queues;
-- 
2.8.0.rc0

  parent reply	other threads:[~2017-03-07 16:31 UTC|newest]

Thread overview: 64+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-03-03  9:46 [PATCH 0/6] net/tap: add additional management ops Pascal Mazon
2017-03-03  9:46 ` [PATCH 1/6] net/tap: add MAC address " Pascal Mazon
2017-03-03  9:46 ` [PATCH 2/6] net/tap: add speed capabilities Pascal Mazon
2017-03-03 15:27   ` Wiles, Keith
2017-03-06 13:58     ` Pascal Mazon
2017-03-06 14:38       ` Wiles, Keith
2017-03-03  9:46 ` [PATCH 3/6] net/tap: add multicast addresses management Pascal Mazon
2017-03-03  9:46 ` [PATCH 4/6] net/tap: add MTU management Pascal Mazon
2017-03-03 15:23   ` Wiles, Keith
2017-03-06 13:59     ` Pascal Mazon
2017-03-03  9:46 ` [PATCH 5/6] net/tap: add packet type management Pascal Mazon
2017-03-03 15:31   ` Wiles, Keith
2017-03-06 14:10     ` Pascal Mazon
2017-03-06 14:46       ` Wiles, Keith
2017-03-03  9:46 ` [PATCH 6/6] net/tap: add flow control management Pascal Mazon
2017-03-06 16:31 ` [PATCH v2 0/6] net/tap: add additional management ops Pascal Mazon
2017-03-06 16:31   ` [PATCH v2 1/6] net/tap: add MAC address " Pascal Mazon
2017-03-06 16:31   ` [PATCH v2 2/6] net/tap: add speed capabilities Pascal Mazon
2017-03-06 16:31   ` [PATCH v2 3/6] net/tap: add multicast addresses management Pascal Mazon
2017-03-06 16:31   ` [PATCH v2 4/6] net/tap: add MTU management Pascal Mazon
2017-03-06 16:31   ` [PATCH v2 5/6] net/tap: add packet type management Pascal Mazon
2017-03-06 16:31   ` [PATCH v2 6/6] net/tap: add flow control management Pascal Mazon
2017-03-07 16:31   ` [PATCH v3 0/6] net/tap: add additional management ops Pascal Mazon
2017-03-14  8:22     ` [PATCH v4 0/8] " Pascal Mazon
2017-03-14  8:22       ` [PATCH v4 1/8] net/tap: remove wrong IFF_NOARP flags Pascal Mazon
2017-03-14  8:22       ` [PATCH v4 2/8] net/tap: refactor ioctl calls Pascal Mazon
2017-03-14  8:22       ` [PATCH v4 3/8] net/tap: add MAC address management Pascal Mazon
2017-03-14  8:22       ` [PATCH v4 4/8] net/tap: add MTU management Pascal Mazon
2017-03-14  8:22       ` [PATCH v4 5/8] net/tap: add speed capabilities Pascal Mazon
2017-03-14  8:22       ` [PATCH v4 6/8] net/tap: add multicast addresses management Pascal Mazon
2017-03-14  8:22       ` [PATCH v4 7/8] net/tap: add packet type management Pascal Mazon
2017-03-15 13:35         ` Ferruh Yigit
2017-03-15 13:44           ` Pascal Mazon
2017-03-15 14:31             ` Ferruh Yigit
2017-03-15 13:42         ` Ferruh Yigit
2017-03-14  8:22       ` [PATCH v4 8/8] net/tap: add flow control management Pascal Mazon
2017-03-15 13:43       ` [PATCH v4 0/8] net/tap: add additional management ops Ferruh Yigit
2017-03-15 14:48     ` [PATCH v5 " Pascal Mazon
2017-03-15 14:48       ` [PATCH v5 1/8] net/tap: remove wrong IFF_NOARP flags Pascal Mazon
2017-03-15 21:37         ` Wiles, Keith
2017-03-15 14:48       ` [PATCH v5 2/8] net/tap: refactor ioctl calls Pascal Mazon
2017-03-15 14:48       ` [PATCH v5 3/8] net/tap: add MAC address management Pascal Mazon
2017-03-15 14:48       ` [PATCH v5 4/8] net/tap: add MTU management Pascal Mazon
2017-03-15 14:48       ` [PATCH v5 5/8] net/tap: add speed capabilities Pascal Mazon
2017-03-15 14:48       ` [PATCH v5 6/8] net/tap: add multicast addresses management Pascal Mazon
2017-03-15 14:48       ` [PATCH v5 7/8] net/tap: add packet type management Pascal Mazon
2017-03-15 14:48       ` [PATCH v5 8/8] net/tap: add flow control management Pascal Mazon
2017-03-15 16:46       ` [PATCH v5 0/8] net/tap: add additional management ops Ferruh Yigit
2017-03-15 21:44         ` Wiles, Keith
2017-03-07 16:31   ` Pascal Mazon [this message]
2017-03-09 14:05     ` [PATCH v3 1/6] net/tap: add MAC address " Ferruh Yigit
2017-03-10  9:01       ` Pascal Mazon
2017-03-07 16:31   ` [PATCH v3 2/6] net/tap: add speed capabilities Pascal Mazon
2017-03-09 14:18     ` Ferruh Yigit
2017-03-09 14:36       ` Wiles, Keith
2017-03-09 16:05         ` Ferruh Yigit
2017-03-10  9:03           ` Pascal Mazon
2017-03-10  9:11             ` Pascal Mazon
2017-03-07 16:31   ` [PATCH v3 3/6] net/tap: add multicast addresses management Pascal Mazon
2017-03-07 16:31   ` [PATCH v3 4/6] net/tap: add MTU management Pascal Mazon
2017-03-07 16:31   ` [PATCH v3 5/6] net/tap: add packet type management Pascal Mazon
2017-03-09 14:26     ` Ferruh Yigit
2017-03-10 12:34       ` Pascal Mazon
2017-03-07 16:31   ` [PATCH v3 6/6] net/tap: add flow control management Pascal Mazon

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1488904298-31395-2-git-send-email-pascal.mazon@6wind.com \
    --to=pascal.mazon@6wind.com \
    --cc=dev@dpdk.org \
    --cc=keith.wiles@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.