[PATCH] ipcpd: Use correct MTU for eth-dix

  • From: Dimitri Staessens <dimitri.staessens@xxxxxxxx>
  • To: ouroboros@xxxxxxxxxxxxx
  • Date: Mon, 7 May 2018 17:27:07 +0200

The eth-dix IPCP was using a hardcoded MTU of 1500 bytes, but could
support higher MTUs. Now jumbo frames are supported.

Signed-off-by: Dimitri Staessens <dimitri.staessens@xxxxxxxx>
---
 src/ipcpd/eth/eth.c | 29 +++++++++++++++++++++++++----
 1 file changed, 25 insertions(+), 4 deletions(-)

diff --git a/src/ipcpd/eth/eth.c b/src/ipcpd/eth/eth.c
index 25ecdff..af983ef 100644
--- a/src/ipcpd/eth/eth.c
+++ b/src/ipcpd/eth/eth.c
@@ -94,7 +94,13 @@
 #endif
 
 #define MAC_SIZE             6
+#if defined (__linux__) && defined (BUILD_ETH_DIX)
+#define ETH_MTU              eth_data.mtu
+#define ETH_MTU_MAX          ETH_MAX_MTU /* if_ether.h */
+#else
 #define ETH_MTU              1500
+#define ETH_MTU_MAX          ETH_MTU
+#endif
 #define ETH_TYPE_LENGTH_SIZE sizeof(uint16_t)
 #define ETH_HEADER_SIZE      (2 * MAC_SIZE + ETH_TYPE_LENGTH_SIZE)
 
@@ -106,15 +112,16 @@
 #define DIX_HEADER_SIZE      (DIX_EID_SIZE + DIX_LENGTH_SIZE)
 #define ETH_HEADER_TOT_SIZE  (ETH_HEADER_SIZE + DIX_HEADER_SIZE)
 #define MAX_EIDS             (1 << (8 * DIX_EID_SIZE))
-#define ETH_MAX_SDU_SIZE     (ETH_MTU - DIX_HEADER_SIZE)
+#define ETH_MAX_SDU_SIZE     (ETH_MTU_MAX - DIX_HEADER_SIZE)
 #define ETH_FRAME_SIZE       (ETH_HEADER_TOT_SIZE + ETH_MAX_SDU_SIZE)
 #elif defined(BUILD_ETH_LLC)
+#define ETH_LLC_MTU_MAX      1500
 #define THIS_TYPE            IPCP_ETH_LLC
 #define MGMT_SAP             0x01
 #define LLC_HEADER_SIZE      3
 #define ETH_HEADER_TOT_SIZE  (ETH_HEADER_SIZE + LLC_HEADER_SIZE)
 #define MAX_SAPS             64
-#define ETH_MAX_SDU_SIZE     (ETH_MTU - LLC_HEADER_SIZE)
+#define ETH_MAX_SDU_SIZE     (ETH_LLC_MTU_MAX - LLC_HEADER_SIZE)
 #define ETH_FRAME_SIZE       (ETH_HEADER_TOT_SIZE + ETH_MAX_SDU_SIZE)
 #endif
 
@@ -174,7 +181,9 @@ struct mgmt_frame {
 
 struct {
         struct shim_data * shim_data;
-
+#ifdef __linux__
+        int                mtu;
+#endif
 #if defined(HAVE_NETMAP)
         struct nm_desc *   nmd;
         uint8_t            hw_addr[MAC_SIZE];
@@ -1218,11 +1227,23 @@ static int eth_ipcp_bootstrap(const struct ipcp_config 
* conf)
         }
 
         if (ioctl(skfd, SIOCGIFHWADDR, &ifr)) {
-                log_err("Failed to ioctl.");
+                log_err("Failed to get hwaddr.");
+                close(skfd);
+                return -1;
+        }
+
+        if (ioctl(skfd, SIOCGIFMTU, &ifr)) {
+                log_err("Failed to get MTU.");
                 close(skfd);
                 return -1;
         }
 
+        log_dbg("Device MTU is %d", ifr.ifr_mtu);
+
+        eth_data.mtu = MIN((int) ETH_MTU_MAX, ifr.ifr_mtu);
+
+        log_dbg("Layer MTU is %d.", eth_data.mtu);
+
         close(skfd);
 
         idx = if_nametoindex(conf->dev);
-- 
2.17.0


Other related posts:

  • » [PATCH] ipcpd: Use correct MTU for eth-dix - Dimitri Staessens