From 67de10fc577568c6bb99d40e000d44c01e7b88eb Mon Sep 17 00:00:00 2001 From: christos Date: Wed, 9 Dec 2009 04:50:47 +0000 Subject: [PATCH] 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. --- sys/compat/netbsd32/netbsd32_ioctl.c | 48 ++++++++++++++++-- sys/compat/netbsd32/netbsd32_ioctl.h | 76 +++++++++++++++++++++++++--- 2 files changed, 114 insertions(+), 10 deletions(-) diff --git a/sys/compat/netbsd32/netbsd32_ioctl.c b/sys/compat/netbsd32/netbsd32_ioctl.c index 0fe42c14d6fb..6fd87e641dcf 100644 --- a/sys/compat/netbsd32/netbsd32_ioctl.c +++ b/sys/compat/netbsd32/netbsd32_ioctl.c @@ -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 -__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 #include @@ -79,6 +79,8 @@ static inline void netbsd32_to_partinfo(struct netbsd32_partinfo *, 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 @@ static inline void netbsd32_from_format_op(struct format_op *, #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 *, @@ -151,6 +155,21 @@ netbsd32_to_ifreq(struct netbsd32_ifreq *s32p, struct ifreq *p, u_long cmd) p->ifr_data = (void *)NETBSD32PTR64(s32p->ifr_data); } +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 @@ netbsd32_from_ifreq(struct ifreq *p, struct netbsd32_ifreq *s32p, u_long cmd) * 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 @@ printf("netbsd32_ioctl(%d, %x, %x): %s group %c base %d len %d\n", 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); diff --git a/sys/compat/netbsd32/netbsd32_ioctl.h b/sys/compat/netbsd32/netbsd32_ioctl.h index e0eac05a75d5..4039bfa64fc0 100644 --- a/sys/compat/netbsd32/netbsd32_ioctl.h +++ b/sys/compat/netbsd32/netbsd32_ioctl.h @@ -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 @@ typedef netbsd32_pointer_t netbsd32_ifreq_tp_t; /* * 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 @@ struct netbsd32_ifreq { 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 @@ struct netbsd32_ifreq { #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 */ #define SIOCGADDRROM32 _IOW('i', 240, struct netbsd32_ifreq) /* get 128 bytes of ROM */ #define SIOCGCHIPID32 _IOWR('i', 241, struct netbsd32_ifreq) /* get chipid */ /* from */ #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 */