@ -910,3 +910,86 @@ int wpas_wmm_ac_status(struct wpa_supplicant *wpa_s, char *buf, size_t buflen)
return pos ;
}
static u8 wmm_ac_get_tspecs_count ( struct wpa_supplicant * wpa_s )
{
int ac , dir , tspecs_count = 0 ;
for ( ac = 0 ; ac < WMM_AC_NUM ; ac + + ) {
for ( dir = 0 ; dir < TS_DIR_IDX_COUNT ; dir + + ) {
if ( wpa_s - > tspecs [ ac ] [ dir ] )
tspecs_count + + ;
}
}
return tspecs_count ;
}
void wmm_ac_save_tspecs ( struct wpa_supplicant * wpa_s )
{
int ac , dir , tspecs_count ;
wpa_printf ( MSG_DEBUG , " WMM AC: Save last configured tspecs " ) ;
if ( ! wpa_s - > wmm_ac_assoc_info )
return ;
tspecs_count = wmm_ac_get_tspecs_count ( wpa_s ) ;
if ( ! tspecs_count ) {
wpa_printf ( MSG_DEBUG , " WMM AC: No configured TSPECs " ) ;
return ;
}
wpa_printf ( MSG_DEBUG , " WMM AC: Saving tspecs " ) ;
wmm_ac_clear_saved_tspecs ( wpa_s ) ;
wpa_s - > last_tspecs = os_calloc ( tspecs_count ,
sizeof ( * wpa_s - > last_tspecs ) ) ;
if ( ! wpa_s - > last_tspecs ) {
wpa_printf ( MSG_ERROR , " WMM AC: Failed to save tspecs! " ) ;
return ;
}
for ( ac = 0 ; ac < WMM_AC_NUM ; ac + + ) {
for ( dir = 0 ; dir < TS_DIR_IDX_COUNT ; dir + + ) {
if ( ! wpa_s - > tspecs [ ac ] [ dir ] )
continue ;
wpa_s - > last_tspecs [ wpa_s - > last_tspecs_count + + ] =
* wpa_s - > tspecs [ ac ] [ dir ] ;
}
}
wpa_printf ( MSG_DEBUG , " WMM AC: Successfully saved %d TSPECs " ,
wpa_s - > last_tspecs_count ) ;
}
void wmm_ac_clear_saved_tspecs ( struct wpa_supplicant * wpa_s )
{
if ( wpa_s - > last_tspecs ) {
wpa_printf ( MSG_DEBUG , " WMM AC: Clear saved tspecs " ) ;
os_free ( wpa_s - > last_tspecs ) ;
wpa_s - > last_tspecs = NULL ;
wpa_s - > last_tspecs_count = 0 ;
}
}
int wmm_ac_restore_tspecs ( struct wpa_supplicant * wpa_s )
{
unsigned int i ;
if ( ! wpa_s - > wmm_ac_assoc_info | | ! wpa_s - > last_tspecs_count )
return 0 ;
wpa_printf ( MSG_DEBUG , " WMM AC: Restore %u saved tspecs " ,
wpa_s - > last_tspecs_count ) ;
for ( i = 0 ; i < wpa_s - > last_tspecs_count ; i + + )
wmm_ac_add_ts ( wpa_s , wpa_s - > bssid , & wpa_s - > last_tspecs [ i ] ) ;
return 0 ;
}