summaryrefslogblamecommitdiffstats
path: root/drivers/staging/vt6655/80211mgr.c
blob: 9aa2e46c4a5d2b01e8391d553f9d47c5f2c42f3f (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

















                                                                          

                   
                                                           
































                                                                           
                   
                   
                     
                     
                   
                


                                                                       



                                                                       
                                     
                                                                   

                                                                       

                                                                       

                                                                       







                                  
    
 
    
                 

                               
 
                                                     
 
                          








                                                                             
 
                                                                
 
               










                                  
    
 
    
                 

                               
 



                                                     
                          








                                                                                
 
                                  


                                                                         
                                                                         









                                                                                
                                                                          


















                                                                                
                                                 
                                                                   



                                                                                 

                                                                               








                                                                   

                                                                               

                              
                                                   



                                                                              
                                                        
                                                                

                                                                               

                              
                                                    



                                                                         
                                                    









                                                                               


                                                                                     






                                                                              

 








                       
    
 
    
                   

                                  
 

                                                     
 
               

 








                       
    
 
    
                   

                                  
 
                                                     
 
               

 








                         
    
 
    
                         

                                 
 
                                                     
 
                          




                                                                        
 
               

 








                         
    
 
    
                         

                                 
 
                                                     
 
                          


                                                                        
 
               










                              
    
 
    
                       

                                 
 
                                                     
                          







                                                                                
               

 








                              
    
 
    
                       

                                 
 


                                                     
                          





                                                                                
 
                                  










                                                                         

                                                                              


                                  
                                                 
                                                                   



                                                                                 

                                                                               



                                                          

                                                                               


                              

                                                                                       





                                                                              










                               
    
 
    
                        

                                  
 

                                                     
                          










                                                                         

               

 








                               
    
 
    
                        

                                  
 



                                                     
                          








                                                                         
 
                                  


                                                                           






                                                                        


                                                                  
                


                                             

 








                                
    
 
    
                         

                                   
 

                                                     
                          










                                                                                

               

 








                                
    
 
    
                         

                                   
 


                                                     
                          








                                                                                
 
                                  



                                                                         






                                                                     

                                                                               


                                  
                                                 
                                                                   



                                                                                 

                                                                               




                                                          

                                                                               

                              

                                                                                         





                                                                              

 








                        
    
 
    
                       

                                 
 


                                                     










                        
    
 
    
                       

                                 
 
                         
 
                                                     
 
                                  
                                                                       
 
                                                                         




                                                                     
 

                                                       

                                                                              
                              
 

                                                          

                                                                               
                              
 
                        


                                                                      

                              
 


                                                                               

 








                         
    
 
    
                        

                                  
 
                                                     
 
                          








                                                                                
 
                                                                        
                                                   
 
               

 








                         
    
 
    
                        

                                  
 

                          

                                                     
                          








                                                                                
 
                                  










                                                                         

                                                                              












                                                                            

                                                                              


                                  
                                                 
                                                                   



                                                                                 

                                                                               







                                                                   

                                                                               

                              
                                                   



                                                                              
                                                        
                                                                

                                                                               

                              
                                                    



                                                                         
                                                    









                                                                               


                                                                       





                                                                               

 








                                  
    
 
    
                 

                               
 

                                                     
                          










                                                                               

               

 








                          
    
 
    
                 

                               
 
                          
 
                                                     
 
                          








                                                                               
 
                                  

                                                                     
 

                                                                      
                                                               
 
               

 








                          
    
 
    
                   

                                 
 
                                                     
 
                          




                                                                        
 
               

 








                            
    
 
    
                   

                                 
 
                                                     
 
                          


                                                                        
 
               

 








                                  
    
 
    
                          

                                    
 
                                                     
 
                          











                                                                         
 
               

 








                                  
    
 
    
                          

                                    
 



                                                     
                          








                                                                         
 
                                  


                                                                          








                                                                        
 
/*
 * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
 * All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * File: 80211mgr.c
 *
 * Purpose: Handles the 802.11 management support functions
 *
 * Author: Lyndon Chen
 *
 * Date: May 8, 2002
 *
 * Functions:
 *      vMgrEncodeBeacon - Encode the Beacon frame
 *      vMgrDecodeBeacon - Decode the Beacon frame
 *      vMgrEncodeIBSSATIM - Encode the IBSS ATIM frame
 *      vMgrDecodeIBSSATIM - Decode the IBSS ATIM frame
 *      vMgrEncodeDisassociation - Encode the Disassociation frame
 *      vMgrDecodeDisassociation - Decode the Disassociation frame
 *      vMgrEncodeAssocRequest - Encode the Association request frame
 *      vMgrDecodeAssocRequest - Decode the Association request frame
 *      vMgrEncodeAssocResponse - Encode the Association response frame
 *      vMgrDecodeAssocResponse - Decode the Association response frame
 *      vMgrEncodeReAssocRequest - Encode the ReAssociation request frame
 *      vMgrDecodeReAssocRequest - Decode the ReAssociation request frame
 *      vMgrEncodeProbeRequest - Encode the Probe request frame
 *      vMgrDecodeProbeRequest - Decode the Probe request frame
 *      vMgrEncodeProbeResponse - Encode the Probe response frame
 *      vMgrDecodeProbeResponse - Decode the Probe response frame
 *      vMgrEncodeAuthen - Encode the Authentication frame
 *      vMgrDecodeAuthen - Decode the Authentication frame
 *      vMgrEncodeDeauthen - Encode the DeAuthentication frame
 *      vMgrDecodeDeauthen - Decode the DeAuthentication frame
 *      vMgrEncodeReassocResponse - Encode the Reassociation response frame
 *      vMgrDecodeReassocResponse - Decode the Reassociation response frame
 *
 * Revision History:
 *
 */

#include "tmacro.h"
#include "tether.h"
#include "80211mgr.h"
#include "80211hdr.h"
#include "device.h"
#include "wpa.h"

/*---------------------  Static Definitions -------------------------*/

/*---------------------  Static Classes  ----------------------------*/

/*---------------------  Static Variables  --------------------------*/

static int msglevel = MSG_LEVEL_INFO;
/* static int          msglevel                =MSG_LEVEL_DEBUG; */
/*---------------------  Static Functions  --------------------------*/

/*---------------------  Export Variables  --------------------------*/

/*---------------------  Export Functions  --------------------------*/

/*+
 *
 * Routine Description:
 * Encode Beacon frame body offset
 *
 * Return Value:
 *    None.
 *
 -*/

void
vMgrEncodeBeacon(
	PWLAN_FR_BEACON  pFrame
)
{
	pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;

	/* Fixed Fields */
	pFrame->pqwTimestamp = (PQWORD)
				(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
				 WLAN_BEACON_OFF_TS);
	pFrame->pwBeaconInterval = (unsigned short *)
				(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
				 WLAN_BEACON_OFF_BCN_INT);
	pFrame->pwCapInfo = (unsigned short *)
			    (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
			     WLAN_BEACON_OFF_CAPINFO);

	pFrame->len = WLAN_HDR_ADDR3_LEN + WLAN_BEACON_OFF_SSID;

	return;
}

/*+
 *
 * Routine Description:
 * Decode Beacon frame body offset
 *
 *
 * Return Value:
 *    None.
 *
 -*/

void
vMgrDecodeBeacon(
	PWLAN_FR_BEACON  pFrame
)
{
	PWLAN_IE        pItem;

	pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;

	/* Fixed Fields */
	pFrame->pqwTimestamp = (PQWORD)
				(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
				 WLAN_BEACON_OFF_TS);
	pFrame->pwBeaconInterval = (unsigned short *)
				   (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
				    WLAN_BEACON_OFF_BCN_INT);
	pFrame->pwCapInfo = (unsigned short *)
			    (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
			     WLAN_BEACON_OFF_CAPINFO);

	/* Information elements */
	pItem = (PWLAN_IE)((unsigned char *)
			   (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))) +
			    WLAN_BEACON_OFF_SSID);
	while (((unsigned char *)pItem) < (pFrame->pBuf + pFrame->len)) {
		switch (pItem->byElementID) {
		case WLAN_EID_SSID:
			if (pFrame->pSSID == NULL)
				pFrame->pSSID = (PWLAN_IE_SSID)pItem;
			break;
		case WLAN_EID_SUPP_RATES:
			if (pFrame->pSuppRates == NULL)
				pFrame->pSuppRates = (PWLAN_IE_SUPP_RATES)pItem;
			break;
		case WLAN_EID_FH_PARMS:
			/* pFrame->pFHParms = (PWLAN_IE_FH_PARMS)pItem; */
			break;
		case WLAN_EID_DS_PARMS:
			if (pFrame->pDSParms == NULL)
				pFrame->pDSParms = (PWLAN_IE_DS_PARMS)pItem;
			break;
		case WLAN_EID_CF_PARMS:
			if (pFrame->pCFParms == NULL)
				pFrame->pCFParms = (PWLAN_IE_CF_PARMS)pItem;
			break;
		case WLAN_EID_IBSS_PARMS:
			if (pFrame->pIBSSParms == NULL)
				pFrame->pIBSSParms = (PWLAN_IE_IBSS_PARMS)pItem;
			break;
		case WLAN_EID_TIM:
			if (pFrame->pTIM == NULL)
				pFrame->pTIM = (PWLAN_IE_TIM)pItem;
			break;

		case WLAN_EID_RSN:
			if (pFrame->pRSN == NULL)
				pFrame->pRSN = (PWLAN_IE_RSN)pItem;
			break;
		case WLAN_EID_RSN_WPA:
			if (pFrame->pRSNWPA == NULL) {
				if (WPAb_Is_RSN((PWLAN_IE_RSN_EXT)pItem) == true)
					pFrame->pRSNWPA =
						       (PWLAN_IE_RSN_EXT)pItem;
			}
			break;

		case WLAN_EID_ERP:
			if (pFrame->pERP == NULL)
				pFrame->pERP = (PWLAN_IE_ERP)pItem;
			break;
		case WLAN_EID_EXTSUPP_RATES:
			if (pFrame->pExtSuppRates == NULL)
				pFrame->pExtSuppRates =
						    (PWLAN_IE_SUPP_RATES)pItem;
			break;

		case WLAN_EID_COUNTRY:      /* 7 */
			if (pFrame->pIE_Country == NULL)
				pFrame->pIE_Country = (PWLAN_IE_COUNTRY)pItem;
			break;

		case WLAN_EID_PWR_CONSTRAINT:   /* 32 */
			if (pFrame->pIE_PowerConstraint == NULL)
				pFrame->pIE_PowerConstraint =
						      (PWLAN_IE_PW_CONST)pItem;
			break;

		case WLAN_EID_CH_SWITCH:    /* 37 */
			if (pFrame->pIE_CHSW == NULL)
				pFrame->pIE_CHSW = (PWLAN_IE_CH_SW)pItem;
			break;

		case WLAN_EID_QUIET:        /* 40 */
			if (pFrame->pIE_Quiet == NULL)
				pFrame->pIE_Quiet = (PWLAN_IE_QUIET)pItem;
			break;

		case WLAN_EID_IBSS_DFS:
			if (pFrame->pIE_IBSSDFS == NULL)
				pFrame->pIE_IBSSDFS = (PWLAN_IE_IBSS_DFS)pItem;
			break;

		default:
			DBG_PRT(MSG_LEVEL_DEBUG,
				KERN_INFO "Unrecognized EID=%dd in beacon decode.\n",
				pItem->byElementID);
			break;

		}
		pItem = (PWLAN_IE)(((unsigned char *)pItem) + 2 + pItem->len);
	}

	return;
}

