if_tap: Restore SIOCGIFFLAGS, SIOC[GS]IFADDR ioctls for tapioctl()
authorAaron LI <aly@aaronly.me>
Thu, 19 Jul 2018 07:04:35 +0000 (15:04 +0800)
committerAaron LI <aly@aaronly.me>
Thu, 19 Jul 2018 07:08:42 +0000 (15:08 +0800)
These ioctls allow basic control of the network interface via the device
file (/dev/tapX).  For example, our vke(4) device currently uses the
'SIOCGIFADDR' ioctl.

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

index f98ba13..859f4f9 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 17, 2018
+.Dd July 19, 2018
 .Dt TAP 4
 .Os
 .Sh NAME
@@ -212,6 +212,26 @@ Retrieve the process group value for
 signals into the argument
 .Va int
 value.
+.It Dv SIOCGIFFLAGS
+Retrieve the flags of the network interface associated with the control
+device into the argument
+.Va int
+value.
+.It Dv SIOCGIFADDR
+Retrieve the MAC address of the associated network interface.
+The argument should be a pointer to a
+.Va uint8_t
+array of length
+.Dv ETHER_ADDR_LEN .
+This command is used by the
+.Xr vke 4
+device.
+.It Dv SIOCSIFADDR
+Set the MAC address of the associated network interface.
+The argument should be a pointer to a
+.Va uint8_t
+array of length
+.Dv ETHER_ADDR_LEN .
 .El
 .Pp
 The control device also supports
@@ -230,4 +250,5 @@ letting them pile up.
 .Sh SEE ALSO
 .Xr inet 4 ,
 .Xr tun 4 ,
+.Xr vke 4 ,
 .Xr ifconfig 8
index e8bf6f2..fc5c69d 100644 (file)
@@ -808,6 +808,23 @@ tapioctl(struct dev_ioctl_args *ap)
                *(int *)data = -fgetown(&sc->tap_sigio);
                break;
 
+       /*
+        * Support basic control of the network interface via the device file.
+        * e.g., vke(4) currently uses the 'SIOCGIFADDR' ioctl.
+        */
+
+       case SIOCGIFFLAGS:
+               bcopy(&ifp->if_flags, data, sizeof(ifp->if_flags));
+               break;
+
+       case SIOCGIFADDR:
+               bcopy(sc->ether_addr, data, sizeof(sc->ether_addr));
+               break;
+
+       case SIOCSIFADDR:
+               bcopy(data, sc->ether_addr, sizeof(sc->ether_addr));
+               break;
+
        default:
                error = ENOTTY;
                break;