Instead of re-iterating through kvlist just to parse the
ETH_AF_PACKET_IFACE_ARG argument in rte_pmd_init_internals(), we now use
the already existing iteration in rte_eth_from_packet() to parse and
validate the ETH_AF_PACKET_IFACE_ARG argument.

This will be useful for a later commit, which needs to access the
interface name to get the underlying configured MTU.

Signed-off-by: Tiago Lam <tiago....@intel.com>
---

v2: Fix checkpatches.sh and check-git-log.sh warnings.

---
 drivers/net/af_packet/rte_eth_af_packet.c | 77 ++++++++++++++++---------------
 1 file changed, 41 insertions(+), 36 deletions(-)

diff --git a/drivers/net/af_packet/rte_eth_af_packet.c 
b/drivers/net/af_packet/rte_eth_af_packet.c
index 264cfc0..8d749a2 100644
--- a/drivers/net/af_packet/rte_eth_af_packet.c
+++ b/drivers/net/af_packet/rte_eth_af_packet.c
@@ -540,15 +540,12 @@ rte_pmd_init_internals(struct rte_vdev_device *dev,
                       unsigned int qdisc_bypass,
                        struct pmd_internals **internals,
                        struct rte_eth_dev **eth_dev,
-                       struct rte_kvargs *kvlist)
+                                          const char *ifname)
 {
        const char *name = rte_vdev_device_name(dev);
        const unsigned int numa_node = dev->device.numa_node;
        struct rte_eth_dev_data *data = NULL;
-       struct rte_kvargs_pair *pair = NULL;
        struct ifreq ifr;
-       size_t ifnamelen;
-       unsigned k_idx;
        struct sockaddr_ll sockaddr;
        struct tpacket_req *req;
        struct pkt_rx_queue *rx_queue;
@@ -560,18 +557,6 @@ rte_pmd_init_internals(struct rte_vdev_device *dev,
        int fanout_arg;
 #endif
 
-       for (k_idx = 0; k_idx < kvlist->count; k_idx++) {
-               pair = &kvlist->pairs[k_idx];
-               if (strstr(pair->key, ETH_AF_PACKET_IFACE_ARG) != NULL)
-                       break;
-       }
-       if (pair == NULL) {
-               PMD_LOG(ERR,
-                       "%s: no interface specified for AF_PACKET ethdev",
-                       name);
-               return -1;
-       }
-
        PMD_LOG(INFO,
                "%s: creating AF_PACKET-backed ethdev on numa socket %u",
                name, numa_node);
@@ -593,23 +578,14 @@ rte_pmd_init_internals(struct rte_vdev_device *dev,
        req->tp_frame_size = framesize;
        req->tp_frame_nr = framecnt;
 
-       ifnamelen = strlen(pair->value);
-       if (ifnamelen < sizeof(ifr.ifr_name)) {
-               memcpy(ifr.ifr_name, pair->value, ifnamelen);
-               ifr.ifr_name[ifnamelen] = '\0';
-       } else {
-               PMD_LOG(ERR,
-                       "%s: I/F name too long (%s)",
-                       name, pair->value);
-               return -1;
-       }
+       memcpy(ifr.ifr_name, ifname, strlen(ifname));
        if (ioctl(sockfd, SIOCGIFINDEX, &ifr) == -1) {
                PMD_LOG(ERR,
                        "%s: ioctl failed (SIOCGIFINDEX)",
                        name);
                return -1;
        }
-       (*internals)->if_name = strdup(pair->value);
+       (*internals)->if_name = strdup(ifname);
        if ((*internals)->if_name == NULL)
                return -1;
        (*internals)->if_index = ifr.ifr_ifindex;
@@ -651,7 +627,7 @@ rte_pmd_init_internals(struct rte_vdev_device *dev,
                if (rc == -1) {
                        PMD_LOG(ERR,
                                "%s: could not set PACKET_VERSION on AF_PACKET 
socket for %s",
-                               name, pair->value);
+                               name, ifname);
                        goto error;
                }
 
@@ -661,7 +637,7 @@ rte_pmd_init_internals(struct rte_vdev_device *dev,
                if (rc == -1) {
                        PMD_LOG(ERR,
                                "%s: could not set PACKET_LOSS on AF_PACKET 
socket for %s",
-                               name, pair->value);
+                               name, ifname);
                        goto error;
                }
 
@@ -671,7 +647,7 @@ rte_pmd_init_internals(struct rte_vdev_device *dev,
                if (rc == -1) {
                        PMD_LOG(ERR,
                                "%s: could not set PACKET_QDISC_BYPASS on 
AF_PACKET socket for %s",
-                               name, pair->value);
+                               name, ifname);
                        goto error;
                }
 #else
@@ -682,7 +658,7 @@ rte_pmd_init_internals(struct rte_vdev_device *dev,
                if (rc == -1) {
                        PMD_LOG(ERR,
                                "%s: could not set PACKET_RX_RING on AF_PACKET 
socket for %s",
-                               name, pair->value);
+                               name, ifname);
                        goto error;
                }
 
@@ -690,7 +666,7 @@ rte_pmd_init_internals(struct rte_vdev_device *dev,
                if (rc == -1) {
                        PMD_LOG(ERR,
                                "%s: could not set PACKET_TX_RING on AF_PACKET "
-                               "socket for %s", name, pair->value);
+                               "socket for %s", name, ifname);
                        goto error;
                }
 
@@ -703,7 +679,7 @@ rte_pmd_init_internals(struct rte_vdev_device *dev,
                if (rx_queue->map == MAP_FAILED) {
                        PMD_LOG(ERR,
                                "%s: call to mmap failed on AF_PACKET socket 
for %s",
-                               name, pair->value);
+                               name, ifname);
                        goto error;
                }
 
@@ -740,7 +716,7 @@ rte_pmd_init_internals(struct rte_vdev_device *dev,
                if (rc == -1) {
                        PMD_LOG(ERR,
                                "%s: could not bind AF_PACKET socket to %s",
-                               name, pair->value);
+                               name, ifname);
                        goto error;
                }
 
@@ -750,7 +726,7 @@ rte_pmd_init_internals(struct rte_vdev_device *dev,
                if (rc == -1) {
                        PMD_LOG(ERR,
                                "%s: could not set PACKET_FANOUT on AF_PACKET 
socket "
-                               "for %s", name, pair->value);
+                               "for %s", name, ifname);
                        goto error;
                }
 #endif
@@ -816,6 +792,9 @@ rte_eth_from_packet(struct rte_vdev_device *dev,
        unsigned int framecount = DFLT_FRAME_COUNT;
        unsigned int qpairs = 1;
        unsigned int qdisc_bypass = 1;
+       struct ifreq ifr;
+       char *ifname = NULL;
+       size_t ifnamelen;
 
        /* do some parameter checking */
        if (*sockfd < 0)
@@ -877,6 +856,32 @@ rte_eth_from_packet(struct rte_vdev_device *dev,
                        }
                        continue;
                }
+               if (strstr(pair->key, ETH_AF_PACKET_IFACE_ARG) != NULL) {
+                       ifname = pair->value;
+                       if (strlen(ifname) == 0) {
+                               RTE_LOG(ERR, PMD,
+                                       "%s: invalid iface value\n",
+                                       name);
+                               return -1;
+                       }
+
+                       continue;
+               }
+       }
+
+       if (ifname == NULL) {
+               RTE_LOG(ERR, PMD,
+                       "%s: no interface specified for AF_PACKET ethdev\n",
+                       name);
+               return -1;
+       }
+
+       ifnamelen = strlen(ifname);
+       if (ifnamelen >= sizeof(ifr.ifr_name)) {
+               RTE_LOG(ERR, PMD,
+                       "%s: I/F name too long (%s)\n",
+                       name, ifname);
+               return -1;
        }
 
        if (framesize > blocksize) {
@@ -904,7 +909,7 @@ rte_eth_from_packet(struct rte_vdev_device *dev,
                                   framesize, framecount,
                                   qdisc_bypass,
                                   &internals, &eth_dev,
-                                  kvlist) < 0)
+                                  ifname) < 0)
                return -1;
 
        eth_dev->rx_pkt_burst = eth_af_packet_rx;
-- 
2.7.4

Reply via email to