/*+
 *
 * Routine Description:
 *  Encode IBSS ATIM
 *
 *
 * Return Value:
 *    None.
 *
 -*/

void
vMgrEncodeIBSSATIM(
	PWLAN_FR_IBSSATIM   pFrame
)
{
	pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;
	pFrame->len = WLAN_HDR_ADDR3_LEN;

	return;
}

/*+
 *
 * Routine Description:
 *  Decode IBSS ATIM
 *
 *
 * Return Value:
 *    None.
 *
 -*/

void
vMgrDecodeIBSSATIM(
	PWLAN_FR_IBSSATIM   pFrame
)
{
	pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;

	return;
}

/*+
 *
 * Routine Description:
 *  Encode Disassociation
 *
 *
 * Return Value:
 *    None.
 *
 -*/

void
vMgrEncodeDisassociation(
	PWLAN_FR_DISASSOC  pFrame
)
{
	pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;

	/* Fixed Fields */
	pFrame->pwReason = (unsigned short *)
			   (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
			    WLAN_DISASSOC_OFF_REASON);
	pFrame->len = WLAN_HDR_ADDR3_LEN + WLAN_DISASSOC_OFF_REASON +
		      sizeof(*(pFrame->pwReason));

	return;
}

/*+
 *
 * Routine Description:
 *  Decode Disassociation
 *
 *
 * Return Value:
 *    None.
 *
 -*/

void
vMgrDecodeDisassociation(
	PWLAN_FR_DISASSOC  pFrame
)
{
	pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;

	/* Fixed Fields */
	pFrame->pwReason = (unsigned short *)
			   (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
			    WLAN_DISASSOC_OFF_REASON);

	return;
}

/*+
 *
 * Routine Description:
 *  Encode Association Request
 *
 *
 * Return Value:
 *    None.
 *
 -*/

void
vMgrEncodeAssocRequest(
	PWLAN_FR_ASSOCREQ  pFrame
)
{
	pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;
	/* Fixed Fields */
	pFrame->pwCapInfo = (unsigned short *)
			    (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
			     WLAN_ASSOCREQ_OFF_CAP_INFO);
	pFrame->pwListenInterval = (unsigned short *)
				   (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
				    WLAN_ASSOCREQ_OFF_LISTEN_INT);
	pFrame->len = WLAN_HDR_ADDR3_LEN + WLAN_ASSOCREQ_OFF_LISTEN_INT +
		      sizeof(*(pFrame->pwListenInterval));
	return;
}

/*+
 *
 * Routine Description: (AP)
 *  Decode Association Request
 *
 *
 * Return Value:
 *    None.
 *
 -*/

void
vMgrDecodeAssocRequest(
	PWLAN_FR_ASSOCREQ  pFrame
)
{
	PWLAN_IE   pItem;

	pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;
	/* Fixed Fields */
	pFrame->pwCapInfo = (unsigned short *)
			    (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
			     WLAN_ASSOCREQ_OFF_CAP_INFO);
	pFrame->pwListenInterval = (unsigned short *)
				   (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
				    WLAN_ASSOCREQ_OFF_LISTEN_INT);

	/* Information elements */
	pItem = (PWLAN_IE)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
			   + WLAN_ASSOCREQ_OFF_SSID);

	while (((unsigned char *)pItem) < (pFrame->pBuf + pFrame->len)) {
		switch (pItem->byElementID) {
		case WLAN_EID_SSID:
			if (pFrame->pSSID == NULL)
				pFrame->pSSID = (PWLAN_IE_SSID)pItem;
			break;
		case WLAN_EID_SUPP_RATES:
			if (pFrame->pSuppRates == NULL)
				pFrame->pSuppRates =
						   (PWLAN_IE_SUPP_RATES)pItem;
			break;

		case WLAN_EID_RSN:
			if (pFrame->pRSN == NULL)
				pFrame->pRSN = (PWLAN_IE_RSN)pItem;
			break;
		case WLAN_EID_RSN_WPA:
			if (pFrame->pRSNWPA == NULL) {
				if (WPAb_Is_RSN((PWLAN_IE_RSN_EXT)pItem) == true)
					pFrame->pRSNWPA =
						       (PWLAN_IE_RSN_EXT)pItem;
			}
			break;
		case WLAN_EID_EXTSUPP_RATES:
			if (pFrame->pExtSuppRates == NULL)
				pFrame->pExtSuppRates =
						    (PWLAN_IE_SUPP_RATES)pItem;
			break;

		default:
			DBG_PRT(MSG_LEVEL_DEBUG,
				KERN_INFO "Unrecognized EID=%dd in assocreq decode.\n",
				pItem->byElementID);
			break;
		}
		pItem = (PWLAN_IE)(((unsigned char *)pItem) + 2 + pItem->len);
	}
	return;
}

/*+
 *
 * Routine Description: (AP)
 *  Encode Association Response
 *
 *
 * Return Value:
 *    None.
 *
 -*/

void
vMgrEncodeAssocResponse(
	PWLAN_FR_ASSOCRESP  pFrame
)
{
	pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;

	/* Fixed Fields */
	pFrame->pwCapInfo = (unsigned short *)
			    (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
			     WLAN_ASSOCRESP_OFF_CAP_INFO);
	pFrame->pwStatus = (unsigned short *)
			   (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
			    WLAN_ASSOCRESP_OFF_STATUS);
	pFrame->pwAid = (unsigned short *)
			(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
			 WLAN_ASSOCRESP_OFF_AID);
	pFrame->len = WLAN_HDR_ADDR3_LEN + WLAN_ASSOCRESP_OFF_AID +
		      sizeof(*(pFrame->pwAid));

	return;
}

/*+
 *
 * Routine Description:
 *  Decode Association Response
 *
 *
 * Return Value:
 *    None.
 *
 -*/

void
vMgrDecodeAssocResponse(
	PWLAN_FR_ASSOCRESP  pFrame
)
{
	PWLAN_IE   pItem;

	pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;

	/* Fixed Fields */
	pFrame->pwCapInfo = (unsigned short *)
			    (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
			     WLAN_ASSOCRESP_OFF_CAP_INFO);
	pFrame->pwStatus = (unsigned short *)
			   (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
			    WLAN_ASSOCRESP_OFF_STATUS);
	pFrame->pwAid = (unsigned short *)
			(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
			 WLAN_ASSOCRESP_OFF_AID);

	/* Information elements */
	pFrame->pSuppRates  = (PWLAN_IE_SUPP_RATES)
			      (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
			       WLAN_ASSOCRESP_OFF_SUPP_RATES);

	pItem = (PWLAN_IE)(pFrame->pSuppRates);
	pItem = (PWLAN_IE)(((unsigned char *)pItem) + 2 + pItem->len);

	if ((((unsigned char *)pItem) < (pFrame->pBuf + pFrame->len)) &&
	    (pItem->byElementID == WLAN_EID_EXTSUPP_RATES)) {
		pFrame->pExtSuppRates = (PWLAN_IE_SUPP_RATES)pItem;
		DBG_PRT(MSG_LEVEL_DEBUG,
			KERN_INFO "pFrame->pExtSuppRates=[%p].\n",
			pItem);
	} else {
		pFrame->pExtSuppRates = NULL;
	}
	return;
}

