util.c 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218
  1. /*
  2. * Wireless utility functions
  3. *
  4. * Copyright 2007-2009 Johannes Berg <johannes@sipsolutions.net>
  5. */
  6. #include <linux/bitops.h>
  7. #include <linux/etherdevice.h>
  8. #include <linux/slab.h>
  9. #include <linux/crc32.h>
  10. #include <net/cfg80211.h>
  11. #include <net/ip.h>
  12. #include "core.h"
  13. struct ieee80211_rate *
  14. ieee80211_get_response_rate(struct ieee80211_supported_band *sband,
  15. u32 basic_rates, int bitrate)
  16. {
  17. struct ieee80211_rate *result = &sband->bitrates[0];
  18. int i;
  19. for (i = 0; i < sband->n_bitrates; i++) {
  20. if (!(basic_rates & BIT(i)))
  21. continue;
  22. if (sband->bitrates[i].bitrate > bitrate)
  23. continue;
  24. result = &sband->bitrates[i];
  25. }
  26. return result;
  27. }
  28. EXPORT_SYMBOL(ieee80211_get_response_rate);
  29. int ieee80211_channel_to_frequency(int chan, enum ieee80211_band band)
  30. {
  31. /* see 802.11 17.3.8.3.2 and Annex J
  32. * there are overlapping channel numbers in 5GHz and 2GHz bands */
  33. if (band == IEEE80211_BAND_5GHZ) {
  34. if (chan >= 182 && chan <= 196)
  35. return 4000 + chan * 5;
  36. else
  37. return 5000 + chan * 5;
  38. } else { /* IEEE80211_BAND_2GHZ */
  39. if (chan == 14)
  40. return 2484;
  41. else if (chan < 14)
  42. return 2407 + chan * 5;
  43. else
  44. return 0; /* not supported */
  45. }
  46. }
  47. EXPORT_SYMBOL(ieee80211_channel_to_frequency);
  48. int ieee80211_frequency_to_channel(int freq)
  49. {
  50. /* see 802.11 17.3.8.3.2 and Annex J */
  51. if (freq == 2484)
  52. return 14;
  53. else if (freq < 2484)
  54. return (freq - 2407) / 5;
  55. else if (freq >= 4910 && freq <= 4980)
  56. return (freq - 4000) / 5;
  57. else
  58. return (freq - 5000) / 5;
  59. }
  60. EXPORT_SYMBOL(ieee80211_frequency_to_channel);
  61. struct ieee80211_channel *__ieee80211_get_channel(struct wiphy *wiphy,
  62. int freq)
  63. {
  64. enum ieee80211_band band;
  65. struct ieee80211_supported_band *sband;
  66. int i;
  67. for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
  68. sband = wiphy->bands[band];
  69. if (!sband)
  70. continue;
  71. for (i = 0; i < sband->n_channels; i++) {
  72. if (sband->channels[i].center_freq == freq)
  73. return &sband->channels[i];
  74. }
  75. }
  76. return NULL;
  77. }
  78. EXPORT_SYMBOL(__ieee80211_get_channel);
  79. static void set_mandatory_flags_band(struct ieee80211_supported_band *sband,
  80. enum ieee80211_band band)
  81. {
  82. int i, want;
  83. switch (band) {
  84. case IEEE80211_BAND_5GHZ:
  85. want = 3;
  86. for (i = 0; i < sband->n_bitrates; i++) {
  87. if (sband->bitrates[i].bitrate == 60 ||
  88. sband->bitrates[i].bitrate == 120 ||
  89. sband->bitrates[i].bitrate == 240) {
  90. sband->bitrates[i].flags |=
  91. IEEE80211_RATE_MANDATORY_A;
  92. want--;
  93. }
  94. }
  95. WARN_ON(want);
  96. break;
  97. case IEEE80211_BAND_2GHZ:
  98. want = 7;
  99. for (i = 0; i < sband->n_bitrates; i++) {
  100. if (sband->bitrates[i].bitrate == 10) {
  101. sband->bitrates[i].flags |=
  102. IEEE80211_RATE_MANDATORY_B |
  103. IEEE80211_RATE_MANDATORY_G;
  104. want--;
  105. }
  106. if (sband->bitrates[i].bitrate == 20 ||
  107. sband->bitrates[i].bitrate == 55 ||
  108. sband->bitrates[i].bitrate == 110 ||
  109. sband->bitrates[i].bitrate == 60 ||
  110. sband->bitrates[i].bitrate == 120 ||
  111. sband->bitrates[i].bitrate == 240) {
  112. sband->bitrates[i].flags |=
  113. IEEE80211_RATE_MANDATORY_G;
  114. want--;
  115. }
  116. if (sband->bitrates[i].bitrate != 10 &&
  117. sband->bitrates[i].bitrate != 20 &&
  118. sband->bitrates[i].bitrate != 55 &&
  119. sband->bitrates[i].bitrate != 110)
  120. sband->bitrates[i].flags |=
  121. IEEE80211_RATE_ERP_G;
  122. }
  123. WARN_ON(want != 0 && want != 3 && want != 6);
  124. break;
  125. case IEEE80211_NUM_BANDS:
  126. WARN_ON(1);
  127. break;
  128. }
  129. }
  130. void ieee80211_set_bitrate_flags(struct wiphy *wiphy)
  131. {
  132. enum ieee80211_band band;
  133. for (band = 0; band < IEEE80211_NUM_BANDS; band++)
  134. if (wiphy->bands[band])
  135. set_mandatory_flags_band(wiphy->bands[band], band);
  136. }
  137. bool cfg80211_supported_cipher_suite(struct wiphy *wiphy, u32 cipher)
  138. {
  139. int i;
  140. for (i = 0; i < wiphy->n_cipher_suites; i++)
  141. if (cipher == wiphy->cipher_suites[i])
  142. return true;
  143. return false;
  144. }
  145. int cfg80211_validate_key_settings(struct cfg80211_registered_device *rdev,
  146. struct key_params *params, int key_idx,
  147. bool pairwise, const u8 *mac_addr)
  148. {
  149. if (key_idx > 5)
  150. return -EINVAL;
  151. if (!pairwise && mac_addr && !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN))
  152. return -EINVAL;
  153. if (pairwise && !mac_addr)
  154. return -EINVAL;
  155. /*
  156. * Disallow pairwise keys with non-zero index unless it's WEP
  157. * or a vendor specific cipher (because current deployments use
  158. * pairwise WEP keys with non-zero indices and for vendor specific
  159. * ciphers this should be validated in the driver or hardware level
  160. * - but 802.11i clearly specifies to use zero)
  161. */
  162. if (pairwise && key_idx &&
  163. ((params->cipher == WLAN_CIPHER_SUITE_TKIP) ||
  164. (params->cipher == WLAN_CIPHER_SUITE_CCMP) ||
  165. (params->cipher == WLAN_CIPHER_SUITE_AES_CMAC)))
  166. return -EINVAL;
  167. switch (params->cipher) {
  168. case WLAN_CIPHER_SUITE_WEP40:
  169. if (params->key_len != WLAN_KEY_LEN_WEP40)
  170. return -EINVAL;
  171. break;
  172. case WLAN_CIPHER_SUITE_TKIP:
  173. if (params->key_len != WLAN_KEY_LEN_TKIP)
  174. return -EINVAL;
  175. break;
  176. case WLAN_CIPHER_SUITE_CCMP:
  177. if (params->key_len != WLAN_KEY_LEN_CCMP)
  178. return -EINVAL;
  179. break;
  180. case WLAN_CIPHER_SUITE_WEP104:
  181. if (params->key_len != WLAN_KEY_LEN_WEP104)
  182. return -EINVAL;
  183. break;
  184. case WLAN_CIPHER_SUITE_AES_CMAC:
  185. if (params->key_len != WLAN_KEY_LEN_AES_CMAC)
  186. return -EINVAL;
  187. break;
  188. default:
  189. /*
  190. * We don't know anything about this algorithm,
  191. * allow using it -- but the driver must check
  192. * all parameters! We still check below whether
  193. * or not the driver supports this algorithm,
  194. * of course.
  195. */
  196. break;
  197. }
  198. if (params->seq) {
  199. switch (params->cipher) {
  200. case WLAN_CIPHER_SUITE_WEP40:
  201. case WLAN_CIPHER_SUITE_WEP104:
  202. /* These ciphers do not use key sequence */
  203. return -EINVAL;
  204. case WLAN_CIPHER_SUITE_TKIP:
  205. case WLAN_CIPHER_SUITE_CCMP:
  206. case WLAN_CIPHER_SUITE_AES_CMAC:
  207. if (params->seq_len != 6)
  208. return -EINVAL;
  209. break;
  210. }
  211. }
  212. if (!cfg80211_supported_cipher_suite(&rdev->wiphy, params->cipher))
  213. return -EINVAL;
  214. return 0;
  215. }
  216. /* See IEEE 802.1H for LLC/SNAP encapsulation/decapsulation */
  217. /* Ethernet-II snap header (RFC1042 for most EtherTypes) */
  218. const unsigned char rfc1042_header[] __aligned(2) =
  219. { 0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00 };
  220. EXPORT_SYMBOL(rfc1042_header);
  221. /* Bridge-Tunnel header (for EtherTypes ETH_P_AARP and ETH_P_IPX) */
  222. const unsigned char bridge_tunnel_header[] __aligned(2) =
  223. { 0xaa, 0xaa, 0x03, 0x00, 0x00, 0xf8 };
  224. EXPORT_SYMBOL(bridge_tunnel_header);
  225. unsigned int __attribute_const__ ieee80211_hdrlen(__le16 fc)
  226. {
  227. unsigned int hdrlen = 24;
  228. if (ieee80211_is_data(fc)) {
  229. if (ieee80211_has_a4(fc))
  230. hdrlen = 30;
  231. if (ieee80211_is_data_qos(fc)) {
  232. hdrlen += IEEE80211_QOS_CTL_LEN;
  233. if (ieee80211_has_order(fc))
  234. hdrlen += IEEE80211_HT_CTL_LEN;
  235. }
  236. goto out;
  237. }
  238. if (ieee80211_is_ctl(fc)) {
  239. /*
  240. * ACK and CTS are 10 bytes, all others 16. To see how
  241. * to get this condition consider
  242. * subtype mask: 0b0000000011110000 (0x00F0)
  243. * ACK subtype: 0b0000000011010000 (0x00D0)
  244. * CTS subtype: 0b0000000011000000 (0x00C0)
  245. * bits that matter: ^^^ (0x00E0)
  246. * value of those: 0b0000000011000000 (0x00C0)
  247. */
  248. if ((fc & cpu_to_le16(0x00E0)) == cpu_to_le16(0x00C0))
  249. hdrlen = 10;
  250. else
  251. hdrlen = 16;
  252. }
  253. out:
  254. return hdrlen;
  255. }
  256. EXPORT_SYMBOL(ieee80211_hdrlen);
  257. unsigned int ieee80211_get_hdrlen_from_skb(const struct sk_buff *skb)
  258. {
  259. const struct ieee80211_hdr *hdr =
  260. (const struct ieee80211_hdr *)skb->data;
  261. unsigned int hdrlen;
  262. if (unlikely(skb->len < 10))
  263. return 0;
  264. hdrlen = ieee80211_hdrlen(hdr->frame_control);
  265. if (unlikely(hdrlen > skb->len))
  266. return 0;
  267. return hdrlen;
  268. }
  269. EXPORT_SYMBOL(ieee80211_get_hdrlen_from_skb);
  270. static int ieee80211_get_mesh_hdrlen(struct ieee80211s_hdr *meshhdr)
  271. {
  272. int ae = meshhdr->flags & MESH_FLAGS_AE;
  273. /* 7.1.3.5a.2 */
  274. switch (ae) {
  275. case 0:
  276. return 6;
  277. case MESH_FLAGS_AE_A4:
  278. return 12;
  279. case MESH_FLAGS_AE_A5_A6:
  280. return 18;
  281. case (MESH_FLAGS_AE_A4 | MESH_FLAGS_AE_A5_A6):
  282. return 24;
  283. default:
  284. return 6;
  285. }
  286. }
  287. int ieee80211_data_to_8023(struct sk_buff *skb, const u8 *addr,
  288. enum nl80211_iftype iftype)
  289. {
  290. struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
  291. u16 hdrlen, ethertype;
  292. u8 *payload;
  293. u8 dst[ETH_ALEN];
  294. u8 src[ETH_ALEN] __aligned(2);
  295. if (unlikely(!ieee80211_is_data_present(hdr->frame_control)))
  296. return -1;
  297. hdrlen = ieee80211_hdrlen(hdr->frame_control);
  298. /* convert IEEE 802.11 header + possible LLC headers into Ethernet
  299. * header
  300. * IEEE 802.11 address fields:
  301. * ToDS FromDS Addr1 Addr2 Addr3 Addr4
  302. * 0 0 DA SA BSSID n/a
  303. * 0 1 DA BSSID SA n/a
  304. * 1 0 BSSID SA DA n/a
  305. * 1 1 RA TA DA SA
  306. */
  307. memcpy(dst, ieee80211_get_DA(hdr), ETH_ALEN);
  308. memcpy(src, ieee80211_get_SA(hdr), ETH_ALEN);
  309. switch (hdr->frame_control &
  310. cpu_to_le16(IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS)) {
  311. case cpu_to_le16(IEEE80211_FCTL_TODS):
  312. if (unlikely(iftype != NL80211_IFTYPE_AP &&
  313. iftype != NL80211_IFTYPE_AP_VLAN &&
  314. iftype != NL80211_IFTYPE_P2P_GO))
  315. return -1;
  316. break;
  317. case cpu_to_le16(IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS):
  318. if (unlikely(iftype != NL80211_IFTYPE_WDS &&
  319. iftype != NL80211_IFTYPE_MESH_POINT &&
  320. iftype != NL80211_IFTYPE_AP_VLAN &&
  321. iftype != NL80211_IFTYPE_STATION))
  322. return -1;
  323. if (iftype == NL80211_IFTYPE_MESH_POINT) {
  324. struct ieee80211s_hdr *meshdr =
  325. (struct ieee80211s_hdr *) (skb->data + hdrlen);
  326. /* make sure meshdr->flags is on the linear part */
  327. if (!pskb_may_pull(skb, hdrlen + 1))
  328. return -1;
  329. if (meshdr->flags & MESH_FLAGS_AE_A5_A6) {
  330. skb_copy_bits(skb, hdrlen +
  331. offsetof(struct ieee80211s_hdr, eaddr1),
  332. dst, ETH_ALEN);
  333. skb_copy_bits(skb, hdrlen +
  334. offsetof(struct ieee80211s_hdr, eaddr2),
  335. src, ETH_ALEN);
  336. }
  337. hdrlen += ieee80211_get_mesh_hdrlen(meshdr);
  338. }
  339. break;
  340. case cpu_to_le16(IEEE80211_FCTL_FROMDS):
  341. if ((iftype != NL80211_IFTYPE_STATION &&
  342. iftype != NL80211_IFTYPE_P2P_CLIENT &&
  343. iftype != NL80211_IFTYPE_MESH_POINT) ||
  344. (is_multicast_ether_addr(dst) &&
  345. !compare_ether_addr(src, addr)))
  346. return -1;
  347. if (iftype == NL80211_IFTYPE_MESH_POINT) {
  348. struct ieee80211s_hdr *meshdr =
  349. (struct ieee80211s_hdr *) (skb->data + hdrlen);
  350. /* make sure meshdr->flags is on the linear part */
  351. if (!pskb_may_pull(skb, hdrlen + 1))
  352. return -1;
  353. if (meshdr->flags & MESH_FLAGS_AE_A4)
  354. skb_copy_bits(skb, hdrlen +
  355. offsetof(struct ieee80211s_hdr, eaddr1),
  356. src, ETH_ALEN);
  357. hdrlen += ieee80211_get_mesh_hdrlen(meshdr);
  358. }
  359. break;
  360. case cpu_to_le16(0):
  361. if (iftype != NL80211_IFTYPE_ADHOC &&
  362. iftype != NL80211_IFTYPE_STATION)
  363. return -1;
  364. break;
  365. }
  366. if (!pskb_may_pull(skb, hdrlen + 8))
  367. return -1;
  368. payload = skb->data + hdrlen;
  369. ethertype = (payload[6] << 8) | payload[7];
  370. if (likely((compare_ether_addr(payload, rfc1042_header) == 0 &&
  371. ethertype != ETH_P_AARP && ethertype != ETH_P_IPX) ||
  372. compare_ether_addr(payload, bridge_tunnel_header) == 0)) {
  373. /* remove RFC1042 or Bridge-Tunnel encapsulation and
  374. * replace EtherType */
  375. skb_pull(skb, hdrlen + 6);
  376. memcpy(skb_push(skb, ETH_ALEN), src, ETH_ALEN);
  377. memcpy(skb_push(skb, ETH_ALEN), dst, ETH_ALEN);
  378. } else {
  379. struct ethhdr *ehdr;
  380. __be16 len;
  381. skb_pull(skb, hdrlen);
  382. len = htons(skb->len);
  383. ehdr = (struct ethhdr *) skb_push(skb, sizeof(struct ethhdr));
  384. memcpy(ehdr->h_dest, dst, ETH_ALEN);
  385. memcpy(ehdr->h_source, src, ETH_ALEN);
  386. ehdr->h_proto = len;
  387. }
  388. return 0;
  389. }
  390. EXPORT_SYMBOL(ieee80211_data_to_8023);
  391. int ieee80211_data_from_8023(struct sk_buff *skb, const u8 *addr,
  392. enum nl80211_iftype iftype, u8 *bssid, bool qos)
  393. {
  394. struct ieee80211_hdr hdr;
  395. u16 hdrlen, ethertype;
  396. __le16 fc;
  397. const u8 *encaps_data;
  398. int encaps_len, skip_header_bytes;
  399. int nh_pos, h_pos;
  400. int head_need;
  401. if (unlikely(skb->len < ETH_HLEN))
  402. return -EINVAL;
  403. nh_pos = skb_network_header(skb) - skb->data;
  404. h_pos = skb_transport_header(skb) - skb->data;
  405. /* convert Ethernet header to proper 802.11 header (based on
  406. * operation mode) */
  407. ethertype = (skb->data[12] << 8) | skb->data[13];
  408. fc = cpu_to_le16(IEEE80211_FTYPE_DATA | IEEE80211_STYPE_DATA);
  409. switch (iftype) {
  410. case NL80211_IFTYPE_AP:
  411. case NL80211_IFTYPE_AP_VLAN:
  412. case NL80211_IFTYPE_P2P_GO:
  413. fc |= cpu_to_le16(IEEE80211_FCTL_FROMDS);
  414. /* DA BSSID SA */
  415. memcpy(hdr.addr1, skb->data, ETH_ALEN);
  416. memcpy(hdr.addr2, addr, ETH_ALEN);
  417. memcpy(hdr.addr3, skb->data + ETH_ALEN, ETH_ALEN);
  418. hdrlen = 24;
  419. break;
  420. case NL80211_IFTYPE_STATION:
  421. case NL80211_IFTYPE_P2P_CLIENT:
  422. fc |= cpu_to_le16(IEEE80211_FCTL_TODS);
  423. /* BSSID SA DA */
  424. memcpy(hdr.addr1, bssid, ETH_ALEN);
  425. memcpy(hdr.addr2, skb->data + ETH_ALEN, ETH_ALEN);
  426. memcpy(hdr.addr3, skb->data, ETH_ALEN);
  427. hdrlen = 24;
  428. break;
  429. case NL80211_IFTYPE_ADHOC:
  430. /* DA SA BSSID */
  431. memcpy(hdr.addr1, skb->data, ETH_ALEN);
  432. memcpy(hdr.addr2, skb->data + ETH_ALEN, ETH_ALEN);
  433. memcpy(hdr.addr3, bssid, ETH_ALEN);
  434. hdrlen = 24;
  435. break;
  436. default:
  437. return -EOPNOTSUPP;
  438. }
  439. if (qos) {
  440. fc |= cpu_to_le16(IEEE80211_STYPE_QOS_DATA);
  441. hdrlen += 2;
  442. }
  443. hdr.frame_control = fc;
  444. hdr.duration_id = 0;
  445. hdr.seq_ctrl = 0;
  446. skip_header_bytes = ETH_HLEN;
  447. if (ethertype == ETH_P_AARP || ethertype == ETH_P_IPX) {
  448. encaps_data = bridge_tunnel_header;
  449. encaps_len = sizeof(bridge_tunnel_header);
  450. skip_header_bytes -= 2;
  451. } else if (ethertype > 0x600) {
  452. encaps_data = rfc1042_header;
  453. encaps_len = sizeof(rfc1042_header);
  454. skip_header_bytes -= 2;
  455. } else {
  456. encaps_data = NULL;
  457. encaps_len = 0;
  458. }
  459. skb_pull(skb, skip_header_bytes);
  460. nh_pos -= skip_header_bytes;
  461. h_pos -= skip_header_bytes;
  462. head_need = hdrlen + encaps_len - skb_headroom(skb);
  463. if (head_need > 0 || skb_cloned(skb)) {
  464. head_need = max(head_need, 0);
  465. if (head_need)
  466. skb_orphan(skb);
  467. if (pskb_expand_head(skb, head_need, 0, GFP_ATOMIC))
  468. return -ENOMEM;
  469. skb->truesize += head_need;
  470. }
  471. if (encaps_data) {
  472. memcpy(skb_push(skb, encaps_len), encaps_data, encaps_len);
  473. nh_pos += encaps_len;
  474. h_pos += encaps_len;
  475. }
  476. memcpy(skb_push(skb, hdrlen), &hdr, hdrlen);
  477. nh_pos += hdrlen;
  478. h_pos += hdrlen;
  479. /* Update skb pointers to various headers since this modified frame
  480. * is going to go through Linux networking code that may potentially
  481. * need things like pointer to IP header. */
  482. skb_set_mac_header(skb, 0);
  483. skb_set_network_header(skb, nh_pos);
  484. skb_set_transport_header(skb, h_pos);
  485. return 0;
  486. }
  487. EXPORT_SYMBOL(ieee80211_data_from_8023);
  488. void ieee80211_amsdu_to_8023s(struct sk_buff *skb, struct sk_buff_head *list,
  489. const u8 *addr, enum nl80211_iftype iftype,
  490. const unsigned int extra_headroom,
  491. bool has_80211_header)
  492. {
  493. struct sk_buff *frame = NULL;
  494. u16 ethertype;
  495. u8 *payload;
  496. const struct ethhdr *eth;
  497. int remaining, err;
  498. u8 dst[ETH_ALEN], src[ETH_ALEN];
  499. if (has_80211_header) {
  500. err = ieee80211_data_to_8023(skb, addr, iftype);
  501. if (err)
  502. goto out;
  503. /* skip the wrapping header */
  504. eth = (struct ethhdr *) skb_pull(skb, sizeof(struct ethhdr));
  505. if (!eth)
  506. goto out;
  507. } else {
  508. eth = (struct ethhdr *) skb->data;
  509. }
  510. while (skb != frame) {
  511. u8 padding;
  512. __be16 len = eth->h_proto;
  513. unsigned int subframe_len = sizeof(struct ethhdr) + ntohs(len);
  514. remaining = skb->len;
  515. memcpy(dst, eth->h_dest, ETH_ALEN);
  516. memcpy(src, eth->h_source, ETH_ALEN);
  517. padding = (4 - subframe_len) & 0x3;
  518. /* the last MSDU has no padding */
  519. if (subframe_len > remaining)
  520. goto purge;
  521. skb_pull(skb, sizeof(struct ethhdr));
  522. /* reuse skb for the last subframe */
  523. if (remaining <= subframe_len + padding)
  524. frame = skb;
  525. else {
  526. unsigned int hlen = ALIGN(extra_headroom, 4);
  527. /*
  528. * Allocate and reserve two bytes more for payload
  529. * alignment since sizeof(struct ethhdr) is 14.
  530. */
  531. frame = dev_alloc_skb(hlen + subframe_len + 2);
  532. if (!frame)
  533. goto purge;
  534. skb_reserve(frame, hlen + sizeof(struct ethhdr) + 2);
  535. memcpy(skb_put(frame, ntohs(len)), skb->data,
  536. ntohs(len));
  537. eth = (struct ethhdr *)skb_pull(skb, ntohs(len) +
  538. padding);
  539. if (!eth) {
  540. dev_kfree_skb(frame);
  541. goto purge;
  542. }
  543. }
  544. skb_reset_network_header(frame);
  545. frame->dev = skb->dev;
  546. frame->priority = skb->priority;
  547. payload = frame->data;
  548. ethertype = (payload[6] << 8) | payload[7];
  549. if (likely((compare_ether_addr(payload, rfc1042_header) == 0 &&
  550. ethertype != ETH_P_AARP && ethertype != ETH_P_IPX) ||
  551. compare_ether_addr(payload,
  552. bridge_tunnel_header) == 0)) {
  553. /* remove RFC1042 or Bridge-Tunnel
  554. * encapsulation and replace EtherType */
  555. skb_pull(frame, 6);
  556. memcpy(skb_push(frame, ETH_ALEN), src, ETH_ALEN);
  557. memcpy(skb_push(frame, ETH_ALEN), dst, ETH_ALEN);
  558. } else {
  559. memcpy(skb_push(frame, sizeof(__be16)), &len,
  560. sizeof(__be16));
  561. memcpy(skb_push(frame, ETH_ALEN), src, ETH_ALEN);
  562. memcpy(skb_push(frame, ETH_ALEN), dst, ETH_ALEN);
  563. }
  564. __skb_queue_tail(list, frame);
  565. }
  566. return;
  567. purge:
  568. __skb_queue_purge(list);
  569. out:
  570. dev_kfree_skb(skb);
  571. }
  572. EXPORT_SYMBOL(ieee80211_amsdu_to_8023s);
  573. /* Given a data frame determine the 802.1p/1d tag to use. */
  574. unsigned int cfg80211_classify8021d(struct sk_buff *skb)
  575. {
  576. unsigned int dscp;
  577. /* skb->priority values from 256->263 are magic values to
  578. * directly indicate a specific 802.1d priority. This is used
  579. * to allow 802.1d priority to be passed directly in from VLAN
  580. * tags, etc.
  581. */
  582. if (skb->priority >= 256 && skb->priority <= 263)
  583. return skb->priority - 256;
  584. switch (skb->protocol) {
  585. case htons(ETH_P_IP):
  586. dscp = ip_hdr(skb)->tos & 0xfc;
  587. break;
  588. default:
  589. return 0;
  590. }
  591. return dscp >> 5;
  592. }
  593. EXPORT_SYMBOL(cfg80211_classify8021d);
  594. const u8 *ieee80211_bss_get_ie(struct cfg80211_bss *bss, u8 ie)
  595. {
  596. u8 *end, *pos;
  597. pos = bss->information_elements;
  598. if (pos == NULL)
  599. return NULL;
  600. end = pos + bss->len_information_elements;
  601. while (pos + 1 < end) {
  602. if (pos + 2 + pos[1] > end)
  603. break;
  604. if (pos[0] == ie)
  605. return pos;
  606. pos += 2 + pos[1];
  607. }
  608. return NULL;
  609. }
  610. EXPORT_SYMBOL(ieee80211_bss_get_ie);
  611. void cfg80211_upload_connect_keys(struct wireless_dev *wdev)
  612. {
  613. struct cfg80211_registered_device *rdev = wiphy_to_dev(wdev->wiphy);
  614. struct net_device *dev = wdev->netdev;
  615. int i;
  616. if (!wdev->connect_keys)
  617. return;
  618. for (i = 0; i < 6; i++) {
  619. if (!wdev->connect_keys->params[i].cipher)
  620. continue;
  621. if (rdev->ops->add_key(wdev->wiphy, dev, i, false, NULL,
  622. &wdev->connect_keys->params[i])) {
  623. netdev_err(dev, "failed to set key %d\n", i);
  624. continue;
  625. }
  626. if (wdev->connect_keys->def == i)
  627. if (rdev->ops->set_default_key(wdev->wiphy, dev,
  628. i, true, true)) {
  629. netdev_err(dev, "failed to set defkey %d\n", i);
  630. continue;
  631. }
  632. if (wdev->connect_keys->defmgmt == i)
  633. if (rdev->ops->set_default_mgmt_key(wdev->wiphy, dev, i))
  634. netdev_err(dev, "failed to set mgtdef %d\n", i);
  635. }
  636. kfree(wdev->connect_keys);
  637. wdev->connect_keys = NULL;
  638. }
  639. static void cfg80211_process_wdev_events(struct wireless_dev *wdev)
  640. {
  641. struct cfg80211_event *ev;
  642. unsigned long flags;
  643. const u8 *bssid = NULL;
  644. spin_lock_irqsave(&wdev->event_lock, flags);
  645. while (!list_empty(&wdev->event_list)) {
  646. ev = list_first_entry(&wdev->event_list,
  647. struct cfg80211_event, list);
  648. list_del(&ev->list);
  649. spin_unlock_irqrestore(&wdev->event_lock, flags);
  650. wdev_lock(wdev);
  651. switch (ev->type) {
  652. case EVENT_CONNECT_RESULT:
  653. if (!is_zero_ether_addr(ev->cr.bssid))
  654. bssid = ev->cr.bssid;
  655. __cfg80211_connect_result(
  656. wdev->netdev, bssid,
  657. ev->cr.req_ie, ev->cr.req_ie_len,
  658. ev->cr.resp_ie, ev->cr.resp_ie_len,
  659. ev->cr.status,
  660. ev->cr.status == WLAN_STATUS_SUCCESS,
  661. NULL);
  662. break;
  663. case EVENT_ROAMED:
  664. __cfg80211_roamed(wdev, ev->rm.channel, ev->rm.bssid,
  665. ev->rm.req_ie, ev->rm.req_ie_len,
  666. ev->rm.resp_ie, ev->rm.resp_ie_len);
  667. break;
  668. case EVENT_DISCONNECTED:
  669. __cfg80211_disconnected(wdev->netdev,
  670. ev->dc.ie, ev->dc.ie_len,
  671. ev->dc.reason, true);
  672. break;
  673. case EVENT_IBSS_JOINED:
  674. __cfg80211_ibss_joined(wdev->netdev, ev->ij.bssid);
  675. break;
  676. }
  677. wdev_unlock(wdev);
  678. kfree(ev);
  679. spin_lock_irqsave(&wdev->event_lock, flags);
  680. }
  681. spin_unlock_irqrestore(&wdev->event_lock, flags);
  682. }
  683. void cfg80211_process_rdev_events(struct cfg80211_registered_device *rdev)
  684. {
  685. struct wireless_dev *wdev;
  686. ASSERT_RTNL();
  687. ASSERT_RDEV_LOCK(rdev);
  688. mutex_lock(&rdev->devlist_mtx);
  689. list_for_each_entry(wdev, &rdev->netdev_list, list)
  690. cfg80211_process_wdev_events(wdev);
  691. mutex_unlock(&rdev->devlist_mtx);
  692. }
  693. int cfg80211_change_iface(struct cfg80211_registered_device *rdev,
  694. struct net_device *dev, enum nl80211_iftype ntype,
  695. u32 *flags, struct vif_params *params)
  696. {
  697. int err;
  698. enum nl80211_iftype otype = dev->ieee80211_ptr->iftype;
  699. ASSERT_RDEV_LOCK(rdev);
  700. /* don't support changing VLANs, you just re-create them */
  701. if (otype == NL80211_IFTYPE_AP_VLAN)
  702. return -EOPNOTSUPP;
  703. if (!rdev->ops->change_virtual_intf ||
  704. !(rdev->wiphy.interface_modes & (1 << ntype)))
  705. return -EOPNOTSUPP;
  706. /* if it's part of a bridge, reject changing type to station/ibss */
  707. if ((dev->priv_flags & IFF_BRIDGE_PORT) &&
  708. (ntype == NL80211_IFTYPE_ADHOC ||
  709. ntype == NL80211_IFTYPE_STATION ||
  710. ntype == NL80211_IFTYPE_P2P_CLIENT))
  711. return -EBUSY;
  712. if (ntype != otype) {
  713. err = cfg80211_can_change_interface(rdev, dev->ieee80211_ptr,
  714. ntype);
  715. if (err)
  716. return err;
  717. dev->ieee80211_ptr->use_4addr = false;
  718. dev->ieee80211_ptr->mesh_id_up_len = 0;
  719. switch (otype) {
  720. case NL80211_IFTYPE_ADHOC:
  721. cfg80211_leave_ibss(rdev, dev, false);
  722. break;
  723. case NL80211_IFTYPE_STATION:
  724. case NL80211_IFTYPE_P2P_CLIENT:
  725. cfg80211_disconnect(rdev, dev,
  726. WLAN_REASON_DEAUTH_LEAVING, true);
  727. break;
  728. case NL80211_IFTYPE_MESH_POINT:
  729. /* mesh should be handled? */
  730. break;
  731. default:
  732. break;
  733. }
  734. cfg80211_process_rdev_events(rdev);
  735. }
  736. err = rdev->ops->change_virtual_intf(&rdev->wiphy, dev,
  737. ntype, flags, params);
  738. WARN_ON(!err && dev->ieee80211_ptr->iftype != ntype);
  739. if (!err && params && params->use_4addr != -1)
  740. dev->ieee80211_ptr->use_4addr = params->use_4addr;
  741. if (!err) {
  742. dev->priv_flags &= ~IFF_DONT_BRIDGE;
  743. switch (ntype) {
  744. case NL80211_IFTYPE_STATION:
  745. if (dev->ieee80211_ptr->use_4addr)
  746. break;
  747. /* fall through */
  748. case NL80211_IFTYPE_P2P_CLIENT:
  749. case NL80211_IFTYPE_ADHOC:
  750. dev->priv_flags |= IFF_DONT_BRIDGE;
  751. break;
  752. case NL80211_IFTYPE_P2P_GO:
  753. case NL80211_IFTYPE_AP:
  754. case NL80211_IFTYPE_AP_VLAN:
  755. case NL80211_IFTYPE_WDS:
  756. case NL80211_IFTYPE_MESH_POINT:
  757. /* bridging OK */
  758. break;
  759. case NL80211_IFTYPE_MONITOR:
  760. /* monitor can't bridge anyway */
  761. break;
  762. case NL80211_IFTYPE_UNSPECIFIED:
  763. case NUM_NL80211_IFTYPES:
  764. /* not happening */
  765. break;
  766. }
  767. }
  768. return err;
  769. }
  770. u16 cfg80211_calculate_bitrate(struct rate_info *rate)
  771. {
  772. int modulation, streams, bitrate;
  773. if (!(rate->flags & RATE_INFO_FLAGS_MCS))
  774. return rate->legacy;
  775. /* the formula below does only work for MCS values smaller than 32 */
  776. if (rate->mcs >= 32)
  777. return 0;
  778. modulation = rate->mcs & 7;
  779. streams = (rate->mcs >> 3) + 1;
  780. bitrate = (rate->flags & RATE_INFO_FLAGS_40_MHZ_WIDTH) ?
  781. 13500000 : 6500000;
  782. if (modulation < 4)
  783. bitrate *= (modulation + 1);
  784. else if (modulation == 4)
  785. bitrate *= (modulation + 2);
  786. else
  787. bitrate *= (modulation + 3);
  788. bitrate *= streams;
  789. if (rate->flags & RATE_INFO_FLAGS_SHORT_GI)
  790. bitrate = (bitrate / 9) * 10;
  791. /* do NOT round down here */
  792. return (bitrate + 50000) / 100000;
  793. }
  794. int cfg80211_validate_beacon_int(struct cfg80211_registered_device *rdev,
  795. u32 beacon_int)
  796. {
  797. struct wireless_dev *wdev;
  798. int res = 0;
  799. if (!beacon_int)
  800. return -EINVAL;
  801. mutex_lock(&rdev->devlist_mtx);
  802. list_for_each_entry(wdev, &rdev->netdev_list, list) {
  803. if (!wdev->beacon_interval)
  804. continue;
  805. if (wdev->beacon_interval != beacon_int) {
  806. res = -EINVAL;
  807. break;
  808. }
  809. }
  810. mutex_unlock(&rdev->devlist_mtx);
  811. return res;
  812. }
  813. int cfg80211_can_change_interface(struct cfg80211_registered_device *rdev,
  814. struct wireless_dev *wdev,
  815. enum nl80211_iftype iftype)
  816. {
  817. struct wireless_dev *wdev_iter;
  818. int num[NUM_NL80211_IFTYPES];
  819. int total = 1;
  820. int i, j;
  821. ASSERT_RTNL();
  822. /* Always allow software iftypes */
  823. if (rdev->wiphy.software_iftypes & BIT(iftype))
  824. return 0;
  825. /*
  826. * Drivers will gradually all set this flag, until all
  827. * have it we only enforce for those that set it.
  828. */
  829. if (!(rdev->wiphy.flags & WIPHY_FLAG_ENFORCE_COMBINATIONS))
  830. return 0;
  831. memset(num, 0, sizeof(num));
  832. num[iftype] = 1;
  833. mutex_lock(&rdev->devlist_mtx);
  834. list_for_each_entry(wdev_iter, &rdev->netdev_list, list) {
  835. if (wdev_iter == wdev)
  836. continue;
  837. if (!netif_running(wdev_iter->netdev))
  838. continue;
  839. if (rdev->wiphy.software_iftypes & BIT(wdev_iter->iftype))
  840. continue;
  841. num[wdev_iter->iftype]++;
  842. total++;
  843. }
  844. mutex_unlock(&rdev->devlist_mtx);
  845. for (i = 0; i < rdev->wiphy.n_iface_combinations; i++) {
  846. const struct ieee80211_iface_combination *c;
  847. struct ieee80211_iface_limit *limits;
  848. c = &rdev->wiphy.iface_combinations[i];
  849. limits = kmemdup(c->limits, sizeof(limits[0]) * c->n_limits,
  850. GFP_KERNEL);
  851. if (!limits)
  852. return -ENOMEM;
  853. if (total > c->max_interfaces)
  854. goto cont;
  855. for (iftype = 0; iftype < NUM_NL80211_IFTYPES; iftype++) {
  856. if (rdev->wiphy.software_iftypes & BIT(iftype))
  857. continue;
  858. for (j = 0; j < c->n_limits; j++) {
  859. if (!(limits[j].types & iftype))
  860. continue;
  861. if (limits[j].max < num[iftype])
  862. goto cont;
  863. limits[j].max -= num[iftype];
  864. }
  865. }
  866. /* yay, it fits */
  867. kfree(limits);
  868. return 0;
  869. cont:
  870. kfree(limits);
  871. }
  872. return -EBUSY;
  873. }
  874. int ieee80211_get_ratemask(struct ieee80211_supported_band *sband,
  875. const u8 *rates, unsigned int n_rates,
  876. u32 *mask)
  877. {
  878. int i, j;
  879. if (!sband)
  880. return -EINVAL;
  881. if (n_rates == 0 || n_rates > NL80211_MAX_SUPP_RATES)
  882. return -EINVAL;
  883. *mask = 0;
  884. for (i = 0; i < n_rates; i++) {
  885. int rate = (rates[i] & 0x7f) * 5;
  886. bool found = false;
  887. for (j = 0; j < sband->n_bitrates; j++) {
  888. if (sband->bitrates[j].bitrate == rate) {
  889. found = true;
  890. *mask |= BIT(j);
  891. break;
  892. }
  893. }
  894. if (!found)
  895. return -EINVAL;
  896. }
  897. /*
  898. * mask must have at least one bit set here since we
  899. * didn't accept a 0-length rates array nor allowed
  900. * entries in the array that didn't exist
  901. */
  902. return 0;
  903. }
  904. u32 ieee802_11_parse_elems_crc(u8 *start, size_t len,
  905. struct ieee802_11_elems *elems,
  906. u64 filter, u32 crc)
  907. {
  908. size_t left = len;
  909. u8 *pos = start;
  910. bool calc_crc = filter != 0;
  911. memset(elems, 0, sizeof(*elems));
  912. elems->ie_start = start;
  913. elems->total_len = len;
  914. while (left >= 2) {
  915. u8 id, elen;
  916. id = *pos++;
  917. elen = *pos++;
  918. left -= 2;
  919. if (elen > left)
  920. break;
  921. if (calc_crc && id < 64 && (filter & (1ULL << id)))
  922. crc = crc32_be(crc, pos - 2, elen + 2);
  923. switch (id) {
  924. case WLAN_EID_SSID:
  925. elems->ssid = pos;
  926. elems->ssid_len = elen;
  927. break;
  928. case WLAN_EID_SUPP_RATES:
  929. elems->supp_rates = pos;
  930. elems->supp_rates_len = elen;
  931. break;
  932. case WLAN_EID_FH_PARAMS:
  933. elems->fh_params = pos;
  934. elems->fh_params_len = elen;
  935. break;
  936. case WLAN_EID_DS_PARAMS:
  937. elems->ds_params = pos;
  938. elems->ds_params_len = elen;
  939. break;
  940. case WLAN_EID_CF_PARAMS:
  941. elems->cf_params = pos;
  942. elems->cf_params_len = elen;
  943. break;
  944. case WLAN_EID_TIM:
  945. if (elen >= sizeof(struct ieee80211_tim_ie)) {
  946. elems->tim = (void *)pos;
  947. elems->tim_len = elen;
  948. }
  949. break;
  950. case WLAN_EID_IBSS_PARAMS:
  951. elems->ibss_params = pos;
  952. elems->ibss_params_len = elen;
  953. break;
  954. case WLAN_EID_CHALLENGE:
  955. elems->challenge = pos;
  956. elems->challenge_len = elen;
  957. break;
  958. case WLAN_EID_VENDOR_SPECIFIC:
  959. if (elen >= 4 && pos[0] == 0x00 && pos[1] == 0x50 &&
  960. pos[2] == 0xf2) {
  961. /* Microsoft OUI (00:50:F2) */
  962. if (calc_crc)
  963. crc = crc32_be(crc, pos - 2, elen + 2);
  964. if (pos[3] == 1) {
  965. /* OUI Type 1 - WPA IE */
  966. elems->wpa = pos;
  967. elems->wpa_len = elen;
  968. } else if (elen >= 5 && pos[3] == 2) {
  969. /* OUI Type 2 - WMM IE */
  970. if (pos[4] == 0) {
  971. elems->wmm_info = pos;
  972. elems->wmm_info_len = elen;
  973. } else if (pos[4] == 1) {
  974. elems->wmm_param = pos;
  975. elems->wmm_param_len = elen;
  976. }
  977. }
  978. }
  979. break;
  980. case WLAN_EID_RSN:
  981. elems->rsn = pos;
  982. elems->rsn_len = elen;
  983. break;
  984. case WLAN_EID_ERP_INFO:
  985. elems->erp_info = pos;
  986. elems->erp_info_len = elen;
  987. break;
  988. case WLAN_EID_EXT_SUPP_RATES:
  989. elems->ext_supp_rates = pos;
  990. elems->ext_supp_rates_len = elen;
  991. break;
  992. case WLAN_EID_HT_CAPABILITY:
  993. if (elen >= sizeof(struct ieee80211_ht_cap))
  994. elems->ht_cap_elem = (void *)pos;
  995. break;
  996. case WLAN_EID_HT_INFORMATION:
  997. if (elen >= sizeof(struct ieee80211_ht_info))
  998. elems->ht_info_elem = (void *)pos;
  999. break;
  1000. case WLAN_EID_MESH_ID:
  1001. elems->mesh_id = pos;
  1002. elems->mesh_id_len = elen;
  1003. break;
  1004. case WLAN_EID_MESH_CONFIG:
  1005. if (elen >= sizeof(struct ieee80211_meshconf_ie))
  1006. elems->mesh_config = (void *)pos;
  1007. break;
  1008. case WLAN_EID_PEER_MGMT:
  1009. elems->peering = pos;
  1010. elems->peering_len = elen;
  1011. break;
  1012. case WLAN_EID_PREQ:
  1013. elems->preq = pos;
  1014. elems->preq_len = elen;
  1015. break;
  1016. case WLAN_EID_PREP:
  1017. elems->prep = pos;
  1018. elems->prep_len = elen;
  1019. break;
  1020. case WLAN_EID_PERR:
  1021. elems->perr = pos;
  1022. elems->perr_len = elen;
  1023. break;
  1024. case WLAN_EID_RANN:
  1025. if (elen >= sizeof(struct ieee80211_rann_ie))
  1026. elems->rann = (void *)pos;
  1027. break;
  1028. case WLAN_EID_CHANNEL_SWITCH:
  1029. elems->ch_switch_elem = pos;
  1030. elems->ch_switch_elem_len = elen;
  1031. break;
  1032. case WLAN_EID_QUIET:
  1033. if (!elems->quiet_elem) {
  1034. elems->quiet_elem = pos;
  1035. elems->quiet_elem_len = elen;
  1036. }
  1037. elems->num_of_quiet_elem++;
  1038. break;
  1039. case WLAN_EID_COUNTRY:
  1040. elems->country_elem = pos;
  1041. elems->country_elem_len = elen;
  1042. break;
  1043. case WLAN_EID_PWR_CONSTRAINT:
  1044. elems->pwr_constr_elem = pos;
  1045. elems->pwr_constr_elem_len = elen;
  1046. break;
  1047. case WLAN_EID_TIMEOUT_INTERVAL:
  1048. elems->timeout_int = pos;
  1049. elems->timeout_int_len = elen;
  1050. break;
  1051. default:
  1052. break;
  1053. }
  1054. left -= elen;
  1055. pos += elen;
  1056. }
  1057. return crc;
  1058. }
  1059. EXPORT_SYMBOL(ieee802_11_parse_elems_crc);