Module Name:    src
Committed By:   christos
Date:           Wed Dec  9 04:50:47 UTC 2009

Modified Files:
        src/sys/compat/netbsd32: netbsd32_ioctl.c netbsd32_ioctl.h

Log Message:
Add netbsd32_oifreq and fix issue in copying the interface name. With this
patch OSIOC{G,S}IFFLAGS is supposed to work, but unfortunately getifaddrs
seems to be the next problem getting the 4.99.x i386 ifconfig working on an
amd64 current machine.


To generate a diff of this commit:
cvs rdiff -u -r1.42 -r1.43 src/sys/compat/netbsd32/netbsd32_ioctl.c
cvs rdiff -u -r1.24 -r1.25 src/sys/compat/netbsd32/netbsd32_ioctl.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/compat/netbsd32/netbsd32_ioctl.c
diff -u src/sys/compat/netbsd32/netbsd32_ioctl.c:1.42 src/sys/compat/netbsd32/netbsd32_ioctl.c:1.43
--- src/sys/compat/netbsd32/netbsd32_ioctl.c:1.42	Sun May 24 17:41:25 2009
+++ src/sys/compat/netbsd32/netbsd32_ioctl.c	Tue Dec  8 23:50:47 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: netbsd32_ioctl.c,v 1.42 2009/05/24 21:41:25 ad Exp $	*/
+/*	$NetBSD: netbsd32_ioctl.c,v 1.43 2009/12/09 04:50:47 christos Exp $	*/
 
 /*
  * Copyright (c) 1998, 2001 Matthew R. Green
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: netbsd32_ioctl.c,v 1.42 2009/05/24 21:41:25 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: netbsd32_ioctl.c,v 1.43 2009/12/09 04:50:47 christos Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -79,6 +79,8 @@
 static inline void netbsd32_to_format_op(struct netbsd32_format_op *,
 					   struct format_op *, u_long);
 #endif
+static inline void netbsd32_to_oifreq(struct netbsd32_oifreq *, struct oifreq *,
+				       u_long cmd);
 static inline void netbsd32_to_ifreq(struct netbsd32_ifreq *, struct ifreq *,
 				       u_long cmd);
 static inline void netbsd32_to_ifconf(struct netbsd32_ifconf *,
@@ -100,6 +102,8 @@
 #endif
 static inline void netbsd32_from_ifreq(struct ifreq *,
                                          struct netbsd32_ifreq *, u_long);
+static inline void netbsd32_from_oifreq(struct oifreq *,
+                                         struct netbsd32_oifreq *, u_long);
 static inline void netbsd32_from_ifconf(struct ifconf *,
 					  struct netbsd32_ifconf *, u_long);
 static inline void netbsd32_from_ifmediareq(struct ifmediareq *,
@@ -152,6 +156,21 @@
 }
 
 static inline void
+netbsd32_to_oifreq(struct netbsd32_oifreq *s32p, struct oifreq *p, u_long cmd)
+{
+
+	memcpy(p, s32p, sizeof *s32p);
+	/*
+	 * XXX
+	 * struct ifreq says the same, but sometimes the ifr_data
+	 * union member needs to be converted to 64 bits... this
+	 * is very driver specific and so we ignore it for now..
+	 */
+	if (cmd == SIOCGIFDATA || cmd == SIOCZIFDATA)
+		p->ifr_data = (void *)NETBSD32PTR64(s32p->ifr_data);
+}
+
+static inline void
 netbsd32_to_ifconf(struct netbsd32_ifconf *s32p, struct ifconf *p, u_long cmd)
 {
 
@@ -235,7 +254,24 @@
 	 * union member needs to be converted to 64 bits... this
 	 * is very driver specific and so we ignore it for now..
 	 */
-	*s32p->ifr_name = *p->ifr_name;
+	(void)memcpy(s32p->ifr_name, p->ifr_name,
+	    MIN(sizeof(s32p->ifr_name), sizeof(p->ifr_name)));
+	if (cmd == SIOCGIFDATA || cmd == SIOCZIFDATA)
+		NETBSD32PTR32(s32p->ifr_data, p->ifr_data);
+}
+
+static inline void
+netbsd32_from_oifreq(struct oifreq *p, struct netbsd32_oifreq *s32p, u_long cmd)
+{
+
+	/*
+	 * XXX
+	 * struct ifreq says the same, but sometimes the ifr_data
+	 * union member needs to be converted to 64 bits... this
+	 * is very driver specific and so we ignore it for now..
+	 */
+	(void)memcpy(s32p->ifr_name, p->ifr_name,
+	    MIN(sizeof(s32p->ifr_name), sizeof(p->ifr_name)));
 	if (cmd == SIOCGIFDATA || cmd == SIOCZIFDATA)
 		NETBSD32PTR32(s32p->ifr_data, p->ifr_data);
 }
@@ -502,6 +538,12 @@
 	case SIOCSIFFLAGS32:
 		IOCTL_STRUCT_CONV_TO(SIOCSIFFLAGS, ifreq);
 
+	case OSIOCGIFFLAGS32:
+		printf("OSIO %lx %zu\n", (long)OSIOCGIFFLAGS, sizeof(struct netbsd32_oifreq));
+		IOCTL_STRUCT_CONV_TO(OSIOCGIFFLAGS, oifreq);
+	case OSIOCSIFFLAGS32:
+		IOCTL_STRUCT_CONV_TO(OSIOCSIFFLAGS, oifreq);
+
 	case SIOCGIFMEDIA32:
 		IOCTL_STRUCT_CONV_TO(SIOCGIFMEDIA, ifmediareq);
 

Index: src/sys/compat/netbsd32/netbsd32_ioctl.h
diff -u src/sys/compat/netbsd32/netbsd32_ioctl.h:1.24 src/sys/compat/netbsd32/netbsd32_ioctl.h:1.25
--- src/sys/compat/netbsd32/netbsd32_ioctl.h:1.24	Mon Jun 23 19:14:42 2008
+++ src/sys/compat/netbsd32/netbsd32_ioctl.h	Tue Dec  8 23:50:47 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: netbsd32_ioctl.h,v 1.24 2008/06/23 23:14:42 njoly Exp $	*/
+/*	$NetBSD: netbsd32_ioctl.h,v 1.25 2009/12/09 04:50:47 christos Exp $	*/
 
 /*
  * Copyright (c) 1998, 2001 Matthew R. Green
@@ -151,7 +151,7 @@
 /*
  * note that ifr_data is the only one that needs to be changed
  */
