net/tap: display name after parsing
[dpdk.git] / drivers / net / tap / rte_eth_tap.c
index 976f2d9..6a98f46 100644 (file)
@@ -140,6 +140,7 @@ tun_alloc(char *name)
        }
        RTE_LOG(DEBUG, PMD, "TUN/TAP Features %08x\n", features);
 
+#ifdef IFF_MULTI_QUEUE
        if (!(features & IFF_MULTI_QUEUE) && (RTE_PMD_TAP_MAX_QUEUES > 1)) {
                RTE_LOG(DEBUG, PMD, "TUN/TAP device only one queue\n");
                goto error;
@@ -152,6 +153,15 @@ tun_alloc(char *name)
                RTE_LOG(DEBUG, PMD, "Multi-queue support for %d queues\n",
                        RTE_PMD_TAP_MAX_QUEUES);
        }
+#else
+       if (RTE_PMD_TAP_MAX_QUEUES > 1) {
+               RTE_LOG(DEBUG, PMD, "TUN/TAP device only one queue\n");
+               goto error;
+       } else {
+               ifr.ifr_flags |= IFF_ONE_QUEUE;
+               RTE_LOG(DEBUG, PMD, "Single queue only support\n");
+       }
+#endif
 
        /* Set the TUN/TAP configuration and get the name if needed */
        if (ioctl(fd, TUNSETIFF, (void *)&ifr) < 0) {
@@ -400,6 +410,7 @@ tap_setup_queue(struct rte_eth_dev *dev,
                struct pmd_internals *internals,
                uint16_t qid)
 {
+       struct pmd_internals *pmd = dev->data->dev_private;
        struct rx_queue *rx = &internals->rxq[qid];
        struct tx_queue *tx = &internals->txq[qid];
        int fd;
@@ -409,17 +420,15 @@ tap_setup_queue(struct rte_eth_dev *dev,
                fd = tx->fd;
                if (fd < 0) {
                        RTE_LOG(INFO, PMD, "Add queue to TAP %s for qid %d\n",
-                               dev->data->name, qid);
-                       fd = tun_alloc(dev->data->name);
+                               pmd->name, qid);
+                       fd = tun_alloc(pmd->name);
                        if (fd < 0) {
                                RTE_LOG(ERR, PMD, "tun_alloc(%s) failed\n",
-                                       dev->data->name);
+                                       pmd->name);
                                return -1;
                        }
                }
        }
-       dev->data->rx_queues[qid] = rx;
-       dev->data->tx_queues[qid] = tx;
 
        rx->fd = fd;
        tx->fd = fd;
@@ -427,6 +436,26 @@ tap_setup_queue(struct rte_eth_dev *dev,
        return fd;
 }
 
+static int
+rx_setup_queue(struct rte_eth_dev *dev,
+               struct pmd_internals *internals,
+               uint16_t qid)
+{
+       dev->data->rx_queues[qid] = &internals->rxq[qid];
+
+       return tap_setup_queue(dev, internals, qid);
+}
+
+static int
+tx_setup_queue(struct rte_eth_dev *dev,
+               struct pmd_internals *internals,
+               uint16_t qid)
+{
+       dev->data->tx_queues[qid] = &internals->txq[qid];
+
+       return tap_setup_queue(dev, internals, qid);
+}
+
 static int
 tap_rx_queue_setup(struct rte_eth_dev *dev,
                   uint16_t rx_queue_id,
@@ -459,13 +488,13 @@ tap_rx_queue_setup(struct rte_eth_dev *dev,
                return -ENOMEM;
        }
 
-       fd = tap_setup_queue(dev, internals, rx_queue_id);
+       fd = rx_setup_queue(dev, internals, rx_queue_id);
        if (fd == -1)
                return -1;
 
        internals->fds[rx_queue_id] = fd;
        RTE_LOG(INFO, PMD, "RX TAP device name %s, qid %d on fd %d\n",
-               dev->data->name, rx_queue_id, internals->rxq[rx_queue_id].fd);
+               internals->name, rx_queue_id, internals->rxq[rx_queue_id].fd);
 
        return 0;
 }
@@ -483,12 +512,12 @@ tap_tx_queue_setup(struct rte_eth_dev *dev,
        if (tx_queue_id >= internals->nb_queues)
                return -1;
 
-       ret = tap_setup_queue(dev, internals, tx_queue_id);
+       ret = tx_setup_queue(dev, internals, tx_queue_id);
        if (ret == -1)
                return -1;
 
        RTE_LOG(INFO, PMD, "TX TAP device name %s, qid %d on fd %d\n",
-               dev->data->name, tx_queue_id, internals->txq[tx_queue_id].fd);
+               internals->name, tx_queue_id, internals->txq[tx_queue_id].fd);
 
        return 0;
 }
