AP: Add uapsd_queues and max_sp fields
Add uapsd_queues and max_sp fields to sta_info struct, and pass them to the sta_add callback. These values are determined by the WMM IE in the (Re)Association Request. Signed-off-by: Eliad Peller <eliad@wizery.com>
This commit is contained in:
		
							parent
							
								
									70619a5d8a
								
							
						
					
					
						commit
						5f32f79c6e
					
				
					 5 changed files with 22 additions and 6 deletions
				
			
		|  | @ -318,7 +318,7 @@ int hostapd_sta_add(struct hostapd_data *hapd, | ||||||
| 		    const u8 *supp_rates, size_t supp_rates_len, | 		    const u8 *supp_rates, size_t supp_rates_len, | ||||||
| 		    u16 listen_interval, | 		    u16 listen_interval, | ||||||
| 		    const struct ieee80211_ht_capabilities *ht_capab, | 		    const struct ieee80211_ht_capabilities *ht_capab, | ||||||
| 		    u32 flags) | 		    u32 flags, u8 uapsd_queues, u8 max_sp) | ||||||
| { | { | ||||||
| 	struct hostapd_sta_add_params params; | 	struct hostapd_sta_add_params params; | ||||||
| 
 | 
 | ||||||
|  | @ -336,6 +336,8 @@ int hostapd_sta_add(struct hostapd_data *hapd, | ||||||
| 	params.listen_interval = listen_interval; | 	params.listen_interval = listen_interval; | ||||||
| 	params.ht_capabilities = ht_capab; | 	params.ht_capabilities = ht_capab; | ||||||
| 	params.flags = hostapd_sta_flags_to_drv(flags); | 	params.flags = hostapd_sta_flags_to_drv(flags); | ||||||
|  | 	params.uapsd_queues = uapsd_queues; | ||||||
|  | 	params.max_sp = max_sp; | ||||||
| 	return hapd->driver->sta_add(hapd->drv_priv, ¶ms); | 	return hapd->driver->sta_add(hapd->drv_priv, ¶ms); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -43,7 +43,7 @@ int hostapd_sta_add(struct hostapd_data *hapd, | ||||||
| 		    const u8 *supp_rates, size_t supp_rates_len, | 		    const u8 *supp_rates, size_t supp_rates_len, | ||||||
| 		    u16 listen_interval, | 		    u16 listen_interval, | ||||||
| 		    const struct ieee80211_ht_capabilities *ht_capab, | 		    const struct ieee80211_ht_capabilities *ht_capab, | ||||||
| 		    u32 flags); | 		    u32 flags, u8 uapsd_queues, u8 max_sp); | ||||||
| int hostapd_set_privacy(struct hostapd_data *hapd, int enabled); | int hostapd_set_privacy(struct hostapd_data *hapd, int enabled); | ||||||
| int hostapd_set_generic_elem(struct hostapd_data *hapd, const u8 *elem, | int hostapd_set_generic_elem(struct hostapd_data *hapd, const u8 *elem, | ||||||
| 			     size_t elem_len); | 			     size_t elem_len); | ||||||
|  |  | ||||||
|  | @ -552,14 +552,23 @@ static u16 check_wmm(struct hostapd_data *hapd, struct sta_info *sta, | ||||||
| { | { | ||||||
| 	sta->flags &= ~WLAN_STA_WMM; | 	sta->flags &= ~WLAN_STA_WMM; | ||||||
| 	if (wmm_ie && hapd->conf->wmm_enabled) { | 	if (wmm_ie && hapd->conf->wmm_enabled) { | ||||||
| 		if (hostapd_eid_wmm_valid(hapd, wmm_ie, wmm_ie_len)) | 		struct wmm_information_element *wmm; | ||||||
|  | 		u8 qos_info; | ||||||
|  | 
 | ||||||
|  | 		if (hostapd_eid_wmm_valid(hapd, wmm_ie, wmm_ie_len)) { | ||||||
| 			hostapd_logger(hapd, sta->addr, | 			hostapd_logger(hapd, sta->addr, | ||||||
| 				       HOSTAPD_MODULE_WPA, | 				       HOSTAPD_MODULE_WPA, | ||||||
| 				       HOSTAPD_LEVEL_DEBUG, | 				       HOSTAPD_LEVEL_DEBUG, | ||||||
| 				       "invalid WMM element in association " | 				       "invalid WMM element in association " | ||||||
| 				       "request"); | 				       "request"); | ||||||
| 		else | 			return WLAN_STATUS_UNSPECIFIED_FAILURE; | ||||||
| 			sta->flags |= WLAN_STA_WMM; | 		} | ||||||
|  | 
 | ||||||
|  | 		sta->flags |= WLAN_STA_WMM; | ||||||
|  | 		wmm = (struct wmm_information_element *) wmm_ie; | ||||||
|  | 		qos_info = wmm->qos_info; | ||||||
|  | 		sta->uapsd_queues = qos_info & 0xf; | ||||||
|  | 		sta->max_sp = qos_info >> 5; | ||||||
| 	} | 	} | ||||||
| 	return WLAN_STATUS_SUCCESS; | 	return WLAN_STATUS_SUCCESS; | ||||||
| } | } | ||||||
|  | @ -1562,7 +1571,7 @@ static void handle_assoc_cb(struct hostapd_data *hapd, | ||||||
| 			    sta->supported_rates, sta->supported_rates_len, | 			    sta->supported_rates, sta->supported_rates_len, | ||||||
| 			    sta->listen_interval, | 			    sta->listen_interval, | ||||||
| 			    sta->flags & WLAN_STA_HT ? &ht_cap : NULL, | 			    sta->flags & WLAN_STA_HT ? &ht_cap : NULL, | ||||||
| 			    sta->flags)) { | 			    sta->flags, sta->uapsd_queues, sta->max_sp)) { | ||||||
| 		hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE80211, | 		hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE80211, | ||||||
| 			       HOSTAPD_LEVEL_NOTICE, | 			       HOSTAPD_LEVEL_NOTICE, | ||||||
| 			       "Could not add STA to kernel driver"); | 			       "Could not add STA to kernel driver"); | ||||||
|  |  | ||||||
|  | @ -61,6 +61,9 @@ struct sta_info { | ||||||
| 	unsigned int ht_20mhz_set:1; | 	unsigned int ht_20mhz_set:1; | ||||||
| 	unsigned int no_p2p_set:1; | 	unsigned int no_p2p_set:1; | ||||||
| 
 | 
 | ||||||
|  | 	u8 uapsd_queues; | ||||||
|  | 	u8 max_sp; | ||||||
|  | 
 | ||||||
| 	u16 auth_alg; | 	u16 auth_alg; | ||||||
| 	u8 previous_ap[6]; | 	u8 previous_ap[6]; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -834,6 +834,8 @@ struct hostapd_sta_add_params { | ||||||
| 	const struct ieee80211_ht_capabilities *ht_capabilities; | 	const struct ieee80211_ht_capabilities *ht_capabilities; | ||||||
| 	u32 flags; /* bitmask of WPA_STA_* flags */ | 	u32 flags; /* bitmask of WPA_STA_* flags */ | ||||||
| 	int set; /* Set STA parameters instead of add */ | 	int set; /* Set STA parameters instead of add */ | ||||||
|  | 	u8 uapsd_queues; | ||||||
|  | 	u8 max_sp; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| struct hostapd_freq_params { | struct hostapd_freq_params { | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Eliad Peller
						Eliad Peller