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 16 #ifndef __RTW_FT_H_ 17 #define __RTW_FT_H_ 18 19 enum rtw_ieee80211_ft_actioncode { 20 RTW_WLAN_ACTION_FT_RESV, 21 RTW_WLAN_ACTION_FT_REQ, 22 RTW_WLAN_ACTION_FT_RSP, 23 RTW_WLAN_ACTION_FT_CONF, 24 RTW_WLAN_ACTION_FT_ACK, 25 RTW_WLAN_ACTION_FT_MAX, 26 }; 27 28 enum _rtw_ft_sta_status { 29 RTW_FT_UNASSOCIATED_STA = 0, 30 RTW_FT_AUTHENTICATING_STA, 31 RTW_FT_AUTHENTICATED_STA, 32 RTW_FT_ASSOCIATING_STA, 33 RTW_FT_ASSOCIATED_STA, 34 RTW_FT_REQUESTING_STA, 35 RTW_FT_REQUESTED_STA, 36 RTW_FT_CONFIRMED_STA, 37 RTW_FT_UNSPECIFIED_STA 38 }; 39 40 #define RTW_FT_ACTION_REQ_LMT 4 41 42 #define RTW_FT_MAX_IE_SZ 256 43 44 #define rtw_ft_chk_status(a, s) \ 45 ((a)->mlmepriv.ft_roam.ft_status == (s)) 46 47 #define rtw_ft_roam_status(a, s) \ 48 ((rtw_to_roam(a) > 0) && rtw_ft_chk_status(a, s)) 49 50 #define rtw_ft_authed_sta(a) \ 51 ((rtw_ft_chk_status(a, RTW_FT_AUTHENTICATED_STA)) || \ 52 (rtw_ft_chk_status(a, RTW_FT_ASSOCIATING_STA)) || \ 53 (rtw_ft_chk_status(a, RTW_FT_ASSOCIATED_STA))) 54 55 #define rtw_ft_set_status(a, s) \ 56 do { \ 57 ((a)->mlmepriv.ft_roam.ft_status = (s)); \ 58 } while (0) 59 60 #define rtw_ft_lock_set_status(a, s) \ 61 do { \ 62 _rtw_spinlock_bh(&(a)->mlmepriv.lock); \ 63 ((a)->mlmepriv.ft_roam.ft_status = (s)); \ 64 _rtw_spinunlock_bh(&(a)->mlmepriv.lock); \ 65 } while (0) 66 67 #define rtw_ft_reset_status(a) \ 68 do { \ 69 ((a)->mlmepriv.ft_roam.ft_status = RTW_FT_UNASSOCIATED_STA); \ 70 } while (0) 71 72 enum rtw_ft_capability { 73 RTW_FT_EN = BIT0, 74 RTW_FT_OTD_EN = BIT1, 75 RTW_FT_PEER_EN = BIT2, 76 RTW_FT_PEER_OTD_EN = BIT3, 77 RTW_FT_BTM_ROAM = BIT4, 78 RTW_FT_TEST_RSSI_ROAM = BIT7, 79 }; 80 81 #define rtw_ft_chk_flags(a, f) \ 82 ((a)->mlmepriv.ft_roam.ft_flags & (f)) 83 84 #define rtw_ft_set_flags(a, f) \ 85 do { \ 86 ((a)->mlmepriv.ft_roam.ft_flags |= (f)); \ 87 } while (0) 88 89 #define rtw_ft_clr_flags(a, f) \ 90 do { \ 91 ((a)->mlmepriv.ft_roam.ft_flags &= ~(f)); \ 92 } while (0) 93 94 #define rtw_ft_roam(a) \ 95 ((rtw_to_roam(a) > 0) && rtw_ft_chk_flags(a, RTW_FT_PEER_EN)) 96 97 #define rtw_ft_valid_akm(a, t) \ 98 ((rtw_ft_chk_flags(a, RTW_FT_EN)) && \ 99 (((t) == 3) || ((t) == 4))) 100 101 #define rtw_ft_roam_expired(a, r) \ 102 ((rtw_chk_roam_flags(a, RTW_ROAM_ON_EXPIRED)) \ 103 && (r == WLAN_REASON_ACTIVE_ROAM)) 104 105 /* allow OTD while driver disconnect with current AP */ 106 #if 1 107 #define rtw_ft_otd_roam_en(a) \ 108 ((rtw_ft_chk_flags(a, RTW_FT_OTD_EN)) \ 109 && ((a)->mlmepriv.ft_roam.ft_cap & 0x01)) 110 #else 111 #define rtw_ft_otd_roam_en(a) \ 112 ((rtw_ft_chk_flags(a, RTW_FT_OTD_EN)) \ 113 && ((a)->mlmepriv.ft_roam.ft_roam_on_expired == _FALSE) \ 114 && ((a)->mlmepriv.ft_roam.ft_cap & 0x01)) 115 #endif 116 117 #define rtw_ft_otd_roam(a) \ 118 rtw_ft_chk_flags(a, RTW_FT_PEER_OTD_EN) 119 120 #define rtw_ft_valid_otd_candidate(a, p) \ 121 ((rtw_ft_chk_flags(a, RTW_FT_OTD_EN)) \ 122 && ((rtw_ft_chk_flags(a, RTW_FT_PEER_OTD_EN) \ 123 && ((*((p)+4) & 0x01) == 0)) \ 124 || ((rtw_ft_chk_flags(a, RTW_FT_PEER_OTD_EN) == 0) \ 125 && (*((p)+4) & 0x01)))) 126 127 struct ft_roam_info { 128 u16 mdid; 129 u8 ft_cap; 130 /*b0: FT over DS, b1: Resource Req Protocol Cap, b2~b7: Reserved*/ 131 u8 updated_ft_ies[RTW_FT_MAX_IE_SZ]; 132 u16 updated_ft_ies_len; 133 u8 ft_action[RTW_FT_MAX_IE_SZ]; 134 u16 ft_action_len; 135 struct cfg80211_ft_event_params ft_event; 136 u8 ft_roam_on_expired; 137 u8 ft_flags; 138 u32 ft_status; 139 u32 ft_req_retry_cnt; 140 bool ft_updated_bcn; 141 }; 142 143 struct rtw_sta_ft_info_t { 144 u8 *rsn_ie; 145 u32 rsn_len; 146 u8 *md_ie; 147 u32 md_len; 148 u8 *ft_ie; 149 u32 ft_len; 150 }; 151 152 void rtw_ft_info_init(struct ft_roam_info *pft); 153 154 int rtw_ft_proc_flags_get(struct seq_file *m, void *v); 155 156 ssize_t rtw_ft_proc_flags_set(struct file *file, const char __user *buffer, 157 size_t count, loff_t *pos, void *data); 158 159 u8 rtw_ft_chk_roaming_candidate( 160 _adapter *padapter, struct wlan_network *competitor); 161 162 void rtw_ft_update_stainfo(_adapter *padapter, WLAN_BSSID_EX *pnetwork); 163 164 void rtw_ft_reassoc_event_callback(_adapter *padapter, u8 *pbuf); 165 166 void rtw_ft_validate_akm_type(_adapter *padapter, 167 struct wlan_network *pnetwork); 168 169 void rtw_ft_update_bcn(_adapter *padapter, union recv_frame *precv_frame); 170 171 void rtw_ft_start_clnt_join(_adapter *padapter); 172 173 u8 rtw_ft_update_rsnie( 174 _adapter *padapter, u8 bwrite, 175 struct pkt_attrib *pattrib, u8 **pframe); 176 177 void rtw_ft_build_auth_req_ies(_adapter *padapter, 178 struct pkt_attrib *pattrib, u8 **pframe); 179 180 void rtw_ft_build_assoc_req_ies(_adapter *padapter, 181 u8 is_reassoc, struct pkt_attrib *pattrib, u8 **pframe); 182 183 u8 rtw_ft_update_auth_rsp_ies(_adapter *padapter, u8 *pframe, u32 len); 184 185 void rtw_ft_start_roam(_adapter *padapter, u8 *pTargetAddr); 186 187 void rtw_ft_issue_action_req(_adapter *padapter, u8 *pTargetAddr); 188 189 void rtw_ft_report_evt(_adapter *padapter); 190 191 void rtw_ft_report_reassoc_evt(_adapter *padapter, u8 *pMacAddr); 192 193 void rtw_ft_link_timer_hdl(void *ctx); 194 195 void rtw_ft_roam_timer_hdl(void *ctx); 196 197 void rtw_ft_roam_status_reset(_adapter *padapter); 198 199 void rtw_ft_peer_info_init(struct sta_info *psta); 200 201 void rtw_ft_peer_info_free(struct sta_info *psta); 202 203 int rtw_ft_update_sta_ies(_adapter *padapter, 204 struct cfg80211_update_ft_ies_params *pie); 205 206 void rtw_ft_update_assocresp_ies(struct net_device *net, 207 struct cfg80211_ap_settings *settings); 208 209 void rtw_ft_process_ft_auth_rsp(_adapter *padapter, u8 *pframe, u32 len); 210 211 void rtw_ft_build_assoc_rsp_ies(_adapter *padapter, 212 struct sta_info *psta, struct pkt_attrib *pattrib, u8 **pframe); 213 214 #endif /* __RTW_FT_H_ */ 215