@@ -524,28 +553,6 @@ pmd_mac_address(int fd, struct rte_eth_dev *dev, struct ether_addr *addr)
                return -1;
        }
 
-       /* Set the host based MAC address to this special MAC format */
-       ifr.ifr_hwaddr.sa_data[0] = 'T';
-       ifr.ifr_hwaddr.sa_data[1] = 'a';
-       ifr.ifr_hwaddr.sa_data[2] = 'p';
-       ifr.ifr_hwaddr.sa_data[3] = '-';
-       ifr.ifr_hwaddr.sa_data[4] = dev->data->port_id;
-       ifr.ifr_hwaddr.sa_data[5] = dev->data->numa_node;
-       if (ioctl(fd, SIOCSIFHWADDR, &ifr) == -1) {
-               RTE_LOG(ERR, PMD, "%s: ioctl failed (SIOCSIFHWADDR) (%s)\n",
-                       dev->data->name, ifr.ifr_name);
-               return -1;
-       }
-
-       /* Set the local application MAC address, needs to be different then
-        * the host based MAC address.
-        */
-       ifr.ifr_hwaddr.sa_data[0] = 'd';
-       ifr.ifr_hwaddr.sa_data[1] = 'n';
-       ifr.ifr_hwaddr.sa_data[2] = 'e';
-       ifr.ifr_hwaddr.sa_data[3] = 't';
-       ifr.ifr_hwaddr.sa_data[4] = dev->data->port_id;
-       ifr.ifr_hwaddr.sa_data[5] = dev->data->numa_node;
        rte_memcpy(addr, ifr.ifr_hwaddr.sa_data, ETH_ALEN);
 
        return 0;
@@ -566,20 +573,20 @@ eth_dev_tap_create(const char *name, char *tap_name)
 
        data = rte_zmalloc_socket(tap_name, sizeof(*data), 0, numa_node);
        if (!data) {
-               RTE_LOG(INFO, PMD, "Failed to allocate data\n");
+               RTE_LOG(ERR, PMD, "Failed to allocate data\n");
                goto error_exit;
        }
 
        pmd = rte_zmalloc_socket(tap_name, sizeof(*pmd), 0, numa_node);
        if (!pmd) {
-               RTE_LOG(INFO, PMD, "Unable to allocate internal struct\n");
+               RTE_LOG(ERR, PMD, "Unable to allocate internal struct\n");
                goto error_exit;
        }
 
        /* Use the name and not the tap_name */
        dev = rte_eth_dev_allocate(tap_name);
        if (!dev) {
-               RTE_LOG(INFO, PMD, "Unable to allocate device struct\n");
+               RTE_LOG(ERR, PMD, "Unable to allocate device struct\n");
                goto error_exit;
        }
 
@@ -610,12 +617,12 @@ eth_dev_tap_create(const char *name, char *tap_name)
        /* Create the first Tap device */
        fd = tun_alloc(tap_name);
        if (fd < 0) {
-               RTE_LOG(INFO, PMD, "tun_alloc() failed\n");
+               RTE_LOG(ERR, PMD, "tun_alloc() failed\n");
                goto error_exit;
        }
 
        /* Presetup the fds to -1 as being not working */
-       for (i = 0; i < RTE_PMD_TAP_MAX_QUEUES; i++) {
+       for (i = 1; i < RTE_PMD_TAP_MAX_QUEUES; i++) {
                pmd->fds[i] = -1;
                pmd->rxq[i].fd = -1;
                pmd->txq[i].fd = -1;
@@ -627,7 +634,7 @@ eth_dev_tap_create(const char *name, char *tap_name)
        pmd->fds[0] = fd;
 
        if (pmd_mac_address(fd, dev, &pmd->eth_addr) < 0) {
-               RTE_LOG(INFO, PMD, "Unable to get MAC address\n");
+               RTE_LOG(ERR, PMD, "Unable to get MAC address\n");
                goto error_exit;
        }
 
@@ -684,9 +691,6 @@ rte_pmd_tap_probe(const char *name, const char *params)
        snprintf(tap_name, sizeof(tap_name), "%s%d",
                 DEFAULT_TAP_NAME, tap_unit++);
 
-       RTE_LOG(INFO, PMD, "Initializing pmd_tap for %s as %s\n",
-               name, tap_name);
-
        if (params && (params[0] != '\0')) {
                RTE_LOG(INFO, PMD, "paramaters (%s)\n", params);
 
@@ -713,6 +717,9 @@ rte_pmd_tap_probe(const char *name, const char *params)
        }
        pmd_link.link_speed = speed;
 
+       RTE_LOG(INFO, PMD, "Initializing pmd_tap for %s as %s\n",
+               name, tap_name);
+
        ret = eth_dev_tap_create(name, tap_name);
 
 leave: