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-all mailing list