rtl8723cs/include/rtw_wapi.h
2017-01-30 21:28:09 +01:00

223 lines
5.7 KiB
C

#ifndef __INC_WAPI_H
#define __INC_WAPI_H
#define CONFIG_WAPI_SW_SMS4
#define WAPI_DEBUG
#define SMS4_MIC_LEN 16
#define WAPI_EXT_LEN 18
#define MAX_WAPI_IE_LEN 256
#define sMacHdrLng 24 // octets in data header, no WEP
#ifdef WAPI_DEBUG
/* WAPI trace debug */
extern u32 wapi_debug_component;
static inline void dump_buf(u8 *buf, u32 len)
{
u32 i;
printk("-----------------Len %d----------------\n", len);
for(i=0; i<len; i++)
printk("%2.2x-", *(buf+i));
printk("\n");
}
#define WAPI_TRACE(component, x, args...) \
do { if(wapi_debug_component & (component)) \
printk(KERN_DEBUG "WAPI" ":" x "" , \
##args);\
}while(0);
#define WAPI_DATA(component, x, buf, len) \
do { if(wapi_debug_component & (component)){ \
printk("%s:\n", x);\
dump_buf((buf), (len));}\
}while(0);
#define RT_ASSERT_RET(_Exp) \
if(!(_Exp)) \
{ \
printk("RTWLAN: "); \
printk( "Assertion failed! %s,%s,line=%d\n", \
#_Exp,__FUNCTION__,__LINE__); \
return; \
}
#define RT_ASSERT_RET_VALUE(_Exp,Ret) \
if(!(_Exp)) \
{ \
printk("RTWLAN: "); \
printk( "Assertion failed! %s,%s,line=%d\n", \
#_Exp,__FUNCTION__,__LINE__); \
return (Ret); \
}
#else
#define RT_ASSERT_RET(_Exp) do {} while(0)
#define RT_ASSERT_RET_VALUE(_Exp,Ret) do {} while(0)
#define WAPI_TRACE(component, x, args...) do {} while(0)
#define WAPI_DATA(component, x, buf, len) do {} while(0)
#endif
enum WAPI_DEBUG {
WAPI_INIT = 1,
WAPI_API = 1<<1,
WAPI_TX = 1<<2,
WAPI_RX = 1<<3,
WAPI_MLME = 1<<4,
WAPI_IOCTL = 1<<5,
WAPI_ERR = 1<<31
};
#define WAPI_MAX_BKID_NUM 4
#define WAPI_MAX_STAINFO_NUM 4
#define WAPI_CAM_ENTRY_NUM 14 // 28/2=14
typedef struct _RT_WAPI_BKID
{
struct list_head list;
u8 bkid[16];
}RT_WAPI_BKID,*PRT_WAPI_BKID;
typedef struct _RT_WAPI_KEY
{
u8 dataKey[16];
u8 micKey[16];
u8 keyId;
bool bSet;
bool bTxEnable;
}RT_WAPI_KEY,*PRT_WAPI_KEY;
typedef enum _RT_WAPI_PACKET_TYPE
{
WAPI_NONE = 0,
WAPI_PREAUTHENTICATE=1,
WAPI_STAKEY_REQUEST=2,
WAPI_AUTHENTICATE_ACTIVE=3,
WAPI_ACCESS_AUTHENTICATE_REQUEST=4,
WAPI_ACCESS_AUTHENTICATE_RESPONSE=5,
WAPI_CERTIFICATE_AUTHENTICATE_REQUEST=6,
WAPI_CERTIFICATE_AUTHENTICATE_RESPONSE=7,
WAPI_USK_REQUEST=8,
WAPI_USK_RESPONSE=9,
WAPI_USK_CONFIRM=10,
WAPI_MSK_NOTIFICATION=11,
WAPI_MSK_RESPONSE=12
}RT_WAPI_PACKET_TYPE;
typedef struct _RT_WAPI_STA_INFO
{
struct list_head list;
u8 PeerMacAddr[6];
RT_WAPI_KEY wapiUsk;
RT_WAPI_KEY wapiUskUpdate;
RT_WAPI_KEY wapiMsk;
RT_WAPI_KEY wapiMskUpdate;
u8 lastRxUnicastPN[16];
u8 lastTxUnicastPN[16];
u8 lastRxMulticastPN[16];
u8 lastRxUnicastPNBEQueue[16];
u8 lastRxUnicastPNBKQueue[16];
u8 lastRxUnicastPNVIQueue[16];
u8 lastRxUnicastPNVOQueue[16];
bool bSetkeyOk;
bool bAuthenticateInProgress;
bool bAuthenticatorInUpdata;
}RT_WAPI_STA_INFO,*PRT_WAPI_STA_INFO;
//Added for HW wapi en/decryption
typedef struct _RT_WAPI_CAM_ENTRY{
//RT_LIST_ENTRY list;
u8 IsUsed;
u8 entry_idx;//for cam entry
u8 keyidx; // 0 or 1,new or old key
u8 PeerMacAddr[6];
u8 type; //should be 110,wapi
}RT_WAPI_CAM_ENTRY,*PRT_WAPI_CAM_ENTRY;
typedef struct _RT_WAPI_T
{
//BKID
RT_WAPI_BKID wapiBKID[WAPI_MAX_BKID_NUM];
struct list_head wapiBKIDIdleList;
struct list_head wapiBKIDStoreList;
//Key for Tx Multicast/Broadcast
RT_WAPI_KEY wapiTxMsk;
//sec related
u8 lastTxMulticastPN[16];
//STA list
RT_WAPI_STA_INFO wapiSta[WAPI_MAX_STAINFO_NUM];
struct list_head wapiSTAIdleList;
struct list_head wapiSTAUsedList;
//
bool bWapiEnable;
//store WAPI IE
u8 wapiIE[256];
u8 wapiIELength;
bool bWapiPSK;
//last sequece number for wai packet
u16 wapiSeqnumAndFragNum;
int extra_prefix_len;
int extra_postfix_len;
RT_WAPI_CAM_ENTRY wapiCamEntry[WAPI_CAM_ENTRY_NUM];
}RT_WAPI_T,*PRT_WAPI_T;
typedef struct _WLAN_HEADER_WAPI_EXTENSION
{
u8 KeyIdx;
u8 Reserved;
u8 PN[16];
} WLAN_HEADER_WAPI_EXTENSION, *PWLAN_HEADER_WAPI_EXTENSION;
u32 WapiComparePN(u8 *PN1, u8 *PN2);
void rtw_wapi_init(_adapter *padapter);
void rtw_wapi_free(_adapter *padapter);
void rtw_wapi_disable_tx(_adapter *padapter);
u8 rtw_wapi_is_wai_packet(_adapter* padapter,u8 *pkt_data);
void rtw_wapi_update_info(_adapter *padapter, union recv_frame *precv_frame);
u8 rtw_wapi_check_for_drop(_adapter *padapter, union recv_frame *precv_frame);
void rtw_build_probe_resp_wapi_ie(_adapter *padapter, unsigned char *pframe, struct pkt_attrib *pattrib);
void rtw_build_beacon_wapi_ie(_adapter *padapter, unsigned char *pframe, struct pkt_attrib *pattrib);
void rtw_build_assoc_req_wapi_ie(_adapter *padapter, unsigned char *pframe, struct pkt_attrib *pattrib);
void rtw_wapi_on_assoc_ok(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE);
void rtw_wapi_return_one_sta_info(_adapter *padapter, u8 *MacAddr);
void rtw_wapi_return_all_sta_info(_adapter *padapter);
void rtw_wapi_clear_cam_entry(_adapter *padapter, u8 *pMacAddr);
void rtw_wapi_clear_all_cam_entry(_adapter *padapter);
void rtw_wapi_set_key(_adapter *padapter, RT_WAPI_KEY *pWapiKey, RT_WAPI_STA_INFO *pWapiSta, u8 bGroupKey, u8 bUseDefaultKey);
int rtw_wapi_create_event_send(_adapter *padapter, u8 EventId, u8 *MacAddr, u8 *Buff, u16 BufLen);
u32 rtw_sms4_encrypt(_adapter *padapter, u8 *pxmitframe);
u32 rtw_sms4_decrypt(_adapter *padapter, u8 *precvframe);
void rtw_wapi_get_iv(_adapter *padapter, u8*pRA, u8*IV);
u8 WapiIncreasePN(u8 *PN, u8 AddCount);
bool rtw_wapi_drop_for_key_absent(_adapter *padapter,u8 *pRA);
#endif