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