blob: d8ae424ae173580742c31c19001b37ce851ee1cb [file] [log] [blame]
diff --git a/package/network/config/wifi-scripts/files/lib/netifd/hostapd.sh b/package/network/config/wifi-scripts/files/lib/netifd/hostapd.sh
index 3537e3a..3664297 100644
--- a/package/network/config/wifi-scripts/files/lib/netifd/hostapd.sh
+++ b/package/network/config/wifi-scripts/files/lib/netifd/hostapd.sh
@@ -412,6 +412,10 @@ hostapd_common_add_bss_config() {
config_add_string group_cipher
config_add_string group_mgmt_cipher
+ config_add_int assoc_phy
+ config_add_int mld_id mld_assoc_phy mld_allowed_phy_bitmap mld_allowed_links
+ config_add_boolean mld_primary mld_single_link
+ config_add_string mld_addr
}
hostapd_set_vlan_file() {
@@ -599,7 +603,8 @@ hostapd_set_bss_options() {
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 unsol_bcast_probe_resp_interval fils_discovery_min_interval \
- fils_discovery_max_interval rnr group_cipher group_mgmt_cipher
+ fils_discovery_max_interval rnr group_cipher group_mgmt_cipher \
+ mld_id mld_primary mld_addr mld_allowed_links
set_default fils 0
set_default isolate 0
@@ -626,7 +631,10 @@ hostapd_set_bss_options() {
/usr/sbin/hostapd -vfils || fils=0
- append bss_conf "ctrl_interface=/var/run/hostapd"
+ if [ -z $mld_id ] || [ "$mld_primary" = "1" ]; then
+ append bss_conf "ctrl_interface=/var/run/hostapd"
+ fi
+
if [ "$isolate" -gt 0 ]; then
append bss_conf "ap_isolate=$isolate" "$N"
fi
@@ -1282,6 +1290,25 @@ hostapd_set_bss_options() {
append bss_conf "rnr=$rnr" "$N"
fi
+ if [ -n "$mld_id" ]; then
+ if !([ "$mld_id" -ge 0 ] && [ "$mld_id" -le 255 ]); then
+ echo "Invalid mld_id: ${mld_id}"
+ return 1
+ fi
+ append bss_conf "mld_ap=1" "$N"
+ if [ -n "$mld_addr" ]; then
+ append bss_conf "mld_addr=$mld_addr" "$N"
+ fi
+ fi
+
+ if [ "$mld_primary" -gt 0 ]; then
+ append bss_conf "mld_primary=${mld_primary}" "$N"
+ fi
+
+ if [ "$mld_allowed_links" -gt 0 ]; then
+ append bss_conf "mld_allowed_links=${mld_allowed_links}" "$N"
+ fi
+
append "$var" "$bss_conf" "$N"
return 0
}
@@ -1337,7 +1364,8 @@ wpa_supplicant_prepare_interface() {
_wpa_supplicant_common "$1"
- json_get_vars mode wds multi_ap
+ json_get_vars mode wds multi_ap assoc_phy mld_single_link mld_assoc_phy mld_allowed_phy_bitmap
+ set_default mld_allowed_phy_bitmap 0
[ -n "$network_bridge" ] && {
fail=
@@ -1369,6 +1397,55 @@ wpa_supplicant_prepare_interface() {
country_str="country=$country"
}
+ local mld_force_single_link=
+ [ -n "$mld_single_link" ] && {
+ mld_force_single_link=$mld_single_link
+ }
+
+ if !([ "$mld_allowed_phy_bitmap" -ge 0 ] && [ "$mld_allowed_phy_bitmap" -le 7 ]); then
+ echo "Error: Invalid MLD allowed phy: ${mld_allowed_phy_bitmap}"
+ return 1
+ fi
+
+ local phy0_scan_list="2412 2417 2422 2427 2432 2437 2442 2447 2452 2457 2462 2467 2472"
+ local phy1_scan_list="5180 5200 5220 5240 5260 5280 5300 5320 5500 5520 5540 5560 5580 5600 5620 5640 5660 5680 5700 5720 5745 5765 5785 5805 5825 5845 5865 5885"
+ local phy2_scan_list="5955 5975 5995 6015 6035 6055 6075 6095 6115 6135 6155 6175 6195 6215 6235 6255 6275 6295 6315 6335 6355 6375 6395 6415 6435 6455 6475 6495 6515 6535 6555 6575 6595 6615 6635 6655 6675 6695 6715 6735 6755 6775 6795 6815 6835 6855 6875 6895"
+ local scan_list=
+ if [ $mld_allowed_phy_bitmap -gt 0 ] && [ $mld_allowed_phy_bitmap -lt 7 ]; then
+ [ $(($mld_allowed_phy_bitmap & 1)) -ne 0 ] && {
+ scan_list="$scan_list $phy0_scan_list"
+ }
+
+ [ $(($mld_allowed_phy_bitmap & 2)) -ne 0 ] && {
+ scan_list="$scan_list $phy1_scan_list"
+ }
+
+ [ $(($mld_allowed_phy_bitmap & 4)) -ne 0 ] && {
+ scan_list="$scan_list $phy2_scan_list"
+ }
+ elif [ "$mld_allowed_phy_bitmap" -eq 0 ]; then
+ # For Legacy STA
+ if [ "$phy" = "phy0" ]; then
+ scan_list="$phy0_scan_list"
+ elif [ "$phy" = "phy1" ]; then
+ scan_list="$phy1_scan_list"
+ elif [ "$phy" = "phy2" ]; then
+ scan_list="$phy2_scan_list"
+ fi
+ fi
+
+ [ -n "$assoc_phy" ] && mld_assoc_phy=$assoc_phy
+
+ local mld_connect_band_pref=
+ if [ -n "$mld_assoc_phy" ]; then
+ if [ $(($mld_allowed_phy_bitmap & $((1<<$mld_assoc_phy)))) -eq 0 ]; then
+ echo "Error: Conflict between preferred association phy and allowed phy"
+ return 1
+ fi
+
+ mld_connect_band_pref=$(($mld_assoc_phy+1))
+ fi
+
local tx_queue_data2_burst="tx_queue_data2_burst=0"
multiap_flag_file="${_config}.is_multiap"
if [ "$multi_ap" = "1" ]; then
@@ -1382,6 +1459,9 @@ ${scan_list:+freq_list=$scan_list}
$ap_scan
$country_str
$tx_queue_data2_burst
+${mld_connect_band_pref:+mld_connect_band_pref=$mld_connect_band_pref}
+${mld_force_single_link:+mld_force_single_link=$mld_force_single_link}
+${mld_allowed_phy_bitmap:+mld_allowed_phy=$mld_allowed_phy_bitmap}
EOF
return 0
}
diff --git a/package/network/config/wifi-scripts/files/lib/netifd/wireless/mac80211.sh b/package/network/config/wifi-scripts/files/lib/netifd/wireless/mac80211.sh
index 66bdf5c..35d317f 100755
--- a/package/network/config/wifi-scripts/files/lib/netifd/wireless/mac80211.sh
+++ b/package/network/config/wifi-scripts/files/lib/netifd/wireless/mac80211.sh
@@ -29,7 +29,7 @@ drv_mac80211_init_device_config() {
config_add_string path phy 'macaddr:macaddr'
config_add_string tx_burst
config_add_string distance
- config_add_int mbssid mu_onoff sr_enable sr_enhanced rnr obss_interval
+ config_add_int mbssid mu_onoff sr_enable sr_enhanced rnr obss_interval band_idx
config_add_int beacon_int chanbw frag rts
config_add_int rxantenna txantenna txpower min_tx_power
config_add_int num_global_macaddr multiple_bssid
@@ -71,7 +71,9 @@ 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 \
+ pp_bitmap \
+ pp_mode
config_add_boolean \
ldpc \
greenfield \
@@ -92,6 +94,7 @@ drv_mac80211_init_iface_config() {
config_add_int max_listen_int
config_add_int dtim_period
config_add_int start_disabled
+ config_add_int vif_txpower
# mesh
config_add_string mesh_id
@@ -147,7 +150,7 @@ 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 mbssid mu_onoff rnr obss_interval
+ json_get_vars noscan ht_coex min_tx_power:0 tx_burst mbssid mu_onoff rnr obss_interval band_idx
json_get_vars etxbfen:1 itxbfen:0
json_get_values ht_capab_list ht_capab
json_get_values channel_list channels
@@ -376,7 +379,7 @@ mac80211_hostapd_setup_base() {
mu_beamformee:1 \
vht_txop_ps:1 \
htc_vht:1 \
- beamformee_antennas:4 \
+ beamformee_antennas:5 \
beamformer_antennas:4 \
rx_antenna_pattern:1 \
tx_antenna_pattern:1 \
@@ -435,7 +438,7 @@ mac80211_hostapd_setup_base() {
}
[ "$(($vht_cap & 0x1000))" -gt 0 -a "$su_beamformee" -gt 0 ] && {
- cap_ant="$(( ( ($vht_cap >> 13) & 3 ) + 1 ))"
+ cap_ant="$(( ( ($vht_cap >> 13) & 7 ) + 1 ))"
[ "$cap_ant" -gt "$beamformee_antennas" ] && cap_ant="$beamformee_antennas"
[ "$cap_ant" -gt 1 ] && vht_capab="$vht_capab[BF-ANTENNA-$cap_ant]"
}
@@ -535,7 +538,7 @@ mac80211_hostapd_setup_base() {
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)
+ rand=$(head -n 1 /dev/urandom | tr -dc 0-9 | head -c 2 | sed 's/^0*//')
he_bss_color=$((rand % 63 + 1))
fi
append base_cfg "he_bss_color=$he_bss_color" "$N"
@@ -587,6 +590,11 @@ mac80211_hostapd_setup_base() {
esac
if [ "$enable_be" != "0" ]; then
+
+ json_get_vars \
+ pp_bitmap \
+ pp_mode
+
append base_cfg "ieee80211be=1" "$N"
if [ "$etxbfen" -eq 0 ]; then
append base_cfg "eht_su_beamformee=1" "$N"
@@ -608,6 +616,14 @@ mac80211_hostapd_setup_base() {
;;
esac
}
+
+ if [ -n "$pp_bitmap" ]; then
+ append base_cfg "punct_bitmap=$pp_bitmap" "$N"
+ fi
+
+ if [ -n "$pp_mode" ]; then
+ append base_cfg "pp_mode=$pp_mode" "$N"
+ fi
fi
hostapd_prepare_device_config "$hostapd_conf_file" nl80211
@@ -621,7 +637,9 @@ ${mu_onoff:+mu_onoff=$mu_onoff}
${itxbfen:+ibf_enable=$itxbfen}
${rnr:+rnr=$rnr}
${multiple_bssid:+mbssid=$multiple_bssid}
+${band_idx:+band_idx=$band_idx}
#num_global_macaddr=$num_global_macaddr
+#single_hw=1
$base_cfg
EOF
@@ -652,7 +670,6 @@ mac80211_hostapd_setup_bss() {
cat >> /var/run/hostapd-$phy.conf <<EOF
$hostapd_cfg
bssid=$macaddr
-${default_macaddr:+#default_macaddr}
${dtim_period:+dtim_period=$dtim_period}
${max_listen_int:+max_listen_interval=$max_listen_int}
EOF
@@ -783,8 +800,62 @@ mac80211_set_ifname() {
eval "ifname=\"$phy-$prefix\${idx_$prefix:-0}\"; idx_$prefix=\$((\${idx_$prefix:-0 } + 1))"
}
+fill_mld_params() {
+ local target_mld_id=$1
+ local phy_idx=$(echo $2 | tr -d "phy")
+ local found_mld=0
+ local is_primary=1
+ local mld_allowed_links=0
+
+ iface_list="$(cat /etc/config/wireless | grep wifi-iface | cut -d ' ' -f3 | tr -s "'\n" ' ')"
+ for iface in $iface_list
+ do
+ local mld_id="$(uci show wireless.$iface | grep "mld_id" | cut -d '=' -f2 | tr -d "'")"
+ local radio_id="$(uci show wireless.$iface | grep "device" | cut -d '=' -f2 | tr -d "radio'")"
+ local iface_disabled="$(uci show wireless.$iface | grep "disabled" | cut -d '=' -f2 | tr -d "'")"
+
+ if [ "$iface_disabled" != "1" ] && [ $mld_id = $target_mld_id ]; then
+ mld_allowed_links=$(($mld_allowed_links * 2 + 1))
+ [ $radio_id -lt $phy_idx ] && is_primary=0
+ fi
+ done
+ json_add_string "mld_primary" $is_primary
+ json_add_string "mld_allowed_links" $mld_allowed_links
+
+ mld_list="$(cat /etc/config/wireless | grep wifi-mld | cut -d ' ' -f3 | tr -s "'\n" ' ')"
+ for m in $mld_list
+ do
+ local mld_id="$(uci show wireless.$m | grep "mld_id" | cut -d '=' -f2 | tr -d "'")"
+ [ $mld_id = $target_mld_id ] || continue
+ found_mld=1
+
+ option_list="$(uci show wireless.$m | tr -s "\n" ' ')"
+ for option in $option_list
+ do
+ local key="$(echo $option | cut -d '.' -f3 | cut -d '=' -f1)"
+ local val="$(echo $option | cut -d '.' -f3 | cut -d '=' -f2 | tr -d "'")"
+ [ -n "$key" ] && json_add_string $key $val
+ done
+ done
+
+ if [ $found_mld -eq 0 ]; then
+ echo "mld_id $target_mld_id is not found"
+ return 1
+ fi
+ return 0
+}
+
mac80211_prepare_vif() {
json_select config
+ json_get_vars mld_id
+ if [ -n "$mld_id" ]; then
+ fill_mld_params $mld_id $phy || return
+
+ json_get_vars mld_addr
+ if [ -z "$mld_addr" ]; then
+ json_add_string mld_addr "$(mac80211_generate_mac phy0)"
+ fi
+ fi
json_get_vars ifname mode ssid wds powersave macaddr enable wpa_psk_file vlan_file
@@ -805,7 +876,6 @@ mac80211_prepare_vif() {
set_default powersave 0
json_add_string _ifname "$ifname"
- default_macaddr=
if [ "$mbssid" -gt 0 ] && [ "$mode" == "ap" ]; then
[ "$mbssidx" -eq 0 ] && {
if [ -z $macaddr ]; then
@@ -821,12 +891,10 @@ mac80211_prepare_vif() {
elif [ -z "$macaddr" ]; then
macaddr="$(mac80211_generate_mac $phy)"
macidx="$(($macidx + 1))"
- default_macaddr=1
elif [ "$macaddr" = 'random' ]; then
macaddr="$(macaddr_random)"
fi
json_add_string _macaddr "$macaddr"
- json_add_string _default_macaddr "$default_macaddr"
json_select ..
@@ -950,7 +1018,7 @@ mac80211_setup_adhoc() {
json_add_object "$ifname"
json_add_string mode adhoc
- [ -n "$default_macaddr" ] || json_add_string macaddr "$macaddr"
+ json_add_string macaddr "$macaddr"
json_add_string ssid "$ssid"
json_add_string freq "$freq"
json_add_string htmode "$iw_htmode"
@@ -976,7 +1044,7 @@ mac80211_setup_mesh() {
json_add_object "$ifname"
json_add_string mode mesh
- [ -n "$default_macaddr" ] || json_add_string macaddr "$macaddr"
+ json_add_string macaddr "$macaddr"
json_add_string ssid "$ssid"
json_add_string freq "$freq"
json_add_string htmode "$iw_htmode"
@@ -1036,7 +1104,7 @@ wpa_supplicant_add_interface() {
json_add_string iface "$ifname"
json_add_string mode "$mode"
json_add_string config "$_config"
- [ -n "$default_macaddr" ] || json_add_string macaddr "$macaddr"
+ json_add_string macaddr "$macaddr"
[ -n "$network_bridge" ] && json_add_string bridge "$network_bridge"
[ -n "$wds" ] && json_add_boolean 4addr "$wds"
json_add_boolean powersave "$powersave"
@@ -1140,7 +1208,6 @@ mac80211_setup_vif() {
json_select config
json_get_var ifname _ifname
json_get_var macaddr _macaddr
- json_get_var default_macaddr _default_macaddr
json_get_vars mode wds powersave
set_default powersave 0
@@ -1294,6 +1361,12 @@ drv_mac80211_setup() {
staidx=0
mbssidx=0
+ if [ "$phy" = "phy1" ]; then
+ macidx=20;
+ elif [ "$phy" = "phy2" ]; then
+ macidx=40;
+ fi
+
[ -n "$chanbw" ] && {
for file in /sys/kernel/debug/ieee80211/$phy/ath9k*/chanbw /sys/kernel/debug/ieee80211/$phy/ath5k/bwmode; do
[ -f "$file" ] && echo "$chanbw" > "$file"
@@ -1372,6 +1445,8 @@ drv_mac80211_setup() {
for_each_interface "ap sta adhoc mesh monitor" mac80211_set_vif_txpower
wireless_set_up
+
+ echo /tmp/%e.core > /proc/sys/kernel/core_pattern
}
_list_phy_interfaces() {
@@ -1401,8 +1476,21 @@ drv_mac80211_teardown() {
return 1
}
+ # each phy sleeps different times to prevent for ubus race condition.
+ if [ "$phy" = "phy1" ]; then
+ sleep 3;
+ elif [ "$phy" = "phy0" ]; then
+ sleep 6;
+ fi
+
mac80211_reset_config "$phy"
+ if [ "$phy" = "phy1" ]; then
+ sleep 3;
+ elif [ "$phy" = "phy2" ]; then
+ sleep 6;
+ fi
+
for wdev in $(list_phy_interfaces "$phy"); do
ip link set dev "$wdev" down
iw dev "$wdev" del
diff --git a/package/network/config/wifi-scripts/files/lib/wifi/mac80211.sh b/package/network/config/wifi-scripts/files/lib/wifi/mac80211.sh
index 3c78e1a..d8a1756 100644
--- a/package/network/config/wifi-scripts/files/lib/wifi/mac80211.sh
+++ b/package/network/config/wifi-scripts/files/lib/wifi/mac80211.sh
@@ -133,6 +133,11 @@ get_band_defaults() {
[ -n "$band" ] || continue
[ -n "$mode_band" -a "$band" = "6g" ] && return
+ # hardcode for default band selection in MLO codebase
+ [ "$phy" = "phy0" -a "$band" != "2g" ] && continue
+ [ "$phy" = "phy1" -a "$band" != "5g" ] && continue
+ [ "$phy" = "phy2" -a "$band" != "6g" ] && continue
+
mode_band="$band"
channel="$chan"
htmode="$mode"
@@ -145,16 +150,21 @@ get_band_defaults() {
channel=37
mbssid=1
mbo=1
+ band_idx=2
elif [ "$band" = "5g" ]
then
noscan=1
encryption=none
rnr=1
background_radar=1
+ mbo=0
+ band_idx=1
else
noscan=1
encryption=none
rnr=1
+ mbo=0
+ band_idx=0
fi
done
}
@@ -215,6 +225,7 @@ detect_mac80211() {
mbssid=""
rnr=""
background_radar=""
+ band_idx=""
get_band_defaults "$dev"
@@ -254,7 +265,7 @@ detect_mac80211() {
for i in $(seq 2 3); do
macaddr=${macaddr}:$(echo $rand | cut -d ' ' -f $i)
done
- macaddr="00:0$(($devidx - 1)):55:66${macaddr}"
+ macaddr="00:0$(($devidx + 1)):55:66${macaddr}"
fi
tx_burst=""
@@ -285,6 +296,9 @@ EOF
[ -n "$tx_burst" ] && {
uci -q set wireless.${name}.tx_burst=${tx_burst}
}
+ [ -n "$band_idx" ] && {
+ uci -q set wireless.${name}.band_idx=${band_idx}
+ }
uci -q batch <<-EOF
set wireless.default_${name}=wifi-iface