Determine current hw mode before channel switch
There are two hw modes (5 GHz and 6 GHz) with HOSTAPD_MODE_IEEE80211A and the current hw mode may be wrong after one channel switch to 6 GHz. This will cause hostapd_set_freq_params() to return -1 when saving previous state and the second channel switch to fail. Fix this by adding hostapd_determine_mode() before every channel switch. Signed-off-by: Jouni Malinen <quic_jouni@quicinc.com>
This commit is contained in:
parent
a786c9b4a0
commit
3a995cb5a9
3 changed files with 8 additions and 1 deletions
|
@ -55,6 +55,7 @@
|
||||||
#include "hs20.h"
|
#include "hs20.h"
|
||||||
#include "airtime_policy.h"
|
#include "airtime_policy.h"
|
||||||
#include "wpa_auth_kay.h"
|
#include "wpa_auth_kay.h"
|
||||||
|
#include "hw_features.h"
|
||||||
|
|
||||||
|
|
||||||
static int hostapd_flush_old_stations(struct hostapd_data *hapd, u16 reason);
|
static int hostapd_flush_old_stations(struct hostapd_data *hapd, u16 reason);
|
||||||
|
@ -3775,6 +3776,7 @@ static int hostapd_change_config_freq(struct hostapd_data *hapd,
|
||||||
if (!channel)
|
if (!channel)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
hostapd_determine_mode(hapd->iface);
|
||||||
mode = hapd->iface->current_mode;
|
mode = hapd->iface->current_mode;
|
||||||
|
|
||||||
/* if a pointer to old_params is provided we save previous state */
|
/* if a pointer to old_params is provided we save previous state */
|
||||||
|
|
|
@ -1040,7 +1040,7 @@ static bool skip_mode(struct hostapd_iface *iface,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void hostapd_determine_mode(struct hostapd_iface *iface)
|
void hostapd_determine_mode(struct hostapd_iface *iface)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
enum hostapd_hw_mode target_mode;
|
enum hostapd_hw_mode target_mode;
|
||||||
|
|
|
@ -28,6 +28,7 @@ int hostapd_prepare_rates(struct hostapd_iface *iface,
|
||||||
void hostapd_stop_setup_timers(struct hostapd_iface *iface);
|
void hostapd_stop_setup_timers(struct hostapd_iface *iface);
|
||||||
int hostapd_hw_skip_mode(struct hostapd_iface *iface,
|
int hostapd_hw_skip_mode(struct hostapd_iface *iface,
|
||||||
struct hostapd_hw_modes *mode);
|
struct hostapd_hw_modes *mode);
|
||||||
|
void hostapd_determine_mode(struct hostapd_iface *iface);
|
||||||
#else /* NEED_AP_MLME */
|
#else /* NEED_AP_MLME */
|
||||||
static inline void
|
static inline void
|
||||||
hostapd_free_hw_features(struct hostapd_hw_modes *hw_features,
|
hostapd_free_hw_features(struct hostapd_hw_modes *hw_features,
|
||||||
|
@ -91,6 +92,10 @@ static inline int hostapd_check_he_6ghz_capab(struct hostapd_iface *iface)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void hostapd_determine_mode(struct hostapd_iface *iface)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* NEED_AP_MLME */
|
#endif /* NEED_AP_MLME */
|
||||||
|
|
||||||
#endif /* HW_FEATURES_H */
|
#endif /* HW_FEATURES_H */
|
||||||
|
|
Loading…
Reference in a new issue