blob: d026a3debfaa431b0b504e7b16511174b034de39 [file] [log] [blame]
diff --git a/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh b/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh
index 5aaba9a..54a5d88 100644
--- a/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh
+++ b/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh
@@ -160,8 +160,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 +205,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 +236,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 +245,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 +256,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 +277,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 +316,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"
}
@@ -410,7 +441,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
@@ -484,6 +515,31 @@ mac80211_hostapd_setup_base() {
append base_cfg "he_mu_edca_ac_vo_timer=255" "$N"
fi
+ # 802.11be
+ enable_be=0
+ case "$htmode" in
+ EHT*) enable_be=1 ;;
+ esac
+
+ if [ "$enable_be" != "0" ]; then
+ append base_cfg "ieee80211be=1" "$N"
+ append base_cfg "eht_su_beamformer=1" "$N"
+ append base_cfg "eht_su_beamformee=1" "$N"
+ append base_cfg "eht_mu_beamformer=1" "$N"
+ [ "$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}
diff --git a/package/kernel/mac80211/files/lib/wifi/mac80211.sh b/package/kernel/mac80211/files/lib/wifi/mac80211.sh
index 10a3f8b..80cd298 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
}
@@ -160,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
@@ -205,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
@@ -221,6 +237,8 @@ detect_mac80211() {
set wireless.default_${name}.ssid=OpenWrt
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}