blob: 9861c726f77bf336110f485c9c4023b7fac7a9b2 [file] [log] [blame]
diff --git a/package/kernel/mac80211/Makefile b/package/kernel/mac80211/Makefile
index 8ecbe304..4d8546ee 100644
--- a/package/kernel/mac80211/Makefile
+++ b/package/kernel/mac80211/Makefile
@@ -19,6 +19,7 @@ PKG_SOURCE:=backports-$(PKG_VERSION).tar.xz
PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/backports-$(PKG_VERSION)
PKG_BUILD_PARALLEL:=1
+SOURCE_PATH:=./src
PKG_MAINTAINER:=Felix Fietkau <nbd@nbd.name>
PKG_DRIVERS = \
@@ -71,6 +72,12 @@ config-y:= \
WLAN_VENDOR_ST \
WLAN_VENDOR_TI \
WLAN_VENDOR_ZYDAS \
+ MAC80211_DEBUG_MENU \
+ MAC80211_MLME_DEBUG \
+ MAC80211_STA_DEBUG \
+ MAC80211_HT_DEBUG \
+ MAC80211_PS_DEBUG \
+ MAC80211_DEBUG_COUNTERS \
config-$(call config_package,cfg80211) += CFG80211
config-$(CONFIG_PACKAGE_CFG80211_TESTMODE) += NL80211_TESTMODE
@@ -296,6 +303,8 @@ define Build/Prepare
mkdir -p $(PKG_BUILD_DIR)
$(PKG_UNPACK)
$(Build/Patch)
+ $(CP) $(SOURCE_PATH)/net $(PKG_BUILD_DIR) 2>/dev/null || :
+ $(CP) $(SOURCE_PATH)/include $(PKG_BUILD_DIR) 2>/dev/null || :
rm -rf \
$(PKG_BUILD_DIR)/include/linux/ssb \
$(PKG_BUILD_DIR)/include/linux/bcma \
diff --git a/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh b/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh
index ed280521..797ea8d3 100644
--- a/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh
+++ b/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh
@@ -27,6 +27,7 @@ drv_mac80211_init_device_config() {
config_add_string path phy 'macaddr:macaddr'
config_add_string tx_burst
+ config_add_int mbssid mu_onoff sr_enable sr_enhanced rnr obss_interval
config_add_string distance
config_add_int beacon_int chanbw frag rts
config_add_int rxantenna txantenna antenna_gain txpower min_tx_power
@@ -53,7 +54,12 @@ drv_mac80211_init_device_config() {
he_spr_sr_control \
he_spr_psr_enabled \
he_bss_color_enabled \
- he_twt_required
+ he_twt_required \
+ he_twt_responder \
+ etxbfen \
+ itxbfen \
+ lpi_enable \
+ beacon_dup
config_add_int \
beamformer_antennas \
beamformee_antennas \
@@ -64,7 +70,8 @@ drv_mac80211_init_device_config() {
rx_stbc \
tx_stbc \
he_bss_color \
- he_spr_non_srg_obss_pd_max_offset
+ he_spr_non_srg_obss_pd_max_offset \
+ sku_idx
config_add_boolean \
ldpc \
greenfield \
@@ -140,13 +147,11 @@ mac80211_hostapd_setup_base() {
[ -n "$acs_exclude_dfs" ] && [ "$acs_exclude_dfs" -gt 0 ] &&
append base_cfg "acs_exclude_dfs=1" "$N"
- json_get_vars noscan ht_coex min_tx_power:0 tx_burst
+ json_get_vars noscan ht_coex min_tx_power:0 tx_burst mbssid mu_onoff rnr obss_interval
+ json_get_vars etxbfen:1 itxbfen:0 lpi_enable:0 sku_idx:0 beacon_dup:1
json_get_values ht_capab_list ht_capab
json_get_values channel_list channels
- [ "$auto_channel" = 0 ] && [ -z "$channel_list" ] && \
- channel_list="$channel"
-
[ "$min_tx_power" -gt 0 ] && append base_cfg "min_tx_power=$min_tx_power"
set_default noscan 0
@@ -161,20 +166,41 @@ mac80211_hostapd_setup_base() {
ht_capab=
case "$htmode" in
VHT20|HT20|HE20) ;;
- HT40*|VHT40|VHT80|VHT160|HE40|HE80|HE160)
+ HT40*|VHT40|VHT80|VHT160|HE40*|HE80|HE160)
case "$hwmode" in
a)
case "$(( (($channel / 4) + $chan_ofs) % 2 ))" in
1) ht_capab="[HT40+]";;
0) ht_capab="[HT40-]";;
esac
+ case "$htmode" in
+ HT40-|HE40-)
+ if [ "$auto_channel" -gt 0 ]; then
+ ht_capab="[HT40-]"
+ fi
+ ;;
+ esac
;;
*)
case "$htmode" in
- HT40+) ht_capab="[HT40+]";;
- HT40-) ht_capab="[HT40-]";;
+ HT40+|HE40+)
+ if [ "$channel" -gt 9 ]; then
+ echo "Could not set the center freq with this HT mode setting"
+ return 1
+ else
+ ht_capab="[HT40+]"
+ fi
+ ;;
+ HT40-|HE40-)
+ if [ "$channel" -lt 5 -a "$auto_channel" -eq 0 ]; then
+ echo "Could not set the center freq with this HT mode setting"
+ return 1
+ else
+ ht_capab="[HT40-]"
+ fi
+ ;;
*)
- if [ "$channel" -lt 7 ]; then
+ if [ "$channel" -lt 7 -o "$auto_channel" -gt 0 ]; then
ht_capab="[HT40+]"
else
ht_capab="[HT40-]"
@@ -183,7 +209,6 @@ mac80211_hostapd_setup_base() {
esac
;;
esac
- [ "$auto_channel" -gt 0 ] && ht_capab="[HT40+]"
;;
*) ieee80211n= ;;
esac
@@ -193,6 +218,10 @@ mac80211_hostapd_setup_base() {
set_default ht_coex 0
append base_cfg "ht_coex=$ht_coex" "$N"
+ [ "$ht_coex" -eq 1 ] && {
+ set_default obss_interval 300
+ append base_cfg "obss_interval=$obss_interval" "$N"
+ }
json_get_vars \
ldpc:1 \
@@ -205,7 +234,7 @@ mac80211_hostapd_setup_base() {
dsss_cck_40:1
ht_cap_mask=0
- for cap in $(iw phy "$phy" info | grep 'Capabilities:' | cut -d: -f2); do
+ for cap in $(iw phy "$phy" info | grep 'Capabilities: 0x' | cut -d: -f2); do
ht_cap_mask="$(($ht_cap_mask | $cap))"
done
@@ -271,6 +300,7 @@ mac80211_hostapd_setup_base() {
case "$channel" in
36|40|44|48|52|56|60|64) idx=50;;
100|104|108|112|116|120|124|128) idx=114;;
+ 149|153|157|161|165|169|173|177) idx=163;;
esac
fi
enable_ac=1
@@ -315,7 +345,6 @@ mac80211_hostapd_setup_base() {
vht_link_adapt:3 \
vht160:2
- set_default tx_burst 2.0
append base_cfg "ieee80211ac=1" "$N"
vht_cap=0
for cap in $(iw phy "$phy" info | awk -F "[()]" '/VHT Capabilities/ { print $2 }'); do
@@ -329,6 +358,12 @@ mac80211_hostapd_setup_base() {
[ "$rx_stbc" -lt "$cap_rx_stbc" ] && cap_rx_stbc="$rx_stbc"
vht_cap="$(( ($vht_cap & ~(0x700)) | ($cap_rx_stbc << 8) ))"
+ [ "$etxbfen" -eq 0 ] && {
+ su_beamformer=0
+ su_beamformee=0
+ mu_beamformer=0
+ }
+
mac80211_add_capabilities vht_capab $vht_cap \
RXLDPC:0x10::$rxldpc \
SHORT-GI-80:0x20::$short_gi_80 \
@@ -419,10 +454,11 @@ mac80211_hostapd_setup_base() {
he_su_beamformee:1 \
he_mu_beamformer:1 \
he_twt_required:0 \
+ he_twt_responder \
he_spr_sr_control:3 \
he_spr_psr_enabled:0 \
he_spr_non_srg_obss_pd_max_offset:0 \
- he_bss_color:128 \
+ he_bss_color \
he_bss_color_enabled:1
he_phy_cap=$(iw phy "$phy" info | sed -n '/HE Iftypes: AP/,$p' | awk -F "[()]" '/HE PHY Capabilities/ { print $2 }' | head -1)
@@ -436,6 +472,11 @@ mac80211_hostapd_setup_base() {
append base_cfg "he_oper_centr_freq_seg0_idx=$vht_center_seg0" "$N"
}
+ [ "$etxbfen" -eq 0 ] && {
+ he_su_beamformer=0
+ he_mu_beamformer=0
+ }
+
mac80211_add_he_capabilities \
he_su_beamformer:${he_phy_cap:6:2}:0x80:$he_su_beamformer \
he_su_beamformee:${he_phy_cap:8:2}:0x1:$he_su_beamformee \
@@ -443,7 +484,14 @@ mac80211_hostapd_setup_base() {
he_spr_psr_enabled:${he_phy_cap:14:2}:0x1:$he_spr_psr_enabled \
he_twt_required:${he_mac_cap:0:2}:0x6:$he_twt_required
+ if [ -n "$he_twt_responder" ]; then
+ append base_cfg "he_twt_responder=$he_twt_responder" "$N"
+ fi
if [ "$he_bss_color_enabled" -gt 0 ]; then
+ if !([ "$he_bss_color" -gt 0 ] && [ "$he_bss_color" -le 64 ]); then
+ rand=$(head -n 1 /dev/urandom | tr -dc 0-9 | head -c 2)
+ he_bss_color=$((rand % 63 + 1))
+ fi
append base_cfg "he_bss_color=$he_bss_color" "$N"
[ "$he_spr_non_srg_obss_pd_max_offset" -gt 0 ] && { \
append base_cfg "he_spr_non_srg_obss_pd_max_offset=$he_spr_non_srg_obss_pd_max_offset" "$N"
@@ -484,12 +532,21 @@ mac80211_hostapd_setup_base() {
append base_cfg "he_mu_edca_ac_vo_timer=255" "$N"
fi
+ set_default tx_burst 2
+
hostapd_prepare_device_config "$hostapd_conf_file" nl80211
cat >> "$hostapd_conf_file" <<EOF
${channel:+channel=$channel}
${channel_list:+chanlist=$channel_list}
${hostapd_noscan:+noscan=1}
${tx_burst:+tx_queue_data2_burst=$tx_burst}
+${mbssid:+mbssid=$mbssid}
+${mu_onoff:+mu_onoff=$mu_onoff}
+${itxbfen:+ibf_enable=$itxbfen}
+${lpi_enable:+lpi_enable=$lpi_enable}
+${sku_idx:+sku_idx=$sku_idx}
+${beacon_dup:+beacon_dup=$beacon_dup}
+${rnr:+rnr=$rnr}
$base_cfg
EOF
@@ -517,7 +574,7 @@ mac80211_hostapd_setup_bss() {
append hostapd_cfg "wds_sta=1" "$N"
[ -n "$wds_bridge" ] && append hostapd_cfg "wds_bridge=$wds_bridge" "$N"
}
- [ "$staidx" -gt 0 -o "$start_disabled" -eq 1 ] && append hostapd_cfg "start_disabled=1" "$N"
+ [ "$start_disabled" -eq 1 ] && append hostapd_cfg "start_disabled=1" "$N"
cat >> /var/run/hostapd-$phy.conf <<EOF
$hostapd_cfg
@@ -527,6 +584,31 @@ ${max_listen_int:+max_listen_interval=$max_listen_int}
EOF
}
+mac80211_generate_mbssid_mac() {
+ local phy="$1"
+ local transmitted_bssid="$2"
+ local id="${mbssidx:-0}"
+
+ local ref="$(cat /sys/class/ieee80211/${phy}/macaddress)"
+
+ if [ -z "$transmitted_bssid" ]; then
+ transmitted_bssid=$ref
+ fi
+
+ if [ $id -eq 0 ]; then
+ echo "$transmitted_bssid"
+ return
+ fi
+
+ local oIFS="$IFS"; IFS=":"; set -- $transmitted_bssid; IFS="$oIFS"
+
+ # Calculate nontransmitted bssid
+ b6="0x$6"
+ ref_b6=$(($b6 % $max_mbssid))
+ b6=$(($b6 - $ref_b6 + ($ref_b6 + $id) % $max_mbssid))
+ printf "%s:%s:%s:%s:%s:%02x" $1 $2 $3 $4 $5 $b6
+}
+
mac80211_get_addr() {
local phy="$1"
local idx="$(($2 + 1))"
@@ -757,7 +839,19 @@ mac80211_prepare_vif() {
json_select ..
- if [ -z "$macaddr" ]; then
+ if [ "$mbssid" -gt 0 ] && [ "$mode" == "ap" ]; then
+ [ "$mbssidx" -eq 0 ] && {
+ if [ -z $macaddr ]; then
+ transmitted_bssid="$(mac80211_generate_mac $phy)"
+ else
+ # uci set mac address
+ transmitted_bssid=$macaddr
+ fi
+ macidx="$(($macidx + 1))"
+ }
+ macaddr="$(mac80211_generate_mbssid_mac $phy $transmitted_bssid)"
+ mbssidx="$(($mbssidx + 1))"
+ elif [ -z "$macaddr" ]; then
macaddr="$(mac80211_generate_mac $phy)"
macidx="$(($macidx + 1))"
elif [ "$macaddr" = 'random' ]; then
@@ -1058,6 +1152,9 @@ mac80211_setup_vif() {
json_select ..
[ -n "$failed" ] || wireless_add_vif "$name" "$ifname"
+
+ echo "Setup SMP Affinity"
+ /sbin/smp-mt76.sh
}
get_freq() {
@@ -1122,6 +1219,25 @@ drv_mac80211_cleanup() {
hostapd_common_cleanup
}
+mac80211_count_ap() {
+ total_num_ap=$(($total_num_ap + 1))
+}
+
+country_consistent_check() {
+ local i
+ inconsistent_country=0
+ country_list="$(cat /etc/config/wireless | grep country | cut -d ' ' -f3 | tr -s "'\n" ' ')"
+ for i in $country_list
+ do
+ ret="$(echo $country_list | awk '{print ($2 == "" || $1 == $2)}')"
+ [ $ret = '0' ] && {
+ inconsistent_country=1
+ return
+ }
+ country_list="$(echo $country_list | sed -r 's/[A-Z]{2}( )*//')"
+ done
+}
+
drv_mac80211_setup() {
json_select config
json_get_vars \
@@ -1129,7 +1245,8 @@ drv_mac80211_setup() {
country chanbw distance \
txpower antenna_gain \
rxantenna txantenna \
- frag rts beacon_int:100 htmode
+ frag rts beacon_int:100 htmode \
+ sr_enable sr_enhanced
json_get_values basic_rate_list basic_rate
json_get_values scan_list scan_list
json_select ..
@@ -1180,6 +1297,7 @@ drv_mac80211_setup() {
no_ap=1
macidx=0
staidx=0
+ mbssidx=0
[ -n "$chanbw" ] && {
for file in /sys/kernel/debug/ieee80211/$phy/ath9k*/chanbw /sys/kernel/debug/ieee80211/$phy/ath5k/bwmode; do
@@ -1219,6 +1337,16 @@ drv_mac80211_setup() {
for_each_interface "sta adhoc mesh" mac80211_set_noscan
[ -n "$has_ap" ] && mac80211_hostapd_setup_base "$phy"
+ total_num_ap=0
+ max_mbssid=1
+ for_each_interface "ap" mac80211_count_ap
+ total_num_ap=$(($total_num_ap - 1))
+ while [ $total_num_ap -gt 0 ]
+ do
+ total_num_ap=$(($total_num_ap >> 1))
+ max_mbssid=$(($max_mbssid << 1))
+ done
+
mac80211_prepare_iw_htmode
for_each_interface "sta adhoc mesh monitor" mac80211_prepare_vif
NEWAPLIST=
@@ -1249,8 +1377,22 @@ drv_mac80211_setup() {
}
fi
if [ "$no_reload" != "0" ]; then
+ country_consistent_check
+ if [ "$inconsistent_country" == "1" ]; then
+ echo "ERROR: Please use the same country for all the radios."
+ wireless_setup_failed HOSTAPD_START_FAILED
+ return
+ fi
add_ap=1
ubus wait_for hostapd
+
+ # each phy sleeps different times to prevent for ubus race condition.
+ if [ "$phy" = "phy1" ]; then
+ sleep 1;
+ elif [ "$phy" = "phy2" ]; then
+ sleep 2;
+ fi
+
local hostapd_res="$(ubus call hostapd config_add "{\"iface\":\"$primary_ap\", \"config\":\"${hostapd_conf_file}\"}")"
ret="$?"
[ "$ret" != 0 -o -z "$hostapd_res" ] && {
@@ -1266,6 +1408,9 @@ drv_mac80211_setup() {
[ "${add_ap}" = 1 ] && sleep 1
for_each_interface "ap" mac80211_setup_vif
+ [ -n "$sr_enable" ] && echo "$sr_enable" > /sys/kernel/debug/ieee80211/$phy/mt76/sr_enable
+ [ -n "$sr_enhanced" ] && echo "$sr_enhanced" > /sys/kernel/debug/ieee80211/$phy/mt76/sr_enhanced_enable
+
NEWSPLIST=
NEWUMLIST=
diff --git a/package/kernel/mac80211/files/lib/wifi/mac80211.sh b/package/kernel/mac80211/files/lib/wifi/mac80211.sh
index 3ecd9322..d4b42cee 100644
--- a/package/kernel/mac80211/files/lib/wifi/mac80211.sh
+++ b/package/kernel/mac80211/files/lib/wifi/mac80211.sh
@@ -46,8 +46,13 @@ check_mac80211_device() {
__get_band_defaults() {
+ local mt7915=0
local phy="$1"
+ if (lspci | grep -q "7915"); then
+ mt7915=1
+ fi
+
( iw phy "$phy" info; echo ) | awk '
BEGIN {
bands = ""
@@ -58,7 +63,8 @@ BEGIN {
mode="NOHT"
if (ht) mode="HT20"
if (vht && band != "1:") mode="VHT80"
- if (he) mode="HE80"
+ if (he) mode="HE160"
+ if (he && mt7915) mode="HE80"
if (he && band == "1:") mode="HE20"
sub("\\[", "", channel)
sub("\\]", "", channel)
@@ -87,6 +93,11 @@ $0 ~ "HE Iftypes" {
he=1
}
+$0 ~ / *HE MAC Capabilities \(0x000000000000\)/ {
+ he=0
+}
+
+
$1 == "*" && $3 == "MHz" && $0 !~ /disabled/ && band && !channel {
channel = $4
}
@@ -120,6 +131,20 @@ get_band_defaults() {
mode_band="$band"
channel="$chan"
htmode="$mode"
+ if [ "$band" = "6g" ]
+ then
+ encryption=sae
+ key=12345678
+ sae_pwe=2
+ ieee80211w=2
+ channel=37
+ mbssid=1
+ mbo=1
+ else
+ noscan=1
+ encryption=none
+ rnr=1
+ fi
done
}
@@ -153,6 +178,10 @@ detect_mac80211() {
json_load_file /etc/board.json
+ # generate random bytes for macaddr
+ rand=$(hexdump -C /dev/urandom | head -n 1 &)
+ killall hexdump
+
for _dev in /sys/class/ieee80211/*; do
[ -e "$_dev" ] || continue
@@ -162,6 +191,13 @@ detect_mac80211() {
channel=""
htmode=""
ht_capab=""
+ encryption=""
+ noscan=""
+ key=""
+ sae_pwe=""
+ ieee80211w=""
+ mbssid=""
+ rnr=""
get_band_defaults "$dev"
@@ -192,6 +228,14 @@ detect_mac80211() {
;;
esac
+ macaddr=""
+ if (dmesg | grep -q "eeprom load fail"); then
+ for i in $(seq 2 3); do
+ macaddr=${macaddr}:$(echo $rand | cut -d ' ' -f $i)
+ done
+ macaddr="00:0$(($devidx - 1)):55:66${macaddr}"
+ fi
+
uci -q batch <<-EOF
set wireless.${name}=wifi-device
set wireless.${name}.type=mac80211
@@ -199,15 +243,43 @@ detect_mac80211() {
set wireless.${name}.channel=${channel}
set wireless.${name}.band=${mode_band}
set wireless.${name}.htmode=$htmode
- set wireless.${name}.disabled=1
+ set wireless.${name}.country='US'
+ set wireless.${name}.noscan=${noscan}
+ set wireless.${name}.disabled=0
+EOF
+ [ -n "$mbssid" ] && {
+ uci -q set wireless.${name}.mbssid=${mbssid}
+ }
+ [ -n "$rnr" ] && {
+ uci -q set wireless.${name}.rnr=${rnr}
+ }
+ uci -q batch <<-EOF
set wireless.default_${name}=wifi-iface
set wireless.default_${name}.device=${name}
set wireless.default_${name}.network=lan
set wireless.default_${name}.mode=ap
- set wireless.default_${name}.ssid=OpenWrt
- set wireless.default_${name}.encryption=none
+ set wireless.default_${name}.ssid=OpenWrt-${mode_band}
+ set wireless.default_${name}.encryption=${encryption}
EOF
+
+ # calibrated board will use eeprom macaddress, not ramdom address
+ [ -n "$macaddr" ] && {
+ uci -q set wireless.default_${name}.macaddr=${macaddr}
+ }
+
+ [ -n "$key" ] && {
+ uci -q set wireless.default_${name}.key=${key}
+ }
+ [ -n "$sae_pwe" ] && {
+ uci -q set wireless.default_${name}.sae_pwe=${sae_pwe}
+ }
+ [ -n "$ieee80211w" ] && {
+ uci -q set wireless.default_${name}.ieee80211w=${ieee80211w}
+ }
+ [ -n "$mbo" ] && {
+ uci -q set wireless.default_${name}.mbo=${mbo}
+ }
uci -q commit wireless
done
}
diff --git a/package/network/services/hostapd/files/hostapd.sh b/package/network/services/hostapd/files/hostapd.sh
index 28bd2106..723d3874 100644
--- a/package/network/services/hostapd/files/hostapd.sh
+++ b/package/network/services/hostapd/files/hostapd.sh
@@ -60,7 +60,14 @@ hostapd_append_wpa_key_mgmt() {
[ "${ieee80211w:-0}" -gt 0 ] && append wpa_key_mgmt "WPA-EAP-SHA256"
;;
sae)
- append wpa_key_mgmt "SAE"
+ case "$encryption" in
+ *sae-ext*)
+ append wpa_key_mgmt "SAE-EXT-KEY"
+ ;;
+ *)
+ append wpa_key_mgmt "SAE"
+ ;;
+ esac
[ "${ieee80211r:-0}" -gt 0 ] && append wpa_key_mgmt "FT-SAE"
;;
psk-sae)
@@ -115,6 +122,7 @@ hostapd_common_add_device_config() {
config_add_int rts_threshold
config_add_int rssi_reject_assoc_rssi
config_add_int rssi_ignore_probe_request
+ config_add_int rssi_reject_assoc_timeout
config_add_int maxassoc
config_add_string acs_chan_bias
@@ -225,8 +233,10 @@ hostapd_prepare_device_config() {
hostapd_add_rate brlist "$br"
done
+ json_get_vars rssi_reject_assoc_timeout
[ -n "$rssi_reject_assoc_rssi" ] && append base_cfg "rssi_reject_assoc_rssi=$rssi_reject_assoc_rssi" "$N"
[ -n "$rssi_ignore_probe_request" ] && append base_cfg "rssi_ignore_probe_request=$rssi_ignore_probe_request" "$N"
+ [ -n "$rssi_reject_assoc_timeout" ] && append base_cfg "rssi_reject_assoc_timeout=$rssi_reject_assoc_timeout" "$N"
[ -n "$beacon_rate" ] && append base_cfg "beacon_rate=$beacon_rate" "$N"
[ -n "$rlist" ] && append base_cfg "supported_rates=$rlist" "$N"
[ -n "$brlist" ] && append base_cfg "basic_rates=$brlist" "$N"
@@ -376,6 +386,24 @@ hostapd_common_add_bss_config() {
config_add_string fils_dhcp
config_add_int ocv
+
+ config_add_int disable_he
+ config_add_int disable_vht
+ config_add_int disable_ht
+
+ config_add_boolean beacon_prot interworking
+
+ config_add_int unsol_bcast_probe_resp_interval
+ config_add_int fils_discovery_min_interval
+ config_add_int fils_discovery_max_interval
+ config_add_boolean rnr
+
+ config_add_array sae_groups
+ config_add_array owe_groups
+ config_add_array pairwise
+ config_add_string group_cipher
+ config_add_string group_mgmt_cipher
+
}
hostapd_set_vlan_file() {
@@ -440,11 +468,11 @@ append_iw_nai_realm() {
}
append_iw_venue_name() {
- append bss_conf "venue_name=$1" "$N"
+ [ -n "$1" ] && append bss_conf "venue_name=$1" "$N"
}
append_iw_venue_url() {
- append bss_conf "venue_url=$1" "$N"
+ [ -n "$1" ] && append bss_conf "venue_url=$1" "$N"
}
append_hs20_oper_friendly_name() {
@@ -562,7 +590,8 @@ hostapd_set_bss_options() {
ppsk airtime_bss_weight airtime_bss_limit airtime_sta_weight \
multicast_to_unicast_all proxy_arp per_sta_vif \
eap_server eap_user_file ca_cert server_cert private_key private_key_passwd server_id \
- vendor_elements fils ocv
+ vendor_elements fils ocv unsol_bcast_probe_resp_interval fils_discovery_min_interval \
+ fils_discovery_max_interval rnr group_cipher group_mgmt_cipher
set_default fils 0
set_default isolate 0
@@ -790,6 +819,36 @@ hostapd_set_bss_options() {
local auth_algs="$((($auth_mode_shared << 1) | $auth_mode_open))"
append bss_conf "auth_algs=${auth_algs:-1}" "$N"
append bss_conf "wpa=$wpa" "$N"
+
+ json_get_values pairwise pairwise
+ json_get_vars group_cipher
+ if [ -n "$pairwise" ]; then
+ case "$pairwise" in
+ *tkip+aes|*tkip+ccmp|*aes+tkip|*ccmp+tkip)
+ wpa_cipher="CCMP TKIP"
+ ;;
+ *ccmp256)
+ wpa_cipher="CCMP-256"
+ ;;
+ *aes|*ccmp)
+ wpa_cipher="CCMP"
+ ;;
+ *tkip)
+ wpa_cipher="TKIP"
+ ;;
+ *gcmp256)
+ wpa_cipher="GCMP-256"
+ ;;
+ *gcmp)
+ wpa_cipher="GCMP"
+ ;;
+ *)
+ wpa_cipher=""
+ ;;
+ esac
+ fi
+ [ -n "$wpa_cipher" ] && wpa_pairwise="$wpa_cipher"
+
[ -n "$wpa_pairwise" ] && append bss_conf "wpa_pairwise=$wpa_pairwise" "$N"
set_default wps_pushbutton 0
@@ -841,7 +900,7 @@ hostapd_set_bss_options() {
}
append bss_conf "ssid=$ssid" "$N"
- [ -n "$network_bridge" ] && append bss_conf "bridge=$network_bridge${N}wds_bridge=" "$N"
+ [ -n "$network_bridge" ] && append bss_conf "bridge=$network_bridge${N}wds_bridge=$network_bridge" "$N"
[ -n "$network_ifname" ] && append bss_conf "snoop_iface=$network_ifname" "$N"
[ -n "$iapp_interface" ] && {
local ifname
@@ -954,6 +1013,8 @@ hostapd_set_bss_options() {
fi
if [ "$wpa" -ge "2" ]; then
+ json_get_values sae_groups sae_groups
+ json_get_values owe_groups owe_groups
if [ -n "$network_bridge" -a "$rsn_preauth" = 1 ]; then
set_default auth_cache 1
append bss_conf "rsn_preauth=1" "$N"
@@ -972,17 +1033,52 @@ hostapd_set_bss_options() {
append bss_conf "okc=$auth_cache" "$N"
[ "$auth_cache" = 0 -a "$fils" = 0 ] && append bss_conf "disable_pmksa_caching=1" "$N"
+ [ -z "$group_cipher" ] && group_cipher="$wpa_cipher"
+
+ if [ -n "$sae_groups" -o -n "$owe_groups" ]; then
+ case "$auth_type" in
+ sae*)
+ append bss_conf "sae_groups=$sae_groups" "$N"
+ append bss_conf "group_cipher=$group_cipher" "$N"
+ ;;
+ owe)
+ append bss_conf "owe_groups=$owe_groups" "$N"
+ append bss_conf "group_cipher=$group_cipher" "$N"
+ ;;
+ esac
+ fi
+
# RSN -> allow management frame protection
case "$ieee80211w" in
[012])
- json_get_vars ieee80211w_mgmt_cipher ieee80211w_max_timeout ieee80211w_retry_timeout
+ json_get_vars ieee80211w_mgmt_cipher ieee80211w_max_timeout ieee80211w_retry_timeout beacon_prot
append bss_conf "ieee80211w=$ieee80211w" "$N"
[ "$ieee80211w" -gt "0" ] && {
+ if [ -z "$group_mgmt_cipher" ]; then
+ case "$group_cipher" in
+ CCMP-256)
+ ieee80211w_mgmt_cipher="BIP-CMAC-256"
+ ;;
+ CCMP)
+ ieee80211w_mgmt_cipher="AES-128-CMAC"
+ ;;
+ GCMP-256)
+ ieee80211w_mgmt_cipher="BIP-GMAC-256"
+ ;;
+ GCMP)
+ ieee80211w_mgmt_cipher="BIP-GMAC-128"
+ ;;
+ esac
+ else
+ ieee80211w_mgmt_cipher="$group_mgmt_cipher"
+ fi
if [ "$auth_type" = "eap192" ]; then
append bss_conf "group_mgmt_cipher=BIP-GMAC-256" "$N"
else
append bss_conf "group_mgmt_cipher=${ieee80211w_mgmt_cipher:-AES-128-CMAC}" "$N"
fi
+ [ -n "$beacon_prot" ] && \
+ append bss_conf "beacon_prot=$beacon_prot" "$N"
[ -n "$ieee80211w_max_timeout" ] && \
append bss_conf "assoc_sa_query_max_timeout=$ieee80211w_max_timeout" "$N"
[ -n "$ieee80211w_retry_timeout" ] && \
@@ -1047,9 +1143,10 @@ hostapd_set_bss_options() {
json_get_vars iw_roaming_consortium iw_domain_name iw_anqp_3gpp_cell_net iw_nai_realm
json_get_vars iw_anqp_elem iw_qos_map_set iw_ipaddr_type_availability iw_gas_address3
json_get_vars iw_venue_name iw_venue_url
+ json_get_vars interworking
set_default iw_enabled 0
- if [ "$iw_enabled" = "1" ]; then
+ if [ "$iw_enabled" = "1" ] || [ "$interworking" = "1" ]; then
append bss_conf "interworking=1" "$N"
set_default iw_internet 1
set_default iw_asra 0
@@ -1156,6 +1253,22 @@ hostapd_set_bss_options() {
append bss_conf "$val" "$N"
done
+ if [ "$unsol_bcast_probe_resp_interval" -gt 0 ]; then
+ append bss_conf "unsol_bcast_probe_resp_interval=$unsol_bcast_probe_resp_interval" "$N"
+ fi
+
+ if [ -n "$fils_discovery_min_interval" ]; then
+ append bss_conf "fils_discovery_min_interval=$fils_discovery_min_interval" "$N"
+ fi
+
+ if [ -n "$fils_discovery_max_interval" ]; then
+ append bss_conf "fils_discovery_max_interval=$fils_discovery_max_interval" "$N"
+ fi
+
+ if [ -n "$rnr" ]; then
+ append bss_conf "rnr=$rnr" "$N"
+ fi
+
bss_md5sum="$(echo $bss_conf | md5sum | cut -d" " -f1)"
append bss_conf "config_id=$bss_md5sum" "$N"
@@ -1246,6 +1359,7 @@ wpa_supplicant_prepare_interface() {
country_str="country=$country"
}
+ local tx_queue_data2_burst="tx_queue_data2_burst=0"
multiap_flag_file="${_config}.is_multiap"
if [ "$multi_ap" = "1" ]; then
touch "$multiap_flag_file"
@@ -1257,6 +1371,7 @@ wpa_supplicant_prepare_interface() {
${scan_list:+freq_list=$scan_list}
$ap_scan
$country_str
+$tx_queue_data2_burst
EOF
return 0
}
@@ -1528,12 +1643,39 @@ wpa_supplicant_add_network() {
;;
esac
- [ "$wpa_cipher" = GCMP ] && {
- append network_data "pairwise=GCMP" "$N$T"
- append network_data "group=GCMP" "$N$T"
- }
+ json_get_values pairwise pairwise
+ json_get_vars group_cipher group_mgmt_cipher
+ if [ -n "$pairwise" ]; then
+ case "$pairwise" in
+ *tkip+aes|*tkip+ccmp|*aes+tkip|*ccmp+tkip)
+ wpa_cipher="CCMP TKIP"
+ ;;
+ *ccmp256)
+ wpa_cipher="CCMP-256"
+ ;;
+ *aes|*ccmp)
+ wpa_cipher="CCMP"
+ ;;
+ *tkip)
+ wpa_cipher="TKIP"
+ ;;
+ *gcmp256)
+ wpa_cipher="GCMP-256"
+ ;;
+ *gcmp)
+ wpa_cipher="GCMP"
+ ;;
+ *)
+ wpa_cipher=""
+ ;;
+ esac
+ fi
+ [ -n "$wpa_cipher" ] && wpa_pairwise="$wpa_cipher"
[ "$mode" = mesh ] || {
+ json_get_values sae_groups sae_groups
+ json_get_values owe_groups owe_groups
+
case "$wpa" in
1)
append network_data "proto=WPA" "$N$T"
@@ -1543,12 +1685,58 @@ wpa_supplicant_add_network() {
;;
esac
+ [ -n "$wpa_pairwise" ] && append network_data "pairwise=$wpa_pairwise" "$N$T"
+ [ -z "$group_cipher" ] && group_cipher="$wpa_cipher"
+
+ if [ -n "$sae_groups" -o -n "$owe_groups" ]; then
+ case "$auth_type" in
+ sae*)
+ echo "sae_groups=$sae_groups" >> "$_config"
+ append network_data "group=$group_cipher" "$N$T"
+ ;;
+ owe)
+ append network_data "owe_group=$owe_groups" "$N$T"
+ append network_data "group=$group_cipher" "$N$T"
+ ;;
+ esac
+ fi
+
+ # RSN -> allow management frame protection
case "$ieee80211w" in
[012])
- [ "$wpa" -ge 2 ] && append network_data "ieee80211w=$ieee80211w" "$N$T"
+ json_get_vars ieee80211w_mgmt_cipher ieee80211w_max_timeout ieee80211w_retry_timeout beacon_prot
+ append network_data "ieee80211w=$ieee80211w" "$N$T"
+ [ "$ieee80211w" -gt "0" ] && {
+ if [ -z "$group_mgmt_cipher" ]; then
+ case "$group_cipher" in
+ CCMP-256)
+ ieee80211w_mgmt_cipher="BIP-CMAC-256"
+ ;;
+ CCMP)
+ ieee80211w_mgmt_cipher="AES-128-CMAC"
+ ;;
+ GCMP-256)
+ ieee80211w_mgmt_cipher="BIP-GMAC-256"
+ ;;
+ GCMP)
+ ieee80211w_mgmt_cipher="BIP-GMAC-128"
+ ;;
+ esac
+ else
+ ieee80211w_mgmt_cipher="$group_mgmt_cipher"
+ fi
+ if [ "$auth_type" = "eap192" ]; then
+ append network_data "group_mgmt=BIP-GMAC-256" "$N$T"
+ else
+ append network_data "group_mgmt=${ieee80211w_mgmt_cipher:-AES-128-CMAC}" "$N$T"
+ fi
+ [ -n "$beacon_prot" ] && \
+ append network_data "beacon_prot=$beacon_prot" "$N$T"
+ }
;;
esac
}
+
[ -n "$bssid" ] && append network_data "bssid=$bssid" "$N$T"
[ -n "$beacon_int" ] && append network_data "beacon_int=$beacon_int" "$N$T"
@@ -1559,6 +1747,17 @@ wpa_supplicant_add_network() {
[ -n "$bssid_blacklist" ] && append network_data "bssid_blacklist=$bssid_blacklist" "$N$T"
[ -n "$bssid_whitelist" ] && append network_data "bssid_whitelist=$bssid_whitelist" "$N$T"
+ local disable_he
+ local disable_vht
+ local disable_ht
+ json_get_vars disable_he
+ json_get_vars disable_vht
+ json_get_vars disable_ht
+
+ [ -n "$disable_he" ] && append network_data "disable_he=$disable_he" "$N$T"
+ [ -n "$disable_vht" ] && append network_data "disable_vht=$disable_vht" "$N$T"
+ [ -n "$disable_ht" ] && append network_data "disable_ht=$disable_ht" "$N$T"
+
[ -n "$basic_rate" ] && {
local br rate_list=
for br in $basic_rate; do
@@ -1573,6 +1772,11 @@ wpa_supplicant_add_network() {
append network_data "mcast_rate=$mc_rate" "$N$T"
}
+ if [ "$auth_type" = "sae" ]; then
+ json_get_vars sae_pwe sae_pwe
+ [ -n "$sae_pwe" ] && echo "sae_pwe=$sae_pwe" >> "$_config"
+ fi
+
if [ "$key_mgmt" = "WPS" ]; then
echo "wps_cred_processing=1" >> "$_config"
else