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).

N.B.: obsolete u_int16_t is used in consistency with the rest of the file.

PR:		229432
Approved by:	mav (mentor)
MFC after:	1 week
This commit is contained in:
Eugene Grosbein 2018-07-11 09:41:50 +00:00
parent 989e062bea
commit 35b930cc2b
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=336195

View file

@ -547,17 +547,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);
}