1/*
2 * Copyright (C) 2013, Broadcom Corporation. All Rights Reserved.
3 *
4 * Permission to use, copy, modify, and/or distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
7 *
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
11 * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
13 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
14 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 *
16 * Fundamental types and constants relating to WFA P2P (aka WiFi Direct)
17 *
18 * $Id: p2p.h 384540 2013-02-12 04:28:58Z $
19 */
20
21#ifndef _P2P_H_
22#define _P2P_H_
23
24#ifndef _TYPEDEFS_H_
25#include <typedefs.h>
26#endif
27#include <wlioctl.h>
28#include <proto/802.11.h>
29
30/* This marks the start of a packed structure section. */
31#include <packed_section_start.h>
32
33
34/* WiFi P2P OUI values */
35#define P2P_OUI			WFA_OUI			/* WiFi P2P OUI */
36#define P2P_VER			WFA_OUI_TYPE_P2P	/* P2P version: 9=WiFi P2P v1.0 */
37
38#define P2P_IE_ID		0xdd			/* P2P IE element ID */
39
40/* WiFi P2P IE */
41BWL_PRE_PACKED_STRUCT struct wifi_p2p_ie {
42	uint8	id;		/* IE ID: 0xDD */
43	uint8	len;		/* IE length */
44	uint8	OUI[3];		/* WiFi P2P specific OUI: P2P_OUI */
45	uint8	oui_type;	/* Identifies P2P version: P2P_VER */
46	uint8	subelts[1];	/* variable length subelements */
47} BWL_POST_PACKED_STRUCT;
48typedef struct wifi_p2p_ie wifi_p2p_ie_t;
49
50#define P2P_IE_FIXED_LEN	6
51
52#define P2P_ATTR_ID_OFF		0
53#define P2P_ATTR_LEN_OFF	1
54#define P2P_ATTR_DATA_OFF	3
55
56#define P2P_ATTR_ID_LEN		1	/* ID filed length */
57#define P2P_ATTR_LEN_LEN	2	/* length field length */
58#define P2P_ATTR_HDR_LEN	3 /* ID + 2-byte length field spec 1.02 */
59
60/* P2P IE Subelement IDs from WiFi P2P Technical Spec 1.00 */
61#define P2P_SEID_STATUS			0	/* Status */
62#define P2P_SEID_MINOR_RC		1	/* Minor Reason Code */
63#define P2P_SEID_P2P_INFO		2	/* P2P Capability (capabilities info) */
64#define P2P_SEID_DEV_ID			3	/* P2P Device ID */
65#define P2P_SEID_INTENT			4	/* Group Owner Intent */
66#define P2P_SEID_CFG_TIMEOUT		5	/* Configuration Timeout */
67#define P2P_SEID_CHANNEL		6	/* Listen channel */
68#define P2P_SEID_GRP_BSSID		7	/* P2P Group BSSID */
69#define P2P_SEID_XT_TIMING		8	/* Extended Listen Timing */
70#define P2P_SEID_INTINTADDR		9	/* Intended P2P Interface Address */
71#define P2P_SEID_P2P_MGBTY		10	/* P2P Manageability */
72#define P2P_SEID_CHAN_LIST		11	/* Channel List */
73#define P2P_SEID_ABSENCE		12	/* Notice of Absence */
74#define P2P_SEID_DEV_INFO		13	/* Device Info */
75#define P2P_SEID_GROUP_INFO		14	/* Group Info */
76#define P2P_SEID_GROUP_ID		15	/* Group ID */
77#define P2P_SEID_P2P_IF			16	/* P2P Interface */
78#define P2P_SEID_OP_CHANNEL		17	/* Operating Channel */
79#define P2P_SEID_INVITE_FLAGS		18	/* Invitation Flags */
80#define P2P_SEID_VNDR			221	/* Vendor-specific subelement */
81
82#define P2P_SE_VS_ID_SERVICES	0x1b /* BRCM proprietary subel: L2 Services */
83
84
85/* WiFi P2P IE subelement: P2P Capability (capabilities info) */
86BWL_PRE_PACKED_STRUCT struct wifi_p2p_info_se_s {
87	uint8	eltId;		/* SE ID: P2P_SEID_P2P_INFO */
88	uint8	len[2];		/* SE length not including eltId, len fields */
89	uint8	dev;		/* Device Capability Bitmap */
90	uint8	group;		/* Group Capability Bitmap */
91} BWL_POST_PACKED_STRUCT;
92typedef struct wifi_p2p_info_se_s wifi_p2p_info_se_t;
93
94/* P2P Capability subelement's Device Capability Bitmap bit values */
95#define P2P_CAPSE_DEV_SERVICE_DIS	0x1 /* Service Discovery */
96#define P2P_CAPSE_DEV_CLIENT_DIS	0x2 /* Client Discoverability */
97#define P2P_CAPSE_DEV_CONCURRENT	0x4 /* Concurrent Operation */
98#define P2P_CAPSE_DEV_INFRA_MAN		0x8 /* P2P Infrastructure Managed */
99#define P2P_CAPSE_DEV_LIMIT			0x10 /* P2P Device Limit */
100#define P2P_CAPSE_INVITE_PROC		0x20 /* P2P Invitation Procedure */
101
102/* P2P Capability subelement's Group Capability Bitmap bit values */
103#define P2P_CAPSE_GRP_OWNER			0x1 /* P2P Group Owner */
104#define P2P_CAPSE_PERSIST_GRP		0x2 /* Persistent P2P Group */
105#define P2P_CAPSE_GRP_LIMIT			0x4 /* P2P Group Limit */
106#define P2P_CAPSE_GRP_INTRA_BSS		0x8 /* Intra-BSS Distribution */
107#define P2P_CAPSE_GRP_X_CONNECT		0x10 /* Cross Connection */
108#define P2P_CAPSE_GRP_PERSISTENT	0x20 /* Persistent Reconnect */
109#define P2P_CAPSE_GRP_FORMATION		0x40 /* Group Formation */
110
111
112/* WiFi P2P IE subelement: Group Owner Intent */
113BWL_PRE_PACKED_STRUCT struct wifi_p2p_intent_se_s {
114	uint8	eltId;		/* SE ID: P2P_SEID_INTENT */
115	uint8	len[2];		/* SE length not including eltId, len fields */
116	uint8	intent;		/* Intent Value 0...15 (0=legacy 15=master only) */
117} BWL_POST_PACKED_STRUCT;
118typedef struct wifi_p2p_intent_se_s wifi_p2p_intent_se_t;
119
120/* WiFi P2P IE subelement: Configuration Timeout */
121BWL_PRE_PACKED_STRUCT struct wifi_p2p_cfg_tmo_se_s {
122	uint8	eltId;		/* SE ID: P2P_SEID_CFG_TIMEOUT */
123	uint8	len[2];		/* SE length not including eltId, len fields */
124	uint8	go_tmo;		/* GO config timeout in units of 10 ms */
125	uint8	client_tmo;	/* Client config timeout in units of 10 ms */
126} BWL_POST_PACKED_STRUCT;
127typedef struct wifi_p2p_cfg_tmo_se_s wifi_p2p_cfg_tmo_se_t;
128
129/* WiFi P2P IE subelement: Listen Channel */
130BWL_PRE_PACKED_STRUCT struct wifi_p2p_listen_channel_se_s {
131	uint8	eltId;		/* SE ID: P2P_SEID_CHANNEL */
132	uint8	len[2];		/* SE length not including eltId, len fields */
133	uint8	country[3];	/* Country String */
134	uint8	op_class;	/* Operating Class */
135	uint8	channel;	/* Channel */
136} BWL_POST_PACKED_STRUCT;
137typedef struct wifi_p2p_listen_channel_se_s wifi_p2p_listen_channel_se_t;
138
139/* WiFi P2P IE subelement: P2P Group BSSID */
140BWL_PRE_PACKED_STRUCT struct wifi_p2p_grp_bssid_se_s {
141	uint8	eltId;		/* SE ID: P2P_SEID_GRP_BSSID */
142	uint8	len[2];		/* SE length not including eltId, len fields */
143	uint8	mac[6];		/* P2P group bssid */
144} BWL_POST_PACKED_STRUCT;
145typedef struct wifi_p2p_grp_bssid_se_s wifi_p2p_grp_bssid_se_t;
146
147/* WiFi P2P IE subelement: P2P Group ID */
148BWL_PRE_PACKED_STRUCT struct wifi_p2p_grp_id_se_s {
149	uint8	eltId;		/* SE ID: P2P_SEID_GROUP_ID */
150	uint8	len[2];		/* SE length not including eltId, len fields */
151	uint8	mac[6];		/* P2P device address */
152	uint8	ssid[1];	/* ssid. device id. variable length */
153} BWL_POST_PACKED_STRUCT;
154typedef struct wifi_p2p_grp_id_se_s wifi_p2p_grp_id_se_t;
155
156/* WiFi P2P IE subelement: P2P Interface */
157BWL_PRE_PACKED_STRUCT struct wifi_p2p_intf_se_s {
158	uint8	eltId;		/* SE ID: P2P_SEID_P2P_IF */
159	uint8	len[2];		/* SE length not including eltId, len fields */
160	uint8	mac[6];		/* P2P device address */
161	uint8	ifaddrs;	/* P2P Interface Address count */
162	uint8	ifaddr[1][6];	/* P2P Interface Address list */
163} BWL_POST_PACKED_STRUCT;
164typedef struct wifi_p2p_intf_se_s wifi_p2p_intf_se_t;
165
166/* WiFi P2P IE subelement: Status */
167BWL_PRE_PACKED_STRUCT struct wifi_p2p_status_se_s {
168	uint8	eltId;		/* SE ID: P2P_SEID_STATUS */
169	uint8	len[2];		/* SE length not including eltId, len fields */
170	uint8	status;		/* Status Code: P2P_STATSE_* */
171} BWL_POST_PACKED_STRUCT;
172typedef struct wifi_p2p_status_se_s wifi_p2p_status_se_t;
173
174/* Status subelement Status Code definitions */
175#define P2P_STATSE_SUCCESS			0
176				/* Success */
177#define P2P_STATSE_FAIL_INFO_CURR_UNAVAIL	1
178				/* Failed, information currently unavailable */
179#define P2P_STATSE_PASSED_UP			P2P_STATSE_FAIL_INFO_CURR_UNAVAIL
180				/* Old name for above in P2P spec 1.08 and older */
181#define P2P_STATSE_FAIL_INCOMPAT_PARAMS		2
182				/* Failed, incompatible parameters */
183#define P2P_STATSE_FAIL_LIMIT_REACHED		3
184				/* Failed, limit reached */
185#define P2P_STATSE_FAIL_INVALID_PARAMS		4
186				/* Failed, invalid parameters */
187#define P2P_STATSE_FAIL_UNABLE_TO_ACCOM		5
188				/* Failed, unable to accomodate request */
189#define P2P_STATSE_FAIL_PROTO_ERROR		6
190				/* Failed, previous protocol error or disruptive behaviour */
191#define P2P_STATSE_FAIL_NO_COMMON_CHAN		7
192				/* Failed, no common channels */
193#define P2P_STATSE_FAIL_UNKNOWN_GROUP		8
194				/* Failed, unknown P2P Group */
195#define P2P_STATSE_FAIL_INTENT			9
196				/* Failed, both peers indicated Intent 15 in GO Negotiation */
197#define P2P_STATSE_FAIL_INCOMPAT_PROVIS		10
198				/* Failed, incompatible provisioning method */
199#define P2P_STATSE_FAIL_USER_REJECT		11
200				/* Failed, rejected by user */
201
202/* WiFi P2P IE attribute: Extended Listen Timing */
203BWL_PRE_PACKED_STRUCT struct wifi_p2p_ext_se_s {
204	uint8	eltId;		/* ID: P2P_SEID_EXT_TIMING */
205	uint8	len[2];		/* length not including eltId, len fields */
206	uint8	avail[2];	/* availibility period */
207	uint8	interval[2];	/* availibility interval */
208} BWL_POST_PACKED_STRUCT;
209typedef struct wifi_p2p_ext_se_s wifi_p2p_ext_se_t;
210
211#define P2P_EXT_MIN	10	/* minimum 10ms */
212
213/* WiFi P2P IE subelement: Intended P2P Interface Address */
214BWL_PRE_PACKED_STRUCT struct wifi_p2p_intintad_se_s {
215	uint8	eltId;		/* SE ID: P2P_SEID_INTINTADDR */
216	uint8	len[2];		/* SE length not including eltId, len fields */
217	uint8	mac[6];		/* intended P2P interface MAC address */
218} BWL_POST_PACKED_STRUCT;
219typedef struct wifi_p2p_intintad_se_s wifi_p2p_intintad_se_t;
220
221/* WiFi P2P IE subelement: Channel */
222BWL_PRE_PACKED_STRUCT struct wifi_p2p_channel_se_s {
223	uint8	eltId;		/* SE ID: P2P_SEID_STATUS */
224	uint8	len[2];		/* SE length not including eltId, len fields */
225	uint8	band;		/* Regulatory Class (band) */
226	uint8	channel;	/* Channel */
227} BWL_POST_PACKED_STRUCT;
228typedef struct wifi_p2p_channel_se_s wifi_p2p_channel_se_t;
229
230
231/* Channel Entry structure within the Channel List SE */
232BWL_PRE_PACKED_STRUCT struct wifi_p2p_chanlist_entry_s {
233	uint8	band;						/* Regulatory Class (band) */
234	uint8	num_channels;				/* # of channels in the channel list */
235	uint8	channels[WL_NUMCHANNELS];	/* Channel List */
236} BWL_POST_PACKED_STRUCT;
237typedef struct wifi_p2p_chanlist_entry_s wifi_p2p_chanlist_entry_t;
238#define WIFI_P2P_CHANLIST_SE_MAX_ENTRIES 2
239
240/* WiFi P2P IE subelement: Channel List */
241BWL_PRE_PACKED_STRUCT struct wifi_p2p_chanlist_se_s {
242	uint8	eltId;		/* SE ID: P2P_SEID_CHAN_LIST */
243	uint8	len[2];		/* SE length not including eltId, len fields */
244	uint8	country[3];	/* Country String */
245	uint8	num_entries;	/* # of channel entries */
246	wifi_p2p_chanlist_entry_t	entries[WIFI_P2P_CHANLIST_SE_MAX_ENTRIES];
247						/* Channel Entry List */
248} BWL_POST_PACKED_STRUCT;
249typedef struct wifi_p2p_chanlist_se_s wifi_p2p_chanlist_se_t;
250
251/* WiFi Primary Device Type structure */
252BWL_PRE_PACKED_STRUCT struct wifi_p2p_pri_devtype_s {
253	uint16	cat_id;		/* Category ID */
254	uint8	OUI[3];		/* WFA OUI: 0x0050F2 */
255	uint8	oui_type;	/* WPS_OUI_TYPE */
256	uint16	sub_cat_id;	/* Sub Category ID */
257} BWL_POST_PACKED_STRUCT;
258typedef struct wifi_p2p_pri_devtype_s wifi_p2p_pri_devtype_t;
259
260/* WiFi P2P IE's Device Info subelement */
261BWL_PRE_PACKED_STRUCT struct wifi_p2p_devinfo_se_s {
262	uint8	eltId;			/* SE ID: P2P_SEID_DEVINFO */
263	uint8	len[2];			/* SE length not including eltId, len fields */
264	uint8	mac[6];			/* P2P Device MAC address */
265	uint16	wps_cfg_meths;		/* Config Methods: reg_prototlv.h WPS_CONFMET_* */
266	uint8	pri_devtype[8];		/* Primary Device Type */
267} BWL_POST_PACKED_STRUCT;
268typedef struct wifi_p2p_devinfo_se_s wifi_p2p_devinfo_se_t;
269
270#define P2P_DEV_TYPE_LEN	8
271
272/* WiFi P2P IE's Group Info subelement Client Info Descriptor */
273BWL_PRE_PACKED_STRUCT struct wifi_p2p_cid_fixed_s {
274	uint8	len;
275	uint8	devaddr[ETHER_ADDR_LEN];	/* P2P Device Address */
276	uint8	ifaddr[ETHER_ADDR_LEN];		/* P2P Interface Address */
277	uint8	devcap;				/* Device Capability */
278	uint8	cfg_meths[2];			/* Config Methods: reg_prototlv.h WPS_CONFMET_* */
279	uint8	pridt[P2P_DEV_TYPE_LEN];	/* Primary Device Type */
280	uint8	secdts;				/* Number of Secondary Device Types */
281} BWL_POST_PACKED_STRUCT;
282typedef struct wifi_p2p_cid_fixed_s wifi_p2p_cid_fixed_t;
283
284/* WiFi P2P IE's Device ID subelement */
285BWL_PRE_PACKED_STRUCT struct wifi_p2p_devid_se_s {
286	uint8	eltId;
287	uint8	len[2];
288	struct ether_addr	addr;			/* P2P Device MAC address */
289} BWL_POST_PACKED_STRUCT;
290typedef struct wifi_p2p_devid_se_s wifi_p2p_devid_se_t;
291
292/* WiFi P2P IE subelement: P2P Manageability */
293BWL_PRE_PACKED_STRUCT struct wifi_p2p_mgbt_se_s {
294	uint8	eltId;		/* SE ID: P2P_SEID_P2P_MGBTY */
295	uint8	len[2];		/* SE length not including eltId, len fields */
296	uint8	mg_bitmap;	/* manageability bitmap */
297} BWL_POST_PACKED_STRUCT;
298typedef struct wifi_p2p_mgbt_se_s wifi_p2p_mgbt_se_t;
299/* mg_bitmap field bit values */
300#define P2P_MGBTSE_P2PDEVMGMT_FLAG   0x1 /* AP supports Managed P2P Device */
301
302/* WiFi P2P IE subelement: Group Info */
303BWL_PRE_PACKED_STRUCT struct wifi_p2p_grpinfo_se_s {
304	uint8	eltId;			/* SE ID: P2P_SEID_GROUP_INFO */
305	uint8	len[2];			/* SE length not including eltId, len fields */
306} BWL_POST_PACKED_STRUCT;
307typedef struct wifi_p2p_grpinfo_se_s wifi_p2p_grpinfo_se_t;
308
309/* WiFi IE subelement: Operating Channel */
310BWL_PRE_PACKED_STRUCT struct wifi_p2p_op_channel_se_s {
311	uint8	eltId;		/* SE ID: P2P_SEID_OP_CHANNEL */
312	uint8	len[2];		/* SE length not including eltId, len fields */
313	uint8	country[3];	/* Country String */
314	uint8	op_class;	/* Operating Class */
315	uint8	channel;	/* Channel */
316} BWL_POST_PACKED_STRUCT;
317typedef struct wifi_p2p_op_channel_se_s wifi_p2p_op_channel_se_t;
318
319/* WiFi IE subelement: INVITATION FLAGS */
320BWL_PRE_PACKED_STRUCT struct wifi_p2p_invite_flags_se_s {
321	uint8	eltId;		/* SE ID: P2P_SEID_INVITE_FLAGS */
322	uint8	len[2];		/* SE length not including eltId, len fields */
323	uint8	flags;		/* Flags */
324} BWL_POST_PACKED_STRUCT;
325typedef struct wifi_p2p_invite_flags_se_s wifi_p2p_invite_flags_se_t;
326
327/* WiFi P2P Action Frame */
328BWL_PRE_PACKED_STRUCT struct wifi_p2p_action_frame {
329	uint8	category;	/* P2P_AF_CATEGORY */
330	uint8	OUI[3];		/* OUI - P2P_OUI */
331	uint8	type;		/* OUI Type - P2P_VER */
332	uint8	subtype;	/* OUI Subtype - P2P_AF_* */
333	uint8	dialog_token;	/* nonzero, identifies req/resp tranaction */
334	uint8	elts[1];	/* Variable length information elements.  Max size =
335				 * ACTION_FRAME_SIZE - sizeof(this structure) - 1
336				 */
337} BWL_POST_PACKED_STRUCT;
338typedef struct wifi_p2p_action_frame wifi_p2p_action_frame_t;
339#define P2P_AF_CATEGORY		0x7f
340
341#define P2P_AF_FIXED_LEN	7
342
343/* WiFi P2P Action Frame OUI Subtypes */
344#define P2P_AF_NOTICE_OF_ABSENCE	0	/* Notice of Absence */
345#define P2P_AF_PRESENCE_REQ		1	/* P2P Presence Request */
346#define P2P_AF_PRESENCE_RSP		2	/* P2P Presence Response */
347#define P2P_AF_GO_DISC_REQ		3	/* GO Discoverability Request */
348
349
350/* WiFi P2P Public Action Frame */
351BWL_PRE_PACKED_STRUCT struct wifi_p2p_pub_act_frame {
352	uint8	category;	/* P2P_PUB_AF_CATEGORY */
353	uint8	action;		/* P2P_PUB_AF_ACTION */
354	uint8	oui[3];		/* P2P_OUI */
355	uint8	oui_type;	/* OUI type - P2P_VER */
356	uint8	subtype;	/* OUI subtype - P2P_TYPE_* */
357	uint8	dialog_token;	/* nonzero, identifies req/rsp transaction */
358	uint8	elts[1];	/* Variable length information elements.  Max size =
359				 * ACTION_FRAME_SIZE - sizeof(this structure) - 1
360				 */
361} BWL_POST_PACKED_STRUCT;
362typedef struct wifi_p2p_pub_act_frame wifi_p2p_pub_act_frame_t;
363#define P2P_PUB_AF_FIXED_LEN	8
364#define P2P_PUB_AF_CATEGORY	0x04
365#define P2P_PUB_AF_ACTION	0x09
366
367/* WiFi P2P Public Action Frame OUI Subtypes */
368#define P2P_PAF_GON_REQ		0	/* Group Owner Negotiation Req */
369#define P2P_PAF_GON_RSP		1	/* Group Owner Negotiation Rsp */
370#define P2P_PAF_GON_CONF	2	/* Group Owner Negotiation Confirm */
371#define P2P_PAF_INVITE_REQ	3	/* P2P Invitation Request */
372#define P2P_PAF_INVITE_RSP	4	/* P2P Invitation Response */
373#define P2P_PAF_DEVDIS_REQ	5	/* Device Discoverability Request */
374#define P2P_PAF_DEVDIS_RSP	6	/* Device Discoverability Response */
375#define P2P_PAF_PROVDIS_REQ	7	/* Provision Discovery Request */
376#define P2P_PAF_PROVDIS_RSP	8	/* Provision Discovery Response */
377#define P2P_PAF_SUBTYPE_INVALID	255	/* Invalid Subtype */
378
379/* TODO: Stop using these obsolete aliases for P2P_PAF_GON_* */
380#define P2P_TYPE_MNREQ		P2P_PAF_GON_REQ
381#define P2P_TYPE_MNRSP		P2P_PAF_GON_RSP
382#define P2P_TYPE_MNCONF		P2P_PAF_GON_CONF
383
384/* WiFi P2P IE subelement: Notice of Absence */
385BWL_PRE_PACKED_STRUCT struct wifi_p2p_noa_desc {
386	uint8	cnt_type;	/* Count/Type */
387	uint32	duration;	/* Duration */
388	uint32	interval;	/* Interval */
389	uint32	start;		/* Start Time */
390} BWL_POST_PACKED_STRUCT;
391typedef struct wifi_p2p_noa_desc wifi_p2p_noa_desc_t;
392
393BWL_PRE_PACKED_STRUCT struct wifi_p2p_noa_se {
394	uint8	eltId;		/* Subelement ID */
395	uint8	len[2];		/* Length */
396	uint8	index;		/* Index */
397	uint8	ops_ctw_parms;	/* CTWindow and OppPS Parameters */
398	wifi_p2p_noa_desc_t	desc[1];	/* Notice of Absence Descriptor(s) */
399} BWL_POST_PACKED_STRUCT;
400typedef struct wifi_p2p_noa_se wifi_p2p_noa_se_t;
401
402#define P2P_NOA_SE_FIXED_LEN	5
403
404#define P2P_NOA_SE_MAX_DESC	2	/* max NoA descriptors in presence request */
405
406/* cnt_type field values */
407#define P2P_NOA_DESC_CNT_RESERVED	0	/* reserved and should not be used */
408#define P2P_NOA_DESC_CNT_REPEAT		255	/* continuous schedule */
409#define P2P_NOA_DESC_TYPE_PREFERRED	1	/* preferred values */
410#define P2P_NOA_DESC_TYPE_ACCEPTABLE	2	/* acceptable limits */
411
412/* ctw_ops_parms field values */
413#define P2P_NOA_CTW_MASK	0x7f
414#define P2P_NOA_OPS_MASK	0x80
415#define P2P_NOA_OPS_SHIFT	7
416
417#define P2P_CTW_MIN	10	/* minimum 10TU */
418
419/*
420 * P2P Service Discovery related
421 */
422#define	P2PSD_ACTION_CATEGORY		0x04
423				/* Public action frame */
424#define	P2PSD_ACTION_ID_GAS_IREQ	0x0a
425				/* Action value for GAS Initial Request AF */
426#define	P2PSD_ACTION_ID_GAS_IRESP	0x0b
427				/* Action value for GAS Initial Response AF */
428#define	P2PSD_ACTION_ID_GAS_CREQ	0x0c
429				/* Action value for GAS Comback Request AF */
430#define	P2PSD_ACTION_ID_GAS_CRESP	0x0d
431				/* Action value for GAS Comback Response AF */
432#define P2PSD_AD_EID				0x6c
433				/* Advertisement Protocol IE ID */
434#define P2PSD_ADP_TUPLE_QLMT_PAMEBI	0x00
435				/* Query Response Length Limit 7 bits plus PAME-BI 1 bit */
436#define P2PSD_ADP_PROTO_ID			0x00
437				/* Advertisement Protocol ID. Always 0 for P2P SD */
438#define P2PSD_GAS_OUI				P2P_OUI
439				/* WFA OUI */
440#define P2PSD_GAS_OUI_SUBTYPE		P2P_VER
441				/* OUI Subtype for GAS IE */
442#define P2PSD_GAS_NQP_INFOID		0xDDDD
443				/* NQP Query Info ID: 56797 */
444#define P2PSD_GAS_COMEBACKDEALY		0x00
445				/* Not used in the Native GAS protocol */
446
447/* Service Protocol Type */
448typedef enum p2psd_svc_protype {
449	SVC_RPOTYPE_ALL = 0,
450	SVC_RPOTYPE_BONJOUR = 1,
451	SVC_RPOTYPE_UPNP = 2,
452	SVC_RPOTYPE_WSD = 3,
453	SVC_RPOTYPE_VENDOR = 255
454} p2psd_svc_protype_t;
455
456/* Service Discovery response status code */
457typedef enum {
458	P2PSD_RESP_STATUS_SUCCESS = 0,
459	P2PSD_RESP_STATUS_PROTYPE_NA = 1,
460	P2PSD_RESP_STATUS_DATA_NA = 2,
461	P2PSD_RESP_STATUS_BAD_REQUEST = 3
462} p2psd_resp_status_t;
463
464/* Advertisement Protocol IE tuple field */
465BWL_PRE_PACKED_STRUCT struct wifi_p2psd_adp_tpl {
466	uint8	llm_pamebi;	/* Query Response Length Limit bit 0-6, set to 0 plus
467				* Pre-Associated Message Exchange BSSID Independent bit 7, set to 0
468				*/
469	uint8	adp_id;		/* Advertisement Protocol ID: 0 for NQP Native Query Protocol */
470} BWL_POST_PACKED_STRUCT;
471typedef struct wifi_p2psd_adp_tpl wifi_p2psd_adp_tpl_t;
472
473/* Advertisement Protocol IE */
474BWL_PRE_PACKED_STRUCT struct wifi_p2psd_adp_ie {
475	uint8	id;		/* IE ID: 0x6c - 108 */
476	uint8	len;	/* IE length */
477	wifi_p2psd_adp_tpl_t adp_tpl;  /* Advertisement Protocol Tuple field. Only one
478				* tuple is defined for P2P Service Discovery
479				*/
480} BWL_POST_PACKED_STRUCT;
481typedef struct wifi_p2psd_adp_ie wifi_p2psd_adp_ie_t;
482
483/* NQP Vendor-specific Content */
484BWL_PRE_PACKED_STRUCT struct wifi_p2psd_nqp_query_vsc {
485	uint8	oui_subtype;	/* OUI Subtype: 0x09 */
486	uint16	svc_updi;		/* Service Update Indicator */
487	uint8	svc_tlvs[1];	/* wifi_p2psd_qreq_tlv_t type for service request,
488				* wifi_p2psd_qresp_tlv_t type for service response
489				*/
490} BWL_POST_PACKED_STRUCT;
491typedef struct wifi_p2psd_nqp_query_vsc wifi_p2psd_nqp_query_vsc_t;
492
493/* Service Request TLV */
494BWL_PRE_PACKED_STRUCT struct wifi_p2psd_qreq_tlv {
495	uint16	len;			/* Length: 5 plus size of Query Data */
496	uint8	svc_prot;		/* Service Protocol Type */
497	uint8	svc_tscid;		/* Service Transaction ID */
498	uint8	query_data[1];	/* Query Data, passed in from above Layer 2 */
499} BWL_POST_PACKED_STRUCT;
500typedef struct wifi_p2psd_qreq_tlv wifi_p2psd_qreq_tlv_t;
501
502/* Query Request Frame, defined in generic format, instead of NQP specific */
503BWL_PRE_PACKED_STRUCT struct wifi_p2psd_qreq_frame {
504	uint16	info_id;	/* Info ID: 0xDDDD */
505	uint16	len;		/* Length of service request TLV, 5 plus the size of request data */
506	uint8	oui[3];		/* WFA OUI: 0x0050F2 */
507	uint8	qreq_vsc[1]; /* Vendor-specific Content: wifi_p2psd_nqp_query_vsc_t type for NQP */
508
509} BWL_POST_PACKED_STRUCT;
510typedef struct wifi_p2psd_qreq_frame wifi_p2psd_qreq_frame_t;
511
512/* GAS Initial Request AF body, "elts" in wifi_p2p_pub_act_frame */
513BWL_PRE_PACKED_STRUCT struct wifi_p2psd_gas_ireq_frame {
514	wifi_p2psd_adp_ie_t		adp_ie;		/* Advertisement Protocol IE */
515	uint16					qreq_len;	/* Query Request Length */
516	uint8	qreq_frm[1];	/* Query Request Frame wifi_p2psd_qreq_frame_t */
517} BWL_POST_PACKED_STRUCT;
518typedef struct wifi_p2psd_gas_ireq_frame wifi_p2psd_gas_ireq_frame_t;
519
520/* Service Response TLV */
521BWL_PRE_PACKED_STRUCT struct wifi_p2psd_qresp_tlv {
522	uint16	len;				/* Length: 5 plus size of Query Data */
523	uint8	svc_prot;			/* Service Protocol Type */
524	uint8	svc_tscid;			/* Service Transaction ID */
525	uint8	status;				/* Value defined in Table 57 of P2P spec. */
526	uint8	query_data[1];		/* Response Data, passed in from above Layer 2 */
527} BWL_POST_PACKED_STRUCT;
528typedef struct wifi_p2psd_qresp_tlv wifi_p2psd_qresp_tlv_t;
529
530/* Query Response Frame, defined in generic format, instead of NQP specific */
531BWL_PRE_PACKED_STRUCT struct wifi_p2psd_qresp_frame {
532	uint16	info_id;	/* Info ID: 0xDDDD */
533	uint16	len;		/* Lenth of service response TLV, 6 plus the size of resp data */
534	uint8	oui[3];		/* WFA OUI: 0x0050F2 */
535	uint8	qresp_vsc[1]; /* Vendor-specific Content: wifi_p2psd_qresp_tlv_t type for NQP */
536
537} BWL_POST_PACKED_STRUCT;
538typedef struct wifi_p2psd_qresp_frame wifi_p2psd_qresp_frame_t;
539
540/* GAS Initial Response AF body, "elts" in wifi_p2p_pub_act_frame */
541BWL_PRE_PACKED_STRUCT struct wifi_p2psd_gas_iresp_frame {
542	uint16	status;			/* Value defined in Table 7-23 of IEEE P802.11u */
543	uint16	cb_delay;		/* GAS Comeback Delay */
544	wifi_p2psd_adp_ie_t	adp_ie;		/* Advertisement Protocol IE */
545	uint16		qresp_len;	/* Query Response Length */
546	uint8	qresp_frm[1];	/* Query Response Frame wifi_p2psd_qresp_frame_t */
547} BWL_POST_PACKED_STRUCT;
548typedef struct wifi_p2psd_gas_iresp_frame wifi_p2psd_gas_iresp_frame_t;
549
550/* GAS Comeback Response AF body, "elts" in wifi_p2p_pub_act_frame */
551BWL_PRE_PACKED_STRUCT struct wifi_p2psd_gas_cresp_frame {
552	uint16	status;			/* Value defined in Table 7-23 of IEEE P802.11u */
553	uint8	fragment_id;	/* Fragmentation ID */
554	uint16	cb_delay;		/* GAS Comeback Delay */
555	wifi_p2psd_adp_ie_t	adp_ie;		/* Advertisement Protocol IE */
556	uint16	qresp_len;		/* Query Response Length */
557	uint8	qresp_frm[1];	/* Query Response Frame wifi_p2psd_qresp_frame_t */
558} BWL_POST_PACKED_STRUCT;
559typedef struct wifi_p2psd_gas_cresp_frame wifi_p2psd_gas_cresp_frame_t;
560
561/* Wi-Fi GAS Public Action Frame */
562BWL_PRE_PACKED_STRUCT struct wifi_p2psd_gas_pub_act_frame {
563	uint8	category;		/* 0x04 Public Action Frame */
564	uint8	action;			/* 0x6c Advertisement Protocol */
565	uint8	dialog_token;	/* nonzero, identifies req/rsp transaction */
566	uint8	query_data[1];	/* Query Data. wifi_p2psd_gas_ireq_frame_t
567					 * or wifi_p2psd_gas_iresp_frame_t format
568					 */
569} BWL_POST_PACKED_STRUCT;
570typedef struct wifi_p2psd_gas_pub_act_frame wifi_p2psd_gas_pub_act_frame_t;
571
572/* This marks the end of a packed structure section. */
573#include <packed_section_end.h>
574
575#endif /* _P2P_H_ */
576