1 /****************************************************************************** 2 * 3 * Copyright(c) 2007 - 2017 Realtek Corporation. 4 * 5 * This program is free software; you can redistribute it and/or modify it 6 * under the terms of version 2 of the GNU General Public License as 7 * published by the Free Software Foundation. 8 * 9 * This program is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 12 * more details. 13 * 14 *****************************************************************************/ 15 #ifndef __RTW_MESH_H_ 16 #define __RTW_MESH_H_ 17 18 #ifndef CONFIG_AP_MODE 19 #error "CONFIG_RTW_MESH can't be enabled when CONFIG_AP_MODE is not defined\n" 20 #endif 21 22 #define RTW_MESH_TTL 31 23 #define RTW_MESH_PERR_MIN_INT 100 24 #define RTW_MESH_DEFAULT_ELEMENT_TTL 31 25 #define RTW_MESH_RANN_INTERVAL 5000 26 #define RTW_MESH_PATH_TO_ROOT_TIMEOUT 6000 27 #define RTW_MESH_DIAM_TRAVERSAL_TIME 50 28 #define RTW_MESH_PATH_TIMEOUT 5000 29 #define RTW_MESH_PREQ_MIN_INT 10 30 #define RTW_MESH_MAX_PREQ_RETRIES 4 31 #define RTW_MESH_MIN_DISCOVERY_TIMEOUT (2 * RTW_MESH_DIAM_TRAVERSAL_TIME) 32 #define RTW_MESH_ROOT_CONFIRMATION_INTERVAL 2000 33 #define RTW_MESH_PATH_REFRESH_TIME 1000 34 #define RTW_MESH_ROOT_INTERVAL 5000 35 36 #define RTW_MESH_SANE_METRIC_DELTA 100 37 #define RTW_MESH_MAX_ROOT_ADD_CHK_CNT 2 38 39 #define RTW_MESH_PLINK_UNKNOWN 0 40 #define RTW_MESH_PLINK_LISTEN 1 41 #define RTW_MESH_PLINK_OPN_SNT 2 42 #define RTW_MESH_PLINK_OPN_RCVD 3 43 #define RTW_MESH_PLINK_CNF_RCVD 4 44 #define RTW_MESH_PLINK_ESTAB 5 45 #define RTW_MESH_PLINK_HOLDING 6 46 #define RTW_MESH_PLINK_BLOCKED 7 47 48 extern const char *_rtw_mesh_plink_str[]; 49 #define rtw_mesh_plink_str(s) ((s <= RTW_MESH_PLINK_BLOCKED) ? _rtw_mesh_plink_str[s] : _rtw_mesh_plink_str[RTW_MESH_PLINK_UNKNOWN]) 50 51 #define RTW_MESH_PS_UNKNOWN 0 52 #define RTW_MESH_PS_ACTIVE 1 53 #define RTW_MESH_PS_LSLEEP 2 54 #define RTW_MESH_PS_DSLEEP 3 55 56 extern const char *_rtw_mesh_ps_str[]; 57 #define rtw_mesh_ps_str(mps) ((mps <= RTW_MESH_PS_DSLEEP) ? _rtw_mesh_ps_str[mps] : _rtw_mesh_ps_str[RTW_MESH_PS_UNKNOWN]) 58 59 #define GET_MESH_CONF_ELE_PATH_SEL_PROTO_ID(_iec) LE_BITS_TO_1BYTE(((u8 *)(_iec)) + 0, 0, 8) 60 #define GET_MESH_CONF_ELE_PATH_SEL_METRIC_ID(_iec) LE_BITS_TO_1BYTE(((u8 *)(_iec)) + 1, 0, 8) 61 #define GET_MESH_CONF_ELE_CONGEST_CTRL_MODE_ID(_iec) LE_BITS_TO_1BYTE(((u8 *)(_iec)) + 2, 0, 8) 62 #define GET_MESH_CONF_ELE_SYNC_METHOD_ID(_iec) LE_BITS_TO_1BYTE(((u8 *)(_iec)) + 3, 0, 8) 63 #define GET_MESH_CONF_ELE_AUTH_PROTO_ID(_iec) LE_BITS_TO_1BYTE(((u8 *)(_iec)) + 4, 0, 8) 64 65 #define GET_MESH_CONF_ELE_MESH_FORMATION(_iec) LE_BITS_TO_1BYTE(((u8 *)(_iec)) + 5, 0, 8) 66 #define GET_MESH_CONF_ELE_CTO_MGATE(_iec) LE_BITS_TO_1BYTE(((u8 *)(_iec)) + 5, 0, 1) 67 #define GET_MESH_CONF_ELE_NUM_OF_PEERINGS(_iec) LE_BITS_TO_1BYTE(((u8 *)(_iec)) + 5, 1, 6) 68 #define GET_MESH_CONF_ELE_CTO_AS(_iec) LE_BITS_TO_1BYTE(((u8 *)(_iec)) + 5, 7, 1) 69 70 #define GET_MESH_CONF_ELE_MESH_CAP(_iec) LE_BITS_TO_1BYTE(((u8 *)(_iec)) + 6, 0, 8) 71 #define GET_MESH_CONF_ELE_ACCEPT_PEERINGS(_iec) LE_BITS_TO_1BYTE(((u8 *)(_iec)) + 6, 0, 1) 72 #define GET_MESH_CONF_ELE_MCCA_SUP(_iec) LE_BITS_TO_1BYTE(((u8 *)(_iec)) + 6, 1, 1) 73 #define GET_MESH_CONF_ELE_MCCA_EN(_iec) LE_BITS_TO_1BYTE(((u8 *)(_iec)) + 6, 2, 1) 74 #define GET_MESH_CONF_ELE_FORWARDING(_iec) LE_BITS_TO_1BYTE(((u8 *)(_iec)) + 6, 3, 1) 75 #define GET_MESH_CONF_ELE_MBCA_EN(_iec) LE_BITS_TO_1BYTE(((u8 *)(_iec)) + 6, 4, 1) 76 #define GET_MESH_CONF_ELE_TBTT_ADJ(_iec) LE_BITS_TO_1BYTE(((u8 *)(_iec)) + 6, 5, 1) 77 #define GET_MESH_CONF_ELE_PS_LEVEL(_iec) LE_BITS_TO_1BYTE(((u8 *)(_iec)) + 6, 6, 1) 78 79 #define SET_MESH_CONF_ELE_PATH_SEL_PROTO_ID(_iec, _val) SET_BITS_TO_LE_1BYTE(((u8 *)(_iec)) + 0, 0, 8, _val) 80 #define SET_MESH_CONF_ELE_PATH_SEL_METRIC_ID(_iec, _val) SET_BITS_TO_LE_1BYTE(((u8 *)(_iec)) + 1, 0, 8, _val) 81 #define SET_MESH_CONF_ELE_CONGEST_CTRL_MODE_ID(_iec, _val) SET_BITS_TO_LE_1BYTE(((u8 *)(_iec)) + 2, 0, 8, _val) 82 #define SET_MESH_CONF_ELE_SYNC_METHOD_ID(_iec, _val) SET_BITS_TO_LE_1BYTE(((u8 *)(_iec)) + 3, 0, 8, _val) 83 #define SET_MESH_CONF_ELE_AUTH_PROTO_ID(_iec, _val) SET_BITS_TO_LE_1BYTE(((u8 *)(_iec)) + 4, 0, 8, _val) 84 85 #define SET_MESH_CONF_ELE_CTO_MGATE(_iec, _val) SET_BITS_TO_LE_1BYTE(((u8 *)(_iec)) + 5, 0, 1, _val) 86 #define SET_MESH_CONF_ELE_NUM_OF_PEERINGS(_iec, _val) SET_BITS_TO_LE_1BYTE(((u8 *)(_iec)) + 5, 1, 6, _val) 87 #define SET_MESH_CONF_ELE_CTO_AS(_iec, _val) SET_BITS_TO_LE_1BYTE(((u8 *)(_iec)) + 5, 7, 1, _val) 88 89 #define SET_MESH_CONF_ELE_ACCEPT_PEERINGS(_iec, _val) SET_BITS_TO_LE_1BYTE(((u8 *)(_iec)) + 6, 0, 1, _val) 90 #define SET_MESH_CONF_ELE_MCCA_SUP(_iec, _val) SET_BITS_TO_LE_1BYTE(((u8 *)(_iec)) + 6, 1, 1, _val) 91 #define SET_MESH_CONF_ELE_MCCA_EN(_iec, _val) SET_BITS_TO_LE_1BYTE(((u8 *)(_iec)) + 6, 2, 1, _val) 92 #define SET_MESH_CONF_ELE_FORWARDING(_iec, _val) SET_BITS_TO_LE_1BYTE(((u8 *)(_iec)) + 6, 3, 1, _val) 93 #define SET_MESH_CONF_ELE_MBCA_EN(_iec, _val) SET_BITS_TO_LE_1BYTE(((u8 *)(_iec)) + 6, 4, 1, _val) 94 #define SET_MESH_CONF_ELE_TBTT_ADJ(_iec, _val) SET_BITS_TO_LE_1BYTE(((u8 *)(_iec)) + 6, 5, 1, _val) 95 #define SET_MESH_CONF_ELE_PS_LEVEL(_iec, _val) SET_BITS_TO_LE_1BYTE(((u8 *)(_iec)) + 6, 6, 1, _val) 96 97 /* Mesh flags */ 98 #define MESH_FLAGS_AE 0x3 /* mask */ 99 #define MESH_FLAGS_AE_A4 0x1 100 #define MESH_FLAGS_AE_A5_A6 0x2 101 102 /* Max number of paths */ 103 #define RTW_MESH_MAX_PATHS 1024 104 105 #define RTW_PREQ_Q_F_START 0x1 106 #define RTW_PREQ_Q_F_REFRESH 0x2 107 #define RTW_PREQ_Q_F_CHK 0x4 108 #define RTW_PREQ_Q_F_PEER_AKA 0x8 109 #define RTW_PREQ_Q_F_BCAST_PREQ 0x10 /* force path_dicover using broadcast */ 110 struct rtw_mesh_preq_queue { 111 _list list; 112 u8 dst[ETH_ALEN]; 113 u8 flags; 114 }; 115 116 extern const u8 ae_to_mesh_ctrl_len[]; 117 118 enum mesh_frame_type { 119 MESH_UCAST_DATA = 0x0, 120 MESH_BMCAST_DATA = 0x1, 121 MESH_UCAST_PX_DATA = 0x2, 122 MESH_BMCAST_PX_DATA = 0x3, 123 MESH_MHOP_UCAST_ACT = 0x4, 124 MESH_MHOP_BMCAST_ACT = 0x5, 125 }; 126 127 enum mpath_sel_frame_type { 128 MPATH_PREQ = 0, 129 MPATH_PREP, 130 MPATH_PERR, 131 MPATH_RANN 132 }; 133 134 /** 135 * enum rtw_mesh_deferred_task_flags - mesh deferred tasks 136 * 137 * 138 * 139 * @RTW_MESH_WORK_HOUSEKEEPING: run the periodic mesh housekeeping tasks 140 * @RTW_MESH_WORK_ROOT: the mesh root station needs to send a frame 141 * @RTW_MESH_WORK_DRIFT_ADJUST: time to compensate for clock drift relative to other 142 * mesh nodes 143 * @RTW_MESH_WORK_MBSS_CHANGED: rebuild beacon and notify driver of BSS changes 144 */ 145 enum rtw_mesh_deferred_task_flags { 146 RTW_MESH_WORK_HOUSEKEEPING, 147 RTW_MESH_WORK_ROOT, 148 RTW_MESH_WORK_DRIFT_ADJUST, 149 RTW_MESH_WORK_MBSS_CHANGED, 150 }; 151 152 #define RTW_MESH_MAX_PEER_CANDIDATES 15 /* aid consideration */ 153 #define RTW_MESH_MAX_PEER_LINKS 8 154 #define RTW_MESH_PEER_LINK_TIMEOUT 20 155 156 #define RTW_MESH_PEER_CONF_DISABLED 0 /* special time value means no confirmation ongoing */ 157 #if CONFIG_RTW_MESH_PEER_BLACKLIST 158 #define IS_PEER_CONF_DISABLED(plink) ((plink)->peer_conf_end_time == RTW_MESH_PEER_CONF_DISABLED) 159 #define IS_PEER_CONF_TIMEOUT(plink)(!IS_PEER_CONF_DISABLED(plink) && rtw_time_after(rtw_get_current_time(), (plink)->peer_conf_end_time)) 160 #define SET_PEER_CONF_DISABLED(plink) (plink)->peer_conf_end_time = RTW_MESH_PEER_CONF_DISABLED 161 #define SET_PEER_CONF_END_TIME(plink, timeout_ms) \ 162 do { \ 163 (plink)->peer_conf_end_time = rtw_get_current_time() + rtw_ms_to_systime(timeout_ms); \ 164 if ((plink)->peer_conf_end_time == RTW_MESH_PEER_CONF_DISABLED) \ 165 (plink)->peer_conf_end_time++; \ 166 } while (0) 167 #else 168 #define IS_PEER_CONF_DISABLED(plink) 1 169 #define IS_PEER_CONF_TIMEOUT(plink) 0 170 #define SET_PEER_CONF_DISABLED(plink) do {} while (0) 171 #define SET_PEER_CONF_END_TIME(plink, timeout_ms) do {} while (0) 172 #endif /* CONFIG_RTW_MESH_PEER_BLACKLIST */ 173 174 #define RTW_MESH_CTO_MGATE_CONF_DISABLED 0 /* special time value means no confirmation ongoing */ 175 #if CONFIG_RTW_MESH_CTO_MGATE_BLACKLIST 176 #define IS_CTO_MGATE_CONF_DISABLED(plink) ((plink)->cto_mgate_conf_end_time == RTW_MESH_CTO_MGATE_CONF_DISABLED) 177 #define IS_CTO_MGATE_CONF_TIMEOUT(plink)(!IS_CTO_MGATE_CONF_DISABLED(plink) && rtw_time_after(rtw_get_current_time(), (plink)->cto_mgate_conf_end_time)) 178 #define SET_CTO_MGATE_CONF_DISABLED(plink) (plink)->cto_mgate_conf_end_time = RTW_MESH_CTO_MGATE_CONF_DISABLED 179 #define SET_CTO_MGATE_CONF_END_TIME(plink, timeout_ms) \ 180 do { \ 181 (plink)->cto_mgate_conf_end_time = rtw_get_current_time() + rtw_ms_to_systime(timeout_ms); \ 182 if ((plink)->cto_mgate_conf_end_time == RTW_MESH_CTO_MGATE_CONF_DISABLED) \ 183 (plink)->cto_mgate_conf_end_time++; \ 184 } while (0) 185 #else 186 #define IS_CTO_MGATE_CONF_DISABLED(plink) 1 187 #define IS_CTO_MGATE_CONF_TIMEOUT(plink) 0 188 #define SET_CTO_MGATE_CONF_DISABLED(plink) do {} while (0) 189 #define SET_CTO_MGATE_CONF_END_TIME(plink, timeout_ms) do {} while (0) 190 #endif /* CONFIG_RTW_MESH_CTO_MGATE_BLACKLIST */ 191 192 struct mesh_plink_ent { 193 u8 valid; 194 u8 addr[ETH_ALEN]; 195 u8 plink_state; 196 197 #ifdef CONFIG_RTW_MESH_AEK 198 u8 aek_valid; 199 u8 aek[32]; 200 #endif 201 202 u16 llid; 203 u16 plid; 204 #ifndef CONFIG_RTW_MESH_DRIVER_AID 205 u16 aid; /* aid assigned from upper layer */ 206 #endif 207 u16 peer_aid; /* aid assigned from peer */ 208 209 u8 chosen_pmk[16]; 210 211 #ifdef CONFIG_RTW_MESH_AEK 212 u8 sel_pcs[4]; 213 u8 l_nonce[32]; 214 u8 p_nonce[32]; 215 #endif 216 217 #ifdef CONFIG_RTW_MESH_DRIVER_AID 218 u8 *tx_conf_ies; 219 u16 tx_conf_ies_len; 220 #endif 221 u8 *rx_conf_ies; 222 u16 rx_conf_ies_len; 223 224 struct wlan_network *scanned; 225 226 #if CONFIG_RTW_MESH_PEER_BLACKLIST 227 systime peer_conf_end_time; 228 #endif 229 #if CONFIG_RTW_MESH_CTO_MGATE_BLACKLIST 230 systime cto_mgate_conf_end_time; 231 #endif 232 }; 233 234 #ifdef CONFIG_RTW_MESH_AEK 235 #define MESH_PLINK_AEK_VALID(ent) ent->aek_valid 236 #else 237 #define MESH_PLINK_AEK_VALID(ent) 0 238 #endif 239 240 struct mesh_plink_pool { 241 _lock lock; 242 u8 num; /* current ent being used */ 243 struct mesh_plink_ent ent[RTW_MESH_MAX_PEER_CANDIDATES]; 244 245 #if CONFIG_RTW_MESH_ACNODE_PREVENT 246 u8 acnode_rsvd; 247 #endif 248 249 #if CONFIG_RTW_MESH_PEER_BLACKLIST 250 _queue peer_blacklist; 251 #endif 252 #if CONFIG_RTW_MESH_CTO_MGATE_BLACKLIST 253 _queue cto_mgate_blacklist; 254 #endif 255 }; 256 257 struct mesh_peer_sel_policy { 258 u32 scanr_exp_ms; 259 260 #if CONFIG_RTW_MESH_ACNODE_PREVENT 261 u8 acnode_prevent; 262 u32 acnode_conf_timeout_ms; 263 u32 acnode_notify_timeout_ms; 264 #endif 265 266 #if CONFIG_RTW_MESH_OFFCH_CAND 267 u8 offch_cand; 268 u32 offch_find_int_ms; /* 0 means no offch find triggerred by driver self*/ 269 #endif 270 271 #if CONFIG_RTW_MESH_PEER_BLACKLIST 272 u32 peer_conf_timeout_ms; 273 u32 peer_blacklist_timeout_ms; 274 #endif 275 276 #if CONFIG_RTW_MESH_CTO_MGATE_BLACKLIST 277 u8 cto_mgate_require; 278 u32 cto_mgate_conf_timeout_ms; 279 u32 cto_mgate_blacklist_timeout_ms; 280 #endif 281 }; 282 283 /* b2u flags */ 284 #define RTW_MESH_B2U_ALL BIT0 285 #define RTW_MESH_B2U_GA_UCAST BIT1 /* Group addressed unicast frame, forward only */ 286 #define RTW_MESH_B2U_BCAST BIT2 287 #define RTW_MESH_B2U_IP_MCAST BIT3 288 289 #define rtw_msrc_b2u_policy_chk(flags, mda) ( \ 290 (flags & RTW_MESH_B2U_ALL) \ 291 || ((flags & RTW_MESH_B2U_BCAST) && is_broadcast_mac_addr(mda)) \ 292 || ((flags & RTW_MESH_B2U_IP_MCAST) && (IP_MCAST_MAC(mda) || ICMPV6_MCAST_MAC(mda))) \ 293 ) 294 295 #define rtw_mfwd_b2u_policy_chk(flags, mda, ucst) ( \ 296 (flags & RTW_MESH_B2U_ALL) \ 297 || ((flags & RTW_MESH_B2U_GA_UCAST) && ucst) \ 298 || ((flags & RTW_MESH_B2U_BCAST) && is_broadcast_mac_addr(mda)) \ 299 || ((flags & RTW_MESH_B2U_IP_MCAST) && (IP_MCAST_MAC(mda) || ICMPV6_MCAST_MAC(mda))) \ 300 ) 301 302 /** 303 * @sane_metric_delta: Controlling if trigger additional path check mechanism 304 * @max_root_add_chk_cnt: The retry cnt to send additional root confirmation 305 * PREQ through old(last) path 306 */ 307 struct rtw_mesh_cfg { 308 u8 max_peer_links; /* peering limit */ 309 u32 plink_timeout; /* seconds */ 310 311 u8 dot11MeshTTL; 312 u8 element_ttl; 313 u32 path_refresh_time; 314 u16 dot11MeshHWMPpreqMinInterval; 315 u16 dot11MeshHWMPnetDiameterTraversalTime; 316 u32 dot11MeshHWMPactivePathTimeout; 317 u8 dot11MeshHWMPmaxPREQretries; 318 u16 min_discovery_timeout; 319 u16 dot11MeshHWMPconfirmationInterval; 320 u16 dot11MeshHWMPperrMinInterval; 321 u8 dot11MeshHWMPRootMode; 322 BOOLEAN dot11MeshForwarding; 323 s32 rssi_threshold; /* in dBm, 0: no specified */ 324 u16 dot11MeshHWMPRannInterval; 325 BOOLEAN dot11MeshGateAnnouncementProtocol; 326 u32 dot11MeshHWMPactivePathToRootTimeout; 327 u16 dot11MeshHWMProotInterval; 328 u8 path_gate_timeout_factor; 329 #ifdef CONFIG_RTW_MESH_ADD_ROOT_CHK 330 u16 sane_metric_delta; 331 u8 max_root_add_chk_cnt; 332 #endif 333 334 struct mesh_peer_sel_policy peer_sel_policy; 335 336 #if CONFIG_RTW_MESH_DATA_BMC_TO_UC 337 u8 b2u_flags_msrc; 338 u8 b2u_flags_mfwd; 339 #endif 340 }; 341 342 struct rtw_mesh_stats { 343 u32 fwded_mcast; /* Mesh forwarded multicast frames */ 344 u32 fwded_unicast; /* Mesh forwarded unicast frames */ 345 u32 fwded_frames; /* Mesh total forwarded frames */ 346 u32 dropped_frames_ttl; /* Not transmitted since mesh_ttl == 0*/ 347 u32 dropped_frames_no_route; /* Not transmitted, no route found */ 348 u32 dropped_frames_congestion;/* Not forwarded due to congestion */ 349 u32 dropped_frames_duplicate; 350 351 u32 mrc_del_qlen; /* MRC entry deleted cause by queue length limit */ 352 }; 353 354 struct rtw_mrc; 355 356 struct rtw_mesh_info { 357 u8 mesh_id[NDIS_802_11_LENGTH_SSID]; 358 size_t mesh_id_len; 359 /* Active Path Selection Protocol Identifier */ 360 u8 mesh_pp_id; 361 /* Active Path Selection Metric Identifier */ 362 u8 mesh_pm_id; 363 /* Congestion Control Mode Identifier */ 364 u8 mesh_cc_id; 365 /* Synchronization Protocol Identifier */ 366 u8 mesh_sp_id; 367 /* Authentication Protocol Identifier */ 368 u8 mesh_auth_id; 369 370 struct mesh_plink_pool plink_ctl; 371 372 u32 mesh_seqnum; 373 /* MSTA's own hwmp sequence number */ 374 u32 sn; 375 systime last_preq; 376 systime last_sn_update; 377 systime next_perr; 378 /* Last used Path Discovery ID */ 379 u32 preq_id; 380 381 ATOMIC_T mpaths; 382 struct rtw_mesh_table *mesh_paths; 383 struct rtw_mesh_table *mpp_paths; 384 int mesh_paths_generation; 385 int mpp_paths_generation; 386 387 int num_gates; 388 struct rtw_mesh_path *max_addr_gate; 389 bool max_addr_gate_is_larger_than_self; 390 391 struct rtw_mesh_stats mshstats; 392 393 _queue mpath_tx_queue; 394 u32 mpath_tx_queue_len; 395 _tasklet mpath_tx_tasklet; 396 397 struct rtw_mrc *mrc; 398 399 _lock mesh_preq_queue_lock; 400 struct rtw_mesh_preq_queue preq_queue; 401 int preq_queue_len; 402 }; 403 404 extern const char *_action_self_protected_str[]; 405 #define action_self_protected_str(action) ((action < RTW_ACT_SELF_PROTECTED_NUM) ? _action_self_protected_str[action] : _action_self_protected_str[0]) 406 407 u8 *rtw_set_ie_mesh_id(u8 *buf, u32 *buf_len, const char *mesh_id, u8 id_len); 408 u8 *rtw_set_ie_mesh_config(u8 *buf, u32 *buf_len 409 , u8 path_sel_proto, u8 path_sel_metric, u8 congest_ctl_mode, u8 sync_method, u8 auth_proto 410 , u8 num_of_peerings, bool cto_mgate, bool cto_as 411 , bool accept_peerings, bool mcca_sup, bool mcca_en, bool forwarding 412 , bool mbca_en, bool tbtt_adj, bool ps_level); 413 414 int rtw_bss_is_same_mbss(WLAN_BSSID_EX *a, WLAN_BSSID_EX *b); 415 int rtw_bss_is_candidate_mesh_peer(_adapter *adapter, WLAN_BSSID_EX *target, u8 ch, u8 add_peer); 416 417 void rtw_chk_candidate_peer_notify(_adapter *adapter, struct wlan_network *scanned); 418 419 void rtw_mesh_peer_status_chk(_adapter *adapter); 420 421 #if CONFIG_RTW_MESH_ACNODE_PREVENT 422 void rtw_mesh_update_scanned_acnode_status(_adapter *adapter, struct wlan_network *scanned); 423 bool rtw_mesh_scanned_is_acnode_confirmed(_adapter *adapter, struct wlan_network *scanned); 424 bool rtw_mesh_acnode_prevent_allow_sacrifice(_adapter *adapter); 425 struct sta_info *rtw_mesh_acnode_prevent_pick_sacrifice(_adapter *adapter); 426 void dump_mesh_acnode_prevent_settings(void *sel, _adapter *adapter); 427 #endif 428 429 #if CONFIG_RTW_MESH_OFFCH_CAND 430 u8 rtw_mesh_offch_candidate_accepted(_adapter *adapter); 431 u8 rtw_mesh_select_operating_ch(_adapter *adapter); 432 void dump_mesh_offch_cand_settings(void *sel, _adapter *adapter); 433 #endif 434 435 #if CONFIG_RTW_MESH_PEER_BLACKLIST 436 int rtw_mesh_peer_blacklist_add(_adapter *adapter, const u8 *addr); 437 int rtw_mesh_peer_blacklist_del(_adapter *adapter, const u8 *addr); 438 int rtw_mesh_peer_blacklist_search(_adapter *adapter, const u8 *addr); 439 void rtw_mesh_peer_blacklist_flush(_adapter *adapter); 440 void dump_mesh_peer_blacklist(void *sel, _adapter *adapter); 441 void dump_mesh_peer_blacklist_settings(void *sel, _adapter *adapter); 442 #endif 443 #if CONFIG_RTW_MESH_CTO_MGATE_BLACKLIST 444 u8 rtw_mesh_cto_mgate_required(_adapter *adapter); 445 u8 rtw_mesh_cto_mgate_network_filter(_adapter *adapter, struct wlan_network *scanned); 446 int rtw_mesh_cto_mgate_blacklist_add(_adapter *adapter, const u8 *addr); 447 int rtw_mesh_cto_mgate_blacklist_del(_adapter *adapter, const u8 *addr); 448 int rtw_mesh_cto_mgate_blacklist_search(_adapter *adapter, const u8 *addr); 449 void rtw_mesh_cto_mgate_blacklist_flush(_adapter *adapter); 450 void dump_mesh_cto_mgate_blacklist(void *sel, _adapter *adapter); 451 void dump_mesh_cto_mgate_blacklist_settings(void *sel, _adapter *adapter); 452 #endif 453 void dump_mesh_peer_sel_policy(void *sel, _adapter *adapter); 454 void dump_mesh_networks(void *sel, _adapter *adapter); 455 456 void rtw_mesh_adjust_chbw(u8 req_ch, u8 *req_bw, u8 *req_offset); 457 458 void rtw_mesh_sae_check_frames(_adapter *adapter, const u8 *buf, u32 len, u8 tx, u16 alg, u16 seq, u16 status); 459 int rtw_mesh_check_frames_tx(_adapter *adapter, const u8 **buf, size_t *len); 460 int rtw_mesh_check_frames_rx(_adapter *adapter, const u8 *buf, size_t len); 461 462 int rtw_mesh_on_auth(_adapter *adapter, union recv_frame *rframe); 463 unsigned int on_action_self_protected(_adapter *adapter, union recv_frame *rframe); 464 465 bool rtw_mesh_update_bss_peering_status(_adapter *adapter, WLAN_BSSID_EX *bss); 466 bool rtw_mesh_update_bss_formation_info(_adapter *adapter, WLAN_BSSID_EX *bss); 467 bool rtw_mesh_update_bss_forwarding_state(_adapter *adapter, WLAN_BSSID_EX *bss); 468 469 struct mesh_plink_ent *_rtw_mesh_plink_get(_adapter *adapter, const u8 *hwaddr); 470 struct mesh_plink_ent *rtw_mesh_plink_get(_adapter *adapter, const u8 *hwaddr); 471 struct mesh_plink_ent *rtw_mesh_plink_get_no_estab_by_idx(_adapter *adapter, u8 idx); 472 int _rtw_mesh_plink_add(_adapter *adapter, const u8 *hwaddr); 473 int rtw_mesh_plink_add(_adapter *adapter, const u8 *hwaddr); 474 int rtw_mesh_plink_set_state(_adapter *adapter, const u8 *hwaddr, u8 state); 475 #ifdef CONFIG_RTW_MESH_AEK 476 int rtw_mesh_plink_set_aek(_adapter *adapter, const u8 *hwaddr, const u8 *aek); 477 #endif 478 #if CONFIG_RTW_MESH_PEER_BLACKLIST 479 int rtw_mesh_plink_set_peer_conf_timeout(_adapter *adapter, const u8 *hwaddr); 480 #endif 481 void _rtw_mesh_plink_del_ent(_adapter *adapter, struct mesh_plink_ent *ent); 482 int rtw_mesh_plink_del(_adapter *adapter, const u8 *hwaddr); 483 void rtw_mesh_plink_ctl_init(_adapter *adapter); 484 void rtw_mesh_plink_ctl_deinit(_adapter *adapter); 485 void dump_mesh_plink_ctl(void *sel, _adapter *adapter); 486 487 u8 rtw_mesh_set_plink_state_cmd(_adapter *adapter, const u8 *mac, u8 plink_state); 488 489 void _rtw_mesh_expire_peer_ent(_adapter *adapter, struct mesh_plink_ent *plink); 490 void rtw_mesh_expire_peer(_adapter *adapter, const u8 *peer_addr); 491 u8 rtw_mesh_ps_annc(_adapter *adapter, u8 ps); 492 493 unsigned int on_action_mesh(_adapter *adapter, union recv_frame *rframe); 494 495 void rtw_mesh_cfg_init(_adapter *adapter); 496 void rtw_mesh_cfg_init_max_peer_links(_adapter *adapter, u8 stack_conf); 497 void rtw_mesh_cfg_init_plink_timeout(_adapter *adapter, u32 stack_conf); 498 void rtw_mesh_init_mesh_info(_adapter *adapter); 499 void rtw_mesh_deinit_mesh_info(_adapter *adapter); 500 501 #if CONFIG_RTW_MESH_DATA_BMC_TO_UC 502 void dump_mesh_b2u_flags(void *sel, _adapter *adapter); 503 #endif 504 505 int rtw_mesh_addr_resolve(_adapter *adapter, u16 os_qid, struct xmit_frame *xframe, _pkt *pkt, _list *b2u_list); 506 507 s8 rtw_mesh_tx_set_whdr_mctrl_len(u8 mesh_frame_mode, struct pkt_attrib *attrib); 508 void rtw_mesh_tx_build_mctrl(_adapter *adapter, struct pkt_attrib *attrib, u8 *buf); 509 u8 rtw_mesh_tx_build_whdr(_adapter *adapter, struct pkt_attrib *attrib 510 , u16 *fctrl, struct rtw_ieee80211_hdr *whdr); 511 512 int rtw_mesh_rx_data_validate_hdr(_adapter *adapter, union recv_frame *rframe, struct sta_info **sta); 513 int rtw_mesh_rx_data_validate_mctrl(_adapter *adapter, union recv_frame *rframe 514 , const struct rtw_ieee80211s_hdr *mctrl, const u8 *mda, const u8 *msa 515 , u8 *mctrl_len, const u8 **da, const u8 **sa); 516 int rtw_mesh_rx_validate_mctrl_non_amsdu(_adapter *adapter, union recv_frame *rframe); 517 518 int rtw_mesh_rx_msdu_act_check(union recv_frame *rframe 519 , const u8 *mda, const u8 *msa 520 , const u8 *da, const u8 *sa 521 , struct rtw_ieee80211s_hdr *mctrl 522 , u8 *msdu, enum rtw_rx_llc_hdl llc_hdl 523 , struct xmit_frame **fwd_frame, _list *b2u_list); 524 525 void dump_mesh_stats(void *sel, _adapter *adapter); 526 527 #if defined(PLATFORM_LINUX) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 32)) 528 #define rtw_lockdep_assert_held(l) lockdep_assert_held(l) 529 #define rtw_lockdep_is_held(l) lockdep_is_held(l) 530 #else 531 #error "TBD\n" 532 #endif 533 534 #include "rtw_mesh_pathtbl.h" 535 #include "rtw_mesh_hwmp.h" 536 #endif /* __RTW_MESH_H_ */ 537 538