| /* |
| * Wi-Fi Multimedia Admission Control (WMM-AC) |
| * Copyright(c) 2014, Intel Mobile Communication GmbH. |
| * Copyright(c) 2014, Intel Corporation. All rights reserved. |
| * |
| * This software may be distributed under the terms of the BSD license. |
| * See README for more details. |
| */ |
| |
| #ifndef WMM_AC_H |
| #define WMM_AC_H |
| |
| #include "common/ieee802_11_defs.h" |
| #include "drivers/driver.h" |
| |
| struct wpa_supplicant; |
| |
| #define WMM_AC_ACCESS_POLICY_EDCA 1 |
| #define WMM_AC_FIXED_MSDU_SIZE BIT(15) |
| |
| #define WMM_AC_MAX_TID 7 |
| #define WMM_AC_MAX_USER_PRIORITY 7 |
| #define WMM_AC_MIN_SBA_UNITY 0x2000 |
| #define WMM_AC_MAX_NOMINAL_MSDU 32767 |
| |
| /** |
| * struct wmm_ac_assoc_data - WMM Admission Control Association Data |
| * |
| * This struct will store any relevant WMM association data needed by WMM AC. |
| * In case there is a valid WMM association, an instance of this struct will be |
| * created. In case there is no instance of this struct, the station is not |
| * associated to a valid WMM BSS and hence, WMM AC will not be used. |
| */ |
| struct wmm_ac_assoc_data { |
| struct { |
| /* |
| * acm - Admission Control Mandatory |
| * In case an access category is ACM, the traffic will have |
| * to be admitted by WMM-AC's admission mechanism before use. |
| */ |
| unsigned int acm:1; |
| |
| /* |
| * uapsd_queues - Unscheduled Automatic Power Save Delivery |
| * queues. |
| * Indicates whether ACs are configured for U-APSD (or legacy |
| * PS). Storing this value is necessary in order to set the |
| * Power Save Bit (PSB) in ADDTS request Action frames (if not |
| * given). |
| */ |
| unsigned int uapsd:1; |
| } ac_params[WMM_AC_NUM]; |
| }; |
| |
| /** |
| * wmm_ac_dir - WMM Admission Control Direction |
| */ |
| enum wmm_ac_dir { |
| WMM_AC_DIR_UPLINK = 0, |
| WMM_AC_DIR_DOWNLINK = 1, |
| WMM_AC_DIR_BIDIRECTIONAL = 3 |
| }; |
| |
| /** |
| * ts_dir_idx - indices of internally saved tspecs |
| * |
| * we can have multiple tspecs (downlink + uplink) per ac. |
| * save them in array, and use the enum to directly access |
| * the respective tspec slot (according to the direction). |
| */ |
| enum ts_dir_idx { |
| TS_DIR_IDX_UPLINK, |
| TS_DIR_IDX_DOWNLINK, |
| TS_DIR_IDX_BIDI, |
| |
| TS_DIR_IDX_COUNT |
| }; |
| #define TS_DIR_IDX_ALL (BIT(TS_DIR_IDX_COUNT) - 1) |
| |
| /** |
| * struct wmm_ac_addts_request - ADDTS Request Information |
| * |
| * The last sent ADDTS request(s) will be saved as element(s) of this struct in |
| * order to be compared with the received ADDTS response in ADDTS response |
| * action frame handling and should be stored until that point. |
| * In case a new traffic stream will be created/replaced/updated, only its |
| * relevant traffic stream information will be stored as a wmm_ac_ts struct. |
| */ |
| struct wmm_ac_addts_request { |
| /* |
| * dialog token - Used to link the recived ADDTS response with this |
| * saved ADDTS request when ADDTS response is being handled |
| */ |
| u8 dialog_token; |
| |
| /* |
| * address - The alleged traffic stream's receiver/transmitter address |
| * Address and TID are used to identify the TS (TID is contained in |
| * TSPEC) |
| */ |
| u8 address[ETH_ALEN]; |
| |
| /* |
| * tspec - Traffic Stream Specification, will be used to compare the |
| * sent TSPEC in ADDTS request to the received TSPEC in ADDTS response |
| * and act accordingly in ADDTS response handling |
| */ |
| struct wmm_tspec_element tspec; |
| }; |
| |
| |
| /** |
| * struct wmm_ac_ts_setup_params - TS setup parameters |
| * |
| * This struct holds parameters which should be provided |
| * to wmm_ac_ts_setup in order to setup a traffic stream |
| */ |
| struct wmm_ac_ts_setup_params { |
| /* |
| * tsid - Traffic ID |
| * TID and address are used to identify the TS |
| */ |
| int tsid; |
| |
| /* |
| * direction - Traffic Stream's direction |
| */ |
| enum wmm_ac_dir direction; |
| |
| /* |
| * user_priority - Traffic Stream's user priority |
| */ |
| int user_priority; |
| |
| /* |
| * nominal_msdu_size - Nominal MAC service data unit size |
| */ |
| int nominal_msdu_size; |
| |
| /* |
| * fixed_nominal_msdu - Whether the size is fixed |
| * 0 = Nominal MSDU size is not fixed |
| * 1 = Nominal MSDU size is fixed |
| */ |
| int fixed_nominal_msdu; |
| |
| /* |
| * surplus_bandwidth_allowance - Specifies excess time allocation |
| */ |
| int mean_data_rate; |
| |
| /* |
| * minimum_phy_rate - Specifies the minimum supported PHY rate in bps |
| */ |
| int minimum_phy_rate; |
| |
| /* |
| * surplus_bandwidth_allowance - Specifies excess time allocation |
| */ |
| int surplus_bandwidth_allowance; |
| }; |
| |
| void wmm_ac_notify_assoc(struct wpa_supplicant *wpa_s, const u8 *ies, |
| size_t ies_len, const struct wmm_params *wmm_params); |
| void wmm_ac_notify_disassoc(struct wpa_supplicant *wpa_s); |
| int wpas_wmm_ac_addts(struct wpa_supplicant *wpa_s, |
| struct wmm_ac_ts_setup_params *params); |
| int wpas_wmm_ac_delts(struct wpa_supplicant *wpa_s, u8 tsid); |
| void wmm_ac_rx_action(struct wpa_supplicant *wpa_s, const u8 *da, |
| const u8 *sa, const u8 *data, size_t len); |
| int wpas_wmm_ac_status(struct wpa_supplicant *wpa_s, char *buf, size_t buflen); |
| void wmm_ac_save_tspecs(struct wpa_supplicant *wpa_s); |
| void wmm_ac_clear_saved_tspecs(struct wpa_supplicant *wpa_s); |
| int wmm_ac_restore_tspecs(struct wpa_supplicant *wpa_s); |
| |
| #endif /* WMM_AC_H */ |