[dpdk-dev] [PATCH 2/3] net/af_packet: Move parse and validation of iface.

Tiago Lam tiago.lam at intel.com
Tue Nov 20 10:54:56 CET 2018


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.lam at intel.com>
---
 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..4e95dd7 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



More information about the dev mailing list