/*+
 *
 * Routine Description:
 *  Encode Reassociation Request
 *
 *
 * Return Value:
 *    None.
 *
 -*/

void
vMgrEncodeReassocRequest(
	PWLAN_FR_REASSOCREQ  pFrame
)
{
	pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;

	/* Fixed Fields */
	pFrame->pwCapInfo = (unsigned short *)
			    (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
			     WLAN_REASSOCREQ_OFF_CAP_INFO);
	pFrame->pwListenInterval = (unsigned short *)
				   (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
				    WLAN_REASSOCREQ_OFF_LISTEN_INT);
	pFrame->pAddrCurrAP = (PIEEE_ADDR)
			      (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
			       WLAN_REASSOCREQ_OFF_CURR_AP);
	pFrame->len = WLAN_HDR_ADDR3_LEN + WLAN_REASSOCREQ_OFF_CURR_AP +
		      sizeof(*(pFrame->pAddrCurrAP));

	return;
}

/*+
 *
 * Routine Description: (AP)
 *  Decode Reassociation Request
 *
 *
 * Return Value:
 *    None.
 *
 -*/

void
vMgrDecodeReassocRequest(
	PWLAN_FR_REASSOCREQ  pFrame
)
{
	PWLAN_IE   pItem;
	pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;

	/* Fixed Fields */
	pFrame->pwCapInfo = (unsigned short *)
			    (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
			     WLAN_REASSOCREQ_OFF_CAP_INFO);
	pFrame->pwListenInterval = (unsigned short *)
				   (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
				    WLAN_REASSOCREQ_OFF_LISTEN_INT);
	pFrame->pAddrCurrAP = (PIEEE_ADDR)
			      (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
			       WLAN_REASSOCREQ_OFF_CURR_AP);

	/* Information elements */
	pItem = (PWLAN_IE)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
			   + WLAN_REASSOCREQ_OFF_SSID);

	while (((unsigned char *)pItem) < (pFrame->pBuf + pFrame->len)) {
		switch (pItem->byElementID) {
		case WLAN_EID_SSID:
			if (pFrame->pSSID == NULL)
				pFrame->pSSID = (PWLAN_IE_SSID)pItem;
			break;
		case WLAN_EID_SUPP_RATES:
			if (pFrame->pSuppRates == NULL)
				pFrame->pSuppRates =
						    (PWLAN_IE_SUPP_RATES)pItem;
			break;

		case WLAN_EID_RSN:
			if (pFrame->pRSN == NULL)
				pFrame->pRSN = (PWLAN_IE_RSN)pItem;
			break;
		case WLAN_EID_RSN_WPA:
			if (pFrame->pRSNWPA == NULL) {
				if (WPAb_Is_RSN((PWLAN_IE_RSN_EXT)pItem) == true)
					pFrame->pRSNWPA =
						       (PWLAN_IE_RSN_EXT)pItem;
			}
			break;

		case WLAN_EID_EXTSUPP_RATES:
			if (pFrame->pExtSuppRates == NULL)
				pFrame->pExtSuppRates =
						    (PWLAN_IE_SUPP_RATES)pItem;
			break;
		default:
			DBG_PRT(MSG_LEVEL_DEBUG,
				KERN_INFO "Unrecognized EID=%dd in reassocreq decode.\n",
				pItem->byElementID);
			break;
		}
		pItem = (PWLAN_IE)(((unsigned char *)pItem) + 2 + pItem->len);
	}
	return;
}

