net/af_packet: remove unused Rx counter
[dpdk.git] / drivers / net / af_packet / rte_eth_af_packet.c
index ea47abb..82bf2cd 100644 (file)
@@ -6,6 +6,7 @@
  * All rights reserved.
  */
 
+#include <rte_string_fns.h>
 #include <rte_mbuf.h>
 #include <rte_ethdev_driver.h>
 #include <rte_ethdev_vdev.h>
@@ -13,6 +14,7 @@
 #include <rte_kvargs.h>
 #include <rte_bus_vdev.h>
 
+#include <errno.h>
 #include <linux/if_ether.h>
 #include <linux/if_packet.h>
 #include <arpa/inet.h>
@@ -20,6 +22,7 @@
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <sys/ioctl.h>
+#include <string.h>
 #include <sys/mman.h>
 #include <unistd.h>
 #include <poll.h>
@@ -31,7 +34,6 @@
 #define ETH_AF_PACKET_FRAMECOUNT_ARG   "framecnt"
 #define ETH_AF_PACKET_QDISC_BYPASS_ARG "qdisc_bypass"
 
-#define DFLT_BLOCK_SIZE                (1 << 12)
 #define DFLT_FRAME_SIZE                (1 << 11)
 #define DFLT_FRAME_COUNT       (1 << 9)
 
@@ -49,7 +51,6 @@ struct pkt_rx_queue {
        uint16_t in_port;
 
        volatile unsigned long rx_pkts;
-       volatile unsigned long err_pkts;
        volatile unsigned long rx_bytes;
 };
 
