if_tap: Add TAPGIFNAME ioctl to get interface name
authorAaron LI <aly@aaronly.me>
Fri, 13 Jul 2018 07:43:07 +0000 (15:43 +0800)
committerAaron LI <aly@aaronly.me>
Tue, 17 Jul 2018 06:57:32 +0000 (14:57 +0800)
This is a convenient shortcut to obtain the network interface name using
file descriptor for character device.

This ioctl is obtained from FreeBSD (revision 182880) which was further
obtained from NetBSD.  This ioctl is used by softwares such as QEMU.

Bump __DragonFly_version and update tap.4 man page.

share/man/man4/tap.4
sys/net/tap/if_tap.c
sys/net/tap/if_tap.h
sys/sys/param.h

index 0f9f0a7..2445a39 100644 (file)
@@ -1,7 +1,7 @@
 .\" $FreeBSD: src/share/man/man4/tap.4,v 1.1.2.7 2002/04/16 23:59:28 trhodes Exp $
 .\" Based on PR#2411
 .\"
-.Dd July 12, 2018
+.Dd July 13, 2018
 .Dt TAP 4
 .Os
 .Sh NAME
@@ -174,6 +174,13 @@ The argument should be a pointer to a
 Retrieve network interface information (line speed, MTU and type).
 The argument should be a pointer to a
 .Va struct tapinfo .
+.It Dv TAPGIFNAME
+Retrieve network interface name.
+The argument should be a pointer to a
+.Va struct ifreq .
+The interface name will be returned in the
+.Va ifr_name
+field.
 .It Dv FIOASYNC
 Turn asynchronous I/O for reads
 (i.e., generation of
index 3c89289..9a6ffb7 100644 (file)
@@ -743,6 +743,7 @@ tapioctl(struct dev_ioctl_args *ap)
        caddr_t data = ap->a_data;
        struct tap_softc *sc = dev->si_drv1;
        struct ifnet *ifp = sc->tap_ifp;
+       struct ifreq *ifr;
        struct tapinfo *tapp = NULL;
        struct mbuf *mb;
        int error;
@@ -765,6 +766,11 @@ tapioctl(struct dev_ioctl_args *ap)
                tapp->baudrate = ifp->if_baudrate;
                break;
 
+       case TAPGIFNAME:
+               ifr = (struct ifreq *)data;
+               strlcpy(ifr->ifr_name, ifp->if_xname, IFNAMSIZ);
+               break;
+
        case TAPSDEBUG:
                tapdebug = *(int *)data;
                break;
index c7731bc..8285377 100644 (file)
@@ -50,11 +50,15 @@ struct tapinfo {
        u_char  dummy;          /* place holder              */
 };
 
+struct ifreq;
+
 /* get/set internal debug variable */
 #define        TAPGDEBUG               _IOR('t', 89, int)
 #define        TAPSDEBUG               _IOW('t', 90, int)
 /* get/set network interface information */
 #define        TAPSIFINFO              _IOW('t', 91, struct tapinfo)
 #define        TAPGIFINFO              _IOR('t', 92, struct tapinfo)
+/* get the network interface name */
+#define        TAPGIFNAME              _IOR('t', 93, struct ifreq)
 
 #endif /* !_NET_IF_TAP_H_ */
index 1831ca7..e84fa2d 100644 (file)
  * 500311 - add VIS_ALL to vis(3)
  * 500312 - OpenPAM Resedacea upgrade
  * 500313 - remove vmnet support from tap(4) (VMIO_* ioctls)
+ * 500314 - add TAPGIFNAME to tap(4)
  */
 #undef __DragonFly_version
-#define __DragonFly_version 500313     /* propagated to newvers */
+#define __DragonFly_version 500314     /* propagated to newvers */
 
 #include <sys/_null.h>