blob: 48764d6977060f820f59ebae658deb520fb046f8 [file] [log] [blame]
//------------------------------------------------------------------------------
// <copyright file="p2p.h" company="Atheros">
// Copyright (c) 2004-2010 Atheros Corporation. All rights reserved.
//
// The software source and binaries included in this development package are
// licensed, not sold. You, or your company, received the package under one
// or more license agreements. The rights granted to you are specifically
// listed in these license agreement(s). All other rights remain with Atheros
// Communications, Inc., its subsidiaries, or the respective owner including
// those listed on the included copyright notices. Distribution of any
// portion of this package must be in strict compliance with the license
// agreement(s) terms.
// </copyright>
//
// <summary>
// Wifi driver for AR6003
// </summary>
//
//------------------------------------------------------------------------------
//==============================================================================
// This file has the shared declarations between the host & target P2P modules.
// Author(s): ="Atheros"
//==============================================================================
#ifndef _P2P_H_
#define _P2P_H_
#define WPS_NONCE_LEN 16
#define WPS_DEV_TYPE_LEN 8
#define WPS_AUTHENTICATOR_LEN 8
#define WPS_HASH_LEN 32
#define WPS_SECRET_NONCE_LEN 16
#define WPS_KWA_LEN 8
#define WPS_MAX_PIN_LEN 8
#define P2P_MAX_SSID_LEN 32
#define WPS_DEV_OUI_WFA 0x0050f204
#define P2P_IE_VENDOR_TYPE 0x506f9a09
#define WLAN_EID_VENDOR_SPECIFIC 221
#define P2P_DEV_CAPAB_SERVICE_DISCOVERY BIT(0)
/* Config Methods */
#define WPS_CONFIG_USBA 0x0001
#define WPS_CONFIG_ETHERNET 0x0002
#define WPS_CONFIG_LABEL 0x0004
#define WPS_CONFIG_DISPLAY 0x0008
#define WPS_CONFIG_EXT_NFC_TOKEN 0x0010
#define WPS_CONFIG_INT_NFC_TOKEN 0x0020
#define WPS_CONFIG_NFC_INTERFACE 0x0040
#define WPS_CONFIG_PUSHBUTTON 0x0080
#define WPS_CONFIG_KEYPAD 0x0100
/* Attribute Types */
enum wps_attribute {
ATTR_AP_CHANNEL = 0x1001,
ATTR_ASSOC_STATE = 0x1002,
ATTR_AUTH_TYPE = 0x1003,
ATTR_AUTH_TYPE_FLAGS = 0x1004,
ATTR_AUTHENTICATOR = 0x1005,
ATTR_CONFIG_METHODS = 0x1008,
ATTR_CONFIG_ERROR = 0x1009,
ATTR_CONFIRM_URL4 = 0x100a,
ATTR_CONFIRM_URL6 = 0x100b,
ATTR_CONN_TYPE = 0x100c,
ATTR_CONN_TYPE_FLAGS = 0x100d,
ATTR_CRED = 0x100e,
ATTR_ENCR_TYPE = 0x100f,
ATTR_ENCR_TYPE_FLAGS = 0x1010,
ATTR_DEV_NAME = 0x1011,
ATTR_DEV_PASSWORD_ID = 0x1012,
ATTR_E_HASH1 = 0x1014,
ATTR_E_HASH2 = 0x1015,
ATTR_E_SNONCE1 = 0x1016,
ATTR_E_SNONCE2 = 0x1017,
ATTR_ENCR_SETTINGS = 0x1018,
ATTR_ENROLLEE_NONCE = 0x101a,
ATTR_FEATURE_ID = 0x101b,
ATTR_IDENTITY = 0x101c,
ATTR_IDENTITY_PROOF = 0x101d,
ATTR_KEY_WRAP_AUTH = 0x101e,
ATTR_KEY_ID = 0x101f,
ATTR_MAC_ADDR = 0x1020,
ATTR_MANUFACTURER = 0x1021,
ATTR_MSG_TYPE = 0x1022,
ATTR_MODEL_NAME = 0x1023,
ATTR_MODEL_NUMBER = 0x1024,
ATTR_NETWORK_INDEX = 0x1026,
ATTR_NETWORK_KEY = 0x1027,
ATTR_NETWORK_KEY_INDEX = 0x1028,
ATTR_NEW_DEVICE_NAME = 0x1029,
ATTR_NEW_PASSWORD = 0x102a,
ATTR_OOB_DEVICE_PASSWORD = 0x102c,
ATTR_OS_VERSION = 0x102d,
ATTR_POWER_LEVEL = 0x102f,
ATTR_PSK_CURRENT = 0x1030,
ATTR_PSK_MAX = 0x1031,
ATTR_PUBLIC_KEY = 0x1032,
ATTR_RADIO_ENABLE = 0x1033,
ATTR_REBOOT = 0x1034,
ATTR_REGISTRAR_CURRENT = 0x1035,
ATTR_REGISTRAR_ESTABLISHED = 0x1036,
ATTR_REGISTRAR_LIST = 0x1037,
ATTR_REGISTRAR_MAX = 0x1038,
ATTR_REGISTRAR_NONCE = 0x1039,
ATTR_REQUEST_TYPE = 0x103a,
ATTR_RESPONSE_TYPE = 0x103b,
ATTR_RF_BANDS = 0x103c,
ATTR_R_HASH1 = 0x103d,
ATTR_R_HASH2 = 0x103e,
ATTR_R_SNONCE1 = 0x103f,
ATTR_R_SNONCE2 = 0x1040,
ATTR_SELECTED_REGISTRAR = 0x1041,
ATTR_SERIAL_NUMBER = 0x1042,
ATTR_WPS_STATE = 0x1044,
ATTR_SSID = 0x1045,
ATTR_TOTAL_NETWORKS = 0x1046,
ATTR_UUID_E = 0x1047,
ATTR_UUID_R = 0x1048,
ATTR_VENDOR_EXT = 0x1049,
ATTR_VERSION = 0x104a,
ATTR_X509_CERT_REQ = 0x104b,
ATTR_X509_CERT = 0x104c,
ATTR_EAP_IDENTITY = 0x104d,
ATTR_MSG_COUNTER = 0x104e,
ATTR_PUBKEY_HASH = 0x104f,
ATTR_REKEY_KEY = 0x1050,
ATTR_KEY_LIFETIME = 0x1051,
ATTR_PERMITTED_CFG_METHODS = 0x1052,
ATTR_SELECTED_REGISTRAR_CONFIG_METHODS = 0x1053,
ATTR_PRIMARY_DEV_TYPE = 0x1054,
ATTR_SECONDARY_DEV_TYP_ELIST = 0x1055,
ATTR_PORTABLE_DEV = 0x1056,
ATTR_AP_SETUP_LOCKED = 0x1057,
ATTR_APPLICATION_EXT = 0x1058,
ATTR_EAP_TYPE = 0x1059,
ATTR_IV = 0x1060,
ATTR_KEY_PROVIDED_AUTO = 0x1061,
ATTR_802_1X_ENABLED = 0x1062,
ATTR_APPSESSIONKEY = 0x1063,
ATTR_WEPTRANSMITKEY = 0x1064,
ATTR_REQUESTED_DEV_TYPE = 0x106a
};
enum p2p_wps_method {
WPS_NOT_READY, WPS_PIN_LABEL, WPS_PIN_DISPLAY, WPS_PIN_KEYPAD, WPS_PBC
};
enum p2p_status_code {
P2P_SC_SUCCESS = 0,
P2P_SC_FAIL_INFO_CURRENTLY_UNAVAILABLE = 1,
P2P_SC_FAIL_INCOMPATIBLE_PARAMS = 2,
P2P_SC_FAIL_LIMIT_REACHED = 3,
P2P_SC_FAIL_INVALID_PARAMS = 4,
P2P_SC_FAIL_UNABLE_TO_ACCOMMODATE = 5,
P2P_SC_FAIL_PREV_PROTOCOL_ERROR = 6,
P2P_SC_FAIL_NO_COMMON_CHANNELS = 7,
P2P_SC_FAIL_UNKNOWN_GROUP = 8,
P2P_SC_FAIL_BOTH_GO_INTENT_15 = 9,
P2P_SC_FAIL_INCOMPATIBLE_PROV_METHOD = 10,
P2P_SC_FAIL_REJECTED_BY_USER = 11,
};
struct wps_parse_attr {
/* fixed length fields */
const A_UINT8 *version; /* 1 octet */
const A_UINT8 *msg_type; /* 1 octet */
const A_UINT8 *enrollee_nonce; /* WPS_NONCE_LEN (16) octets */
const A_UINT8 *registrar_nonce; /* WPS_NONCE_LEN (16) octets */
const A_UINT8 *uuid_r; /* WPS_UUID_LEN (16) octets */
const A_UINT8 *uuid_e; /* WPS_UUID_LEN (16) octets */
const A_UINT8 *auth_type_flags; /* 2 octets */
const A_UINT8 *encr_type_flags; /* 2 octets */
const A_UINT8 *conn_type_flags; /* 1 octet */
const A_UINT8 *config_methods; /* 2 octets */
const A_UINT8 *sel_reg_config_methods; /* 2 octets */
const A_UINT8 *primary_dev_type; /* 8 octets */
const A_UINT8 *rf_bands; /* 1 octet */
const A_UINT8 *assoc_state; /* 2 octets */
const A_UINT8 *config_error; /* 2 octets */
const A_UINT8 *dev_password_id; /* 2 octets */
const A_UINT8 *oob_dev_password; /* WPS_OOB_DEVICE_PASSWORD_ATTR_LEN (54)
* octets */
const A_UINT8 *os_version; /* 4 octets */
const A_UINT8 *wps_state; /* 1 octet */
const A_UINT8 *authenticator; /* WPS_AUTHENTICATOR_LEN (8) octets */
const A_UINT8 *r_hash1; /* WPS_HASH_LEN (32) octets */
const A_UINT8 *r_hash2; /* WPS_HASH_LEN (32) octets */
const A_UINT8 *e_hash1; /* WPS_HASH_LEN (32) octets */
const A_UINT8 *e_hash2; /* WPS_HASH_LEN (32) octets */
const A_UINT8 *r_snonce1; /* WPS_SECRET_NONCE_LEN (16) octets */
const A_UINT8 *r_snonce2; /* WPS_SECRET_NONCE_LEN (16) octets */
const A_UINT8 *e_snonce1; /* WPS_SECRET_NONCE_LEN (16) octets */
const A_UINT8 *e_snonce2; /* WPS_SECRET_NONCE_LEN (16) octets */
const A_UINT8 *key_wrap_auth; /* WPS_KWA_LEN (8) octets */
const A_UINT8 *auth_type; /* 2 octets */
const A_UINT8 *encr_type; /* 2 octets */
const A_UINT8 *network_idx; /* 1 octet */
const A_UINT8 *network_key_idx; /* 1 octet */
const A_UINT8 *mac_addr; /* ETH_ALEN (6) octets */
const A_UINT8 *key_prov_auto; /* 1 octet (Bool) */
const A_UINT8 *dot1x_enabled; /* 1 octet (Bool) */
const A_UINT8 *selected_registrar; /* 1 octet (Bool) */
const A_UINT8 *request_type; /* 1 octet */
const A_UINT8 *response_type; /* 1 octet */
const A_UINT8 *ap_setup_locked; /* 1 octet */
/* variable length fields */
const A_UINT8 *manufacturer;
A_UINT32 manufacturer_len;
const A_UINT8 *model_name;
A_UINT32 model_name_len;
const A_UINT8 *model_number;
A_UINT32 model_number_len;
const A_UINT8 *serial_number;
A_UINT32 serial_number_len;
const A_UINT8 *dev_name;
A_UINT32 dev_name_len;
const A_UINT8 *public_key;
A_UINT32 public_key_len;
const A_UINT8 *encr_settings;
A_UINT32 encr_settings_len;
const A_UINT8 *ssid; /* <= 32 octets */
A_UINT32 ssid_len;
const A_UINT8 *network_key; /* <= 64 octets */
A_UINT32 network_key_len;
const A_UINT8 *eap_type; /* <= 8 octets */
A_UINT32 eap_type_len;
const A_UINT8 *eap_identity; /* <= 64 octets */
A_UINT32 eap_identity_len;
/* attributes that can occur multiple times */
#define MAX_CRED_COUNT 10
const A_UINT8 *cred[MAX_CRED_COUNT];
A_UINT32 cred_len[MAX_CRED_COUNT];
A_UINT32 num_cred;
#define MAX_REQ_DEV_TYPE_COUNT 10
const A_UINT8 *req_dev_type[MAX_REQ_DEV_TYPE_COUNT];
A_UINT32 num_req_dev_type;
};
enum p2p_sublem_id {
P2P_ATTR_STATUS = 0,
P2P_ATTR_MINOR_REASON_CODE = 1,
P2P_ATTR_CAPABILITY = 2,
P2P_ATTR_DEVICE_ID = 3,
P2P_ATTR_GROUP_OWNER_INTENT = 4,
P2P_ATTR_CONFIGURATION_TIMEOUT = 5,
P2P_ATTR_LISTEN_CHANNEL = 6,
P2P_ATTR_GROUP_BSSID = 7,
P2P_ATTR_EXT_LISTEN_TIMING = 8,
P2P_ATTR_INTENDED_INTERFACE_ADDR = 9,
P2P_ATTR_MANAGEABILITY = 10,
P2P_ATTR_CHANNEL_LIST = 11,
P2P_ATTR_NOTICE_OF_ABSENCE = 12,
P2P_ATTR_DEVICE_INFO = 13,
P2P_ATTR_GROUP_INFO = 14,
P2P_ATTR_GROUP_ID = 15,
P2P_ATTR_INTERFACE = 16,
P2P_ATTR_OPERATING_CHANNEL = 17,
P2P_ATTR_INVITATION_FLAGS = 18,
P2P_ATTR_VENDOR_SPECIFIC = 221
};
#define P2P_MAX_REG_CLASSES 10
#define P2P_MAX_REG_CLASS_CHANNELS 20
#define P2P_WILDCARD_SSID "DIRECT-"
#define P2P_WILDCARD_SSID_LEN 7
struct p2p_channels {
struct p2p_reg_class {
A_UINT8 reg_class;
A_UINT8 channel[P2P_MAX_REG_CLASS_CHANNELS];
A_UINT8 channels;
} reg_class[P2P_MAX_REG_CLASSES];
A_UINT8 reg_classes;
};
#define P2P_NOA_DESCRIPTOR_LEN 13
struct p2p_noa_descriptor {
A_UINT8 type_count; /* 255: continuous schedule, 0: reserved */
A_UINT32 duration ; /* Absent period duration in micro seconds */
A_UINT32 interval; /* Absent period interval in micro seconds */
A_UINT32 start_time; /* 32 bit tsf time when in starts */
};
#define P2P_MAX_NOA_DESCRIPTORS 4
/*
* Length = (2 octets for Index and CTWin/Opp PS) and
* (13 octets for each NOA Descriptors)
*/
#define P2P_NOA_IE_SIZE(num_desc) (2 + (13 * (num_desc)))
#define P2P_NOE_IE_OPP_PS_SET (0x80)
#define P2P_NOE_IE_CTWIN_MASK (0x7F)
struct p2p_sub_element_noa {
A_UINT8 p2p_sub_id;
A_UINT8 p2p_sub_len;
A_UINT8 index; /* identifies instance of NOA su element */
A_UINT8 oppPS:1, /* oppPS state of the AP */
ctwindow:7; /* ctwindow in TUs */
A_UINT8 num_descriptors; /* number of NOA descriptors */
struct p2p_noa_descriptor noa_descriptors[P2P_MAX_NOA_DESCRIPTORS];
};
#define ETH_ALEN 6
struct p2p_ie {
A_UINT8 dialog_token;
const A_UINT8 *capability;
const A_UINT8 *go_intent;
const A_UINT8 *status;
const A_UINT8 *listen_channel;
const A_UINT8 *operating_channel;
const A_UINT8 *channel_list;
A_UINT8 channel_list_len;
const A_UINT8 *config_timeout;
const A_UINT8 *intended_addr;
const A_UINT8 *group_bssid;
const A_UINT8 *invitation_flags;
const A_UINT8 *group_info;
A_UINT32 group_info_len;
const A_UINT8 *group_id;
A_UINT32 group_id_len;
const A_UINT8 *device_id;
const A_UINT8 *manageability;
const A_UINT8 *noa;
A_UINT32 noa_len;
const A_UINT8 *ext_listen_timing;
const A_UINT8 *minor_reason_code;
/* P2P Device Info */
const A_UINT8 *p2p_device_info;
A_UINT32 p2p_device_info_len;
const A_UINT8 *p2p_device_addr;
const A_UINT8 *pri_dev_type;
A_UINT8 num_sec_dev_types;
A_CHAR device_name[33];
A_UINT8 dev_name_len;
A_UINT16 config_methods;
/* WPS IE */
A_UINT16 dev_password_id;
A_UINT16 wps_config_methods;
const A_UINT8 *wps_pri_dev_type;
A_CHAR wps_device_name[33];
A_UINT8 wps_dev_name_len;
/* SSID IE */
const A_UINT8 *ssid;
};
struct p2p_device {
A_UINT16 listen_freq;
A_UINT32 wps_pbc;
A_CHAR wps_pin[WPS_MAX_PIN_LEN];
A_UINT8 pin_len;
enum p2p_wps_method wps_method;
A_UINT8 p2p_device_addr[ETH_ALEN];
A_UINT8 pri_dev_type[8];
A_CHAR device_name[33];
A_UINT16 config_methods;
A_UINT8 dev_capab;
A_UINT8 group_capab;
A_UINT8 interface_addr[ETH_ALEN];
/* Dev. Discoverability data */
A_UINT8 dev_disc_dialog_token;
A_UINT8 member_in_go_dev[ETH_ALEN];
A_UINT8 member_in_go_iface[ETH_ALEN];
A_UINT8 dev_disc_go_oper_ssid[WMI_MAX_SSID_LEN];
A_UINT8 dev_disc_go_oper_ssid_len;
A_UINT16 dev_disc_go_oper_freq;
A_UINT32 go_neg_req_sent;
enum p2p_go_state { UNKNOWN_GO, LOCAL_GO, REMOTE_GO } go_state;
A_UINT8 dialog_token;
A_UINT8 intended_addr[ETH_ALEN];
A_CHAR country[3];
struct p2p_channels channels;
A_UINT16 oper_freq;
A_UINT8 oper_ssid[P2P_MAX_SSID_LEN];
A_UINT8 oper_ssid_len;
A_UINT16 req_config_methods;
#define P2P_DEV_PROBE_REQ_ONLY BIT(0)
#define P2P_DEV_REPORTED BIT(1)
#define P2P_DEV_NOT_YET_READY BIT(2)
#define P2P_DEV_SD_INFO BIT(3)
#define P2P_DEV_SD_SCHEDULE BIT(4)
#define P2P_DEV_PD_PEER_DISPLAY BIT(5)
#define P2P_DEV_PD_PEER_KEYPAD BIT(6)
#define P2P_DEV_USER_REJECTED BIT(7)
#define P2P_DEV_PEER_WAITING_RESPONSE BIT(8)
#define P2P_DEV_PREFER_PERSISTENT_GROUP BIT(9)
#define P2P_DEV_WAIT_GO_NEG_RESPONSE BIT(10)
#define P2P_DEV_WAIT_GO_NEG_CONFIRM BIT(11)
#define P2P_DEV_GROUP_CLIENT_ONLY BIT(12)
#define P2P_DEV_FORCE_FREQ BIT(13)
#define P2P_DEV_PD_FOR_JOIN BIT(14)
#define P2P_DEV_INVITATION_AUTHORIZED BIT(15)
A_UINT32 flags;
A_UINT32 status;
A_UINT8 wait_count;
A_UINT32 invitation_reqs;
A_UINT16 ext_listen_period;
A_UINT16 ext_listen_interval;
A_UINT8 go_timeout;
A_UINT8 client_timeout;
A_UINT8 persistent_grp;
};
#endif /* _P2P_H_ */