@@ -72,7 +73,7 @@ struct pmd_internals {
 
        int if_index;
        char *if_name;
-       struct ether_addr eth_addr;
+       struct rte_ether_addr eth_addr;
 
        struct tpacket_req req;
 
@@ -103,6 +104,10 @@ static int af_packet_logtype;
        rte_log(RTE_LOG_ ## level, af_packet_logtype, \
                "%s(): " fmt "\n", __func__, ##args)
 
+#define PMD_LOG_ERRNO(level, fmt, args...) \
+       rte_log(RTE_LOG_ ## level, af_packet_logtype, \
+               "%s(): " fmt ":%s\n", __func__, ##args, strerror(errno))
+
 static uint16_t
 eth_af_packet_rx(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts)
 {
@@ -328,10 +333,9 @@ eth_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *igb_stats)
                internal->nb_queues : RTE_ETHDEV_QUEUE_STAT_CNTRS);
        for (i = 0; i < imax; i++) {
                igb_stats->q_opackets[i] = internal->tx_queue[i].tx_pkts;
-               igb_stats->q_errors[i] = internal->tx_queue[i].err_pkts;
                igb_stats->q_obytes[i] = internal->tx_queue[i].tx_bytes;
                tx_total += igb_stats->q_opackets[i];
-               tx_err_total += igb_stats->q_errors[i];
+               tx_err_total += internal->tx_queue[i].err_pkts;
                tx_bytes_total += igb_stats->q_obytes[i];
        }
 
@@ -433,8 +437,7 @@ eth_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
        int ret;
        int s;
        unsigned int data_size = internals->req.tp_frame_size -
-                                TPACKET2_HDRLEN -
-                                sizeof(struct sockaddr_ll);
+                                TPACKET2_HDRLEN;
 
        if (mtu > data_size)
                return -EINVAL;
@@ -443,7 +446,7 @@ eth_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
        if (s < 0)
                return -EINVAL;
 
-       snprintf(ifr.ifr_name, IFNAMSIZ, "%s", internals->if_name);
+       strlcpy(ifr.ifr_name, internals->if_name, IFNAMSIZ);
        ret = ioctl(s, SIOCSIFMTU, &ifr);
        close(s);
 
@@ -463,7 +466,7 @@ eth_dev_change_flags(char *if_name, uint32_t flags, uint32_t mask)
        if (s < 0)
                return;
 
-       snprintf(ifr.ifr_name, IFNAMSIZ, "%s", if_name);
+       strlcpy(ifr.ifr_name, if_name, IFNAMSIZ);
        if (ioctl(s, SIOCGIFFLAGS, &ifr) < 0)
                goto out;
        ifr.ifr_flags &= mask;
@@ -528,8 +531,6 @@ open_packet_iface(const char *key __rte_unused,
        return 0;
 }
 
-static struct rte_vdev_driver pmd_af_packet_drv;
-
 static int
 rte_pmd_init_internals(struct rte_vdev_device *dev,
                        const int sockfd,
@@ -605,9 +606,7 @@ rte_pmd_init_internals(struct rte_vdev_device *dev,
                return -1;
        }
        if (ioctl(sockfd, SIOCGIFINDEX, &ifr) == -1) {
-               PMD_LOG(ERR,
-                       "%s: ioctl failed (SIOCGIFINDEX)",
-                       name);
+               PMD_LOG_ERRNO(ERR, "%s: ioctl failed (SIOCGIFINDEX)", name);
                return -1;
        }
        (*internals)->if_name = strdup(pair->value);
@@ -616,9 +615,7 @@ rte_pmd_init_internals(struct rte_vdev_device *dev,
        (*internals)->if_index = ifr.ifr_ifindex;
 
        if (ioctl(sockfd, SIOCGIFHWADDR, &ifr) == -1) {
-               PMD_LOG(ERR,
-                       "%s: ioctl failed (SIOCGIFHWADDR)",
-                       name);
+               PMD_LOG_ERRNO(ERR, "%s: ioctl failed (SIOCGIFHWADDR)", name);
                return -1;
        }
        memcpy(&(*internals)->eth_addr, ifr.ifr_hwaddr.sa_data, ETH_ALEN);
@@ -640,9 +637,9 @@ rte_pmd_init_internals(struct rte_vdev_device *dev,
                /* Open an AF_PACKET socket for this queue... */
                qsockfd = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
                if (qsockfd == -1) {
-                       PMD_LOG(ERR,
+                       PMD_LOG_ERRNO(ERR,
                                "%s: could not open AF_PACKET socket",
-                               name);
+                               name);
                        return -1;
                }
 
@@ -650,7 +647,7 @@ rte_pmd_init_internals(struct rte_vdev_device *dev,
                rc = setsockopt(qsockfd, SOL_PACKET, PACKET_VERSION,
                                &tpver, sizeof(tpver));
                if (rc == -1) {
-                       PMD_LOG(ERR,
+                       PMD_LOG_ERRNO(ERR,
                                "%s: could not set PACKET_VERSION on AF_PACKET socket for %s",
                                name, pair->value);
                        goto error;
@@ -660,7 +657,7 @@ rte_pmd_init_internals(struct rte_vdev_device *dev,
                rc = setsockopt(qsockfd, SOL_PACKET, PACKET_LOSS,
                                &discard, sizeof(discard));
                if (rc == -1) {
-                       PMD_LOG(ERR,
+                       PMD_LOG_ERRNO(ERR,
                                "%s: could not set PACKET_LOSS on AF_PACKET socket for %s",
                                name, pair->value);
                        goto error;
@@ -670,7 +667,7 @@ rte_pmd_init_internals(struct rte_vdev_device *dev,
                rc = setsockopt(qsockfd, SOL_PACKET, PACKET_QDISC_BYPASS,
                                &qdisc_bypass, sizeof(qdisc_bypass));
                if (rc == -1) {
-                       PMD_LOG(ERR,
+                       PMD_LOG_ERRNO(ERR,
                                "%s: could not set PACKET_QDISC_BYPASS on AF_PACKET socket for %s",
                                name, pair->value);
                        goto error;
@@ -681,7 +678,7 @@ rte_pmd_init_internals(struct rte_vdev_device *dev,
 
                rc = setsockopt(qsockfd, SOL_PACKET, PACKET_RX_RING, req, sizeof(*req));
                if (rc == -1) {
-                       PMD_LOG(ERR,
+                       PMD_LOG_ERRNO(ERR,
                                "%s: could not set PACKET_RX_RING on AF_PACKET socket for %s",
                                name, pair->value);
                        goto error;
@@ -689,7 +686,7 @@ rte_pmd_init_internals(struct rte_vdev_device *dev,
 
                rc = setsockopt(qsockfd, SOL_PACKET, PACKET_TX_RING, req, sizeof(*req));
                if (rc == -1) {
-                       PMD_LOG(ERR,
+                       PMD_LOG_ERRNO(ERR,
                                "%s: could not set PACKET_TX_RING on AF_PACKET "
                                "socket for %s", name, pair->value);
                        goto error;
@@ -702,7 +699,7 @@ rte_pmd_init_internals(struct rte_vdev_device *dev,
                                    PROT_READ | PROT_WRITE, MAP_SHARED | MAP_LOCKED,
                                    qsockfd, 0);
                if (rx_queue->map == MAP_FAILED) {
-                       PMD_LOG(ERR,
+                       PMD_LOG_ERRNO(ERR,
                                "%s: call to mmap failed on AF_PACKET socket for %s",
                                name, pair->value);
                        goto error;
@@ -739,9 +736,9 @@ rte_pmd_init_internals(struct rte_vdev_device *dev,
 
                rc = bind(qsockfd, (const struct sockaddr*)&sockaddr, sizeof(sockaddr));
                if (rc == -1) {
-                       PMD_LOG(ERR,
+                       PMD_LOG_ERRNO(ERR,
                                "%s: could not bind AF_PACKET socket to %s",
-                               name, pair->value);
+                               name, pair->value);
                        goto error;
                }
 
@@ -749,9 +746,9 @@ rte_pmd_init_internals(struct rte_vdev_device *dev,
                rc = setsockopt(qsockfd, SOL_PACKET, PACKET_FANOUT,
                                &fanout_arg, sizeof(fanout_arg));
                if (rc == -1) {
-                       PMD_LOG(ERR,
-                               "%s: could not set PACKET_FANOUT on AF_PACKET socket "
-                               "for %s", name, pair->value);
+                       PMD_LOG_ERRNO(ERR,
+                               "%s: could not set PACKET_FANOUT on AF_PACKET socket for %s",
+                               name, pair->value);
                        goto error;
                }
 #endif
@@ -812,7 +809,7 @@ rte_eth_from_packet(struct rte_vdev_device *dev,
        struct rte_kvargs_pair *pair = NULL;
        unsigned k_idx;
        unsigned int blockcount;
-       unsigned int blocksize = DFLT_BLOCK_SIZE;
+       unsigned int blocksize;
        unsigned int framesize = DFLT_FRAME_SIZE;
        unsigned int framecount = DFLT_FRAME_COUNT;
        unsigned int qpairs = 1;
@@ -822,6 +819,8 @@ rte_eth_from_packet(struct rte_vdev_device *dev,
        if (*sockfd < 0)
                return -1;
 
+       blocksize = getpagesize();
+
        /*
         * Walk arguments for configurable settings
         */
@@ -926,8 +925,7 @@ rte_pmd_af_packet_probe(struct rte_vdev_device *dev)
 
        PMD_LOG(INFO, "Initializing pmd_af_packet for %s", name);
 
-       if (rte_eal_process_type() == RTE_PROC_SECONDARY &&
-           strlen(rte_vdev_device_args(dev)) == 0) {
+       if (rte_eal_process_type() == RTE_PROC_SECONDARY) {
                eth_dev = rte_eth_dev_attach_secondary(name);
                if (!eth_dev) {
                        PMD_LOG(ERR, "Failed to probe %s", name);
@@ -935,6 +933,7 @@ rte_pmd_af_packet_probe(struct rte_vdev_device *dev)
                }
                /* TODO: request info from primary to set up Rx and Tx */
                eth_dev->dev_ops = &ops;
+               eth_dev->device = &dev->device;
                rte_eth_dev_probing_finish(eth_dev);
                return 0;
        }
@@ -986,6 +985,12 @@ rte_pmd_af_packet_remove(struct rte_vdev_device *dev)
        if (eth_dev == NULL)
                return -1;
 
+       /* mac_addrs must not be freed alone because part of dev_private */
+       eth_dev->data->mac_addrs = NULL;
+
+       if (rte_eal_process_type() != RTE_PROC_PRIMARY)
+               return rte_eth_dev_release_port(eth_dev);
+
        internals = eth_dev->data->dev_private;
        for (q = 0; q < internals->nb_queues; q++) {
                rte_free(internals->rx_queue[q].rd);
@@ -993,8 +998,6 @@ rte_pmd_af_packet_remove(struct rte_vdev_device *dev)
        }
        free(internals->if_name);
 
-       rte_free(eth_dev->data->dev_private);
-
        rte_eth_dev_release_port(eth_dev);
 
        return 0;
@@ -1015,9 +1018,7 @@ RTE_PMD_REGISTER_PARAM_STRING(net_af_packet,
        "framecnt=<int> "
        "qdisc_bypass=<0|1>");
 
-RTE_INIT(af_packet_init_log);
-static void
-af_packet_init_log(void)
+RTE_INIT(af_packet_init_log)
 {
        af_packet_logtype = rte_log_register("pmd.net.packet");
        if (af_packet_logtype >= 0)