From: Gertjan van Wingerde <gwingerde@home.nl>
To: "Feldman, Scott" <scott.feldman@intel.com>
Cc: netdev@oss.sgi.com
Subject: Re: [RFC] Wireless extensions rethink
Date: Mon, 07 Jun 2004 21:51:29 +0200 [thread overview]
Message-ID: <40C4C741.5040708@home.nl> (raw)
[-- Attachment #1: Type: text/plain, Size: 2212 bytes --]
Hi Scott,
I was thinking along the same lines, however I was taking the ethtool
interface as the starting point (using a single ioctl for all wireless
operations). The private handlers would just have to be converted to
plain ioctls handled by the driver itself.
The attached patch can be used as a starting point for this.
It is not complete (not by far), but it shows the basic structure.
I've called the structure wlantool_ops, again using the example set by
ethtool.
Comments?
--- Gertjan.
On Mon, 7 Jun 2004 11:33:10 -0700 "Feldman, Scott" <scott.feldman@intel.com> wrote:
> Jeff suggested in an earlier post that there is an opportunity to
> totally rethink the wireless extensions now that we have wireless-2.6.
>
> Let's get rid of the iotcl and /proc interfaces as Jeff suggests:
>
> 1) iw_handler API goes away and is replaced by struct
> net_device::wireless_ops (ala ethtool_ops).
> 2) sysfs get/set mapping for wireless_ops.
> 3) iw_statistics just becomes one of the wireless_ops.
> 4) Remove /proc/net/wireless support from wireless.c. (Already
> have sysfs support for the same :)
> 5) No private handler support. If you need private support,
> pass it in some other way (custom sysfs of modparam). Or,
> better yet, make a case that others could benefit and move
> into wireless_ops as standard.
> 6) Convert drivers from iw_handler and iw_statistics to
> wireless_ops.
> 7) Rewrite iw* tools to use sysfs interface rather than ioctl.
> (scriptable tools?)
> 8) [Optional] Remove iotcl interface. May want to keep for
> backward compat with legacy tools? Easy to map between
> ioctl and wireless_ops in wireless.c.
> 9) [Open] What to do about wireless events? Any ideas?
>
> Proposed sysfs layout:
>
> class/
> `-- net
> |-- eth[x]
> |-- wireless
> |-- statistics
> | |-- beacon
> | |-- crypt
> | `-- ...
> `-- control
> |-- commit
> |-- name
> |-- network_id
> |-- freq
> `-- ...
>
>Is someone already working on this???
>
>Comments?
>
>-scott
[-- Attachment #2: wlantool.diff --]
[-- Type: text/plain, Size: 10145 bytes --]
diff -Nru a/include/linux/netdevice.h b/include/linux/netdevice.h
--- a/include/linux/netdevice.h 2004-06-07 21:29:13 +02:00
+++ b/include/linux/netdevice.h 2004-06-07 21:29:13 +02:00
@@ -41,6 +41,7 @@
struct divert_blk;
struct vlan_group;
struct ethtool_ops;
+struct wlantool_ops;
/* source back-compat hooks */
#define SET_ETHTOOL_OPS(netdev,ops) \
@@ -308,6 +309,8 @@
struct ethtool_ops *ethtool_ops;
+ struct wlantool_ops *wlantool_ops;
+
/*
* This marks the end of the "visible" part of the structure. All
* fields hereafter are internal to the system, and may change at
@@ -678,6 +681,7 @@
extern int netif_receive_skb(struct sk_buff *skb);
extern int dev_ioctl(unsigned int cmd, void __user *);
extern int dev_ethtool(struct ifreq *);
+extern int dev_wlantool(struct ifreq *);
extern unsigned dev_get_flags(const struct net_device *);
extern int dev_change_flags(struct net_device *, unsigned);
extern int dev_set_mtu(struct net_device *, int);
diff -Nru a/include/linux/sockios.h b/include/linux/sockios.h
--- a/include/linux/sockios.h 2004-06-07 21:29:13 +02:00
+++ b/include/linux/sockios.h 2004-06-07 21:29:13 +02:00
@@ -83,6 +83,8 @@
#define SIOCWANDEV 0x894A /* get/set netdev parameters */
+#define SIOCWLANTOOL 0x894B /* WLANtool interface */
+
/* ARP cache control calls. */
/* 0x8950 - 0x8952 * obsolete calls, don't re-use */
#define SIOCDARP 0x8953 /* delete ARP table entry */
diff -Nru a/include/linux/wlantool.h b/include/linux/wlantool.h
--- /dev/null Wed Dec 31 16:00:00 196900
+++ b/include/linux/wlantool.h 2004-06-07 21:29:13 +02:00
@@ -0,0 +1,72 @@
+/*
+ * wlantool.h: Defines for Linux WLANtool.
+ *
+ * Copyright (C) 2004 Gertjan van Wingerde (gwingerde@home.nl)
+ */
+
+#ifndef _LINUX_WLANTOOL_H
+#define _LINUX_WLANTOOL_H
+
+#include <linux/if.h> /* For IFNAMSIZ, etc. */
+
+/* This should work for both 32 and 64 bit userland. */
+struct wlantool_name {
+ u32 cmd;
+ char name[IFNAMSIZ];
+};
+
+struct wlantool_param {
+ u32 cmd;
+ s32 value;
+ u8 fixed;
+ u8 disabled;
+ u16 flags;
+};
+
+struct wlantool_freq {
+ u32 cmd;
+ s32 mantissa;
+ s16 exponent;
+ u8 index;
+ u8 reserved;
+};
+
+struct wlantool_mode {
+ u32 cmd;
+ u32 mode;
+};
+
+struct net_device;
+
+/**
+ * &wlantool_ops - Alter and report network device settings
+ *
+ * Description:
+ *
+ */
+struct wlantool_ops {
+ int (*commit)(struct net_device *);
+ void (*get_name)(struct net_device *, struct wlantool_name *);
+ int (*get_nwid)(struct net_device *, struct wlantool_param *);
+ int (*set_nwid)(struct net_device *, struct wlantool_param *);
+ int (*get_freq)(struct net_device *, struct wlantool_freq *);
+ int (*set_freq)(struct net_device *, struct wlantool_freq *);
+ int (*get_mode)(struct net_device *, struct wlantool_mode *);
+ int (*set_mode)(struct net_device *, struct wlantool_mode *);
+ int (*get_sens)(struct net_device *, struct wlantool_param *);
+ int (*set_sens)(struct net_device *, struct wlantool_param *);
+};
+
+/* CMDs currently supported */
+#define WLANTOOL_COMMIT 0x00000001 /* Commit pending changes. */
+#define WLANTOOL_GNAME 0x00000002 /* Get name (=wireless protocol). */
+#define WLANTOOL_GNWID 0x00000003 /* Get network ID (the cell). */
+#define WLANTOOL_SNWID 0x00000004 /* Set network ID (pre-802.11). */
+#define WLANTOOL_GFREQ 0x00000005 /* Get channel/frequency (Hz). */
+#define WLANTOOL_SFREQ 0x00000006 /* Set channel/frequency (Hz). */
+#define WLANTOOL_GMODE 0x00000007 /* Get operation mode. */
+#define WLANTOOL_SMODE 0x00000008 /* Set operation mode. */
+#define WLANTOOL_GSENS 0x00000009 /* Get sensitivity (dBm). */
+#define WLANTOOL_SSENS 0x0000000a /* Set sensitivity (dBm). */
+
+#endif /* _LINUX_WLANTOOL_H */
diff -Nru a/net/core/Makefile b/net/core/Makefile
--- a/net/core/Makefile 2004-06-07 21:29:13 +02:00
+++ b/net/core/Makefile 2004-06-07 21:29:13 +02:00
@@ -7,7 +7,8 @@
obj-$(CONFIG_SYSCTL) += sysctl_net_core.o
obj-y += flow.o dev.o ethtool.o dev_mcast.o dst.o \
- neighbour.o rtnetlink.o utils.o link_watch.o filter.o
+ neighbour.o rtnetlink.o utils.o link_watch.o filter.o \
+ wlantool.o
obj-$(CONFIG_SYSFS) += net-sysfs.o
obj-$(CONFIG_NETFILTER) += netfilter.o
diff -Nru a/net/core/dev.c b/net/core/dev.c
--- a/net/core/dev.c 2004-06-07 21:29:13 +02:00
+++ b/net/core/dev.c 2004-06-07 21:29:13 +02:00
@@ -2700,6 +2700,20 @@
case SIOCSIFLINK:
return -EINVAL;
+ case SIOCWLANTOOL:
+ dev_load(ifr.ifr_name);
+ rtnl_lock();
+ ret = dev_wlantool(&ifr);
+ rtnl_unlock();
+ if (!ret) {
+ if (colon)
+ *colon = ':';
+ if (copy_to_user(arg, &ifr,
+ sizeof(struct ifreq)))
+ ret = -EFAULT;
+ }
+ return ret;
+
/*
* Unknown or private ioctl.
*/
diff -Nru a/net/core/wlantool.c b/net/core/wlantool.c
--- /dev/null Wed Dec 31 16:00:00 196900
+++ b/net/core/wlantool.c 2004-06-07 21:29:13 +02:00
@@ -0,0 +1,221 @@
+/*
+ * net/core/wlantool.c - WLANtool ioctl handler
+ * Copyright (c) 2004 Gertjan van Wingerde <gwingerde@home.nL>
+ *
+ * This file is where we call all the wlantool_ops commands to get
+ * the information wlantool needs. We fall back to calling do_ioctl()
+ * for drivers which haven't been converted to wlantool_ops yet.
+ *
+ * It's GPL, stupid.
+ */
+
+#include <linux/module.h>
+#include <linux/types.h>
+#include <linux/errno.h>
+#include <linux/wlantool.h>
+#include <linux/netdevice.h>
+#include <asm/uaccess.h>
+
+/* Handlers for each wlantool command */
+
+static int wlantool_commit(struct net_device *dev)
+{
+ int err;
+
+ if (!dev->wlantool_ops->commit)
+ return -EOPNOTSUPP;
+
+ err = dev->wlantool_ops->commit(dev);
+ if (err < 0)
+ return err;
+
+ return 0;
+}
+
+static int wlantool_get_name(struct net_device *dev, void __user *useraddr)
+{
+ struct wlantool_name name;
+
+ if (!dev->wlantool_ops->get_name)
+ return -EOPNOTSUPP;
+
+ dev->wlantool_ops->get_name(dev, &name);
+
+ if (copy_to_user(useraddr, &name, sizeof(name)))
+ return -EFAULT;
+
+ return 0;
+}
+
+static int wlantool_get_nwid(struct net_device *dev, void __user *useraddr)
+{
+ struct wlantool_param param;
+ int err;
+
+ if (!dev->wlantool_ops->get_nwid)
+ return -EOPNOTSUPP;
+
+ err = dev->wlantool_ops->get_nwid(dev, ¶m);
+
+ if (copy_to_user(useraddr, ¶m, sizeof(param)))
+ return -EFAULT;
+
+ return 0;
+}
+
+static int wlantool_set_nwid(struct net_device *dev, char __user *useraddr)
+{
+ struct wlantool_param param;
+
+ if (!dev->wlantool_ops->set_nwid)
+ return -EOPNOTSUPP;
+
+ if (copy_from_user(¶m, useraddr, sizeof(param)))
+ return -EFAULT;
+
+ return dev->wlantool_ops->set_nwid(dev, ¶m);
+}
+
+static int wlantool_get_freq(struct net_device *dev, void __user *useraddr)
+{
+ struct wlantool_freq freq;
+ int err;
+
+ if (!dev->wlantool_ops->get_freq)
+ return -EOPNOTSUPP;
+
+ err = dev->wlantool_ops->get_freq(dev, &freq);
+
+ if (copy_to_user(useraddr, &freq, sizeof(freq)))
+ return -EFAULT;
+
+ return 0;
+}
+
+static int wlantool_set_freq(struct net_device *dev, char __user *useraddr)
+{
+ struct wlantool_freq freq;
+
+ if (!dev->wlantool_ops->set_freq)
+ return -EOPNOTSUPP;
+
+ if (copy_from_user(&freq, useraddr, sizeof(freq)))
+ return -EFAULT;
+
+ return dev->wlantool_ops->set_freq(dev, &freq);
+}
+
+static int wlantool_get_mode(struct net_device *dev, void __user *useraddr)
+{
+ struct wlantool_mode mode;
+ int err;
+
+ if (!dev->wlantool_ops->get_mode)
+ return -EOPNOTSUPP;
+
+ err = dev->wlantool_ops->get_mode(dev, &mode);
+
+ if (copy_to_user(useraddr, &mode, sizeof(mode)))
+ return -EFAULT;
+
+ return 0;
+}
+
+static int wlantool_set_mode(struct net_device *dev, char __user *useraddr)
+{
+ struct wlantool_mode mode;
+
+ if (!dev->wlantool_ops->set_mode)
+ return -EOPNOTSUPP;
+
+ if (copy_from_user(&mode, useraddr, sizeof(mode)))
+ return -EFAULT;
+
+ return dev->wlantool_ops->set_mode(dev, &mode);
+}
+
+static int wlantool_get_sens(struct net_device *dev, void __user *useraddr)
+{
+ struct wlantool_param param;
+ int err;
+
+ if (!dev->wlantool_ops->get_sens)
+ return -EOPNOTSUPP;
+
+ err = dev->wlantool_ops->get_sens(dev, ¶m);
+
+ if (copy_to_user(useraddr, ¶m, sizeof(param)))
+ return -EFAULT;
+
+ return 0;
+}
+
+static int wlantool_set_sens(struct net_device *dev, char __user *useraddr)
+{
+ struct wlantool_param param;
+
+ if (!dev->wlantool_ops->set_sens)
+ return -EOPNOTSUPP;
+
+ if (copy_from_user(¶m, useraddr, sizeof(param)))
+ return -EFAULT;
+
+ return dev->wlantool_ops->set_sens(dev, ¶m);
+}
+
+/* The main entry point in this file. Called from net/core/dev.c */
+
+int dev_wlantool(struct ifreq *ifr)
+{
+ struct net_device *dev = __dev_get_by_name(ifr->ifr_name);
+ void __user *useraddr = (void __user *) ifr->ifr_data;
+ u32 wlancmd;
+
+ /*
+ * XXX: This can be pushed down into the wlantool_* handlers that
+ * need it. Keep existing behaviour for the moment.
+ */
+ if (!capable(CAP_NET_ADMIN))
+ return -EPERM;
+
+ if (!dev || !netif_device_present(dev))
+ return -ENODEV;
+
+ if (!dev->wlantool_ops)
+ goto ioctl;
+
+ if (copy_from_user(&wlancmd, useraddr, sizeof (wlancmd)))
+ return -EFAULT;
+
+ switch (wlancmd) {
+ case WLANTOOL_COMMIT:
+ return wlantool_commit(dev);
+ case WLANTOOL_GNAME:
+ return wlantool_get_name(dev, useraddr);
+ case WLANTOOL_GNWID:
+ return wlantool_get_nwid(dev, useraddr);
+ case WLANTOOL_SNWID:
+ return wlantool_set_nwid(dev, useraddr);
+ case WLANTOOL_GFREQ:
+ return wlantool_get_freq(dev, useraddr);
+ case WLANTOOL_SFREQ:
+ return wlantool_set_freq(dev, useraddr);
+ case WLANTOOL_GMODE:
+ return wlantool_get_mode(dev, useraddr);
+ case WLANTOOL_SMODE:
+ return wlantool_set_mode(dev, useraddr);
+ case WLANTOOL_GSENS:
+ return wlantool_get_sens(dev, useraddr);
+ case WLANTOOL_SSENS:
+ return wlantool_set_sens(dev, useraddr);
+ default:
+ return -EOPNOTSUPP;
+ }
+
+ ioctl:
+ if (dev->do_ioctl)
+ return dev->do_ioctl(dev, ifr, SIOCWLANTOOL);
+ return -EOPNOTSUPP;
+}
+
+EXPORT_SYMBOL(dev_wlantool);
next reply other threads:[~2004-06-07 19:51 UTC|newest]
Thread overview: 47+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-06-07 19:51 Gertjan van Wingerde [this message]
2004-06-07 20:52 ` [RFC] Wireless extensions rethink Ben Greear
-- strict thread matches above, loose matches on Subject: below --
2004-06-11 18:49 Feldman, Scott
2004-06-15 16:39 ` Gertjan van Wingerde
2004-06-15 17:22 ` Vladimir Kondratiev
2004-06-16 9:13 ` Scott Feldman
2004-06-16 15:28 ` Gerald Britton
2004-06-16 17:40 ` Vladimir Kondratiev
2004-06-16 17:53 ` Scott Feldman
2004-06-16 19:06 ` Gerald Britton
2004-06-17 5:57 ` Luis R. Rodriguez
2004-06-16 17:46 ` Gertjan van Wingerde
2004-06-16 19:06 ` Scott Feldman
2004-06-16 19:49 ` Jeff Garzik
2004-06-16 22:25 ` Scott Feldman
2004-06-16 20:50 ` Jean Tourrilhes
2004-06-16 20:42 ` Jean Tourrilhes
2004-06-16 21:36 ` Jeff Garzik
2004-06-16 22:33 ` Jean Tourrilhes
2004-06-16 23:06 ` Jeff Garzik
2004-06-16 23:11 ` Jean Tourrilhes
2004-06-17 17:47 ` Jean Tourrilhes
2004-06-17 18:23 ` Jeff Garzik
2004-06-17 18:26 ` Jeff Garzik
2004-06-17 18:30 ` Gertjan van Wingerde
2004-06-17 18:51 ` Stephen Hemminger
2004-06-17 19:00 ` Jean Tourrilhes
2004-06-17 19:10 ` Jeff Garzik
2004-06-17 18:58 ` Jean Tourrilhes
2004-06-17 19:02 ` Jeff Garzik
2004-06-17 19:13 ` Jean Tourrilhes
2004-06-17 19:34 ` Jeff Garzik
2004-06-17 19:44 ` Jean Tourrilhes
2004-06-17 20:06 ` Jeff Garzik
2004-06-17 20:39 ` Jean Tourrilhes
2004-06-17 18:56 ` Jean Tourrilhes
2004-06-17 19:09 ` Jeff Garzik
2004-06-17 19:11 ` Jeff Garzik
2004-06-17 19:31 ` Jean Tourrilhes
2004-06-17 19:52 ` Jeff Garzik
2004-06-17 20:46 ` Jean Tourrilhes
2004-06-18 22:11 ` Andrew Morton
2004-06-18 22:54 ` Jeff Garzik
2004-06-16 22:48 ` Scott Feldman
2004-06-07 18:33 Feldman, Scott
2004-06-07 18:39 ` Stephen Hemminger
2004-06-08 11:19 ` Herbert Xu
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=40C4C741.5040708@home.nl \
--to=gwingerde@home.nl \
--cc=netdev@oss.sgi.com \
--cc=scott.feldman@intel.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).