ieee80211_iface.c 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364
  1. /*
  2. * Copyright 2002-2005, Instant802 Networks, Inc.
  3. * Copyright 2005-2006, Devicescape Software, Inc.
  4. * Copyright (c) 2006 Jiri Benc <jbenc@suse.cz>
  5. *
  6. * This program is free software; you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License version 2 as
  8. * published by the Free Software Foundation.
  9. */
  10. #include <linux/kernel.h>
  11. #include <linux/if_arp.h>
  12. #include <linux/netdevice.h>
  13. #include <linux/rtnetlink.h>
  14. #include <net/mac80211.h>
  15. #include "ieee80211_i.h"
  16. #include "sta_info.h"
  17. #include "debugfs_netdev.h"
  18. void ieee80211_if_sdata_init(struct ieee80211_sub_if_data *sdata)
  19. {
  20. int i;
  21. /* Default values for sub-interface parameters */
  22. sdata->drop_unencrypted = 0;
  23. sdata->eapol = 1;
  24. for (i = 0; i < IEEE80211_FRAGMENT_MAX; i++)
  25. skb_queue_head_init(&sdata->fragments[i].skb_list);
  26. INIT_LIST_HEAD(&sdata->key_list);
  27. }
  28. static void ieee80211_if_sdata_deinit(struct ieee80211_sub_if_data *sdata)
  29. {
  30. int i;
  31. for (i = 0; i < IEEE80211_FRAGMENT_MAX; i++) {
  32. __skb_queue_purge(&sdata->fragments[i].skb_list);
  33. }
  34. }
  35. /* Must be called with rtnl lock held. */
  36. int ieee80211_if_add(struct net_device *dev, const char *name,
  37. struct net_device **new_dev, int type)
  38. {
  39. struct net_device *ndev;
  40. struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
  41. struct ieee80211_sub_if_data *sdata = NULL;
  42. int ret;
  43. ASSERT_RTNL();
  44. ndev = alloc_netdev(sizeof(struct ieee80211_sub_if_data),
  45. name, ieee80211_if_setup);
  46. if (!ndev)
  47. return -ENOMEM;
  48. ret = dev_alloc_name(ndev, ndev->name);
  49. if (ret < 0)
  50. goto fail;
  51. memcpy(ndev->dev_addr, local->hw.wiphy->perm_addr, ETH_ALEN);
  52. ndev->base_addr = dev->base_addr;
  53. ndev->irq = dev->irq;
  54. ndev->mem_start = dev->mem_start;
  55. ndev->mem_end = dev->mem_end;
  56. SET_NETDEV_DEV(ndev, wiphy_dev(local->hw.wiphy));
  57. sdata = IEEE80211_DEV_TO_SUB_IF(ndev);
  58. ndev->ieee80211_ptr = &sdata->wdev;
  59. sdata->wdev.wiphy = local->hw.wiphy;
  60. sdata->type = IEEE80211_IF_TYPE_AP;
  61. sdata->dev = ndev;
  62. sdata->local = local;
  63. ieee80211_if_sdata_init(sdata);
  64. ret = register_netdevice(ndev);
  65. if (ret)
  66. goto fail;
  67. ieee80211_debugfs_add_netdev(sdata);
  68. ieee80211_if_set_type(ndev, type);
  69. /* we're under RTNL so all this is fine */
  70. if (unlikely(local->reg_state == IEEE80211_DEV_UNREGISTERED)) {
  71. __ieee80211_if_del(local, sdata);
  72. return -ENODEV;
  73. }
  74. list_add_tail_rcu(&sdata->list, &local->interfaces);
  75. if (new_dev)
  76. *new_dev = ndev;
  77. return 0;
  78. fail:
  79. free_netdev(ndev);
  80. return ret;
  81. }
  82. int ieee80211_if_add_mgmt(struct ieee80211_local *local)
  83. {
  84. struct net_device *ndev;
  85. struct ieee80211_sub_if_data *nsdata;
  86. int ret;
  87. ASSERT_RTNL();
  88. ndev = alloc_netdev(sizeof(struct ieee80211_sub_if_data), "wmgmt%d",
  89. ieee80211_if_mgmt_setup);
  90. if (!ndev)
  91. return -ENOMEM;
  92. ret = dev_alloc_name(ndev, ndev->name);
  93. if (ret < 0)
  94. goto fail;
  95. memcpy(ndev->dev_addr, local->hw.wiphy->perm_addr, ETH_ALEN);
  96. SET_NETDEV_DEV(ndev, wiphy_dev(local->hw.wiphy));
  97. nsdata = IEEE80211_DEV_TO_SUB_IF(ndev);
  98. ndev->ieee80211_ptr = &nsdata->wdev;
  99. nsdata->wdev.wiphy = local->hw.wiphy;
  100. nsdata->type = IEEE80211_IF_TYPE_MGMT;
  101. nsdata->dev = ndev;
  102. nsdata->local = local;
  103. ieee80211_if_sdata_init(nsdata);
  104. ret = register_netdevice(ndev);
  105. if (ret)
  106. goto fail;
  107. /*
  108. * Called even when register_netdevice fails, it would
  109. * oops if assigned before initialising the rest.
  110. */
  111. ndev->uninit = ieee80211_if_reinit;
  112. ieee80211_debugfs_add_netdev(nsdata);
  113. if (local->open_count > 0)
  114. dev_open(ndev);
  115. local->apdev = ndev;
  116. return 0;
  117. fail:
  118. free_netdev(ndev);
  119. return ret;
  120. }
  121. void ieee80211_if_del_mgmt(struct ieee80211_local *local)
  122. {
  123. struct net_device *apdev;
  124. ASSERT_RTNL();
  125. apdev = local->apdev;
  126. ieee80211_debugfs_remove_netdev(IEEE80211_DEV_TO_SUB_IF(apdev));
  127. local->apdev = NULL;
  128. unregister_netdevice(apdev);
  129. }
  130. void ieee80211_if_set_type(struct net_device *dev, int type)
  131. {
  132. struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
  133. int oldtype = sdata->type;
  134. /*
  135. * We need to call this function on the master interface
  136. * which already has a hard_start_xmit routine assigned
  137. * which must not be changed.
  138. */
  139. if (!dev->hard_start_xmit)
  140. dev->hard_start_xmit = ieee80211_subif_start_xmit;
  141. /*
  142. * Called even when register_netdevice fails, it would
  143. * oops if assigned before initialising the rest.
  144. */
  145. dev->uninit = ieee80211_if_reinit;
  146. /* most have no BSS pointer */
  147. sdata->bss = NULL;
  148. sdata->type = type;
  149. switch (type) {
  150. case IEEE80211_IF_TYPE_WDS:
  151. /* nothing special */
  152. break;
  153. case IEEE80211_IF_TYPE_VLAN:
  154. sdata->u.vlan.ap = NULL;
  155. break;
  156. case IEEE80211_IF_TYPE_AP:
  157. sdata->u.ap.dtim_period = 2;
  158. sdata->u.ap.force_unicast_rateidx = -1;
  159. sdata->u.ap.max_ratectrl_rateidx = -1;
  160. skb_queue_head_init(&sdata->u.ap.ps_bc_buf);
  161. sdata->bss = &sdata->u.ap;
  162. INIT_LIST_HEAD(&sdata->u.ap.vlans);
  163. break;
  164. case IEEE80211_IF_TYPE_STA:
  165. case IEEE80211_IF_TYPE_IBSS: {
  166. struct ieee80211_sub_if_data *msdata;
  167. struct ieee80211_if_sta *ifsta;
  168. ifsta = &sdata->u.sta;
  169. INIT_WORK(&ifsta->work, ieee80211_sta_work);
  170. setup_timer(&ifsta->timer, ieee80211_sta_timer,
  171. (unsigned long) sdata);
  172. skb_queue_head_init(&ifsta->skb_queue);
  173. ifsta->capab = WLAN_CAPABILITY_ESS;
  174. ifsta->auth_algs = IEEE80211_AUTH_ALG_OPEN |
  175. IEEE80211_AUTH_ALG_SHARED_KEY;
  176. ifsta->flags |= IEEE80211_STA_CREATE_IBSS |
  177. IEEE80211_STA_WMM_ENABLED |
  178. IEEE80211_STA_AUTO_BSSID_SEL |
  179. IEEE80211_STA_AUTO_CHANNEL_SEL;
  180. msdata = IEEE80211_DEV_TO_SUB_IF(sdata->local->mdev);
  181. sdata->bss = &msdata->u.ap;
  182. break;
  183. }
  184. case IEEE80211_IF_TYPE_MNTR:
  185. dev->type = ARPHRD_IEEE80211_RADIOTAP;
  186. dev->hard_start_xmit = ieee80211_monitor_start_xmit;
  187. break;
  188. default:
  189. printk(KERN_WARNING "%s: %s: Unknown interface type 0x%x",
  190. dev->name, __FUNCTION__, type);
  191. }
  192. ieee80211_debugfs_change_if_type(sdata, oldtype);
  193. }
  194. /* Must be called with rtnl lock held. */
  195. void ieee80211_if_reinit(struct net_device *dev)
  196. {
  197. struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
  198. struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
  199. struct sta_info *sta;
  200. struct sk_buff *skb;
  201. ASSERT_RTNL();
  202. ieee80211_free_keys(sdata);
  203. ieee80211_if_sdata_deinit(sdata);
  204. switch (sdata->type) {
  205. case IEEE80211_IF_TYPE_MGMT:
  206. /* nothing to do */
  207. break;
  208. case IEEE80211_IF_TYPE_AP: {
  209. /* Remove all virtual interfaces that use this BSS
  210. * as their sdata->bss */
  211. struct ieee80211_sub_if_data *tsdata, *n;
  212. list_for_each_entry_safe(tsdata, n, &local->interfaces, list) {
  213. if (tsdata != sdata && tsdata->bss == &sdata->u.ap) {
  214. printk(KERN_DEBUG "%s: removing virtual "
  215. "interface %s because its BSS interface"
  216. " is being removed\n",
  217. sdata->dev->name, tsdata->dev->name);
  218. list_del_rcu(&tsdata->list);
  219. /*
  220. * We have lots of time and can afford
  221. * to sync for each interface
  222. */
  223. synchronize_rcu();
  224. __ieee80211_if_del(local, tsdata);
  225. }
  226. }
  227. kfree(sdata->u.ap.beacon_head);
  228. kfree(sdata->u.ap.beacon_tail);
  229. kfree(sdata->u.ap.generic_elem);
  230. while ((skb = skb_dequeue(&sdata->u.ap.ps_bc_buf))) {
  231. local->total_ps_buffered--;
  232. dev_kfree_skb(skb);
  233. }
  234. break;
  235. }
  236. case IEEE80211_IF_TYPE_WDS:
  237. sta = sta_info_get(local, sdata->u.wds.remote_addr);
  238. if (sta) {
  239. sta_info_free(sta);
  240. sta_info_put(sta);
  241. } else {
  242. #ifdef CONFIG_MAC80211_VERBOSE_DEBUG
  243. printk(KERN_DEBUG "%s: Someone had deleted my STA "
  244. "entry for the WDS link\n", dev->name);
  245. #endif /* CONFIG_MAC80211_VERBOSE_DEBUG */
  246. }
  247. break;
  248. case IEEE80211_IF_TYPE_STA:
  249. case IEEE80211_IF_TYPE_IBSS:
  250. kfree(sdata->u.sta.extra_ie);
  251. sdata->u.sta.extra_ie = NULL;
  252. kfree(sdata->u.sta.assocreq_ies);
  253. sdata->u.sta.assocreq_ies = NULL;
  254. kfree(sdata->u.sta.assocresp_ies);
  255. sdata->u.sta.assocresp_ies = NULL;
  256. if (sdata->u.sta.probe_resp) {
  257. dev_kfree_skb(sdata->u.sta.probe_resp);
  258. sdata->u.sta.probe_resp = NULL;
  259. }
  260. break;
  261. case IEEE80211_IF_TYPE_MNTR:
  262. dev->type = ARPHRD_ETHER;
  263. break;
  264. case IEEE80211_IF_TYPE_VLAN:
  265. sdata->u.vlan.ap = NULL;
  266. break;
  267. }
  268. /* remove all STAs that are bound to this virtual interface */
  269. sta_info_flush(local, dev);
  270. memset(&sdata->u, 0, sizeof(sdata->u));
  271. ieee80211_if_sdata_init(sdata);
  272. }
  273. /* Must be called with rtnl lock held. */
  274. void __ieee80211_if_del(struct ieee80211_local *local,
  275. struct ieee80211_sub_if_data *sdata)
  276. {
  277. struct net_device *dev = sdata->dev;
  278. ieee80211_debugfs_remove_netdev(sdata);
  279. unregister_netdevice(dev);
  280. /* Except master interface, the net_device will be freed by
  281. * net_device->destructor (i. e. ieee80211_if_free). */
  282. }
  283. /* Must be called with rtnl lock held. */
  284. int ieee80211_if_remove(struct net_device *dev, const char *name, int id)
  285. {
  286. struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
  287. struct ieee80211_sub_if_data *sdata, *n;
  288. ASSERT_RTNL();
  289. list_for_each_entry_safe(sdata, n, &local->interfaces, list) {
  290. if ((sdata->type == id || id == -1) &&
  291. strcmp(name, sdata->dev->name) == 0 &&
  292. sdata->dev != local->mdev) {
  293. list_del_rcu(&sdata->list);
  294. synchronize_rcu();
  295. __ieee80211_if_del(local, sdata);
  296. return 0;
  297. }
  298. }
  299. return -ENODEV;
  300. }
  301. void ieee80211_if_free(struct net_device *dev)
  302. {
  303. struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
  304. struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
  305. /* local->apdev must be NULL when freeing management interface */
  306. BUG_ON(dev == local->apdev);
  307. ieee80211_if_sdata_deinit(sdata);
  308. free_netdev(dev);
  309. }