/* * 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 received 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 */