The branch main has been updated by jhb:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=d61d98f4ed68c5f6c81586a529057fe51fd50a60

commit d61d98f4ed68c5f6c81586a529057fe51fd50a60
Author:     John Baldwin <j...@freebsd.org>
AuthorDate: 2021-05-05 20:58:50 +0000
Commit:     John Baldwin <j...@freebsd.org>
CommitDate: 2021-05-05 20:58:50 +0000

    Add freebsd32 compat shims for SIOC[GS]DRVSPEC.
    
    Reviewed by:    brooks, kib
    Obtained from:  CheriBSD
    Sponsored by:   DARPA
    Differential Revision:  https://reviews.freebsd.org/D29892
---
 sys/net/if.c | 33 +++++++++++++++++++++++++++++++++
 1 file changed, 33 insertions(+)

diff --git a/sys/net/if.c b/sys/net/if.c
index a3f5a8dc831a..2517c1f7e5bc 100644
--- a/sys/net/if.c
+++ b/sys/net/if.c
@@ -149,6 +149,15 @@ CTASSERT(sizeof(struct ifreq) == sizeof(struct ifreq32));
 CTASSERT(__offsetof(struct ifreq, ifr_ifru) ==
     __offsetof(struct ifreq32, ifr_ifru));
 
+struct ifdrv32 {
+       char            ifd_name[IFNAMSIZ];
+       uint32_t        ifd_cmd;
+       uint32_t        ifd_len;
+       uint32_t        ifd_data;
+};
+#define SIOCSDRVSPEC32 _IOC_NEWTYPE(SIOCSDRVSPEC, struct ifdrv32)
+#define SIOCGDRVSPEC32 _IOC_NEWTYPE(SIOCGDRVSPEC, struct ifdrv32)
+
 struct ifgroupreq32 {
        char    ifgr_name[IFNAMSIZ];
        u_int   ifgr_len;
@@ -2926,11 +2935,13 @@ ifioctl(struct socket *so, u_long cmd, caddr_t data, 
struct thread *td)
 #ifdef COMPAT_FREEBSD32
        union {
                struct ifconf ifc;
+               struct ifdrv ifd;
                struct ifmediareq ifmr;
        } thunk;
        caddr_t saved_data;
        u_long saved_cmd;
        struct ifconf32 *ifc32;
+       struct ifdrv32 *ifd32;
        struct ifmediareq32 *ifmr32;
 #endif
        struct ifnet *ifp;
@@ -2962,6 +2973,17 @@ ifioctl(struct socket *so, u_long cmd, caddr_t data, 
struct thread *td)
                data = (caddr_t)&thunk.ifc;
                cmd = SIOCGIFCONF;
                break;
+       case SIOCGDRVSPEC32:
+       case SIOCSDRVSPEC32:
+               ifd32 = (struct ifdrv32 *)data;
+               memcpy(thunk.ifd.ifd_name, ifd32->ifd_name,
+                   sizeof(thunk.ifd.ifd_name));
+               thunk.ifd.ifd_cmd = ifd32->ifd_cmd;
+               thunk.ifd.ifd_len = ifd32->ifd_len;
+               thunk.ifd.ifd_data = PTRIN(ifd32->ifd_data);
+               data = (caddr_t)&thunk.ifd;
+               cmd = _IOC_NEWTYPE(cmd, struct ifdrv);
+               break;
        case SIOCGIFMEDIA32:
        case SIOCGIFXMEDIA32:
                ifmr32 = (struct ifmediareq32 *)data;
@@ -3082,6 +3104,17 @@ out_noref:
        case SIOCGIFCONF32:
                ifc32->ifc_len = thunk.ifc.ifc_len;
                break;
+       case SIOCGDRVSPEC32:
+               /*
+                * SIOCGDRVSPEC is IOWR, but nothing actually touches
+                * the struct so just assert that ifd_len (the only
+                * field it might make sense to update) hasn't
+                * changed.
+                */
+               KASSERT(thunk.ifd.ifd_len == ifd32->ifd_len,
+                   ("ifd_len was updated %u -> %zu", ifd32->ifd_len,
+                       thunk.ifd.ifd_len));
+               break;
        case SIOCGIFMEDIA32:
        case SIOCGIFXMEDIA32:
                ifmr32->ifm_current = thunk.ifmr.ifm_current;
_______________________________________________
dev-commits-src-main@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/dev-commits-src-main
To unsubscribe, send any mail to "dev-commits-src-main-unsubscr...@freebsd.org"

Reply via email to