On Fri, Nov 23, 2012 at 04:04:20PM +0000, Stuart Henderson wrote:
> This adds an ioctl to retrieve if_hardmtu, and adds code to
> display it via ifconfig hwfeatures.
>
> $ ifconfig em0 hwfeatures
> em0: flags=8b43<UP,BROADCAST,RUNNING,PROMISC,ALLMULTI,SIMPLEX,MULTICAST> mtu
> 1500
> hwfeatures=30<VLAN_MTU,VLAN_HWTAGGING> hardmtu=16110
> lladdr f0:de:f1:f9:a7:52
> priority: 0
> trunk: trunkdev trunk0
> media: Ethernet autoselect (100baseTX full-duplex,rxpause,txpause)
> status: active
>
> Added bonus, mention a few other existing ioctls in netintro(4).
>
> Any comments/bikeshedding about display format/OKs?
>
I would replace the "=" after hardmtu with a single whitespace to
follow the common ifconfig style. The "=" is only used for flags-type
fields.
The diff looks fine to me.
>
> Index: sys/net/if.c
> ===================================================================
> RCS file: /cvs/src/sys/net/if.c,v
> retrieving revision 1.247
> diff -u -p -r1.247 if.c
> --- sys/net/if.c 23 Oct 2012 17:41:00 -0000 1.247
> +++ sys/net/if.c 23 Nov 2012 15:55:02 -0000
> @@ -1268,6 +1268,10 @@ ifioctl(struct socket *so, u_long cmd, c
> ifr->ifr_mtu = ifp->if_mtu;
> break;
>
> + case SIOCGIFHARDMTU:
> + ifr->ifr_hardmtu = ifp->if_hardmtu;
> + break;
> +
> case SIOCGIFDATA:
> error = copyout((caddr_t)&ifp->if_data, ifr->ifr_data,
> sizeof(ifp->if_data));
> Index: sys/net/if.h
> ===================================================================
> RCS file: /cvs/src/sys/net/if.h,v
> retrieving revision 1.136
> diff -u -p -r1.136 if.h
> --- sys/net/if.h 11 Nov 2012 04:45:37 -0000 1.136
> +++ sys/net/if.h 23 Nov 2012 15:55:02 -0000
> @@ -639,6 +639,7 @@ struct ifreq {
> #define ifr_flags ifr_ifru.ifru_flags /* flags */
> #define ifr_metric ifr_ifru.ifru_metric /* metric */
> #define ifr_mtu ifr_ifru.ifru_metric /* mtu (overload) */
> +#define ifr_hardmtu ifr_ifru.ifru_metric /* hardmtu (overload) */
> #define ifr_media ifr_ifru.ifru_metric /* media options
> (overload) */
> #define ifr_rdomainid ifr_ifru.ifru_metric /* VRF instance
> (overload) */
> #define ifr_data ifr_ifru.ifru_data /* for use by interface
> */
> Index: sys/net/if_gre.c
> ===================================================================
> RCS file: /cvs/src/sys/net/if_gre.c,v
> retrieving revision 1.58
> diff -u -p -r1.58 if_gre.c
> --- sys/net/if_gre.c 14 Apr 2012 09:39:47 -0000 1.58
> +++ sys/net/if_gre.c 23 Nov 2012 15:55:02 -0000
> @@ -475,6 +475,9 @@ gre_ioctl(struct ifnet *ifp, u_long cmd,
> case SIOCGIFMTU:
> ifr->ifr_mtu = sc->sc_if.if_mtu;
> break;
> + case SIOCGIFHARDMTU:
> + ifr->ifr_hardmtu = sc->sc_if.if_hardmtu;
> + break;
> case SIOCADDMULTI:
> case SIOCDELMULTI:
> if (ifr == 0) {
> Index: sys/net/if_spppsubr.c
> ===================================================================
> RCS file: /cvs/src/sys/net/if_spppsubr.c,v
> retrieving revision 1.98
> diff -u -p -r1.98 if_spppsubr.c
> --- sys/net/if_spppsubr.c 24 Jul 2012 15:16:20 -0000 1.98
> +++ sys/net/if_spppsubr.c 23 Nov 2012 15:55:02 -0000
> @@ -1117,6 +1117,11 @@ sppp_ioctl(struct ifnet *ifp, u_long cmd
> ifr->ifr_mtu = ifp->if_mtu;
> break;
> #endif
> +#ifdef SIOCGIFHARDMTU
> + case SIOCGIFHARDMTU:
> + ifr->ifr_hardmtu = ifp->if_hardmtu;
> + break;
> +#endif
> #ifdef SLIOCGETMTU
> case SLIOCGETMTU:
> *(short*)data = ifp->if_mtu;
> Index: sys/sys/sockio.h
> ===================================================================
> RCS file: /cvs/src/sys/sys/sockio.h,v
> retrieving revision 1.49
> diff -u -p -r1.49 sockio.h
> --- sys/sys/sockio.h 26 Nov 2011 23:38:18 -0000 1.49
> +++ sys/sys/sockio.h 23 Nov 2012 15:59:06 -0000
> @@ -181,6 +181,8 @@
> #define SIOCSETKALIVE _IOW('i', 163, struct ifkalivereq)
> #define SIOCGETKALIVE _IOWR('i', 164, struct ifkalivereq)
>
> +#define SIOCGIFHARDMTU _IOWR('i', 165, struct ifreq) /* get ifnet
> hardmtu */
> +
> #define SIOCSVH _IOWR('i', 245, struct ifreq) /* set carp
> param */
> #define SIOCGVH _IOWR('i', 246, struct ifreq) /* get carp
> param */
>
> Index: sbin/ifconfig/ifconfig.c
> ===================================================================
> RCS file: /cvs/src/sbin/ifconfig/ifconfig.c,v
> retrieving revision 1.257
> diff -u -p -w -r1.257 ifconfig.c
> --- sbin/ifconfig/ifconfig.c 6 Sep 2012 19:41:59 -0000 1.257
> +++ sbin/ifconfig/ifconfig.c 23 Nov 2012 16:01:07 -0000
> @@ -4722,6 +4722,11 @@ printifhwfeatures(const char *unused, in
> if (ioctl(s, SIOCGIFDATA, (caddr_t)&ifr) == -1)
> err(1, "SIOCGIFDATA");
> printb("\thwfeatures", (u_int)ifrdat.ifi_capabilities, HWFEATURESBITS);
> +
> + if (ioctl(s, SIOCGIFHARDMTU, (caddr_t)&ifr) != -1) {
> + if (ifr.ifr_hardmtu)
> + printf(" hardmtu %lu", ifr.ifr_hardmtu);
> + }
> putchar('\n');
> }
> #endif
> Index: share/man/man4/netintro.4
> ===================================================================
> RCS file: /cvs/src/share/man/man4/netintro.4,v
> retrieving revision 1.41
> diff -u -p -r1.41 netintro.4
> --- share/man/man4/netintro.4 3 Dec 2011 23:01:21 -0000 1.41
> +++ share/man/man4/netintro.4 23 Nov 2012 16:03:17 -0000
> @@ -280,6 +280,12 @@ incoming packets are no longer received.
> When marked up again, the interface is reinitialized.
> .It Dv SIOCGIFFLAGS Fa "struct ifreq *"
> Get the interface flags.
> +.It Dv SIOCGIFXFLAGS Fa "struct ifreq *"
> +Get the extended interface flags.
> +.It Dv SIOCGIFMTU Fa "struct ifreq *"
> +Get the current MTU of the interface.
> +.It Dv SIOCGIFHARDMTU Fa "struct ifreq *"
> +Get the maximum hardware MTU of the interface.
> .It Dv SIOCSIFMEDIA Fa "struct ifreq *"
> Set the interface media settings.
> See
> @@ -317,6 +323,9 @@ new static routes added to the kernel us
> The value is in the range of 0 to 16 with smaller numbers being better.
> .It Dv SIOCGIFPRIORITY Fa "struct ifreq *"
> Get the interface priority.
> +.It Dv SIOCGIFRDOMAIN Fa "struct ifreq *"
> +Get the interface routing domain.
> +This identifies which routing table is used for the interface.
> .It Dv SIOCAIFADDR Fa "struct ifaliasreq *"
> An interface may have more than one address associated with it
> in some protocols.