1 #ifndef __INC_QOS_TYPE_H
2 #define __INC_QOS_TYPE_H
3 
4 #define	MAX_WMMELE_LENGTH	64
5 
6 //
7 // QoS mode.
8 // enum 0, 1, 2, 4: since we can use the OR(|) operation.
9 //
10 // QOS_MODE is redefined for enum can't be ++, | under C++ compiler, 2006.05.17, by rcnjko.
11 //typedef	enum _QOS_MODE{
12 //	QOS_DISABLE		= 0,
13 //	QOS_WMM			= 1,
14 //	QOS_EDCA			= 2,
15 //	QOS_HCCA			= 4,
16 //}QOS_MODE,*PQOS_MODE;
17 //
18 typedef u32 QOS_MODE, *PQOS_MODE;
19 #define QOS_DISABLE		0
20 #define QOS_WMM			1
21 #define QOS_WMMSA		2
22 #define QOS_EDCA		4
23 #define QOS_HCCA		8
24 #define QOS_WMM_UAPSD		16   //WMM Power Save, 2006-06-14 Isaiah
25 
26 #define AC_PARAM_SIZE	4
27 #define WMM_PARAM_ELE_BODY_LEN	18
28 
29 //
30 // QoS ACK Policy Field Values
31 // Ref: WMM spec 2.1.6: QoS Control Field, p.10.
32 //
33 typedef	enum _ACK_POLICY{
34 	eAckPlc0_ACK		= 0x00,
35 	eAckPlc1_NoACK		= 0x01,
36 } ACK_POLICY, *PACK_POLICY;
37 
38 #define WMM_PARAM_ELEMENT_SIZE	(8+(4*AC_PARAM_SIZE))
39 
40 //
41 // QoS Control Field
42 // Ref:
43 //	1. WMM spec 2.1.6: QoS Control Field, p.9.
44 //	2. 802.11e/D13.0 7.1.3.5, p.26.
45 //
46 typedef	union _QOS_CTRL_FIELD{
47 	u8	charData[2];
48 	u16	shortData;
49 
50 	// WMM spec
51 	struct {
52 		u8		UP:3;
53 		u8		usRsvd1:1;
54 		u8		EOSP:1;
55 		u8		AckPolicy:2;
56 		u8		usRsvd2:1;
57 		u8		ucRsvdByte;
58 	}WMM;
59 
60 	// 802.11e: QoS data type frame sent by non-AP QSTAs.
61 	struct {
62 		u8		TID:4;
63 		u8		bIsQsize:1;// 0: BIT[8:15] is TXOP Duration Requested, 1: BIT[8:15] is Queue Size.
64 		u8		AckPolicy:2;
65 		u8		usRsvd:1;
66 		u8		TxopOrQsize;	// (BIT4=0)TXOP Duration Requested or (BIT4=1)Queue Size.
67 	}BySta;
68 
69 	// 802.11e: QoS data, QoS Null, and QoS Data+CF-Ack frames sent by HC.
70 	struct {
71 		u8		TID:4;
72 		u8		EOSP:1;
73 		u8		AckPolicy:2;
74 		u8		usRsvd:1;
75 		u8		PSBufState;		// QAP PS Buffer State.
76 	}ByHc_Data;
77 
78 	// 802.11e: QoS (+) CF-Poll frames sent by HC.
79 	struct {
80 		u8		TID:4;
81 		u8		EOSP:1;
82 		u8		AckPolicy:2;
83 		u8		usRsvd:1;
84 		u8		TxopLimit;		// TXOP Limit.
85 	}ByHc_CFP;
86 
87 }QOS_CTRL_FIELD, *PQOS_CTRL_FIELD;
88 
89 
90 //
91 // QoS Info Field
92 // Ref:
93 //	1. WMM spec 2.2.1: WME Information Element, p.11.
94 //	2. 8185 QoS code: QOS_INFO [def. in QoS_mp.h]
95 //
96 typedef	union _QOS_INFO_FIELD{
97 	u8	charData;
98 
99 	struct {
100 		u8		ucParameterSetCount:4;
101 		u8		ucReserved:4;
102 	}WMM;
103 
104 	struct {
105 		//Ref WMM_Specification_1-1.pdf, 2006-06-13 Isaiah
106 		u8		ucAC_VO_UAPSD:1;
107 		u8		ucAC_VI_UAPSD:1;
108 		u8		ucAC_BE_UAPSD:1;
109 		u8		ucAC_BK_UAPSD:1;
110 		u8		ucReserved1:1;
111 		u8		ucMaxSPLen:2;
112 		u8		ucReserved2:1;
113 
114 	}ByWmmPsSta;
115 
116 	struct {
117 		//Ref WMM_Specification_1-1.pdf, 2006-06-13 Isaiah
118 		u8		ucParameterSetCount:4;
119 		u8		ucReserved:3;
120 		u8		ucApUapsd:1;
121 	}ByWmmPsAp;
122 
123 	struct {
124 		u8		ucAC3_UAPSD:1;
125 		u8		ucAC2_UAPSD:1;
126 		u8		ucAC1_UAPSD:1;
127 		u8		ucAC0_UAPSD:1;
128 		u8		ucQAck:1;
129 		u8		ucMaxSPLen:2;
130 		u8		ucMoreDataAck:1;
131 	} By11eSta;
132 
133 	struct {
134 		u8		ucParameterSetCount:4;
135 		u8		ucQAck:1;
136 		u8		ucQueueReq:1;
137 		u8		ucTXOPReq:1;
138 		u8		ucReserved:1;
139 	} By11eAp;
140 
141 	struct {
142 		u8		ucReserved1:4;
143 		u8		ucQAck:1;
144 		u8		ucReserved2:2;
145 		u8		ucMoreDataAck:1;
146 	} ByWmmsaSta;
147 
148 	struct {
149 		u8		ucReserved1:4;
150 		u8		ucQAck:1;
151 		u8		ucQueueReq:1;
152 		u8		ucTXOPReq:1;
153 		u8		ucReserved2:1;
154 	} ByWmmsaAp;
155 
156 	struct {
157 		u8		ucAC3_UAPSD:1;
158 		u8		ucAC2_UAPSD:1;
159 		u8		ucAC1_UAPSD:1;
160 		u8		ucAC0_UAPSD:1;
161 		u8		ucQAck:1;
162 		u8		ucMaxSPLen:2;
163 		u8		ucMoreDataAck:1;
164 	} ByAllSta;
165 
166 	struct {
167 		u8		ucParameterSetCount:4;
168 		u8		ucQAck:1;
169 		u8		ucQueueReq:1;
170 		u8		ucTXOPReq:1;
171 		u8		ucApUapsd:1;
172 	} ByAllAp;
173 
174 }QOS_INFO_FIELD, *PQOS_INFO_FIELD;
175 
176 //
177 // ACI to AC coding.
178 // Ref: WMM spec 2.2.2: WME Parameter Element, p.13.
179 //
180 // AC_CODING is redefined for enum can't be ++, | under C++ compiler, 2006.05.17, by rcnjko.
181 //typedef	enum _AC_CODING{
182 //	AC0_BE	= 0,		// ACI: 0x00	// Best Effort
183 //	AC1_BK	= 1,		// ACI: 0x01	// Background
184 //	AC2_VI	= 2,		// ACI: 0x10	// Video
185 //	AC3_VO	= 3,		// ACI: 0x11	// Voice
186 //	AC_MAX = 4,		// Max: define total number; Should not to be used as a real enum.
187 //}AC_CODING,*PAC_CODING;
188 //
189 typedef u32 AC_CODING;
190 #define AC0_BE	0		// ACI: 0x00	// Best Effort
191 #define AC1_BK	1		// ACI: 0x01	// Background
192 #define AC2_VI	2		// ACI: 0x10	// Video
193 #define AC3_VO	3		// ACI: 0x11	// Voice
194 #define AC_MAX	4		// Max: define total number; Should not to be used as a real enum.
195 
196 //
197 // ACI/AIFSN Field.
198 // Ref: WMM spec 2.2.2: WME Parameter Element, p.12.
199 //
200 typedef	union _ACI_AIFSN{
201 	u8	charData;
202 
203 	struct {
204 		u8	AIFSN:4;
205 		u8	ACM:1;
206 		u8	ACI:2;
207 		u8	Reserved:1;
208 	}f;	// Field
209 }ACI_AIFSN, *PACI_AIFSN;
210 
211 //
212 // ECWmin/ECWmax field.
213 // Ref: WMM spec 2.2.2: WME Parameter Element, p.13.
214 //
215 typedef	union _ECW{
216 	u8	charData;
217 	struct {
218 		u8	ECWmin:4;
219 		u8	ECWmax:4;
220 	}f;	// Field
221 }ECW, *PECW;
222 
223 //
224 // AC Parameters Record Format.
225 // Ref: WMM spec 2.2.2: WME Parameter Element, p.12.
226 //
227 typedef	union _AC_PARAM{
228 	u32	longData;
229 	u8	charData[4];
230 
231 	struct {
232 		ACI_AIFSN	AciAifsn;
233 		ECW		Ecw;
234 		u16		TXOPLimit;
235 	}f;	// Field
236 }AC_PARAM, *PAC_PARAM;
237 
238 
239 
240 //
241 // QoS element subtype
242 //
243 typedef	enum _QOS_ELE_SUBTYPE{
244 	QOSELE_TYPE_INFO	= 0x00,		// 0x00: Information element
245 	QOSELE_TYPE_PARAM	= 0x01,		// 0x01: parameter element
246 } QOS_ELE_SUBTYPE, *PQOS_ELE_SUBTYPE;
247 
248 
249 //
250 // Direction Field Values.
251 // Ref: WMM spec 2.2.11: WME TSPEC Element, p.18.
252 //
253 typedef	enum _DIRECTION_VALUE{
254 	DIR_UP			= 0,		// 0x00	// UpLink
255 	DIR_DOWN		= 1,		// 0x01	// DownLink
256 	DIR_DIRECT		= 2,		// 0x10	// DirectLink
257 	DIR_BI_DIR		= 3,		// 0x11	// Bi-Direction
258 } DIRECTION_VALUE, *PDIRECTION_VALUE;
259 
260 
261 //
262 // TS Info field in WMM TSPEC Element.
263 // Ref:
264 //	1. WMM spec 2.2.11: WME TSPEC Element, p.18.
265 //	2. 8185 QoS code: QOS_TSINFO [def. in QoS_mp.h]
266 //
267 typedef union _QOS_TSINFO{
268 	u8		charData[3];
269 	struct {
270 		u8		ucTrafficType:1;			//WMM is reserved
271 		u8		ucTSID:4;
272 		u8		ucDirection:2;
273 		u8		ucAccessPolicy:2;	//WMM: bit8=0, bit7=1
274 		u8		ucAggregation:1;		//WMM is reserved
275 		u8		ucPSB:1;				//WMMSA is APSD
276 		u8		ucUP:3;
277 		u8		ucTSInfoAckPolicy:2;		//WMM is reserved
278 		u8		ucSchedule:1;			//WMM is reserved
279 		u8		ucReserved:7;
280 	}field;
281 }QOS_TSINFO, *PQOS_TSINFO;
282 
283 //
284 // WMM TSPEC Body.
285 // Ref: WMM spec 2.2.11: WME TSPEC Element, p.16.
286 //
287 typedef union _TSPEC_BODY{
288 	u8		charData[55];
289 
290 	struct {
291 		QOS_TSINFO	TSInfo;	//u8	TSInfo[3];
292 		u16	NominalMSDUsize;
293 		u16	MaxMSDUsize;
294 		u32	MinServiceItv;
295 		u32	MaxServiceItv;
296 		u32	InactivityItv;
297 		u32	SuspenItv;
298 		u32	ServiceStartTime;
299 		u32	MinDataRate;
300 		u32	MeanDataRate;
301 		u32	PeakDataRate;
302 		u32	MaxBurstSize;
303 		u32	DelayBound;
304 		u32	MinPhyRate;
305 		u16	SurplusBandwidthAllowance;
306 		u16	MediumTime;
307 	} f;	// Field
308 }TSPEC_BODY, *PTSPEC_BODY;
309 
310 
311 //
312 // WMM TSPEC Element.
313 // Ref: WMM spec 2.2.11: WME TSPEC Element, p.16.
314 //
315 typedef struct _WMM_TSPEC{
316 	u8		ID;
317 	u8		Length;
318 	u8		OUI[3];
319 	u8		OUI_Type;
320 	u8		OUI_SubType;
321 	u8		Version;
322 	TSPEC_BODY	Body;
323 } WMM_TSPEC, *PWMM_TSPEC;
324 
325 //
326 // ACM implementation method.
327 // Annie, 2005-12-13.
328 //
329 typedef	enum _ACM_METHOD{
330 	eAcmWay0_SwAndHw		= 0,		// By SW and HW.
331 	eAcmWay1_HW			= 1,		// By HW.
332 	eAcmWay2_SW			= 2,		// By SW.
333 } ACM_METHOD, *PACM_METHOD;
334 
335 
336 typedef struct _ACM{
337 //	u8		RegEnableACM;
338 	u64		UsedTime;
339 	u64		MediumTime;
340 	u8		HwAcmCtl;	// TRUE: UsedTime exceed => Do NOT USE this AC. It wll be written to ACM_CONTROL(0xBF BIT 0/1/2 in 8185B).
341 }ACM, *PACM;
342 
343 typedef	u8		AC_UAPSD, *PAC_UAPSD;
344 
345 #define	GET_VO_UAPSD(_apsd) ((_apsd) & BIT(0))
346 #define	SET_VO_UAPSD(_apsd) ((_apsd) |= BIT(0))
347 
348 #define	GET_VI_UAPSD(_apsd) ((_apsd) & BIT(1))
349 #define	SET_VI_UAPSD(_apsd) ((_apsd) |= BIT(1))
350 
351 #define	GET_BK_UAPSD(_apsd) ((_apsd) & BIT(2))
352 #define	SET_BK_UAPSD(_apsd) ((_apsd) |= BIT(2))
353 
354 #define	GET_BE_UAPSD(_apsd) ((_apsd) & BIT(3))
355 #define	SET_BE_UAPSD(_apsd) ((_apsd) |= BIT(3))
356 
357 
358 //typedef struct _TCLASS{
359 // TODO
360 //} TCLASS, *PTCLASS;
361 typedef union _QOS_TCLAS{
362 
363 	struct _TYPE_GENERAL{
364 		u8		Priority;
365 		u8		ClassifierType;
366 		u8		Mask;
367 	} TYPE_GENERAL;
368 
369 	struct _TYPE0_ETH{
370 		u8		Priority;
371 		u8		ClassifierType;
372 		u8		Mask;
373 		u8		SrcAddr[6];
374 		u8		DstAddr[6];
375 		u16		Type;
376 	} TYPE0_ETH;
377 
378 	struct _TYPE1_IPV4{
379 		u8		Priority;
380 		u8		ClassifierType;
381 		u8		Mask;
382 		u8		Version;
383 		u8		SrcIP[4];
384 		u8		DstIP[4];
385 		u16		SrcPort;
386 		u16		DstPort;
387 		u8		DSCP;
388 		u8		Protocol;
389 		u8		Reserved;
390 	} TYPE1_IPV4;
391 
392 	struct _TYPE1_IPV6{
393 		u8		Priority;
394 		u8		ClassifierType;
395 		u8		Mask;
396 		u8		Version;
397 		u8		SrcIP[16];
398 		u8		DstIP[16];
399 		u16		SrcPort;
400 		u16		DstPort;
401 		u8		FlowLabel[3];
402 	} TYPE1_IPV6;
403 
404 	struct _TYPE2_8021Q{
405 		u8		Priority;
406 		u8		ClassifierType;
407 		u8		Mask;
408 		u16		TagType;
409 	} TYPE2_8021Q;
410 } QOS_TCLAS, *PQOS_TCLAS;
411 
412 //typedef struct _WMM_TSTREAM{
413 //
414 //- TSPEC
415 //- AC (which to mapping)
416 //} WMM_TSTREAM, *PWMM_TSTREAM;
417 typedef struct _QOS_TSTREAM{
418 	u8			AC;
419 	WMM_TSPEC		TSpec;
420 	QOS_TCLAS		TClass;
421 } QOS_TSTREAM, *PQOS_TSTREAM;
422 
423 //typedef struct _U_APSD{
424 //- TriggerEnable [4]
425 //- MaxSPLength
426 //- HighestAcBuffered
427 //} U_APSD, *PU_APSD;
428 
429 //joseph TODO:
430 //	UAPSD function should be implemented by 2 data structure
431 //	"Qos control field" and "Qos info field"
432 //typedef struct _QOS_UAPSD{
433 //	u8			bTriggerEnable[4];
434 //	u8			MaxSPLength;
435 //	u8			HighestBufAC;
436 //} QOS_UAPSD, *PQOS_APSD;
437 
438 //----------------------------------------------------------------------------
439 //      802.11 Management frame Status Code field
440 //----------------------------------------------------------------------------
441 typedef struct _OCTET_STRING{
442 	u8		*Octet;
443 	u16             Length;
444 }OCTET_STRING, *POCTET_STRING;
445 
446 //
447 // STA QoS data.
448 // Ref: DOT11_QOS in 8185 code. [def. in QoS_mp.h]
449 //
450 typedef struct _STA_QOS{
451 	//DECLARE_RT_OBJECT(STA_QOS);
452 	u8				WMMIEBuf[MAX_WMMELE_LENGTH];
453 	u8				*WMMIE;
454 
455 	// Part 1. Self QoS Mode.
456 	QOS_MODE			QosCapability; //QoS Capability, 2006-06-14 Isaiah
457 	QOS_MODE			CurrentQosMode;
458 
459 	// For WMM Power Save Mode :
460 	// ACs are trigger/delivery enabled or legacy power save enabled. 2006-06-13 Isaiah
461 	AC_UAPSD			b4ac_Uapsd;  //VoUapsd(bit0), ViUapsd(bit1),  BkUapsd(bit2), BeUapsd(bit3),
462 	AC_UAPSD			Curr4acUapsd;
463 	u8				bInServicePeriod;
464 	u8				MaxSPLength;
465 	int				NumBcnBeforeTrigger;
466 
467 	// Part 2. EDCA Parameter (perAC)
468 	u8				*pWMMInfoEle;
469 	u8				WMMParamEle[WMM_PARAM_ELEMENT_SIZE];
470 	u8				WMMPELength;
471 
472 	// <Bruce_Note>
473 	//2 ToDo: remove the Qos Info Field and replace it by the above WMM Info element.
474 	// By Bruce, 2008-01-30.
475 	// Part 2. EDCA Parameter (perAC)
476 	QOS_INFO_FIELD			QosInfoField_STA;	// Maintained by STA
477 	QOS_INFO_FIELD			QosInfoField_AP;	// Retrieved from AP
478 
479 	AC_PARAM			CurAcParameters[4];
480 
481 	// Part 3. ACM
482 	ACM				acm[4];
483 	ACM_METHOD			AcmMethod;
484 
485 	// Part 4. Per TID (Part 5: TCLASS will be described by TStream)
486 	QOS_TSTREAM			TStream[16];
487 	WMM_TSPEC			TSpec;
488 
489 	u32				QBssWirelessMode;
490 
491 	// No Ack Setting
492 	u8				bNoAck;
493 
494 	// Enable/Disable Rx immediate BA capability.
495 	u8				bEnableRxImmBA;
496 
497 }STA_QOS, *PSTA_QOS;
498 
499 //
500 // BSS QOS data.
501 // Ref: BssDscr in 8185 code. [def. in BssDscr.h]
502 //
503 typedef struct _BSS_QOS{
504 	QOS_MODE		bdQoSMode;
505 
506 	u8			bdWMMIEBuf[MAX_WMMELE_LENGTH];
507 	u8		*bdWMMIE;
508 
509 	QOS_ELE_SUBTYPE		EleSubType;
510 
511 	u8			*pWMMInfoEle;
512 	u8			*pWMMParamEle;
513 
514 	QOS_INFO_FIELD		QosInfoField;
515 	AC_PARAM		AcParameter[4];
516 }BSS_QOS, *PBSS_QOS;
517 
518 
519 //
520 // Ref: sQoSCtlLng and QoSCtl definition in 8185 QoS code.
521 //#define QoSCtl   ((	(Adapter->bRegQoS) && (Adapter->dot11QoS.QoSMode &(QOS_EDCA|QOS_HCCA))	  )  ?sQoSCtlLng:0)
522 //
523 #define sQoSCtlLng			2
524 #define	QOS_CTRL_LEN(_QosMode)		((_QosMode > QOS_DISABLE)? sQoSCtlLng : 0)
525 
526 
527 //Added by joseph
528 //UP Mapping to AC, using in MgntQuery_SequenceNumber() and maybe for DSCP
529 //#define UP2AC(up)			((up<3)?((up==0)?1:0):(up>>1))
530 #define IsACValid(ac)			((ac<=7 )?true:false )
531 
532 #endif // #ifndef __INC_QOS_TYPE_H
533