/*+
 *
 * Routine Description:
 *  Encode Probe Request
 *
 *
 * Return Value:
 *    None.
 *
 -*/

void
vMgrEncodeProbeRequest(
	PWLAN_FR_PROBEREQ  pFrame
)
{
	pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;
	pFrame->len = WLAN_HDR_ADDR3_LEN;
	return;
}

/*+
 *
 * Routine Description:
 *  Decode Probe Request
 *
 *
 * Return Value:
 *    None.
 *
 -*/

void
vMgrDecodeProbeRequest(
	PWLAN_FR_PROBEREQ  pFrame
)
{
	PWLAN_IE   pItem;

	pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;

	/* Information elements */
	pItem = (PWLAN_IE)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)));

	while (((unsigned char *)pItem) < (pFrame->pBuf + pFrame->len)) {
		switch (pItem->byElementID) {
		case WLAN_EID_SSID:
			if (pFrame->pSSID == NULL)
				pFrame->pSSID = (PWLAN_IE_SSID)pItem;
			break;

		case WLAN_EID_SUPP_RATES:
			if (pFrame->pSuppRates == NULL)
				pFrame->pSuppRates =
						   (PWLAN_IE_SUPP_RATES)pItem;
			break;

		case WLAN_EID_EXTSUPP_RATES:
			if (pFrame->pExtSuppRates == NULL)
				pFrame->pExtSuppRates =
						    (PWLAN_IE_SUPP_RATES)pItem;
			break;

		default:
			DBG_PRT(MSG_LEVEL_DEBUG,
				KERN_INFO "Bad EID=%dd in probereq\n",
				pItem->byElementID);
			break;
		}

		pItem = (PWLAN_IE)(((unsigned char *)pItem) + 2 +  pItem->len);
	}
	return;
}

/*+
 *
 * Routine Description:
 *  Encode Probe Response
 *
 *
 * Return Value:
 *    None.
 *
 -*/

void
vMgrEncodeProbeResponse(
	PWLAN_FR_PROBERESP  pFrame
)
{
	pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;

	/* Fixed Fields */
	pFrame->pqwTimestamp = (PQWORD)
			       (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
				WLAN_PROBERESP_OFF_TS);
	pFrame->pwBeaconInterval = (unsigned short *)
				   (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
				    WLAN_PROBERESP_OFF_BCN_INT);
	pFrame->pwCapInfo = (unsigned short *)
			    (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
			     WLAN_PROBERESP_OFF_CAP_INFO);

	pFrame->len = WLAN_HDR_ADDR3_LEN + WLAN_PROBERESP_OFF_CAP_INFO +
		      sizeof(*(pFrame->pwCapInfo));

	return;
}

/*+
 *
 * Routine Description:
 *  Decode Probe Response
 *
 *
 * Return Value:
 *    None.
 *
 -*/

