mirror of
https://git.kernel.org/pub/scm/network/wireless/iwd.git
synced 2024-12-22 13:02:44 +01:00
ap: generate chandef for starting AP
To include HT support a chandef needs to be created for whatever frequency is being used. This allows IWD to provide a secondary channel to the kernel in the case of 40MHz operation. Now the AP will generate a chandef when starting based on the channel set in the user profile (or default). If HT is not supported the chandef width is set to 20MHz no-HT, otherwise band_freq_to_ht_chandef is used.
This commit is contained in:
parent
e9ea7b45c9
commit
65236f7231
38
src/ap.c
38
src/ap.c
@ -72,6 +72,7 @@ struct ap_state {
|
||||
uint8_t psk[32];
|
||||
enum band_freq band;
|
||||
uint8_t channel;
|
||||
struct band_chandef chandef;
|
||||
uint8_t *authorized_macs;
|
||||
unsigned int authorized_macs_num;
|
||||
char wsc_name[33];
|
||||
@ -2469,8 +2470,6 @@ static struct l_genl_msg *ap_build_cmd_start_ap(struct ap_state *ap)
|
||||
uint32_t nl_akm = CRYPTO_AKM_PSK;
|
||||
uint32_t wpa_version = NL80211_WPA_VERSION_2;
|
||||
uint32_t auth_type = NL80211_AUTHTYPE_OPEN_SYSTEM;
|
||||
uint32_t ch_freq = band_channel_to_freq(ap->channel, ap->band);
|
||||
uint32_t ch_width = NL80211_CHAN_WIDTH_20;
|
||||
unsigned int i;
|
||||
|
||||
static const uint8_t bcast_addr[6] = {
|
||||
@ -2518,8 +2517,13 @@ static struct l_genl_msg *ap_build_cmd_start_ap(struct ap_state *ap)
|
||||
l_genl_msg_append_attr(cmd, NL80211_ATTR_WPA_VERSIONS, 4, &wpa_version);
|
||||
l_genl_msg_append_attr(cmd, NL80211_ATTR_AKM_SUITES, 4, &nl_akm);
|
||||
l_genl_msg_append_attr(cmd, NL80211_ATTR_AUTH_TYPE, 4, &auth_type);
|
||||
l_genl_msg_append_attr(cmd, NL80211_ATTR_WIPHY_FREQ, 4, &ch_freq);
|
||||
l_genl_msg_append_attr(cmd, NL80211_ATTR_CHANNEL_WIDTH, 4, &ch_width);
|
||||
l_genl_msg_append_attr(cmd, NL80211_ATTR_WIPHY_FREQ, 4,
|
||||
&ap->chandef.frequency);
|
||||
l_genl_msg_append_attr(cmd, NL80211_ATTR_CHANNEL_WIDTH, 4,
|
||||
&ap->chandef.channel_width);
|
||||
if (ap->chandef.center1_frequency)
|
||||
l_genl_msg_append_attr(cmd, NL80211_ATTR_CENTER_FREQ1, 4,
|
||||
&ap->chandef.center1_frequency);
|
||||
|
||||
if (wiphy_supports_probe_resp_offload(wiphy)) {
|
||||
uint8_t probe_resp[head_len + tail_len];
|
||||
@ -3255,6 +3259,32 @@ static bool ap_validate_band_channel(struct ap_state *ap)
|
||||
l_error("AP frequency %u disabled or unsupported", freq);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (ap->supports_ht) {
|
||||
if (band_freq_to_ht_chandef(freq, attr, &ap->chandef) < 0) {
|
||||
/*
|
||||
* This is unlikely ever to fail since there are no
|
||||
* 20Mhz restrictions, but just in case fall back to
|
||||
* non-HT.
|
||||
*/
|
||||
ap->supports_ht = false;
|
||||
|
||||
l_warn("AP could not find HT chandef for frequency %u"
|
||||
" using 20Mhz no-HT", freq);
|
||||
|
||||
goto no_ht;
|
||||
}
|
||||
} else {
|
||||
no_ht:
|
||||
ap->chandef.frequency = freq;
|
||||
ap->chandef.channel_width = BAND_CHANDEF_WIDTH_20NOHT;
|
||||
}
|
||||
|
||||
l_debug("AP using frequency %u and channel width %s",
|
||||
ap->chandef.frequency,
|
||||
band_chandef_width_to_string(
|
||||
ap->chandef.channel_width));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user