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