summaryrefslogtreecommitdiffstats
path: root/freebsd/sbin/dhclient/dhclient.c
diff options
context:
space:
mode:
Diffstat (limited to 'freebsd/sbin/dhclient/dhclient.c')
-rw-r--r--freebsd/sbin/dhclient/dhclient.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/freebsd/sbin/dhclient/dhclient.c b/freebsd/sbin/dhclient/dhclient.c
index d9bae19c..e0af9431 100644
--- a/freebsd/sbin/dhclient/dhclient.c
+++ b/freebsd/sbin/dhclient/dhclient.c
@@ -851,11 +851,23 @@ bind_lease(struct interface_info *ip)
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);
+ u_int16_t mtu = 0;
+ bool supersede = (ip->client->config->default_actions[DHO_INTERFACE_MTU] ==
+ ACTION_SUPERSEDE);
+
+ if (supersede)
+ mtu = getUShort(ip->client->config->defaults[DHO_INTERFACE_MTU].data);
else
+ mtu = be16dec(opt->data);
+
+ if (mtu < MIN_MTU) {
+ /* Treat 0 like a user intentionally doesn't want to change MTU and,
+ * therefore, warning is not needed */
+ if (!supersede || mtu != 0)
+ warning("mtu size %u < %d: ignored", (unsigned)mtu, MIN_MTU);
+ } else {
interface_set_mtu_unpriv(privfd, mtu);
+ }
}
/* Write out the new lease. */