1 /******************************************************************************
3 * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
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.
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
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
19 ******************************************************************************/
22 #define _MLME_OSDEP_C_
24 #include <osdep_service.h>
25 #include <drv_types.h>
26 #include <mlme_osdep.h>
28 void rtw_init_mlme_timer(struct adapter
*padapter
)
30 struct mlme_priv
*pmlmepriv
= &padapter
->mlmepriv
;
32 _init_timer(&(pmlmepriv
->assoc_timer
), padapter
->pnetdev
, _rtw_join_timeout_handler
, padapter
);
33 _init_timer(&(pmlmepriv
->scan_to_timer
), padapter
->pnetdev
, rtw_scan_timeout_handler
, padapter
);
34 _init_timer(&(pmlmepriv
->dynamic_chk_timer
), padapter
->pnetdev
, rtw_dynamic_check_timer_handlder
, padapter
);
37 void rtw_os_indicate_connect(struct adapter
*adapter
)
39 rtw_indicate_wx_assoc_event(adapter
);
40 netif_carrier_on(adapter
->pnetdev
);
41 if (adapter
->pid
[2] != 0)
42 rtw_signal_process(adapter
->pid
[2], SIGALRM
);
45 void rtw_os_indicate_scan_done(struct adapter
*padapter
, bool aborted
)
47 indicate_wx_scan_complete_event(padapter
);
50 static struct rt_pmkid_list backup_pmkid
[NUM_PMKID_CACHE
];
52 void rtw_reset_securitypriv(struct adapter
*adapter
)
55 u8 backup_counter
= 0x00;
58 if (adapter
->securitypriv
.dot11AuthAlgrthm
== dot11AuthAlgrthm_8021X
) {
60 /* We have to backup the PMK information for WiFi PMK Caching test item. */
61 /* Backup the btkip_countermeasure information. */
62 /* When the countermeasure is trigger, the driver have to disconnect with AP for 60 seconds. */
63 memset(&backup_pmkid
[0], 0x00, sizeof(struct rt_pmkid_list
) * NUM_PMKID_CACHE
);
64 memcpy(&backup_pmkid
[0], &adapter
->securitypriv
.PMKIDList
[0], sizeof(struct rt_pmkid_list
) * NUM_PMKID_CACHE
);
65 backup_index
= adapter
->securitypriv
.PMKIDIndex
;
66 backup_counter
= adapter
->securitypriv
.btkip_countermeasure
;
67 backup_time
= adapter
->securitypriv
.btkip_countermeasure_time
;
68 memset((unsigned char *)&adapter
->securitypriv
, 0, sizeof(struct security_priv
));
70 /* Restore the PMK information to securitypriv structure for the following connection. */
71 memcpy(&adapter
->securitypriv
.PMKIDList
[0],
73 sizeof(struct rt_pmkid_list
) * NUM_PMKID_CACHE
);
74 adapter
->securitypriv
.PMKIDIndex
= backup_index
;
75 adapter
->securitypriv
.btkip_countermeasure
= backup_counter
;
76 adapter
->securitypriv
.btkip_countermeasure_time
= backup_time
;
77 adapter
->securitypriv
.ndisauthtype
= Ndis802_11AuthModeOpen
;
78 adapter
->securitypriv
.ndisencryptstatus
= Ndis802_11WEPDisabled
;
80 /* reset values in securitypriv */
81 struct security_priv
*psec_priv
= &adapter
->securitypriv
;
83 psec_priv
->dot11AuthAlgrthm
= dot11AuthAlgrthm_Open
; /* open system */
84 psec_priv
->dot11PrivacyAlgrthm
= _NO_PRIVACY_
;
85 psec_priv
->dot11PrivacyKeyIndex
= 0;
86 psec_priv
->dot118021XGrpPrivacy
= _NO_PRIVACY_
;
87 psec_priv
->dot118021XGrpKeyid
= 1;
88 psec_priv
->ndisauthtype
= Ndis802_11AuthModeOpen
;
89 psec_priv
->ndisencryptstatus
= Ndis802_11WEPDisabled
;
93 void rtw_os_indicate_disconnect(struct adapter
*adapter
)
95 netif_carrier_off(adapter
->pnetdev
); /* Do it first for tx broadcast pkt after disconnection issue! */
96 rtw_indicate_wx_disassoc_event(adapter
);
97 rtw_reset_securitypriv(adapter
);
100 void rtw_report_sec_ie(struct adapter
*adapter
, u8 authmode
, u8
*sec_ie
)
104 union iwreq_data wrqu
;
106 RT_TRACE(_module_mlme_osdep_c_
, _drv_info_
,
107 ("+rtw_report_sec_ie, authmode=%d\n", authmode
));
109 if (authmode
== _WPA_IE_ID_
) {
110 RT_TRACE(_module_mlme_osdep_c_
, _drv_info_
,
111 ("rtw_report_sec_ie, authmode=%d\n", authmode
));
112 buff
= rtw_malloc(IW_CUSTOM_MAX
);
115 memset(buff
, 0, IW_CUSTOM_MAX
);
117 p
+= sprintf(p
, "ASSOCINFO(ReqIEs =");
119 len
= (len
< IW_CUSTOM_MAX
) ? len
: IW_CUSTOM_MAX
;
120 for (i
= 0; i
< len
; i
++)
121 p
+= sprintf(p
, "%02x", sec_ie
[i
]);
122 p
+= sprintf(p
, ")");
123 memset(&wrqu
, 0, sizeof(wrqu
));
124 wrqu
.data
.length
= p
-buff
;
125 wrqu
.data
.length
= (wrqu
.data
.length
< IW_CUSTOM_MAX
) ?
126 wrqu
.data
.length
: IW_CUSTOM_MAX
;
127 wireless_send_event(adapter
->pnetdev
, IWEVCUSTOM
, &wrqu
, buff
);
132 void init_addba_retry_timer(struct adapter
*padapter
, struct sta_info
*psta
)
134 _init_timer(&psta
->addba_retry_timer
, padapter
->pnetdev
, addba_timer_hdl
, psta
);
137 void init_mlme_ext_timer(struct adapter
*padapter
)
139 struct mlme_ext_priv
*pmlmeext
= &padapter
->mlmeextpriv
;
141 _init_timer(&pmlmeext
->survey_timer
, padapter
->pnetdev
, survey_timer_hdl
, padapter
);
142 _init_timer(&pmlmeext
->link_timer
, padapter
->pnetdev
, link_timer_hdl
, padapter
);
145 #ifdef CONFIG_88EU_AP_MODE
147 void rtw_indicate_sta_assoc_event(struct adapter
*padapter
, struct sta_info
*psta
)
149 union iwreq_data wrqu
;
150 struct sta_priv
*pstapriv
= &padapter
->stapriv
;
155 if (psta
->aid
> NUM_STA
)
158 if (pstapriv
->sta_aid
[psta
->aid
- 1] != psta
)
162 wrqu
.addr
.sa_family
= ARPHRD_ETHER
;
164 memcpy(wrqu
.addr
.sa_data
, psta
->hwaddr
, ETH_ALEN
);
166 DBG_88E("+rtw_indicate_sta_assoc_event\n");
168 wireless_send_event(padapter
->pnetdev
, IWEVREGISTERED
, &wrqu
, NULL
);
171 void rtw_indicate_sta_disassoc_event(struct adapter
*padapter
, struct sta_info
*psta
)
173 union iwreq_data wrqu
;
174 struct sta_priv
*pstapriv
= &padapter
->stapriv
;
179 if (psta
->aid
> NUM_STA
)
182 if (pstapriv
->sta_aid
[psta
->aid
- 1] != psta
)
186 wrqu
.addr
.sa_family
= ARPHRD_ETHER
;
188 memcpy(wrqu
.addr
.sa_data
, psta
->hwaddr
, ETH_ALEN
);
190 DBG_88E("+rtw_indicate_sta_disassoc_event\n");
192 wireless_send_event(padapter
->pnetdev
, IWEVEXPIRED
, &wrqu
, NULL
);