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