summaryrefslogtreecommitdiffstats
path: root/sys/net
diff options
context:
space:
mode:
authorpluknet <pluknet@FreeBSD.org>2010-10-21 16:20:48 +0000
committerpluknet <pluknet@FreeBSD.org>2010-10-21 16:20:48 +0000
commit8950ed8036d593032cf4434f9e6a3289fc3cdb58 (patch)
tree39e386a89e482405c00d46fa62d749f12c2ee8d5 /sys/net
parent5da57c7fdfb4cd743ae8e8a25154bb1cd31d37cd (diff)
downloadFreeBSD-src-8950ed8036d593032cf4434f9e6a3289fc3cdb58.zip
FreeBSD-src-8950ed8036d593032cf4434f9e6a3289fc3cdb58.tar.gz
Reshuffle SIOCGIFCONF32 handler from r155224.
- move all the chunks into one file, which allows to hide SIOCGIFCONF32 global definition as well. - replace __amd64__ with proper COMPAT_FREEBSD32 around. - handle 32bit capacity before going into the handler itself instead of doing internal 32bit specific changes within it (e.g. as it's done for SIOCGDEFIFACE32_IN6). - use explicitely sized types for ABI compat. Approved by: kib (mentor) MFC after: 2 weeks
Diffstat (limited to 'sys/net')
-rw-r--r--sys/net/if.c46
-rw-r--r--sys/net/if.h10
2 files changed, 29 insertions, 27 deletions
diff --git a/sys/net/if.c b/sys/net/if.c
index bd54acf..3c8486a 100644
--- a/sys/net/if.c
+++ b/sys/net/if.c
@@ -92,6 +92,11 @@
#include <security/mac/mac_framework.h>
+#ifdef COMPAT_FREEBSD32
+#include <sys/mount.h>
+#include <compat/freebsd32/freebsd32.h>
+#endif
+
struct ifindex_entry {
struct ifnet *ife_ifnet;
};
@@ -2402,6 +2407,17 @@ ifhwioctl(u_long cmd, struct ifnet *ifp, caddr_t data, struct thread *td)
return (error);
}
+#ifdef COMPAT_FREEBSD32
+struct ifconf32 {
+ int32_t ifc_len;
+ union {
+ uint32_t ifcu_buf;
+ uint32_t ifcu_req;
+ } ifc_ifcu;
+};
+#define SIOCGIFCONF32 _IOWR('i', 36, struct ifconf32)
+#endif
+
/*
* Interface ioctls.
*/
@@ -2416,10 +2432,21 @@ ifioctl(struct socket *so, u_long cmd, caddr_t data, struct thread *td)
switch (cmd) {
case SIOCGIFCONF:
case OSIOCGIFCONF:
-#ifdef __amd64__
+ return (ifconf(cmd, data));
+
+#ifdef COMPAT_FREEBSD32
case SIOCGIFCONF32:
+ {
+ struct ifconf32 *ifc32;
+ struct ifconf ifc;
+
+ ifc32 = (struct ifconf32 *)data;
+ ifc.ifc_len = ifc32->ifc_len;
+ ifc.ifc_buf = PTRIN(ifc32->ifc_buf);
+
+ return (ifconf(SIOCGIFCONF, (void *)&ifc));
+ }
#endif
- return (ifconf(cmd, data));
}
ifr = (struct ifreq *)data;
@@ -2646,23 +2673,12 @@ static int
ifconf(u_long cmd, caddr_t data)
{
struct ifconf *ifc = (struct ifconf *)data;
-#ifdef __amd64__
- struct ifconf32 *ifc32 = (struct ifconf32 *)data;
- struct ifconf ifc_swab;
-#endif
struct ifnet *ifp;
struct ifaddr *ifa;
struct ifreq ifr;
struct sbuf *sb;
int error, full = 0, valid_len, max_len;
-#ifdef __amd64__
- if (cmd == SIOCGIFCONF32) {
- ifc_swab.ifc_len = ifc32->ifc_len;
- ifc_swab.ifc_buf = (caddr_t)(uintptr_t)ifc32->ifc_buf;
- ifc = &ifc_swab;
- }
-#endif
/* Limit initial buffer size to MAXPHYS to avoid DoS from userspace. */
max_len = MAXPHYS - 1;
@@ -2752,10 +2768,6 @@ again:
}
ifc->ifc_len = valid_len;
-#ifdef __amd64__
- if (cmd == SIOCGIFCONF32)
- ifc32->ifc_len = valid_len;
-#endif
sbuf_finish(sb);
error = copyout(sbuf_data(sb), ifc->ifc_req, ifc->ifc_len);
sbuf_delete(sb);
diff --git a/sys/net/if.h b/sys/net/if.h
index ae0daf5..a99b4a7 100644
--- a/sys/net/if.h
+++ b/sys/net/if.h
@@ -391,16 +391,6 @@ struct ifconf {
#define ifc_req ifc_ifcu.ifcu_req /* array of structures returned */
};
-#if defined (__amd64__)
-struct ifconf32 {
- int ifc_len; /* size of associated buffer */
- union {
- u_int ifcu_buf;
- u_int ifcu_req;
- } ifc_ifcu;
-};
-#endif
-
/*
* interface groups
*/
OpenPOWER on IntegriCloud