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 ******************************************************************************/
20 #define _RTW_IOCTL_QUERY_C_
23 #include <osdep_service.h>
24 #include <drv_types.h>
25 #include <rtw_ioctl_query.h>
29 #ifdef PLATFORM_WINDOWS
31 // Added for WPA2-PSK, by Annie, 2005-09-20.
34 query_802_11_capability(
40 static NDIS_802_11_AUTHENTICATION_ENCRYPTION szAuthEnc[] =
42 {Ndis802_11AuthModeOpen, Ndis802_11EncryptionDisabled},
43 {Ndis802_11AuthModeOpen, Ndis802_11Encryption1Enabled},
44 {Ndis802_11AuthModeShared, Ndis802_11EncryptionDisabled},
45 {Ndis802_11AuthModeShared, Ndis802_11Encryption1Enabled},
46 {Ndis802_11AuthModeWPA, Ndis802_11Encryption2Enabled},
47 {Ndis802_11AuthModeWPA, Ndis802_11Encryption3Enabled},
48 {Ndis802_11AuthModeWPAPSK, Ndis802_11Encryption2Enabled},
49 {Ndis802_11AuthModeWPAPSK, Ndis802_11Encryption3Enabled},
50 {Ndis802_11AuthModeWPANone, Ndis802_11Encryption2Enabled},
51 {Ndis802_11AuthModeWPANone, Ndis802_11Encryption3Enabled},
52 {Ndis802_11AuthModeWPA2, Ndis802_11Encryption2Enabled},
53 {Ndis802_11AuthModeWPA2, Ndis802_11Encryption3Enabled},
54 {Ndis802_11AuthModeWPA2PSK, Ndis802_11Encryption2Enabled},
55 {Ndis802_11AuthModeWPA2PSK, Ndis802_11Encryption3Enabled}
57 static ULONG ulNumOfPairSupported = sizeof(szAuthEnc)/sizeof(NDIS_802_11_AUTHENTICATION_ENCRYPTION);
58 NDIS_802_11_CAPABILITY * pCap = (NDIS_802_11_CAPABILITY *)pucBuf;
59 u8* pucAuthEncryptionSupported = (u8*) pCap->AuthenticationEncryptionSupported;
62 pCap->Length = sizeof(NDIS_802_11_CAPABILITY);
63 if(ulNumOfPairSupported > 1 )
64 pCap->Length += (ulNumOfPairSupported-1) * sizeof(NDIS_802_11_AUTHENTICATION_ENCRYPTION);
67 pCap->NoOfPMKIDs = NUM_PMKID_CACHE;
68 pCap->NoOfAuthEncryptPairsSupported = ulNumOfPairSupported;
70 if( sizeof (szAuthEnc) <= 240 ) // 240 = 256 - 4*4 // SecurityInfo.szCapability: only 256 bytes in size.
72 _rtw_memcpy( pucAuthEncryptionSupported, (u8*)szAuthEnc, sizeof (szAuthEnc) );
73 *pulOutLen = pCap->Length;
79 RT_TRACE(_module_rtl871x_ioctl_query_c_,_drv_info_,("_query_802_11_capability(): szAuthEnc size is too large.\n"));
84 u8 query_802_11_association_information( _adapter *padapter,PNDIS_802_11_ASSOCIATION_INFORMATION pAssocInfo)
86 struct wlan_network *tgt_network;
87 struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
88 struct security_priv *psecuritypriv=&(padapter->securitypriv);
89 WLAN_BSSID_EX *psecnetwork=(WLAN_BSSID_EX*)&(psecuritypriv->sec_bss);
90 u8 * pDest = (u8 *)pAssocInfo + sizeof(NDIS_802_11_ASSOCIATION_INFORMATION);
91 unsigned char i,*auth_ie,*supp_ie;
93 //NdisZeroMemory(pAssocInfo, sizeof(NDIS_802_11_ASSOCIATION_INFORMATION));
94 _rtw_memset(pAssocInfo, 0, sizeof(NDIS_802_11_ASSOCIATION_INFORMATION));
95 //pAssocInfo->Length = sizeof(NDIS_802_11_ASSOCIATION_INFORMATION);
97 //------------------------------------------------------
98 // Association Request related information
99 //------------------------------------------------------
100 // Req_1. AvailableRequestFixedIEs
101 if(psecnetwork!=NULL){
103 pAssocInfo->AvailableRequestFixedIEs |= NDIS_802_11_AI_REQFI_CAPABILITIES|NDIS_802_11_AI_REQFI_CURRENTAPADDRESS;
104 pAssocInfo->RequestFixedIEs.Capabilities = (unsigned short)* & psecnetwork->IEs[10];
105 _rtw_memcpy(pAssocInfo->RequestFixedIEs.CurrentAPAddress,
106 & psecnetwork->MacAddress, 6);
108 pAssocInfo->OffsetRequestIEs = sizeof(NDIS_802_11_ASSOCIATION_INFORMATION);
110 if(check_fwstate( pmlmepriv, _FW_UNDER_LINKING|_FW_LINKED)==_TRUE)
113 if(psecuritypriv->ndisauthtype>=Ndis802_11AuthModeWPA2)
114 pDest[0] =48; //RSN Information Element
116 pDest[0] =221; //WPA(SSN) Information Element
118 RT_TRACE(_module_rtl871x_ioctl_query_c_,_drv_info_,("\n Adapter->ndisauthtype==Ndis802_11AuthModeWPA)?0xdd:0x30 [%d]",pDest[0]));
119 supp_ie=&psecuritypriv->supplicant_ie[0];
120 for(i=0;i<supp_ie[0];i++)
122 RT_TRACE(_module_rtl871x_ioctl_query_c_,_drv_info_,("IEs [%d] = 0x%x \n\n", i,supp_ie[i]));
125 i=13; //0~11 is fixed information element
126 RT_TRACE(_module_rtl871x_ioctl_query_c_,_drv_info_,("i= %d tgt_network->network.IELength=%d\n\n", i,(int)psecnetwork->IELength));
127 while((i<supp_ie[0]) && (i<256)){
128 if((unsigned char)supp_ie[i]==pDest[0]){
129 _rtw_memcpy((u8 *)(pDest),
139 RT_TRACE(_module_rtl871x_ioctl_query_c_,_drv_info_,("iteration i=%d IEs [%d] = 0x%x \n\n", i,i,supp_ie[i+1]));
144 pAssocInfo->RequestIELength += (2 + supp_ie[1+i]);// (2 + psecnetwork->IEs[1+i]+4);
149 RT_TRACE(_module_rtl871x_ioctl_query_c_,_drv_info_,("\n psecnetwork != NULL,fwstate==_FW_UNDER_LINKING \n"));
154 //------------------------------------------------------
155 // Association Response related information
156 //------------------------------------------------------
158 if(check_fwstate( pmlmepriv, _FW_LINKED)==_TRUE)
160 tgt_network =&(pmlmepriv->cur_network);
161 if(tgt_network!=NULL){
162 pAssocInfo->AvailableResponseFixedIEs =
163 NDIS_802_11_AI_RESFI_CAPABILITIES
164 |NDIS_802_11_AI_RESFI_ASSOCIATIONID
167 pAssocInfo->ResponseFixedIEs.Capabilities =(unsigned short)* & tgt_network->network.IEs[10];
168 pAssocInfo->ResponseFixedIEs.StatusCode = 0;
169 pAssocInfo->ResponseFixedIEs.AssociationId =(unsigned short) tgt_network->aid;
171 pDest = (u8 *)pAssocInfo + sizeof(NDIS_802_11_ASSOCIATION_INFORMATION)+pAssocInfo->RequestIELength;
172 auth_ie=&psecuritypriv->authenticator_ie[0];
174 for(i=0;i<auth_ie[0];i++)
175 RT_TRACE(_module_rtl871x_ioctl_query_c_,_drv_info_,("IEs [%d] = 0x%x \n\n", i,auth_ie[i]));
179 _rtw_memcpy((u8 *)&pDest[0],&auth_ie[1],i);
180 pAssocInfo->ResponseIELength =i;
184 pAssocInfo->OffsetResponseIEs = sizeof(NDIS_802_11_ASSOCIATION_INFORMATION) + pAssocInfo->RequestIELength;
187 RT_TRACE(_module_rtl871x_ioctl_query_c_,_drv_info_,("\n tgt_network != NULL,fwstate==_FW_LINKED \n"));
190 RT_TRACE(_module_rtl871x_ioctl_query_c_,_drv_info_,("\n exit query_802_11_association_information \n"));