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 mesh_add_ds_params_ie(struct sk_buff *skb, 324 struct ieee80211_sub_if_data *sdata) 325 { 326 struct ieee80211_local *local = sdata->local; 327 struct ieee80211_supported_band *sband; 328 u8 *pos; 329 330 if (skb_tailroom(skb) < 3) 331 return -ENOMEM; 332 333 sband = local->hw.wiphy->bands[local->hw.conf.channel->band]; 334 if (sband->band == IEEE80211_BAND_2GHZ) { 335 pos = skb_put(skb, 2 + 1); 336 *pos++ = WLAN_EID_DS_PARAMS; 337 *pos++ = 1; 338 *pos++ = ieee80211_frequency_to_channel(local->hw.conf.channel->center_freq); 339 } 340 341 return 0; 342 } 343 344 static void ieee80211_mesh_path_timer(unsigned long data) 345 { 346 struct ieee80211_sub_if_data *sdata = 347 (struct ieee80211_sub_if_data *) data; 348 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; 349 struct ieee80211_local *local = sdata->local; 350 351 if (local->quiescing) { 352 set_bit(TMR_RUNNING_MP, &ifmsh->timers_running); 353 return; 354 } 355 356 ieee80211_queue_work(&local->hw, &sdata->work); 357 } 358 359 static void ieee80211_mesh_path_root_timer(unsigned long data) 360 { 361 struct ieee80211_sub_if_data *sdata = 362 (struct ieee80211_sub_if_data *) data; 363 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; 364 struct ieee80211_local *local = sdata->local; 365 366 set_bit(MESH_WORK_ROOT, &ifmsh->wrkq_flags); 367 368 if (local->quiescing) { 369 set_bit(TMR_RUNNING_MPR, &ifmsh->timers_running); 370 return; 371 } 372 373 ieee80211_queue_work(&local->hw, &sdata->work); 374 } 375 376 void ieee80211_mesh_root_setup(struct ieee80211_if_mesh *ifmsh) 377 { 378 if (ifmsh->mshcfg.dot11MeshHWMPRootMode) 379 set_bit(MESH_WORK_ROOT, &ifmsh->wrkq_flags); 380 else { 381 clear_bit(MESH_WORK_ROOT, &ifmsh->wrkq_flags); 382 /* stop running timer */ 383 del_timer_sync(&ifmsh->mesh_path_root_timer); 384 } 385 } 386 387 /** 388 * ieee80211_fill_mesh_addresses - fill addresses of a locally originated mesh frame 389 * @hdr: 802.11 frame header 390 * @fc: frame control field 391 * @meshda: destination address in the mesh 392 * @meshsa: source address address in the mesh. Same as TA, as frame is 393 * locally originated. 394 * 395 * Return the length of the 802.11 (does not include a mesh control header) 396 */ 397 int ieee80211_fill_mesh_addresses(struct ieee80211_hdr *hdr, __le16 *fc, 398 const u8 *meshda, const u8 *meshsa) 399 { 400 if (is_multicast_ether_addr(meshda)) { 401 *fc |= cpu_to_le16(IEEE80211_FCTL_FROMDS); 402 /* DA TA SA */ 403 memcpy(hdr->addr1, meshda, ETH_ALEN); 404 memcpy(hdr->addr2, meshsa, ETH_ALEN); 405 memcpy(hdr->addr3, meshsa, ETH_ALEN); 406 return 24; 407 } else { 408 *fc |= cpu_to_le16(IEEE80211_FCTL_FROMDS | IEEE80211_FCTL_TODS); 409 /* RA TA DA SA */ 410 memset(hdr->addr1, 0, ETH_ALEN); /* RA is resolved later */ 411 memcpy(hdr->addr2, meshsa, ETH_ALEN); 412 memcpy(hdr->addr3, meshda, ETH_ALEN); 413 memcpy(hdr->addr4, meshsa, ETH_ALEN); 414 return 30; 415 } 416 } 417 418 /** 419 * ieee80211_new_mesh_header - create a new mesh header 420 * @meshhdr: uninitialized mesh header 421 * @sdata: mesh interface to be used 422 * @addr4or5: 1st address in the ae header, which may correspond to address 4 423 * (if addr6 is NULL) or address 5 (if addr6 is present). It may 424 * be NULL. 425 * @addr6: 2nd address in the ae header, which corresponds to addr6 of the 426 * mesh frame 427 * 428 * Return the header length. 429 */ 430 int ieee80211_new_mesh_header(struct ieee80211s_hdr *meshhdr, 431 struct ieee80211_sub_if_data *sdata, char *addr4or5, 432 char *addr6) 433 { 434 int aelen = 0; 435 BUG_ON(!addr4or5 && addr6); 436 memset(meshhdr, 0, sizeof(*meshhdr)); 437 meshhdr->ttl = sdata->u.mesh.mshcfg.dot11MeshTTL; 438 put_unaligned(cpu_to_le32(sdata->u.mesh.mesh_seqnum), &meshhdr->seqnum); 439 sdata->u.mesh.mesh_seqnum++; 440 if (addr4or5 && !addr6) { 441 meshhdr->flags |= MESH_FLAGS_AE_A4; 442 aelen += ETH_ALEN; 443 memcpy(meshhdr->eaddr1, addr4or5, ETH_ALEN); 444 } else if (addr4or5 && addr6) { 445 meshhdr->flags |= MESH_FLAGS_AE_A5_A6; 446 aelen += 2 * ETH_ALEN; 447 memcpy(meshhdr->eaddr1, addr4or5, ETH_ALEN); 448 memcpy(meshhdr->eaddr2, addr6, ETH_ALEN); 449 } 450 return 6 + aelen; 451 } 452 453 static void ieee80211_mesh_housekeeping(struct ieee80211_sub_if_data *sdata, 454 struct ieee80211_if_mesh *ifmsh) 455 { 456 bool free_plinks; 457 458 #ifdef CONFIG_MAC80211_VERBOSE_DEBUG 459 printk(KERN_DEBUG "%s: running mesh housekeeping\n", 460 sdata->name); 461 #endif 462 463 ieee80211_sta_expire(sdata, IEEE80211_MESH_PEER_INACTIVITY_LIMIT); 464 mesh_path_expire(sdata); 465 466 free_plinks = mesh_plink_availables(sdata); 467 if (free_plinks != sdata->u.mesh.accepting_plinks) 468 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BEACON); 469 470 mod_timer(&ifmsh->housekeeping_timer, 471 round_jiffies(jiffies + IEEE80211_MESH_HOUSEKEEPING_INTERVAL)); 472 } 473 474 static void ieee80211_mesh_rootpath(struct ieee80211_sub_if_data *sdata) 475 { 476 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; 477 478 mesh_path_tx_root_frame(sdata); 479 mod_timer(&ifmsh->mesh_path_root_timer, 480 round_jiffies(TU_TO_EXP_TIME( 481 ifmsh->mshcfg.dot11MeshHWMPRannInterval))); 482 } 483 484 #ifdef CONFIG_PM 485 void ieee80211_mesh_quiesce(struct ieee80211_sub_if_data *sdata) 486 { 487 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; 488 489 /* use atomic bitops in case all timers fire at the same time */ 490 491 if (del_timer_sync(&ifmsh->housekeeping_timer)) 492 set_bit(TMR_RUNNING_HK, &ifmsh->timers_running); 493 if (del_timer_sync(&ifmsh->mesh_path_timer)) 494 set_bit(TMR_RUNNING_MP, &ifmsh->timers_running); 495 if (del_timer_sync(&ifmsh->mesh_path_root_timer)) 496 set_bit(TMR_RUNNING_MPR, &ifmsh->timers_running); 497 } 498 499 void ieee80211_mesh_restart(struct ieee80211_sub_if_data *sdata) 500 { 501 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; 502 503 if (test_and_clear_bit(TMR_RUNNING_HK, &ifmsh->timers_running)) 504 add_timer(&ifmsh->housekeeping_timer); 505 if (test_and_clear_bit(TMR_RUNNING_MP, &ifmsh->timers_running)) 506 add_timer(&ifmsh->mesh_path_timer); 507 if (test_and_clear_bit(TMR_RUNNING_MPR, &ifmsh->timers_running)) 508 add_timer(&ifmsh->mesh_path_root_timer); 509 ieee80211_mesh_root_setup(ifmsh); 510 } 511 #endif 512 513 void ieee80211_start_mesh(struct ieee80211_sub_if_data *sdata) 514 { 515 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; 516 struct ieee80211_local *local = sdata->local; 517 518 local->fif_other_bss++; 519 /* mesh ifaces must set allmulti to forward mcast traffic */ 520 atomic_inc(&local->iff_allmultis); 521 ieee80211_configure_filter(local); 522 523 ifmsh->mesh_cc_id = 0; /* Disabled */ 524 ifmsh->mesh_sp_id = 0; /* Neighbor Offset */ 525 ifmsh->mesh_auth_id = 0; /* Disabled */ 526 set_bit(MESH_WORK_HOUSEKEEPING, &ifmsh->wrkq_flags); 527 ieee80211_mesh_root_setup(ifmsh); 528 ieee80211_queue_work(&local->hw, &sdata->work); 529 sdata->vif.bss_conf.beacon_int = MESH_DEFAULT_BEACON_INTERVAL; 530 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BEACON | 531 BSS_CHANGED_BEACON_ENABLED | 532 BSS_CHANGED_BEACON_INT); 533 } 534 535 void ieee80211_stop_mesh(struct ieee80211_sub_if_data *sdata) 536 { 537 struct ieee80211_local *local = sdata->local; 538 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; 539 540 ifmsh->mesh_id_len = 0; 541 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BEACON_ENABLED); 542 sta_info_flush(local, NULL); 543 544 del_timer_sync(&sdata->u.mesh.housekeeping_timer); 545 del_timer_sync(&sdata->u.mesh.mesh_path_root_timer); 546 /* 547 * If the timer fired while we waited for it, it will have 548 * requeued the work. Now the work will be running again 549 * but will not rearm the timer again because it checks 550 * whether the interface is running, which, at this point, 551 * it no longer is. 552 */ 553 cancel_work_sync(&sdata->work); 554 555 local->fif_other_bss--; 556 atomic_dec(&local->iff_allmultis); 557 ieee80211_configure_filter(local); 558 } 559 560 static void ieee80211_mesh_rx_bcn_presp(struct ieee80211_sub_if_data *sdata, 561 u16 stype, 562 struct ieee80211_mgmt *mgmt, 563 size_t len, 564 struct ieee80211_rx_status *rx_status) 565 { 566 struct ieee80211_local *local = sdata->local; 567 struct ieee802_11_elems elems; 568 struct ieee80211_channel *channel; 569 u32 supp_rates = 0; 570 size_t baselen; 571 int freq; 572 enum ieee80211_band band = rx_status->band; 573 574 /* ignore ProbeResp to foreign address */ 575 if (stype == IEEE80211_STYPE_PROBE_RESP && 576 compare_ether_addr(mgmt->da, sdata->vif.addr)) 577 return; 578 579 baselen = (u8 *) mgmt->u.probe_resp.variable - (u8 *) mgmt; 580 if (baselen > len) 581 return; 582 583 ieee802_11_parse_elems(mgmt->u.probe_resp.variable, len - baselen, 584 &elems); 585 586 /* ignore beacons from secure mesh peers if our security is off */ 587 if (elems.rsn_len && sdata->u.mesh.security == IEEE80211_MESH_SEC_NONE) 588 return; 589 590 if (elems.ds_params && elems.ds_params_len == 1) 591 freq = ieee80211_channel_to_frequency(elems.ds_params[0], band); 592 else 593 freq = rx_status->freq; 594 595 channel = ieee80211_get_channel(local->hw.wiphy, freq); 596 597 if (!channel || channel->flags & IEEE80211_CHAN_DISABLED) 598 return; 599 600 if (elems.mesh_id && elems.mesh_config && 601 mesh_matches_local(&elems, sdata)) { 602 supp_rates = ieee80211_sta_get_rates(local, &elems, band); 603 mesh_neighbour_update(mgmt->sa, supp_rates, sdata, &elems); 604 } 605 } 606 607 static void ieee80211_mesh_rx_mgmt_action(struct ieee80211_sub_if_data *sdata, 608 struct ieee80211_mgmt *mgmt, 609 size_t len, 610 struct ieee80211_rx_status *rx_status) 611 { 612 switch (mgmt->u.action.category) { 613 case WLAN_CATEGORY_SELF_PROTECTED: 614 switch (mgmt->u.action.u.self_prot.action_code) { 615 case WLAN_SP_MESH_PEERING_OPEN: 616 case WLAN_SP_MESH_PEERING_CLOSE: 617 case WLAN_SP_MESH_PEERING_CONFIRM: 618 mesh_rx_plink_frame(sdata, mgmt, len, rx_status); 619 break; 620 } 621 break; 622 case WLAN_CATEGORY_MESH_ACTION: 623 if (mesh_action_is_path_sel(mgmt)) 624 mesh_rx_path_sel_frame(sdata, mgmt, len); 625 break; 626 } 627 } 628 629 void ieee80211_mesh_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata, 630 struct sk_buff *skb) 631 { 632 struct ieee80211_rx_status *rx_status; 633 struct ieee80211_mgmt *mgmt; 634 u16 stype; 635 636 rx_status = IEEE80211_SKB_RXCB(skb); 637 mgmt = (struct ieee80211_mgmt *) skb->data; 638 stype = le16_to_cpu(mgmt->frame_control) & IEEE80211_FCTL_STYPE; 639 640 switch (stype) { 641 case IEEE80211_STYPE_PROBE_RESP: 642 case IEEE80211_STYPE_BEACON: 643 ieee80211_mesh_rx_bcn_presp(sdata, stype, mgmt, skb->len, 644 rx_status); 645 break; 646 case IEEE80211_STYPE_ACTION: 647 ieee80211_mesh_rx_mgmt_action(sdata, mgmt, skb->len, rx_status); 648 break; 649 } 650 } 651 652 void ieee80211_mesh_work(struct ieee80211_sub_if_data *sdata) 653 { 654 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; 655 656 if (ifmsh->preq_queue_len && 657 time_after(jiffies, 658 ifmsh->last_preq + msecs_to_jiffies(ifmsh->mshcfg.dot11MeshHWMPpreqMinInterval))) 659 mesh_path_start_discovery(sdata); 660 661 if (test_and_clear_bit(MESH_WORK_GROW_MPATH_TABLE, &ifmsh->wrkq_flags)) 662 mesh_mpath_table_grow(); 663 664 if (test_and_clear_bit(MESH_WORK_GROW_MPP_TABLE, &ifmsh->wrkq_flags)) 665 mesh_mpp_table_grow(); 666 667 if (test_and_clear_bit(MESH_WORK_HOUSEKEEPING, &ifmsh->wrkq_flags)) 668 ieee80211_mesh_housekeeping(sdata, ifmsh); 669 670 if (test_and_clear_bit(MESH_WORK_ROOT, &ifmsh->wrkq_flags)) 671 ieee80211_mesh_rootpath(sdata); 672 } 673 674 void ieee80211_mesh_notify_scan_completed(struct ieee80211_local *local) 675 { 676 struct ieee80211_sub_if_data *sdata; 677 678 rcu_read_lock(); 679 list_for_each_entry_rcu(sdata, &local->interfaces, list) 680 if (ieee80211_vif_is_mesh(&sdata->vif)) 681 ieee80211_queue_work(&local->hw, &sdata->work); 682 rcu_read_unlock(); 683 } 684 685 void ieee80211_mesh_init_sdata(struct ieee80211_sub_if_data *sdata) 686 { 687 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; 688 689 setup_timer(&ifmsh->housekeeping_timer, 690 ieee80211_mesh_housekeeping_timer, 691 (unsigned long) sdata); 692 693 ifmsh->accepting_plinks = true; 694 ifmsh->preq_id = 0; 695 ifmsh->sn = 0; 696 ifmsh->num_gates = 0; 697 atomic_set(&ifmsh->mpaths, 0); 698 mesh_rmc_init(sdata); 699 ifmsh->last_preq = jiffies; 700 /* Allocate all mesh structures when creating the first mesh interface. */ 701 if (!mesh_allocated) 702 ieee80211s_init(); 703 setup_timer(&ifmsh->mesh_path_timer, 704 ieee80211_mesh_path_timer, 705 (unsigned long) sdata); 706 setup_timer(&ifmsh->mesh_path_root_timer, 707 ieee80211_mesh_path_root_timer, 708 (unsigned long) sdata); 709 INIT_LIST_HEAD(&ifmsh->preq_queue.list); 710 spin_lock_init(&ifmsh->mesh_preq_queue_lock); 711 } 712