-struct	netbsd32_ifreq {
+struct	netbsd32_oifreq {
 	char	ifr_name[IFNAMSIZ];		/* if name, e.g. "en0" */
 	union {
 		struct	sockaddr ifru_addr;
@@ -160,7 +160,13 @@
 		short	ifru_flags;
 		int	ifru_metric;
 		int	ifru_mtu;
+		int	ifru_dlt;
+		u_int	ifru_value;
 		netbsd32_caddr_t ifru_data;
+		struct {
+			uint32_t	b_buflen;
+			netbsd32_caddr_t b_buf;
+		} ifru_b;
 	} ifr_ifru;
 #define	ifr_addr	ifr_ifru.ifru_addr	/* address */
 #define	ifr_dstaddr	ifr_ifru.ifru_dstaddr	/* other end of p-to-p link */
@@ -171,33 +177,89 @@
 #define	ifr_media	ifr_ifru.ifru_metric	/* media options (overload) */
 #define	ifr_data	ifr_ifru.ifru_data	/* for use by interface */
 };
+struct	netbsd32_ifreq {
+	char	ifr_name[IFNAMSIZ];		/* if name, e.g. "en0" */
+	union {
+		struct	sockaddr ifru_addr;
+		struct	sockaddr ifru_dstaddr;
+		struct	sockaddr ifru_broadaddr;
+		struct	sockaddr_storage ifru_space;
+		short	ifru_flags;
+		int	ifru_metric;
+		int	ifru_mtu;
+		int	ifru_dlt;
+		u_int	ifru_value;
+		netbsd32_caddr_t ifru_data;
+		struct {
+			uint32_t	b_buflen;
+			netbsd32_caddr_t b_buf;
+		} ifru_b;
+	} ifr_ifru;
+};
 #if 1
 /* from <dev/pci/if_devar.h> */
 #define	SIOCGADDRROM32		_IOW('i', 240, struct netbsd32_ifreq)	/* get 128 bytes of ROM */
 #define	SIOCGCHIPID32		_IOWR('i', 241, struct netbsd32_ifreq)	/* get chipid */
 /* from <sys/sockio.h> */
 #define	SIOCSIFADDR32	 _IOW('i', 12, struct netbsd32_ifreq)	/* set ifnet address */
-#define	OSIOCGIFADDR32	_IOWR('i', 13, struct netbsd32_ifreq)	/* get ifnet address */
+#define	OSIOCSIFADDR32	 _IOW('i', 12, struct netbsd32_oifreq)	/* set ifnet address */
+#define	OOSIOCGIFADDR32	_IOWR('i', 13, struct netbsd32_oifreq)	/* get ifnet address */
+
 #define	SIOCGIFADDR32	_IOWR('i', 33, struct netbsd32_ifreq)	/* get ifnet address */
+#define	OSIOCGIFADDR32	_IOWR('i', 33, struct netbsd32_oifreq)	/* get ifnet address */
+
 #define	SIOCSIFDSTADDR32	 _IOW('i', 14, struct netbsd32_ifreq)	/* set p-p address */
-#define	OSIOCGIFDSTADDR32	_IOWR('i', 15, struct netbsd32_ifreq)	/* get p-p address */
+#define	OSIOCSIFDSTADDR32	 _IOW('i', 14, struct netbsd32_oifreq)	/* set p-p address */
+#define	OOSIOCGIFDSTADDR32	_IOWR('i', 15, struct netbsd32_oifreq)	/* get p-p address */
+
 #define	SIOCGIFDSTADDR32	_IOWR('i', 34, struct netbsd32_ifreq)	/* get p-p address */
+#define	OSIOCGIFDSTADDR32	_IOWR('i', 34, struct netbsd32_oifreq)	/* get p-p address */
+
 #define	SIOCSIFFLAGS32	 _IOW('i', 16, struct netbsd32_ifreq)	/* set ifnet flags */
+#define	OSIOCSIFFLAGS32	 _IOW('i', 16, struct netbsd32_oifreq)	/* set ifnet flags */
+
 #define	SIOCGIFFLAGS32	_IOWR('i', 17, struct netbsd32_ifreq)	/* get ifnet flags */
-#define	OSIOCGIFBRDADDR32	_IOWR('i', 18, struct netbsd32_ifreq)	/* get broadcast addr */
-#define	SIOCGIFBRDADDR32	_IOWR('i', 35, struct netbsd32_ifreq)	/* get broadcast addr */
+#define	OSIOCGIFFLAGS32	_IOWR('i', 17, struct netbsd32_oifreq)	/* get ifnet flags */
+
+
 #define	SIOCSIFBRDADDR32	 _IOW('i', 19, struct netbsd32_ifreq)	/* set broadcast addr */
-#define	OSIOCGIFNETMASK32	_IOWR('i', 21, struct netbsd32_ifreq)	/* get net addr mask */
+#define	OSIOCSIFBRDADDR32	 _IOW('i', 19, struct netbsd32_oifreq)	/* set broadcast addr */
+#define	OOSIOCGIFBRDADDR32	_IOWR('i', 18, struct netbsd32_oifreq)	/* get broadcast addr */
+
+#define	SIOCGIFBRDADDR32	_IOWR('i', 35, struct netbsd32_ifreq)	/* get broadcast addr */
+#define	OSIOCGIFBRDADDR32	_IOWR('i', 35, struct netbsd32_oifreq)	/* get broadcast addr */
+
+#define	OOSIOCGIFNETMASK32	_IOWR('i', 21, struct netbsd32_oifreq)	/* get net addr mask */
+
 #define	SIOCGIFNETMASK32	_IOWR('i', 37, struct netbsd32_ifreq)	/* get net addr mask */
+#define	OSIOCGIFNETMASK32	_IOWR('i', 37, struct netbsd32_oifreq)	/* get net addr mask */
+
 #define	SIOCSIFNETMASK32	 _IOW('i', 22, struct netbsd32_ifreq)	/* set net addr mask */
+#define	OSIOCSIFNETMASK32	 _IOW('i', 22, struct netbsd32_oifreq)	/* set net addr mask */
+
 #define	SIOCGIFMETRIC32	_IOWR('i', 23, struct netbsd32_ifreq)	/* get IF metric */
+#define	OSIOCGIFMETRIC32	_IOWR('i', 23, struct netbsd32_oifreq)	/* get IF metric */
+
 #define	SIOCSIFMETRIC32	 _IOW('i', 24, struct netbsd32_ifreq)	/* set IF metric */
+#define	OSIOCSIFMETRIC32	 _IOW('i', 24, struct netbsd32_oifreq)	/* set IF metric */
+
 #define	SIOCDIFADDR32	 _IOW('i', 25, struct netbsd32_ifreq)	/* delete IF addr */
+#define	OSIOCDIFADDR32	 _IOW('i', 25, struct netbsd32_oifreq)	/* delete IF addr */
+
 #define	SIOCADDMULTI32	 _IOW('i', 49, struct netbsd32_ifreq)	/* add m'cast addr */
+#define	OSIOCADDMULTI32	 _IOW('i', 49, struct netbsd32_oifreq)	/* add m'cast addr */
+
 #define	SIOCDELMULTI32	 _IOW('i', 50, struct netbsd32_ifreq)	/* del m'cast addr */
+#define	OSIOCDELMULTI32	 _IOW('i', 50, struct netbsd32_oifreq)	/* del m'cast addr */
+
 #define	SIOCSIFMEDIA32	_IOWR('i', 53, struct netbsd32_ifreq)	/* set net media */
+#define	OSIOCSIFMEDIA32	_IOWR('i', 53, struct netbsd32_oifreq)	/* set net media */
+
 #define	SIOCSIFMTU32	 _IOW('i', 127, struct netbsd32_ifreq)	/* set ifnet mtu */
+#define	OSIOCSIFMTU32	 _IOW('i', 127, struct netbsd32_oifreq)	/* set ifnet mtu */
+
 #define	SIOCGIFMTU32	_IOWR('i', 126, struct netbsd32_ifreq)	/* get ifnet mtu */
+#define	OSIOCGIFMTU32	_IOWR('i', 126, struct netbsd32_oifreq)	/* get ifnet mtu */
 /* was 125 SIOCSIFASYNCMAP32 */
 /* was 124 SIOCGIFASYNCMAP32 */
 /* from <net/bpf.h> */

Reply via email to