void
vMgrDecodeProbeResponse(
	PWLAN_FR_PROBERESP  pFrame
)
{
	PWLAN_IE    pItem;

	pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;

	/* Fixed Fields */
	pFrame->pqwTimestamp = (PQWORD)
			       (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
				WLAN_PROBERESP_OFF_TS);
	pFrame->pwBeaconInterval = (unsigned short *)
				   (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
				    WLAN_PROBERESP_OFF_BCN_INT);
	pFrame->pwCapInfo = (unsigned short *)
			    (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
			     WLAN_PROBERESP_OFF_CAP_INFO);

	/* Information elements */
	pItem = (PWLAN_IE)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
			   + WLAN_PROBERESP_OFF_SSID);

	while (((unsigned char *)pItem) < (pFrame->pBuf + pFrame->len)) {
		switch (pItem->byElementID) {
		case WLAN_EID_SSID:
			if (pFrame->pSSID == NULL)
				pFrame->pSSID = (PWLAN_IE_SSID)pItem;
			break;
		case WLAN_EID_SUPP_RATES:
			if (pFrame->pSuppRates == NULL)
				pFrame->pSuppRates =
						   (PWLAN_IE_SUPP_RATES)pItem;
			break;
		case WLAN_EID_FH_PARMS:
			break;
		case WLAN_EID_DS_PARMS:
			if (pFrame->pDSParms == NULL)
				pFrame->pDSParms = (PWLAN_IE_DS_PARMS)pItem;
			break;
		case WLAN_EID_CF_PARMS:
			if (pFrame->pCFParms == NULL)
				pFrame->pCFParms = (PWLAN_IE_CF_PARMS)pItem;
			break;
		case WLAN_EID_IBSS_PARMS:
			if (pFrame->pIBSSParms == NULL)
				pFrame->pIBSSParms =
						   (PWLAN_IE_IBSS_PARMS)pItem;
			break;

		case WLAN_EID_RSN:
			if (pFrame->pRSN == NULL)
				pFrame->pRSN = (PWLAN_IE_RSN)pItem;
			break;
		case WLAN_EID_RSN_WPA:
			if (pFrame->pRSNWPA == NULL) {
				if (WPAb_Is_RSN((PWLAN_IE_RSN_EXT)pItem) == true)
					pFrame->pRSNWPA =
						       (PWLAN_IE_RSN_EXT)pItem;
			}
			break;
		case WLAN_EID_ERP:
			if (pFrame->pERP == NULL)
				pFrame->pERP = (PWLAN_IE_ERP)pItem;
			break;
		case WLAN_EID_EXTSUPP_RATES:
			if (pFrame->pExtSuppRates == NULL)
				pFrame->pExtSuppRates =
						    (PWLAN_IE_SUPP_RATES)pItem;
			break;

		case WLAN_EID_COUNTRY:      /* 7 */
			if (pFrame->pIE_Country == NULL)
				pFrame->pIE_Country = (PWLAN_IE_COUNTRY)pItem;
			break;

		case WLAN_EID_PWR_CONSTRAINT:   /* 32 */
			if (pFrame->pIE_PowerConstraint == NULL)
				pFrame->pIE_PowerConstraint =
						      (PWLAN_IE_PW_CONST)pItem;
			break;

		case WLAN_EID_CH_SWITCH:    /* 37 */
			if (pFrame->pIE_CHSW == NULL)
				pFrame->pIE_CHSW = (PWLAN_IE_CH_SW)pItem;
			break;

		case WLAN_EID_QUIET:        /* 40 */
			if (pFrame->pIE_Quiet == NULL)
				pFrame->pIE_Quiet = (PWLAN_IE_QUIET)pItem;
			break;

		case WLAN_EID_IBSS_DFS:
			if (pFrame->pIE_IBSSDFS == NULL)
				pFrame->pIE_IBSSDFS = (PWLAN_IE_IBSS_DFS)pItem;
			break;

		default:
			DBG_PRT(MSG_LEVEL_DEBUG,
				KERN_INFO "Bad EID=%dd in proberesp\n",
				pItem->byElementID);
			break;
		}

		pItem = (PWLAN_IE)(((unsigned char *)pItem) + 2 +  pItem->len);
	}
	return;
}

/*+
 *
 * Routine Description:
 *     Encode Authentication frame
 *
 *
 * Return Value:
 *    None.
 *
 -*/

void
vMgrEncodeAuthen(
	PWLAN_FR_AUTHEN  pFrame
)
{
	pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;

	/* Fixed Fields */
	pFrame->pwAuthAlgorithm = (unsigned short *)
				  (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
				   WLAN_AUTHEN_OFF_AUTH_ALG);
	pFrame->pwAuthSequence = (unsigned short *)
				 (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
				  WLAN_AUTHEN_OFF_AUTH_SEQ);
	pFrame->pwStatus = (unsigned short *)
			   (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
			    WLAN_AUTHEN_OFF_STATUS);
	pFrame->len = WLAN_HDR_ADDR3_LEN + WLAN_AUTHEN_OFF_STATUS +
		      sizeof(*(pFrame->pwStatus));

	return;
}

/*+
 *
 * Routine Description:
 *   Decode Authentication
 *
 *
 * Return Value:
 *    None.
 *
 -*/

