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