[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, ð_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