From: Andi Kleen <ak@colin2.muc.de>
To: netdev@oss.sgi.com, jt@hpl.hp.com
Subject: [PATCH] Add 32bit emulation for wireless
Date: 19 Jan 2004 13:33:43 +0100
Date: Mon, 19 Jan 2004 13:33:43 +0100 [thread overview]
Message-ID: <20040119123343.GA16292@colin2.muc.de> (raw)
[First version of this mail seems to have gotten lost. Apologies if you
see it twice]
Some distributions call iwconfig at every bootup and I was sick of
seeing all the unimplemented ioctl messages on AMD64 with a 32bit userland.
This patch implements ioctl emulation for the wireless subsytem.
The only structure that was incompatible from visual inspection was
"iw_point". The rest is just passed through.
It reuses the existing ioctl description table, but renames it to
export it (standard_ioctls wasn't a good name for a global variable)
I don't actually have have a working wireless card (only some non supported
Samsung one), so I wasn't able to test it, but at least the messages
are gone.
-Andi
diff -u linux-2.6.1-amd64/net/core/wireless.c-WIRELESS linux-2.6.1-amd64/net/core/wireless.c
--- linux-2.6.1-amd64/net/core/wireless.c-WIRELESS 2003-10-09 00:29:02.000000000 +0200
+++ linux-2.6.1-amd64/net/core/wireless.c 2004-01-17 18:46:58.000000000 +0100
@@ -27,7 +27,7 @@
* o Initial dumb commit strategy based on orinoco.c
*
* v3 - 19.12.01 - Jean II
- * o Make sure we don't go out of standard_ioctl[] in ioctl_standard_call
+ * o Make sure we don't go out of wireless_ioctl[] in ioctl_standard_call
* o Add event dispatcher function
* o Add event description
* o Propagate events as rtnetlink IFLA_WIRELESS option
@@ -91,7 +91,7 @@
* Meta-data about all the standard Wireless Extension request we
* know about.
*/
-static const struct iw_ioctl_description standard_ioctl[] = {
+const struct iw_ioctl_description wireless_ioctl[] = {
[SIOCSIWCOMMIT - SIOCIWFIRST] = {
.header_type = IW_HEADER_TYPE_NULL,
},
@@ -266,7 +266,7 @@
.header_type = IW_HEADER_TYPE_PARAM,
},
};
-static const int standard_ioctl_num = (sizeof(standard_ioctl) /
+const int wireless_ioctl_num = (sizeof(wireless_ioctl) /
sizeof(struct iw_ioctl_description));
/*
@@ -593,9 +593,9 @@
int user_size = 0;
/* Get the description of the IOCTL */
- if((cmd - SIOCIWFIRST) >= standard_ioctl_num)
+ if((cmd - SIOCIWFIRST) >= wireless_ioctl_num)
return -EOPNOTSUPP;
- descr = &(standard_ioctl[cmd - SIOCIWFIRST]);
+ descr = &(wireless_ioctl[cmd - SIOCIWFIRST]);
#ifdef WE_IOCTL_DEBUG
printk(KERN_DEBUG "%s (WE) : Found standard handler for 0x%04X\n",
@@ -1041,8 +1041,8 @@
/* Get the description of the IOCTL */
if(cmd <= SIOCIWLAST) {
cmd_index = cmd - SIOCIWFIRST;
- if(cmd_index < standard_ioctl_num)
- descr = &(standard_ioctl[cmd_index]);
+ if(cmd_index < wireless_ioctl_num)
+ descr = &(wireless_ioctl[cmd_index]);
} else {
cmd_index = cmd - IWEVFIRST;
if(cmd_index < standard_event_num)
diff -u linux-2.6.1-amd64/fs/compat_ioctl.c-WIRELESS linux-2.6.1-amd64/fs/compat_ioctl.c
--- linux-2.6.1-amd64/fs/compat_ioctl.c-WIRELESS 2004-01-01 06:25:25.000000000 +0100
+++ linux-2.6.1-amd64/fs/compat_ioctl.c 2004-01-17 19:02:44.000000000 +0100
@@ -65,6 +65,8 @@
#include <linux/ncp_fs.h>
#include <linux/i2c.h>
#include <linux/i2c-dev.h>
+#include <linux/wireless.h>
+#include <net/iw_handler.h>
#include <net/sock.h> /* siocdevprivate_ioctl */
#include <net/bluetooth/bluetooth.h>
@@ -706,6 +708,69 @@
return err;
}
+#ifdef CONFIG_NET_RADIO
+
+extern const struct iw_ioctl_description wireless_ioctl[];
+extern int wireless_ioctl_num;
+
+/* assumes no padding */
+struct iw_point32 {
+ compat_uptr_t pointer;
+ u16 length;
+ u16 flags;
+};
+
+struct iwreq32 {
+ char ifrn_name[IFNAMSIZ];
+ struct iw_point32 iw_point;
+};
+
+static int wireless_ioctl32(unsigned int fd, unsigned int cmd, unsigned long arg)
+{
+ int num = cmd - SIOCIWFIRSTPRIV;
+ if (num >= wireless_ioctl_num) {
+ printk(KERN_DEBUG "%s: unknown wireless ioctl %x\n", current->comm, cmd);
+ return -EINVAL;
+ }
+
+ /* only iw_point needs conversion right now. If any others do add them
+ to this switch. */
+
+ switch (wireless_ioctl[num].header_type) {
+ case IW_HEADER_TYPE_POINT: {
+ int err;
+ compat_uptr_t ptr;
+ struct iwreq32 *i32 = (struct iwreq32 *)arg;
+ struct iwreq i, *iu = compat_alloc_user_space(sizeof(struct iwreq));
+
+ if (!access_ok(VERIFY_READ, i32, sizeof(struct iwreq32)))
+ return -EFAULT;
+
+ err = __copy_from_user(i.ifr_ifrn.ifrn_name, i32->ifrn_name,IFNAMSIZ);
+ err |= __get_user(ptr, &i32->iw_point.pointer);
+ i.u.essid.pointer = compat_ptr(ptr);
+ err |= __get_user(i.u.essid.length, &i32->iw_point.length);
+ err |= __get_user(i.u.essid.flags, &i32->iw_point.flags);;
+ if (!err)
+ err |= copy_to_user(iu, &i, sizeof(struct iwreq));
+ if (err)
+ return -EFAULT;
+
+ arg = (unsigned long) iu;
+ break;
+ }
+ }
+
+ return sys_ioctl(fd, cmd, arg);
+}
+#else
+/* stub to avoid warning */
+static int wireless_ioctl32(unsigned int fd, unsigned int cmd, unsigned long arg)
+{
+ return -ENOTTY;
+}
+#endif
+
struct rtentry32 {
u32 rt_pad1;
struct sockaddr rt_dst; /* target address */
@@ -3133,6 +3198,39 @@
HANDLE_IOCTL(I2C_FUNCS, w_long)
HANDLE_IOCTL(I2C_RDWR, do_i2c_rdwr_ioctl)
HANDLE_IOCTL(I2C_SMBUS, do_i2c_smbus_ioctl)
+/* wireless */
+HANDLE_IOCTL(SIOCIWFIRSTPRIV+0,wireless_ioctl32)
+HANDLE_IOCTL(SIOCIWFIRSTPRIV+1,wireless_ioctl32)
+HANDLE_IOCTL(SIOCIWFIRSTPRIV+2,wireless_ioctl32)
+HANDLE_IOCTL(SIOCIWFIRSTPRIV+3,wireless_ioctl32)
+HANDLE_IOCTL(SIOCIWFIRSTPRIV+4,wireless_ioctl32)
+HANDLE_IOCTL(SIOCIWFIRSTPRIV+5,wireless_ioctl32)
+HANDLE_IOCTL(SIOCIWFIRSTPRIV+6,wireless_ioctl32)
+HANDLE_IOCTL(SIOCIWFIRSTPRIV+7,wireless_ioctl32)
+HANDLE_IOCTL(SIOCIWFIRSTPRIV+8,wireless_ioctl32)
+HANDLE_IOCTL(SIOCIWFIRSTPRIV+9,wireless_ioctl32)
+HANDLE_IOCTL(SIOCIWFIRSTPRIV+10,wireless_ioctl32)
+HANDLE_IOCTL(SIOCIWFIRSTPRIV+11,wireless_ioctl32)
+HANDLE_IOCTL(SIOCIWFIRSTPRIV+12,wireless_ioctl32)
+HANDLE_IOCTL(SIOCIWFIRSTPRIV+13,wireless_ioctl32)
+HANDLE_IOCTL(SIOCIWFIRSTPRIV+14,wireless_ioctl32)
+HANDLE_IOCTL(SIOCIWFIRSTPRIV+15,wireless_ioctl32)
+HANDLE_IOCTL(SIOCIWFIRSTPRIV+16,wireless_ioctl32)
+HANDLE_IOCTL(SIOCIWFIRSTPRIV+17,wireless_ioctl32)
+HANDLE_IOCTL(SIOCIWFIRSTPRIV+18,wireless_ioctl32)
+HANDLE_IOCTL(SIOCIWFIRSTPRIV+19,wireless_ioctl32)
+HANDLE_IOCTL(SIOCIWFIRSTPRIV+20,wireless_ioctl32)
+HANDLE_IOCTL(SIOCIWFIRSTPRIV+21,wireless_ioctl32)
+HANDLE_IOCTL(SIOCIWFIRSTPRIV+22,wireless_ioctl32)
+HANDLE_IOCTL(SIOCIWFIRSTPRIV+23,wireless_ioctl32)
+HANDLE_IOCTL(SIOCIWFIRSTPRIV+24,wireless_ioctl32)
+HANDLE_IOCTL(SIOCIWFIRSTPRIV+25,wireless_ioctl32)
+HANDLE_IOCTL(SIOCIWFIRSTPRIV+26,wireless_ioctl32)
+HANDLE_IOCTL(SIOCIWFIRSTPRIV+27,wireless_ioctl32)
+HANDLE_IOCTL(SIOCIWFIRSTPRIV+28,wireless_ioctl32)
+HANDLE_IOCTL(SIOCIWFIRSTPRIV+29,wireless_ioctl32)
+HANDLE_IOCTL(SIOCIWFIRSTPRIV+30,wireless_ioctl32)
+HANDLE_IOCTL(SIOCIWFIRSTPRIV+31,wireless_ioctl32)
#undef DECLARES
#endif
next reply other threads:[~2004-01-19 12:33 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-01-19 12:33 Andi Kleen [this message]
2004-01-19 12:39 ` [PATCH] Add 32bit emulation for wireless Christoph Hellwig
2004-01-19 13:10 ` Andi Kleen
2004-01-19 13:56 ` David S. Miller
2004-01-19 14:39 ` Andi Kleen
2004-01-19 14:39 ` David S. Miller
2004-01-19 14:54 ` Andi Kleen
2004-01-19 19:49 ` Jean Tourrilhes
2004-01-19 20:01 ` Andi Kleen
2004-01-19 20:19 ` Jean Tourrilhes
2004-01-19 20:26 ` David S. Miller
2004-01-19 20:40 ` Jean Tourrilhes
2004-01-19 20:50 ` Andi Kleen
2004-01-19 20:35 ` Andi Kleen
2004-01-19 20:51 ` Jean Tourrilhes
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20040119123343.GA16292@colin2.muc.de \
--to=ak@colin2.muc.de \
--cc=jt@hpl.hp.com \
--cc=netdev@oss.sgi.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).