We now request MTU from the DHCP server, and if given we set it.
+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.
# Should work for both GNU make and BSD make
-VERSION = 3.0.14
+VERSION = 3.0.15
CFLAGS ?= -O2 -pipe
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);
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;
*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;
}
}
+#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);
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)); \
}
break;
+#undef LENGTH
#undef MIN_LENGTH
#undef MULT_LENGTH
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,
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);