1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /****************************************************************************** 3 * 4 * Copyright(c) 2007 - 2017 Realtek Corporation. 5 * 6 * This program is free software; you can redistribute it and/or modify it 7 * under the terms of version 2 of the GNU General Public License as 8 * published by the Free Software Foundation. 9 * 10 * This program is distributed in the hope that it will be useful, but WITHOUT 11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 13 * more details. 14 * 15 *****************************************************************************/ 16 17 #ifndef __RTW_FT_H_ 18 #define __RTW_FT_H_ 19 20 enum rtw_ieee80211_ft_actioncode { 21 RTW_WLAN_ACTION_FT_RESV, 22 RTW_WLAN_ACTION_FT_REQ, 23 RTW_WLAN_ACTION_FT_RSP, 24 RTW_WLAN_ACTION_FT_CONF, 25 RTW_WLAN_ACTION_FT_ACK, 26 RTW_WLAN_ACTION_FT_MAX, 27 }; 28 29 enum _rtw_ft_sta_status { 30 RTW_FT_UNASSOCIATED_STA = 0, 31 RTW_FT_AUTHENTICATING_STA, 32 RTW_FT_AUTHENTICATED_STA, 33 RTW_FT_ASSOCIATING_STA, 34 RTW_FT_ASSOCIATED_STA, 35 RTW_FT_REQUESTING_STA, 36 RTW_FT_REQUESTED_STA, 37 RTW_FT_CONFIRMED_STA, 38 RTW_FT_UNSPECIFIED_STA 39 }; 40 41 #define RTW_FT_ACTION_REQ_LMT 4 42 43 #define RTW_FT_MAX_IE_SZ 256 44 45 #define rtw_ft_chk_status(a, s) \ 46 ((a)->mlmepriv.ft_roam.ft_status == (s)) 47 48 #define rtw_ft_roam_status(a, s) \ 49 ((rtw_to_roam(a) > 0) && rtw_ft_chk_status(a, s)) 50 51 #define rtw_ft_authed_sta(a) \ 52 ((rtw_ft_chk_status(a, RTW_FT_AUTHENTICATED_STA)) || \ 53 (rtw_ft_chk_status(a, RTW_FT_ASSOCIATING_STA)) || \ 54 (rtw_ft_chk_status(a, RTW_FT_ASSOCIATED_STA))) 55 56 #define rtw_ft_set_status(a, s) \ 57 do { \ 58 ((a)->mlmepriv.ft_roam.ft_status = (s)); \ 59 } while (0) 60 61 #define rtw_ft_lock_set_status(a, s, irq) \ 62 do { \ 63 _enter_critical_bh(&(a)->mlmepriv.lock, ((_irqL *)(irq))); \ 64 ((a)->mlmepriv.ft_roam.ft_status = (s)); \ 65 _exit_critical_bh(&(a)->mlmepriv.lock, ((_irqL *)(irq))); \ 66 } while (0) 67 68 #define rtw_ft_reset_status(a) \ 69 do { \ 70 ((a)->mlmepriv.ft_roam.ft_status = RTW_FT_UNASSOCIATED_STA); \ 71 } while (0) 72 73 enum rtw_ft_capability { 74 RTW_FT_EN = BIT0, 75 RTW_FT_OTD_EN = BIT1, 76 RTW_FT_PEER_EN = BIT2, 77 RTW_FT_PEER_OTD_EN = BIT3, 78 RTW_FT_BTM_ROAM = BIT4, 79 RTW_FT_TEST_RSSI_ROAM = BIT7, 80 }; 81 82 #define rtw_ft_chk_flags(a, f) \ 83 ((a)->mlmepriv.ft_roam.ft_flags & (f)) 84 85 #define rtw_ft_set_flags(a, f) \ 86 do { \ 87 ((a)->mlmepriv.ft_roam.ft_flags |= (f)); \ 88 } while (0) 89 90 #define rtw_ft_clr_flags(a, f) \ 91 do { \ 92 ((a)->mlmepriv.ft_roam.ft_flags &= ~(f)); \ 93 } while (0) 94 95 #define rtw_ft_roam(a) \ 96 ((rtw_to_roam(a) > 0) && rtw_ft_chk_flags(a, RTW_FT_PEER_EN)) 97 98 #define rtw_ft_valid_akm(a, t) \ 99 ((rtw_ft_chk_flags(a, RTW_FT_EN)) && \ 100 (((t) == 3) || ((t) == 4))) 101 102 #define rtw_ft_roam_expired(a, r) \ 103 ((rtw_chk_roam_flags(a, RTW_ROAM_ON_EXPIRED)) \ 104 && (r == WLAN_REASON_ACTIVE_ROAM)) 105 106 #define rtw_ft_otd_roam_en(a) \ 107 ((rtw_ft_chk_flags(a, RTW_FT_OTD_EN)) \ 108 && ((a)->mlmepriv.ft_roam.ft_roam_on_expired == _FALSE) \ 109 && ((a)->mlmepriv.ft_roam.ft_cap & 0x01)) 110 111 #define rtw_ft_otd_roam(a) \ 112 rtw_ft_chk_flags(a, RTW_FT_PEER_OTD_EN) 113 114 #define rtw_ft_valid_otd_candidate(a, p) \ 115 ((rtw_ft_chk_flags(a, RTW_FT_OTD_EN)) \ 116 && ((rtw_ft_chk_flags(a, RTW_FT_PEER_OTD_EN) \ 117 && ((*((p)+4) & 0x01) == 0)) \ 118 || ((rtw_ft_chk_flags(a, RTW_FT_PEER_OTD_EN) == 0) \ 119 && (*((p)+4) & 0x01)))) 120 121 struct ft_roam_info { 122 u16 mdid; 123 u8 ft_cap; 124 /*b0: FT over DS, b1: Resource Req Protocol Cap, b2~b7: Reserved*/ 125 u8 updated_ft_ies[RTW_FT_MAX_IE_SZ]; 126 u16 updated_ft_ies_len; 127 u8 ft_action[RTW_FT_MAX_IE_SZ]; 128 u16 ft_action_len; 129 struct cfg80211_ft_event_params ft_event; 130 u8 ft_roam_on_expired; 131 u8 ft_flags; 132 u32 ft_status; 133 u32 ft_req_retry_cnt; 134 bool ft_updated_bcn; 135 }; 136 137 void rtw_ft_info_init(struct ft_roam_info *pft); 138 139 int rtw_ft_proc_flags_get(struct seq_file *m, void *v); 140 141 ssize_t rtw_ft_proc_flags_set(struct file *file, const char __user *buffer, 142 size_t count, loff_t *pos, void *data); 143 144 u8 rtw_ft_chk_roaming_candidate( 145 _adapter *padapter, struct wlan_network *competitor); 146 147 void rtw_ft_update_stainfo(_adapter *padapter, WLAN_BSSID_EX *pnetwork); 148 149 void rtw_ft_reassoc_event_callback(_adapter *padapter, u8 *pbuf); 150 151 void rtw_ft_validate_akm_type(_adapter *padapter, 152 struct wlan_network *pnetwork); 153 154 void rtw_ft_update_bcn(_adapter *padapter, union recv_frame *precv_frame); 155 156 void rtw_ft_start_clnt_join(_adapter *padapter); 157 158 u8 rtw_ft_update_rsnie( 159 _adapter *padapter, u8 bwrite, 160 struct pkt_attrib *pattrib, u8 **pframe); 161 162 void rtw_ft_build_auth_req_ies(_adapter *padapter, 163 struct pkt_attrib *pattrib, u8 **pframe); 164 165 void rtw_ft_build_assoc_req_ies(_adapter *padapter, 166 u8 is_reassoc, struct pkt_attrib *pattrib, u8 **pframe); 167 168 u8 rtw_ft_update_auth_rsp_ies(_adapter *padapter, u8 *pframe, u32 len); 169 170 void rtw_ft_start_roam(_adapter *padapter, u8 *pTargetAddr); 171 172 void rtw_ft_issue_action_req(_adapter *padapter, u8 *pTargetAddr); 173 174 void rtw_ft_report_evt(_adapter *padapter); 175 176 void rtw_ft_report_reassoc_evt(_adapter *padapter, u8 *pMacAddr); 177 178 void rtw_ft_link_timer_hdl(void *ctx); 179 180 void rtw_ft_roam_timer_hdl(void *ctx); 181 182 void rtw_ft_roam_status_reset(_adapter *padapter); 183 184 #endif /* __RTW_FT_H_ */ 185