diff options
| author | Michal Marek <mmarek@suse.cz> | 2010-10-27 18:15:57 -0400 |
|---|---|---|
| committer | Michal Marek <mmarek@suse.cz> | 2010-10-27 18:15:57 -0400 |
| commit | b74b953b998bcc2db91b694446f3a2619ec32de6 (patch) | |
| tree | 6ce24caabd730f6ae9287ed0676ec32e6ff31e9d /net/wireless/wext-core.c | |
| parent | abb438526201c6a79949ad45375c051b6681c253 (diff) | |
| parent | f6f94e2ab1b33f0082ac22d71f66385a60d8157f (diff) | |
Merge commit 'v2.6.36' into kbuild/misc
Update to be able to fix a recent change to scripts/basic/docproc.c
(commit eda603f).
Diffstat (limited to 'net/wireless/wext-core.c')
| -rw-r--r-- | net/wireless/wext-core.c | 151 |
1 files changed, 84 insertions, 67 deletions
diff --git a/net/wireless/wext-core.c b/net/wireless/wext-core.c index 5e1656bdf23b..8f5116f5af19 100644 --- a/net/wireless/wext-core.c +++ b/net/wireless/wext-core.c | |||
| @@ -10,6 +10,7 @@ | |||
| 10 | #include <linux/kernel.h> | 10 | #include <linux/kernel.h> |
| 11 | #include <linux/netdevice.h> | 11 | #include <linux/netdevice.h> |
| 12 | #include <linux/rtnetlink.h> | 12 | #include <linux/rtnetlink.h> |
| 13 | #include <linux/slab.h> | ||
| 13 | #include <linux/wireless.h> | 14 | #include <linux/wireless.h> |
| 14 | #include <linux/uaccess.h> | 15 | #include <linux/uaccess.h> |
| 15 | #include <net/cfg80211.h> | 16 | #include <net/cfg80211.h> |
| @@ -28,226 +29,226 @@ typedef int (*wext_ioctl_func)(struct net_device *, struct iwreq *, | |||
| 28 | * know about. | 29 | * know about. |
| 29 | */ | 30 | */ |
| 30 | static const struct iw_ioctl_description standard_ioctl[] = { | 31 | static const struct iw_ioctl_description standard_ioctl[] = { |
| 31 | [SIOCSIWCOMMIT - SIOCIWFIRST] = { | 32 | [IW_IOCTL_IDX(SIOCSIWCOMMIT)] = { |
| 32 | .header_type = IW_HEADER_TYPE_NULL, | 33 | .header_type = IW_HEADER_TYPE_NULL, |
| 33 | }, | 34 | }, |
| 34 | [SIOCGIWNAME - SIOCIWFIRST] = { | 35 | [IW_IOCTL_IDX(SIOCGIWNAME)] = { |
| 35 | .header_type = IW_HEADER_TYPE_CHAR, | 36 | .header_type = IW_HEADER_TYPE_CHAR, |
| 36 | .flags = IW_DESCR_FLAG_DUMP, | 37 | .flags = IW_DESCR_FLAG_DUMP, |
| 37 | }, | 38 | }, |
| 38 | [SIOCSIWNWID - SIOCIWFIRST] = { | 39 | [IW_IOCTL_IDX(SIOCSIWNWID)] = { |
| 39 | .header_type = IW_HEADER_TYPE_PARAM, | 40 | .header_type = IW_HEADER_TYPE_PARAM, |
| 40 | .flags = IW_DESCR_FLAG_EVENT, | 41 | .flags = IW_DESCR_FLAG_EVENT, |
| 41 | }, | 42 | }, |
| 42 | [SIOCGIWNWID - SIOCIWFIRST] = { | 43 | [IW_IOCTL_IDX(SIOCGIWNWID)] = { |
| 43 | .header_type = IW_HEADER_TYPE_PARAM, | 44 | .header_type = IW_HEADER_TYPE_PARAM, |
| 44 | .flags = IW_DESCR_FLAG_DUMP, | 45 | .flags = IW_DESCR_FLAG_DUMP, |
| 45 | }, | 46 | }, |
| 46 | [SIOCSIWFREQ - SIOCIWFIRST] = { | 47 | [IW_IOCTL_IDX(SIOCSIWFREQ)] = { |
| 47 | .header_type = IW_HEADER_TYPE_FREQ, | 48 | .header_type = IW_HEADER_TYPE_FREQ, |
| 48 | .flags = IW_DESCR_FLAG_EVENT, | 49 | .flags = IW_DESCR_FLAG_EVENT, |
| 49 | }, | 50 | }, |
| 50 | [SIOCGIWFREQ - SIOCIWFIRST] = { | 51 | [IW_IOCTL_IDX(SIOCGIWFREQ)] = { |
| 51 | .header_type = IW_HEADER_TYPE_FREQ, | 52 | .header_type = IW_HEADER_TYPE_FREQ, |
| 52 | .flags = IW_DESCR_FLAG_DUMP, | 53 | .flags = IW_DESCR_FLAG_DUMP, |
| 53 | }, | 54 | }, |
| 54 | [SIOCSIWMODE - SIOCIWFIRST] = { | 55 | [IW_IOCTL_IDX(SIOCSIWMODE)] = { |
| 55 | .header_type = IW_HEADER_TYPE_UINT, | 56 | .header_type = IW_HEADER_TYPE_UINT, |
| 56 | .flags = IW_DESCR_FLAG_EVENT, | 57 | .flags = IW_DESCR_FLAG_EVENT, |
| 57 | }, | 58 | }, |
| 58 | [SIOCGIWMODE - SIOCIWFIRST] = { | 59 | [IW_IOCTL_IDX(SIOCGIWMODE)] = { |
| 59 | .header_type = IW_HEADER_TYPE_UINT, | 60 | .header_type = IW_HEADER_TYPE_UINT, |
| 60 | .flags = IW_DESCR_FLAG_DUMP, | 61 | .flags = IW_DESCR_FLAG_DUMP, |
| 61 | }, | 62 | }, |
| 62 | [SIOCSIWSENS - SIOCIWFIRST] = { | 63 | [IW_IOCTL_IDX(SIOCSIWSENS)] = { |
| 63 | .header_type = IW_HEADER_TYPE_PARAM, | 64 | .header_type = IW_HEADER_TYPE_PARAM, |
| 64 | }, | 65 | }, |
| 65 | [SIOCGIWSENS - SIOCIWFIRST] = { | 66 | [IW_IOCTL_IDX(SIOCGIWSENS)] = { |
| 66 | .header_type = IW_HEADER_TYPE_PARAM, | 67 | .header_type = IW_HEADER_TYPE_PARAM, |
| 67 | }, | 68 | }, |
| 68 | [SIOCSIWRANGE - SIOCIWFIRST] = { | 69 | [IW_IOCTL_IDX(SIOCSIWRANGE)] = { |
| 69 | .header_type = IW_HEADER_TYPE_NULL, | 70 | .header_type = IW_HEADER_TYPE_NULL, |
| 70 | }, | 71 | }, |
| 71 | [SIOCGIWRANGE - SIOCIWFIRST] = { | 72 | [IW_IOCTL_IDX(SIOCGIWRANGE)] = { |
| 72 | .header_type = IW_HEADER_TYPE_POINT, | 73 | .header_type = IW_HEADER_TYPE_POINT, |
| 73 | .token_size = 1, | 74 | .token_size = 1, |
| 74 | .max_tokens = sizeof(struct iw_range), | 75 | .max_tokens = sizeof(struct iw_range), |
| 75 | .flags = IW_DESCR_FLAG_DUMP, | 76 | .flags = IW_DESCR_FLAG_DUMP, |
| 76 | }, | 77 | }, |
| 77 | [SIOCSIWPRIV - SIOCIWFIRST] = { | 78 | [IW_IOCTL_IDX(SIOCSIWPRIV)] = { |
| 78 | .header_type = IW_HEADER_TYPE_NULL, | 79 | .header_type = IW_HEADER_TYPE_NULL, |
| 79 | }, | 80 | }, |
| 80 | [SIOCGIWPRIV - SIOCIWFIRST] = { /* (handled directly by us) */ | 81 | [IW_IOCTL_IDX(SIOCGIWPRIV)] = { /* (handled directly by us) */ |
| 81 | .header_type = IW_HEADER_TYPE_POINT, | 82 | .header_type = IW_HEADER_TYPE_POINT, |
| 82 | .token_size = sizeof(struct iw_priv_args), | 83 | .token_size = sizeof(struct iw_priv_args), |
| 83 | .max_tokens = 16, | 84 | .max_tokens = 16, |
| 84 | .flags = IW_DESCR_FLAG_NOMAX, | 85 | .flags = IW_DESCR_FLAG_NOMAX, |
| 85 | }, | 86 | }, |
| 86 | [SIOCSIWSTATS - SIOCIWFIRST] = { | 87 | [IW_IOCTL_IDX(SIOCSIWSTATS)] = { |
| 87 | .header_type = IW_HEADER_TYPE_NULL, | 88 | .header_type = IW_HEADER_TYPE_NULL, |
| 88 | }, | 89 | }, |
| 89 | [SIOCGIWSTATS - SIOCIWFIRST] = { /* (handled directly by us) */ | 90 | [IW_IOCTL_IDX(SIOCGIWSTATS)] = { /* (handled directly by us) */ |
| 90 | .header_type = IW_HEADER_TYPE_POINT, | 91 | .header_type = IW_HEADER_TYPE_POINT, |
| 91 | .token_size = 1, | 92 | .token_size = 1, |
| 92 | .max_tokens = sizeof(struct iw_statistics), | 93 | .max_tokens = sizeof(struct iw_statistics), |
| 93 | .flags = IW_DESCR_FLAG_DUMP, | 94 | .flags = IW_DESCR_FLAG_DUMP, |
| 94 | }, | 95 | }, |
| 95 | [SIOCSIWSPY - SIOCIWFIRST] = { | 96 | [IW_IOCTL_IDX(SIOCSIWSPY)] = { |
| 96 | .header_type = IW_HEADER_TYPE_POINT, | 97 | .header_type = IW_HEADER_TYPE_POINT, |
| 97 | .token_size = sizeof(struct sockaddr), | 98 | .token_size = sizeof(struct sockaddr), |
| 98 | .max_tokens = IW_MAX_SPY, | 99 | .max_tokens = IW_MAX_SPY, |
| 99 | }, | 100 | }, |
| 100 | [SIOCGIWSPY - SIOCIWFIRST] = { | 101 | [IW_IOCTL_IDX(SIOCGIWSPY)] = { |
| 101 | .header_type = IW_HEADER_TYPE_POINT, | 102 | .header_type = IW_HEADER_TYPE_POINT, |
| 102 | .token_size = sizeof(struct sockaddr) + | 103 | .token_size = sizeof(struct sockaddr) + |
| 103 | sizeof(struct iw_quality), | 104 | sizeof(struct iw_quality), |
| 104 | .max_tokens = IW_MAX_SPY, | 105 | .max_tokens = IW_MAX_SPY, |
| 105 | }, | 106 | }, |
| 106 | [SIOCSIWTHRSPY - SIOCIWFIRST] = { | 107 | [IW_IOCTL_IDX(SIOCSIWTHRSPY)] = { |
| 107 | .header_type = IW_HEADER_TYPE_POINT, | 108 | .header_type = IW_HEADER_TYPE_POINT, |
| 108 | .token_size = sizeof(struct iw_thrspy), | 109 | .token_size = sizeof(struct iw_thrspy), |
| 109 | .min_tokens = 1, | 110 | .min_tokens = 1, |
| 110 | .max_tokens = 1, | 111 | .max_tokens = 1, |
| 111 | }, | 112 | }, |
| 112 | [SIOCGIWTHRSPY - SIOCIWFIRST] = { | 113 | [IW_IOCTL_IDX(SIOCGIWTHRSPY)] = { |
| 113 | .header_type = IW_HEADER_TYPE_POINT, | 114 | .header_type = IW_HEADER_TYPE_POINT, |
| 114 | .token_size = sizeof(struct iw_thrspy), | 115 | .token_size = sizeof(struct iw_thrspy), |
| 115 | .min_tokens = 1, | 116 | .min_tokens = 1, |
| 116 | .max_tokens = 1, | 117 | .max_tokens = 1, |
| 117 | }, | 118 | }, |
| 118 | [SIOCSIWAP - SIOCIWFIRST] = { | 119 | [IW_IOCTL_IDX(SIOCSIWAP)] = { |
| 119 | .header_type = IW_HEADER_TYPE_ADDR, | 120 | .header_type = IW_HEADER_TYPE_ADDR, |
| 120 | }, | 121 | }, |
| 121 | [SIOCGIWAP - SIOCIWFIRST] = { | 122 | [IW_IOCTL_IDX(SIOCGIWAP)] = { |
| 122 | .header_type = IW_HEADER_TYPE_ADDR, | 123 | .header_type = IW_HEADER_TYPE_ADDR, |
| 123 | .flags = IW_DESCR_FLAG_DUMP, | 124 | .flags = IW_DESCR_FLAG_DUMP, |
| 124 | }, | 125 | }, |
| 125 | [SIOCSIWMLME - SIOCIWFIRST] = { | 126 | [IW_IOCTL_IDX(SIOCSIWMLME)] = { |
| 126 | .header_type = IW_HEADER_TYPE_POINT, | 127 | .header_type = IW_HEADER_TYPE_POINT, |
| 127 | .token_size = 1, | 128 | .token_size = 1, |
| 128 | .min_tokens = sizeof(struct iw_mlme), | 129 | .min_tokens = sizeof(struct iw_mlme), |
| 129 | .max_tokens = sizeof(struct iw_mlme), | 130 | .max_tokens = sizeof(struct iw_mlme), |
| 130 | }, | 131 | }, |
| 131 | [SIOCGIWAPLIST - SIOCIWFIRST] = { | 132 | [IW_IOCTL_IDX(SIOCGIWAPLIST)] = { |
| 132 | .header_type = IW_HEADER_TYPE_POINT, | 133 | .header_type = IW_HEADER_TYPE_POINT, |
| 133 | .token_size = sizeof(struct sockaddr) + | 134 | .token_size = sizeof(struct sockaddr) + |
| 134 | sizeof(struct iw_quality), | 135 | sizeof(struct iw_quality), |
| 135 | .max_tokens = IW_MAX_AP, | 136 | .max_tokens = IW_MAX_AP, |
| 136 | .flags = IW_DESCR_FLAG_NOMAX, | 137 | .flags = IW_DESCR_FLAG_NOMAX, |
| 137 | }, | 138 | }, |
| 138 | [SIOCSIWSCAN - SIOCIWFIRST] = { | 139 | [IW_IOCTL_IDX(SIOCSIWSCAN)] = { |
| 139 | .header_type = IW_HEADER_TYPE_POINT, | 140 | .header_type = IW_HEADER_TYPE_POINT, |
| 140 | .token_size = 1, | 141 | .token_size = 1, |
| 141 | .min_tokens = 0, | 142 | .min_tokens = 0, |
| 142 | .max_tokens = sizeof(struct iw_scan_req), | 143 | .max_tokens = sizeof(struct iw_scan_req), |
| 143 | }, | 144 | }, |
| 144 | [SIOCGIWSCAN - SIOCIWFIRST] = { | 145 | [IW_IOCTL_IDX(SIOCGIWSCAN)] = { |
| 145 | .header_type = IW_HEADER_TYPE_POINT, | 146 | .header_type = IW_HEADER_TYPE_POINT, |
| 146 | .token_size = 1, | 147 | .token_size = 1, |
| 147 | .max_tokens = IW_SCAN_MAX_DATA, | 148 | .max_tokens = IW_SCAN_MAX_DATA, |
| 148 | .flags = IW_DESCR_FLAG_NOMAX, | 149 | .flags = IW_DESCR_FLAG_NOMAX, |
| 149 | }, | 150 | }, |
| 150 | [SIOCSIWESSID - SIOCIWFIRST] = { | 151 | [IW_IOCTL_IDX(SIOCSIWESSID)] = { |
| 151 | .header_type = IW_HEADER_TYPE_POINT, | 152 | .header_type = IW_HEADER_TYPE_POINT, |
| 152 | .token_size = 1, | 153 | .token_size = 1, |
| 153 | .max_tokens = IW_ESSID_MAX_SIZE, | 154 | .max_tokens = IW_ESSID_MAX_SIZE, |
| 154 | .flags = IW_DESCR_FLAG_EVENT, | 155 | .flags = IW_DESCR_FLAG_EVENT, |
| 155 | }, | 156 | }, |
| 156 | [SIOCGIWESSID - SIOCIWFIRST] = { | 157 | [IW_IOCTL_IDX(SIOCGIWESSID)] = { |
| 157 | .header_type = IW_HEADER_TYPE_POINT, | 158 | .header_type = IW_HEADER_TYPE_POINT, |
| 158 | .token_size = 1, | 159 | .token_size = 1, |
| 159 | .max_tokens = IW_ESSID_MAX_SIZE, | 160 | .max_tokens = IW_ESSID_MAX_SIZE, |
| 160 | .flags = IW_DESCR_FLAG_DUMP, | 161 | .flags = IW_DESCR_FLAG_DUMP, |
| 161 | }, | 162 | }, |
| 162 | [SIOCSIWNICKN - SIOCIWFIRST] = { | 163 | [IW_IOCTL_IDX(SIOCSIWNICKN)] = { |
| 163 | .header_type = IW_HEADER_TYPE_POINT, | 164 | .header_type = IW_HEADER_TYPE_POINT, |
| 164 | .token_size = 1, | 165 | .token_size = 1, |
| 165 | .max_tokens = IW_ESSID_MAX_SIZE, | 166 | .max_tokens = IW_ESSID_MAX_SIZE, |
| 166 | }, | 167 | }, |
| 167 | [SIOCGIWNICKN - SIOCIWFIRST] = { | 168 | [IW_IOCTL_IDX(SIOCGIWNICKN)] = { |
| 168 | .header_type = IW_HEADER_TYPE_POINT, | 169 | .header_type = IW_HEADER_TYPE_POINT, |
| 169 | .token_size = 1, | 170 | .token_size = 1, |
| 170 | .max_tokens = IW_ESSID_MAX_SIZE, | 171 | .max_tokens = IW_ESSID_MAX_SIZE, |
| 171 | }, | 172 | }, |
| 172 | [SIOCSIWRATE - SIOCIWFIRST] = { | 173 | [IW_IOCTL_IDX(SIOCSIWRATE)] = { |
| 173 | .header_type = IW_HEADER_TYPE_PARAM, | 174 | .header_type = IW_HEADER_TYPE_PARAM, |
| 174 | }, | 175 | }, |
| 175 | [SIOCGIWRATE - SIOCIWFIRST] = { | 176 | [IW_IOCTL_IDX(SIOCGIWRATE)] = { |
| 176 | .header_type = IW_HEADER_TYPE_PARAM, | 177 | .header_type = IW_HEADER_TYPE_PARAM, |
| 177 | }, | 178 | }, |
| 178 | [SIOCSIWRTS - SIOCIWFIRST] = { | 179 | [IW_IOCTL_IDX(SIOCSIWRTS)] = { |
| 179 | .header_type = IW_HEADER_TYPE_PARAM, | 180 | .header_type = IW_HEADER_TYPE_PARAM, |
| 180 | }, | 181 | }, |
| 181 | [SIOCGIWRTS - SIOCIWFIRST] = { | 182 | [IW_IOCTL_IDX(SIOCGIWRTS)] = { |
| 182 | .header_type = IW_HEADER_TYPE_PARAM, | 183 | .header_type = IW_HEADER_TYPE_PARAM, |
| 183 | }, | 184 | }, |
| 184 | [SIOCSIWFRAG - SIOCIWFIRST] = { | 185 | [IW_IOCTL_IDX(SIOCSIWFRAG)] = { |
| 185 | .header_type = IW_HEADER_TYPE_PARAM, | 186 | .header_type = IW_HEADER_TYPE_PARAM, |
| 186 | }, | 187 | }, |
| 187 | [SIOCGIWFRAG - SIOCIWFIRST] = { | 188 | [IW_IOCTL_IDX(SIOCGIWFRAG)] = { |
| 188 | .header_type = IW_HEADER_TYPE_PARAM, | 189 | .header_type = IW_HEADER_TYPE_PARAM, |
| 189 | }, | 190 | }, |
| 190 | [SIOCSIWTXPOW - SIOCIWFIRST] = { | 191 | [IW_IOCTL_IDX(SIOCSIWTXPOW)] = { |
| 191 | .header_type = IW_HEADER_TYPE_PARAM, | 192 | .header_type = IW_HEADER_TYPE_PARAM, |
| 192 | }, | 193 | }, |
| 193 | [SIOCGIWTXPOW - SIOCIWFIRST] = { | 194 | [IW_IOCTL_IDX(SIOCGIWTXPOW)] = { |
| 194 | .header_type = IW_HEADER_TYPE_PARAM, | 195 | .header_type = IW_HEADER_TYPE_PARAM, |
| 195 | }, | 196 | }, |
| 196 | [SIOCSIWRETRY - SIOCIWFIRST] = { | 197 | [IW_IOCTL_IDX(SIOCSIWRETRY)] = { |
| 197 | .header_type = IW_HEADER_TYPE_PARAM, | 198 | .header_type = IW_HEADER_TYPE_PARAM, |
| 198 | }, | 199 | }, |
| 199 | [SIOCGIWRETRY - SIOCIWFIRST] = { | 200 | [IW_IOCTL_IDX(SIOCGIWRETRY)] = { |
| 200 | .header_type = IW_HEADER_TYPE_PARAM, | 201 | .header_type = IW_HEADER_TYPE_PARAM, |
| 201 | }, | 202 | }, |
| 202 | [SIOCSIWENCODE - SIOCIWFIRST] = { | 203 | [IW_IOCTL_IDX(SIOCSIWENCODE)] = { |
| 203 | .header_type = IW_HEADER_TYPE_POINT, | 204 | .header_type = IW_HEADER_TYPE_POINT, |
| 204 | .token_size = 1, | 205 | .token_size = 1, |
| 205 | .max_tokens = IW_ENCODING_TOKEN_MAX, | 206 | .max_tokens = IW_ENCODING_TOKEN_MAX, |
| 206 | .flags = IW_DESCR_FLAG_EVENT | IW_DESCR_FLAG_RESTRICT, | 207 | .flags = IW_DESCR_FLAG_EVENT | IW_DESCR_FLAG_RESTRICT, |
| 207 | }, | 208 | }, |
| 208 | [SIOCGIWENCODE - SIOCIWFIRST] = { | 209 | [IW_IOCTL_IDX(SIOCGIWENCODE)] = { |
| 209 | .header_type = IW_HEADER_TYPE_POINT, | 210 | .header_type = IW_HEADER_TYPE_POINT, |
| 210 | .token_size = 1, | 211 | .token_size = 1, |
| 211 | .max_tokens = IW_ENCODING_TOKEN_MAX, | 212 | .max_tokens = IW_ENCODING_TOKEN_MAX, |
| 212 | .flags = IW_DESCR_FLAG_DUMP | IW_DESCR_FLAG_RESTRICT, | 213 | .flags = IW_DESCR_FLAG_DUMP | IW_DESCR_FLAG_RESTRICT, |
| 213 | }, | 214 | }, |
| 214 | [SIOCSIWPOWER - SIOCIWFIRST] = { | 215 | [IW_IOCTL_IDX(SIOCSIWPOWER)] = { |
| 215 | .header_type = IW_HEADER_TYPE_PARAM, | 216 | .header_type = IW_HEADER_TYPE_PARAM, |
| 216 | }, | 217 | }, |
| 217 | [SIOCGIWPOWER - SIOCIWFIRST] = { | 218 | [IW_IOCTL_IDX(SIOCGIWPOWER)] = { |
| 218 | .header_type = IW_HEADER_TYPE_PARAM, | 219 | .header_type = IW_HEADER_TYPE_PARAM, |
| 219 | }, | 220 | }, |
| 220 | [SIOCSIWGENIE - SIOCIWFIRST] = { | 221 | [IW_IOCTL_IDX(SIOCSIWGENIE)] = { |
| 221 | .header_type = IW_HEADER_TYPE_POINT, | 222 | .header_type = IW_HEADER_TYPE_POINT, |
| 222 | .token_size = 1, | 223 | .token_size = 1, |
| 223 | .max_tokens = IW_GENERIC_IE_MAX, | 224 | .max_tokens = IW_GENERIC_IE_MAX, |
| 224 | }, | 225 | }, |
| 225 | [SIOCGIWGENIE - SIOCIWFIRST] = { | 226 | [IW_IOCTL_IDX(SIOCGIWGENIE)] = { |
| 226 | .header_type = IW_HEADER_TYPE_POINT, | 227 | .header_type = IW_HEADER_TYPE_POINT, |
| 227 | .token_size = 1, | 228 | .token_size = 1, |
| 228 | .max_tokens = IW_GENERIC_IE_MAX, | 229 | .max_tokens = IW_GENERIC_IE_MAX, |
| 229 | }, | 230 | }, |
| 230 | [SIOCSIWAUTH - SIOCIWFIRST] = { | 231 | [IW_IOCTL_IDX(SIOCSIWAUTH)] = { |
| 231 | .header_type = IW_HEADER_TYPE_PARAM, | 232 | .header_type = IW_HEADER_TYPE_PARAM, |
| 232 | }, | 233 | }, |
| 233 | [SIOCGIWAUTH - SIOCIWFIRST] = { | 234 | [IW_IOCTL_IDX(SIOCGIWAUTH)] = { |
| 234 | .header_type = IW_HEADER_TYPE_PARAM, | 235 | .header_type = IW_HEADER_TYPE_PARAM, |
| 235 | }, | 236 | }, |
| 236 | [SIOCSIWENCODEEXT - SIOCIWFIRST] = { | 237 | [IW_IOCTL_IDX(SIOCSIWENCODEEXT)] = { |
| 237 | .header_type = IW_HEADER_TYPE_POINT, | 238 | .header_type = IW_HEADER_TYPE_POINT, |
| 238 | .token_size = 1, | 239 | .token_size = 1, |
| 239 | .min_tokens = sizeof(struct iw_encode_ext), | 240 | .min_tokens = sizeof(struct iw_encode_ext), |
| 240 | .max_tokens = sizeof(struct iw_encode_ext) + | 241 | .max_tokens = sizeof(struct iw_encode_ext) + |
| 241 | IW_ENCODING_TOKEN_MAX, | 242 | IW_ENCODING_TOKEN_MAX, |
| 242 | }, | 243 | }, |
| 243 | [SIOCGIWENCODEEXT - SIOCIWFIRST] = { | 244 | [IW_IOCTL_IDX(SIOCGIWENCODEEXT)] = { |
| 244 | .header_type = IW_HEADER_TYPE_POINT, | 245 | .header_type = IW_HEADER_TYPE_POINT, |
| 245 | .token_size = 1, | 246 | .token_size = 1, |
| 246 | .min_tokens = sizeof(struct iw_encode_ext), | 247 | .min_tokens = sizeof(struct iw_encode_ext), |
| 247 | .max_tokens = sizeof(struct iw_encode_ext) + | 248 | .max_tokens = sizeof(struct iw_encode_ext) + |
| 248 | IW_ENCODING_TOKEN_MAX, | 249 | IW_ENCODING_TOKEN_MAX, |
| 249 | }, | 250 | }, |
| 250 | [SIOCSIWPMKSA - SIOCIWFIRST] = { | 251 | [IW_IOCTL_IDX(SIOCSIWPMKSA)] = { |
| 251 | .header_type = IW_HEADER_TYPE_POINT, | 252 | .header_type = IW_HEADER_TYPE_POINT, |
| 252 | .token_size = 1, | 253 | .token_size = 1, |
| 253 | .min_tokens = sizeof(struct iw_pmksa), | 254 | .min_tokens = sizeof(struct iw_pmksa), |
| @@ -261,44 +262,44 @@ static const unsigned standard_ioctl_num = ARRAY_SIZE(standard_ioctl); | |||
| 261 | * we know about. | 262 | * we know about. |
| 262 | */ | 263 | */ |
| 263 | static const struct iw_ioctl_description standard_event[] = { | 264 | static const struct iw_ioctl_description standard_event[] = { |
| 264 | [IWEVTXDROP - IWEVFIRST] = { | 265 | [IW_EVENT_IDX(IWEVTXDROP)] = { |
| 265 | .header_type = IW_HEADER_TYPE_ADDR, | 266 | .header_type = IW_HEADER_TYPE_ADDR, |
| 266 | }, | 267 | }, |
| 267 | [IWEVQUAL - IWEVFIRST] = { | 268 | [IW_EVENT_IDX(IWEVQUAL)] = { |
| 268 | .header_type = IW_HEADER_TYPE_QUAL, | 269 | .header_type = IW_HEADER_TYPE_QUAL, |
| 269 | }, | 270 | }, |
| 270 | [IWEVCUSTOM - IWEVFIRST] = { | 271 | [IW_EVENT_IDX(IWEVCUSTOM)] = { |
| 271 | .header_type = IW_HEADER_TYPE_POINT, | 272 | .header_type = IW_HEADER_TYPE_POINT, |
| 272 | .token_size = 1, | 273 | .token_size = 1, |
| 273 | .max_tokens = IW_CUSTOM_MAX, | 274 | .max_tokens = IW_CUSTOM_MAX, |
| 274 | }, | 275 | }, |
| 275 | [IWEVREGISTERED - IWEVFIRST] = { | 276 | [IW_EVENT_IDX(IWEVREGISTERED)] = { |
| 276 | .header_type = IW_HEADER_TYPE_ADDR, | 277 | .header_type = IW_HEADER_TYPE_ADDR, |
| 277 | }, | 278 | }, |
| 278 | [IWEVEXPIRED - IWEVFIRST] = { | 279 | [IW_EVENT_IDX(IWEVEXPIRED)] = { |
| 279 | .header_type = IW_HEADER_TYPE_ADDR, | 280 | .header_type = IW_HEADER_TYPE_ADDR, |
| 280 | }, | 281 | }, |
| 281 | [IWEVGENIE - IWEVFIRST] = { | 282 | [IW_EVENT_IDX(IWEVGENIE)] = { |
| 282 | .header_type = IW_HEADER_TYPE_POINT, | 283 | .header_type = IW_HEADER_TYPE_POINT, |
| 283 | .token_size = 1, | 284 | .token_size = 1, |
| 284 | .max_tokens = IW_GENERIC_IE_MAX, | 285 | .max_tokens = IW_GENERIC_IE_MAX, |
| 285 | }, | 286 | }, |
| 286 | [IWEVMICHAELMICFAILURE - IWEVFIRST] = { | 287 | [IW_EVENT_IDX(IWEVMICHAELMICFAILURE)] = { |
| 287 | .header_type = IW_HEADER_TYPE_POINT, | 288 | .header_type = IW_HEADER_TYPE_POINT, |
| 288 | .token_size = 1, | 289 | .token_size = 1, |
| 289 | .max_tokens = sizeof(struct iw_michaelmicfailure), | 290 | .max_tokens = sizeof(struct iw_michaelmicfailure), |
| 290 | }, | 291 | }, |
| 291 | [IWEVASSOCREQIE - IWEVFIRST] = { | 292 | [IW_EVENT_IDX(IWEVASSOCREQIE)] = { |
| 292 | .header_type = IW_HEADER_TYPE_POINT, | 293 | .header_type = IW_HEADER_TYPE_POINT, |
| 293 | .token_size = 1, | 294 | .token_size = 1, |
| 294 | .max_tokens = IW_GENERIC_IE_MAX, | 295 | .max_tokens = IW_GENERIC_IE_MAX, |
| 295 | }, | 296 | }, |
| 296 | [IWEVASSOCRESPIE - IWEVFIRST] = { | 297 | [IW_EVENT_IDX(IWEVASSOCRESPIE)] = { |
| 297 | .header_type = IW_HEADER_TYPE_POINT, | 298 | .header_type = IW_HEADER_TYPE_POINT, |
| 298 | .token_size = 1, | 299 | .token_size = 1, |
| 299 | .max_tokens = IW_GENERIC_IE_MAX, | 300 | .max_tokens = IW_GENERIC_IE_MAX, |
| 300 | }, | 301 | }, |
| 301 | [IWEVPMKIDCAND - IWEVFIRST] = { | 302 | [IW_EVENT_IDX(IWEVPMKIDCAND)] = { |
| 302 | .header_type = IW_HEADER_TYPE_POINT, | 303 | .header_type = IW_HEADER_TYPE_POINT, |
| 303 | .token_size = 1, | 304 | .token_size = 1, |
| 304 | .max_tokens = sizeof(struct iw_pmkid_cand), | 305 | .max_tokens = sizeof(struct iw_pmkid_cand), |
| @@ -449,11 +450,11 @@ void wireless_send_event(struct net_device * dev, | |||
| 449 | 450 | ||
| 450 | /* Get the description of the Event */ | 451 | /* Get the description of the Event */ |
| 451 | if (cmd <= SIOCIWLAST) { | 452 | if (cmd <= SIOCIWLAST) { |
| 452 | cmd_index = cmd - SIOCIWFIRST; | 453 | cmd_index = IW_IOCTL_IDX(cmd); |
| 453 | if (cmd_index < standard_ioctl_num) | 454 | if (cmd_index < standard_ioctl_num) |
| 454 | descr = &(standard_ioctl[cmd_index]); | 455 | descr = &(standard_ioctl[cmd_index]); |
| 455 | } else { | 456 | } else { |
| 456 | cmd_index = cmd - IWEVFIRST; | 457 | cmd_index = IW_EVENT_IDX(cmd); |
| 457 | if (cmd_index < standard_event_num) | 458 | if (cmd_index < standard_event_num) |
| 458 | descr = &(standard_event[cmd_index]); | 459 | descr = &(standard_event[cmd_index]); |
| 459 | } | 460 | } |
| @@ -662,7 +663,7 @@ static iw_handler get_handler(struct net_device *dev, unsigned int cmd) | |||
| 662 | return NULL; | 663 | return NULL; |
| 663 | 664 | ||
| 664 | /* Try as a standard command */ | 665 | /* Try as a standard command */ |
| 665 | index = cmd - SIOCIWFIRST; | 666 | index = IW_IOCTL_IDX(cmd); |
| 666 | if (index < handlers->num_standard) | 667 | if (index < handlers->num_standard) |
| 667 | return handlers->standard[index]; | 668 | return handlers->standard[index]; |
| 668 | 669 | ||
| @@ -781,6 +782,22 @@ static int ioctl_standard_iw_point(struct iw_point *iwp, unsigned int cmd, | |||
| 781 | } | 782 | } |
| 782 | } | 783 | } |
| 783 | 784 | ||
| 785 | if (IW_IS_GET(cmd) && !(descr->flags & IW_DESCR_FLAG_NOMAX)) { | ||
| 786 | /* | ||
| 787 | * If this is a GET, but not NOMAX, it means that the extra | ||
| 788 | * data is not bounded by userspace, but by max_tokens. Thus | ||
| 789 | * set the length to max_tokens. This matches the extra data | ||
| 790 | * allocation. | ||
| 791 | * The driver should fill it with the number of tokens it | ||
| 792 | * provided, and it may check iwp->length rather than having | ||
| 793 | * knowledge of max_tokens. If the driver doesn't change the | ||
| 794 | * iwp->length, this ioctl just copies back max_token tokens | ||
| 795 | * filled with zeroes. Hopefully the driver isn't claiming | ||
| 796 | * them to be valid data. | ||
| 797 | */ | ||
| 798 | iwp->length = descr->max_tokens; | ||
| 799 | } | ||
| 800 | |||
| 784 | err = handler(dev, info, (union iwreq_data *) iwp, extra); | 801 | err = handler(dev, info, (union iwreq_data *) iwp, extra); |
| 785 | 802 | ||
| 786 | iwp->length += essid_compat; | 803 | iwp->length += essid_compat; |
| @@ -954,9 +971,9 @@ static int ioctl_standard_call(struct net_device * dev, | |||
| 954 | int ret = -EINVAL; | 971 | int ret = -EINVAL; |
| 955 | 972 | ||
| 956 | /* Get the description of the IOCTL */ | 973 | /* Get the description of the IOCTL */ |
| 957 | if ((cmd - SIOCIWFIRST) >= standard_ioctl_num) | 974 | if (IW_IOCTL_IDX(cmd) >= standard_ioctl_num) |
| 958 | return -EOPNOTSUPP; | 975 | return -EOPNOTSUPP; |
| 959 | descr = &(standard_ioctl[cmd - SIOCIWFIRST]); | 976 | descr = &(standard_ioctl[IW_IOCTL_IDX(cmd)]); |
| 960 | 977 | ||
| 961 | /* Check if we have a pointer to user space data or not */ | 978 | /* Check if we have a pointer to user space data or not */ |
| 962 | if (descr->header_type != IW_HEADER_TYPE_POINT) { | 979 | if (descr->header_type != IW_HEADER_TYPE_POINT) { |
| @@ -1012,7 +1029,7 @@ static int compat_standard_call(struct net_device *dev, | |||
| 1012 | struct iw_point iwp; | 1029 | struct iw_point iwp; |
| 1013 | int err; | 1030 | int err; |
| 1014 | 1031 | ||
| 1015 | descr = standard_ioctl + (cmd - SIOCIWFIRST); | 1032 | descr = standard_ioctl + IW_IOCTL_IDX(cmd); |
| 1016 | 1033 | ||
| 1017 | if (descr->header_type != IW_HEADER_TYPE_POINT) | 1034 | if (descr->header_type != IW_HEADER_TYPE_POINT) |
| 1018 | return ioctl_standard_call(dev, iwr, cmd, info, handler); | 1035 | return ioctl_standard_call(dev, iwr, cmd, info, handler); |
