Commit 9e101eab153073d8a1fc7ea22b20af65de8ab44b
Committed by
David S. Miller
1 parent
704232c271
Exists in
master
and in
4 other branches
[WIRELESS]: Remove wext over netlink.
As scheduled, this patch removes the pointless wext over netlink code. Signed-off-by: Johannes Berg <johannes@sipsolutions.net> Signed-off-by: John W. Linville <linville@tuxdriver.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Showing 5 changed files with 0 additions and 798 deletions Side-by-side Diff
Documentation/feature-removal-schedule.txt
... | ... | @@ -285,18 +285,6 @@ |
285 | 285 | |
286 | 286 | --------------------------- |
287 | 287 | |
288 | -What: Wireless extensions over netlink (CONFIG_NET_WIRELESS_RTNETLINK) | |
289 | -When: with the merge of wireless-dev, 2.6.22 or later | |
290 | -Why: The option/code is | |
291 | - * not enabled on most kernels | |
292 | - * not required by any userspace tools (except an experimental one, | |
293 | - and even there only for some parts, others use ioctl) | |
294 | - * pointless since wext is no longer evolving and the ioctl | |
295 | - interface needs to be kept | |
296 | -Who: Johannes Berg <johannes@sipsolutions.net> | |
297 | - | |
298 | ---------------------------- | |
299 | - | |
300 | 288 | What: i8xx_tco watchdog driver |
301 | 289 | When: in 2.6.22 |
302 | 290 | Why: the i8xx_tco watchdog driver has been replaced by the iTCO_wdt |
include/net/iw_handler.h
... | ... | @@ -440,16 +440,6 @@ |
440 | 440 | /* Handle IOCTLs, called in net/core/dev.c */ |
441 | 441 | extern int wireless_process_ioctl(struct ifreq *ifr, unsigned int cmd); |
442 | 442 | |
443 | -/* Handle RtNetlink requests, called in net/core/rtnetlink.c */ | |
444 | -extern int wireless_rtnetlink_set(struct net_device * dev, | |
445 | - char * data, | |
446 | - int len); | |
447 | -extern int wireless_rtnetlink_get(struct net_device * dev, | |
448 | - char * data, | |
449 | - int len, | |
450 | - char ** p_buf, | |
451 | - int * p_len); | |
452 | - | |
453 | 443 | /* Second : functions that may be called by driver modules */ |
454 | 444 | |
455 | 445 | /* Send a single event to user space */ |
net/core/rtnetlink.c
... | ... | @@ -51,10 +51,6 @@ |
51 | 51 | #include <net/pkt_sched.h> |
52 | 52 | #include <net/fib_rules.h> |
53 | 53 | #include <net/rtnetlink.h> |
54 | -#ifdef CONFIG_NET_WIRELESS_RTNETLINK | |
55 | -#include <linux/wireless.h> | |
56 | -#include <net/iw_handler.h> | |
57 | -#endif /* CONFIG_NET_WIRELESS_RTNETLINK */ | |
58 | 54 | |
59 | 55 | struct rtnl_link |
60 | 56 | { |
... | ... | @@ -684,17 +680,6 @@ |
684 | 680 | modified = 1; |
685 | 681 | } |
686 | 682 | |
687 | -#ifdef CONFIG_NET_WIRELESS_RTNETLINK | |
688 | - if (tb[IFLA_WIRELESS]) { | |
689 | - /* Call Wireless Extensions. | |
690 | - * Various stuff checked in there... */ | |
691 | - err = wireless_rtnetlink_set(dev, nla_data(tb[IFLA_WIRELESS]), | |
692 | - nla_len(tb[IFLA_WIRELESS])); | |
693 | - if (err < 0) | |
694 | - goto errout_dev; | |
695 | - } | |
696 | -#endif /* CONFIG_NET_WIRELESS_RTNETLINK */ | |
697 | - | |
698 | 683 | if (tb[IFLA_BROADCAST]) { |
699 | 684 | nla_memcpy(dev->broadcast, tb[IFLA_BROADCAST], dev->addr_len); |
700 | 685 | send_addr_notify = 1; |
... | ... | @@ -757,22 +742,6 @@ |
757 | 742 | return -ENODEV; |
758 | 743 | } else |
759 | 744 | return -EINVAL; |
760 | - | |
761 | - | |
762 | -#ifdef CONFIG_NET_WIRELESS_RTNETLINK | |
763 | - if (tb[IFLA_WIRELESS]) { | |
764 | - /* Call Wireless Extensions. We need to know the size before | |
765 | - * we can alloc. Various stuff checked in there... */ | |
766 | - err = wireless_rtnetlink_get(dev, nla_data(tb[IFLA_WIRELESS]), | |
767 | - nla_len(tb[IFLA_WIRELESS]), | |
768 | - &iw_buf, &iw_buf_len); | |
769 | - if (err < 0) | |
770 | - goto errout; | |
771 | - | |
772 | - /* Payload is at an offset in buffer */ | |
773 | - iw = iw_buf + IW_EV_POINT_OFF; | |
774 | - } | |
775 | -#endif /* CONFIG_NET_WIRELESS_RTNETLINK */ | |
776 | 745 | |
777 | 746 | nskb = nlmsg_new(if_nlmsg_size(iw_buf_len), GFP_KERNEL); |
778 | 747 | if (nskb == NULL) { |
net/core/wireless.c
... | ... | @@ -104,12 +104,10 @@ |
104 | 104 | |
105 | 105 | /* Debugging stuff */ |
106 | 106 | #undef WE_IOCTL_DEBUG /* Debug IOCTL API */ |
107 | -#undef WE_RTNETLINK_DEBUG /* Debug RtNetlink API */ | |
108 | 107 | #undef WE_EVENT_DEBUG /* Debug Event dispatcher */ |
109 | 108 | #undef WE_SPY_DEBUG /* Debug enhanced spy support */ |
110 | 109 | |
111 | 110 | /* Options */ |
112 | -//CONFIG_NET_WIRELESS_RTNETLINK /* Wireless requests over RtNetlink */ | |
113 | 111 | #define WE_EVENT_RTNETLINK /* Propagate events using RtNetlink */ |
114 | 112 | #define WE_SET_EVENT /* Generate an event on some set commands */ |
115 | 113 | |
... | ... | @@ -1144,739 +1142,6 @@ |
1144 | 1142 | /* Not reached */ |
1145 | 1143 | return -EINVAL; |
1146 | 1144 | } |
1147 | - | |
1148 | -/********************** RTNETLINK REQUEST API **********************/ | |
1149 | -/* | |
1150 | - * The alternate user space API to configure all those Wireless Extensions | |
1151 | - * is through RtNetlink. | |
1152 | - * This API support only the new driver API (iw_handler). | |
1153 | - * | |
1154 | - * This RtNetlink API use the same query/reply model as the ioctl API. | |
1155 | - * Maximum effort has been done to fit in the RtNetlink model, and | |
1156 | - * we support both RtNetlink Set and RtNelink Get operations. | |
1157 | - * On the other hand, we don't offer Dump operations because of the | |
1158 | - * following reasons : | |
1159 | - * o Large number of parameters, most optional | |
1160 | - * o Large size of some parameters (> 100 bytes) | |
1161 | - * o Each parameters need to be extracted from hardware | |
1162 | - * o Scan requests can take seconds and disable network activity. | |
1163 | - * Because of this high cost/overhead, we want to return only the | |
1164 | - * parameters the user application is really interested in. | |
1165 | - * We could offer partial Dump using the IW_DESCR_FLAG_DUMP flag. | |
1166 | - * | |
1167 | - * The API uses the standard RtNetlink socket. When the RtNetlink code | |
1168 | - * find a IFLA_WIRELESS field in a RtNetlink SET_LINK request, | |
1169 | - * it calls here. | |
1170 | - */ | |
1171 | - | |
1172 | -#ifdef CONFIG_NET_WIRELESS_RTNETLINK | |
1173 | -/* ---------------------------------------------------------------- */ | |
1174 | -/* | |
1175 | - * Wrapper to call a standard Wireless Extension GET handler. | |
1176 | - * We do various checks and call the handler with the proper args. | |
1177 | - */ | |
1178 | -static int rtnetlink_standard_get(struct net_device * dev, | |
1179 | - struct iw_event * request, | |
1180 | - int request_len, | |
1181 | - iw_handler handler, | |
1182 | - char ** p_buf, | |
1183 | - int * p_len) | |
1184 | -{ | |
1185 | - const struct iw_ioctl_description * descr = NULL; | |
1186 | - unsigned int cmd; | |
1187 | - union iwreq_data * wrqu; | |
1188 | - int hdr_len; | |
1189 | - struct iw_request_info info; | |
1190 | - char * buffer = NULL; | |
1191 | - int buffer_size = 0; | |
1192 | - int ret = -EINVAL; | |
1193 | - | |
1194 | - /* Get the description of the Request */ | |
1195 | - cmd = request->cmd; | |
1196 | - if ((cmd - SIOCIWFIRST) >= standard_ioctl_num) | |
1197 | - return -EOPNOTSUPP; | |
1198 | - descr = &(standard_ioctl[cmd - SIOCIWFIRST]); | |
1199 | - | |
1200 | -#ifdef WE_RTNETLINK_DEBUG | |
1201 | - printk(KERN_DEBUG "%s (WE.r) : Found standard handler for 0x%04X\n", | |
1202 | - dev->name, cmd); | |
1203 | - printk(KERN_DEBUG "%s (WE.r) : Header type : %d, Token type : %d, size : %d, token : %d\n", dev->name, descr->header_type, descr->token_type, descr->token_size, descr->max_tokens); | |
1204 | -#endif /* WE_RTNETLINK_DEBUG */ | |
1205 | - | |
1206 | - /* Check if wrqu is complete */ | |
1207 | - hdr_len = event_type_size[descr->header_type]; | |
1208 | - if (request_len < hdr_len) { | |
1209 | -#ifdef WE_RTNETLINK_DEBUG | |
1210 | - printk(KERN_DEBUG | |
1211 | - "%s (WE.r) : Wireless request too short (%d)\n", | |
1212 | - dev->name, request_len); | |
1213 | -#endif /* WE_RTNETLINK_DEBUG */ | |
1214 | - return -EINVAL; | |
1215 | - } | |
1216 | - | |
1217 | - /* Prepare the call */ | |
1218 | - info.cmd = cmd; | |
1219 | - info.flags = 0; | |
1220 | - | |
1221 | - /* Check if we have extra data in the reply or not */ | |
1222 | - if (descr->header_type != IW_HEADER_TYPE_POINT) { | |
1223 | - | |
1224 | - /* Create the kernel buffer that we will return. | |
1225 | - * It's at an offset to match the TYPE_POINT case... */ | |
1226 | - buffer_size = request_len + IW_EV_POINT_OFF; | |
1227 | - buffer = kmalloc(buffer_size, GFP_KERNEL); | |
1228 | - if (buffer == NULL) { | |
1229 | - return -ENOMEM; | |
1230 | - } | |
1231 | - /* Copy event data */ | |
1232 | - memcpy(buffer + IW_EV_POINT_OFF, request, request_len); | |
1233 | - /* Use our own copy of wrqu */ | |
1234 | - wrqu = (union iwreq_data *) (buffer + IW_EV_POINT_OFF | |
1235 | - + IW_EV_LCP_PK_LEN); | |
1236 | - | |
1237 | - /* No extra arguments. Trivial to handle */ | |
1238 | - ret = handler(dev, &info, wrqu, NULL); | |
1239 | - | |
1240 | - } else { | |
1241 | - union iwreq_data wrqu_point; | |
1242 | - char * extra = NULL; | |
1243 | - int extra_size = 0; | |
1244 | - | |
1245 | - /* Get a temp copy of wrqu (skip pointer) */ | |
1246 | - memcpy(((char *) &wrqu_point) + IW_EV_POINT_OFF, | |
1247 | - ((char *) request) + IW_EV_LCP_PK_LEN, | |
1248 | - IW_EV_POINT_LEN - IW_EV_LCP_PK_LEN); | |
1249 | - | |
1250 | - /* Calculate space needed by arguments. Always allocate | |
1251 | - * for max space. Easier, and won't last long... */ | |
1252 | - extra_size = descr->max_tokens * descr->token_size; | |
1253 | - /* Support for very large requests */ | |
1254 | - if ((descr->flags & IW_DESCR_FLAG_NOMAX) && | |
1255 | - (wrqu_point.data.length > descr->max_tokens)) | |
1256 | - extra_size = (wrqu_point.data.length | |
1257 | - * descr->token_size); | |
1258 | - buffer_size = extra_size + IW_EV_POINT_PK_LEN + IW_EV_POINT_OFF; | |
1259 | -#ifdef WE_RTNETLINK_DEBUG | |
1260 | - printk(KERN_DEBUG "%s (WE.r) : Malloc %d bytes (%d bytes)\n", | |
1261 | - dev->name, extra_size, buffer_size); | |
1262 | -#endif /* WE_RTNETLINK_DEBUG */ | |
1263 | - | |
1264 | - /* Create the kernel buffer that we will return */ | |
1265 | - buffer = kmalloc(buffer_size, GFP_KERNEL); | |
1266 | - if (buffer == NULL) { | |
1267 | - return -ENOMEM; | |
1268 | - } | |
1269 | - | |
1270 | - /* Put wrqu in the right place (just before extra). | |
1271 | - * Leave space for IWE header and dummy pointer... | |
1272 | - * Note that IW_EV_LCP_PK_LEN==4 bytes, so it's still aligned. | |
1273 | - */ | |
1274 | - memcpy(buffer + IW_EV_LCP_PK_LEN + IW_EV_POINT_OFF, | |
1275 | - ((char *) &wrqu_point) + IW_EV_POINT_OFF, | |
1276 | - IW_EV_POINT_PK_LEN - IW_EV_LCP_PK_LEN); | |
1277 | - wrqu = (union iwreq_data *) (buffer + IW_EV_LCP_PK_LEN); | |
1278 | - | |
1279 | - /* Extra comes logically after that. Offset +12 bytes. */ | |
1280 | - extra = buffer + IW_EV_POINT_OFF + IW_EV_POINT_PK_LEN; | |
1281 | - | |
1282 | - /* Call the handler */ | |
1283 | - ret = handler(dev, &info, wrqu, extra); | |
1284 | - | |
1285 | - /* Calculate real returned length */ | |
1286 | - extra_size = (wrqu->data.length * descr->token_size); | |
1287 | - /* Re-adjust reply size */ | |
1288 | - request->len = extra_size + IW_EV_POINT_PK_LEN; | |
1289 | - | |
1290 | - /* Put the iwe header where it should, i.e. scrap the | |
1291 | - * dummy pointer. */ | |
1292 | - memcpy(buffer + IW_EV_POINT_OFF, request, IW_EV_LCP_PK_LEN); | |
1293 | - | |
1294 | -#ifdef WE_RTNETLINK_DEBUG | |
1295 | - printk(KERN_DEBUG "%s (WE.r) : Reply 0x%04X, hdr_len %d, tokens %d, extra_size %d, buffer_size %d\n", dev->name, cmd, hdr_len, wrqu->data.length, extra_size, buffer_size); | |
1296 | -#endif /* WE_RTNETLINK_DEBUG */ | |
1297 | - | |
1298 | - /* Check if there is enough buffer up there */ | |
1299 | - if (wrqu_point.data.length < wrqu->data.length) | |
1300 | - ret = -E2BIG; | |
1301 | - } | |
1302 | - | |
1303 | - /* Return the buffer to the caller */ | |
1304 | - if (!ret) { | |
1305 | - *p_buf = buffer; | |
1306 | - *p_len = request->len; | |
1307 | - } else { | |
1308 | - /* Cleanup */ | |
1309 | - if (buffer) | |
1310 | - kfree(buffer); | |
1311 | - } | |
1312 | - | |
1313 | - return ret; | |
1314 | -} | |
1315 | - | |
1316 | -/* ---------------------------------------------------------------- */ | |
1317 | -/* | |
1318 | - * Wrapper to call a standard Wireless Extension SET handler. | |
1319 | - * We do various checks and call the handler with the proper args. | |
1320 | - */ | |
1321 | -static inline int rtnetlink_standard_set(struct net_device * dev, | |
1322 | - struct iw_event * request, | |
1323 | - int request_len, | |
1324 | - iw_handler handler) | |
1325 | -{ | |
1326 | - const struct iw_ioctl_description * descr = NULL; | |
1327 | - unsigned int cmd; | |
1328 | - union iwreq_data * wrqu; | |
1329 | - union iwreq_data wrqu_point; | |
1330 | - int hdr_len; | |
1331 | - char * extra = NULL; | |
1332 | - int extra_size = 0; | |
1333 | - struct iw_request_info info; | |
1334 | - int ret = -EINVAL; | |
1335 | - | |
1336 | - /* Get the description of the Request */ | |
1337 | - cmd = request->cmd; | |
1338 | - if ((cmd - SIOCIWFIRST) >= standard_ioctl_num) | |
1339 | - return -EOPNOTSUPP; | |
1340 | - descr = &(standard_ioctl[cmd - SIOCIWFIRST]); | |
1341 | - | |
1342 | -#ifdef WE_RTNETLINK_DEBUG | |
1343 | - printk(KERN_DEBUG "%s (WE.r) : Found standard SET handler for 0x%04X\n", | |
1344 | - dev->name, cmd); | |
1345 | - printk(KERN_DEBUG "%s (WE.r) : Header type : %d, Token type : %d, size : %d, token : %d\n", dev->name, descr->header_type, descr->token_type, descr->token_size, descr->max_tokens); | |
1346 | -#endif /* WE_RTNETLINK_DEBUG */ | |
1347 | - | |
1348 | - /* Extract fixed header from request. This is properly aligned. */ | |
1349 | - wrqu = (union iwreq_data *) (((char *) request) + IW_EV_LCP_PK_LEN); | |
1350 | - | |
1351 | - /* Check if wrqu is complete */ | |
1352 | - hdr_len = event_type_pk_size[descr->header_type]; | |
1353 | - if (request_len < hdr_len) { | |
1354 | -#ifdef WE_RTNETLINK_DEBUG | |
1355 | - printk(KERN_DEBUG | |
1356 | - "%s (WE.r) : Wireless request too short (%d)\n", | |
1357 | - dev->name, request_len); | |
1358 | -#endif /* WE_RTNETLINK_DEBUG */ | |
1359 | - return -EINVAL; | |
1360 | - } | |
1361 | - | |
1362 | - /* Prepare the call */ | |
1363 | - info.cmd = cmd; | |
1364 | - info.flags = 0; | |
1365 | - | |
1366 | - /* Check if we have extra data in the request or not */ | |
1367 | - if (descr->header_type != IW_HEADER_TYPE_POINT) { | |
1368 | - | |
1369 | - /* No extra arguments. Trivial to handle */ | |
1370 | - ret = handler(dev, &info, wrqu, NULL); | |
1371 | - | |
1372 | - } else { | |
1373 | - int extra_len; | |
1374 | - | |
1375 | - /* Put wrqu in the right place (skip pointer) */ | |
1376 | - memcpy(((char *) &wrqu_point) + IW_EV_POINT_OFF, | |
1377 | - wrqu, IW_EV_POINT_PK_LEN - IW_EV_LCP_PK_LEN); | |
1378 | - /* Don't forget about the event code... */ | |
1379 | - wrqu = &wrqu_point; | |
1380 | - | |
1381 | - /* Check if number of token fits within bounds */ | |
1382 | - if (wrqu_point.data.length > descr->max_tokens) | |
1383 | - return -E2BIG; | |
1384 | - if (wrqu_point.data.length < descr->min_tokens) | |
1385 | - return -EINVAL; | |
1386 | - | |
1387 | - /* Real length of payload */ | |
1388 | - extra_len = wrqu_point.data.length * descr->token_size; | |
1389 | - | |
1390 | - /* Check if request is self consistent */ | |
1391 | - if ((request_len - hdr_len) < extra_len) { | |
1392 | -#ifdef WE_RTNETLINK_DEBUG | |
1393 | - printk(KERN_DEBUG "%s (WE.r) : Wireless request data too short (%d)\n", | |
1394 | - dev->name, extra_size); | |
1395 | -#endif /* WE_RTNETLINK_DEBUG */ | |
1396 | - return -EINVAL; | |
1397 | - } | |
1398 | - | |
1399 | -#ifdef WE_RTNETLINK_DEBUG | |
1400 | - printk(KERN_DEBUG "%s (WE.r) : Malloc %d bytes\n", | |
1401 | - dev->name, extra_size); | |
1402 | -#endif /* WE_RTNETLINK_DEBUG */ | |
1403 | - | |
1404 | - /* Always allocate for max space. Easier, and won't last | |
1405 | - * long... */ | |
1406 | - extra_size = descr->max_tokens * descr->token_size; | |
1407 | - extra = kmalloc(extra_size, GFP_KERNEL); | |
1408 | - if (extra == NULL) | |
1409 | - return -ENOMEM; | |
1410 | - | |
1411 | - /* Copy extra in aligned buffer */ | |
1412 | - memcpy(extra, ((char *) request) + hdr_len, extra_len); | |
1413 | - | |
1414 | - /* Call the handler */ | |
1415 | - ret = handler(dev, &info, &wrqu_point, extra); | |
1416 | - } | |
1417 | - | |
1418 | -#ifdef WE_SET_EVENT | |
1419 | - /* Generate an event to notify listeners of the change */ | |
1420 | - if ((descr->flags & IW_DESCR_FLAG_EVENT) && | |
1421 | - ((ret == 0) || (ret == -EIWCOMMIT))) { | |
1422 | - if (descr->flags & IW_DESCR_FLAG_RESTRICT) | |
1423 | - /* If the event is restricted, don't | |
1424 | - * export the payload */ | |
1425 | - wireless_send_event(dev, cmd, wrqu, NULL); | |
1426 | - else | |
1427 | - wireless_send_event(dev, cmd, wrqu, extra); | |
1428 | - } | |
1429 | -#endif /* WE_SET_EVENT */ | |
1430 | - | |
1431 | - /* Cleanup - I told you it wasn't that long ;-) */ | |
1432 | - if (extra) | |
1433 | - kfree(extra); | |
1434 | - | |
1435 | - /* Call commit handler if needed and defined */ | |
1436 | - if (ret == -EIWCOMMIT) | |
1437 | - ret = call_commit_handler(dev); | |
1438 | - | |
1439 | - return ret; | |
1440 | -} | |
1441 | - | |
1442 | -/* ---------------------------------------------------------------- */ | |
1443 | -/* | |
1444 | - * Wrapper to call a private Wireless Extension GET handler. | |
1445 | - * Same as above... | |
1446 | - * It's not as nice and slimline as the standard wrapper. The cause | |
1447 | - * is struct iw_priv_args, which was not really designed for the | |
1448 | - * job we are going here. | |
1449 | - * | |
1450 | - * IMPORTANT : This function prevent to set and get data on the same | |
1451 | - * IOCTL and enforce the SET/GET convention. Not doing it would be | |
1452 | - * far too hairy... | |
1453 | - * If you need to set and get data at the same time, please don't use | |
1454 | - * a iw_handler but process it in your ioctl handler (i.e. use the | |
1455 | - * old driver API). | |
1456 | - */ | |
1457 | -static inline int rtnetlink_private_get(struct net_device * dev, | |
1458 | - struct iw_event * request, | |
1459 | - int request_len, | |
1460 | - iw_handler handler, | |
1461 | - char ** p_buf, | |
1462 | - int * p_len) | |
1463 | -{ | |
1464 | - const struct iw_priv_args * descr = NULL; | |
1465 | - unsigned int cmd; | |
1466 | - union iwreq_data * wrqu; | |
1467 | - int hdr_len; | |
1468 | - struct iw_request_info info; | |
1469 | - int extra_size = 0; | |
1470 | - int i; | |
1471 | - char * buffer = NULL; | |
1472 | - int buffer_size = 0; | |
1473 | - int ret = -EINVAL; | |
1474 | - | |
1475 | - /* Get the description of the Request */ | |
1476 | - cmd = request->cmd; | |
1477 | - for (i = 0; i < dev->wireless_handlers->num_private_args; i++) | |
1478 | - if (cmd == dev->wireless_handlers->private_args[i].cmd) { | |
1479 | - descr = &(dev->wireless_handlers->private_args[i]); | |
1480 | - break; | |
1481 | - } | |
1482 | - if (descr == NULL) | |
1483 | - return -EOPNOTSUPP; | |
1484 | - | |
1485 | -#ifdef WE_RTNETLINK_DEBUG | |
1486 | - printk(KERN_DEBUG "%s (WE.r) : Found private handler for 0x%04X\n", | |
1487 | - dev->name, cmd); | |
1488 | - printk(KERN_DEBUG "%s (WE.r) : Name %s, set %X, get %X\n", | |
1489 | - dev->name, descr->name, descr->set_args, descr->get_args); | |
1490 | -#endif /* WE_RTNETLINK_DEBUG */ | |
1491 | - | |
1492 | - /* Compute the max size of the get arguments */ | |
1493 | - extra_size = get_priv_size(descr->get_args); | |
1494 | - | |
1495 | - /* Does it fits in wrqu ? */ | |
1496 | - if ((descr->get_args & IW_PRIV_SIZE_FIXED) && | |
1497 | - (extra_size <= IFNAMSIZ)) { | |
1498 | - hdr_len = extra_size; | |
1499 | - extra_size = 0; | |
1500 | - } else { | |
1501 | - hdr_len = IW_EV_POINT_PK_LEN; | |
1502 | - } | |
1503 | - | |
1504 | - /* Check if wrqu is complete */ | |
1505 | - if (request_len < hdr_len) { | |
1506 | -#ifdef WE_RTNETLINK_DEBUG | |
1507 | - printk(KERN_DEBUG | |
1508 | - "%s (WE.r) : Wireless request too short (%d)\n", | |
1509 | - dev->name, request_len); | |
1510 | -#endif /* WE_RTNETLINK_DEBUG */ | |
1511 | - return -EINVAL; | |
1512 | - } | |
1513 | - | |
1514 | - /* Prepare the call */ | |
1515 | - info.cmd = cmd; | |
1516 | - info.flags = 0; | |
1517 | - | |
1518 | - /* Check if we have a pointer to user space data or not. */ | |
1519 | - if (extra_size == 0) { | |
1520 | - | |
1521 | - /* Create the kernel buffer that we will return. | |
1522 | - * It's at an offset to match the TYPE_POINT case... */ | |
1523 | - buffer_size = request_len + IW_EV_POINT_OFF; | |
1524 | - buffer = kmalloc(buffer_size, GFP_KERNEL); | |
1525 | - if (buffer == NULL) { | |
1526 | - return -ENOMEM; | |
1527 | - } | |
1528 | - /* Copy event data */ | |
1529 | - memcpy(buffer + IW_EV_POINT_OFF, request, request_len); | |
1530 | - /* Use our own copy of wrqu */ | |
1531 | - wrqu = (union iwreq_data *) (buffer + IW_EV_POINT_OFF | |
1532 | - + IW_EV_LCP_PK_LEN); | |
1533 | - | |
1534 | - /* No extra arguments. Trivial to handle */ | |
1535 | - ret = handler(dev, &info, wrqu, (char *) wrqu); | |
1536 | - | |
1537 | - } else { | |
1538 | - char * extra; | |
1539 | - | |
1540 | - /* Buffer for full reply */ | |
1541 | - buffer_size = extra_size + IW_EV_POINT_PK_LEN + IW_EV_POINT_OFF; | |
1542 | - | |
1543 | -#ifdef WE_RTNETLINK_DEBUG | |
1544 | - printk(KERN_DEBUG "%s (WE.r) : Malloc %d bytes (%d bytes)\n", | |
1545 | - dev->name, extra_size, buffer_size); | |
1546 | -#endif /* WE_RTNETLINK_DEBUG */ | |
1547 | - | |
1548 | - /* Create the kernel buffer that we will return */ | |
1549 | - buffer = kmalloc(buffer_size, GFP_KERNEL); | |
1550 | - if (buffer == NULL) { | |
1551 | - return -ENOMEM; | |
1552 | - } | |
1553 | - | |
1554 | - /* Put wrqu in the right place (just before extra). | |
1555 | - * Leave space for IWE header and dummy pointer... | |
1556 | - * Note that IW_EV_LCP_PK_LEN==4 bytes, so it's still aligned. | |
1557 | - */ | |
1558 | - memcpy(buffer + IW_EV_LCP_PK_LEN + IW_EV_POINT_OFF, | |
1559 | - ((char *) request) + IW_EV_LCP_PK_LEN, | |
1560 | - IW_EV_POINT_PK_LEN - IW_EV_LCP_PK_LEN); | |
1561 | - wrqu = (union iwreq_data *) (buffer + IW_EV_LCP_PK_LEN); | |
1562 | - | |
1563 | - /* Extra comes logically after that. Offset +12 bytes. */ | |
1564 | - extra = buffer + IW_EV_POINT_OFF + IW_EV_POINT_PK_LEN; | |
1565 | - | |
1566 | - /* Call the handler */ | |
1567 | - ret = handler(dev, &info, wrqu, extra); | |
1568 | - | |
1569 | - /* Adjust for the actual length if it's variable, | |
1570 | - * avoid leaking kernel bits outside. */ | |
1571 | - if (!(descr->get_args & IW_PRIV_SIZE_FIXED)) | |
1572 | - extra_size = adjust_priv_size(descr->get_args, wrqu); | |
1573 | - /* Re-adjust reply size */ | |
1574 | - request->len = extra_size + IW_EV_POINT_PK_LEN; | |
1575 | - | |
1576 | - /* Put the iwe header where it should, i.e. scrap the | |
1577 | - * dummy pointer. */ | |
1578 | - memcpy(buffer + IW_EV_POINT_OFF, request, IW_EV_LCP_PK_LEN); | |
1579 | - | |
1580 | -#ifdef WE_RTNETLINK_DEBUG | |
1581 | - printk(KERN_DEBUG "%s (WE.r) : Reply 0x%04X, hdr_len %d, tokens %d, extra_size %d, buffer_size %d\n", dev->name, cmd, hdr_len, wrqu->data.length, extra_size, buffer_size); | |
1582 | -#endif /* WE_RTNETLINK_DEBUG */ | |
1583 | - } | |
1584 | - | |
1585 | - /* Return the buffer to the caller */ | |
1586 | - if (!ret) { | |
1587 | - *p_buf = buffer; | |
1588 | - *p_len = request->len; | |
1589 | - } else { | |
1590 | - /* Cleanup */ | |
1591 | - if (buffer) | |
1592 | - kfree(buffer); | |
1593 | - } | |
1594 | - | |
1595 | - return ret; | |
1596 | -} | |
1597 | - | |
1598 | -/* ---------------------------------------------------------------- */ | |
1599 | -/* | |
1600 | - * Wrapper to call a private Wireless Extension SET handler. | |
1601 | - * Same as above... | |
1602 | - * It's not as nice and slimline as the standard wrapper. The cause | |
1603 | - * is struct iw_priv_args, which was not really designed for the | |
1604 | - * job we are going here. | |
1605 | - * | |
1606 | - * IMPORTANT : This function prevent to set and get data on the same | |
1607 | - * IOCTL and enforce the SET/GET convention. Not doing it would be | |
1608 | - * far too hairy... | |
1609 | - * If you need to set and get data at the same time, please don't use | |
1610 | - * a iw_handler but process it in your ioctl handler (i.e. use the | |
1611 | - * old driver API). | |
1612 | - */ | |
1613 | -static inline int rtnetlink_private_set(struct net_device * dev, | |
1614 | - struct iw_event * request, | |
1615 | - int request_len, | |
1616 | - iw_handler handler) | |
1617 | -{ | |
1618 | - const struct iw_priv_args * descr = NULL; | |
1619 | - unsigned int cmd; | |
1620 | - union iwreq_data * wrqu; | |
1621 | - union iwreq_data wrqu_point; | |
1622 | - int hdr_len; | |
1623 | - char * extra = NULL; | |
1624 | - int extra_size = 0; | |
1625 | - int offset = 0; /* For sub-ioctls */ | |
1626 | - struct iw_request_info info; | |
1627 | - int i; | |
1628 | - int ret = -EINVAL; | |
1629 | - | |
1630 | - /* Get the description of the Request */ | |
1631 | - cmd = request->cmd; | |
1632 | - for (i = 0; i < dev->wireless_handlers->num_private_args; i++) | |
1633 | - if (cmd == dev->wireless_handlers->private_args[i].cmd) { | |
1634 | - descr = &(dev->wireless_handlers->private_args[i]); | |
1635 | - break; | |
1636 | - } | |
1637 | - if (descr == NULL) | |
1638 | - return -EOPNOTSUPP; | |
1639 | - | |
1640 | -#ifdef WE_RTNETLINK_DEBUG | |
1641 | - printk(KERN_DEBUG "%s (WE.r) : Found private handler for 0x%04X\n", | |
1642 | - ifr->ifr_name, cmd); | |
1643 | - printk(KERN_DEBUG "%s (WE.r) : Name %s, set %X, get %X\n", | |
1644 | - dev->name, descr->name, descr->set_args, descr->get_args); | |
1645 | -#endif /* WE_RTNETLINK_DEBUG */ | |
1646 | - | |
1647 | - /* Compute the size of the set arguments */ | |
1648 | - /* Check for sub-ioctl handler */ | |
1649 | - if (descr->name[0] == '\0') | |
1650 | - /* Reserve one int for sub-ioctl index */ | |
1651 | - offset = sizeof(__u32); | |
1652 | - | |
1653 | - /* Size of set arguments */ | |
1654 | - extra_size = get_priv_size(descr->set_args); | |
1655 | - | |
1656 | - /* Does it fits in wrqu ? */ | |
1657 | - if ((descr->set_args & IW_PRIV_SIZE_FIXED) && | |
1658 | - (extra_size <= IFNAMSIZ)) { | |
1659 | - hdr_len = IW_EV_LCP_PK_LEN + extra_size; | |
1660 | - extra_size = 0; | |
1661 | - } else { | |
1662 | - hdr_len = IW_EV_POINT_PK_LEN; | |
1663 | - } | |
1664 | - | |
1665 | - /* Extract fixed header from request. This is properly aligned. */ | |
1666 | - wrqu = (union iwreq_data *) (((char *) request) + IW_EV_LCP_PK_LEN); | |
1667 | - | |
1668 | - /* Check if wrqu is complete */ | |
1669 | - if (request_len < hdr_len) { | |
1670 | -#ifdef WE_RTNETLINK_DEBUG | |
1671 | - printk(KERN_DEBUG | |
1672 | - "%s (WE.r) : Wireless request too short (%d)\n", | |
1673 | - dev->name, request_len); | |
1674 | -#endif /* WE_RTNETLINK_DEBUG */ | |
1675 | - return -EINVAL; | |
1676 | - } | |
1677 | - | |
1678 | - /* Prepare the call */ | |
1679 | - info.cmd = cmd; | |
1680 | - info.flags = 0; | |
1681 | - | |
1682 | - /* Check if we have a pointer to user space data or not. */ | |
1683 | - if (extra_size == 0) { | |
1684 | - | |
1685 | - /* No extra arguments. Trivial to handle */ | |
1686 | - ret = handler(dev, &info, wrqu, (char *) wrqu); | |
1687 | - | |
1688 | - } else { | |
1689 | - int extra_len; | |
1690 | - | |
1691 | - /* Put wrqu in the right place (skip pointer) */ | |
1692 | - memcpy(((char *) &wrqu_point) + IW_EV_POINT_OFF, | |
1693 | - wrqu, IW_EV_POINT_PK_LEN - IW_EV_LCP_PK_LEN); | |
1694 | - | |
1695 | - /* Does it fits within bounds ? */ | |
1696 | - if (wrqu_point.data.length > (descr->set_args & | |
1697 | - IW_PRIV_SIZE_MASK)) | |
1698 | - return -E2BIG; | |
1699 | - | |
1700 | - /* Real length of payload */ | |
1701 | - extra_len = adjust_priv_size(descr->set_args, &wrqu_point); | |
1702 | - | |
1703 | - /* Check if request is self consistent */ | |
1704 | - if ((request_len - hdr_len) < extra_len) { | |
1705 | -#ifdef WE_RTNETLINK_DEBUG | |
1706 | - printk(KERN_DEBUG "%s (WE.r) : Wireless request data too short (%d)\n", | |
1707 | - dev->name, extra_size); | |
1708 | -#endif /* WE_RTNETLINK_DEBUG */ | |
1709 | - return -EINVAL; | |
1710 | - } | |
1711 | - | |
1712 | -#ifdef WE_RTNETLINK_DEBUG | |
1713 | - printk(KERN_DEBUG "%s (WE.r) : Malloc %d bytes\n", | |
1714 | - dev->name, extra_size); | |
1715 | -#endif /* WE_RTNETLINK_DEBUG */ | |
1716 | - | |
1717 | - /* Always allocate for max space. Easier, and won't last | |
1718 | - * long... */ | |
1719 | - extra = kmalloc(extra_size, GFP_KERNEL); | |
1720 | - if (extra == NULL) | |
1721 | - return -ENOMEM; | |
1722 | - | |
1723 | - /* Copy extra in aligned buffer */ | |
1724 | - memcpy(extra, ((char *) request) + hdr_len, extra_len); | |
1725 | - | |
1726 | - /* Call the handler */ | |
1727 | - ret = handler(dev, &info, &wrqu_point, extra); | |
1728 | - | |
1729 | - /* Cleanup - I told you it wasn't that long ;-) */ | |
1730 | - kfree(extra); | |
1731 | - } | |
1732 | - | |
1733 | - /* Call commit handler if needed and defined */ | |
1734 | - if (ret == -EIWCOMMIT) | |
1735 | - ret = call_commit_handler(dev); | |
1736 | - | |
1737 | - return ret; | |
1738 | -} | |
1739 | - | |
1740 | -/* ---------------------------------------------------------------- */ | |
1741 | -/* | |
1742 | - * Main RtNetlink dispatcher. Called from the main networking code | |
1743 | - * (do_getlink() in net/core/rtnetlink.c). | |
1744 | - * Check the type of Request and call the appropriate wrapper... | |
1745 | - */ | |
1746 | -int wireless_rtnetlink_get(struct net_device * dev, | |
1747 | - char * data, | |
1748 | - int len, | |
1749 | - char ** p_buf, | |
1750 | - int * p_len) | |
1751 | -{ | |
1752 | - struct iw_event * request = (struct iw_event *) data; | |
1753 | - iw_handler handler; | |
1754 | - | |
1755 | - /* Check length */ | |
1756 | - if (len < IW_EV_LCP_PK_LEN) { | |
1757 | - printk(KERN_DEBUG "%s (WE.r) : RtNetlink request too short (%d)\n", | |
1758 | - dev->name, len); | |
1759 | - return -EINVAL; | |
1760 | - } | |
1761 | - | |
1762 | - /* ReCheck length (len may have padding) */ | |
1763 | - if (request->len > len) { | |
1764 | - printk(KERN_DEBUG "%s (WE.r) : RtNetlink request len invalid (%d-%d)\n", | |
1765 | - dev->name, request->len, len); | |
1766 | - return -EINVAL; | |
1767 | - } | |
1768 | - | |
1769 | - /* Only accept GET requests in here */ | |
1770 | - if (!IW_IS_GET(request->cmd)) | |
1771 | - return -EOPNOTSUPP; | |
1772 | - | |
1773 | - /* If command is `get the encoding parameters', check if | |
1774 | - * the user has the right to do it */ | |
1775 | - if (request->cmd == SIOCGIWENCODE || | |
1776 | - request->cmd == SIOCGIWENCODEEXT) { | |
1777 | - if (!capable(CAP_NET_ADMIN)) | |
1778 | - return -EPERM; | |
1779 | - } | |
1780 | - | |
1781 | - /* Special cases */ | |
1782 | - if (request->cmd == SIOCGIWSTATS) | |
1783 | - /* Get Wireless Stats */ | |
1784 | - return rtnetlink_standard_get(dev, | |
1785 | - request, | |
1786 | - request->len, | |
1787 | - &iw_handler_get_iwstats, | |
1788 | - p_buf, p_len); | |
1789 | - if (request->cmd == SIOCGIWPRIV) { | |
1790 | - /* Check if we have some wireless handlers defined */ | |
1791 | - if (dev->wireless_handlers == NULL) | |
1792 | - return -EOPNOTSUPP; | |
1793 | - /* Get Wireless Stats */ | |
1794 | - return rtnetlink_standard_get(dev, | |
1795 | - request, | |
1796 | - request->len, | |
1797 | - &iw_handler_get_private, | |
1798 | - p_buf, p_len); | |
1799 | - } | |
1800 | - | |
1801 | - /* Basic check */ | |
1802 | - if (!netif_device_present(dev)) | |
1803 | - return -ENODEV; | |
1804 | - | |
1805 | - /* Try to find the handler */ | |
1806 | - handler = get_handler(dev, request->cmd); | |
1807 | - if (handler != NULL) { | |
1808 | - /* Standard and private are not the same */ | |
1809 | - if (request->cmd < SIOCIWFIRSTPRIV) | |
1810 | - return rtnetlink_standard_get(dev, | |
1811 | - request, | |
1812 | - request->len, | |
1813 | - handler, | |
1814 | - p_buf, p_len); | |
1815 | - else | |
1816 | - return rtnetlink_private_get(dev, | |
1817 | - request, | |
1818 | - request->len, | |
1819 | - handler, | |
1820 | - p_buf, p_len); | |
1821 | - } | |
1822 | - | |
1823 | - return -EOPNOTSUPP; | |
1824 | -} | |
1825 | - | |
1826 | -/* ---------------------------------------------------------------- */ | |
1827 | -/* | |
1828 | - * Main RtNetlink dispatcher. Called from the main networking code | |
1829 | - * (do_setlink() in net/core/rtnetlink.c). | |
1830 | - * Check the type of Request and call the appropriate wrapper... | |
1831 | - */ | |
1832 | -int wireless_rtnetlink_set(struct net_device * dev, | |
1833 | - char * data, | |
1834 | - int len) | |
1835 | -{ | |
1836 | - struct iw_event * request = (struct iw_event *) data; | |
1837 | - iw_handler handler; | |
1838 | - | |
1839 | - /* Check length */ | |
1840 | - if (len < IW_EV_LCP_PK_LEN) { | |
1841 | - printk(KERN_DEBUG "%s (WE.r) : RtNetlink request too short (%d)\n", | |
1842 | - dev->name, len); | |
1843 | - return -EINVAL; | |
1844 | - } | |
1845 | - | |
1846 | - /* ReCheck length (len may have padding) */ | |
1847 | - if (request->len > len) { | |
1848 | - printk(KERN_DEBUG "%s (WE.r) : RtNetlink request len invalid (%d-%d)\n", | |
1849 | - dev->name, request->len, len); | |
1850 | - return -EINVAL; | |
1851 | - } | |
1852 | - | |
1853 | - /* Only accept SET requests in here */ | |
1854 | - if (!IW_IS_SET(request->cmd)) | |
1855 | - return -EOPNOTSUPP; | |
1856 | - | |
1857 | - /* Basic check */ | |
1858 | - if (!netif_device_present(dev)) | |
1859 | - return -ENODEV; | |
1860 | - | |
1861 | - /* New driver API : try to find the handler */ | |
1862 | - handler = get_handler(dev, request->cmd); | |
1863 | - if (handler != NULL) { | |
1864 | - /* Standard and private are not the same */ | |
1865 | - if (request->cmd < SIOCIWFIRSTPRIV) | |
1866 | - return rtnetlink_standard_set(dev, | |
1867 | - request, | |
1868 | - request->len, | |
1869 | - handler); | |
1870 | - else | |
1871 | - return rtnetlink_private_set(dev, | |
1872 | - request, | |
1873 | - request->len, | |
1874 | - handler); | |
1875 | - } | |
1876 | - | |
1877 | - return -EOPNOTSUPP; | |
1878 | -} | |
1879 | -#endif /* CONFIG_NET_WIRELESS_RTNETLINK */ | |
1880 | 1145 | |
1881 | 1146 | |
1882 | 1147 | /************************* EVENT PROCESSING *************************/ |
net/wireless/Kconfig
... | ... | @@ -14,14 +14,4 @@ |
14 | 14 | |
15 | 15 | Say N (if you can) unless you know you need wireless |
16 | 16 | extensions for external modules. |
17 | - | |
18 | -config NET_WIRELESS_RTNETLINK | |
19 | - bool "Wireless Extension API over RtNetlink" | |
20 | - depends on WIRELESS_EXT | |
21 | - ---help--- | |
22 | - Support the Wireless Extension API over the RtNetlink socket | |
23 | - in addition to the traditional ioctl interface (selected above). | |
24 | - | |
25 | - For now, few tools use this facility, but it might grow in the | |
26 | - future. The only downside is that it adds 4.5 kB to your kernel. |