Date: Thu, 27 Feb 2014 19:30:01 GMT From: Robert Blayzor <rblayzor@inoc.net> To: freebsd-bugs@FreeBSD.org Subject: Re: misc/187094: FreeBSD DHCP ignores dhcp option interface-mtu Message-ID: <201402271930.s1RJU1DQ080338@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
The following reply was made to PR misc/187094; it has been noted by GNATS. From: Robert Blayzor <rblayzor@inoc.net> To: "bug-followup@freebsd.org" <bug-followup@FreeBSD.org> Cc: Subject: Re: misc/187094: FreeBSD DHCP ignores dhcp option interface-mtu Date: Thu, 27 Feb 2014 13:24:11 -0500 I would like to submit the following patch that corrects two major issues: - Look for and set MTU according to DHCP option tag 26 for Interface MTU. This allows booting interface to be used on a jumbo frame enabled network. Currently this is broken and cannot be overridden or set later. - Remove ancient proxy ARP setting. Currently it is more of a problem that a host is multi-homed and booting interface network may not have a router. (ie: default route is on another interface/network) The default today is to use DHCP router tag and if no router tag is supplied by DHCP, default route will be set to hosts self. Not supplying a route is a completely valid option, especially since many hosts multi-homed. Patch is against 10.0-RELEASE Index: bootp_subr.c =================================================================== --- bootp_subr.c (revision 261846) +++ bootp_subr.c (working copy) @@ -196,6 +196,8 @@ #define TAG_HOSTNAME 12 /* Client host name */ #define TAG_ROOT 17 /* Root path */ +#define TAG_INTF_MTU 26 /* Interface MTU Size (RFC2132) */ + /* DHCP specific tags */ #define TAG_OVERLOAD 52 /* Option Overload */ #define TAG_MAXMSGSIZE 57 /* Maximum DHCP Message Size */ @@ -229,6 +231,8 @@ #endif static char bootp_cookie[128]; +static unsigned int bootp_ifmtu = 0; + static struct socket *bootp_so; SYSCTL_STRING(_kern, OID_AUTO, bootp_cookie, CTLFLAG_RD, bootp_cookie, 0, "Cookie (T134) supplied by bootp server"); @@ -1030,7 +1034,22 @@ return (0); } - printf("Adjusted interface %s\n", ifctx->ireq.ifr_name); + printf("Adjusted interface %s", ifctx->ireq.ifr_name); + + /* Do BOOTP interface options */ + if (bootp_ifmtu != 0) { + printf(" (MTU=%d", bootp_ifmtu); + if (bootp_ifmtu > 1514) + printf("/JUMBO"); + printf(")"); + + ifr->ifr_mtu = bootp_ifmtu; + error = ifioctl(bootp_so, SIOCSIFMTU, (caddr_t) ifr, td); + if (error != 0) + panic("%s: SIOCSIFMTU, error=%d", __func__, error); + } + printf("\n"); + /* * Do enough of ifconfig(8) so that the chosen interface * can talk to the servers. (just set the address) @@ -1053,7 +1072,12 @@ /* Add new default route */ - if (ifctx->gotgw != 0 || gctx->gotgw == 0) { + /* Only set default route if we received one in the request. + Proxy ARP considered obsolete. More valid to NOT set + a router in request as the host may be multi-homed and + gateway may not be on this interface. + */ + if (ifctx->gotgw != 0 || gctx->gotgw != 0) { clear_sinaddr(&defdst); clear_sinaddr(&defmask); /* XXX MRT just table 0 */ @@ -1518,6 +1542,11 @@ p[i] = '\0'; } + p = bootpc_tag(&gctx->tag, &ifctx->reply, ifctx->replylen, + TAG_INTF_MTU); + if (p != NULL) { + bootp_ifmtu = (((unsigned char)p[0] << 8) + (unsigned char)p[1]); + } printf("\n");
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201402271930.s1RJU1DQ080338>