1 /* 2 * Copyright (c) 2008, 2009 open80211s Ltd. 3 * Authors: Luis Carlos Cobo <luisca@cozybit.com> 4 * Javier Cardona <javier@cozybit.com> 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 11 #include <linux/slab.h> 12 #include <asm/unaligned.h> 13 #include "ieee80211_i.h" 14 #include "mesh.h" 15 16 #define TMR_RUNNING_HK 0 17 #define TMR_RUNNING_MP 1 18 #define TMR_RUNNING_MPR 2 19 20 int mesh_allocated; 21 static struct kmem_cache *rm_cache; 22 23 #ifdef CONFIG_MAC80211_MESH 24 bool mesh_action_is_path_sel(struct ieee80211_mgmt *mgmt) 25 { 26 return (mgmt->u.action.u.mesh_action.action_code == 27 WLAN_MESH_ACTION_HWMP_PATH_SELECTION); 28 } 29 #else 30 bool mesh_action_is_path_sel(struct ieee80211_mgmt *mgmt) 31 { return false; } 32 #endif 33 34 void ieee80211s_init(void) 35 { 36 mesh_pathtbl_init(); 37 mesh_allocated = 1; 38 rm_cache = kmem_cache_create("mesh_rmc", sizeof(struct rmc_entry), 39 0, 0, NULL); 40 } 41 42 void ieee80211s_stop(void) 43 { 44 mesh_pathtbl_unregister(); 45 kmem_cache_destroy(rm_cache); 46 } 47 48 static void ieee80211_mesh_housekeeping_timer(unsigned long data) 49 { 50 struct ieee80211_sub_if_data *sdata = (void *) data; 51 struct ieee80211_local *local = sdata->local; 52 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; 53 54 set_bit(MESH_WORK_HOUSEKEEPING, &ifmsh->wrkq_flags); 55 56 if (local->quiescing) { 57 set_bit(TMR_RUNNING_HK, &ifmsh->timers_running); 58 return; 59 } 60 61 ieee80211_queue_work(&local->hw, &sdata->work); 62 } 63 64 /** 65 * mesh_matches_local - check if the config of a mesh point matches ours 66 * 67 * @ie: information elements of a management frame from the mesh peer 68 * @sdata: local mesh subif 69 * 70 * This function checks if the mesh configuration of a mesh point matches the 71 * local mesh configuration, i.e. if both nodes belong to the same mesh network. 72 */ 73 bool mesh_matches_local(struct ieee802_11_elems *ie, struct ieee80211_sub_if_data *sdata) 74 { 75 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; 76 struct ieee80211_local *local = sdata->local; 77 78 /* 79 * As support for each feature is added, check for matching 80 * - On mesh config capabilities 81 * - Power Save Support En 82 * - Sync support enabled 83 * - Sync support active 84 * - Sync support required from peer 85 * - MDA enabled 86 * - Power management control on fc 87 */ 88 if (!(ifmsh->mesh_id_len == ie->mesh_id_len && 89 memcmp(ifmsh->mesh_id, ie->mesh_id, ie->mesh_id_len) == 0 && 90 (ifmsh->mesh_pp_id == ie->mesh_config->meshconf_psel) && 91 (ifmsh->mesh_pm_id == ie->mesh_config->meshconf_pmetric) && 92 (ifmsh->mesh_cc_id == ie->mesh_config->meshconf_congest) && 93 (ifmsh->mesh_sp_id == ie->mesh_config->meshconf_synch) && 94 (ifmsh->mesh_auth_id == ie->mesh_config->meshconf_auth))) 95 goto mismatch; 96 97 /* disallow peering with mismatched channel types for now */ 98 if (ie->ht_operation && 99 (local->_oper_channel_type != 100 ieee80211_ht_oper_to_channel_type(ie->ht_operation))) 101 goto mismatch; 102 103 return true; 104 mismatch: 105 return false; 106 } 107 108 /** 109 * mesh_peer_accepts_plinks - check if an mp is willing to establish peer links 110 * 111 * @ie: information elements of a management frame from the mesh peer 112 */ 113 bool mesh_peer_accepts_plinks(struct ieee802_11_elems *ie) 114 { 115 return (ie->mesh_config->meshconf_cap & 116 MESHCONF_CAPAB_ACCEPT_PLINKS) != 0; 117 } 118 119 /** 120 * mesh_accept_plinks_update: update accepting_plink in local mesh beacons 121 * 122 * @sdata: mesh interface in which mesh beacons are going to be updated 123 */ 124 void mesh_accept_plinks_update(struct ieee80211_sub_if_data *sdata) 125 { 126 bool free_plinks; 127 128 /* In case mesh_plink_free_count > 0 and mesh_plinktbl_capacity == 0, 129 * the mesh interface might be able to establish plinks with peers that 130 * are already on the table but are not on PLINK_ESTAB state. However, 131 * in general the mesh interface is not accepting peer link requests 132 * from new peers, and that must be reflected in the beacon 133 */ 134 free_plinks = mesh_plink_availables(sdata); 135 136 if (free_plinks != sdata->u.mesh.accepting_plinks) 137 ieee80211_mesh_housekeeping_timer((unsigned long) sdata); 138 } 139 140 int mesh_rmc_init(struct ieee80211_sub_if_data *sdata) 141 { 142 int i; 143 144 sdata->u.mesh.rmc = kmalloc(sizeof(struct mesh_rmc), GFP_KERNEL); 145 if (!sdata->u.mesh.rmc) 146 return -ENOMEM; 147 sdata->u.mesh.rmc->idx_mask = RMC_BUCKETS - 1; 148 for (i = 0; i < RMC_BUCKETS; i++) 149 INIT_LIST_HEAD(&sdata->u.mesh.rmc->bucket[i].list); 150 return 0; 151 } 152 153 void mesh_rmc_free(struct ieee80211_sub_if_data *sdata) 154 { 155 struct mesh_rmc *rmc = sdata->u.mesh.rmc; 156 struct rmc_entry *p, *n; 157 int i; 158 159 if (!sdata->u.mesh.rmc) 160 return; 161 162 for (i = 0; i < RMC_BUCKETS; i++) 163 list_for_each_entry_safe(p, n, &rmc->bucket[i].list, list) { 164 list_del(&p->list); 165 kmem_cache_free(rm_cache, p); 166 } 167 168 kfree(rmc); 169 sdata->u.mesh.rmc = NULL; 170 } 171 172 /** 173 * mesh_rmc_check - Check frame in recent multicast cache and add if absent. 174 * 175 * @sa: source address 176 * @mesh_hdr: mesh_header 177 * 178 * Returns: 0 if the frame is not in the cache, nonzero otherwise. 179 * 180 * Checks using the source address and the mesh sequence number if we have 181 * received this frame lately. If the frame is not in the cache, it is added to 182 * it. 183 */ 184 int mesh_rmc_check(u8 *sa, struct ieee80211s_hdr *mesh_hdr, 185 struct ieee80211_sub_if_data *sdata) 186 { 187 struct mesh_rmc *rmc = sdata->u.mesh.rmc; 188 u32 seqnum = 0; 189 int entries = 0; 190 u8 idx; 191 struct rmc_entry *p, *n; 192 193 /* Don't care about endianness since only match matters */ 194 memcpy(&seqnum, &mesh_hdr->seqnum, sizeof(mesh_hdr->seqnum)); 195 idx = le32_to_cpu(mesh_hdr->seqnum) & rmc->idx_mask; 196 list_for_each_entry_safe(p, n, &rmc->bucket[idx].list, list) { 197 ++entries; 198 if (time_after(jiffies, p->exp_time) || 199 (entries == RMC_QUEUE_MAX_LEN)) { 200 list_del(&p->list); 201 kmem_cache_free(rm_cache, p); 202 --entries; 203 } else if ((seqnum == p->seqnum) && 204 (compare_ether_addr(sa, p->sa) == 0)) 205 return -1; 206 } 207 208 p = kmem_cache_alloc(rm_cache, GFP_ATOMIC); 209 if (!p) 210 return 0; 211 212 p->seqnum = seqnum; 213 p->exp_time = jiffies + RMC_TIMEOUT; 214 memcpy(p->sa, sa, ETH_ALEN); 215 list_add(&p->list, &rmc->bucket[idx].list); 216 return 0; 217 } 218 219 int 220 mesh_add_meshconf_ie(struct sk_buff *skb, struct ieee80211_sub_if_data *sdata) 221 { 222 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; 223 u8 *pos, neighbors; 224 u8 meshconf_len = sizeof(struct ieee80211_meshconf_ie); 225 226 if (skb_tailroom(skb) < 2 + meshconf_len) 227 return -ENOMEM; 228 229 pos = skb_put(skb, 2 + meshconf_len); 230 *pos++ = WLAN_EID_MESH_CONFIG; 231 *pos++ = meshconf_len; 232 233 /* Active path selection protocol ID */ 234 *pos++ = ifmsh->mesh_pp_id; 235 /* Active path selection metric ID */ 236 *pos++ = ifmsh->mesh_pm_id; 237 /* Congestion control mode identifier */ 238 *pos++ = ifmsh->mesh_cc_id; 239 /* Synchronization protocol identifier */ 240 *pos++ = ifmsh->mesh_sp_id; 241 /* Authentication Protocol identifier */ 242 *pos++ = ifmsh->mesh_auth_id; 243 /* Mesh Formation Info - number of neighbors */ 244 neighbors = atomic_read(&ifmsh->mshstats.estab_plinks); 245 /* Number of neighbor mesh STAs or 15 whichever is smaller */ 246 neighbors = (neighbors > 15) ? 15 : neighbors; 247 *pos++ = neighbors << 1; 248 /* Mesh capability */ 249 ifmsh->accepting_plinks = mesh_plink_availables(sdata); 250 *pos = MESHCONF_CAPAB_FORWARDING; 251 *pos |= ifmsh->accepting_plinks ? 252 MESHCONF_CAPAB_ACCEPT_PLINKS : 0x00; 253 *pos++ |= ifmsh->adjusting_tbtt ? 254 MESHCONF_CAPAB_TBTT_ADJUSTING : 0x00; 255 *pos++ = 0x00; 256 257 return 0; 258 } 259 260 int 261 mesh_add_meshid_ie(struct sk_buff *skb, struct ieee80211_sub_if_data *sdata) 262 { 263 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; 264 u8 *pos; 265 266 if (skb_tailroom(skb) < 2 + ifmsh->mesh_id_len) 267 return -ENOMEM; 268 269 pos = skb_put(skb, 2 + ifmsh->mesh_id_len); 270 *pos++ = WLAN_EID_MESH_ID; 271 *pos++ = ifmsh->mesh_id_len; 272 if (ifmsh->mesh_id_len) 273 memcpy(pos, ifmsh->mesh_id, ifmsh->mesh_id_len); 274 275 return 0; 276 } 277 278 int 279 mesh_add_vendor_ies(struct sk_buff *skb, struct ieee80211_sub_if_data *sdata) 280 { 281 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; 282 u8 offset, len; 283 const u8 *data; 284 285 if (!ifmsh->ie || !ifmsh->ie_len) 286 return 0; 287 288 /* fast-forward to vendor IEs */ 289 offset = ieee80211_ie_split_vendor(ifmsh->ie, ifmsh->ie_len, 0); 290 291 if (offset) { 292 len = ifmsh->ie_len - offset; 293 data = ifmsh->ie + offset; 294 if (skb_tailroom(skb) < len) 295 return -ENOMEM; 296 memcpy(skb_put(skb, len), data, len); 297 } 298 299 return 0; 300 } 301 302 int 303 mesh_add_rsn_ie(struct sk_buff *skb, struct ieee80211_sub_if_data *sdata) 304 { 305 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; 306 u8 len = 0; 307 const u8 *data; 308 309 if (!ifmsh->ie || !ifmsh->ie_len) 310 return 0; 311 312 /* find RSN IE */ 313 data = ifmsh->ie; 314 while (data < ifmsh->ie + ifmsh->ie_len) { 315 if (*data == WLAN_EID_RSN) { 316 len = data[1] + 2; 317 break; 318 } 319 data++; 320 } 321 322 if (len) { 323 if (skb_tailroom(skb) < len) 324 return -ENOMEM; 325 memcpy(skb_put(skb, len), data, len); 326 } 327 328 return 0; 329 } 330 331 int mesh_add_ds_params_ie(struct sk_buff *skb, 332 struct ieee80211_sub_if_data *sdata) 333 { 334 struct ieee80211_local *local = sdata->local; 335 struct ieee80211_supported_band *sband; 336 u8 *pos; 337 338 if (skb_tailroom(skb) < 3) 339 return -ENOMEM; 340 341 sband = local->hw.wiphy->bands[local->hw.conf.channel->band]; 342 if (sband->band == IEEE80211_BAND_2GHZ) { 343 pos = skb_put(skb, 2 + 1); 344 *pos++ = WLAN_EID_DS_PARAMS; 345 *pos++ = 1; 346 *pos++ = ieee80211_frequency_to_channel(local->hw.conf.channel->center_freq); 347 } 348 349 return 0; 350 } 351 352 int mesh_add_ht_cap_ie(struct sk_buff *skb, 353 struct ieee80211_sub_if_data *sdata) 354 { 355 struct ieee80211_local *local = sdata->local; 356 struct ieee80211_supported_band *sband; 357 u8 *pos; 358 359 sband = local->hw.wiphy->bands[local->oper_channel->band]; 360 if (!sband->ht_cap.ht_supported || 361 local->_oper_channel_type == NL80211_CHAN_NO_HT) 362 return 0; 363 364 if (skb_tailroom(skb) < 2 + sizeof(struct ieee80211_ht_cap)) 365 return -ENOMEM; 366 367 pos = skb_put(skb, 2 + sizeof(struct ieee80211_ht_cap)); 368 ieee80211_ie_build_ht_cap(pos, &sband->ht_cap, sband->ht_cap.cap); 369 370 return 0; 371 } 372 373 int mesh_add_ht_oper_ie(struct sk_buff *skb, 374 struct ieee80211_sub_if_data *sdata) 375 { 376 struct ieee80211_local *local = sdata->local; 377 struct ieee80211_channel *channel = local->oper_channel; 378 enum nl80211_channel_type channel_type = local->_oper_channel_type; 379 struct ieee80211_supported_band *sband = 380 local->hw.wiphy->bands[channel->band]; 381 struct ieee80211_sta_ht_cap *ht_cap = &sband->ht_cap; 382 u8 *pos; 383 384 if (!ht_cap->ht_supported || channel_type == NL80211_CHAN_NO_HT) 385 return 0; 386 387 if (skb_tailroom(skb) < 2 + sizeof(struct ieee80211_ht_operation)) 388 return -ENOMEM; 389 390 pos = skb_put(skb, 2 + sizeof(struct ieee80211_ht_operation)); 391 ieee80211_ie_build_ht_oper(pos, ht_cap, channel, channel_type); 392 393 return 0; 394 } 395 static void ieee80211_mesh_path_timer(unsigned long data) 396 { 397 struct ieee80211_sub_if_data *sdata = 398 (struct ieee80211_sub_if_data *) data; 399 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; 400 struct ieee80211_local *local = sdata->local; 401 402 if (local->quiescing) { 403 set_bit(TMR_RUNNING_MP, &ifmsh->timers_running); 404 return; 405 } 406 407 ieee80211_queue_work(&local->hw, &sdata->work); 408 } 409 410 static void ieee80211_mesh_path_root_timer(unsigned long data) 411 { 412 struct ieee80211_sub_if_data *sdata = 413 (struct ieee80211_sub_if_data *) data; 414 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; 415 struct ieee80211_local *local = sdata->local; 416 417 set_bit(MESH_WORK_ROOT, &ifmsh->wrkq_flags); 418 419 if (local->quiescing) { 420 set_bit(TMR_RUNNING_MPR, &ifmsh->timers_running); 421 return; 422 } 423 424 ieee80211_queue_work(&local->hw, &sdata->work); 425 } 426 427 void ieee80211_mesh_root_setup(struct ieee80211_if_mesh *ifmsh) 428 { 429 if (ifmsh->mshcfg.dot11MeshHWMPRootMode) 430 set_bit(MESH_WORK_ROOT, &ifmsh->wrkq_flags); 431 else { 432 clear_bit(MESH_WORK_ROOT, &ifmsh->wrkq_flags); 433 /* stop running timer */ 434 del_timer_sync(&ifmsh->mesh_path_root_timer); 435 } 436 } 437 438 /** 439 * ieee80211_fill_mesh_addresses - fill addresses of a locally originated mesh frame 440 * @hdr: 802.11 frame header 441 * @fc: frame control field 442 * @meshda: destination address in the mesh 443 * @meshsa: source address address in the mesh. Same as TA, as frame is 444 * locally originated. 445 * 446 * Return the length of the 802.11 (does not include a mesh control header) 447 */ 448 int ieee80211_fill_mesh_addresses(struct ieee80211_hdr *hdr, __le16 *fc, 449 const u8 *meshda, const u8 *meshsa) 450 { 451 if (is_multicast_ether_addr(meshda)) { 452 *fc |= cpu_to_le16(IEEE80211_FCTL_FROMDS); 453 /* DA TA SA */ 454 memcpy(hdr->addr1, meshda, ETH_ALEN); 455 memcpy(hdr->addr2, meshsa, ETH_ALEN); 456 memcpy(hdr->addr3, meshsa, ETH_ALEN); 457 return 24; 458 } else { 459 *fc |= cpu_to_le16(IEEE80211_FCTL_FROMDS | IEEE80211_FCTL_TODS); 460 /* RA TA DA SA */ 461 memset(hdr->addr1, 0, ETH_ALEN); /* RA is resolved later */ 462 memcpy(hdr->addr2, meshsa, ETH_ALEN); 463 memcpy(hdr->addr3, meshda, ETH_ALEN); 464 memcpy(hdr->addr4, meshsa, ETH_ALEN); 465 return 30; 466 } 467 } 468 469 /** 470 * ieee80211_new_mesh_header - create a new mesh header 471 * @meshhdr: uninitialized mesh header 472 * @sdata: mesh interface to be used 473 * @addr4or5: 1st address in the ae header, which may correspond to address 4 474 * (if addr6 is NULL) or address 5 (if addr6 is present). It may 475 * be NULL. 476 * @addr6: 2nd address in the ae header, which corresponds to addr6 of the 477 * mesh frame 478 * 479 * Return the header length. 480 */ 481 int ieee80211_new_mesh_header(struct ieee80211s_hdr *meshhdr, 482 struct ieee80211_sub_if_data *sdata, char *addr4or5, 483 char *addr6) 484 { 485 int aelen = 0; 486 BUG_ON(!addr4or5 && addr6); 487 memset(meshhdr, 0, sizeof(*meshhdr)); 488 meshhdr->ttl = sdata->u.mesh.mshcfg.dot11MeshTTL; 489 put_unaligned(cpu_to_le32(sdata->u.mesh.mesh_seqnum), &meshhdr->seqnum); 490 sdata->u.mesh.mesh_seqnum++; 491 if (addr4or5 && !addr6) { 492 meshhdr->flags |= MESH_FLAGS_AE_A4; 493 aelen += ETH_ALEN; 494 memcpy(meshhdr->eaddr1, addr4or5, ETH_ALEN); 495 } else if (addr4or5 && addr6) { 496 meshhdr->flags |= MESH_FLAGS_AE_A5_A6; 497 aelen += 2 * ETH_ALEN; 498 memcpy(meshhdr->eaddr1, addr4or5, ETH_ALEN); 499 memcpy(meshhdr->eaddr2, addr6, ETH_ALEN); 500 } 501 return 6 + aelen; 502 } 503 504 static void ieee80211_mesh_housekeeping(struct ieee80211_sub_if_data *sdata, 505 struct ieee80211_if_mesh *ifmsh) 506 { 507 bool free_plinks; 508 509 #ifdef CONFIG_MAC80211_VERBOSE_DEBUG 510 printk(KERN_DEBUG "%s: running mesh housekeeping\n", 511 sdata->name); 512 #endif 513 514 ieee80211_sta_expire(sdata, IEEE80211_MESH_PEER_INACTIVITY_LIMIT); 515 mesh_path_expire(sdata); 516 517 free_plinks = mesh_plink_availables(sdata); 518 if (free_plinks != sdata->u.mesh.accepting_plinks) 519 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BEACON); 520 521 mod_timer(&ifmsh->housekeeping_timer, 522 round_jiffies(jiffies + IEEE80211_MESH_HOUSEKEEPING_INTERVAL)); 523 } 524 525 static void ieee80211_mesh_rootpath(struct ieee80211_sub_if_data *sdata) 526 { 527 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; 528 529 mesh_path_tx_root_frame(sdata); 530 mod_timer(&ifmsh->mesh_path_root_timer, 531 round_jiffies(TU_TO_EXP_TIME( 532 ifmsh->mshcfg.dot11MeshHWMPRannInterval))); 533 } 534 535 #ifdef CONFIG_PM 536 void ieee80211_mesh_quiesce(struct ieee80211_sub_if_data *sdata) 537 { 538 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; 539 540 /* use atomic bitops in case all timers fire at the same time */ 541 542 if (del_timer_sync(&ifmsh->housekeeping_timer)) 543 set_bit(TMR_RUNNING_HK, &ifmsh->timers_running); 544 if (del_timer_sync(&ifmsh->mesh_path_timer)) 545 set_bit(TMR_RUNNING_MP, &ifmsh->timers_running); 546 if (del_timer_sync(&ifmsh->mesh_path_root_timer)) 547 set_bit(TMR_RUNNING_MPR, &ifmsh->timers_running); 548 } 549 550 void ieee80211_mesh_restart(struct ieee80211_sub_if_data *sdata) 551 { 552 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; 553 554 if (test_and_clear_bit(TMR_RUNNING_HK, &ifmsh->timers_running)) 555 add_timer(&ifmsh->housekeeping_timer); 556 if (test_and_clear_bit(TMR_RUNNING_MP, &ifmsh->timers_running)) 557 add_timer(&ifmsh->mesh_path_timer); 558 if (test_and_clear_bit(TMR_RUNNING_MPR, &ifmsh->timers_running)) 559 add_timer(&ifmsh->mesh_path_root_timer); 560 ieee80211_mesh_root_setup(ifmsh); 561 } 562 #endif 563 564 void ieee80211_start_mesh(struct ieee80211_sub_if_data *sdata) 565 { 566 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; 567 struct ieee80211_local *local = sdata->local; 568 569 local->fif_other_bss++; 570 /* mesh ifaces must set allmulti to forward mcast traffic */ 571 atomic_inc(&local->iff_allmultis); 572 ieee80211_configure_filter(local); 573 574 ifmsh->mesh_cc_id = 0; /* Disabled */ 575 ifmsh->mesh_auth_id = 0; /* Disabled */ 576 /* register sync ops from extensible synchronization framework */ 577 ifmsh->sync_ops = ieee80211_mesh_sync_ops_get(ifmsh->mesh_sp_id); 578 ifmsh->adjusting_tbtt = false; 579 ifmsh->sync_offset_clockdrift_max = 0; 580 set_bit(MESH_WORK_HOUSEKEEPING, &ifmsh->wrkq_flags); 581 ieee80211_mesh_root_setup(ifmsh); 582 ieee80211_queue_work(&local->hw, &sdata->work); 583 sdata->vif.bss_conf.beacon_int = MESH_DEFAULT_BEACON_INTERVAL; 584 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BEACON | 585 BSS_CHANGED_BEACON_ENABLED | 586 BSS_CHANGED_BEACON_INT); 587 } 588 589 void ieee80211_stop_mesh(struct ieee80211_sub_if_data *sdata) 590 { 591 struct ieee80211_local *local = sdata->local; 592 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; 593 594 ifmsh->mesh_id_len = 0; 595 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BEACON_ENABLED); 596 sta_info_flush(local, NULL); 597 598 del_timer_sync(&sdata->u.mesh.housekeeping_timer); 599 del_timer_sync(&sdata->u.mesh.mesh_path_root_timer); 600 /* 601 * If the timer fired while we waited for it, it will have 602 * requeued the work. Now the work will be running again 603 * but will not rearm the timer again because it checks 604 * whether the interface is running, which, at this point, 605 * it no longer is. 606 */ 607 cancel_work_sync(&sdata->work); 608 609 local->fif_other_bss--; 610 atomic_dec(&local->iff_allmultis); 611 ieee80211_configure_filter(local); 612 } 613 614 static void ieee80211_mesh_rx_bcn_presp(struct ieee80211_sub_if_data *sdata, 615 u16 stype, 616 struct ieee80211_mgmt *mgmt, 617 size_t len, 618 struct ieee80211_rx_status *rx_status) 619 { 620 struct ieee80211_local *local = sdata->local; 621 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; 622 struct ieee802_11_elems elems; 623 struct ieee80211_channel *channel; 624 u32 supp_rates = 0; 625 size_t baselen; 626 int freq; 627 enum ieee80211_band band = rx_status->band; 628 629 /* ignore ProbeResp to foreign address */ 630 if (stype == IEEE80211_STYPE_PROBE_RESP && 631 compare_ether_addr(mgmt->da, sdata->vif.addr)) 632 return; 633 634 baselen = (u8 *) mgmt->u.probe_resp.variable - (u8 *) mgmt; 635 if (baselen > len) 636 return; 637 638 ieee802_11_parse_elems(mgmt->u.probe_resp.variable, len - baselen, 639 &elems); 640 641 /* ignore beacons from secure mesh peers if our security is off */ 642 if (elems.rsn_len && sdata->u.mesh.security == IEEE80211_MESH_SEC_NONE) 643 return; 644 645 if (elems.ds_params && elems.ds_params_len == 1) 646 freq = ieee80211_channel_to_frequency(elems.ds_params[0], band); 647 else 648 freq = rx_status->freq; 649 650 channel = ieee80211_get_channel(local->hw.wiphy, freq); 651 652 if (!channel || channel->flags & IEEE80211_CHAN_DISABLED) 653 return; 654 655 if (elems.mesh_id && elems.mesh_config && 656 mesh_matches_local(&elems, sdata)) { 657 supp_rates = ieee80211_sta_get_rates(local, &elems, band); 658 mesh_neighbour_update(mgmt->sa, supp_rates, sdata, &elems); 659 } 660 661 if (ifmsh->sync_ops) 662 ifmsh->sync_ops->rx_bcn_presp(sdata, 663 stype, mgmt, &elems, rx_status); 664 } 665 666 static void ieee80211_mesh_rx_mgmt_action(struct ieee80211_sub_if_data *sdata, 667 struct ieee80211_mgmt *mgmt, 668 size_t len, 669 struct ieee80211_rx_status *rx_status) 670 { 671 switch (mgmt->u.action.category) { 672 case WLAN_CATEGORY_SELF_PROTECTED: 673 switch (mgmt->u.action.u.self_prot.action_code) { 674 case WLAN_SP_MESH_PEERING_OPEN: 675 case WLAN_SP_MESH_PEERING_CLOSE: 676 case WLAN_SP_MESH_PEERING_CONFIRM: 677 mesh_rx_plink_frame(sdata, mgmt, len, rx_status); 678 break; 679 } 680 break; 681 case WLAN_CATEGORY_MESH_ACTION: 682 if (mesh_action_is_path_sel(mgmt)) 683 mesh_rx_path_sel_frame(sdata, mgmt, len); 684 break; 685 } 686 } 687 688 void ieee80211_mesh_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata, 689 struct sk_buff *skb) 690 { 691 struct ieee80211_rx_status *rx_status; 692 struct ieee80211_mgmt *mgmt; 693 u16 stype; 694 695 rx_status = IEEE80211_SKB_RXCB(skb); 696 mgmt = (struct ieee80211_mgmt *) skb->data; 697 stype = le16_to_cpu(mgmt->frame_control) & IEEE80211_FCTL_STYPE; 698 699 switch (stype) { 700 case IEEE80211_STYPE_PROBE_RESP: 701 case IEEE80211_STYPE_BEACON: 702 ieee80211_mesh_rx_bcn_presp(sdata, stype, mgmt, skb->len, 703 rx_status); 704 break; 705 case IEEE80211_STYPE_ACTION: 706 ieee80211_mesh_rx_mgmt_action(sdata, mgmt, skb->len, rx_status); 707 break; 708 } 709 } 710 711 void ieee80211_mesh_work(struct ieee80211_sub_if_data *sdata) 712 { 713 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; 714 715 if (ifmsh->preq_queue_len && 716 time_after(jiffies, 717 ifmsh->last_preq + msecs_to_jiffies(ifmsh->mshcfg.dot11MeshHWMPpreqMinInterval))) 718 mesh_path_start_discovery(sdata); 719 720 if (test_and_clear_bit(MESH_WORK_GROW_MPATH_TABLE, &ifmsh->wrkq_flags)) 721 mesh_mpath_table_grow(); 722 723 if (test_and_clear_bit(MESH_WORK_GROW_MPP_TABLE, &ifmsh->wrkq_flags)) 724 mesh_mpp_table_grow(); 725 726 if (test_and_clear_bit(MESH_WORK_HOUSEKEEPING, &ifmsh->wrkq_flags)) 727 ieee80211_mesh_housekeeping(sdata, ifmsh); 728 729 if (test_and_clear_bit(MESH_WORK_ROOT, &ifmsh->wrkq_flags)) 730 ieee80211_mesh_rootpath(sdata); 731 732 if (test_and_clear_bit(MESH_WORK_DRIFT_ADJUST, &ifmsh->wrkq_flags)) 733 mesh_sync_adjust_tbtt(sdata); 734 } 735 736 void ieee80211_mesh_notify_scan_completed(struct ieee80211_local *local) 737 { 738 struct ieee80211_sub_if_data *sdata; 739 740 rcu_read_lock(); 741 list_for_each_entry_rcu(sdata, &local->interfaces, list) 742 if (ieee80211_vif_is_mesh(&sdata->vif)) 743 ieee80211_queue_work(&local->hw, &sdata->work); 744 rcu_read_unlock(); 745 } 746 747 void ieee80211_mesh_init_sdata(struct ieee80211_sub_if_data *sdata) 748 { 749 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; 750 751 setup_timer(&ifmsh->housekeeping_timer, 752 ieee80211_mesh_housekeeping_timer, 753 (unsigned long) sdata); 754 755 ifmsh->accepting_plinks = true; 756 ifmsh->preq_id = 0; 757 ifmsh->sn = 0; 758 ifmsh->num_gates = 0; 759 atomic_set(&ifmsh->mpaths, 0); 760 mesh_rmc_init(sdata); 761 ifmsh->last_preq = jiffies; 762 ifmsh->next_perr = jiffies; 763 /* Allocate all mesh structures when creating the first mesh interface. */ 764 if (!mesh_allocated) 765 ieee80211s_init(); 766 setup_timer(&ifmsh->mesh_path_timer, 767 ieee80211_mesh_path_timer, 768 (unsigned long) sdata); 769 setup_timer(&ifmsh->mesh_path_root_timer, 770 ieee80211_mesh_path_root_timer, 771 (unsigned long) sdata); 772 INIT_LIST_HEAD(&ifmsh->preq_queue.list); 773 spin_lock_init(&ifmsh->mesh_preq_queue_lock); 774 spin_lock_init(&ifmsh->sync_offset_lock); 775 } 776