cfg.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672
  1. /*
  2. * mac80211 configuration hooks for cfg80211
  3. *
  4. * Copyright 2006, 2007 Johannes Berg <johannes@sipsolutions.net>
  5. *
  6. * This file is GPLv2 as found in COPYING.
  7. */
  8. #include <linux/ieee80211.h>
  9. #include <linux/nl80211.h>
  10. #include <linux/rtnetlink.h>
  11. #include <net/net_namespace.h>
  12. #include <linux/rcupdate.h>
  13. #include <net/cfg80211.h>
  14. #include "ieee80211_i.h"
  15. #include "cfg.h"
  16. #include "ieee80211_rate.h"
  17. static enum ieee80211_if_types
  18. nl80211_type_to_mac80211_type(enum nl80211_iftype type)
  19. {
  20. switch (type) {
  21. case NL80211_IFTYPE_UNSPECIFIED:
  22. return IEEE80211_IF_TYPE_STA;
  23. case NL80211_IFTYPE_ADHOC:
  24. return IEEE80211_IF_TYPE_IBSS;
  25. case NL80211_IFTYPE_STATION:
  26. return IEEE80211_IF_TYPE_STA;
  27. case NL80211_IFTYPE_MONITOR:
  28. return IEEE80211_IF_TYPE_MNTR;
  29. default:
  30. return IEEE80211_IF_TYPE_INVALID;
  31. }
  32. }
  33. static int ieee80211_add_iface(struct wiphy *wiphy, char *name,
  34. enum nl80211_iftype type, u32 *flags)
  35. {
  36. struct ieee80211_local *local = wiphy_priv(wiphy);
  37. enum ieee80211_if_types itype;
  38. struct net_device *dev;
  39. struct ieee80211_sub_if_data *sdata;
  40. int err;
  41. if (unlikely(local->reg_state != IEEE80211_DEV_REGISTERED))
  42. return -ENODEV;
  43. itype = nl80211_type_to_mac80211_type(type);
  44. if (itype == IEEE80211_IF_TYPE_INVALID)
  45. return -EINVAL;
  46. err = ieee80211_if_add(local->mdev, name, &dev, itype);
  47. if (err || itype != IEEE80211_IF_TYPE_MNTR || !flags)
  48. return err;
  49. sdata = IEEE80211_DEV_TO_SUB_IF(dev);
  50. sdata->u.mntr_flags = *flags;
  51. return 0;
  52. }
  53. static int ieee80211_del_iface(struct wiphy *wiphy, int ifindex)
  54. {
  55. struct ieee80211_local *local = wiphy_priv(wiphy);
  56. struct net_device *dev;
  57. char *name;
  58. if (unlikely(local->reg_state != IEEE80211_DEV_REGISTERED))
  59. return -ENODEV;
  60. /* we're under RTNL */
  61. dev = __dev_get_by_index(&init_net, ifindex);
  62. if (!dev)
  63. return 0;
  64. name = dev->name;
  65. return ieee80211_if_remove(local->mdev, name, -1);
  66. }
  67. static int ieee80211_change_iface(struct wiphy *wiphy, int ifindex,
  68. enum nl80211_iftype type, u32 *flags)
  69. {
  70. struct ieee80211_local *local = wiphy_priv(wiphy);
  71. struct net_device *dev;
  72. enum ieee80211_if_types itype;
  73. struct ieee80211_sub_if_data *sdata;
  74. if (unlikely(local->reg_state != IEEE80211_DEV_REGISTERED))
  75. return -ENODEV;
  76. /* we're under RTNL */
  77. dev = __dev_get_by_index(&init_net, ifindex);
  78. if (!dev)
  79. return -ENODEV;
  80. if (netif_running(dev))
  81. return -EBUSY;
  82. itype = nl80211_type_to_mac80211_type(type);
  83. if (itype == IEEE80211_IF_TYPE_INVALID)
  84. return -EINVAL;
  85. sdata = IEEE80211_DEV_TO_SUB_IF(dev);
  86. if (sdata->vif.type == IEEE80211_IF_TYPE_VLAN)
  87. return -EOPNOTSUPP;
  88. ieee80211_if_reinit(dev);
  89. ieee80211_if_set_type(dev, itype);
  90. if (sdata->vif.type != IEEE80211_IF_TYPE_MNTR || !flags)
  91. return 0;
  92. sdata->u.mntr_flags = *flags;
  93. return 0;
  94. }
  95. static int ieee80211_add_key(struct wiphy *wiphy, struct net_device *dev,
  96. u8 key_idx, u8 *mac_addr,
  97. struct key_params *params)
  98. {
  99. struct ieee80211_sub_if_data *sdata;
  100. struct sta_info *sta = NULL;
  101. enum ieee80211_key_alg alg;
  102. int ret;
  103. struct ieee80211_key *key;
  104. sdata = IEEE80211_DEV_TO_SUB_IF(dev);
  105. switch (params->cipher) {
  106. case WLAN_CIPHER_SUITE_WEP40:
  107. case WLAN_CIPHER_SUITE_WEP104:
  108. alg = ALG_WEP;
  109. break;
  110. case WLAN_CIPHER_SUITE_TKIP:
  111. alg = ALG_TKIP;
  112. break;
  113. case WLAN_CIPHER_SUITE_CCMP:
  114. alg = ALG_CCMP;
  115. break;
  116. default:
  117. return -EINVAL;
  118. }
  119. key = ieee80211_key_alloc(alg, key_idx, params->key_len, params->key);
  120. if (!key)
  121. return -ENOMEM;
  122. if (mac_addr) {
  123. sta = sta_info_get(sdata->local, mac_addr);
  124. if (!sta) {
  125. ieee80211_key_free(key);
  126. return -ENOENT;
  127. }
  128. }
  129. ieee80211_key_link(key, sdata, sta);
  130. ret = 0;
  131. if (sta)
  132. sta_info_put(sta);
  133. return ret;
  134. }
  135. static int ieee80211_del_key(struct wiphy *wiphy, struct net_device *dev,
  136. u8 key_idx, u8 *mac_addr)
  137. {
  138. struct ieee80211_sub_if_data *sdata;
  139. struct sta_info *sta;
  140. int ret;
  141. struct ieee80211_key *key;
  142. sdata = IEEE80211_DEV_TO_SUB_IF(dev);
  143. if (mac_addr) {
  144. sta = sta_info_get(sdata->local, mac_addr);
  145. if (!sta)
  146. return -ENOENT;
  147. ret = 0;
  148. if (sta->key) {
  149. key = sta->key;
  150. ieee80211_key_free(key);
  151. WARN_ON(sta->key);
  152. } else
  153. ret = -ENOENT;
  154. sta_info_put(sta);
  155. return ret;
  156. }
  157. if (!sdata->keys[key_idx])
  158. return -ENOENT;
  159. key = sdata->keys[key_idx];
  160. ieee80211_key_free(key);
  161. WARN_ON(sdata->keys[key_idx]);
  162. return 0;
  163. }
  164. static int ieee80211_get_key(struct wiphy *wiphy, struct net_device *dev,
  165. u8 key_idx, u8 *mac_addr, void *cookie,
  166. void (*callback)(void *cookie,
  167. struct key_params *params))
  168. {
  169. struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
  170. struct sta_info *sta = NULL;
  171. u8 seq[6] = {0};
  172. struct key_params params;
  173. struct ieee80211_key *key;
  174. u32 iv32;
  175. u16 iv16;
  176. int err = -ENOENT;
  177. if (mac_addr) {
  178. sta = sta_info_get(sdata->local, mac_addr);
  179. if (!sta)
  180. goto out;
  181. key = sta->key;
  182. } else
  183. key = sdata->keys[key_idx];
  184. if (!key)
  185. goto out;
  186. memset(&params, 0, sizeof(params));
  187. switch (key->conf.alg) {
  188. case ALG_TKIP:
  189. params.cipher = WLAN_CIPHER_SUITE_TKIP;
  190. iv32 = key->u.tkip.iv32;
  191. iv16 = key->u.tkip.iv16;
  192. if (key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE &&
  193. sdata->local->ops->get_tkip_seq)
  194. sdata->local->ops->get_tkip_seq(
  195. local_to_hw(sdata->local),
  196. key->conf.hw_key_idx,
  197. &iv32, &iv16);
  198. seq[0] = iv16 & 0xff;
  199. seq[1] = (iv16 >> 8) & 0xff;
  200. seq[2] = iv32 & 0xff;
  201. seq[3] = (iv32 >> 8) & 0xff;
  202. seq[4] = (iv32 >> 16) & 0xff;
  203. seq[5] = (iv32 >> 24) & 0xff;
  204. params.seq = seq;
  205. params.seq_len = 6;
  206. break;
  207. case ALG_CCMP:
  208. params.cipher = WLAN_CIPHER_SUITE_CCMP;
  209. seq[0] = key->u.ccmp.tx_pn[5];
  210. seq[1] = key->u.ccmp.tx_pn[4];
  211. seq[2] = key->u.ccmp.tx_pn[3];
  212. seq[3] = key->u.ccmp.tx_pn[2];
  213. seq[4] = key->u.ccmp.tx_pn[1];
  214. seq[5] = key->u.ccmp.tx_pn[0];
  215. params.seq = seq;
  216. params.seq_len = 6;
  217. break;
  218. case ALG_WEP:
  219. if (key->conf.keylen == 5)
  220. params.cipher = WLAN_CIPHER_SUITE_WEP40;
  221. else
  222. params.cipher = WLAN_CIPHER_SUITE_WEP104;
  223. break;
  224. }
  225. params.key = key->conf.key;
  226. params.key_len = key->conf.keylen;
  227. callback(cookie, &params);
  228. err = 0;
  229. out:
  230. if (sta)
  231. sta_info_put(sta);
  232. return err;
  233. }
  234. static int ieee80211_config_default_key(struct wiphy *wiphy,
  235. struct net_device *dev,
  236. u8 key_idx)
  237. {
  238. struct ieee80211_sub_if_data *sdata;
  239. sdata = IEEE80211_DEV_TO_SUB_IF(dev);
  240. ieee80211_set_default_key(sdata, key_idx);
  241. return 0;
  242. }
  243. static int ieee80211_get_station(struct wiphy *wiphy, struct net_device *dev,
  244. u8 *mac, struct station_stats *stats)
  245. {
  246. struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
  247. struct sta_info *sta;
  248. sta = sta_info_get(local, mac);
  249. if (!sta)
  250. return -ENOENT;
  251. /* XXX: verify sta->dev == dev */
  252. stats->filled = STATION_STAT_INACTIVE_TIME |
  253. STATION_STAT_RX_BYTES |
  254. STATION_STAT_TX_BYTES;
  255. stats->inactive_time = jiffies_to_msecs(jiffies - sta->last_rx);
  256. stats->rx_bytes = sta->rx_bytes;
  257. stats->tx_bytes = sta->tx_bytes;
  258. sta_info_put(sta);
  259. return 0;
  260. }
  261. /*
  262. * This handles both adding a beacon and setting new beacon info
  263. */
  264. static int ieee80211_config_beacon(struct ieee80211_sub_if_data *sdata,
  265. struct beacon_parameters *params)
  266. {
  267. struct beacon_data *new, *old;
  268. int new_head_len, new_tail_len;
  269. int size;
  270. int err = -EINVAL;
  271. old = sdata->u.ap.beacon;
  272. /* head must not be zero-length */
  273. if (params->head && !params->head_len)
  274. return -EINVAL;
  275. /*
  276. * This is a kludge. beacon interval should really be part
  277. * of the beacon information.
  278. */
  279. if (params->interval) {
  280. sdata->local->hw.conf.beacon_int = params->interval;
  281. if (ieee80211_hw_config(sdata->local))
  282. return -EINVAL;
  283. /*
  284. * We updated some parameter so if below bails out
  285. * it's not an error.
  286. */
  287. err = 0;
  288. }
  289. /* Need to have a beacon head if we don't have one yet */
  290. if (!params->head && !old)
  291. return err;
  292. /* sorry, no way to start beaconing without dtim period */
  293. if (!params->dtim_period && !old)
  294. return err;
  295. /* new or old head? */
  296. if (params->head)
  297. new_head_len = params->head_len;
  298. else
  299. new_head_len = old->head_len;
  300. /* new or old tail? */
  301. if (params->tail || !old)
  302. /* params->tail_len will be zero for !params->tail */
  303. new_tail_len = params->tail_len;
  304. else
  305. new_tail_len = old->tail_len;
  306. size = sizeof(*new) + new_head_len + new_tail_len;
  307. new = kzalloc(size, GFP_KERNEL);
  308. if (!new)
  309. return -ENOMEM;
  310. /* start filling the new info now */
  311. /* new or old dtim period? */
  312. if (params->dtim_period)
  313. new->dtim_period = params->dtim_period;
  314. else
  315. new->dtim_period = old->dtim_period;
  316. /*
  317. * pointers go into the block we allocated,
  318. * memory is | beacon_data | head | tail |
  319. */
  320. new->head = ((u8 *) new) + sizeof(*new);
  321. new->tail = new->head + new_head_len;
  322. new->head_len = new_head_len;
  323. new->tail_len = new_tail_len;
  324. /* copy in head */
  325. if (params->head)
  326. memcpy(new->head, params->head, new_head_len);
  327. else
  328. memcpy(new->head, old->head, new_head_len);
  329. /* copy in optional tail */
  330. if (params->tail)
  331. memcpy(new->tail, params->tail, new_tail_len);
  332. else
  333. if (old)
  334. memcpy(new->tail, old->tail, new_tail_len);
  335. rcu_assign_pointer(sdata->u.ap.beacon, new);
  336. synchronize_rcu();
  337. kfree(old);
  338. return ieee80211_if_config_beacon(sdata->dev);
  339. }
  340. static int ieee80211_add_beacon(struct wiphy *wiphy, struct net_device *dev,
  341. struct beacon_parameters *params)
  342. {
  343. struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
  344. struct beacon_data *old;
  345. if (sdata->vif.type != IEEE80211_IF_TYPE_AP)
  346. return -EINVAL;
  347. old = sdata->u.ap.beacon;
  348. if (old)
  349. return -EALREADY;
  350. return ieee80211_config_beacon(sdata, params);
  351. }
  352. static int ieee80211_set_beacon(struct wiphy *wiphy, struct net_device *dev,
  353. struct beacon_parameters *params)
  354. {
  355. struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
  356. struct beacon_data *old;
  357. if (sdata->vif.type != IEEE80211_IF_TYPE_AP)
  358. return -EINVAL;
  359. old = sdata->u.ap.beacon;
  360. if (!old)
  361. return -ENOENT;
  362. return ieee80211_config_beacon(sdata, params);
  363. }
  364. static int ieee80211_del_beacon(struct wiphy *wiphy, struct net_device *dev)
  365. {
  366. struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
  367. struct beacon_data *old;
  368. if (sdata->vif.type != IEEE80211_IF_TYPE_AP)
  369. return -EINVAL;
  370. old = sdata->u.ap.beacon;
  371. if (!old)
  372. return -ENOENT;
  373. rcu_assign_pointer(sdata->u.ap.beacon, NULL);
  374. synchronize_rcu();
  375. kfree(old);
  376. return ieee80211_if_config_beacon(dev);
  377. }
  378. /* Layer 2 Update frame (802.2 Type 1 LLC XID Update response) */
  379. struct iapp_layer2_update {
  380. u8 da[ETH_ALEN]; /* broadcast */
  381. u8 sa[ETH_ALEN]; /* STA addr */
  382. __be16 len; /* 6 */
  383. u8 dsap; /* 0 */
  384. u8 ssap; /* 0 */
  385. u8 control;
  386. u8 xid_info[3];
  387. } __attribute__ ((packed));
  388. static void ieee80211_send_layer2_update(struct sta_info *sta)
  389. {
  390. struct iapp_layer2_update *msg;
  391. struct sk_buff *skb;
  392. /* Send Level 2 Update Frame to update forwarding tables in layer 2
  393. * bridge devices */
  394. skb = dev_alloc_skb(sizeof(*msg));
  395. if (!skb)
  396. return;
  397. msg = (struct iapp_layer2_update *)skb_put(skb, sizeof(*msg));
  398. /* 802.2 Type 1 Logical Link Control (LLC) Exchange Identifier (XID)
  399. * Update response frame; IEEE Std 802.2-1998, 5.4.1.2.1 */
  400. memset(msg->da, 0xff, ETH_ALEN);
  401. memcpy(msg->sa, sta->addr, ETH_ALEN);
  402. msg->len = htons(6);
  403. msg->dsap = 0;
  404. msg->ssap = 0x01; /* NULL LSAP, CR Bit: Response */
  405. msg->control = 0xaf; /* XID response lsb.1111F101.
  406. * F=0 (no poll command; unsolicited frame) */
  407. msg->xid_info[0] = 0x81; /* XID format identifier */
  408. msg->xid_info[1] = 1; /* LLC types/classes: Type 1 LLC */
  409. msg->xid_info[2] = 0; /* XID sender's receive window size (RW) */
  410. skb->dev = sta->dev;
  411. skb->protocol = eth_type_trans(skb, sta->dev);
  412. memset(skb->cb, 0, sizeof(skb->cb));
  413. netif_rx(skb);
  414. }
  415. static void sta_apply_parameters(struct ieee80211_local *local,
  416. struct sta_info *sta,
  417. struct station_parameters *params)
  418. {
  419. u32 rates;
  420. int i, j;
  421. struct ieee80211_supported_band *sband;
  422. if (params->station_flags & STATION_FLAG_CHANGED) {
  423. sta->flags &= ~WLAN_STA_AUTHORIZED;
  424. if (params->station_flags & STATION_FLAG_AUTHORIZED)
  425. sta->flags |= WLAN_STA_AUTHORIZED;
  426. sta->flags &= ~WLAN_STA_SHORT_PREAMBLE;
  427. if (params->station_flags & STATION_FLAG_SHORT_PREAMBLE)
  428. sta->flags |= WLAN_STA_SHORT_PREAMBLE;
  429. sta->flags &= ~WLAN_STA_WME;
  430. if (params->station_flags & STATION_FLAG_WME)
  431. sta->flags |= WLAN_STA_WME;
  432. }
  433. if (params->aid) {
  434. sta->aid = params->aid;
  435. if (sta->aid > IEEE80211_MAX_AID)
  436. sta->aid = 0; /* XXX: should this be an error? */
  437. }
  438. if (params->listen_interval >= 0)
  439. sta->listen_interval = params->listen_interval;
  440. if (params->supported_rates) {
  441. rates = 0;
  442. sband = local->hw.wiphy->bands[local->oper_channel->band];
  443. for (i = 0; i < params->supported_rates_len; i++) {
  444. int rate = (params->supported_rates[i] & 0x7f) * 5;
  445. for (j = 0; j < sband->n_bitrates; j++) {
  446. if (sband->bitrates[j].bitrate == rate)
  447. rates |= BIT(j);
  448. }
  449. }
  450. sta->supp_rates[local->oper_channel->band] = rates;
  451. }
  452. }
  453. static int ieee80211_add_station(struct wiphy *wiphy, struct net_device *dev,
  454. u8 *mac, struct station_parameters *params)
  455. {
  456. struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
  457. struct sta_info *sta;
  458. struct ieee80211_sub_if_data *sdata;
  459. /* Prevent a race with changing the rate control algorithm */
  460. if (!netif_running(dev))
  461. return -ENETDOWN;
  462. if (params->vlan) {
  463. sdata = IEEE80211_DEV_TO_SUB_IF(params->vlan);
  464. if (sdata->vif.type != IEEE80211_IF_TYPE_VLAN ||
  465. sdata->vif.type != IEEE80211_IF_TYPE_AP)
  466. return -EINVAL;
  467. } else
  468. sdata = IEEE80211_DEV_TO_SUB_IF(dev);
  469. sta = sta_info_add(local, dev, mac, GFP_KERNEL);
  470. if (IS_ERR(sta))
  471. return PTR_ERR(sta);
  472. sta->dev = sdata->dev;
  473. if (sdata->vif.type == IEEE80211_IF_TYPE_VLAN ||
  474. sdata->vif.type == IEEE80211_IF_TYPE_AP)
  475. ieee80211_send_layer2_update(sta);
  476. sta->flags = WLAN_STA_AUTH | WLAN_STA_ASSOC;
  477. sta_apply_parameters(local, sta, params);
  478. rate_control_rate_init(sta, local);
  479. sta_info_put(sta);
  480. return 0;
  481. }
  482. static int ieee80211_del_station(struct wiphy *wiphy, struct net_device *dev,
  483. u8 *mac)
  484. {
  485. struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
  486. struct sta_info *sta;
  487. if (mac) {
  488. /* XXX: get sta belonging to dev */
  489. sta = sta_info_get(local, mac);
  490. if (!sta)
  491. return -ENOENT;
  492. sta_info_free(sta);
  493. sta_info_put(sta);
  494. } else
  495. sta_info_flush(local, dev);
  496. return 0;
  497. }
  498. static int ieee80211_change_station(struct wiphy *wiphy,
  499. struct net_device *dev,
  500. u8 *mac,
  501. struct station_parameters *params)
  502. {
  503. struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
  504. struct sta_info *sta;
  505. struct ieee80211_sub_if_data *vlansdata;
  506. /* XXX: get sta belonging to dev */
  507. sta = sta_info_get(local, mac);
  508. if (!sta)
  509. return -ENOENT;
  510. if (params->vlan && params->vlan != sta->dev) {
  511. vlansdata = IEEE80211_DEV_TO_SUB_IF(params->vlan);
  512. if (vlansdata->vif.type != IEEE80211_IF_TYPE_VLAN ||
  513. vlansdata->vif.type != IEEE80211_IF_TYPE_AP)
  514. return -EINVAL;
  515. sta->dev = params->vlan;
  516. ieee80211_send_layer2_update(sta);
  517. }
  518. sta_apply_parameters(local, sta, params);
  519. sta_info_put(sta);
  520. return 0;
  521. }
  522. struct cfg80211_ops mac80211_config_ops = {
  523. .add_virtual_intf = ieee80211_add_iface,
  524. .del_virtual_intf = ieee80211_del_iface,
  525. .change_virtual_intf = ieee80211_change_iface,
  526. .add_key = ieee80211_add_key,
  527. .del_key = ieee80211_del_key,
  528. .get_key = ieee80211_get_key,
  529. .set_default_key = ieee80211_config_default_key,
  530. .add_beacon = ieee80211_add_beacon,
  531. .set_beacon = ieee80211_set_beacon,
  532. .del_beacon = ieee80211_del_beacon,
  533. .add_station = ieee80211_add_station,
  534. .del_station = ieee80211_del_station,
  535. .change_station = ieee80211_change_station,
  536. .get_station = ieee80211_get_station,
  537. };