A misplaced #endif in ixgbe_ioctl() causes interface MTU to become zero when INET and INET6 are undefined. Fix: Patch attached with submission follows: How-To-Repeat: See sys/dev/ixgbe/ixgbe.c v 1.53 function ixgbe_ioctl.
Responsible Changed From-To: freebsd-bugs->freebsd-net Over to maintainer(s).
I have a more complete patch. Can you test it please? Index: sys/dev/ixgbe/ixgbe.c =================================================================== --- sys/dev/ixgbe/ixgbe.c (revision 226068) +++ sys/dev/ixgbe/ixgbe.c (working copy) @@ -867,16 +867,15 @@ static int ixgbe_ioctl(struct ifnet * ifp, u_long command, caddr_t data) { struct adapter *adapter = ifp->if_softc; - struct ifreq *ifr = (struct ifreq *) data; + struct ifreq *ifr = (struct ifreq *)data; #if defined(INET) || defined(INET6) - struct ifaddr *ifa = (struct ifaddr *)data; - bool avoid_reset = FALSE; + struct ifaddr *ifa = (struct ifaddr *)data; #endif - int error = 0; + bool avoid_reset = FALSE; + int error = 0; switch (command) { - - case SIOCSIFADDR: + case SIOCSIFADDR: #ifdef INET if (ifa->ifa_addr->sa_family == AF_INET) avoid_reset = TRUE; @@ -885,7 +884,6 @@ ixgbe_ioctl(struct ifnet * ifp, u_long command, ca if (ifa->ifa_addr->sa_family == AF_INET6) avoid_reset = TRUE; #endif -#if defined(INET) || defined(INET6) /* ** Calling init results in link renegotiation, ** so we avoid doing it when possible. @@ -894,12 +892,13 @@ ixgbe_ioctl(struct ifnet * ifp, u_long command, ca ifp->if_flags |= IFF_UP; if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) ixgbe_init(adapter); +#ifdef INET if (!(ifp->if_flags & IFF_NOARP)) arp_ifinit(ifp, ifa); +#endif } else error = ether_ioctl(ifp, command, data); break; -#endif case SIOCSIFMTU: IOCTL_DEBUGOUT("ioctl: SIOCSIFMTU (Set Interface MTU)"); if (ifr->ifr_mtu > IXGBE_MAX_FRAME_SIZE - ETHER_HDR_LEN) { -- wbr, pluknet
On 10/29/2011 4:28 PM, Sergey Kandaurov wrote: > I have a more complete patch. Can you test it please? > > Index: sys/dev/ixgbe/ixgbe.c > =================================================================== > --- sys/dev/ixgbe/ixgbe.c (revision 226068) > +++ sys/dev/ixgbe/ixgbe.c (working copy) > @@ -867,16 +867,15 @@ static int > ixgbe_ioctl(struct ifnet * ifp, u_long command, caddr_t data) > { > struct adapter *adapter = ifp->if_softc; > - struct ifreq *ifr = (struct ifreq *) data; > + struct ifreq *ifr = (struct ifreq *)data; > #if defined(INET) || defined(INET6) > - struct ifaddr *ifa = (struct ifaddr *)data; > - bool avoid_reset = FALSE; > + struct ifaddr *ifa = (struct ifaddr *)data; > #endif > - int error = 0; > + bool avoid_reset = FALSE; > + int error = 0; > > switch (command) { > - > - case SIOCSIFADDR: > + case SIOCSIFADDR: > #ifdef INET > if (ifa->ifa_addr->sa_family == AF_INET) > avoid_reset = TRUE; > @@ -885,7 +884,6 @@ ixgbe_ioctl(struct ifnet * ifp, u_long command, ca > if (ifa->ifa_addr->sa_family == AF_INET6) > avoid_reset = TRUE; > #endif > -#if defined(INET) || defined(INET6) > /* > ** Calling init results in link renegotiation, > ** so we avoid doing it when possible. > @@ -894,12 +892,13 @@ ixgbe_ioctl(struct ifnet * ifp, u_long command, ca > ifp->if_flags |= IFF_UP; > if (!(ifp->if_drv_flags& IFF_DRV_RUNNING)) > ixgbe_init(adapter); > +#ifdef INET > if (!(ifp->if_flags& IFF_NOARP)) > arp_ifinit(ifp, ifa); > +#endif > } else > error = ether_ioctl(ifp, command, data); > break; > -#endif > case SIOCSIFMTU: > IOCTL_DEBUGOUT("ioctl: SIOCSIFMTU (Set Interface MTU)"); > if (ifr->ifr_mtu> IXGBE_MAX_FRAME_SIZE - ETHER_HDR_LEN) { > > sure. I am very busy right now. Will test as soon as I can.
This is now applicable to if_ix.c but seems to still be applicable.
Regenerated patch after ixgbe(4) overhaul. https://reviews.freebsd.org/D3187
A commit references this bug: Author: sbruno Date: Mon Aug 3 16:39:26 UTC 2015 New revision: 286238 URL: https://svnweb.freebsd.org/changeset/base/286238 Log: A misplaced #endif in ixgbe_ioctl() causes interface MTU to become zero when INET and INET6 are undefined. PR: 162028 Differential Revision: https://reviews.freebsd.org/D3187 Submitted by: hoomanfazaeli@gmail.com pluknet Reviewed by: erj hiren gelbius MFC after: 2 weeks Changes: head/sys/dev/ixgbe/if_ix.c
A commit references this bug: Author: sbruno Date: Fri Sep 4 15:34:27 UTC 2015 New revision: 287461 URL: https://svnweb.freebsd.org/changeset/base/287461 Log: MFC r286238 A misplaced #endif in ixgbe_ioctl() causes interface MTU to become zero when INET and INET6 are undefined. PR: 162028 Submitted by: hoomanfazaeli@gmail.com pluknet Changes: _U stable/10/ stable/10/sys/dev/ixgbe/if_ix.c