svn commit: r336440 - stable/11/sbin/dhclient
Eugene Grosbein
eugen at FreeBSD.org
Wed Jul 18 01:57:14 UTC 2018
Author: eugen
Date: Wed Jul 18 01:57:13 2018
New Revision: 336440
URL: https://svnweb.freebsd.org/changeset/base/336440
Log:
MFC r336195: unbreak dhclient(8) option 26 processing
Make dhclient(8) verify if new MTU (option 26) differs from current one
and skip unneeded MTU change. This check eliminates infinite loop
of MTU change / link flap / lease verification / MTU change / link flap etc.
in case of some NIC drivers like em(4) or igb(4).
PR: 229432
Approved by: mav (mentor)
Modified:
stable/11/sbin/dhclient/dispatch.c
Directory Properties:
stable/11/ (props changed)
Modified: stable/11/sbin/dhclient/dispatch.c
==============================================================================
--- stable/11/sbin/dhclient/dispatch.c Wed Jul 18 00:56:25 2018 (r336439)
+++ stable/11/sbin/dhclient/dispatch.c Wed Jul 18 01:57:13 2018 (r336440)
@@ -545,17 +545,29 @@ interface_set_mtu_priv(char *ifname, u_int16_t mtu)
{
struct ifreq ifr;
int sock;
+ u_int16_t old_mtu;
if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
error("Can't create socket");
memset(&ifr, 0, sizeof(ifr));
+ old_mtu = 0;
strlcpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
- ifr.ifr_mtu = mtu;
- if (ioctl(sock, SIOCSIFMTU, &ifr) == -1)
- warning("SIOCSIFMTU failed (%d): %s", mtu,
+ if (ioctl(sock, SIOCGIFMTU, (caddr_t)&ifr) == -1)
+ warning("SIOCGIFMTU failed (%s): %s", ifname,
strerror(errno));
+ else
+ old_mtu = ifr.ifr_mtu;
+
+ if (mtu != old_mtu) {
+ ifr.ifr_mtu = mtu;
+
+ if (ioctl(sock, SIOCSIFMTU, &ifr) == -1)
+ warning("SIOCSIFMTU failed (%d): %s", mtu,
+ strerror(errno));
+ }
+
close(sock);
}
More information about the svn-src-stable-11
mailing list