blob: a8e85c0abfe1369f7ed6e4dd09b5199329c1b26d [file] [log] [blame]
diff --git a/package/kernel/mac80211/Makefile b/package/kernel/mac80211/Makefile
index 02cf715d..d878cb2a 100644
--- a/package/kernel/mac80211/Makefile
+++ b/package/kernel/mac80211/Makefile
@@ -20,6 +20,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 = \
@@ -72,6 +73,10 @@ config-y:= \
WLAN_VENDOR_ST \
WLAN_VENDOR_TI \
WLAN_VENDOR_ZYDAS \
+ MAC80211_DEBUG_MENU \
+ MAC80211_MLME_DEBUG \
+ MAC80211_STA_DEBUG \
+ MAC80211_HT_DEBUG \
config-$(call config_package,cfg80211) += CFG80211
config-$(CONFIG_PACKAGE_CFG80211_TESTMODE) += NL80211_TESTMODE
@@ -297,6 +302,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 5aaba9af..ce30b61d 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
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,10 @@ 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
config_add_int \
beamformer_antennas \
beamformee_antennas \
@@ -140,13 +144,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
+ json_get_vars etxbfen:1 itxbfen: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
@@ -160,8 +162,8 @@ mac80211_hostapd_setup_base() {
ieee80211n=1
ht_capab=
case "$htmode" in
- VHT20|HT20|HE20) ;;
- HT40*|VHT40|VHT80|VHT160|HE40|HE80|HE160)
+ VHT20|HT20|HE20|EHT20) ;;
+ HT40*|VHT40|VHT80|VHT160|HE40|HE80|HE160|EHT40|EHT80|EHT160|EHT320*)
case "$hwmode" in
a)
case "$(( (($channel / 4) + $chan_ofs) % 2 ))" in
@@ -205,7 +207,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
@@ -236,8 +238,8 @@ mac80211_hostapd_setup_base() {
idx="$channel"
case "$htmode" in
- VHT20|HE20) enable_ac=1;;
- VHT40|HE40)
+ VHT20|HE20|EHT20) enable_ac=1;;
+ VHT40|HE40|EHT40)
case "$(( (($channel / 4) + $chan_ofs) % 2 ))" in
1) idx=$(($channel + 2));;
0) idx=$(($channel - 2));;
@@ -245,7 +247,7 @@ mac80211_hostapd_setup_base() {
enable_ac=1
vht_center_seg0=$idx
;;
- VHT80|HE80)
+ VHT80|HE80|EHT80)
case "$(( (($channel / 4) + $chan_ofs) % 4 ))" in
1) idx=$(($channel + 6));;
2) idx=$(($channel + 2));;
@@ -256,7 +258,7 @@ mac80211_hostapd_setup_base() {
vht_oper_chwidth=1
vht_center_seg0=$idx
;;
- VHT160|HE160)
+ VHT160|HE160|EHT160)
if [ "$band" = "6g" ]; then
case "$channel" in
1|5|9|13|17|21|25|29) idx=15;;
@@ -277,6 +279,36 @@ mac80211_hostapd_setup_base() {
vht_oper_chwidth=2
vht_center_seg0=$idx
;;
+ EHT320*)
+ case "$channel" in
+ 1|5|9|13|17|21|25|29) idx=31;;
+ 33|37|41|45|49|53|57|61| \
+ 65|69|73|77|81|85|89|93) idx=63;;
+ 97|101|105|109|113|117|121|125| \
+ 129|133|137|141|145|149|153|157) idx=127;;
+ 161|165|169|173|177|181|185|189| \
+ 193|197|201|205|209|213|217|221) idx=191;;
+ esac
+ if [[ "$htmode" = "EHT320-1" && "$channel" -ge "193" ]] ||
+ [[ "$htmode" = "EHT320-2" && "$channel" -le "29" ]]; then
+ echo "Could not set the center freq with this EHT setting"
+ return 1
+ elif [[ "$htmode" = "EHT320-1" && "$channel" -ge "33" ]]; then
+ if [ "$channel" -gt $idx ]; then
+ idx=$(($idx + 32))
+ else
+ idx=$(($idx - 32))
+ fi
+ fi
+ vht_oper_chwidth=2
+ if [ "$channel" -gt $idx ]; then
+ vht_center_seg0=$(($idx + 16))
+ else
+ vht_center_seg0=$(($idx - 16))
+ fi
+ eht_oper_chwidth=9
+ eht_oper_centr_freq_seg0_idx=$idx
+ ;;
esac
[ "$band" = "5g" ] && {
json_get_vars background_radar:0
@@ -286,8 +318,9 @@ mac80211_hostapd_setup_base() {
[ "$band" = "6g" ] && {
op_class=
case "$htmode" in
- HE20) op_class=131;;
- HE*) op_class=$((132 + $vht_oper_chwidth))
+ HE20|EHT20) op_class=131;;
+ EHT320*) op_class=137;;
+ HE*|EHT*) op_class=$((132 + $vht_oper_chwidth))
esac
[ -n "$op_class" ] && append base_cfg "op_class=$op_class" "$N"
}
@@ -315,7 +348,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 +361,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 \
@@ -410,7 +448,7 @@ mac80211_hostapd_setup_base() {
# 802.11ax
enable_ax=0
case "$htmode" in
- HE*) enable_ax=1 ;;
+ HE*|EHT*) enable_ax=1 ;;
esac
if [ "$enable_ax" != "0" ]; then
@@ -419,10 +457,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 +475,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 +487,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 [ -z "$he_bss_color" ]; 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 +535,46 @@ mac80211_hostapd_setup_base() {
append base_cfg "he_mu_edca_ac_vo_timer=255" "$N"
fi
+ set_default tx_burst 5.9
+
+ # 802.11be
+ enable_be=0
+ case "$htmode" in
+ EHT*) enable_be=1 ;;
+ esac
+
+ if [ "$enable_be" != "0" ]; then
+ append base_cfg "ieee80211be=1" "$N"
+ if [ "$etxbfen" -eq 0 ]; then
+ append base_cfg "eht_su_beamformee=1" "$N"
+ else
+ append base_cfg "eht_su_beamformer=1" "$N"
+ append base_cfg "eht_su_beamformee=1" "$N"
+ append base_cfg "eht_mu_beamformer=1" "$N"
+ fi
+ [ "$hwmode" = "a" ] && {
+ case $htmode in
+ EHT320*)
+ append base_cfg "eht_oper_chwidth=$eht_oper_chwidth" "$N"
+ append base_cfg "eht_oper_centr_freq_seg0_idx=$eht_oper_centr_freq_seg0_idx" "$N"
+ ;;
+ *)
+ append base_cfg "eht_oper_chwidth=$vht_oper_chwidth" "$N"
+ append base_cfg "eht_oper_centr_freq_seg0_idx=$vht_center_seg0" "$N"
+ ;;
+ esac
+ }
+ fi
+
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}
$base_cfg
EOF
@@ -517,7 +602,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 +612,34 @@ ${max_listen_int:+max_listen_interval=$max_listen_int}
EOF
}
+mac80211_generate_mbssid_mac() {
+ local phy="$1"
+ local transmitted_bssid="$2"
+ local id="${macidx:-0}"
+
+ local ref="$(cat /sys/class/ieee80211/${phy}/macaddress)"
+ local mask="$(cat /sys/class/ieee80211/${phy}/address_mask)"
+
+ 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
+ macidx=$(($id + 1))
+ mbssid_idx=$(($macidx - 1))
+ b6="0x$6"
+ ref_b6=$(($b6 % $max_mbssid))
+ b6=$(($b6 - $ref_b6 + ($ref_b6 + $mbssid_idx) % $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 +870,13 @@ mac80211_prepare_vif() {
json_select ..
- if [ -z "$macaddr" ]; then
+ if [ "$mbssid" -gt 0 ]; then
+ [ "$macidx" -eq 0 ] && {
+ transmitted_bssid=$macaddr
+ }
+ macaddr="$(mac80211_generate_mbssid_mac $phy $transmitted_bssid)"
+ macidx="$(($macidx + 1))"
+ elif [ -z "$macaddr" ]; then
macaddr="$(mac80211_generate_mac $phy)"
macidx="$(($macidx + 1))"
elif [ "$macaddr" = 'random' ]; then
@@ -1058,6 +1177,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 +1244,10 @@ drv_mac80211_cleanup() {
hostapd_common_cleanup
}
+mac80211_count_ap() {
+ total_num_ap=$(($total_num_ap + 1))
+}
+
drv_mac80211_setup() {
json_select config
json_get_vars \
@@ -1219,6 +1345,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=
diff --git a/package/kernel/mac80211/files/lib/wifi/mac80211.sh b/package/kernel/mac80211/files/lib/wifi/mac80211.sh
index e24a2a63..80cd298c 100644
--- a/package/kernel/mac80211/files/lib/wifi/mac80211.sh
+++ b/package/kernel/mac80211/files/lib/wifi/mac80211.sh
@@ -60,6 +60,8 @@ BEGIN {
if (vht && band != "1:") mode="VHT80"
if (he) mode="HE80"
if (he && band == "1:") mode="HE20"
+ if (eht) mode="EHT80"
+ if (eht && band == "1:") mode="EHT20"
sub("\\[", "", channel)
sub("\\]", "", channel)
bands = bands band channel ":" mode " "
@@ -73,6 +75,7 @@ $1 == "Band" {
vht = ""
ht = ""
he = ""
+ eht = ""
}
$0 ~ "Capabilities:" {
@@ -87,6 +90,10 @@ $0 ~ "HE Iftypes" {
he=1
}
+$0 ~ "EHT Iftypes" {
+ eht=1
+}
+
$1 == "*" && $3 == "MHz" && $0 !~ /disabled/ && band && !channel {
channel = $4
}
@@ -120,6 +127,13 @@ get_band_defaults() {
mode_band="$band"
channel="$chan"
htmode="$mode"
+ if [ "$band" = "6g" ]
+ then
+ encryption=sae
+ key=12345678
+ else
+ encryption=none
+ fi
done
}
@@ -153,6 +167,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 +180,8 @@ detect_mac80211() {
channel=""
htmode=""
ht_capab=""
+ encryption=""
+ key=""
get_band_defaults "$dev"
@@ -196,6 +216,11 @@ detect_mac80211() {
;;
esac
+ macaddr=""
+ for i in $(seq 2 3); do
+ macaddr=${macaddr}:$(echo $rand | cut -d ' ' -f $i)
+ done
+
uci -q batch <<-EOF
set wireless.${name}=wifi-device
set wireless.${name}.type=mac80211
@@ -210,8 +235,14 @@ detect_mac80211() {
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}.encryption=${encryption}
+
+ set wireless.default_${name}.macaddr=00:0$(($devidx - 1)):55:66${macaddr}
+
EOF
+ [ -n "$key" ] && {
+ uci -q set wireless.default_${name}.key=${key}
+ }
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..5e21d0d6 100644
--- a/package/network/services/hostapd/files/hostapd.sh
+++ b/package/network/services/hostapd/files/hostapd.sh
@@ -376,6 +376,13 @@ hostapd_common_add_bss_config() {
config_add_string fils_dhcp
config_add_int ocv
+
+ config_add_int disable_eht
+ config_add_int disable_he
+ config_add_int disable_vht
+ config_add_int disable_ht
+
+ config_add_boolean beacon_prot
}
hostapd_set_vlan_file() {
@@ -975,7 +982,7 @@ hostapd_set_bss_options() {
# 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 [ "$auth_type" = "eap192" ]; then
@@ -983,6 +990,8 @@ hostapd_set_bss_options() {
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" ] && \
@@ -1559,6 +1568,20 @@ 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_eht
+ local disable_he
+ local disable_vht
+ local disable_ht
+ json_get_vars disable_eht
+ json_get_vars disable_he
+ json_get_vars disable_vht
+ json_get_vars disable_ht
+
+ [ -n "$disable_eht" ] && append network_data "disable_eht=$disable_eht" "$N$T"
+ [ -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 +1596,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