diff options
-rw-r--r-- | include/net/iw_handler.h | 11 | ||||
-rw-r--r-- | include/net/wext.h | 24 | ||||
-rw-r--r-- | net/core/dev.c | 34 | ||||
-rw-r--r-- | net/wireless/wext.c | 28 |
4 files changed, 53 insertions, 44 deletions
diff --git a/include/net/iw_handler.h b/include/net/iw_handler.h index 909ca87d13b7..f23d07ca7c59 100644 --- a/include/net/iw_handler.h +++ b/include/net/iw_handler.h | |||
@@ -431,16 +431,7 @@ struct iw_public_data { | |||
431 | * Those may be called only within the kernel. | 431 | * Those may be called only within the kernel. |
432 | */ | 432 | */ |
433 | 433 | ||
434 | /* First : function strictly used inside the kernel */ | 434 | /* functions that may be called by driver modules */ |
435 | |||
436 | /* Handle /proc/net/wireless, called in net/code/dev.c */ | ||
437 | extern int dev_get_wireless_info(char * buffer, char **start, off_t offset, | ||
438 | int length); | ||
439 | |||
440 | /* Handle IOCTLs, called in net/core/dev.c */ | ||
441 | extern int wireless_process_ioctl(struct ifreq *ifr, unsigned int cmd); | ||
442 | |||
443 | /* Second : functions that may be called by driver modules */ | ||
444 | 435 | ||
445 | /* Send a single event to user space */ | 436 | /* Send a single event to user space */ |
446 | extern void wireless_send_event(struct net_device * dev, | 437 | extern void wireless_send_event(struct net_device * dev, |
diff --git a/include/net/wext.h b/include/net/wext.h new file mode 100644 index 000000000000..55741836a675 --- /dev/null +++ b/include/net/wext.h | |||
@@ -0,0 +1,24 @@ | |||
1 | #ifndef __NET_WEXT_H | ||
2 | #define __NET_WEXT_H | ||
3 | |||
4 | /* | ||
5 | * wireless extensions interface to the core code | ||
6 | */ | ||
7 | |||
8 | #ifdef CONFIG_WIRELESS_EXT | ||
9 | extern int wext_proc_init(void); | ||
10 | extern int wext_handle_ioctl(struct ifreq *ifr, unsigned int cmd, | ||
11 | void __user *arg); | ||
12 | #else | ||
13 | static inline int wext_proc_init() | ||
14 | { | ||
15 | return 0; | ||
16 | } | ||
17 | static inline int wext_handle_ioctl(struct ifreq *ifr, unsigned int cmd, | ||
18 | void __user *arg) | ||
19 | { | ||
20 | return -EINVAL; | ||
21 | } | ||
22 | #endif | ||
23 | |||
24 | #endif /* __NET_WEXT_H */ | ||
diff --git a/net/core/dev.c b/net/core/dev.c index 700e4b5081b6..d5e42d13bd67 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
@@ -109,7 +109,7 @@ | |||
109 | #include <linux/netpoll.h> | 109 | #include <linux/netpoll.h> |
110 | #include <linux/rcupdate.h> | 110 | #include <linux/rcupdate.h> |
111 | #include <linux/delay.h> | 111 | #include <linux/delay.h> |
112 | #include <linux/wireless.h> | 112 | #include <net/wext.h> |
113 | #include <net/iw_handler.h> | 113 | #include <net/iw_handler.h> |
114 | #include <asm/current.h> | 114 | #include <asm/current.h> |
115 | #include <linux/audit.h> | 115 | #include <linux/audit.h> |
@@ -2348,12 +2348,6 @@ static const struct file_operations ptype_seq_fops = { | |||
2348 | }; | 2348 | }; |
2349 | 2349 | ||
2350 | 2350 | ||
2351 | #ifdef CONFIG_WIRELESS_EXT | ||
2352 | extern int wireless_proc_init(void); | ||
2353 | #else | ||
2354 | #define wireless_proc_init() 0 | ||
2355 | #endif | ||
2356 | |||
2357 | static int __init dev_proc_init(void) | 2351 | static int __init dev_proc_init(void) |
2358 | { | 2352 | { |
2359 | int rc = -ENOMEM; | 2353 | int rc = -ENOMEM; |
@@ -2365,7 +2359,7 @@ static int __init dev_proc_init(void) | |||
2365 | if (!proc_net_fops_create("ptype", S_IRUGO, &ptype_seq_fops)) | 2359 | if (!proc_net_fops_create("ptype", S_IRUGO, &ptype_seq_fops)) |
2366 | goto out_dev2; | 2360 | goto out_dev2; |
2367 | 2361 | ||
2368 | if (wireless_proc_init()) | 2362 | if (wext_proc_init()) |
2369 | goto out_softnet; | 2363 | goto out_softnet; |
2370 | rc = 0; | 2364 | rc = 0; |
2371 | out: | 2365 | out: |
@@ -2923,29 +2917,9 @@ int dev_ioctl(unsigned int cmd, void __user *arg) | |||
2923 | ret = -EFAULT; | 2917 | ret = -EFAULT; |
2924 | return ret; | 2918 | return ret; |
2925 | } | 2919 | } |
2926 | #ifdef CONFIG_WIRELESS_EXT | ||
2927 | /* Take care of Wireless Extensions */ | 2920 | /* Take care of Wireless Extensions */ |
2928 | if (cmd >= SIOCIWFIRST && cmd <= SIOCIWLAST) { | 2921 | if (cmd >= SIOCIWFIRST && cmd <= SIOCIWLAST) |
2929 | /* If command is `set a parameter', or | 2922 | return wext_handle_ioctl(&ifr, cmd, arg); |
2930 | * `get the encoding parameters', check if | ||
2931 | * the user has the right to do it */ | ||
2932 | if (IW_IS_SET(cmd) || cmd == SIOCGIWENCODE | ||
2933 | || cmd == SIOCGIWENCODEEXT) { | ||
2934 | if (!capable(CAP_NET_ADMIN)) | ||
2935 | return -EPERM; | ||
2936 | } | ||
2937 | dev_load(ifr.ifr_name); | ||
2938 | rtnl_lock(); | ||
2939 | /* Follow me in net/wireless/wext.c */ | ||
2940 | ret = wireless_process_ioctl(&ifr, cmd); | ||
2941 | rtnl_unlock(); | ||
2942 | if (IW_IS_GET(cmd) && | ||
2943 | copy_to_user(arg, &ifr, | ||
2944 | sizeof(struct ifreq))) | ||
2945 | ret = -EFAULT; | ||
2946 | return ret; | ||
2947 | } | ||
2948 | #endif /* CONFIG_WIRELESS_EXT */ | ||
2949 | return -EINVAL; | 2923 | return -EINVAL; |
2950 | } | 2924 | } |
2951 | } | 2925 | } |
diff --git a/net/wireless/wext.c b/net/wireless/wext.c index fba295e05e7a..a6cf1034e07c 100644 --- a/net/wireless/wext.c +++ b/net/wireless/wext.c | |||
@@ -97,6 +97,7 @@ | |||
97 | #include <linux/wireless.h> /* Pretty obvious */ | 97 | #include <linux/wireless.h> /* Pretty obvious */ |
98 | #include <net/iw_handler.h> /* New driver API */ | 98 | #include <net/iw_handler.h> /* New driver API */ |
99 | #include <net/netlink.h> | 99 | #include <net/netlink.h> |
100 | #include <net/wext.h> | ||
100 | 101 | ||
101 | #include <asm/uaccess.h> /* copy_to_user() */ | 102 | #include <asm/uaccess.h> /* copy_to_user() */ |
102 | 103 | ||
@@ -696,7 +697,7 @@ static const struct file_operations wireless_seq_fops = { | |||
696 | .release = seq_release, | 697 | .release = seq_release, |
697 | }; | 698 | }; |
698 | 699 | ||
699 | int __init wireless_proc_init(void) | 700 | int __init wext_proc_init(void) |
700 | { | 701 | { |
701 | /* Create /proc/net/wireless entry */ | 702 | /* Create /proc/net/wireless entry */ |
702 | if (!proc_net_fops_create("wireless", S_IRUGO, &wireless_seq_fops)) | 703 | if (!proc_net_fops_create("wireless", S_IRUGO, &wireless_seq_fops)) |
@@ -1075,11 +1076,10 @@ static inline int ioctl_private_call(struct net_device * dev, | |||
1075 | 1076 | ||
1076 | /* ---------------------------------------------------------------- */ | 1077 | /* ---------------------------------------------------------------- */ |
1077 | /* | 1078 | /* |
1078 | * Main IOCTl dispatcher. Called from the main networking code | 1079 | * Main IOCTl dispatcher. |
1079 | * (dev_ioctl() in net/core/dev.c). | ||
1080 | * Check the type of IOCTL and call the appropriate wrapper... | 1080 | * Check the type of IOCTL and call the appropriate wrapper... |
1081 | */ | 1081 | */ |
1082 | int wireless_process_ioctl(struct ifreq *ifr, unsigned int cmd) | 1082 | static int wireless_process_ioctl(struct ifreq *ifr, unsigned int cmd) |
1083 | { | 1083 | { |
1084 | struct net_device *dev; | 1084 | struct net_device *dev; |
1085 | iw_handler handler; | 1085 | iw_handler handler; |
@@ -1143,6 +1143,26 @@ int wireless_process_ioctl(struct ifreq *ifr, unsigned int cmd) | |||
1143 | return -EINVAL; | 1143 | return -EINVAL; |
1144 | } | 1144 | } |
1145 | 1145 | ||
1146 | /* entry point from dev ioctl */ | ||
1147 | int wext_handle_ioctl(struct ifreq *ifr, unsigned int cmd, | ||
1148 | void __user *arg) | ||
1149 | { | ||
1150 | int ret; | ||
1151 | |||
1152 | /* If command is `set a parameter', or | ||
1153 | * `get the encoding parameters', check if | ||
1154 | * the user has the right to do it */ | ||
1155 | if (IW_IS_SET(cmd) || cmd == SIOCGIWENCODE || cmd == SIOCGIWENCODEEXT) | ||
1156 | if (!capable(CAP_NET_ADMIN)) | ||
1157 | return -EPERM; | ||
1158 | dev_load(ifr->ifr_name); | ||
1159 | rtnl_lock(); | ||
1160 | ret = wireless_process_ioctl(ifr, cmd); | ||
1161 | rtnl_unlock(); | ||
1162 | if (IW_IS_GET(cmd) && copy_to_user(arg, ifr, sizeof(struct ifreq))) | ||
1163 | return -EFAULT; | ||
1164 | return ret; | ||
1165 | } | ||
1146 | 1166 | ||
1147 | /************************* EVENT PROCESSING *************************/ | 1167 | /************************* EVENT PROCESSING *************************/ |
1148 | /* | 1168 | /* |