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 #include "mesh.h" 19 20 void ieee80211_if_sdata_init(struct ieee80211_sub_if_data *sdata) 21 { 22 int i; 23 24 /* Default values for sub-interface parameters */ 25 sdata->drop_unencrypted = 0; 26 for (i = 0; i < IEEE80211_FRAGMENT_MAX; i++) 27 skb_queue_head_init(&sdata->fragments[i].skb_list); 28 29 INIT_LIST_HEAD(&sdata->key_list); 30 } 31 32 static void ieee80211_if_sdata_deinit(struct ieee80211_sub_if_data *sdata) 33 { 34 int i; 35 36 for (i = 0; i < IEEE80211_FRAGMENT_MAX; i++) { 37 __skb_queue_purge(&sdata->fragments[i].skb_list); 38 } 39 } 40 41 /* Must be called with rtnl lock held. */ 42 int ieee80211_if_add(struct net_device *dev, const char *name, 43 struct net_device **new_dev, int type, 44 struct vif_params *params) 45 { 46 struct net_device *ndev; 47 struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr); 48 struct ieee80211_sub_if_data *sdata = NULL; 49 int ret; 50 51 ASSERT_RTNL(); 52 ndev = alloc_netdev(sizeof(*sdata) + local->hw.vif_data_size, 53 name, ieee80211_if_setup); 54 if (!ndev) 55 return -ENOMEM; 56 57 ret = dev_alloc_name(ndev, ndev->name); 58 if (ret < 0) 59 goto fail; 60 61 memcpy(ndev->dev_addr, local->hw.wiphy->perm_addr, ETH_ALEN); 62 ndev->base_addr = dev->base_addr; 63 ndev->irq = dev->irq; 64 ndev->mem_start = dev->mem_start; 65 ndev->mem_end = dev->mem_end; 66 SET_NETDEV_DEV(ndev, wiphy_dev(local->hw.wiphy)); 67 68 sdata = IEEE80211_DEV_TO_SUB_IF(ndev); 69 ndev->ieee80211_ptr = &sdata->wdev; 70 sdata->wdev.wiphy = local->hw.wiphy; 71 sdata->vif.type = IEEE80211_IF_TYPE_AP; 72 sdata->dev = ndev; 73 sdata->local = local; 74 ieee80211_if_sdata_init(sdata); 75 76 ret = register_netdevice(ndev); 77 if (ret) 78 goto fail; 79 80 ieee80211_debugfs_add_netdev(sdata); 81 ieee80211_if_set_type(ndev, type); 82 83 if (ieee80211_vif_is_mesh(&sdata->vif) && 84 params && params->mesh_id_len) 85 ieee80211_if_sta_set_mesh_id(&sdata->u.sta, 86 params->mesh_id_len, 87 params->mesh_id); 88 89 /* we're under RTNL so all this is fine */ 90 if (unlikely(local->reg_state == IEEE80211_DEV_UNREGISTERED)) { 91 __ieee80211_if_del(local, sdata); 92 return -ENODEV; 93 } 94 list_add_tail_rcu(&sdata->list, &local->interfaces); 95 96 if (new_dev) 97 *new_dev = ndev; 98 99 return 0; 100 101 fail: 102 free_netdev(ndev); 103 return ret; 104 } 105 106 void ieee80211_if_set_type(struct net_device *dev, int type) 107 { 108 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); 109 int oldtype = sdata->vif.type; 110 111 /* 112 * We need to call this function on the master interface 113 * which already has a hard_start_xmit routine assigned 114 * which must not be changed. 115 */ 116 if (dev != sdata->local->mdev) 117 dev->hard_start_xmit = ieee80211_subif_start_xmit; 118 119 /* 120 * Called even when register_netdevice fails, it would 121 * oops if assigned before initialising the rest. 122 */ 123 dev->uninit = ieee80211_if_reinit; 124 125 /* most have no BSS pointer */ 126 sdata->bss = NULL; 127 sdata->vif.type = type; 128 129 sdata->basic_rates = 0; 130 131 switch (type) { 132 case IEEE80211_IF_TYPE_WDS: 133 /* nothing special */ 134 break; 135 case IEEE80211_IF_TYPE_VLAN: 136 sdata->u.vlan.ap = NULL; 137 break; 138 case IEEE80211_IF_TYPE_AP: 139 sdata->u.ap.force_unicast_rateidx = -1; 140 sdata->u.ap.max_ratectrl_rateidx = -1; 141 skb_queue_head_init(&sdata->u.ap.ps_bc_buf); 142 sdata->bss = &sdata->u.ap; 143 INIT_LIST_HEAD(&sdata->u.ap.vlans); 144 break; 145 case IEEE80211_IF_TYPE_MESH_POINT: 146 case IEEE80211_IF_TYPE_STA: 147 case IEEE80211_IF_TYPE_IBSS: { 148 struct ieee80211_sub_if_data *msdata; 149 struct ieee80211_if_sta *ifsta; 150 151 ifsta = &sdata->u.sta; 152 INIT_WORK(&ifsta->work, ieee80211_sta_work); 153 setup_timer(&ifsta->timer, ieee80211_sta_timer, 154 (unsigned long) sdata); 155 skb_queue_head_init(&ifsta->skb_queue); 156 157 ifsta->capab = WLAN_CAPABILITY_ESS; 158 ifsta->auth_algs = IEEE80211_AUTH_ALG_OPEN | 159 IEEE80211_AUTH_ALG_SHARED_KEY; 160 ifsta->flags |= IEEE80211_STA_CREATE_IBSS | 161 IEEE80211_STA_WMM_ENABLED | 162 IEEE80211_STA_AUTO_BSSID_SEL | 163 IEEE80211_STA_AUTO_CHANNEL_SEL; 164 165 msdata = IEEE80211_DEV_TO_SUB_IF(sdata->local->mdev); 166 sdata->bss = &msdata->u.ap; 167 168 if (ieee80211_vif_is_mesh(&sdata->vif)) 169 ieee80211_mesh_init_sdata(sdata); 170 break; 171 } 172 case IEEE80211_IF_TYPE_MNTR: 173 dev->type = ARPHRD_IEEE80211_RADIOTAP; 174 dev->hard_start_xmit = ieee80211_monitor_start_xmit; 175 sdata->u.mntr_flags = MONITOR_FLAG_CONTROL | 176 MONITOR_FLAG_OTHER_BSS; 177 break; 178 default: 179 printk(KERN_WARNING "%s: %s: Unknown interface type 0x%x", 180 dev->name, __func__, type); 181 } 182 ieee80211_debugfs_change_if_type(sdata, oldtype); 183 } 184 185 /* Must be called with rtnl lock held. */ 186 void ieee80211_if_reinit(struct net_device *dev) 187 { 188 struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr); 189 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); 190 struct sk_buff *skb; 191 int flushed; 192 193 ASSERT_RTNL(); 194 195 ieee80211_free_keys(sdata); 196 197 ieee80211_if_sdata_deinit(sdata); 198 199 /* Need to handle mesh specially to allow eliding the function call */ 200 if (ieee80211_vif_is_mesh(&sdata->vif)) 201 mesh_rmc_free(dev); 202 203 switch (sdata->vif.type) { 204 case IEEE80211_IF_TYPE_INVALID: 205 /* cannot happen */ 206 WARN_ON(1); 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 struct beacon_data *beacon; 213 214 list_for_each_entry_safe(tsdata, n, &local->interfaces, list) { 215 if (tsdata != sdata && tsdata->bss == &sdata->u.ap) { 216 printk(KERN_DEBUG "%s: removing virtual " 217 "interface %s because its BSS interface" 218 " is being removed\n", 219 sdata->dev->name, tsdata->dev->name); 220 list_del_rcu(&tsdata->list); 221 /* 222 * We have lots of time and can afford 223 * to sync for each interface 224 */ 225 synchronize_rcu(); 226 __ieee80211_if_del(local, tsdata); 227 } 228 } 229 230 beacon = sdata->u.ap.beacon; 231 rcu_assign_pointer(sdata->u.ap.beacon, NULL); 232 synchronize_rcu(); 233 kfree(beacon); 234 235 while ((skb = skb_dequeue(&sdata->u.ap.ps_bc_buf))) { 236 local->total_ps_buffered--; 237 dev_kfree_skb(skb); 238 } 239 240 break; 241 } 242 case IEEE80211_IF_TYPE_WDS: 243 /* nothing to do */ 244 break; 245 case IEEE80211_IF_TYPE_MESH_POINT: 246 case IEEE80211_IF_TYPE_STA: 247 case IEEE80211_IF_TYPE_IBSS: 248 kfree(sdata->u.sta.extra_ie); 249 sdata->u.sta.extra_ie = NULL; 250 kfree(sdata->u.sta.assocreq_ies); 251 sdata->u.sta.assocreq_ies = NULL; 252 kfree(sdata->u.sta.assocresp_ies); 253 sdata->u.sta.assocresp_ies = NULL; 254 if (sdata->u.sta.probe_resp) { 255 dev_kfree_skb(sdata->u.sta.probe_resp); 256 sdata->u.sta.probe_resp = NULL; 257 } 258 259 break; 260 case IEEE80211_IF_TYPE_MNTR: 261 dev->type = ARPHRD_ETHER; 262 break; 263 case IEEE80211_IF_TYPE_VLAN: 264 sdata->u.vlan.ap = NULL; 265 break; 266 } 267 268 flushed = sta_info_flush(local, sdata); 269 WARN_ON(flushed); 270 271 memset(&sdata->u, 0, sizeof(sdata->u)); 272 ieee80211_if_sdata_init(sdata); 273 } 274 275 /* Must be called with rtnl lock held. */ 276 void __ieee80211_if_del(struct ieee80211_local *local, 277 struct ieee80211_sub_if_data *sdata) 278 { 279 struct net_device *dev = sdata->dev; 280 281 ieee80211_debugfs_remove_netdev(sdata); 282 unregister_netdevice(dev); 283 /* Except master interface, the net_device will be freed by 284 * net_device->destructor (i. e. ieee80211_if_free). */ 285 } 286 287 /* Must be called with rtnl lock held. */ 288 int ieee80211_if_remove(struct net_device *dev, const char *name, int id) 289 { 290 struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr); 291 struct ieee80211_sub_if_data *sdata, *n; 292 293 ASSERT_RTNL(); 294 295 list_for_each_entry_safe(sdata, n, &local->interfaces, list) { 296 if ((sdata->vif.type == id || id == -1) && 297 strcmp(name, sdata->dev->name) == 0 && 298 sdata->dev != local->mdev) { 299 list_del_rcu(&sdata->list); 300 synchronize_rcu(); 301 __ieee80211_if_del(local, sdata); 302 return 0; 303 } 304 } 305 return -ENODEV; 306 } 307 308 void ieee80211_if_free(struct net_device *dev) 309 { 310 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); 311 312 ieee80211_if_sdata_deinit(sdata); 313 free_netdev(dev); 314 } 315