mesh_plink.c revision c7e678115a2693782a9950d33b1a2e602e2c6b70
1/* 2 * Copyright (c) 2008, 2009 open80211s Ltd. 3 * Author: Luis Carlos Cobo <luisca@cozybit.com> 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License version 2 as 7 * published by the Free Software Foundation. 8 */ 9#include <linux/gfp.h> 10#include <linux/kernel.h> 11#include <linux/random.h> 12#include "ieee80211_i.h" 13#include "rate.h" 14#include "mesh.h" 15 16#define PLINK_GET_LLID(p) (p + 2) 17#define PLINK_GET_PLID(p) (p + 4) 18 19#define mod_plink_timer(s, t) (mod_timer(&s->plink_timer, \ 20 jiffies + HZ * t / 1000)) 21 22enum plink_event { 23 PLINK_UNDEFINED, 24 OPN_ACPT, 25 OPN_RJCT, 26 OPN_IGNR, 27 CNF_ACPT, 28 CNF_RJCT, 29 CNF_IGNR, 30 CLS_ACPT, 31 CLS_IGNR 32}; 33 34static const char * const mplstates[] = { 35 [NL80211_PLINK_LISTEN] = "LISTEN", 36 [NL80211_PLINK_OPN_SNT] = "OPN-SNT", 37 [NL80211_PLINK_OPN_RCVD] = "OPN-RCVD", 38 [NL80211_PLINK_CNF_RCVD] = "CNF_RCVD", 39 [NL80211_PLINK_ESTAB] = "ESTAB", 40 [NL80211_PLINK_HOLDING] = "HOLDING", 41 [NL80211_PLINK_BLOCKED] = "BLOCKED" 42}; 43 44static const char * const mplevents[] = { 45 [PLINK_UNDEFINED] = "NONE", 46 [OPN_ACPT] = "OPN_ACPT", 47 [OPN_RJCT] = "OPN_RJCT", 48 [OPN_IGNR] = "OPN_IGNR", 49 [CNF_ACPT] = "CNF_ACPT", 50 [CNF_RJCT] = "CNF_RJCT", 51 [CNF_IGNR] = "CNF_IGNR", 52 [CLS_ACPT] = "CLS_ACPT", 53 [CLS_IGNR] = "CLS_IGNR" 54}; 55 56static int mesh_plink_frame_tx(struct ieee80211_sub_if_data *sdata, 57 enum ieee80211_self_protected_actioncode action, 58 u8 *da, __le16 llid, __le16 plid, __le16 reason); 59 60 61/* We only need a valid sta if user configured a minimum rssi_threshold. */ 62static bool rssi_threshold_check(struct ieee80211_sub_if_data *sdata, 63 struct sta_info *sta) 64{ 65 s32 rssi_threshold = sdata->u.mesh.mshcfg.rssi_threshold; 66 return rssi_threshold == 0 || 67 (sta && (s8) -ewma_read(&sta->avg_signal) > rssi_threshold); 68} 69 70/** 71 * mesh_plink_fsm_restart - restart a mesh peer link finite state machine 72 * 73 * @sta: mesh peer link to restart 74 * 75 * Locking: this function must be called holding sta->lock 76 */ 77static inline void mesh_plink_fsm_restart(struct sta_info *sta) 78{ 79 sta->plink_state = NL80211_PLINK_LISTEN; 80 sta->llid = sta->plid = sta->reason = 0; 81 sta->plink_retries = 0; 82} 83 84/* 85 * mesh_set_short_slot_time - enable / disable ERP short slot time. 86 * 87 * The standard indirectly mandates mesh STAs to turn off short slot time by 88 * disallowing advertising this (802.11-2012 8.4.1.4), but that doesn't mean we 89 * can't be sneaky about it. Enable short slot time if all mesh STAs in the 90 * MBSS support ERP rates. 91 * 92 * Returns BSS_CHANGED_ERP_SLOT or 0 for no change. 93 */ 94static u32 mesh_set_short_slot_time(struct ieee80211_sub_if_data *sdata) 95{ 96 struct ieee80211_local *local = sdata->local; 97 enum ieee80211_band band = ieee80211_get_sdata_band(sdata); 98 struct ieee80211_supported_band *sband = local->hw.wiphy->bands[band]; 99 struct sta_info *sta; 100 u32 erp_rates = 0, changed = 0; 101 int i; 102 bool short_slot = false; 103 104 if (band == IEEE80211_BAND_5GHZ) { 105 /* (IEEE 802.11-2012 19.4.5) */ 106 short_slot = true; 107 goto out; 108 } else if (band != IEEE80211_BAND_2GHZ || 109 (band == IEEE80211_BAND_2GHZ && 110 local->hw.flags & IEEE80211_HW_2GHZ_SHORT_SLOT_INCAPABLE)) 111 goto out; 112 113 for (i = 0; i < sband->n_bitrates; i++) 114 if (sband->bitrates[i].flags & IEEE80211_RATE_ERP_G) 115 erp_rates |= BIT(i); 116 117 if (!erp_rates) 118 goto out; 119 120 rcu_read_lock(); 121 list_for_each_entry_rcu(sta, &local->sta_list, list) { 122 if (sdata != sta->sdata || 123 sta->plink_state != NL80211_PLINK_ESTAB) 124 continue; 125 126 short_slot = false; 127 if (erp_rates & sta->sta.supp_rates[band]) 128 short_slot = true; 129 else 130 break; 131 } 132 rcu_read_unlock(); 133 134out: 135 if (sdata->vif.bss_conf.use_short_slot != short_slot) { 136 sdata->vif.bss_conf.use_short_slot = short_slot; 137 changed = BSS_CHANGED_ERP_SLOT; 138 mpl_dbg(sdata, "mesh_plink %pM: ERP short slot time %d\n", 139 sdata->vif.addr, short_slot); 140 } 141 return changed; 142} 143 144/** 145 * mesh_set_ht_prot_mode - set correct HT protection mode 146 * 147 * Section 9.23.3.5 of IEEE 80211-2012 describes the protection rules for HT 148 * mesh STA in a MBSS. Three HT protection modes are supported for now, non-HT 149 * mixed mode, 20MHz-protection and no-protection mode. non-HT mixed mode is 150 * selected if any non-HT peers are present in our MBSS. 20MHz-protection mode 151 * is selected if all peers in our 20/40MHz MBSS support HT and atleast one 152 * HT20 peer is present. Otherwise no-protection mode is selected. 153 */ 154static u32 mesh_set_ht_prot_mode(struct ieee80211_sub_if_data *sdata) 155{ 156 struct ieee80211_local *local = sdata->local; 157 struct sta_info *sta; 158 u16 ht_opmode; 159 bool non_ht_sta = false, ht20_sta = false; 160 161 switch (sdata->vif.bss_conf.chandef.width) { 162 case NL80211_CHAN_WIDTH_20_NOHT: 163 case NL80211_CHAN_WIDTH_5: 164 case NL80211_CHAN_WIDTH_10: 165 return 0; 166 default: 167 break; 168 } 169 170 rcu_read_lock(); 171 list_for_each_entry_rcu(sta, &local->sta_list, list) { 172 if (sdata != sta->sdata || 173 sta->plink_state != NL80211_PLINK_ESTAB) 174 continue; 175 176 if (sta->sta.bandwidth > IEEE80211_STA_RX_BW_20) 177 continue; 178 179 if (!sta->sta.ht_cap.ht_supported) { 180 mpl_dbg(sdata, "nonHT sta (%pM) is present\n", 181 sta->sta.addr); 182 non_ht_sta = true; 183 break; 184 } 185 186 mpl_dbg(sdata, "HT20 sta (%pM) is present\n", sta->sta.addr); 187 ht20_sta = true; 188 } 189 rcu_read_unlock(); 190 191 if (non_ht_sta) 192 ht_opmode = IEEE80211_HT_OP_MODE_PROTECTION_NONHT_MIXED; 193 else if (ht20_sta && 194 sdata->vif.bss_conf.chandef.width > NL80211_CHAN_WIDTH_20) 195 ht_opmode = IEEE80211_HT_OP_MODE_PROTECTION_20MHZ; 196 else 197 ht_opmode = IEEE80211_HT_OP_MODE_PROTECTION_NONE; 198 199 if (sdata->vif.bss_conf.ht_operation_mode == ht_opmode) 200 return 0; 201 202 sdata->vif.bss_conf.ht_operation_mode = ht_opmode; 203 sdata->u.mesh.mshcfg.ht_opmode = ht_opmode; 204 mpl_dbg(sdata, "selected new HT protection mode %d\n", ht_opmode); 205 return BSS_CHANGED_HT; 206} 207 208/** 209 * __mesh_plink_deactivate - deactivate mesh peer link 210 * 211 * @sta: mesh peer link to deactivate 212 * 213 * All mesh paths with this peer as next hop will be flushed 214 * Returns beacon changed flag if the beacon content changed. 215 * 216 * Locking: the caller must hold sta->lock 217 */ 218static u32 __mesh_plink_deactivate(struct sta_info *sta) 219{ 220 struct ieee80211_sub_if_data *sdata = sta->sdata; 221 u32 changed = 0; 222 223 if (sta->plink_state == NL80211_PLINK_ESTAB) 224 changed = mesh_plink_dec_estab_count(sdata); 225 sta->plink_state = NL80211_PLINK_BLOCKED; 226 mesh_path_flush_by_nexthop(sta); 227 228 ieee80211_mps_sta_status_update(sta); 229 changed |= ieee80211_mps_set_sta_local_pm(sta, 230 NL80211_MESH_POWER_UNKNOWN); 231 232 return changed; 233} 234 235/** 236 * mesh_plink_deactivate - deactivate mesh peer link 237 * 238 * @sta: mesh peer link to deactivate 239 * 240 * All mesh paths with this peer as next hop will be flushed 241 */ 242u32 mesh_plink_deactivate(struct sta_info *sta) 243{ 244 struct ieee80211_sub_if_data *sdata = sta->sdata; 245 u32 changed; 246 247 spin_lock_bh(&sta->lock); 248 changed = __mesh_plink_deactivate(sta); 249 sta->reason = cpu_to_le16(WLAN_REASON_MESH_PEER_CANCELED); 250 mesh_plink_frame_tx(sdata, WLAN_SP_MESH_PEERING_CLOSE, 251 sta->sta.addr, sta->llid, sta->plid, 252 sta->reason); 253 spin_unlock_bh(&sta->lock); 254 255 return changed; 256} 257 258static int mesh_plink_frame_tx(struct ieee80211_sub_if_data *sdata, 259 enum ieee80211_self_protected_actioncode action, 260 u8 *da, __le16 llid, __le16 plid, __le16 reason) 261{ 262 struct ieee80211_local *local = sdata->local; 263 struct sk_buff *skb; 264 struct ieee80211_tx_info *info; 265 struct ieee80211_mgmt *mgmt; 266 bool include_plid = false; 267 u16 peering_proto = 0; 268 u8 *pos, ie_len = 4; 269 int hdr_len = offsetof(struct ieee80211_mgmt, u.action.u.self_prot) + 270 sizeof(mgmt->u.action.u.self_prot); 271 int err = -ENOMEM; 272 273 skb = dev_alloc_skb(local->tx_headroom + 274 hdr_len + 275 2 + /* capability info */ 276 2 + /* AID */ 277 2 + 8 + /* supported rates */ 278 2 + (IEEE80211_MAX_SUPP_RATES - 8) + 279 2 + sdata->u.mesh.mesh_id_len + 280 2 + sizeof(struct ieee80211_meshconf_ie) + 281 2 + sizeof(struct ieee80211_ht_cap) + 282 2 + sizeof(struct ieee80211_ht_operation) + 283 2 + 8 + /* peering IE */ 284 sdata->u.mesh.ie_len); 285 if (!skb) 286 return err; 287 info = IEEE80211_SKB_CB(skb); 288 skb_reserve(skb, local->tx_headroom); 289 mgmt = (struct ieee80211_mgmt *) skb_put(skb, hdr_len); 290 memset(mgmt, 0, hdr_len); 291 mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT | 292 IEEE80211_STYPE_ACTION); 293 memcpy(mgmt->da, da, ETH_ALEN); 294 memcpy(mgmt->sa, sdata->vif.addr, ETH_ALEN); 295 memcpy(mgmt->bssid, sdata->vif.addr, ETH_ALEN); 296 mgmt->u.action.category = WLAN_CATEGORY_SELF_PROTECTED; 297 mgmt->u.action.u.self_prot.action_code = action; 298 299 if (action != WLAN_SP_MESH_PEERING_CLOSE) { 300 enum ieee80211_band band = ieee80211_get_sdata_band(sdata); 301 302 /* capability info */ 303 pos = skb_put(skb, 2); 304 memset(pos, 0, 2); 305 if (action == WLAN_SP_MESH_PEERING_CONFIRM) { 306 /* AID */ 307 pos = skb_put(skb, 2); 308 memcpy(pos + 2, &plid, 2); 309 } 310 if (ieee80211_add_srates_ie(sdata, skb, true, band) || 311 ieee80211_add_ext_srates_ie(sdata, skb, true, band) || 312 mesh_add_rsn_ie(sdata, skb) || 313 mesh_add_meshid_ie(sdata, skb) || 314 mesh_add_meshconf_ie(sdata, skb)) 315 goto free; 316 } else { /* WLAN_SP_MESH_PEERING_CLOSE */ 317 info->flags |= IEEE80211_TX_CTL_NO_ACK; 318 if (mesh_add_meshid_ie(sdata, skb)) 319 goto free; 320 } 321 322 /* Add Mesh Peering Management element */ 323 switch (action) { 324 case WLAN_SP_MESH_PEERING_OPEN: 325 break; 326 case WLAN_SP_MESH_PEERING_CONFIRM: 327 ie_len += 2; 328 include_plid = true; 329 break; 330 case WLAN_SP_MESH_PEERING_CLOSE: 331 if (plid) { 332 ie_len += 2; 333 include_plid = true; 334 } 335 ie_len += 2; /* reason code */ 336 break; 337 default: 338 err = -EINVAL; 339 goto free; 340 } 341 342 if (WARN_ON(skb_tailroom(skb) < 2 + ie_len)) 343 goto free; 344 345 pos = skb_put(skb, 2 + ie_len); 346 *pos++ = WLAN_EID_PEER_MGMT; 347 *pos++ = ie_len; 348 memcpy(pos, &peering_proto, 2); 349 pos += 2; 350 memcpy(pos, &llid, 2); 351 pos += 2; 352 if (include_plid) { 353 memcpy(pos, &plid, 2); 354 pos += 2; 355 } 356 if (action == WLAN_SP_MESH_PEERING_CLOSE) { 357 memcpy(pos, &reason, 2); 358 pos += 2; 359 } 360 361 if (action != WLAN_SP_MESH_PEERING_CLOSE) { 362 if (mesh_add_ht_cap_ie(sdata, skb) || 363 mesh_add_ht_oper_ie(sdata, skb)) 364 goto free; 365 } 366 367 if (mesh_add_vendor_ies(sdata, skb)) 368 goto free; 369 370 ieee80211_tx_skb(sdata, skb); 371 return 0; 372free: 373 kfree_skb(skb); 374 return err; 375} 376 377static void mesh_sta_info_init(struct ieee80211_sub_if_data *sdata, 378 struct sta_info *sta, 379 struct ieee802_11_elems *elems, bool insert) 380{ 381 struct ieee80211_local *local = sdata->local; 382 enum ieee80211_band band = ieee80211_get_sdata_band(sdata); 383 struct ieee80211_supported_band *sband; 384 u32 rates, basic_rates = 0, changed = 0; 385 386 sband = local->hw.wiphy->bands[band]; 387 rates = ieee80211_sta_get_rates(sdata, elems, band, &basic_rates); 388 389 spin_lock_bh(&sta->lock); 390 sta->last_rx = jiffies; 391 392 /* rates and capabilities don't change during peering */ 393 if (sta->plink_state == NL80211_PLINK_ESTAB) 394 goto out; 395 396 if (sta->sta.supp_rates[band] != rates) 397 changed |= IEEE80211_RC_SUPP_RATES_CHANGED; 398 sta->sta.supp_rates[band] = rates; 399 400 if (ieee80211_ht_cap_ie_to_sta_ht_cap(sdata, sband, 401 elems->ht_cap_elem, sta)) 402 changed |= IEEE80211_RC_BW_CHANGED; 403 404 /* HT peer is operating 20MHz-only */ 405 if (elems->ht_operation && 406 !(elems->ht_operation->ht_param & 407 IEEE80211_HT_PARAM_CHAN_WIDTH_ANY)) { 408 if (sta->sta.bandwidth != IEEE80211_STA_RX_BW_20) 409 changed |= IEEE80211_RC_BW_CHANGED; 410 sta->sta.bandwidth = IEEE80211_STA_RX_BW_20; 411 } 412 413 if (insert) 414 rate_control_rate_init(sta); 415 else 416 rate_control_rate_update(local, sband, sta, changed); 417out: 418 spin_unlock_bh(&sta->lock); 419} 420 421static struct sta_info * 422__mesh_sta_info_alloc(struct ieee80211_sub_if_data *sdata, u8 *hw_addr) 423{ 424 struct sta_info *sta; 425 426 if (sdata->local->num_sta >= MESH_MAX_PLINKS) 427 return NULL; 428 429 sta = sta_info_alloc(sdata, hw_addr, GFP_KERNEL); 430 if (!sta) 431 return NULL; 432 433 sta->plink_state = NL80211_PLINK_LISTEN; 434 435 sta_info_pre_move_state(sta, IEEE80211_STA_AUTH); 436 sta_info_pre_move_state(sta, IEEE80211_STA_ASSOC); 437 sta_info_pre_move_state(sta, IEEE80211_STA_AUTHORIZED); 438 439 set_sta_flag(sta, WLAN_STA_WME); 440 441 return sta; 442} 443 444static struct sta_info * 445mesh_sta_info_alloc(struct ieee80211_sub_if_data *sdata, u8 *addr, 446 struct ieee802_11_elems *elems) 447{ 448 struct sta_info *sta = NULL; 449 450 /* Userspace handles station allocation */ 451 if (sdata->u.mesh.user_mpm || 452 sdata->u.mesh.security & IEEE80211_MESH_SEC_AUTHED) 453 cfg80211_notify_new_peer_candidate(sdata->dev, addr, 454 elems->ie_start, 455 elems->total_len, 456 GFP_KERNEL); 457 else 458 sta = __mesh_sta_info_alloc(sdata, addr); 459 460 return sta; 461} 462 463/* 464 * mesh_sta_info_get - return mesh sta info entry for @addr. 465 * 466 * @sdata: local meshif 467 * @addr: peer's address 468 * @elems: IEs from beacon or mesh peering frame. 469 * 470 * Return existing or newly allocated sta_info under RCU read lock. 471 * (re)initialize with given IEs. 472 */ 473static struct sta_info * 474mesh_sta_info_get(struct ieee80211_sub_if_data *sdata, 475 u8 *addr, struct ieee802_11_elems *elems) __acquires(RCU) 476{ 477 struct sta_info *sta = NULL; 478 479 rcu_read_lock(); 480 sta = sta_info_get(sdata, addr); 481 if (sta) { 482 mesh_sta_info_init(sdata, sta, elems, false); 483 } else { 484 rcu_read_unlock(); 485 /* can't run atomic */ 486 sta = mesh_sta_info_alloc(sdata, addr, elems); 487 if (!sta) { 488 rcu_read_lock(); 489 return NULL; 490 } 491 492 mesh_sta_info_init(sdata, sta, elems, true); 493 494 if (sta_info_insert_rcu(sta)) 495 return NULL; 496 } 497 498 return sta; 499} 500 501/* 502 * mesh_neighbour_update - update or initialize new mesh neighbor. 503 * 504 * @sdata: local meshif 505 * @addr: peer's address 506 * @elems: IEs from beacon or mesh peering frame 507 * 508 * Initiates peering if appropriate. 509 */ 510void mesh_neighbour_update(struct ieee80211_sub_if_data *sdata, 511 u8 *hw_addr, 512 struct ieee802_11_elems *elems) 513{ 514 struct sta_info *sta; 515 u32 changed = 0; 516 517 sta = mesh_sta_info_get(sdata, hw_addr, elems); 518 if (!sta) 519 goto out; 520 521 if (mesh_peer_accepts_plinks(elems) && 522 sta->plink_state == NL80211_PLINK_LISTEN && 523 sdata->u.mesh.accepting_plinks && 524 sdata->u.mesh.mshcfg.auto_open_plinks && 525 rssi_threshold_check(sdata, sta)) 526 changed = mesh_plink_open(sta); 527 528 ieee80211_mps_frame_release(sta, elems); 529out: 530 rcu_read_unlock(); 531 ieee80211_mbss_info_change_notify(sdata, changed); 532} 533 534static void mesh_plink_timer(unsigned long data) 535{ 536 struct sta_info *sta; 537 __le16 llid, plid, reason; 538 struct ieee80211_sub_if_data *sdata; 539 struct mesh_config *mshcfg; 540 enum ieee80211_self_protected_actioncode action = 0; 541 542 /* 543 * This STA is valid because sta_info_destroy() will 544 * del_timer_sync() this timer after having made sure 545 * it cannot be readded (by deleting the plink.) 546 */ 547 sta = (struct sta_info *) data; 548 549 if (sta->sdata->local->quiescing) 550 return; 551 552 spin_lock_bh(&sta->lock); 553 if (sta->ignore_plink_timer) { 554 sta->ignore_plink_timer = false; 555 spin_unlock_bh(&sta->lock); 556 return; 557 } 558 mpl_dbg(sta->sdata, 559 "Mesh plink timer for %pM fired on state %s\n", 560 sta->sta.addr, mplstates[sta->plink_state]); 561 reason = 0; 562 llid = sta->llid; 563 plid = sta->plid; 564 sdata = sta->sdata; 565 mshcfg = &sdata->u.mesh.mshcfg; 566 567 switch (sta->plink_state) { 568 case NL80211_PLINK_OPN_RCVD: 569 case NL80211_PLINK_OPN_SNT: 570 /* retry timer */ 571 if (sta->plink_retries < mshcfg->dot11MeshMaxRetries) { 572 u32 rand; 573 mpl_dbg(sta->sdata, 574 "Mesh plink for %pM (retry, timeout): %d %d\n", 575 sta->sta.addr, sta->plink_retries, 576 sta->plink_timeout); 577 get_random_bytes(&rand, sizeof(u32)); 578 sta->plink_timeout = sta->plink_timeout + 579 rand % sta->plink_timeout; 580 ++sta->plink_retries; 581 mod_plink_timer(sta, sta->plink_timeout); 582 action = WLAN_SP_MESH_PEERING_OPEN; 583 break; 584 } 585 reason = cpu_to_le16(WLAN_REASON_MESH_MAX_RETRIES); 586 /* fall through on else */ 587 case NL80211_PLINK_CNF_RCVD: 588 /* confirm timer */ 589 if (!reason) 590 reason = cpu_to_le16(WLAN_REASON_MESH_CONFIRM_TIMEOUT); 591 sta->plink_state = NL80211_PLINK_HOLDING; 592 mod_plink_timer(sta, mshcfg->dot11MeshHoldingTimeout); 593 action = WLAN_SP_MESH_PEERING_CLOSE; 594 break; 595 case NL80211_PLINK_HOLDING: 596 /* holding timer */ 597 del_timer(&sta->plink_timer); 598 mesh_plink_fsm_restart(sta); 599 break; 600 default: 601 break; 602 } 603 spin_unlock_bh(&sta->lock); 604 if (action) 605 mesh_plink_frame_tx(sdata, action, sta->sta.addr, 606 llid, plid, reason); 607} 608 609static inline void mesh_plink_timer_set(struct sta_info *sta, int timeout) 610{ 611 sta->plink_timer.expires = jiffies + (HZ * timeout / 1000); 612 sta->plink_timer.data = (unsigned long) sta; 613 sta->plink_timer.function = mesh_plink_timer; 614 sta->plink_timeout = timeout; 615 add_timer(&sta->plink_timer); 616} 617 618u32 mesh_plink_open(struct sta_info *sta) 619{ 620 __le16 llid; 621 struct ieee80211_sub_if_data *sdata = sta->sdata; 622 u32 changed; 623 624 if (!test_sta_flag(sta, WLAN_STA_AUTH)) 625 return 0; 626 627 spin_lock_bh(&sta->lock); 628 get_random_bytes(&llid, 2); 629 sta->llid = llid; 630 if (sta->plink_state != NL80211_PLINK_LISTEN && 631 sta->plink_state != NL80211_PLINK_BLOCKED) { 632 spin_unlock_bh(&sta->lock); 633 return 0; 634 } 635 sta->plink_state = NL80211_PLINK_OPN_SNT; 636 mesh_plink_timer_set(sta, sdata->u.mesh.mshcfg.dot11MeshRetryTimeout); 637 spin_unlock_bh(&sta->lock); 638 mpl_dbg(sdata, 639 "Mesh plink: starting establishment with %pM\n", 640 sta->sta.addr); 641 642 /* set the non-peer mode to active during peering */ 643 changed = ieee80211_mps_local_status_update(sdata); 644 645 mesh_plink_frame_tx(sdata, WLAN_SP_MESH_PEERING_OPEN, 646 sta->sta.addr, llid, 0, 0); 647 return changed; 648} 649 650u32 mesh_plink_block(struct sta_info *sta) 651{ 652 u32 changed; 653 654 spin_lock_bh(&sta->lock); 655 changed = __mesh_plink_deactivate(sta); 656 sta->plink_state = NL80211_PLINK_BLOCKED; 657 spin_unlock_bh(&sta->lock); 658 659 return changed; 660} 661 662static void mesh_plink_close(struct ieee80211_sub_if_data *sdata, 663 struct sta_info *sta, 664 enum plink_event event) 665{ 666 struct mesh_config *mshcfg = &sdata->u.mesh.mshcfg; 667 668 __le16 reason = (event == CLS_ACPT) ? 669 cpu_to_le16(WLAN_REASON_MESH_CLOSE) : 670 cpu_to_le16(WLAN_REASON_MESH_CONFIG); 671 672 sta->reason = reason; 673 sta->plink_state = NL80211_PLINK_HOLDING; 674 mod_plink_timer(sta, mshcfg->dot11MeshHoldingTimeout); 675} 676 677static u32 mesh_plink_establish(struct ieee80211_sub_if_data *sdata, 678 struct sta_info *sta) 679{ 680 struct mesh_config *mshcfg = &sdata->u.mesh.mshcfg; 681 u32 changed = 0; 682 683 del_timer(&sta->plink_timer); 684 sta->plink_state = NL80211_PLINK_ESTAB; 685 changed |= mesh_plink_inc_estab_count(sdata); 686 changed |= mesh_set_ht_prot_mode(sdata); 687 changed |= mesh_set_short_slot_time(sdata); 688 mpl_dbg(sdata, "Mesh plink with %pM ESTABLISHED\n", sta->sta.addr); 689 ieee80211_mps_sta_status_update(sta); 690 changed |= ieee80211_mps_set_sta_local_pm(sta, mshcfg->power_mode); 691 return changed; 692} 693 694/** 695 * mesh_plink_fsm - step @sta MPM based on @event 696 * 697 * @sdata: interface 698 * @sta: mesh neighbor 699 * @event: peering event 700 * 701 * Return: changed MBSS flags 702 */ 703static u32 mesh_plink_fsm(struct ieee80211_sub_if_data *sdata, 704 struct sta_info *sta, enum plink_event event) 705{ 706 struct mesh_config *mshcfg = &sdata->u.mesh.mshcfg; 707 enum ieee80211_self_protected_actioncode action = 0; 708 u32 changed = 0; 709 710 mpl_dbg(sdata, "peer %pM in state %s got event %s\n", sta->sta.addr, 711 mplstates[sta->plink_state], mplevents[event]); 712 713 spin_lock_bh(&sta->lock); 714 switch (sta->plink_state) { 715 case NL80211_PLINK_LISTEN: 716 switch (event) { 717 case CLS_ACPT: 718 mesh_plink_fsm_restart(sta); 719 break; 720 case OPN_ACPT: 721 sta->plink_state = NL80211_PLINK_OPN_RCVD; 722 get_random_bytes(&sta->llid, 2); 723 mesh_plink_timer_set(sta, 724 mshcfg->dot11MeshRetryTimeout); 725 726 /* set the non-peer mode to active during peering */ 727 changed |= ieee80211_mps_local_status_update(sdata); 728 action = WLAN_SP_MESH_PEERING_OPEN; 729 break; 730 default: 731 break; 732 } 733 break; 734 case NL80211_PLINK_OPN_SNT: 735 switch (event) { 736 case OPN_RJCT: 737 case CNF_RJCT: 738 case CLS_ACPT: 739 mesh_plink_close(sdata, sta, event); 740 action = WLAN_SP_MESH_PEERING_CLOSE; 741 break; 742 case OPN_ACPT: 743 /* retry timer is left untouched */ 744 sta->plink_state = NL80211_PLINK_OPN_RCVD; 745 action = WLAN_SP_MESH_PEERING_CONFIRM; 746 break; 747 case CNF_ACPT: 748 sta->plink_state = NL80211_PLINK_CNF_RCVD; 749 if (!mod_plink_timer(sta, 750 mshcfg->dot11MeshConfirmTimeout)) 751 sta->ignore_plink_timer = true; 752 break; 753 default: 754 break; 755 } 756 break; 757 case NL80211_PLINK_OPN_RCVD: 758 switch (event) { 759 case OPN_RJCT: 760 case CNF_RJCT: 761 case CLS_ACPT: 762 mesh_plink_close(sdata, sta, event); 763 action = WLAN_SP_MESH_PEERING_CLOSE; 764 break; 765 case OPN_ACPT: 766 action = WLAN_SP_MESH_PEERING_CONFIRM; 767 break; 768 case CNF_ACPT: 769 changed |= mesh_plink_establish(sdata, sta); 770 break; 771 default: 772 break; 773 } 774 break; 775 case NL80211_PLINK_CNF_RCVD: 776 switch (event) { 777 case OPN_RJCT: 778 case CNF_RJCT: 779 case CLS_ACPT: 780 mesh_plink_close(sdata, sta, event); 781 action = WLAN_SP_MESH_PEERING_CLOSE; 782 break; 783 case OPN_ACPT: 784 changed |= mesh_plink_establish(sdata, sta); 785 action = WLAN_SP_MESH_PEERING_CONFIRM; 786 break; 787 default: 788 break; 789 } 790 break; 791 case NL80211_PLINK_ESTAB: 792 switch (event) { 793 case CLS_ACPT: 794 changed |= __mesh_plink_deactivate(sta); 795 changed |= mesh_set_ht_prot_mode(sdata); 796 changed |= mesh_set_short_slot_time(sdata); 797 mesh_plink_close(sdata, sta, event); 798 action = WLAN_SP_MESH_PEERING_CLOSE; 799 break; 800 case OPN_ACPT: 801 action = WLAN_SP_MESH_PEERING_CONFIRM; 802 break; 803 default: 804 break; 805 } 806 break; 807 case NL80211_PLINK_HOLDING: 808 switch (event) { 809 case CLS_ACPT: 810 if (del_timer(&sta->plink_timer)) 811 sta->ignore_plink_timer = 1; 812 mesh_plink_fsm_restart(sta); 813 break; 814 case OPN_ACPT: 815 case CNF_ACPT: 816 case OPN_RJCT: 817 case CNF_RJCT: 818 action = WLAN_SP_MESH_PEERING_CLOSE; 819 break; 820 default: 821 break; 822 } 823 break; 824 default: 825 /* should not get here, PLINK_BLOCKED is dealt with at the 826 * beginning of the function 827 */ 828 break; 829 } 830 spin_unlock_bh(&sta->lock); 831 if (action) { 832 mesh_plink_frame_tx(sdata, action, sta->sta.addr, 833 sta->llid, sta->plid, sta->reason); 834 835 /* also send confirm in open case */ 836 if (action == WLAN_SP_MESH_PEERING_OPEN) { 837 mesh_plink_frame_tx(sdata, 838 WLAN_SP_MESH_PEERING_CONFIRM, 839 sta->sta.addr, sta->llid, 840 sta->plid, 0); 841 } 842 } 843 844 return changed; 845} 846 847static void 848mesh_process_plink_frame(struct ieee80211_sub_if_data *sdata, 849 struct ieee80211_mgmt *mgmt, 850 struct ieee802_11_elems *elems) 851{ 852 853 struct sta_info *sta; 854 enum plink_event event; 855 enum ieee80211_self_protected_actioncode ftype; 856 bool matches_local; 857 u32 changed = 0; 858 u8 ie_len; 859 __le16 plid, llid = 0; 860 861 if (!elems->peering) { 862 mpl_dbg(sdata, 863 "Mesh plink: missing necessary peer link ie\n"); 864 return; 865 } 866 867 if (elems->rsn_len && 868 sdata->u.mesh.security == IEEE80211_MESH_SEC_NONE) { 869 mpl_dbg(sdata, 870 "Mesh plink: can't establish link with secure peer\n"); 871 return; 872 } 873 874 ftype = mgmt->u.action.u.self_prot.action_code; 875 ie_len = elems->peering_len; 876 if ((ftype == WLAN_SP_MESH_PEERING_OPEN && ie_len != 4) || 877 (ftype == WLAN_SP_MESH_PEERING_CONFIRM && ie_len != 6) || 878 (ftype == WLAN_SP_MESH_PEERING_CLOSE && ie_len != 6 879 && ie_len != 8)) { 880 mpl_dbg(sdata, 881 "Mesh plink: incorrect plink ie length %d %d\n", 882 ftype, ie_len); 883 return; 884 } 885 886 if (ftype != WLAN_SP_MESH_PEERING_CLOSE && 887 (!elems->mesh_id || !elems->mesh_config)) { 888 mpl_dbg(sdata, "Mesh plink: missing necessary ie\n"); 889 return; 890 } 891 /* Note the lines below are correct, the llid in the frame is the plid 892 * from the point of view of this host. 893 */ 894 memcpy(&plid, PLINK_GET_LLID(elems->peering), 2); 895 if (ftype == WLAN_SP_MESH_PEERING_CONFIRM || 896 (ftype == WLAN_SP_MESH_PEERING_CLOSE && ie_len == 8)) 897 memcpy(&llid, PLINK_GET_PLID(elems->peering), 2); 898 899 /* WARNING: Only for sta pointer, is dropped & re-acquired */ 900 rcu_read_lock(); 901 902 sta = sta_info_get(sdata, mgmt->sa); 903 904 matches_local = (ftype == WLAN_SP_MESH_PEERING_CLOSE || 905 mesh_matches_local(sdata, elems)); 906 907 if (ftype == WLAN_SP_MESH_PEERING_OPEN && 908 !rssi_threshold_check(sdata, sta)) { 909 mpl_dbg(sdata, "Mesh plink: %pM does not meet rssi threshold\n", 910 mgmt->sa); 911 goto unlock_rcu; 912 } 913 914 if (!sta) { 915 if (ftype != WLAN_SP_MESH_PEERING_OPEN) { 916 mpl_dbg(sdata, "Mesh plink: cls or cnf from unknown peer\n"); 917 goto unlock_rcu; 918 } 919 /* ftype == WLAN_SP_MESH_PEERING_OPEN */ 920 if (!mesh_plink_free_count(sdata)) { 921 mpl_dbg(sdata, "Mesh plink error: no more free plinks\n"); 922 goto unlock_rcu; 923 } 924 /* deny open request from non-matching peer */ 925 if (!matches_local) { 926 mesh_plink_frame_tx(sdata, WLAN_SP_MESH_PEERING_CLOSE, 927 mgmt->sa, 0, plid, 928 cpu_to_le16(WLAN_REASON_MESH_CONFIG)); 929 goto unlock_rcu; 930 } 931 } else { 932 if (!test_sta_flag(sta, WLAN_STA_AUTH)) { 933 mpl_dbg(sdata, "Mesh plink: Action frame from non-authed peer\n"); 934 goto unlock_rcu; 935 } 936 if (sta->plink_state == NL80211_PLINK_BLOCKED) 937 goto unlock_rcu; 938 } 939 940 /* Now we will figure out the appropriate event... */ 941 event = PLINK_UNDEFINED; 942 943 if (!sta) 944 event = OPN_ACPT; 945 else { 946 switch (ftype) { 947 case WLAN_SP_MESH_PEERING_OPEN: 948 if (!matches_local) 949 event = OPN_RJCT; 950 else if (!mesh_plink_free_count(sdata) || 951 (sta->plid && sta->plid != plid)) 952 event = OPN_IGNR; 953 else 954 event = OPN_ACPT; 955 break; 956 case WLAN_SP_MESH_PEERING_CONFIRM: 957 if (!matches_local) 958 event = CNF_RJCT; 959 else if (!mesh_plink_free_count(sdata) || 960 (sta->llid != llid || sta->plid != plid)) 961 event = CNF_IGNR; 962 else 963 event = CNF_ACPT; 964 break; 965 case WLAN_SP_MESH_PEERING_CLOSE: 966 if (sta->plink_state == NL80211_PLINK_ESTAB) 967 /* Do not check for llid or plid. This does not 968 * follow the standard but since multiple plinks 969 * per sta are not supported, it is necessary in 970 * order to avoid a livelock when MP A sees an 971 * establish peer link to MP B but MP B does not 972 * see it. This can be caused by a timeout in 973 * B's peer link establishment or B beign 974 * restarted. 975 */ 976 event = CLS_ACPT; 977 else if (sta->plid != plid) 978 event = CLS_IGNR; 979 else if (ie_len == 8 && sta->llid != llid) 980 event = CLS_IGNR; 981 else 982 event = CLS_ACPT; 983 break; 984 default: 985 mpl_dbg(sdata, "Mesh plink: unknown frame subtype\n"); 986 goto unlock_rcu; 987 } 988 } 989 990 if (event == OPN_ACPT) { 991 rcu_read_unlock(); 992 /* allocate sta entry if necessary and update info */ 993 sta = mesh_sta_info_get(sdata, mgmt->sa, elems); 994 if (!sta) { 995 mpl_dbg(sdata, "Mesh plink: failed to init peer!\n"); 996 goto unlock_rcu; 997 } 998 sta->plid = plid; 999 } 1000 1001 changed |= mesh_plink_fsm(sdata, sta, event); 1002 1003unlock_rcu: 1004 rcu_read_unlock(); 1005 1006 if (changed) 1007 ieee80211_mbss_info_change_notify(sdata, changed); 1008} 1009 1010void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, 1011 struct ieee80211_mgmt *mgmt, size_t len, 1012 struct ieee80211_rx_status *rx_status) 1013{ 1014 struct ieee802_11_elems elems; 1015 size_t baselen; 1016 u8 *baseaddr; 1017 1018 /* need action_code, aux */ 1019 if (len < IEEE80211_MIN_ACTION_SIZE + 3) 1020 return; 1021 1022 if (sdata->u.mesh.user_mpm) 1023 /* userspace must register for these */ 1024 return; 1025 1026 if (is_multicast_ether_addr(mgmt->da)) { 1027 mpl_dbg(sdata, 1028 "Mesh plink: ignore frame from multicast address\n"); 1029 return; 1030 } 1031 1032 baseaddr = mgmt->u.action.u.self_prot.variable; 1033 baselen = (u8 *) mgmt->u.action.u.self_prot.variable - (u8 *) mgmt; 1034 if (mgmt->u.action.u.self_prot.action_code == 1035 WLAN_SP_MESH_PEERING_CONFIRM) { 1036 baseaddr += 4; 1037 baselen += 4; 1038 } 1039 ieee802_11_parse_elems(baseaddr, len - baselen, true, &elems); 1040 mesh_process_plink_frame(sdata, mgmt, &elems); 1041} 1042