diff options
author | Conrad Meyer <cem@FreeBSD.org> | 2016-09-02 21:14:29 +0000 |
---|---|---|
committer | Conrad Meyer <cem@FreeBSD.org> | 2016-09-02 21:14:29 +0000 |
commit | 387016a57624e225ee841b674035c8cf40dc7c97 (patch) | |
tree | d7603c3ea47486098d57f5fc93b62610dd6c191d /sbin/dhclient/dhclient.c | |
parent | 681e94f4d03f609ecaeaa8229fcfae31bb5311f0 (diff) | |
download | src-387016a57624e225ee841b674035c8cf40dc7c97.tar.gz src-387016a57624e225ee841b674035c8cf40dc7c97.zip |
dhclient: add support for interface-mtu (26)
Make dhclient set interface MTU if it was provided.
This version implements MTU setting in dhclient itself before it runs
dhclient-script.
PR: 206721
Submitted by: novel@
Reported by: Jarrod Petz <jlpetz at gmail.com>
Reviewed by: cem, allanjude
Differential Revision: https://reviews.freebsd.org/D5675
Notes
Notes:
svn path=/head/; revision=305306
Diffstat (limited to 'sbin/dhclient/dhclient.c')
-rw-r--r-- | sbin/dhclient/dhclient.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/sbin/dhclient/dhclient.c b/sbin/dhclient/dhclient.c index 65f0eb588eb1..d20585db0dc8 100644 --- a/sbin/dhclient/dhclient.c +++ b/sbin/dhclient/dhclient.c @@ -60,6 +60,7 @@ __FBSDID("$FreeBSD$"); #include "privsep.h" #include <sys/capsicum.h> +#include <sys/endian.h> #include <net80211/ieee80211_freebsd.h> @@ -132,6 +133,9 @@ int fork_privchld(int, int); ((a) > 0 ? (1 + (((a) - 1) | (sizeof(long) - 1))) : sizeof(long)) #define ADVANCE(x, n) (x += ROUNDUP((n)->sa_len)) +/* Minimum MTU is 68 as per RFC791, p. 24 */ +#define MIN_MTU 68 + static time_t scripttime; int @@ -798,9 +802,20 @@ dhcpack(struct packet *packet) void bind_lease(struct interface_info *ip) { + struct option_data *opt; + /* Remember the medium. */ ip->client->new->medium = ip->client->medium; + opt = &ip->client->new->options[DHO_INTERFACE_MTU]; + if (opt->len == sizeof(u_int16_t)) { + u_int16_t mtu = be16dec(opt->data); + if (mtu < MIN_MTU) + warning("mtu size %u < %d: ignored", (unsigned)mtu, MIN_MTU); + else + interface_set_mtu_unpriv(privfd, mtu); + } + /* Write out the new lease. */ write_client_lease(ip, ip->client->new, 0); |