1fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt/*
2fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt * Wi-Fi Multimedia Admission Control (WMM-AC)
3fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt * Copyright(c) 2014, Intel Mobile Communication GmbH.
4fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt * Copyright(c) 2014, Intel Corporation. All rights reserved.
5fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt *
6fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt * This software may be distributed under the terms of the BSD license.
7fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt * See README for more details.
8fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt */
9fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt
10fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt#ifndef WMM_AC_H
11fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt#define WMM_AC_H
12fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt
13fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt#include "common/ieee802_11_defs.h"
14fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt#include "drivers/driver.h"
15fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt
16fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidtstruct wpa_supplicant;
17fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt
18fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt#define WMM_AC_ACCESS_POLICY_EDCA 1
19fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt#define WMM_AC_FIXED_MSDU_SIZE BIT(15)
20fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt
21fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt#define WMM_AC_MAX_TID 7
22fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt#define WMM_AC_MAX_USER_PRIORITY 7
23fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt#define WMM_AC_MIN_SBA_UNITY 0x2000
24fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt#define WMM_AC_MAX_NOMINAL_MSDU 32767
25fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt
26fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt/**
27fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt * struct wmm_ac_assoc_data - WMM Admission Control Association Data
28fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt *
29fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt * This struct will store any relevant WMM association data needed by WMM AC.
30fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt * In case there is a valid WMM association, an instance of this struct will be
31fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt * created. In case there is no instance of this struct, the station is not
32fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt * associated to a valid WMM BSS and hence, WMM AC will not be used.
33fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt */
34fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidtstruct wmm_ac_assoc_data {
35fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	struct {
36fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt		/*
37fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt		 * acm - Admission Control Mandatory
38fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt		 * In case an access category is ACM, the traffic will have
39fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt		 * to be admitted by WMM-AC's admission mechanism before use.
40fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt		 */
41fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt		unsigned int acm:1;
42fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt
43fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt		/*
44fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt		 * uapsd_queues - Unscheduled Automatic Power Save Delivery
45fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt		 *		  queues.
46fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt		 * Indicates whether ACs are configured for U-APSD (or legacy
47fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt		 * PS). Storing this value is necessary in order to set the
48fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt		 * Power Save Bit (PSB) in ADDTS request Action frames (if not
49fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt		 * given).
50fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt		 */
51fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt		unsigned int uapsd:1;
52fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	} ac_params[WMM_AC_NUM];
53fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt};
54fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt
55fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt/**
56fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt * wmm_ac_dir - WMM Admission Control Direction
57fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt */
58fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidtenum wmm_ac_dir {
59fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	WMM_AC_DIR_UPLINK = 0,
60fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	WMM_AC_DIR_DOWNLINK = 1,
61fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	WMM_AC_DIR_BIDIRECTIONAL = 3
62fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt};
63fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt
64fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt/**
65fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt * ts_dir_idx - indices of internally saved tspecs
66fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt *
67fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt * we can have multiple tspecs (downlink + uplink) per ac.
68fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt * save them in array, and use the enum to directly access
69fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt * the respective tspec slot (according to the direction).
70fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt */
71fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidtenum ts_dir_idx {
72fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	TS_DIR_IDX_UPLINK,
73fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	TS_DIR_IDX_DOWNLINK,
74fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	TS_DIR_IDX_BIDI,
75fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt
76fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	TS_DIR_IDX_COUNT
77fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt};
78fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt#define TS_DIR_IDX_ALL (BIT(TS_DIR_IDX_COUNT) - 1)
79fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt
80fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt/**
81fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt * struct wmm_ac_addts_request - ADDTS Request Information
82fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt *
83fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt * The last sent ADDTS request(s) will be saved as element(s) of this struct in
84fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt * order to be compared with the received ADDTS response in ADDTS response
85fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt * action frame handling and should be stored until that point.
86fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt * In case a new traffic stream will be created/replaced/updated, only its
87fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt * relevant traffic stream information will be stored as a wmm_ac_ts struct.
88fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt */
89fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidtstruct wmm_ac_addts_request {
90fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	/*
919839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	 * dialog token - Used to link the received ADDTS response with this
92fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	 * saved ADDTS request when ADDTS response is being handled
93fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	 */
94fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	u8 dialog_token;
95fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt
96fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	/*
97fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	 * address - The alleged traffic stream's receiver/transmitter address
98fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	 * Address and TID are used to identify the TS (TID is contained in
99fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	 * TSPEC)
100fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	 */
101fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	u8 address[ETH_ALEN];
102fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt
103fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	/*
104fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	 * tspec - Traffic Stream Specification, will be used to compare the
105fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	 * sent TSPEC in ADDTS request to the received TSPEC in ADDTS response
106fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	 * and act accordingly in ADDTS response handling
107fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	 */
108fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	struct wmm_tspec_element tspec;
109fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt};
110fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt
111fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt
112fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt/**
113fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt * struct wmm_ac_ts_setup_params - TS setup parameters
114fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt *
115fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt * This struct holds parameters which should be provided
116fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt * to wmm_ac_ts_setup in order to setup a traffic stream
117fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt */
118fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidtstruct wmm_ac_ts_setup_params {
119fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	/*
120fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	 * tsid - Traffic ID
121fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	 * TID and address are used to identify the TS
122fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	 */
123fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	int tsid;
124fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt
125fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	/*
126fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	 * direction - Traffic Stream's direction
127fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	 */
128fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	enum wmm_ac_dir direction;
129fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt
130fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	/*
131fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	 * user_priority - Traffic Stream's user priority
132fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	 */
133fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	int user_priority;
134fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt
135fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	/*
136fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	 * nominal_msdu_size - Nominal MAC service data unit size
137fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	 */
138fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	int nominal_msdu_size;
139fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt
140fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	/*
141fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	 * fixed_nominal_msdu - Whether the size is fixed
142fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	 * 0 = Nominal MSDU size is not fixed
143fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	 * 1 = Nominal MSDU size is fixed
144fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	 */
145fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	int fixed_nominal_msdu;
146fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt
147fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	/*
148fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	 * surplus_bandwidth_allowance - Specifies excess time allocation
149fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	 */
150fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	int mean_data_rate;
151fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt
152fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	/*
153fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	 * minimum_phy_rate - Specifies the minimum supported PHY rate in bps
154fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	 */
155fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	int minimum_phy_rate;
156fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt
157fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	/*
158fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	 * surplus_bandwidth_allowance - Specifies excess time allocation
159fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	 */
160fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	int surplus_bandwidth_allowance;
161fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt};
162fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt
163fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidtvoid wmm_ac_notify_assoc(struct wpa_supplicant *wpa_s, const u8 *ies,
164fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt			 size_t ies_len, const struct wmm_params *wmm_params);
165fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidtvoid wmm_ac_notify_disassoc(struct wpa_supplicant *wpa_s);
166fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidtint wpas_wmm_ac_addts(struct wpa_supplicant *wpa_s,
167fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt		      struct wmm_ac_ts_setup_params *params);
168fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidtint wpas_wmm_ac_delts(struct wpa_supplicant *wpa_s, u8 tsid);
169fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidtvoid wmm_ac_rx_action(struct wpa_supplicant *wpa_s, const u8 *da,
170fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt			const u8 *sa, const u8 *data, size_t len);
171fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidtint wpas_wmm_ac_status(struct wpa_supplicant *wpa_s, char *buf, size_t buflen);
172fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidtvoid wmm_ac_save_tspecs(struct wpa_supplicant *wpa_s);
173fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidtvoid wmm_ac_clear_saved_tspecs(struct wpa_supplicant *wpa_s);
174fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidtint wmm_ac_restore_tspecs(struct wpa_supplicant *wpa_s);
175fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt
176fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt#endif /* WMM_AC_H */
177