Mercurial > hg > dhcpcd
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);
