wpa_supplicant: Use hostapd_freq_params in assoc_params
Use hostapd_freq_params instead of simple frequency parameter for driver commands. This is preparation for IBSS configuration to allow use of HT/VHT in IBSS. Signed-off-by: Janusz Dziedzic <janusz.dziedzic@tieto.com>
This commit is contained in:
parent
43f02e6ad7
commit
4ec68377ef
7 changed files with 55 additions and 53 deletions
|
@ -411,6 +411,25 @@ enum wps_mode {
|
||||||
*/
|
*/
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct hostapd_freq_params {
|
||||||
|
int mode;
|
||||||
|
int freq;
|
||||||
|
int channel;
|
||||||
|
/* for HT */
|
||||||
|
int ht_enabled;
|
||||||
|
int sec_channel_offset; /* 0 = HT40 disabled, -1 = HT40 enabled,
|
||||||
|
* secondary channel below primary, 1 = HT40
|
||||||
|
* enabled, secondary channel above primary */
|
||||||
|
|
||||||
|
/* for VHT */
|
||||||
|
int vht_enabled;
|
||||||
|
|
||||||
|
/* valid for both HT and VHT, center_freq2 is non-zero
|
||||||
|
* only for bandwidth 80 and an 80+80 channel */
|
||||||
|
int center_freq1, center_freq2;
|
||||||
|
int bandwidth;
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* struct wpa_driver_associate_params - Association parameters
|
* struct wpa_driver_associate_params - Association parameters
|
||||||
* Data for struct wpa_driver_ops::associate().
|
* Data for struct wpa_driver_ops::associate().
|
||||||
|
@ -443,11 +462,9 @@ struct wpa_driver_associate_params {
|
||||||
size_t ssid_len;
|
size_t ssid_len;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* freq - Frequency of the channel the selected AP is using
|
* freq - channel parameters
|
||||||
* Frequency that the selected AP is using (in MHz as
|
|
||||||
* reported in the scan results)
|
|
||||||
*/
|
*/
|
||||||
int freq;
|
struct hostapd_freq_params freq;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* freq_hint - Frequency of the channel the proposed AP is using
|
* freq_hint - Frequency of the channel the proposed AP is using
|
||||||
|
@ -1091,25 +1108,6 @@ struct hostapd_sta_add_params {
|
||||||
size_t supp_oper_classes_len;
|
size_t supp_oper_classes_len;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct hostapd_freq_params {
|
|
||||||
int mode;
|
|
||||||
int freq;
|
|
||||||
int channel;
|
|
||||||
/* for HT */
|
|
||||||
int ht_enabled;
|
|
||||||
int sec_channel_offset; /* 0 = HT40 disabled, -1 = HT40 enabled,
|
|
||||||
* secondary channel below primary, 1 = HT40
|
|
||||||
* enabled, secondary channel above primary */
|
|
||||||
|
|
||||||
/* for VHT */
|
|
||||||
int vht_enabled;
|
|
||||||
|
|
||||||
/* valid for both HT and VHT, center_freq2 is non-zero
|
|
||||||
* only for bandwidth 80 and an 80+80 channel */
|
|
||||||
int center_freq1, center_freq2;
|
|
||||||
int bandwidth;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct mac_address {
|
struct mac_address {
|
||||||
u8 addr[ETH_ALEN];
|
u8 addr[ETH_ALEN];
|
||||||
};
|
};
|
||||||
|
|
|
@ -358,7 +358,8 @@ static void wpa_driver_nl80211_scan_timeout(void *eloop_ctx,
|
||||||
void *timeout_ctx);
|
void *timeout_ctx);
|
||||||
static int wpa_driver_nl80211_set_mode(struct i802_bss *bss,
|
static int wpa_driver_nl80211_set_mode(struct i802_bss *bss,
|
||||||
enum nl80211_iftype nlmode);
|
enum nl80211_iftype nlmode);
|
||||||
static int wpa_driver_nl80211_set_mode_ibss(struct i802_bss *bss, int freq);
|
static int wpa_driver_nl80211_set_mode_ibss(struct i802_bss *bss,
|
||||||
|
struct hostapd_freq_params *freq);
|
||||||
|
|
||||||
static int
|
static int
|
||||||
wpa_driver_nl80211_finish_drv_init(struct wpa_driver_nl80211_data *drv,
|
wpa_driver_nl80211_finish_drv_init(struct wpa_driver_nl80211_data *drv,
|
||||||
|
@ -8681,9 +8682,6 @@ static int wpa_driver_nl80211_ap(struct wpa_driver_nl80211_data *drv,
|
||||||
struct wpa_driver_associate_params *params)
|
struct wpa_driver_associate_params *params)
|
||||||
{
|
{
|
||||||
enum nl80211_iftype nlmode, old_mode;
|
enum nl80211_iftype nlmode, old_mode;
|
||||||
struct hostapd_freq_params freq = {
|
|
||||||
.freq = params->freq,
|
|
||||||
};
|
|
||||||
|
|
||||||
if (params->p2p) {
|
if (params->p2p) {
|
||||||
wpa_printf(MSG_DEBUG, "nl80211: Setup AP operations for P2P "
|
wpa_printf(MSG_DEBUG, "nl80211: Setup AP operations for P2P "
|
||||||
|
@ -8698,7 +8696,7 @@ static int wpa_driver_nl80211_ap(struct wpa_driver_nl80211_data *drv,
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nl80211_set_channel(drv->first_bss, &freq, 0)) {
|
if (nl80211_set_channel(drv->first_bss, ¶ms->freq, 0)) {
|
||||||
if (old_mode != nlmode)
|
if (old_mode != nlmode)
|
||||||
wpa_driver_nl80211_set_mode(drv->first_bss, old_mode);
|
wpa_driver_nl80211_set_mode(drv->first_bss, old_mode);
|
||||||
nl80211_remove_monitor_interface(drv);
|
nl80211_remove_monitor_interface(drv);
|
||||||
|
@ -8752,7 +8750,7 @@ static int wpa_driver_nl80211_ibss(struct wpa_driver_nl80211_data *drv,
|
||||||
|
|
||||||
wpa_printf(MSG_DEBUG, "nl80211: Join IBSS (ifindex=%d)", drv->ifindex);
|
wpa_printf(MSG_DEBUG, "nl80211: Join IBSS (ifindex=%d)", drv->ifindex);
|
||||||
|
|
||||||
if (wpa_driver_nl80211_set_mode_ibss(drv->first_bss, params->freq)) {
|
if (wpa_driver_nl80211_set_mode_ibss(drv->first_bss, ¶ms->freq)) {
|
||||||
wpa_printf(MSG_INFO, "nl80211: Failed to set interface into "
|
wpa_printf(MSG_INFO, "nl80211: Failed to set interface into "
|
||||||
"IBSS mode");
|
"IBSS mode");
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -8776,8 +8774,16 @@ retry:
|
||||||
os_memcpy(drv->ssid, params->ssid, params->ssid_len);
|
os_memcpy(drv->ssid, params->ssid, params->ssid_len);
|
||||||
drv->ssid_len = params->ssid_len;
|
drv->ssid_len = params->ssid_len;
|
||||||
|
|
||||||
wpa_printf(MSG_DEBUG, " * freq=%d", params->freq);
|
wpa_printf(MSG_DEBUG, " * freq=%d", params->freq.freq);
|
||||||
NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_FREQ, params->freq);
|
wpa_printf(MSG_DEBUG, " * ht_enabled=%d", params->freq.ht_enabled);
|
||||||
|
wpa_printf(MSG_DEBUG, " * sec_channel_offset=%d",
|
||||||
|
params->freq.sec_channel_offset);
|
||||||
|
wpa_printf(MSG_DEBUG, " * vht_enabled=%d", params->freq.vht_enabled);
|
||||||
|
wpa_printf(MSG_DEBUG, " * center_freq1=%d", params->freq.center_freq1);
|
||||||
|
wpa_printf(MSG_DEBUG, " * center_freq2=%d", params->freq.center_freq2);
|
||||||
|
wpa_printf(MSG_DEBUG, " * bandwidth=%d", params->freq.bandwidth);
|
||||||
|
if (nl80211_put_freq_params(msg, ¶ms->freq) < 0)
|
||||||
|
goto nla_put_failure;
|
||||||
|
|
||||||
if (params->beacon_int > 0) {
|
if (params->beacon_int > 0) {
|
||||||
wpa_printf(MSG_DEBUG, " * beacon_int=%d", params->beacon_int);
|
wpa_printf(MSG_DEBUG, " * beacon_int=%d", params->beacon_int);
|
||||||
|
@ -8855,10 +8861,10 @@ static int nl80211_connect_common(struct wpa_driver_nl80211_data *drv,
|
||||||
params->bssid_hint);
|
params->bssid_hint);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (params->freq) {
|
if (params->freq.freq) {
|
||||||
wpa_printf(MSG_DEBUG, " * freq=%d", params->freq);
|
wpa_printf(MSG_DEBUG, " * freq=%d", params->freq.freq);
|
||||||
NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_FREQ, params->freq);
|
NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_FREQ, params->freq.freq);
|
||||||
drv->assoc_freq = params->freq;
|
drv->assoc_freq = params->freq.freq;
|
||||||
} else
|
} else
|
||||||
drv->assoc_freq = 0;
|
drv->assoc_freq = 0;
|
||||||
|
|
||||||
|
@ -9349,13 +9355,11 @@ static int wpa_driver_nl80211_set_mode(struct i802_bss *bss,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int wpa_driver_nl80211_set_mode_ibss(struct i802_bss *bss, int freq)
|
static int wpa_driver_nl80211_set_mode_ibss(struct i802_bss *bss,
|
||||||
|
struct hostapd_freq_params *freq)
|
||||||
{
|
{
|
||||||
struct hostapd_freq_params freq_params;
|
|
||||||
os_memset(&freq_params, 0, sizeof(freq_params));
|
|
||||||
freq_params.freq = freq;
|
|
||||||
return wpa_driver_nl80211_set_mode_impl(bss, NL80211_IFTYPE_ADHOC,
|
return wpa_driver_nl80211_set_mode_impl(bss, NL80211_IFTYPE_ADHOC,
|
||||||
&freq_params);
|
freq);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1478,7 +1478,7 @@ static int wpa_driver_test_associate(
|
||||||
struct wpa_driver_test_data *drv = dbss->drv;
|
struct wpa_driver_test_data *drv = dbss->drv;
|
||||||
wpa_printf(MSG_DEBUG, "%s: priv=%p freq=%d pairwise_suite=%d "
|
wpa_printf(MSG_DEBUG, "%s: priv=%p freq=%d pairwise_suite=%d "
|
||||||
"group_suite=%d key_mgmt_suite=%d auth_alg=%d mode=%d",
|
"group_suite=%d key_mgmt_suite=%d auth_alg=%d mode=%d",
|
||||||
__func__, priv, params->freq, params->pairwise_suite,
|
__func__, priv, params->freq.freq, params->pairwise_suite,
|
||||||
params->group_suite, params->key_mgmt_suite,
|
params->group_suite, params->key_mgmt_suite,
|
||||||
params->auth_alg, params->mode);
|
params->auth_alg, params->mode);
|
||||||
wpa_driver_update_mode(drv, params->mode == IEEE80211_MODE_AP);
|
wpa_driver_update_mode(drv, params->mode == IEEE80211_MODE_AP);
|
||||||
|
|
|
@ -2119,7 +2119,8 @@ int wpa_driver_wext_associate(void *priv,
|
||||||
if (wpa_driver_wext_set_auth_param(drv, IW_AUTH_MFP, value) < 0)
|
if (wpa_driver_wext_set_auth_param(drv, IW_AUTH_MFP, value) < 0)
|
||||||
ret = -1;
|
ret = -1;
|
||||||
#endif /* CONFIG_IEEE80211W */
|
#endif /* CONFIG_IEEE80211W */
|
||||||
if (params->freq && wpa_driver_wext_set_freq(drv, params->freq) < 0)
|
if (params->freq.freq &&
|
||||||
|
wpa_driver_wext_set_freq(drv, params->freq.freq) < 0)
|
||||||
ret = -1;
|
ret = -1;
|
||||||
if (!drv->cfg80211 &&
|
if (!drv->cfg80211 &&
|
||||||
wpa_driver_wext_set_ssid(drv, params->ssid, params->ssid_len) < 0)
|
wpa_driver_wext_set_ssid(drv, params->ssid, params->ssid_len) < 0)
|
||||||
|
|
|
@ -513,7 +513,7 @@ int wpa_supplicant_create_ap(struct wpa_supplicant *wpa_s,
|
||||||
}
|
}
|
||||||
if (ssid->frequency == 0)
|
if (ssid->frequency == 0)
|
||||||
ssid->frequency = 2462; /* default channel 11 */
|
ssid->frequency = 2462; /* default channel 11 */
|
||||||
params.freq = ssid->frequency;
|
params.freq.freq = ssid->frequency;
|
||||||
|
|
||||||
params.wpa_proto = ssid->proto;
|
params.wpa_proto = ssid->proto;
|
||||||
if (ssid->key_mgmt & WPA_KEY_MGMT_PSK)
|
if (ssid->key_mgmt & WPA_KEY_MGMT_PSK)
|
||||||
|
|
|
@ -742,7 +742,7 @@ void sme_associate(struct wpa_supplicant *wpa_s, enum wpas_mode mode,
|
||||||
params.bssid = bssid;
|
params.bssid = bssid;
|
||||||
params.ssid = wpa_s->sme.ssid;
|
params.ssid = wpa_s->sme.ssid;
|
||||||
params.ssid_len = wpa_s->sme.ssid_len;
|
params.ssid_len = wpa_s->sme.ssid_len;
|
||||||
params.freq = wpa_s->sme.freq;
|
params.freq.freq = wpa_s->sme.freq;
|
||||||
params.bg_scan_period = wpa_s->current_ssid ?
|
params.bg_scan_period = wpa_s->current_ssid ?
|
||||||
wpa_s->current_ssid->bg_scan_period : -1;
|
wpa_s->current_ssid->bg_scan_period : -1;
|
||||||
params.wpa_ie = wpa_s->sme.assoc_req_ie_len ?
|
params.wpa_ie = wpa_s->sme.assoc_req_ie_len ?
|
||||||
|
@ -780,7 +780,7 @@ void sme_associate(struct wpa_supplicant *wpa_s, enum wpas_mode mode,
|
||||||
wpa_msg(wpa_s, MSG_INFO, "Trying to associate with " MACSTR
|
wpa_msg(wpa_s, MSG_INFO, "Trying to associate with " MACSTR
|
||||||
" (SSID='%s' freq=%d MHz)", MAC2STR(params.bssid),
|
" (SSID='%s' freq=%d MHz)", MAC2STR(params.bssid),
|
||||||
params.ssid ? wpa_ssid_txt(params.ssid, params.ssid_len) : "",
|
params.ssid ? wpa_ssid_txt(params.ssid, params.ssid_len) : "",
|
||||||
params.freq);
|
params.freq.freq);
|
||||||
|
|
||||||
wpa_supplicant_set_state(wpa_s, WPA_ASSOCIATING);
|
wpa_supplicant_set_state(wpa_s, WPA_ASSOCIATING);
|
||||||
|
|
||||||
|
|
|
@ -1835,7 +1835,7 @@ static void wpas_start_assoc_cb(struct wpa_radio_work *work, int deinit)
|
||||||
MAC2STR(bss->bssid), bss->freq,
|
MAC2STR(bss->bssid), bss->freq,
|
||||||
ssid->bssid_set);
|
ssid->bssid_set);
|
||||||
params.bssid = bss->bssid;
|
params.bssid = bss->bssid;
|
||||||
params.freq = bss->freq;
|
params.freq.freq = bss->freq;
|
||||||
}
|
}
|
||||||
params.bssid_hint = bss->bssid;
|
params.bssid_hint = bss->bssid;
|
||||||
params.freq_hint = bss->freq;
|
params.freq_hint = bss->freq;
|
||||||
|
@ -1851,8 +1851,8 @@ static void wpas_start_assoc_cb(struct wpa_radio_work *work, int deinit)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ssid->mode == WPAS_MODE_IBSS && ssid->frequency > 0 &&
|
if (ssid->mode == WPAS_MODE_IBSS && ssid->frequency > 0 &&
|
||||||
params.freq == 0)
|
params.freq.freq == 0)
|
||||||
params.freq = ssid->frequency; /* Initial channel for IBSS */
|
params.freq.freq = ssid->frequency;
|
||||||
|
|
||||||
if (ssid->mode == WPAS_MODE_IBSS) {
|
if (ssid->mode == WPAS_MODE_IBSS) {
|
||||||
if (ssid->beacon_int)
|
if (ssid->beacon_int)
|
||||||
|
@ -1936,13 +1936,12 @@ static void wpas_start_assoc_cb(struct wpa_radio_work *work, int deinit)
|
||||||
if (wpa_s->num_multichan_concurrent < 2) {
|
if (wpa_s->num_multichan_concurrent < 2) {
|
||||||
int freq, num;
|
int freq, num;
|
||||||
num = get_shared_radio_freqs(wpa_s, &freq, 1);
|
num = get_shared_radio_freqs(wpa_s, &freq, 1);
|
||||||
if (num > 0 && freq > 0 && freq != params.freq) {
|
if (num > 0 && freq > 0 && freq != params.freq.freq) {
|
||||||
wpa_printf(MSG_DEBUG,
|
wpa_printf(MSG_DEBUG,
|
||||||
"Assoc conflicting freq found (%d != %d)",
|
"Assoc conflicting freq found (%d != %d)",
|
||||||
freq, params.freq);
|
freq, params.freq.freq);
|
||||||
if (wpas_p2p_handle_frequency_conflicts(wpa_s,
|
if (wpas_p2p_handle_frequency_conflicts(
|
||||||
params.freq,
|
wpa_s, params.freq.freq, ssid) < 0)
|
||||||
ssid) < 0)
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue