changeset 72:9bf434f2313a draft

Fix MTU length checking. We now request MTU from the DHCP server, and if given we set it.
author Roy Marples <roy@marples.name>
date Thu, 01 Mar 2007 10:42:01 +0000
parents 10f4e33d41f5
children 6e7ab19c2475
files ChangeLog Makefile client.c configure.c dhcp.c interface.c interface.h
diffstat 7 files changed, 60 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Wed Feb 28 09:18:04 2007 +0000
+++ b/ChangeLog	Thu Mar 01 10:42:01 2007 +0000
@@ -1,3 +1,7 @@
+dhcpcd-3.0.15
+Fix MTU length checking.
+We now request MTU from the DHCP server, and if given we set it.
+
 dhcpcd-3.0.14
 Don't crash with 0 or invalid length DHCP options, reported by
 Stefan de Konink.
--- a/Makefile	Wed Feb 28 09:18:04 2007 +0000
+++ b/Makefile	Thu Mar 01 10:42:01 2007 +0000
@@ -1,6 +1,6 @@
 # Should work for both GNU make and BSD make
 
-VERSION = 3.0.14
+VERSION = 3.0.15
 
 CFLAGS ?= -O2 -pipe
 
--- a/client.c	Wed Feb 28 09:18:04 2007 +0000
+++ b/client.c	Thu Mar 01 10:42:01 2007 +0000
@@ -473,7 +473,7 @@
 	      if (type == DHCP_OFFER)
 		{
 		  char *addr = strdup (inet_ntoa (dhcp->address));
-		  if (dhcp->servername)
+		  if (dhcp->servername[0])
 		    logger (LOG_INFO, "offered %s from %s `%s'",
 			    addr, inet_ntoa (dhcp->serveraddress),
 			    dhcp->servername);
--- a/configure.c	Wed Feb 28 09:18:04 2007 +0000
+++ b/configure.c	Thu Mar 01 10:42:01 2007 +0000
@@ -482,6 +482,9 @@
       return 0;
     }
 
+  if (dhcp->mtu)
+    set_mtu (iface->name, dhcp->mtu);
+
   if (add_address (iface->name, dhcp->address, dhcp->netmask,
 		   dhcp->broadcast) < 0 && errno != EEXIST)
     return -1;
--- a/dhcp.c	Wed Feb 28 09:18:04 2007 +0000
+++ b/dhcp.c	Thu Mar 01 10:42:01 2007 +0000
@@ -186,6 +186,7 @@
 	  *p++ = DHCP_NISDOMAIN;
 	  *p++ = DHCP_NISSERVER;
 	  *p++ = DHCP_NTPSERVER;
+	  *p++ = DHCP_MTU;
 	  /* These parameters were requested by dhcpcd-2.0 and earlier
 	     but we never did anything with them */
 	  /*    *p++ = DHCP_DEFAULTIPTTL;
@@ -550,15 +551,27 @@
 	    }
 	}
 
+#define LENGTH(_length) \
+      if (length != _length) \
+      LEN_ERR;
 #define MIN_LENGTH(_length) \
       if (length < _length) \
       LEN_ERR;
 #define MULT_LENGTH(_mult) \
       if (length % _mult != 0) \
       LEN_ERR;
+#define GET_UINT8(_val) \
+      LENGTH (sizeof (uint8_t)); \
+      memcpy (&_val, p, sizeof (uint8_t));
+#define GET_UINT16(_val) \
+      LENGTH (sizeof (uint16_t)); \
+      memcpy (&_val, p, sizeof (uint16_t));
 #define GET_UINT32(_val) \
-      MIN_LENGTH (sizeof (uint32_t)); \
+      LENGTH (sizeof (uint32_t)); \
       memcpy (&_val, p, sizeof (uint32_t));
+#define GET_UINT16_H(_val) \
+      GET_UINT16 (_val); \
+      _val = ntohs (_val);
 #define GET_UINT32_H(_val) \
       GET_UINT32 (_val); \
       _val = ntohl (_val);
@@ -587,13 +600,20 @@
 	  GET_UINT32_H (dhcp->rebindtime);
 	  break;
 	case DHCP_MTU:
-	  GET_UINT32_H (dhcp->mtu);
+	  GET_UINT16_H (dhcp->mtu);
 	  /* Minimum legal mtu is 68 */
-	  if (dhcp->mtu > 0 && dhcp->mtu < 68)
-	    dhcp->mtu = 68;
+	  if (dhcp->mtu < 68)
+	    {
+	      logger (LOG_ERR, "minimum legal MTU is 68");
+	      dhcp->mtu = 68;
+	    }
 	  break;
+
 #undef GET_UINT32_H
 #undef GET_UINT32
+#undef GET_UINT16_H
+#undef GET_UINT16
+#undef GET_UINT8
 
 #define GETSTR(_var) \
 	  MIN_LENGTH (sizeof (char)); \
@@ -680,6 +700,7 @@
 	    }
 	  break;
 
+#undef LENGTH
 #undef MIN_LENGTH
 #undef MULT_LENGTH
 
--- a/interface.c	Wed Feb 28 09:18:04 2007 +0000
+++ b/interface.c	Thu Mar 01 10:42:01 2007 +0000
@@ -268,6 +268,31 @@
   return iface;
 }
 
+int set_mtu (const char *ifname, short int mtu)
+{
+  struct ifreq ifr;
+  int r;
+  int s;
+
+  if ((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0) 
+    {
+      logger (LOG_ERR, "socket: %s", strerror (errno));
+      return (-1);
+    }
+
+  memset (&ifr, 0, sizeof (struct ifreq));
+  logger (LOG_DEBUG, "setting MTU to %d", mtu);
+  strcpy (ifr.ifr_name, ifname);
+  ifr.ifr_mtu = mtu;
+  r = ioctl (s, SIOCSIFMTU, &ifr);
+  close (s);
+
+  if (r < 0)
+    logger (LOG_ERR, "ioctl SIOCSIFMTU: %s", strerror (errno));
+
+  return (r == 0 ? 0 : -1);
+}
+
 #if defined(__FreeBSD__) || defined(__NetBSD__) || defined (__OpenBSD__) \
 || defined(__APPLE__)
 static int do_address (const char *ifname, struct in_addr address,
--- a/interface.h	Wed Feb 28 09:18:04 2007 +0000
+++ b/interface.h	Thu Mar 01 10:42:01 2007 +0000
@@ -85,6 +85,7 @@
 void free_address (address_t *addresses);
 void free_route (route_t *routes);
 interface_t *read_interface (const char *ifname, int metric);
+int set_mtu (const char *ifname, short int mtu);
 
 int add_address (const char *ifname, struct in_addr address,
 		 struct in_addr netmask, struct in_addr broadcast);