aboutsummaryrefslogtreecommitdiff
path: root/sbin/dhclient/dhclient.c
diff options
context:
space:
mode:
authorConrad Meyer <cem@FreeBSD.org>2016-09-02 21:14:29 +0000
committerConrad Meyer <cem@FreeBSD.org>2016-09-02 21:14:29 +0000
commit387016a57624e225ee841b674035c8cf40dc7c97 (patch)
treed7603c3ea47486098d57f5fc93b62610dd6c191d /sbin/dhclient/dhclient.c
parent681e94f4d03f609ecaeaa8229fcfae31bb5311f0 (diff)
downloadsrc-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.c15
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);