void
vMgrDecodeAuthen(
	PWLAN_FR_AUTHEN  pFrame
)
{
	PWLAN_IE    pItem;

	pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;

	/* Fixed Fields */
	pFrame->pwAuthAlgorithm = (unsigned short *)
				  (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
				   WLAN_AUTHEN_OFF_AUTH_ALG);
	pFrame->pwAuthSequence = (unsigned short *)
				 (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
				  WLAN_AUTHEN_OFF_AUTH_SEQ);
	pFrame->pwStatus = (unsigned short *)
			   (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
			    WLAN_AUTHEN_OFF_STATUS);

	/* Information elements */
	pItem = (PWLAN_IE)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
			   + WLAN_AUTHEN_OFF_CHALLENGE);

	if (((unsigned char *)pItem) < (pFrame->pBuf + pFrame->len) &&
	    pItem->byElementID == WLAN_EID_CHALLENGE)
		pFrame->pChallenge = (PWLAN_IE_CHALLENGE)pItem;

	return;
}

/*+
 *
 * Routine Description:
 *   Encode Authentication
 *
 *
 * Return Value:
 *    None.
 *
 -*/

void
vMgrEncodeDeauthen(
	PWLAN_FR_DEAUTHEN  pFrame
)
{
	pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;

	/* Fixed Fields */
	pFrame->pwReason = (unsigned short *)
			   (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
			    WLAN_DEAUTHEN_OFF_REASON);
	pFrame->len = WLAN_HDR_ADDR3_LEN + WLAN_DEAUTHEN_OFF_REASON +
		      sizeof(*(pFrame->pwReason));

	return;
}

/*+
 *
 * Routine Description:
 *   Decode Deauthentication
 *
 *
 * Return Value:
 *    None.
 *
 -*/

void
vMgrDecodeDeauthen(
	PWLAN_FR_DEAUTHEN  pFrame
)
{
	pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;

	/* Fixed Fields */
	pFrame->pwReason = (unsigned short *)
			   (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
			    WLAN_DEAUTHEN_OFF_REASON);

	return;
}

/*+
 *
 * Routine Description: (AP)
 *   Encode Reassociation Response
 *
 *
 * Return Value:
 *    None.
 *
 -*/

void
vMgrEncodeReassocResponse(
	PWLAN_FR_REASSOCRESP  pFrame
)
{
	pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;

	/* Fixed Fields */
	pFrame->pwCapInfo = (unsigned short *)
			    (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
			     WLAN_REASSOCRESP_OFF_CAP_INFO);
	pFrame->pwStatus = (unsigned short *)
			   (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
			    WLAN_REASSOCRESP_OFF_STATUS);
	pFrame->pwAid = (unsigned short *)
			(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
			 WLAN_REASSOCRESP_OFF_AID);

	pFrame->len = WLAN_HDR_ADDR3_LEN + WLAN_REASSOCRESP_OFF_AID +
		      sizeof(*(pFrame->pwAid));

	return;
}

/*+
 *
 * Routine Description:
 *   Decode Reassociation Response
 *
 *
 * Return Value:
 *    None.
 *
 -*/

void
vMgrDecodeReassocResponse(
	PWLAN_FR_REASSOCRESP  pFrame
)
{
	PWLAN_IE   pItem;

	pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;

	/* Fixed Fields */
	pFrame->pwCapInfo = (unsigned short *)
			    (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
			     WLAN_REASSOCRESP_OFF_CAP_INFO);
	pFrame->pwStatus = (unsigned short *)
			   (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
			    WLAN_REASSOCRESP_OFF_STATUS);
	pFrame->pwAid = (unsigned short *)
			(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
			 WLAN_REASSOCRESP_OFF_AID);

	/* Information elements */
	pFrame->pSuppRates = (PWLAN_IE_SUPP_RATES)
			     (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
			      WLAN_REASSOCRESP_OFF_SUPP_RATES);

	pItem = (PWLAN_IE)(pFrame->pSuppRates);
	pItem = (PWLAN_IE)(((unsigned char *)pItem) + 2 + pItem->len);

	if ((((unsigned char *)pItem) < (pFrame->pBuf + pFrame->len)) &&
	    (pItem->byElementID == WLAN_EID_EXTSUPP_RATES)) {
		pFrame->pExtSuppRates = (PWLAN_IE_SUPP_RATES)pItem;
	}
	return;
}