blob: c3b2c67a4bdc2ae49609beac1112e5b864ce870b [file] [log] [blame]
/** @file mlanevent.h
*
* @brief Header file for mlanevent application
*
* Copyright (C) 2008-2017, Marvell International Ltd.
*
* This software file (the "File") is distributed by Marvell International
* Ltd. under the terms of the GNU General Public License Version 2, June 1991
* (the "License"). You may use, redistribute and/or modify this File in
* accordance with the terms and conditions of the License, a copy of which
* is available along with the File in the gpl.txt file or by writing to
* the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
* 02111-1307 or on the worldwide web at http://www.gnu.org/licenses/gpl.txt.
*
* THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE
* IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE
* ARE EXPRESSLY DISCLAIMED. The License provides additional details about
* this warranty disclaimer.
*
*/
/************************************************************************
Change log:
03/18/08: Initial creation
************************************************************************/
#ifndef _MLAN_EVENT_H
#define _MLAN_EVENT_H
/** Character, 1 byte */
typedef signed char t_s8;
/** Unsigned character, 1 byte */
typedef unsigned char t_u8;
/** Short integer */
typedef signed short t_s16;
/** Unsigned short integer */
typedef unsigned short t_u16;
/** Integer */
typedef signed int t_s32;
/** Unsigned integer */
typedef unsigned int t_u32;
/** Long long integer */
typedef long long t_s64;
/** Unsigned long long integer */
typedef unsigned long long t_u64;
#if (BYTE_ORDER == LITTLE_ENDIAN)
#undef BIG_ENDIAN_SUPPORT
#endif
/** 16 bits byte swap */
#define swap_byte_16(x) \
((t_u16)((((t_u16)(x) & 0x00ffU) << 8) | \
(((t_u16)(x) & 0xff00U) >> 8)))
/** 32 bits byte swap */
#define swap_byte_32(x) \
((t_u32)((((t_u32)(x) & 0x000000ffUL) << 24) | \
(((t_u32)(x) & 0x0000ff00UL) << 8) | \
(((t_u32)(x) & 0x00ff0000UL) >> 8) | \
(((t_u32)(x) & 0xff000000UL) >> 24)))
/** 64 bits byte swap */
#define swap_byte_64(x) \
((t_u64)((t_u64)(((t_u64)(x) & 0x00000000000000ffULL) << 56) | \
(t_u64)(((t_u64)(x) & 0x000000000000ff00ULL) << 40) | \
(t_u64)(((t_u64)(x) & 0x0000000000ff0000ULL) << 24) | \
(t_u64)(((t_u64)(x) & 0x00000000ff000000ULL) << 8) | \
(t_u64)(((t_u64)(x) & 0x000000ff00000000ULL) >> 8) | \
(t_u64)(((t_u64)(x) & 0x0000ff0000000000ULL) >> 24) | \
(t_u64)(((t_u64)(x) & 0x00ff000000000000ULL) >> 40) | \
(t_u64)(((t_u64)(x) & 0xff00000000000000ULL) >> 56) ))
#ifdef BIG_ENDIAN_SUPPORT
/** Convert from 16 bit little endian format to CPU format */
#define uap_le16_to_cpu(x) swap_byte_16(x)
/** Convert from 32 bit little endian format to CPU format */
#define uap_le32_to_cpu(x) swap_byte_32(x)
/** Convert from 64 bit little endian format to CPU format */
#define uap_le64_to_cpu(x) swap_byte_64(x)
/** Convert to 16 bit little endian format from CPU format */
#define uap_cpu_to_le16(x) swap_byte_16(x)
/** Convert to 32 bit little endian format from CPU format */
#define uap_cpu_to_le32(x) swap_byte_32(x)
/** Convert to 64 bit little endian format from CPU format */
#define uap_cpu_to_le64(x) swap_byte_64(x)
#else /* BIG_ENDIAN_SUPPORT */
/** Do nothing */
#define uap_le16_to_cpu(x) x
/** Do nothing */
#define uap_le32_to_cpu(x) x
/** Do nothing */
#define uap_le64_to_cpu(x) x
/** Do nothing */
#define uap_cpu_to_le16(x) x
/** Do nothing */
#define uap_cpu_to_le32(x) x
/** Do nothing */
#define uap_cpu_to_le64(x) x
#endif /* BIG_ENDIAN_SUPPORT */
/** Convert WPS TLV header from network to host order */
#define endian_convert_tlv_wps_header_in(t,l) \
{ \
(t) = ntohs(t); \
(l) = ntohs(l); \
}
/**
* Hex or Decimal to Integer
* @param num string to convert into decimal or hex
*/
#define A2HEXDECIMAL(num) \
(strncasecmp("0x", (num), 2)?(unsigned int) strtoll((num),NULL,0):a2hex((num)))\
/**
* Check of decimal or hex string
* @param num string
*/
#define IS_HEX_OR_DIGIT(num) \
(strncasecmp("0x", (num), 2)?ISDIGIT((num)):ishexstring((num)))\
/** MLan Event application version string */
#define MLAN_EVENT_VERSION "MlanEvent 2.0"
/** Failure */
#define MLAN_EVENT_FAILURE -1
#ifdef __GNUC__
/** Structure packing begins */
#define PACK_START
/** Structure packeing end */
#define PACK_END __attribute__ ((packed))
#else
/** Structure packing begins */
#define PACK_START __packed
/** Structure packeing end */
#define PACK_END
#endif
#ifndef ETH_ALEN
/** MAC address length */
#define ETH_ALEN 6
#endif
/** Netlink protocol number */
#define NETLINK_MARVELL (MAX_LINKS - 1)
/** Netlink maximum payload size */
#define NL_MAX_PAYLOAD 1024
/** Netlink multicast group number */
#define NL_MULTICAST_GROUP 1
/** Default wait time in seconds for events */
#define UAP_RECV_WAIT_DEFAULT 10
/** Maximum number of devices */
#define MAX_NO_OF_DEVICES 4
#ifndef NLMSG_HDRLEN
/** NL message header length */
#define NLMSG_HDRLEN ((int) NLMSG_ALIGN(sizeof(struct nlmsghdr)))
#endif
/** Event ID mask */
#define EVENT_ID_MASK 0xffff
/** BSS number mask */
#define BSS_NUM_MASK 0xf
/** Get BSS number from event cause (bit 23:16) */
#define EVENT_GET_BSS_NUM(event_cause) \
(((event_cause) >> 16) & BSS_NUM_MASK)
/** Invitation Flag mask */
#define INVITATION_FLAG_MASK 0x01
/* Event buffer */
typedef PACK_START struct _evt_buf {
/** Flag to check if event data is present in the buffer or not */
int flag;
/** Event length */
int length;
/** Event data */
t_u8 buffer[NL_MAX_PAYLOAD];
} PACK_END evt_buf;
/** Event header */
typedef PACK_START struct _event_header {
/** Event ID */
t_u32 event_id;
/** Event data */
t_u8 event_data[0];
} PACK_END event_header;
/** Event ID length */
#define EVENT_ID_LEN 4
/** Event ID : WMM status change */
#define MICRO_AP_EV_WMM_STATUS_CHANGE 0x00000017
/** Event ID: STA deauth */
#define MICRO_AP_EV_ID_STA_DEAUTH 0x0000002c
/** Event ID: STA associated */
#define MICRO_AP_EV_ID_STA_ASSOC 0x0000002d
/** Event ID: BSS started */
#define MICRO_AP_EV_ID_BSS_START 0x0000002e
/** Event ID: Debug event */
#define MICRO_AP_EV_ID_DEBUG 0x00000036
/** Event ID: BSS idle event */
#define MICRO_AP_EV_BSS_IDLE 0x00000043
/** Event ID: BSS active event */
#define MICRO_AP_EV_BSS_ACTIVE 0x00000044
/** Event ID: WEP ICV error */
#define EVENT_WEP_ICV_ERROR 0x00000046
#ifdef WIFI_DIRECT_SUPPORT
/** Event ID: UAP,STA wifidirect generic event */
#define EVENT_WIFIDIRECT_GENERIC 0x00000049
/** Event ID: UAP,STA wifidirect service discovery event */
#define EVENT_WIFIDIRECT_SERVICE_DISCOVERY 0x0000004a
#endif
/** Event ID: RSN Connect event */
#define MICRO_AP_EV_RSN_CONNECT 0x00000051
/** Event ID: TDLS generic event */
#define EVENT_TDLS_GENERIC 0x00000052
/** event type for tdls setup failure */
#define TDLS_EVENT_TYPE_SETUP_FAILURE 1
/** event type for tdls setup request received */
#define TDLS_EVENT_TYPE_SETUP_REQ_RCVD 2
/** event type for tdls link torn down */
#define TDLS_EVENT_TYPE_LINK_TORN_DOWN 3
/** event type for tdls link established */
#define TDLS_EVENT_TYPE_LINK_ESTABLISHED 4
/** event type for tdls debug */
#define TDLS_EVENT_TYPE_DEBUG 5
/** event type for tdls packet */
#define TDLS_EVENT_TYPE_PACKET 6
/** event type for channel switch result */
#define TDLS_EVENT_TYPE_CHAN_SWITCH_RESULT 7
/** event type for start channel switch */
#define TDLS_EVENT_TYPE_START_CHAN_SWITCH 8
/** event type for stop channel switch */
#define TDLS_EVENT_TYPE_CHAN_SWITCH_STOPPED 9
/** Event ID: Radar Detected */
#define EVENT_RADAR_DETECTED 0x00000053
/** Event ID: Channel Report Ready */
#define EVENT_CHANNEL_REPORT_RDY 0x00000054
/** Event ID: NLIST REPORT */
#define EVENT_NLIST_REPORT 0x00000079
/** NLIST_REPORT TLV */
#define MRVL_NEIGHBOR_REPORT_TLV_ID 0x1de
/** HS WAKE UP event id */
#define UAP_EVENT_ID_HS_WAKEUP 0x80000001
/** HS_ACTIVATED event id */
#define UAP_EVENT_ID_DRV_HS_ACTIVATED 0x80000002
/** HS DEACTIVATED event id */
#define UAP_EVENT_ID_DRV_HS_DEACTIVATED 0x80000003
/** HOST SLEEP AWAKE event id in legacy PS*/
#define UAP_EVENT_HOST_SLEEP_AWAKE 0x00000012
/** HS WAKE UP event id */
#define UAP_EVENT_ID_DRV_MGMT_FRAME 0x80000005
/** SCAN REPORT Event id */
#define EVENT_ID_DRV_SCAN_REPORT 0x80000009
/** WPA IE Tag */
#define IEEE_WPA_IE 221
/** RSN IE Tag */
#define IEEE_RSN_IE 48
/** TLV ID : WAPI Information */
#define MRVL_WAPI_INFO_TLV_ID 0x0167
/** TLV ID : Management Frame */
#define MRVL_MGMT_FRAME_TLV_ID 0x0168
/** TLV Id : Channel Config */
#define MRVL_CHANNELCONFIG_TLV_ID 0x012a
/** Assoc Request */
#define SUBTYPE_ASSOC_REQUEST 0
/** Assoc Response */
#define SUBTYPE_ASSOC_RESPONSE 1
/** ReAssoc Request */
#define SUBTYPE_REASSOC_REQUEST 2
/** ReAssoc Response */
#define SUBTYPE_REASSOC_RESPONSE 3
/** WEP key user input length */
#define WEP_KEY_USER_INPUT 13
/** TLV buffer header*/
typedef PACK_START struct _tlvbuf_header {
/** Header type */
t_u16 type;
/** Header length */
t_u16 len;
} PACK_END tlvbuf_header;
/** Event body : STA deauth */
typedef PACK_START struct _eventbuf_sta_deauth {
/** Deauthentication reason */
t_u16 reason_code;
/** MAC address of deauthenticated STA */
t_u8 sta_mac_address[ETH_ALEN];
} PACK_END eventbuf_sta_deauth;
/** Event body : WEP ICV error */
typedef PACK_START struct _eventbuf_wep_icv_error {
/** Deauthentication reason */
t_u16 reason_code;
/** MAC address of deauthenticated STA */
t_u8 sta_mac_address[ETH_ALEN];
/** WEP key index */
t_u8 wep_key_index;
/** WEP key length */
t_u8 wep_key_length;
/** WEP key */
t_u8 wep_key[WEP_KEY_USER_INPUT];
} PACK_END eventbuf_wep_icv_error;
/** Event body : STA associated */
typedef PACK_START struct _eventbuf_sta_assoc {
/** Reserved */
t_u8 reserved[2];
/** MAC address of associated STA */
t_u8 sta_mac_address[ETH_ALEN];
/** Assoc request/response buffer */
t_u8 assoc_payload[0];
} PACK_END eventbuf_sta_assoc;
/** Event body : RSN Connect */
typedef PACK_START struct _eventbuf_rsn_connect {
/** Reserved */
t_u8 reserved[2];
/** MAC address of Station */
t_u8 sta_mac_address[ETH_ALEN];
/** WPA/WPA2 TLV IEs */
t_u8 tlv_list[0];
} PACK_END eventbuf_rsn_connect;
/** Event body : BSS started */
typedef PACK_START struct _eventbuf_bss_start {
/** Reserved */
t_u8 reserved[2];
/** MAC address of BSS */
t_u8 ap_mac_address[ETH_ALEN];
} PACK_END eventbuf_bss_start;
/**
* IEEE 802.11 MAC Message Data Structures
*
* Each IEEE 802.11 MAC message includes a MAC header, a frame body (which
* can be empty), and a frame check sequence field. This section gives the
* structures that used for the MAC message headers and frame bodies that
* can exist in the three types of MAC messages - 1) Control messages,
* 2) Data messages, and 3) Management messages.
*/
#ifdef BIG_ENDIAN_SUPPORT
typedef PACK_START struct _IEEEtypes_FrameCtl_t {
/** Order */
t_u8 order:1;
/** Wep */
t_u8 wep:1;
/** More Data */
t_u8 more_data:1;
/** Power Mgmt */
t_u8 pwr_mgmt:1;
/** Retry */
t_u8 retry:1;
/** More Frag */
t_u8 more_frag:1;
/** From DS */
t_u8 from_ds:1;
/** To DS */
t_u8 to_ds:1;
/** Sub Type */
t_u8 sub_type:4;
/** Type */
t_u8 type:2;
/** Protocol Version */
t_u8 protocol_version:2;
} PACK_END IEEEtypes_FrameCtl_t;
#else
typedef PACK_START struct _IEEEtypes_FrameCtl_t {
/** Protocol Version */
t_u8 protocol_version:2;
/** Type */
t_u8 type:2;
/** Sub Type */
t_u8 sub_type:4;
/** To DS */
t_u8 to_ds:1;
/** From DS */
t_u8 from_ds:1;
/** More Frag */
t_u8 more_frag:1;
/** Retry */
t_u8 retry:1;
/** Power Mgmt */
t_u8 pwr_mgmt:1;
/** More Data */
t_u8 more_data:1;
/** Wep */
t_u8 wep:1;
/** Order */
t_u8 order:1;
} PACK_END IEEEtypes_FrameCtl_t;
#endif
/** IEEEtypes_AssocRqst_t */
typedef PACK_START struct _IEEEtypes_AssocRqst_t {
/** Capability Info */
t_u16 cap_info;
/** Listen Interval */
t_u16 listen_interval;
/** IE Buffer */
t_u8 ie_buffer[0];
} PACK_END IEEEtypes_AssocRqst_t;
/** IEEEtypes_AssocRsp_t */
typedef PACK_START struct _IEEEtypes_AssocRsp_t {
/** Capability Info */
t_u16 cap_info;
/** Status Code */
t_u16 status_code;
/** AID */
t_u16 aid;
} PACK_END IEEEtypes_AssocRsp_t;
/** IEEEtypes_ReAssocRqst_t */
typedef PACK_START struct _IEEEtypes_ReAssocRqst_t {
/** Capability Info */
t_u16 cap_info;
/** Listen Interval */
t_u16 listen_interval;
/** Current AP Address */
t_u8 current_ap_addr[ETH_ALEN];
/** IE Buffer */
t_u8 ie_buffer[0];
} PACK_END IEEEtypes_ReAssocRqst_t;
/** channel band */
enum {
BAND_2GHZ = 0,
BAND_5GHZ = 1,
BAND_4GHZ = 2,
};
/** channel offset */
enum {
SEC_CHAN_NONE = 0,
SEC_CHAN_ABOVE = 1,
SEC_CHAN_5MHZ = 2,
SEC_CHAN_BELOW = 3
};
/** channel bandwidth */
enum {
CHAN_BW_20MHZ = 0,
CHAN_BW_10MHZ,
CHAN_BW_40MHZ,
CHAN_BW_80MHZ,
};
/** scan mode */
enum {
SCAN_MODE_MANUAL = 0,
SCAN_MODE_ACS,
SCAN_MODE_USER,
};
/** Band_Config_t */
typedef PACK_START struct _Band_Config_t {
#ifdef BIG_ENDIAN_SUPPORT
/** Channel Selection Mode - (00)=manual, (01)=ACS, (02)=user*/
t_u8 scanMode:2;
/** Secondary Channel Offset - (00)=None, (01)=Above, (11)=Below */
t_u8 chan2Offset:2;
/** Channel Width - (00)=20MHz, (10)=40MHz, (11)=80MHz */
t_u8 chanWidth:2;
/** Band Info - (00)=2.4GHz, (01)=5GHz */
t_u8 chanBand:2;
#else
/** Band Info - (00)=2.4GHz, (01)=5GHz */
t_u8 chanBand:2;
/** Channel Width - (00)=20MHz, (10)=40MHz, (11)=80MHz */
t_u8 chanWidth:2;
/** Secondary Channel Offset - (00)=None, (01)=Above, (11)=Below */
t_u8 chan2Offset:2;
/** Channel Selection Mode - (00)=manual, (01)=ACS, (02)=Adoption mode*/
t_u8 scanMode:2;
#endif
} PACK_END Band_Config_t;
/** TLV buffer : Channel Config */
typedef PACK_START struct _tlvbuf_channel_config {
/** Type */
t_u16 type;
/** Length */
t_u16 len;
/** Band Configuration */
Band_Config_t bandcfg;
/** Channel number */
t_u8 chan_number;
} PACK_END tlvbuf_channel_config;
/** MrvlIEtypes_WapiInfoSet_t */
typedef PACK_START struct _MrvlIEtypes_WapiInfoSet_t {
/** Type */
t_u16 type;
/** Length */
t_u16 len;
/** Multicast PN */
t_u8 multicast_PN[16];
} PACK_END MrvlIEtypes_WapiInfoSet_t;
/** MrvlIETypes_MgmtFrameSet_t */
typedef PACK_START struct _MrvlIETypes_MgmtFrameSet_t {
/** Type */
t_u16 type;
/** Length */
t_u16 len;
/** Frame Control */
IEEEtypes_FrameCtl_t frame_control;
/** Frame Contents */
t_u8 frame_contents[0];
} PACK_END MrvlIETypes_MgmtFrameSet_t;
/** Debug Type : Event */
#define DEBUG_TYPE_EVENT 0
/** Debug Type : Info */
#define DEBUG_TYPE_INFO 1
/** Major debug id: Authenticator */
#define DEBUG_ID_MAJ_AUTHENTICATOR 1
/** Minor debug id: PWK1 */
#define DEBUG_MAJ_AUTH_MIN_PWK1 0
/** Minor debug id: PWK2 */
#define DEBUG_MAJ_AUTH_MIN_PWK2 1
/** Minor debug id: PWK3 */
#define DEBUG_MAJ_AUTH_MIN_PWK3 2
/** Minor debug id: PWK4 */
#define DEBUG_MAJ_AUTH_MIN_PWK4 3
/** Minor debug id: GWK1 */
#define DEBUG_MAJ_AUTH_MIN_GWK1 4
/** Minor debug id: GWK2 */
#define DEBUG_MAJ_AUTH_MIN_GWK2 5
/** Minor debug id: station reject */
#define DEBUG_MAJ_AUTH_MIN_STA_REJ 6
/** Minor debug id: EAPOL_TR */
#define DEBUG_MAJ_AUTH_MIN_EAPOL_TR 7
/** Major debug id: Assoicate agent */
#define DEBUG_ID_MAJ_ASSOC_AGENT 2
/** Minor debug id: WPA IE*/
#define DEBUG_ID_MAJ_ASSOC_MIN_WPA_IE 0
/** Minor debug id: station reject */
#define DEBUG_ID_MAJ_ASSOC_MIN_STA_REJ 1
/** ether_hdr */
typedef PACK_START struct {
/** Dest address */
t_u8 da[ETH_ALEN];
/** Src address */
t_u8 sa[ETH_ALEN];
/** Header type */
t_u16 type;
} PACK_END ether_hdr_t;
/** 8021x header */
typedef PACK_START struct {
/** Protocol version*/
t_u8 protocol_ver;
/** Packet type*/
t_u8 pckt_type;
/** Packet len */
t_u8 pckt_body_len;
} PACK_END hdr_8021x_t;
/** Nonce size */
#define NONCE_SIZE 32
/** Max WPA IE len */
#define MAX_WPA_IE_LEN 64
/** EAPOL mic size */
#define EAPOL_MIC_SIZE 16
/** EAPOL key message */
typedef PACK_START struct {
/** Ether header */
ether_hdr_t ether_hdr;
/** 8021x header */
hdr_8021x_t hdr_8021x;
/** desc_type */
t_u8 desc_type;
/** Key info */
t_u16 k;
/** Key length */
t_u16 key_length;
/** Replay count */
t_u32 replay_cnt[2];
/** Key nonce */
t_u8 key_nonce[NONCE_SIZE];
/** Key IV */
t_u8 eapol_key_iv[16];
/** Key RSC */
t_u8 key_rsc[8];
/** Key ID */
t_u8 key_id[8];
/** Key MIC */
t_u8 key_mic[EAPOL_MIC_SIZE];
/** Key len */
t_u16 key_material_len;
/** Key data */
t_u8 key_data[MAX_WPA_IE_LEN];
} PACK_END eapol_keymsg_debug_t;
/** Failure after receive EAPOL MSG2 PMK */
#define REJECT_STATE_FAIL_EAPOL_2 1
/** Failure after receive EAPOL MSG4 PMK*/
#define REJECT_STATE_FAIL_EAPOL_4 2
/** Failure after receive EAPOL Group MSG2 GWK */
#define REJECT_STATE_FAIL_EAPOL_GROUP_2 3
/** Fail reason: Invalid ie */
#define IEEEtypes_REASON_INVALID_IE 13
/** Fail reason: Mic failure */
#define IEEEtypes_REASON_MIC_FAILURE 14
/** Station reject */
typedef PACK_START struct {
/** Reject state */
t_u8 reject_state;
/** Reject reason */
t_u16 reject_reason;
/** Station mac address */
t_u8 sta_mac_addr[ETH_ALEN];
} PACK_END sta_reject_t;
/** wpa_ie */
typedef PACK_START struct {
/** Station mac address */
t_u8 sta_mac_addr[ETH_ALEN];
/** WPA IE */
t_u8 wpa_ie[MAX_WPA_IE_LEN];
} PACK_END wpaie_t;
/** Initial state of the state machine */
#define EAPOL_START 1
/** Sent eapol msg1, wait for msg2 from the client */
#define EAPOL_WAIT_PWK2 2
/** Sent eapol msg3, wait for msg4 from the client */
#define EAPOL_WAIT_PWK4 3
/** Sent eapol group key msg1, wait for group msg2 from the client */
#define EAPOL_WAIT_GTK2 4
/** Eapol handshake complete */
#define EAPOL_END 5
#ifdef WIFI_DIRECT_SUPPORT
/** TLV : WifiDirect status */
#define TLV_TYPE_WIFIDIRECT_STATUS 0x0000
/** TLV : WifiDirect param capability */
#define TLV_TYPE_WIFIDIRECT_CAPABILITY 0x0002
/** TLV : WifiDirect param device Id */
#define TLV_TYPE_WIFIDIRECT_DEVICE_ID 0x0003
/** TLV : WifiDirect param group owner intent */
#define TLV_TYPE_WIFIDIRECT_GROUPOWNER_INTENT 0x0004
/** TLV : WifiDirect param config timeout */
#define TLV_TYPE_WIFIDIRECT_CONFIG_TIMEOUT 0x0005
/** TLV : WifiDirect param channel */
#define TLV_TYPE_WIFIDIRECT_CHANNEL 0x0006
/** TLV : WifiDirect param group bssId */
#define TLV_TYPE_WIFIDIRECT_GROUP_BSS_ID 0x0007
/** TLV : WifiDirect param extended listen time */
#define TLV_TYPE_WIFIDIRECT_EXTENDED_LISTEN_TIME 0x0008
/** TLV : WifiDirect param intended address */
#define TLV_TYPE_WIFIDIRECT_INTENDED_ADDRESS 0x0009
/** TLV : WifiDirect param manageability */
#define TLV_TYPE_WIFIDIRECT_MANAGEABILITY 0x000a
/** TLV : WifiDirect param channel list */
#define TLV_TYPE_WIFIDIRECT_CHANNEL_LIST 0x000b
/** TLV : WifiDirect Notice of Absence */
#define TLV_TYPE_WIFIDIRECT_NOTICE_OF_ABSENCE 0x000c
/** TLV : WifiDirect param device Info */
#define TLV_TYPE_WIFIDIRECT_DEVICE_INFO 0x000d
/** TLV : WifiDirect param Group Info */
#define TLV_TYPE_WIFIDIRECT_GROUP_INFO 0x000e
/** TLV : WifiDirect param group Id */
#define TLV_TYPE_WIFIDIRECT_GROUP_ID 0x000f
/** TLV : WifiDirect param interface */
#define TLV_TYPE_WIFIDIRECT_INTERFACE 0x0010
/** TLV : WifiDirect param operating channel */
#define TLV_TYPE_WIFIDIRECT_OPCHANNEL 0x0011
/** TLV : WifiDirect param invitation flag */
#define TLV_TYPE_WIFIDIRECT_INVITATION_FLAG 0x0012
/** WPS Device Info OUI+Type+SubType Length */
#define WPS_DEVICE_TYPE_LEN 8
/** IE header len */
#define IE_HEADER_LEN 2
/** WIFIDIRECT IE header len */
#define WIFIDIRECT_IE_HEADER_LEN 3
/** OUI Type WIFIDIRECT */
#define WIFIDIRECT_OUI_TYPE 9
/** OUI Type WPS */
#define WIFI_WPS_OUI_TYPE 4
/*
* To handle overlapping WIFIDIRECT IEs
*/
/** IE next byte type */
#define WIFIDIRECT_OVERLAP_TYPE 1
/** IE next byte length */
#define WIFIDIRECT_OVERLAP_LEN 2
/** IE next byte data */
#define WIFIDIRECT_OVERLAP_DATA 3
/** Max payload for IE buffer */
#define WIFI_IE_MAX_PAYLOAD 256
/** Fixed length fields in bonjour payload query data */
#define WIFIDIRECT_DISCOVERY_BONJOUR_FIXED_LEN 5
/** Fixed length fields in uPnP payload query data */
#define WIFIDIRECT_DISCOVERY_UPNP_FIXED_LEN 3
/** Action field for discovery request */
#define WIFIDIRECT_DISCOVERY_REQUEST_ACTION 10
/** Action field for discovery response */
#define WIFIDIRECT_DISCOVERY_RESPONSE_ACTION 11
/** TLV buffer : WifiDirect Status */
typedef PACK_START struct _tlvbuf_wifidirect_status {
/** TLV Header tag */
t_u8 tag;
/** TLV Header length */
t_u16 length;
/** WIFIDIRECT status code */
t_u8 status_code;
} PACK_END tlvbuf_wifidirect_status;
/** TLV buffer : wifidirect IE device Id */
typedef PACK_START struct _tlvbuf_wifidirect_device_id {
/** TLV Header tag */
t_u8 tag;
/** TLV Header length */
t_u16 length;
/** WIFIDIRECT device MAC address */
t_u8 dev_mac_address[ETH_ALEN];
} PACK_END tlvbuf_wifidirect_device_id;
/** TLV buffer : wifidirect IE capability */
typedef PACK_START struct _tlvbuf_wifidirect_capability {
/** TLV Header tag */
t_u8 tag;
/** TLV Header length */
t_u16 length;
/** WIFIDIRECT device capability */
t_u8 dev_capability;
/** WIFIDIRECT group capability */
t_u8 group_capability;
} PACK_END tlvbuf_wifidirect_capability;
/** TLV buffer : wifidirect IE Group owner intent */
typedef PACK_START struct _tlvbuf_wifidirect_group_owner_intent {
/** TLV Header tag */
t_u8 tag;
/** TLV Header length */
t_u16 length;
/** WIFIDIRECT device group owner intent */
t_u8 dev_intent;
} PACK_END tlvbuf_wifidirect_group_owner_intent;
/** TLV buffer : WifiDirect IE Manageability */
typedef PACK_START struct _tlvbuf_wifidirect_manageability {
/** TLV Header tag */
t_u8 tag;
/** TLV Header length */
t_u16 length;
/** WIFIDIRECT Manageability */
t_u8 manageability;
} PACK_END tlvbuf_wifidirect_manageability;
/** TLV buffer : WifiDirect IE Invitation Flag */
typedef PACK_START struct _tlvbuf_wifidirect_invitation_flag {
/** TLV Header tag */
t_u8 tag;
/** TLV Header length */
t_u16 length;
/** WIFIDIRECT Manageability */
t_u8 invitation_flag;
} PACK_END tlvbuf_wifidirect_invitation_flag;
/** TLV buffer : wifidirect IE capability */
typedef PACK_START struct _tlvbuf_wifidirect_channel {
/** TLV Header tag */
t_u8 tag;
/** TLV Header length */
t_u16 length;
/** WIFIDIRECT country string */
t_u8 country_string[3];
/** WIFIDIRECT regulatory class */
t_u8 regulatory_class;
/** WIFIDIRECT channel number */
t_u8 channel_number;
} PACK_END tlvbuf_wifidirect_channel;
/** Channel Entry */
typedef PACK_START struct _chan_entry {
/** WIFIDIRECT regulatory class */
t_u8 regulatory_class;
/** WIFIDIRECT no of channels */
t_u8 num_of_channels;
/** WIFIDIRECT channel number */
t_u8 chan_list[0];
} PACK_END chan_entry;
/** TLV buffer : wifidirect IE channel list */
typedef PACK_START struct _tlvbuf_wifidirect_channel_list {
/** TLV Header tag */
t_u8 tag;
/** TLV Header length */
t_u16 length;
/** WIFIDIRECT country string */
t_u8 country_string[3];
/** WIFIDIRECT channel entries */
chan_entry wifidirect_chan_entry_list[0];
} PACK_END tlvbuf_wifidirect_channel_list;
/** NoA Descriptor */
typedef PACK_START struct _noa_descriptor {
/** WIFIDIRECT count OR type */
t_u8 count_type;
/** WIFIDIRECT duration */
t_u32 duration;
/** WIFIDIRECT interval */
t_u32 interval;
/** WIFIDIRECT start time */
t_u32 start_time;
} PACK_END noa_descriptor;
/** TLV buffer : WifiDirect IE Notice of Absence */
typedef PACK_START struct _tlvbuf_wifidirect_notice_of_absence {
/** TLV Header tag */
t_u8 tag;
/** TLV Header length */
t_u16 length;
/** WIFIDIRECT NoA Index */
t_u8 noa_index;
/** WIFIDIRECT CTWindow and OppPS parameters */
t_u8 ctwindow_opp_ps;
/** WIFIDIRECT NoA Descriptor list */
noa_descriptor wifidirect_noa_descriptor_list[0];
} PACK_END tlvbuf_wifidirect_notice_of_absence;
/** TLV buffer : wifidirect IE device Info */
typedef PACK_START struct _tlvbuf_wifidirect_device_info {
/** TLV Header tag */
t_u8 tag;
/** TLV Header length */
t_u16 length;
/** WIFIDIRECT device address */
t_u8 dev_address[ETH_ALEN];
/** WPS config methods */
t_u16 config_methods;
/** Primary device type : category */
t_u16 primary_category;
/** Primary device type : OUI */
t_u8 primary_oui[4];
/** Primary device type : sub-category */
t_u16 primary_subcategory;
/** Secondary Device Count */
t_u8 secondary_dev_count;
/** Secondary Device Info */
t_u8 secondary_dev_info[0];
/** WPS Device Name Tag */
t_u16 device_name_type;
/** WPS Device Name Length */
t_u16 device_name_len;
/** Device name */
t_u8 device_name[0];
} PACK_END tlvbuf_wifidirect_device_info;
typedef PACK_START struct _wifidirect_client_dev_info {
/** Length of each device */
t_u8 dev_length;
/** WIFIDIRECT device address */
t_u8 wifidirect_dev_address[ETH_ALEN];
/** WIFIDIRECT Interface address */
t_u8 wifidirect_intf_address[ETH_ALEN];
/** WIFIDIRECT Device capability*/
t_u8 wifidirect_dev_capability;
/** WPS config methods */
t_u16 config_methods;
/** Primary device type : category */
t_u16 primary_category;
/** Primary device type : OUI */
t_u8 primary_oui[4];
/** Primary device type : sub-category */
t_u16 primary_subcategory;
/** Secondary Device Count */
t_u8 wifidirect_secondary_dev_count;
/** Secondary Device Info */
t_u8 wifidirect_secondary_dev_info[0];
/** WPS WIFIDIRECT Device Name Tag */
t_u16 wifidirect_device_name_type;
/** WPS WIFIDIRECT Device Name Length */
t_u16 wifidirect_device_name_len;
/** WIFIDIRECT Device name */
t_u8 wifidirect_device_name[0];
} PACK_END wifidirect_client_dev_info;
typedef PACK_START struct _tlvbuf_wifidirect_group_info {
/** TLV Header tag */
t_u8 tag;
/** TLV Header length */
t_u16 length;
/** Secondary Device Info */
t_u8 wifidirect_client_dev_list[0];
} PACK_END tlvbuf_wifidirect_group_info;
/** TLV buffer : wifidirect IE group Id */
typedef PACK_START struct _tlvbuf_wifidirect_group_id {
/** TLV Header tag */
t_u8 tag;
/** TLV Header length */
t_u16 length;
/** WIFIDIRECT group MAC address */
t_u8 group_address[ETH_ALEN];
/** WIFIDIRECT group SSID */
t_u8 group_ssid[0];
} PACK_END tlvbuf_wifidirect_group_id;
/** TLV buffer : wifidirect IE group BSS Id */
typedef PACK_START struct _tlvbuf_wifidirect_group_bss_id {
/** TLV Header tag */
t_u8 tag;
/** TLV Header length */
t_u16 length;
/** WIFIDIRECT group Bss Id */
t_u8 group_bssid[ETH_ALEN];
} PACK_END tlvbuf_wifidirect_group_bss_id;
/** TLV buffer : wifidirect IE Interface */
typedef PACK_START struct _tlvbuf_wifidirect_interface {
/** TLV Header tag */
t_u8 tag;
/** TLV Header length */
t_u16 length;
/** WIFIDIRECT interface Id */
t_u8 interface_id[ETH_ALEN];
/** WIFIDIRECT interface count */
t_u8 interface_count;
/** WIFIDIRECT interface addresslist */
t_u8 interface_idlist[0];
} PACK_END tlvbuf_wifidirect_interface;
/** TLV buffer : WifiDirect configuration timeout */
typedef PACK_START struct _tlvbuf_wifidirect_config_timeout {
/** TLV Header tag */
t_u8 tag;
/** TLV Header length */
t_u16 length;
/** Group configuration timeout */
t_u8 group_config_timeout;
/** Device configuration timeout */
t_u8 device_config_timeout;
} PACK_END tlvbuf_wifidirect_config_timeout;
/** TLV buffer : WifiDirect extended listen time */
typedef PACK_START struct _tlvbuf_wifidirect_ext_listen_time {
/** TLV Header tag */
t_u8 tag;
/** TLV Header length */
t_u16 length;
/** Availability period */
t_u16 availability_period;
/** Availability interval */
t_u16 availability_interval;
} PACK_END tlvbuf_wifidirect_ext_listen_time;
/** TLV buffer : WifiDirect Intended Interface Address */
typedef PACK_START struct _tlvbuf_wifidirect_intended_addr {
/** TLV Header tag */
t_u8 tag;
/** TLV Header length */
t_u16 length;
/** WIFIDIRECT Group interface address */
t_u8 group_address[ETH_ALEN];
} PACK_END tlvbuf_wifidirect_intended_addr;
/** TLV buffer : Wifi WPS IE */
typedef PACK_START struct _tlvbuf_wifi_wps_ie {
/** TLV Header tag */
t_u16 tag;
/** TLV Header length */
t_u16 length;
/** WIFI WPS IE data */
t_u8 data[0];
} PACK_END tlvbuf_wps_ie;
/** WifiDirect IE Header */
typedef PACK_START struct _wifidirect_ie_header {
/** Element ID */
t_u8 element_id;
/** IE Length */
t_u8 ie_length;
/** OUI */
t_u8 oui[3];
/** OUI type */
t_u8 oui_type;
/** IE List of TLV */
t_u8 ie_list[0];
} PACK_END wifidirect_ie_header;
/** Event : WifiDirect Generic event */
typedef PACK_START struct _apeventbuf_wifidirect_generic {
/** Event Length */
t_u16 event_length;
/** Event Type */
t_u16 event_type;
/** Event SubType */
t_u16 event_sub_type;
/** Peer mac address */
t_u8 peer_mac_addr[ETH_ALEN];
/** IE List of TLV */
t_u8 entire_ie_list[0];
} PACK_END apeventbuf_wifidirect_generic;
/** Internal WIFIDIRECT structure for Query Data */
typedef PACK_START struct wifidirect_query_data {
union {
PACK_START struct upnp_specific_query {
/** version field */
t_u8 version;
/** value */
t_u8 value[0];
} PACK_END upnp;
PACK_START struct bonjour_specific_query {
/** DNS name */
t_u8 dns[0];
/** DNS type */
t_u8 dns_type;
/** version field */
t_u8 version;
} PACK_END bonjour;
} u;
} PACK_END wifidirect_query_data;
/** Internal WIFIDIRECT structure for Response Data */
typedef PACK_START struct wifidirect_Response_data {
union {
PACK_START struct upnp_specific_response {
/** version field */
t_u8 version;
/** value */
t_u8 value[0];
} PACK_END upnp;
PACK_START struct bonjour_specific_response {
/** DNS name */
t_u8 dns[0];
/** DNS type */
t_u8 dns_type;
/** version field */
t_u8 version;
/** DNS name */
t_u8 record[0];
} PACK_END bonjour;
} u;
} PACK_END wifidirect_response_data;
/** Event : Service Discovery request */
typedef PACK_START struct _apeventbuf_wifidirect_discovery_request {
/** Peer mac address */
t_u8 peer_mac_addr[ETH_ALEN];
/** Category */
t_u8 category;
/** Action */
t_u8 action;
/** Dialog taken */
t_u8 dialog_taken;
/** Advertize protocol IE */
t_u8 advertize_protocol_ie[4];
/** Query request Length */
t_u16 query_len;
/** Information identifier */
t_u8 info_id[2];
/** Request Length */
t_u16 request_len;
/** OUI */
t_u8 oui[3];
/** OUI sub type */
t_u8 oui_sub_type;
/** Service update indicator */
t_u16 service_update_indicator;
/** Vendor Length */
t_u16 vendor_len;
/** Service protocol */
t_u8 service_protocol;
/** Service transaction Id */
t_u8 service_transaction_id;
/** Query Data */
wifidirect_query_data disc_query;
} PACK_END apeventbuf_wifidirect_discovery_request;
/** HostCmd_CMD_WIFIDIRECT_SERVICE_DISCOVERY response */
typedef PACK_START struct _apeventbuf_wifidirect_discovery_response {
/** Peer mac address */
t_u8 peer_mac_addr[ETH_ALEN];
/** Category */
t_u8 category;
/** Action */
t_u8 action;
/** Dialog taken */
t_u8 dialog_taken;
/** Status code */
t_u8 status_code;
/** GAS comback reply */
t_u16 gas_reply;
/** Advertize protocol IE */
t_u8 advertize_protocol_ie[4];
/** Query response Length */
t_u16 query_len;
/** Information identifier */
t_u8 info_id[2];
/** Response Length */
t_u16 response_len;
/** OUI */
t_u8 oui[3];
/** OUI sub type */
t_u8 oui_sub_type;
/** Service update indicator */
t_u16 service_update_indicator;
/** Vendor Length */
t_u16 vendor_len;
/** Service protocol */
t_u8 service_protocol;
/** Service transaction Id */
t_u8 service_transaction_id;
/** Discovery status code */
t_u8 disc_status_code;
/** Response Data */
wifidirect_response_data disc_resp;
} PACK_END apeventbuf_wifidirect_discovery_response;
/** enum : WPS attribute type */
typedef enum {
SC_AP_Channel = 0x1001,
SC_Association_State = 0x1002,
SC_Authentication_Type = 0x1003,
SC_Authentication_Type_Flags = 0x1004,
SC_Authenticator = 0x1005,
SC_Config_Methods = 0x1008,
SC_Configuration_Error = 0x1009,
SC_Confirmation_URL4 = 0x100A,
SC_Confirmation_URL6 = 0x100B,
SC_Connection_Type = 0x100C,
SC_Connection_Type_Flags = 0x100D,
SC_Credential = 0x100E,
SC_Device_Name = 0x1011,
SC_Device_Password_ID = 0x1012,
SC_E_Hash1 = 0x1014,
SC_E_Hash2 = 0x1015,
SC_E_SNonce1 = 0x1016,
SC_E_SNonce2 = 0x1017,
SC_Encrypted_Settings = 0x1018,
SC_Encryption_Type = 0X100F,
SC_Encryption_Type_Flags = 0x1010,
SC_Enrollee_Nonce = 0x101A,
SC_Feature_ID = 0x101B,
SC_Identity = 0X101C,
SC_Identity_Proof = 0X101D,
SC_Key_Wrap_Authenticator = 0X101E,
SC_Key_Identifier = 0X101F,
SC_MAC_Address = 0x1020,
SC_Manufacturer = 0x1021,
SC_Message_Type = 0x1022,
SC_Model_Name = 0x1023,
SC_Model_Number = 0x1024,
SC_Network_Index = 0x1026,
SC_Network_Key = 0x1027,
SC_Network_Key_Index = 0x1028,
SC_New_Device_Name = 0x1029,
SC_New_Password = 0x102A,
SC_OOB_Device_Password = 0X102C,
SC_OS_Version = 0X102D,
SC_Power_Level = 0X102F,
SC_PSK_Current = 0x1030,
SC_PSK_Max = 0x1031,
SC_Public_Key = 0x1032,
SC_Radio_Enabled = 0x1033,
SC_Reboot = 0x1034,
SC_Registrar_Current = 0x1035,
SC_Registrar_Established = 0x1036,
SC_Registrar_List = 0x1037,
SC_Registrar_Max = 0x1038,
SC_Registrar_Nonce = 0x1039,
SC_Request_Type = 0x103A,
SC_Response_Type = 0x103B,
SC_RF_Band = 0X103C,
SC_R_Hash1 = 0X103D,
SC_R_Hash2 = 0X103E,
SC_R_SNonce1 = 0X103F,
SC_R_SNonce2 = 0x1040,
SC_Selected_Registrar = 0x1041,
SC_Serial_Number = 0x1042,
SC_Simple_Config_State = 0x1044,
SC_SSID = 0x1045,
SC_Total_Networks = 0x1046,
SC_UUID_E = 0x1047,
SC_UUID_R = 0x1048,
SC_Vendor_Extension = 0x1049,
SC_Version = 0x104A,
SC_X_509_Certificate_Request = 0x104B,
SC_X_509_Certificate = 0x104C,
SC_EAP_Identity = 0x104D,
SC_Message_Counter = 0x104E,
SC_Public_Key_Hash = 0x104F,
SC_Rekey_Key = 0x1050,
SC_Key_Lifetime = 0x1051,
SC_Permitted_Config_Methods = 0x1052,
SC_SelectedRegistrarConfigMethods = 0x1053,
SC_Primary_Device_Type = 0x1054,
SC_Secondary_Device_Type_List = 0x1055,
SC_Portable_Device = 0x1056,
SC_AP_Setup_Locked = 0x1057,
SC_Application_List = 0x1058,
SC_EAP_Type = 0x1059,
SC_Initialization_Vector = 0x1060,
SC_Key_Provided_Auto = 0x1061,
SC_8021x_Enabled = 0x1062,
SC_App_Session_key = 0x1063,
SC_WEP_Transmit_Key = 0x1064,
} wps_simple_config_attribute;
#endif
/** structure for channel switch result from TDLS FW */
typedef PACK_START struct _Channel_switch_result {
/** current channel, 0 - base channel, 1 - off channel*/
t_u8 current_channel;
/** channel switch status*/
t_u8 status;
/** channel switch fauilure reason code*/
t_u8 reason;
} PACK_END Channel_switch_result;
/** Event : TDLS Generic event */
typedef PACK_START struct _eventbuf_tdls_generic {
/** Event Type */
t_u16 event_type;
/** Peer mac address */
t_u8 peer_mac_addr[ETH_ALEN];
union {
/** channel switch result structure*/
Channel_switch_result switch_result;
/** channel switch stop reason */
t_u8 cs_stop_reason;
/** Reason code */
t_u16 reason_code;
/** IE Length */
t_u16 ie_length;
} u;
/** IE pointer */
t_u8 ie_ptr[0];
} PACK_END eventbuf_tdls_generic;
/** Event : TDLS Debug event */
typedef PACK_START struct _eventbuf_tdls_debug {
/** Event Type */
t_u16 event_type;
/** TimeStamp value */
t_u64 tsf;
/** First argument */
t_u32 first_arg;
/** Second argument */
t_u32 second_arg;
/** Third argument */
t_u32 third_arg;
/** Third argument */
t_u16 string_len;
/** Third argument */
t_u8 string[0];
} PACK_END eventbuf_tdls_debug;
/** Event : TDLS packet event */
typedef PACK_START struct _eventbuf_tdls_packet {
/** Event Type */
t_u16 event_type;
/** Length */
t_u16 length;
/** packet data */
t_u8 data[0];
} PACK_END eventbuf_tdls_packet;
/** Eapol state */
typedef PACK_START struct {
/** Eapol state*/
t_u8 eapol_state;
/** Station address*/
t_u8 sta_mac_addr[ETH_ALEN];
} PACK_END eapol_state_t;
/** Debug Info */
typedef PACK_START union {
/** Eapol key message */
eapol_keymsg_debug_t eapol_pwkmsg;
/** Station reject*/
sta_reject_t sta_reject;
/** WPA IE */
wpaie_t wpaie;
/** Eapol state */
eapol_state_t eapol_state;
} PACK_END d_info;
/** Event body : Debug */
typedef PACK_START struct _eventbuf_debug {
/** Debug type */
t_u8 debug_type;
/** Major debug id */
t_u32 debug_id_major;
/** Minor debug id */
t_u32 debug_id_minor;
/** Debug Info */
d_info info;
} PACK_END eventbuf_debug;
/** Event body : 11K NLIST */
typedef PACK_START struct _nlist_entry_tlv {
tlvbuf_header hdr;
t_u8 bssid[6];
t_u8 bssid_info[4];
t_u8 reg_class;
t_u8 chan;
t_u8 phy_type;
} PACK_END nlist_entry_tlv;
int ishexstring(void *hex);
unsigned int a2hex(char *s);
/**
* @brief isdigit for String.
*
* @param x Char string
* @return MLAN_EVENT_FAILURE for non-digit.
* 0 for digit
*/
static inline int
ISDIGIT(char *x)
{
unsigned int i;
for (i = 0; i < strlen(x); i++)
if (isdigit(x[i]) == 0)
return MLAN_EVENT_FAILURE;
return 0;
}
#endif /* _MLAN_EVENT_H */