[3/3] net/af_packet: Get 'framesz' from the iface's MTU.

Message ID 1542707697-175836-3-git-send-email-tiago.lam@intel.com (mailing list archive)
State Superseded, archived
Delegated to: Ferruh Yigit
Headers
Series [1/3] net/af_packet: set_mtu() decrements sockaddr twice |

Checks

Context Check Description
ci/checkpatch warning coding style issues
ci/Intel-compilation success Compilation OK

Commit Message

Lam, Tiago Nov. 20, 2018, 9:54 a.m. UTC
  Use the underlying MTU to calculate the framsize to be used for the mmap
RINGs. This is to make it more flexible on deployments with different
MTU requirements, instead of using a pre-defined value of 2048B.

If a 'framsz' option is provided, that value is used instead and the MTU
of the underlying interface is ignored.

Signed-off-by: Tiago Lam <tiago.lam@intel.com>
---
 drivers/net/af_packet/rte_eth_af_packet.c | 33 ++++++++++++++++++++++++++-----
 1 file changed, 28 insertions(+), 5 deletions(-)
  

Patch

diff --git a/drivers/net/af_packet/rte_eth_af_packet.c b/drivers/net/af_packet/rte_eth_af_packet.c
index 4e95dd7..45ee72b 100644
--- a/drivers/net/af_packet/rte_eth_af_packet.c
+++ b/drivers/net/af_packet/rte_eth_af_packet.c
@@ -788,7 +788,7 @@  rte_eth_from_packet(struct rte_vdev_device *dev,
 	unsigned k_idx;
 	unsigned int blockcount;
 	unsigned int blocksize = DFLT_BLOCK_SIZE;
-	unsigned int framesize = DFLT_FRAME_SIZE;
+	unsigned int framesize = 0;
 	unsigned int framecount = DFLT_FRAME_COUNT;
 	unsigned int qpairs = 1;
 	unsigned int qdisc_bypass = 1;
@@ -877,17 +877,40 @@  rte_eth_from_packet(struct rte_vdev_device *dev,
 	}
 
 	ifnamelen = strlen(ifname);
-	if (ifnamelen >= sizeof(ifr.ifr_name)) {
+	if (ifnamelen < sizeof(ifr.ifr_name)) {
+		memcpy(ifr.ifr_name, ifname, ifnamelen);
+		ifr.ifr_name[ifnamelen] = '\0';
+	} else {
 		RTE_LOG(ERR, PMD,
 			"%s: I/F name too long (%s)\n",
 			name, ifname);
 		return -1;
 	}
 
+	/*
+	 * Base framesize on the MTU of the underlying interface, if no
+	 * 'framesz' option is given
+	 */
+	if (!framesize) {
+		if (ioctl(*sockfd, SIOCGIFMTU, &ifr) == -1) {
+			RTE_LOG(ERR, PMD,
+				"%s: ioctl failed (SIOCGIFMTU)",
+				name);
+			framesize = DFLT_FRAME_SIZE;
+		} else {
+			framesize = ifr.ifr_mtu;
+			/*
+			 * Align to TPACKET_ALIGNMENT and add TPACKET2_HDRLEN, to
+			 * account for the extra needed space
+			 */
+			framesize = TPACKET_ALIGN(framesize + TPACKET2_HDRLEN);
+		}
+	}
+
 	if (framesize > blocksize) {
-		PMD_LOG(ERR,
-			"%s: AF_PACKET MMAP frame size exceeds block size!",
-		        name);
+		RTE_LOG(ERR, PMD,
+			"%s: AF_PACKET MMAP frame size (%u) exceeds block size (%u)!",
+		        name, framesize, blocksize);
 		return -1;
 	}