blob: 8bc9389a2ba913b28abfaca17f228eaa98df738f [file] [log] [blame]
developerce9e5092022-11-10 22:41:59 +08001diff --git a/package/kernel/mac80211/Makefile b/package/kernel/mac80211/Makefile
developerd1ae4aa2023-12-26 11:04:29 +08002index 17e0d94..c73238a 100644
developerce9e5092022-11-10 22:41:59 +08003--- a/package/kernel/mac80211/Makefile
4+++ b/package/kernel/mac80211/Makefile
developerad1f3172023-05-02 11:10:08 +08005@@ -20,6 +20,7 @@ PKG_SOURCE:=backports-$(PKG_VERSION).tar.xz
developerce9e5092022-11-10 22:41:59 +08006 PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/backports-$(PKG_VERSION)
7 PKG_BUILD_PARALLEL:=1
developer356ecec2022-11-14 10:25:04 +08008
developerce9e5092022-11-10 22:41:59 +08009+SOURCE_PATH:=./src
10 PKG_MAINTAINER:=Felix Fietkau <nbd@nbd.name>
developer356ecec2022-11-14 10:25:04 +080011
developerce9e5092022-11-10 22:41:59 +080012 PKG_DRIVERS = \
developerad1f3172023-05-02 11:10:08 +080013@@ -72,6 +73,10 @@ config-y:= \
developer6ec8e342022-11-21 18:47:15 +080014 WLAN_VENDOR_ST \
15 WLAN_VENDOR_TI \
16 WLAN_VENDOR_ZYDAS \
17+ MAC80211_DEBUG_MENU \
18+ MAC80211_MLME_DEBUG \
19+ MAC80211_STA_DEBUG \
20+ MAC80211_HT_DEBUG \
21
22 config-$(call config_package,cfg80211) += CFG80211
23 config-$(CONFIG_PACKAGE_CFG80211_TESTMODE) += NL80211_TESTMODE
developerafe1b5b2023-10-19 07:11:26 +080024@@ -297,6 +302,7 @@ define Build/Prepare
developer356ecec2022-11-14 10:25:04 +080025 mkdir -p $(PKG_BUILD_DIR)
26 $(PKG_UNPACK)
27 $(Build/Patch)
developerafe1b5b2023-10-19 07:11:26 +080028+ $(CP) $(SOURCE_PATH)/* $(PKG_BUILD_DIR) 2>/dev/null || :
developer356ecec2022-11-14 10:25:04 +080029 rm -rf \
30 $(PKG_BUILD_DIR)/include/linux/ssb \
31 $(PKG_BUILD_DIR)/include/linux/bcma \
developer20d67712022-03-02 14:09:32 +080032diff --git a/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh b/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh
developerd1ae4aa2023-12-26 11:04:29 +080033index b5378e5..0aef404 100644
developer20d67712022-03-02 14:09:32 +080034--- a/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh
35+++ b/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh
developer37215362023-09-15 14:16:34 +080036@@ -25,10 +25,12 @@ drv_mac80211_init_device_config() {
developer0ba09b62023-03-10 18:43:49 +080037 config_add_string path phy 'macaddr:macaddr'
38 config_add_string tx_burst
developer0ba09b62023-03-10 18:43:49 +080039 config_add_string distance
developer93607dd2023-08-30 04:53:00 +080040+ config_add_int mbssid mu_onoff sr_enable sr_enhanced rnr obss_interval
developer0ba09b62023-03-10 18:43:49 +080041 config_add_int beacon_int chanbw frag rts
developer93607dd2023-08-30 04:53:00 +080042 config_add_int rxantenna txantenna txpower min_tx_power
developer37215362023-09-15 14:16:34 +080043 config_add_int num_global_macaddr multiple_bssid
44 config_add_boolean noscan ht_coex acs_exclude_dfs background_radar
developer75c99f42023-09-04 11:28:21 +080045+ config_add_boolean noscan ht_coex acs_exclude_dfs background_radar background_cert_mode
46 config_add_array ht_capab
47 config_add_array channels
48 config_add_array scan_list
developer37215362023-09-15 14:16:34 +080049@@ -51,7 +53,10 @@ drv_mac80211_init_device_config() {
developer785b6502023-04-19 18:31:11 +080050 he_spr_sr_control \
51 he_spr_psr_enabled \
52 he_bss_color_enabled \
53- he_twt_required
54+ he_twt_required \
55+ he_twt_responder \
56+ etxbfen \
57+ itxbfen
58 config_add_int \
59 beamformer_antennas \
60 beamformee_antennas \
developer37215362023-09-15 14:16:34 +080061@@ -138,13 +143,11 @@ mac80211_hostapd_setup_base() {
developer0ba09b62023-03-10 18:43:49 +080062 [ -n "$acs_exclude_dfs" ] && [ "$acs_exclude_dfs" -gt 0 ] &&
63 append base_cfg "acs_exclude_dfs=1" "$N"
64
65- json_get_vars noscan ht_coex min_tx_power:0 tx_burst
developer93607dd2023-08-30 04:53:00 +080066+ json_get_vars noscan ht_coex min_tx_power:0 tx_burst mbssid mu_onoff rnr obss_interval
developer2c4f7e82023-05-11 19:56:55 +080067+ json_get_vars etxbfen:1 itxbfen:0
developer8d77be32022-10-20 15:08:25 +080068 json_get_values ht_capab_list ht_capab
developer20d67712022-03-02 14:09:32 +080069 json_get_values channel_list channels
70
71- [ "$auto_channel" = 0 ] && [ -z "$channel_list" ] && \
72- channel_list="$channel"
73-
developer622bc432024-01-08 10:52:16 +080074 [ "$min_tx_power" -gt 0 ] && append base_cfg "min_tx_power=$min_tx_power" "$N"
developer20d67712022-03-02 14:09:32 +080075
developer9b3248d2022-07-06 00:44:05 +080076 set_default noscan 0
developerda1bac72023-09-19 10:32:47 +080077@@ -158,21 +161,42 @@ mac80211_hostapd_setup_base() {
developer785b6502023-04-19 18:31:11 +080078 ieee80211n=1
79 ht_capab=
80 case "$htmode" in
81- VHT20|HT20|HE20) ;;
82- HT40*|VHT40|VHT80|VHT160|HE40|HE80|HE160)
83+ VHT20|HT20|HE20|EHT20) ;;
developerbe3cf972023-04-27 09:58:26 +080084+ HT40*|VHT40|VHT80|VHT160|HE40*|HE80|HE160|EHT40*|EHT80|EHT160|EHT320*)
developer785b6502023-04-19 18:31:11 +080085 case "$hwmode" in
86 a)
87 case "$(( (($channel / 4) + $chan_ofs) % 2 ))" in
developerda1bac72023-09-19 10:32:47 +080088 1) ht_capab="[HT40+]";;
89 0) ht_capab="[HT40-]";;
90 esac
91+ case "$htmode" in
92+ HT40-|HE40-|EHT40-)
93+ if [ "$auto_channel" -gt 0 ]; then
94+ ht_capab="[HT40-]"
95+ fi
96+ ;;
97+ esac
developerbe3cf972023-04-27 09:58:26 +080098 ;;
99 *)
100 case "$htmode" in
101- HT40+) ht_capab="[HT40+]";;
102- HT40-) ht_capab="[HT40-]";;
103+ HT40+|HE40+|EHT40+)
104+ if [ "$channel" -gt 9 ]; then
105+ echo "Could not set the center freq with this HT mode setting"
106+ return 1
107+ else
108+ ht_capab="[HT40+]"
109+ fi
110+ ;;
111+ HT40-|HE40-|EHT40-)
developerda1bac72023-09-19 10:32:47 +0800112+ if [ "$channel" -lt 5 -a "$auto_channel" -eq 0 ]; then
developerbe3cf972023-04-27 09:58:26 +0800113+ echo "Could not set the center freq with this HT mode setting"
114+ return 1
115+ else
116+ ht_capab="[HT40-]"
117+ fi
118+ ;;
119 *)
developerda1bac72023-09-19 10:32:47 +0800120- if [ "$channel" -lt 7 ]; then
121+ if [ "$channel" -lt 7 -o "$auto_channel" -gt 0 ]; then
developerbe3cf972023-04-27 09:58:26 +0800122 ht_capab="[HT40+]"
developerda1bac72023-09-19 10:32:47 +0800123 else
124 ht_capab="[HT40-]"
125@@ -181,7 +205,6 @@ mac80211_hostapd_setup_base() {
126 esac
127 ;;
128 esac
129- [ "$auto_channel" -gt 0 ] && ht_capab="[HT40+]"
130 ;;
131 *) ieee80211n= ;;
132 esac
133@@ -192,6 +215,11 @@ mac80211_hostapd_setup_base() {
developer93607dd2023-08-30 04:53:00 +0800134 set_default ht_coex 0
135 append base_cfg "ht_coex=$ht_coex" "$N"
136
137+ [ "$ht_coex" -eq 1 ] && {
138+ set_default obss_interval 300
139+ append base_cfg "obss_interval=$obss_interval" "$N"
140+ }
141+
142 json_get_vars \
143 ldpc:1 \
144 greenfield:0 \
developerda1bac72023-09-19 10:32:47 +0800145@@ -203,7 +231,7 @@ mac80211_hostapd_setup_base() {
developer785b6502023-04-19 18:31:11 +0800146 dsss_cck_40:1
147
148 ht_cap_mask=0
149- for cap in $(iw phy "$phy" info | grep 'Capabilities:' | cut -d: -f2); do
150+ for cap in $(iw phy "$phy" info | grep 'Capabilities: 0x' | cut -d: -f2); do
151 ht_cap_mask="$(($ht_cap_mask | $cap))"
152 done
153
developerda1bac72023-09-19 10:32:47 +0800154@@ -234,8 +262,8 @@ mac80211_hostapd_setup_base() {
developer785b6502023-04-19 18:31:11 +0800155
156 idx="$channel"
157 case "$htmode" in
158- VHT20|HE20) enable_ac=1;;
159- VHT40|HE40)
160+ VHT20|HE20|EHT20) enable_ac=1;;
161+ VHT40|HE40|EHT40)
162 case "$(( (($channel / 4) + $chan_ofs) % 2 ))" in
163 1) idx=$(($channel + 2));;
164 0) idx=$(($channel - 2));;
developerda1bac72023-09-19 10:32:47 +0800165@@ -243,7 +271,7 @@ mac80211_hostapd_setup_base() {
developer785b6502023-04-19 18:31:11 +0800166 enable_ac=1
167 vht_center_seg0=$idx
168 ;;
169- VHT80|HE80)
170+ VHT80|HE80|EHT80)
171 case "$(( (($channel / 4) + $chan_ofs) % 4 ))" in
172 1) idx=$(($channel + 6));;
173 2) idx=$(($channel + 2));;
developerda1bac72023-09-19 10:32:47 +0800174@@ -254,7 +282,7 @@ mac80211_hostapd_setup_base() {
developer785b6502023-04-19 18:31:11 +0800175 vht_oper_chwidth=1
176 vht_center_seg0=$idx
177 ;;
178- VHT160|HE160)
179+ VHT160|HE160|EHT160)
180 if [ "$band" = "6g" ]; then
181 case "$channel" in
182 1|5|9|13|17|21|25|29) idx=15;;
developer39a1e782023-10-27 17:44:18 +0800183@@ -269,23 +297,64 @@ mac80211_hostapd_setup_base() {
developeradd8de62023-05-02 16:25:52 +0800184 case "$channel" in
185 36|40|44|48|52|56|60|64) idx=50;;
186 100|104|108|112|116|120|124|128) idx=114;;
187+ 149|153|157|161|165|169|173|177) idx=163;;
188 esac
189 fi
190 enable_ac=1
developer785b6502023-04-19 18:31:11 +0800191 vht_oper_chwidth=2
192 vht_center_seg0=$idx
193 ;;
194+ EHT320*)
195+ case "$channel" in
196+ 1|5|9|13|17|21|25|29) idx=31;;
197+ 33|37|41|45|49|53|57|61| \
198+ 65|69|73|77|81|85|89|93) idx=63;;
199+ 97|101|105|109|113|117|121|125| \
200+ 129|133|137|141|145|149|153|157) idx=127;;
201+ 161|165|169|173|177|181|185|189| \
202+ 193|197|201|205|209|213|217|221) idx=191;;
203+ esac
204+ if [[ "$htmode" = "EHT320-1" && "$channel" -ge "193" ]] ||
205+ [[ "$htmode" = "EHT320-2" && "$channel" -le "29" ]]; then
206+ echo "Could not set the center freq with this EHT setting"
207+ return 1
208+ elif [[ "$htmode" = "EHT320-1" && "$channel" -ge "33" ]]; then
209+ if [ "$channel" -gt $idx ]; then
210+ idx=$(($idx + 32))
211+ else
212+ idx=$(($idx - 32))
213+ fi
214+ fi
215+ vht_oper_chwidth=2
216+ if [ "$channel" -gt $idx ]; then
217+ vht_center_seg0=$(($idx + 16))
218+ else
219+ vht_center_seg0=$(($idx - 16))
220+ fi
221+ eht_oper_chwidth=9
222+ eht_oper_centr_freq_seg0_idx=$idx
developer39a1e782023-10-27 17:44:18 +0800223+
224+ case $htmode in
225+ EHT320-1) eht_bw320_offset=1;;
226+ EHT320-2) eht_bw320_offset=2;;
227+ EHT320) eht_bw320_offset=0;;
228+ esac
developer785b6502023-04-19 18:31:11 +0800229+ ;;
230 esac
231 [ "$band" = "5g" ] && {
developer75c99f42023-09-04 11:28:21 +0800232- json_get_vars background_radar:0
233+ json_get_vars \
234+ background_radar:0 \
235+ background_cert_mode:0 \
236
237 [ "$background_radar" -eq 1 ] && append base_cfg "enable_background_radar=1" "$N"
238+ [ "$background_cert_mode" -eq 1 ] && append base_cfg "background_radar_mode=1" "$N"
239 }
developer785b6502023-04-19 18:31:11 +0800240 [ "$band" = "6g" ] && {
241 op_class=
242 case "$htmode" in
243- HE20) op_class=131;;
244- HE*) op_class=$((132 + $vht_oper_chwidth))
245+ HE20|EHT20) op_class=131;;
246+ EHT320*) op_class=137;;
247+ HE*|EHT*) op_class=$((132 + $vht_oper_chwidth))
248 esac
249 [ -n "$op_class" ] && append base_cfg "op_class=$op_class" "$N"
250 }
developer39a1e782023-10-27 17:44:18 +0800251@@ -313,7 +382,6 @@ mac80211_hostapd_setup_base() {
developer8b04dfd2022-12-07 16:29:19 +0800252 vht_link_adapt:3 \
253 vht160:2
254
255- set_default tx_burst 2.0
256 append base_cfg "ieee80211ac=1" "$N"
257 vht_cap=0
258 for cap in $(iw phy "$phy" info | awk -F "[()]" '/VHT Capabilities/ { print $2 }'); do
developer39a1e782023-10-27 17:44:18 +0800259@@ -327,6 +395,12 @@ mac80211_hostapd_setup_base() {
developer785b6502023-04-19 18:31:11 +0800260 [ "$rx_stbc" -lt "$cap_rx_stbc" ] && cap_rx_stbc="$rx_stbc"
261 vht_cap="$(( ($vht_cap & ~(0x700)) | ($cap_rx_stbc << 8) ))"
262
263+ [ "$etxbfen" -eq 0 ] && {
264+ su_beamformer=0
265+ su_beamformee=0
266+ mu_beamformer=0
267+ }
268+
269 mac80211_add_capabilities vht_capab $vht_cap \
270 RXLDPC:0x10::$rxldpc \
271 SHORT-GI-80:0x20::$short_gi_80 \
developer39a1e782023-10-27 17:44:18 +0800272@@ -408,7 +482,7 @@ mac80211_hostapd_setup_base() {
developer785b6502023-04-19 18:31:11 +0800273 # 802.11ax
274 enable_ax=0
275 case "$htmode" in
276- HE*) enable_ax=1 ;;
277+ HE*|EHT*) enable_ax=1 ;;
278 esac
279
280 if [ "$enable_ax" != "0" ]; then
developer39a1e782023-10-27 17:44:18 +0800281@@ -417,10 +491,11 @@ mac80211_hostapd_setup_base() {
developer785b6502023-04-19 18:31:11 +0800282 he_su_beamformee:1 \
283 he_mu_beamformer:1 \
284 he_twt_required:0 \
285+ he_twt_responder \
286 he_spr_sr_control:3 \
287 he_spr_psr_enabled:0 \
288 he_spr_non_srg_obss_pd_max_offset:0 \
289- he_bss_color:128 \
290+ he_bss_color \
291 he_bss_color_enabled:1
292
293 he_phy_cap=$(iw phy "$phy" info | sed -n '/HE Iftypes: AP/,$p' | awk -F "[()]" '/HE PHY Capabilities/ { print $2 }' | head -1)
developer39a1e782023-10-27 17:44:18 +0800294@@ -434,6 +509,11 @@ mac80211_hostapd_setup_base() {
developer785b6502023-04-19 18:31:11 +0800295 append base_cfg "he_oper_centr_freq_seg0_idx=$vht_center_seg0" "$N"
296 }
297
298+ [ "$etxbfen" -eq 0 ] && {
299+ he_su_beamformer=0
300+ he_mu_beamformer=0
301+ }
302+
303 mac80211_add_he_capabilities \
304 he_su_beamformer:${he_phy_cap:6:2}:0x80:$he_su_beamformer \
305 he_su_beamformee:${he_phy_cap:8:2}:0x1:$he_su_beamformee \
developer39a1e782023-10-27 17:44:18 +0800306@@ -441,7 +521,14 @@ mac80211_hostapd_setup_base() {
developer785b6502023-04-19 18:31:11 +0800307 he_spr_psr_enabled:${he_phy_cap:14:2}:0x1:$he_spr_psr_enabled \
308 he_twt_required:${he_mac_cap:0:2}:0x6:$he_twt_required
309
310+ if [ -n "$he_twt_responder" ]; then
311+ append base_cfg "he_twt_responder=$he_twt_responder" "$N"
312+ fi
313 if [ "$he_bss_color_enabled" -gt 0 ]; then
developer830efa72023-05-18 19:32:48 +0800314+ if !([ "$he_bss_color" -gt 0 ] && [ "$he_bss_color" -le 64 ]); then
developer785b6502023-04-19 18:31:11 +0800315+ rand=$(head -n 1 /dev/urandom | tr -dc 0-9 | head -c 2)
316+ he_bss_color=$((rand % 63 + 1))
317+ fi
318 append base_cfg "he_bss_color=$he_bss_color" "$N"
319 [ "$he_spr_non_srg_obss_pd_max_offset" -gt 0 ] && { \
320 append base_cfg "he_spr_non_srg_obss_pd_max_offset=$he_spr_non_srg_obss_pd_max_offset" "$N"
developer7eeea332023-11-24 19:39:56 +0800321@@ -460,26 +547,58 @@ mac80211_hostapd_setup_base() {
developer619eaa32023-08-29 13:33:51 +0800322 append base_cfg "he_mu_edca_qos_info_q_ack=0" "$N"
323 append base_cfg "he_mu_edca_qos_info_queue_request=0" "$N"
324 append base_cfg "he_mu_edca_qos_info_txop_request=0" "$N"
325- append base_cfg "he_mu_edca_ac_be_aifsn=8" "$N"
326+ append base_cfg "he_mu_edca_ac_be_aifsn=0" "$N"
327 append base_cfg "he_mu_edca_ac_be_aci=0" "$N"
328 append base_cfg "he_mu_edca_ac_be_ecwmin=9" "$N"
329 append base_cfg "he_mu_edca_ac_be_ecwmax=10" "$N"
developer7eeea332023-11-24 19:39:56 +0800330- append base_cfg "he_mu_edca_ac_be_timer=255" "$N"
developer619eaa32023-08-29 13:33:51 +0800331- append base_cfg "he_mu_edca_ac_bk_aifsn=15" "$N"
developer7eeea332023-11-24 19:39:56 +0800332+ append base_cfg "he_mu_edca_ac_be_timer=3" "$N"
developer619eaa32023-08-29 13:33:51 +0800333+ append base_cfg "he_mu_edca_ac_bk_aifsn=0" "$N"
334 append base_cfg "he_mu_edca_ac_bk_aci=1" "$N"
335 append base_cfg "he_mu_edca_ac_bk_ecwmin=9" "$N"
336 append base_cfg "he_mu_edca_ac_bk_ecwmax=10" "$N"
developer7eeea332023-11-24 19:39:56 +0800337- append base_cfg "he_mu_edca_ac_bk_timer=255" "$N"
338+ append base_cfg "he_mu_edca_ac_bk_timer=3" "$N"
developer619eaa32023-08-29 13:33:51 +0800339 append base_cfg "he_mu_edca_ac_vi_ecwmin=5" "$N"
340 append base_cfg "he_mu_edca_ac_vi_ecwmax=7" "$N"
341- append base_cfg "he_mu_edca_ac_vi_aifsn=5" "$N"
342+ append base_cfg "he_mu_edca_ac_vi_aifsn=0" "$N"
343 append base_cfg "he_mu_edca_ac_vi_aci=2" "$N"
developer7eeea332023-11-24 19:39:56 +0800344- append base_cfg "he_mu_edca_ac_vi_timer=255" "$N"
developer619eaa32023-08-29 13:33:51 +0800345- append base_cfg "he_mu_edca_ac_vo_aifsn=5" "$N"
developer7eeea332023-11-24 19:39:56 +0800346+ append base_cfg "he_mu_edca_ac_vi_timer=3" "$N"
developer619eaa32023-08-29 13:33:51 +0800347+ append base_cfg "he_mu_edca_ac_vo_aifsn=0" "$N"
348 append base_cfg "he_mu_edca_ac_vo_aci=3" "$N"
349 append base_cfg "he_mu_edca_ac_vo_ecwmin=5" "$N"
350 append base_cfg "he_mu_edca_ac_vo_ecwmax=7" "$N"
developer7eeea332023-11-24 19:39:56 +0800351- append base_cfg "he_mu_edca_ac_vo_timer=255" "$N"
352+ append base_cfg "he_mu_edca_ac_vo_timer=3" "$N"
353+ fi
354+
developer18015ad2023-07-13 13:18:19 +0800355+ set_default tx_burst 2
developer8b04dfd2022-12-07 16:29:19 +0800356+
developer785b6502023-04-19 18:31:11 +0800357+ # 802.11be
358+ enable_be=0
359+ case "$htmode" in
360+ EHT*) enable_be=1 ;;
361+ esac
362+
363+ if [ "$enable_be" != "0" ]; then
364+ append base_cfg "ieee80211be=1" "$N"
365+ if [ "$etxbfen" -eq 0 ]; then
366+ append base_cfg "eht_su_beamformee=1" "$N"
367+ else
368+ append base_cfg "eht_su_beamformer=1" "$N"
369+ append base_cfg "eht_su_beamformee=1" "$N"
370+ append base_cfg "eht_mu_beamformer=1" "$N"
371+ fi
372+ [ "$hwmode" = "a" ] && {
373+ case $htmode in
374+ EHT320*)
375+ append base_cfg "eht_oper_chwidth=$eht_oper_chwidth" "$N"
376+ append base_cfg "eht_oper_centr_freq_seg0_idx=$eht_oper_centr_freq_seg0_idx" "$N"
developer39a1e782023-10-27 17:44:18 +0800377+ append base_cfg "eht_bw320_offset=$eht_bw320_offset" "$N"
developer785b6502023-04-19 18:31:11 +0800378+ ;;
379+ *)
380+ append base_cfg "eht_oper_chwidth=$vht_oper_chwidth" "$N"
381+ append base_cfg "eht_oper_centr_freq_seg0_idx=$vht_center_seg0" "$N"
382+ ;;
383+ esac
384+ }
developer7eeea332023-11-24 19:39:56 +0800385 fi
386
developer8b04dfd2022-12-07 16:29:19 +0800387 hostapd_prepare_device_config "$hostapd_conf_file" nl80211
developer7eeea332023-11-24 19:39:56 +0800388@@ -488,6 +607,10 @@ ${channel:+channel=$channel}
developer0ba09b62023-03-10 18:43:49 +0800389 ${channel_list:+chanlist=$channel_list}
390 ${hostapd_noscan:+noscan=1}
391 ${tx_burst:+tx_queue_data2_burst=$tx_burst}
392+${mbssid:+mbssid=$mbssid}
developer785b6502023-04-19 18:31:11 +0800393+${mu_onoff:+mu_onoff=$mu_onoff}
394+${itxbfen:+ibf_enable=$itxbfen}
developer2c6592a2023-07-21 11:20:56 +0800395+${rnr:+rnr=$rnr}
developer37215362023-09-15 14:16:34 +0800396 ${multiple_bssid:+mbssid=$multiple_bssid}
397 #num_global_macaddr=$num_global_macaddr
developer0ba09b62023-03-10 18:43:49 +0800398 $base_cfg
developer39a1e782023-10-27 17:44:18 +0800399@@ -515,7 +638,7 @@ mac80211_hostapd_setup_bss() {
developer093e1a32023-02-24 16:10:53 +0800400 append hostapd_cfg "wds_sta=1" "$N"
401 [ -n "$wds_bridge" ] && append hostapd_cfg "wds_bridge=$wds_bridge" "$N"
402 }
403- [ "$staidx" -gt 0 -o "$start_disabled" -eq 1 ] && append hostapd_cfg "start_disabled=1" "$N"
404+ [ "$start_disabled" -eq 1 ] && append hostapd_cfg "start_disabled=1" "$N"
405
406 cat >> /var/run/hostapd-$phy.conf <<EOF
407 $hostapd_cfg
developer39a1e782023-10-27 17:44:18 +0800408@@ -526,6 +649,31 @@ ${max_listen_int:+max_listen_interval=$max_listen_int}
developer0ba09b62023-03-10 18:43:49 +0800409 EOF
410 }
411
412+mac80211_generate_mbssid_mac() {
413+ local phy="$1"
414+ local transmitted_bssid="$2"
developer1952bcd2023-06-20 20:14:37 +0800415+ local id="${mbssidx:-0}"
developer0ba09b62023-03-10 18:43:49 +0800416+
417+ local ref="$(cat /sys/class/ieee80211/${phy}/macaddress)"
developer0ba09b62023-03-10 18:43:49 +0800418+
419+ if [ -z "$transmitted_bssid" ]; then
420+ transmitted_bssid=$ref
421+ fi
422+
423+ if [ $id -eq 0 ]; then
424+ echo "$transmitted_bssid"
425+ return
426+ fi
427+
428+ local oIFS="$IFS"; IFS=":"; set -- $transmitted_bssid; IFS="$oIFS"
429+
430+ # Calculate nontransmitted bssid
developer0ba09b62023-03-10 18:43:49 +0800431+ b6="0x$6"
432+ ref_b6=$(($b6 % $max_mbssid))
developer1952bcd2023-06-20 20:14:37 +0800433+ b6=$(($b6 - $ref_b6 + ($ref_b6 + $id) % $max_mbssid))
developer0ba09b62023-03-10 18:43:49 +0800434+ printf "%s:%s:%s:%s:%s:%02x" $1 $2 $3 $4 $5 $b6
435+}
436+
437 mac80211_get_addr() {
438 local phy="$1"
439 local idx="$(($2 + 1))"
developerd1ae4aa2023-12-26 11:04:29 +0800440@@ -626,9 +774,41 @@ mac80211_set_ifname() {
441 eval "ifname=\"$phy-$prefix\${idx_$prefix:-0}\"; idx_$prefix=\$((\${idx_$prefix:-0 } + 1))"
442 }
443
444+fill_mld_params() {
445+ local target_mld_id=$1
446+ local found_mld=0
447+
448+ mld_list="$(cat /etc/config/wireless | grep wifi-mld | cut -d ' ' -f3 | tr -s "'\n" ' ')"
449+ for m in $mld_list
450+ do
451+ local mld_id="$(uci show wireless.$m | grep "mld_id" | cut -d '=' -f2 | tr -d "'")"
452+ [ $mld_id = $target_mld_id ] || continue
453+ found_mld=1
454+
455+ option_list="$(uci show wireless.$m | tr -s "\n" ' ')"
456+ for option in $option_list
457+ do
458+ local key="$(echo $option | cut -d '.' -f3 | cut -d '=' -f1)"
459+ local val="$(echo $option | cut -d '.' -f3 | cut -d '=' -f2 | tr -d "'")"
460+ [ -n "$key" ] && json_add_string $key $val
461+ done
462+ done
463+
464+ if [ $found_mld -eq 0 ]; then
465+ echo "mld_id $target_mld_id is not found"
466+ return 1
467+ fi
468+ return 0
469+}
470+
471 mac80211_prepare_vif() {
472 json_select config
473
474+ json_get_vars mld_id
475+ if [ -n "$mld_id" ]; then
476+ fill_mld_params $mld_id || return
477+ fi
478+
479 json_get_vars ifname mode ssid wds powersave macaddr enable wpa_psk_file vlan_file
480
481 [ -n "$ifname" ] || {
482@@ -649,7 +829,19 @@ mac80211_prepare_vif() {
developer24684862023-08-02 08:10:38 +0800483 json_add_string _ifname "$ifname"
developer0ba09b62023-03-10 18:43:49 +0800484
developer37215362023-09-15 14:16:34 +0800485 default_macaddr=
developer0ba09b62023-03-10 18:43:49 +0800486- if [ -z "$macaddr" ]; then
developerd2fbd572023-06-19 19:48:25 +0800487+ if [ "$mbssid" -gt 0 ] && [ "$mode" == "ap" ]; then
developer1952bcd2023-06-20 20:14:37 +0800488+ [ "$mbssidx" -eq 0 ] && {
489+ if [ -z $macaddr ]; then
490+ transmitted_bssid="$(mac80211_generate_mac $phy)"
491+ else
492+ # uci set mac address
493+ transmitted_bssid=$macaddr
494+ fi
495+ macidx="$(($macidx + 1))"
developer0ba09b62023-03-10 18:43:49 +0800496+ }
497+ macaddr="$(mac80211_generate_mbssid_mac $phy $transmitted_bssid)"
developer1952bcd2023-06-20 20:14:37 +0800498+ mbssidx="$(($mbssidx + 1))"
developer0ba09b62023-03-10 18:43:49 +0800499+ elif [ -z "$macaddr" ]; then
500 macaddr="$(mac80211_generate_mac $phy)"
501 macidx="$(($macidx + 1))"
developer37215362023-09-15 14:16:34 +0800502 default_macaddr=1
developerd1ae4aa2023-12-26 11:04:29 +0800503@@ -907,12 +1099,28 @@ wpa_supplicant_set_config() {
developer6cfee682023-11-27 19:34:42 +0800504 }
505
506 hostapd_set_config() {
507+
508+ if [ "$inconsistent_country" -eq 1 ]; then
509+ echo "ERROR: Please use the same country for all the radios."
510+ wireless_setup_failed HOSTAPD_START_FAILED
511+ drv_mac80211_teardown
512+ return
513+ fi
514+
515 [ -n "$hostapd_ctrl" ] || {
516 ubus call hostapd config_set '{ "phy": "'"$phy"'", "config": "", "prev_config": "'"${hostapd_conf_file}.prev"'" }' > /dev/null
517 return 0;
developer24684862023-08-02 08:10:38 +0800518 }
519
520 ubus wait_for hostapd
521+
522+ # each phy sleeps different times to prevent for ubus race condition.
523+ if [ "$phy" = "phy1" ]; then
developer8169b4f2023-10-12 09:34:58 +0800524+ sleep 3;
developer24684862023-08-02 08:10:38 +0800525+ elif [ "$phy" = "phy2" ]; then
developer8169b4f2023-10-12 09:34:58 +0800526+ sleep 6;
developer24684862023-08-02 08:10:38 +0800527+ fi
528+
529 local hostapd_res="$(ubus call hostapd config_set "{ \"phy\": \"$phy\", \"config\":\"${hostapd_conf_file}\", \"prev_config\": \"${hostapd_conf_file}.prev\"}")"
530 ret="$?"
531 [ "$ret" != 0 -o -z "$hostapd_res" ] && {
developerd1ae4aa2023-12-26 11:04:29 +0800532@@ -990,6 +1198,9 @@ mac80211_setup_vif() {
developerf0de14b2022-12-14 23:07:34 +0800533
534 json_select ..
535 [ -n "$failed" ] || wireless_add_vif "$name" "$ifname"
536+
537+ echo "Setup SMP Affinity"
538+ /sbin/smp-mt76.sh
539 }
540
541 get_freq() {
developerd1ae4aa2023-12-26 11:04:29 +0800542@@ -1041,6 +1252,25 @@ mac80211_reset_config() {
developer37215362023-09-15 14:16:34 +0800543 wdev_tool "$phy" set_config '{}'
developer0ba09b62023-03-10 18:43:49 +0800544 }
545
546+mac80211_count_ap() {
547+ total_num_ap=$(($total_num_ap + 1))
548+}
549+
developer6cfee682023-11-27 19:34:42 +0800550+country_consistent_check() {
551+ local i
552+ inconsistent_country=0
553+ country_list="$(cat /etc/config/wireless | grep country | cut -d ' ' -f3 | tr -s "'\n" ' ')"
554+ for i in $country_list
555+ do
556+ ret="$(echo $country_list | awk '{print ($2 == "" || $1 == $2)}')"
557+ [ $ret = '0' ] && {
558+ inconsistent_country=1
559+ return
560+ }
561+ country_list="$(echo $country_list | sed -r 's/[A-Z]{2}( )*//')"
562+ done
563+}
564+
developer0ba09b62023-03-10 18:43:49 +0800565 drv_mac80211_setup() {
566 json_select config
567 json_get_vars \
developerd1ae4aa2023-12-26 11:04:29 +0800568@@ -1049,7 +1279,8 @@ drv_mac80211_setup() {
developer93607dd2023-08-30 04:53:00 +0800569 txpower \
developer74503112023-06-29 17:34:49 +0800570 rxantenna txantenna \
developer37215362023-09-15 14:16:34 +0800571 frag rts beacon_int:100 htmode \
572- num_global_macaddr:1 multiple_bssid
573+ num_global_macaddr:1 multiple_bssid \
developer74503112023-06-29 17:34:49 +0800574+ sr_enable sr_enhanced
575 json_get_values basic_rate_list basic_rate
576 json_get_values scan_list scan_list
577 json_select ..
developerd1ae4aa2023-12-26 11:04:29 +0800578@@ -1084,6 +1315,7 @@ drv_mac80211_setup() {
developer24684862023-08-02 08:10:38 +0800579
developer1952bcd2023-06-20 20:14:37 +0800580 macidx=0
581 staidx=0
582+ mbssidx=0
583
584 [ -n "$chanbw" ] && {
585 for file in /sys/kernel/debug/ieee80211/$phy/ath9k*/chanbw /sys/kernel/debug/ieee80211/$phy/ath5k/bwmode; do
developerd1ae4aa2023-12-26 11:04:29 +0800586@@ -1132,14 +1364,29 @@ drv_mac80211_setup() {
developer24684862023-08-02 08:10:38 +0800587
588 wpa_supplicant_init_config
developer0ba09b62023-03-10 18:43:49 +0800589
590+ total_num_ap=0
591+ max_mbssid=1
592+ for_each_interface "ap" mac80211_count_ap
593+ total_num_ap=$(($total_num_ap - 1))
594+ while [ $total_num_ap -gt 0 ]
595+ do
596+ total_num_ap=$(($total_num_ap >> 1))
597+ max_mbssid=$(($max_mbssid << 1))
598+ done
599+
600 mac80211_prepare_iw_htmode
developer24684862023-08-02 08:10:38 +0800601 active_ifnames=
602 for_each_interface "ap sta adhoc mesh monitor" mac80211_prepare_vif
developer6cfee682023-11-27 19:34:42 +0800603 for_each_interface "ap sta adhoc mesh monitor" mac80211_setup_vif
604
605+ country_consistent_check
606+
developer24684862023-08-02 08:10:38 +0800607 [ -x /usr/sbin/wpa_supplicant ] && wpa_supplicant_set_config "$phy"
608 [ -x /usr/sbin/hostapd ] && hostapd_set_config "$phy"
developer74503112023-06-29 17:34:49 +0800609
610+ [ -n "$sr_enable" ] && echo "$sr_enable" > /sys/kernel/debug/ieee80211/$phy/mt76/sr_enable
611+ [ -n "$sr_enhanced" ] && echo "$sr_enhanced" > /sys/kernel/debug/ieee80211/$phy/mt76/sr_enhanced_enable
612+
developer24684862023-08-02 08:10:38 +0800613 [ -x /usr/sbin/wpa_supplicant ] && wpa_supplicant_start "$phy"
developer74503112023-06-29 17:34:49 +0800614
developer24684862023-08-02 08:10:38 +0800615 json_set_namespace wdev_uc prev
developer9b3248d2022-07-06 00:44:05 +0800616diff --git a/package/kernel/mac80211/files/lib/wifi/mac80211.sh b/package/kernel/mac80211/files/lib/wifi/mac80211.sh
developerd1ae4aa2023-12-26 11:04:29 +0800617index e24a2a6..58a0c9f 100644
developere2597ba2022-06-24 13:09:16 +0800618--- a/package/kernel/mac80211/files/lib/wifi/mac80211.sh
619+++ b/package/kernel/mac80211/files/lib/wifi/mac80211.sh
developer20ce7bd2023-05-20 13:25:14 +0800620@@ -60,6 +60,9 @@ BEGIN {
developer785b6502023-04-19 18:31:11 +0800621 if (vht && band != "1:") mode="VHT80"
622 if (he) mode="HE80"
623 if (he && band == "1:") mode="HE20"
developer20ce7bd2023-05-20 13:25:14 +0800624+ if (eht && band == "2:") mode="EHT160"
625+ if (eht && band == "4:") mode="EHT320"
developer785b6502023-04-19 18:31:11 +0800626+ if (eht && band == "1:") mode="EHT20"
627 sub("\\[", "", channel)
628 sub("\\]", "", channel)
629 bands = bands band channel ":" mode " "
developer20ce7bd2023-05-20 13:25:14 +0800630@@ -73,6 +76,7 @@ $1 == "Band" {
developer785b6502023-04-19 18:31:11 +0800631 vht = ""
632 ht = ""
633 he = ""
634+ eht = ""
635 }
636
637 $0 ~ "Capabilities:" {
developer20ce7bd2023-05-20 13:25:14 +0800638@@ -87,6 +91,18 @@ $0 ~ "HE Iftypes" {
developer785b6502023-04-19 18:31:11 +0800639 he=1
640 }
641
642+$0 ~ "EHT Iftypes" {
643+ eht=1
644+}
645+
developer20ce7bd2023-05-20 13:25:14 +0800646+$0 ~ / *HE MAC Capabilities \(0x000000000000\)/ {
647+ he=0
648+}
649+
650+$0 ~ / *EHT MAC Capabilities \(0x0000\)/ {
651+ eht=0
652+}
653+
developer785b6502023-04-19 18:31:11 +0800654 $1 == "*" && $3 == "MHz" && $0 !~ /disabled/ && band && !channel {
655 channel = $4
656 }
developerf7aff422023-11-14 11:11:34 +0800657@@ -120,6 +136,26 @@ get_band_defaults() {
developere2597ba2022-06-24 13:09:16 +0800658 mode_band="$band"
659 channel="$chan"
660 htmode="$mode"
661+ if [ "$band" = "6g" ]
662+ then
663+ encryption=sae
664+ key=12345678
developer20ce7bd2023-05-20 13:25:14 +0800665+ sae_pwe=2
666+ ieee80211w=2
developeradbb45b2023-06-09 14:43:01 +0800667+ channel=37
668+ mbssid=1
developerf7aff422023-11-14 11:11:34 +0800669+ mbo=1
developer75c99f42023-09-04 11:28:21 +0800670+ elif [ "$band" = "5g" ]
671+ then
672+ noscan=1
673+ encryption=none
674+ rnr=1
675+ background_radar=1
developere2597ba2022-06-24 13:09:16 +0800676+ else
developer659b07e2023-05-25 12:34:13 +0800677+ noscan=1
developere2597ba2022-06-24 13:09:16 +0800678+ encryption=none
developer2c6592a2023-07-21 11:20:56 +0800679+ rnr=1
developere2597ba2022-06-24 13:09:16 +0800680+ fi
681 done
682 }
683
developerf7aff422023-11-14 11:11:34 +0800684@@ -153,6 +189,10 @@ detect_mac80211() {
developer785b6502023-04-19 18:31:11 +0800685
686 json_load_file /etc/board.json
687
688+ # generate random bytes for macaddr
689+ rand=$(hexdump -C /dev/urandom | head -n 1 &)
690+ killall hexdump
691+
692 for _dev in /sys/class/ieee80211/*; do
693 [ -e "$_dev" ] || continue
694
developerf7aff422023-11-14 11:11:34 +0800695@@ -162,6 +202,14 @@ detect_mac80211() {
developere2597ba2022-06-24 13:09:16 +0800696 channel=""
697 htmode=""
698 ht_capab=""
699+ encryption=""
developer659b07e2023-05-25 12:34:13 +0800700+ noscan=""
developere2597ba2022-06-24 13:09:16 +0800701+ key=""
developer09257932023-05-09 13:41:30 +0800702+ sae_pwe=""
developer20ce7bd2023-05-20 13:25:14 +0800703+ ieee80211w=""
developeradbb45b2023-06-09 14:43:01 +0800704+ mbssid=""
developer2c6592a2023-07-21 11:20:56 +0800705+ rnr=""
developer75c99f42023-09-04 11:28:21 +0800706+ background_radar=""
developere2597ba2022-06-24 13:09:16 +0800707
708 get_band_defaults "$dev"
709
developered11bba2023-12-12 18:03:26 +0800710@@ -196,6 +244,19 @@ detect_mac80211() {
developer785b6502023-04-19 18:31:11 +0800711 ;;
712 esac
713
developer212c0d82023-07-13 19:41:47 +0800714+ macaddr=""
developer1325ba72023-06-26 13:43:31 +0800715+ if (dmesg | grep -q "eeprom load fail"); then
developer1952bcd2023-06-20 20:14:37 +0800716+ for i in $(seq 2 3); do
717+ macaddr=${macaddr}:$(echo $rand | cut -d ' ' -f $i)
718+ done
719+ macaddr="00:0$(($devidx - 1)):55:66${macaddr}"
developer1952bcd2023-06-20 20:14:37 +0800720+ fi
developer785b6502023-04-19 18:31:11 +0800721+
developered11bba2023-12-12 18:03:26 +0800722+ tx_burst=""
723+ if (lspci | grep -q "7992"); then
724+ tx_burst=0.0
725+ fi
726+
developer785b6502023-04-19 18:31:11 +0800727 uci -q batch <<-EOF
728 set wireless.${name}=wifi-device
729 set wireless.${name}.type=mac80211
developered11bba2023-12-12 18:03:26 +0800730@@ -203,15 +264,49 @@ detect_mac80211() {
developer09257932023-05-09 13:41:30 +0800731 set wireless.${name}.channel=${channel}
732 set wireless.${name}.band=${mode_band}
733 set wireless.${name}.htmode=$htmode
734- set wireless.${name}.disabled=1
developer20ce7bd2023-05-20 13:25:14 +0800735+ set wireless.${name}.country='US'
developer659b07e2023-05-25 12:34:13 +0800736+ set wireless.${name}.noscan=${noscan}
developer09257932023-05-09 13:41:30 +0800737+ set wireless.${name}.disabled=0
developeradbb45b2023-06-09 14:43:01 +0800738+EOF
739+ [ -n "$mbssid" ] && {
740+ uci -q set wireless.${name}.mbssid=${mbssid}
741+ }
developer2c6592a2023-07-21 11:20:56 +0800742+ [ -n "$rnr" ] && {
743+ uci -q set wireless.${name}.rnr=${rnr}
744+ }
developer75c99f42023-09-04 11:28:21 +0800745+ [ -n "$background_radar" ] && {
746+ uci -q set wireless.${name}.background_radar=${background_radar}
747+ }
developered11bba2023-12-12 18:03:26 +0800748+ [ -n "$tx_burst" ] && {
749+ uci -q set wireless.${name}.tx_burst=${tx_burst}
750+ }
developer09257932023-05-09 13:41:30 +0800751
developeradbb45b2023-06-09 14:43:01 +0800752+ uci -q batch <<-EOF
developer09257932023-05-09 13:41:30 +0800753 set wireless.default_${name}=wifi-iface
754 set wireless.default_${name}.device=${name}
developer8d77be32022-10-20 15:08:25 +0800755 set wireless.default_${name}.network=lan
756 set wireless.default_${name}.mode=ap
developer09257932023-05-09 13:41:30 +0800757- set wireless.default_${name}.ssid=OpenWrt
developer8d77be32022-10-20 15:08:25 +0800758- set wireless.default_${name}.encryption=none
developer09257932023-05-09 13:41:30 +0800759+ set wireless.default_${name}.ssid=OpenWrt-${mode_band}
developer8d77be32022-10-20 15:08:25 +0800760+ set wireless.default_${name}.encryption=${encryption}
developere2597ba2022-06-24 13:09:16 +0800761 EOF
developer212c0d82023-07-13 19:41:47 +0800762+
763+ # calibrated board will use eeprom macaddress, not ramdom address
764+ [ -n "$macaddr" ] && {
765+ uci -q set wireless.default_${name}.macaddr=${macaddr}
766+ }
767+
developere2597ba2022-06-24 13:09:16 +0800768+ [ -n "$key" ] && {
developer8d77be32022-10-20 15:08:25 +0800769+ uci -q set wireless.default_${name}.key=${key}
developere2597ba2022-06-24 13:09:16 +0800770+ }
developer09257932023-05-09 13:41:30 +0800771+ [ -n "$sae_pwe" ] && {
772+ uci -q set wireless.default_${name}.sae_pwe=${sae_pwe}
773+ }
developer20ce7bd2023-05-20 13:25:14 +0800774+ [ -n "$ieee80211w" ] && {
775+ uci -q set wireless.default_${name}.ieee80211w=${ieee80211w}
776+ }
developerf7aff422023-11-14 11:11:34 +0800777+ [ -n "$mbo" ] && {
778+ uci -q set wireless.default_${name}.mbo=${mbo}
779+ }
developere2597ba2022-06-24 13:09:16 +0800780 uci -q commit wireless
developer8d77be32022-10-20 15:08:25 +0800781 done
782 }
developer85839fe2023-02-23 10:32:51 +0800783diff --git a/package/network/services/hostapd/files/hostapd.sh b/package/network/services/hostapd/files/hostapd.sh
developerd1ae4aa2023-12-26 11:04:29 +0800784index 271c1f7..ccfeed6 100644
developer85839fe2023-02-23 10:32:51 +0800785--- a/package/network/services/hostapd/files/hostapd.sh
786+++ b/package/network/services/hostapd/files/hostapd.sh
developer74503112023-06-29 17:34:49 +0800787@@ -60,7 +60,14 @@ hostapd_append_wpa_key_mgmt() {
developer93607dd2023-08-30 04:53:00 +0800788 append wpa_key_mgmt "WPA-EAP-SHA256"
developer74503112023-06-29 17:34:49 +0800789 ;;
790 sae)
791- append wpa_key_mgmt "SAE"
792+ case "$encryption" in
793+ *sae-ext*)
794+ append wpa_key_mgmt "SAE-EXT-KEY"
795+ ;;
796+ *)
797+ append wpa_key_mgmt "SAE"
798+ ;;
799+ esac
800 [ "${ieee80211r:-0}" -gt 0 ] && append wpa_key_mgmt "FT-SAE"
801 ;;
802 psk-sae)
developer93607dd2023-08-30 04:53:00 +0800803@@ -119,6 +126,7 @@ hostapd_common_add_device_config() {
developer74503112023-06-29 17:34:49 +0800804 config_add_int rts_threshold
805 config_add_int rssi_reject_assoc_rssi
806 config_add_int rssi_ignore_probe_request
807+ config_add_int rssi_reject_assoc_timeout
808 config_add_int maxassoc
809
810 config_add_string acs_chan_bias
developer93607dd2023-08-30 04:53:00 +0800811@@ -231,8 +239,10 @@ hostapd_prepare_device_config() {
developer74503112023-06-29 17:34:49 +0800812 hostapd_add_rate brlist "$br"
813 done
814
815+ json_get_vars rssi_reject_assoc_timeout
816 [ -n "$rssi_reject_assoc_rssi" ] && append base_cfg "rssi_reject_assoc_rssi=$rssi_reject_assoc_rssi" "$N"
817 [ -n "$rssi_ignore_probe_request" ] && append base_cfg "rssi_ignore_probe_request=$rssi_ignore_probe_request" "$N"
818+ [ -n "$rssi_reject_assoc_timeout" ] && append base_cfg "rssi_reject_assoc_timeout=$rssi_reject_assoc_timeout" "$N"
819 [ -n "$beacon_rate" ] && append base_cfg "beacon_rate=$beacon_rate" "$N"
820 [ -n "$rlist" ] && append base_cfg "supported_rates=$rlist" "$N"
821 [ -n "$brlist" ] && append base_cfg "basic_rates=$brlist" "$N"
developerd1ae4aa2023-12-26 11:04:29 +0800822@@ -383,6 +393,28 @@ hostapd_common_add_bss_config() {
developer82408892023-03-27 15:09:00 +0800823 config_add_string fils_dhcp
824
825 config_add_int ocv
826+
827+ config_add_int disable_eht
828+ config_add_int disable_he
829+ config_add_int disable_vht
830+ config_add_int disable_ht
developer813f5d72023-03-28 17:44:38 +0800831+
developerf166f542023-05-25 14:40:30 +0800832+ config_add_boolean beacon_prot interworking
developer74503112023-06-29 17:34:49 +0800833+
834+ config_add_int unsol_bcast_probe_resp_interval
835+ config_add_int fils_discovery_min_interval
836+ config_add_int fils_discovery_max_interval
837+ config_add_boolean rnr
838+
839+ config_add_array sae_groups
840+ config_add_array owe_groups
841+ config_add_array pairwise
842+ config_add_string group_cipher
developer875fbb72023-12-13 15:49:01 +0800843+ config_add_string group_mgmt_cipher
developer74503112023-06-29 17:34:49 +0800844+
developerd1ae4aa2023-12-26 11:04:29 +0800845+ config_add_int mld_id
846+ config_add_boolean mld_primary mld_single_link
847+ config_add_string mld_addr
developer82408892023-03-27 15:09:00 +0800848 }
849
850 hostapd_set_vlan_file() {
developerd1ae4aa2023-12-26 11:04:29 +0800851@@ -447,11 +479,11 @@ append_iw_nai_realm() {
developerf166f542023-05-25 14:40:30 +0800852 }
853
854 append_iw_venue_name() {
855- append bss_conf "venue_name=$1" "$N"
856+ [ -n "$1" ] && append bss_conf "venue_name=$1" "$N"
857 }
858
859 append_iw_venue_url() {
860- append bss_conf "venue_url=$1" "$N"
861+ [ -n "$1" ] && append bss_conf "venue_url=$1" "$N"
862 }
863
864 append_hs20_oper_friendly_name() {
developerd1ae4aa2023-12-26 11:04:29 +0800865@@ -569,7 +601,9 @@ hostapd_set_bss_options() {
developer74503112023-06-29 17:34:49 +0800866 ppsk airtime_bss_weight airtime_bss_limit airtime_sta_weight \
867 multicast_to_unicast_all proxy_arp per_sta_vif \
868 eap_server eap_user_file ca_cert server_cert private_key private_key_passwd server_id \
869- vendor_elements fils ocv
870+ vendor_elements fils ocv unsol_bcast_probe_resp_interval fils_discovery_min_interval \
developerd1ae4aa2023-12-26 11:04:29 +0800871+ fils_discovery_max_interval rnr group_cipher group_mgmt_cipher \
872+ mld_id mld_primary mld_addr
developer74503112023-06-29 17:34:49 +0800873
874 set_default fils 0
875 set_default isolate 0
developerd1ae4aa2023-12-26 11:04:29 +0800876@@ -596,7 +630,10 @@ hostapd_set_bss_options() {
877
878 /usr/sbin/hostapd -vfils || fils=0
879
880- append bss_conf "ctrl_interface=/var/run/hostapd"
881+ if [ -z $mld_id ] || [ "$mld_primary" = "1" ]; then
882+ append bss_conf "ctrl_interface=/var/run/hostapd"
883+ fi
884+
885 if [ "$isolate" -gt 0 ]; then
886 append bss_conf "ap_isolate=$isolate" "$N"
887 fi
888@@ -796,6 +833,36 @@ hostapd_set_bss_options() {
developer74503112023-06-29 17:34:49 +0800889 local auth_algs="$((($auth_mode_shared << 1) | $auth_mode_open))"
890 append bss_conf "auth_algs=${auth_algs:-1}" "$N"
891 append bss_conf "wpa=$wpa" "$N"
892+
893+ json_get_values pairwise pairwise
developer945ed992023-10-25 15:01:32 +0800894+ json_get_vars group_cipher
developer9097e5e2023-07-19 10:22:24 +0800895+ if [ -n "$pairwise" ]; then
896+ case "$pairwise" in
897+ *tkip+aes|*tkip+ccmp|*aes+tkip|*ccmp+tkip)
898+ wpa_cipher="CCMP TKIP"
899+ ;;
900+ *ccmp256)
901+ wpa_cipher="CCMP-256"
902+ ;;
903+ *aes|*ccmp)
904+ wpa_cipher="CCMP"
905+ ;;
906+ *tkip)
907+ wpa_cipher="TKIP"
908+ ;;
909+ *gcmp256)
910+ wpa_cipher="GCMP-256"
911+ ;;
912+ *gcmp)
913+ wpa_cipher="GCMP"
914+ ;;
915+ *)
916+ wpa_cipher=""
917+ ;;
918+ esac
919+ fi
developer74503112023-06-29 17:34:49 +0800920+ [ -n "$wpa_cipher" ] && wpa_pairwise="$wpa_cipher"
921+
922 [ -n "$wpa_pairwise" ] && append bss_conf "wpa_pairwise=$wpa_pairwise" "$N"
923
924 set_default wps_pushbutton 0
developerd1ae4aa2023-12-26 11:04:29 +0800925@@ -847,7 +914,7 @@ hostapd_set_bss_options() {
developerda723192023-05-22 19:46:10 +0800926 }
927
928 append bss_conf "ssid=$ssid" "$N"
929- [ -n "$network_bridge" ] && append bss_conf "bridge=$network_bridge${N}wds_bridge=" "$N"
930+ [ -n "$network_bridge" ] && append bss_conf "bridge=$network_bridge${N}wds_bridge=$network_bridge" "$N"
931 [ -n "$network_ifname" ] && append bss_conf "snoop_iface=$network_ifname" "$N"
932 [ -n "$iapp_interface" ] && {
933 local ifname
developerd1ae4aa2023-12-26 11:04:29 +0800934@@ -962,6 +1029,8 @@ hostapd_set_bss_options() {
developer74503112023-06-29 17:34:49 +0800935 fi
936
937 if [ "$wpa" -ge "2" ]; then
938+ json_get_values sae_groups sae_groups
939+ json_get_values owe_groups owe_groups
940 if [ -n "$network_bridge" -a "$rsn_preauth" = 1 ]; then
941 set_default auth_cache 1
942 append bss_conf "rsn_preauth=1" "$N"
developerd1ae4aa2023-12-26 11:04:29 +0800943@@ -980,17 +1049,52 @@ hostapd_set_bss_options() {
developer74503112023-06-29 17:34:49 +0800944 append bss_conf "okc=$auth_cache" "$N"
945 [ "$auth_cache" = 0 -a "$fils" = 0 ] && append bss_conf "disable_pmksa_caching=1" "$N"
946
947+ [ -z "$group_cipher" ] && group_cipher="$wpa_cipher"
948+
949+ if [ -n "$sae_groups" -o -n "$owe_groups" ]; then
950+ case "$auth_type" in
951+ sae*)
952+ append bss_conf "sae_groups=$sae_groups" "$N"
953+ append bss_conf "group_cipher=$group_cipher" "$N"
954+ ;;
955+ owe)
956+ append bss_conf "owe_groups=$owe_groups" "$N"
957+ append bss_conf "group_cipher=$group_cipher" "$N"
958+ ;;
959+ esac
960+ fi
961+
developer813f5d72023-03-28 17:44:38 +0800962 # RSN -> allow management frame protection
963 case "$ieee80211w" in
964 [012])
965- json_get_vars ieee80211w_mgmt_cipher ieee80211w_max_timeout ieee80211w_retry_timeout
966+ json_get_vars ieee80211w_mgmt_cipher ieee80211w_max_timeout ieee80211w_retry_timeout beacon_prot
967 append bss_conf "ieee80211w=$ieee80211w" "$N"
968 [ "$ieee80211w" -gt "0" ] && {
developer875fbb72023-12-13 15:49:01 +0800969+ if [ -z "$group_mgmt_cipher" ]; then
970+ case "$group_cipher" in
971+ CCMP-256)
972+ ieee80211w_mgmt_cipher="BIP-CMAC-256"
973+ ;;
974+ CCMP)
975+ ieee80211w_mgmt_cipher="AES-128-CMAC"
976+ ;;
977+ GCMP-256)
978+ ieee80211w_mgmt_cipher="BIP-GMAC-256"
979+ ;;
980+ GCMP)
981+ ieee80211w_mgmt_cipher="BIP-GMAC-128"
982+ ;;
983+ esac
984+ else
985+ ieee80211w_mgmt_cipher="$group_mgmt_cipher"
986+ fi
developer813f5d72023-03-28 17:44:38 +0800987 if [ "$auth_type" = "eap192" ]; then
developer74503112023-06-29 17:34:49 +0800988 append bss_conf "group_mgmt_cipher=BIP-GMAC-256" "$N"
developer813f5d72023-03-28 17:44:38 +0800989 else
990 append bss_conf "group_mgmt_cipher=${ieee80211w_mgmt_cipher:-AES-128-CMAC}" "$N"
991 fi
992+ [ -n "$beacon_prot" ] && \
993+ append bss_conf "beacon_prot=$beacon_prot" "$N"
994 [ -n "$ieee80211w_max_timeout" ] && \
995 append bss_conf "assoc_sa_query_max_timeout=$ieee80211w_max_timeout" "$N"
996 [ -n "$ieee80211w_retry_timeout" ] && \
developerd1ae4aa2023-12-26 11:04:29 +0800997@@ -1055,9 +1159,10 @@ hostapd_set_bss_options() {
developerf166f542023-05-25 14:40:30 +0800998 json_get_vars iw_roaming_consortium iw_domain_name iw_anqp_3gpp_cell_net iw_nai_realm
999 json_get_vars iw_anqp_elem iw_qos_map_set iw_ipaddr_type_availability iw_gas_address3
1000 json_get_vars iw_venue_name iw_venue_url
1001+ json_get_vars interworking
1002
1003 set_default iw_enabled 0
1004- if [ "$iw_enabled" = "1" ]; then
1005+ if [ "$iw_enabled" = "1" ] || [ "$interworking" = "1" ]; then
1006 append bss_conf "interworking=1" "$N"
1007 set_default iw_internet 1
1008 set_default iw_asra 0
developerd1ae4aa2023-12-26 11:04:29 +08001009@@ -1164,6 +1269,38 @@ hostapd_set_bss_options() {
developer74503112023-06-29 17:34:49 +08001010 append bss_conf "$val" "$N"
1011 done
1012
1013+ if [ "$unsol_bcast_probe_resp_interval" -gt 0 ]; then
1014+ append bss_conf "unsol_bcast_probe_resp_interval=$unsol_bcast_probe_resp_interval" "$N"
1015+ fi
1016+
1017+ if [ -n "$fils_discovery_min_interval" ]; then
1018+ append bss_conf "fils_discovery_min_interval=$fils_discovery_min_interval" "$N"
1019+ fi
1020+
1021+ if [ -n "$fils_discovery_max_interval" ]; then
1022+ append bss_conf "fils_discovery_max_interval=$fils_discovery_max_interval" "$N"
1023+ fi
1024+
1025+ if [ -n "$rnr" ]; then
1026+ append bss_conf "rnr=$rnr" "$N"
1027+ fi
1028+
developerd1ae4aa2023-12-26 11:04:29 +08001029+ if [ -n "$mld_id" ]; then
1030+ if !([ "$mld_id" -ge 0 ] && [ "$mld_id" -le 255 ]); then
1031+ echo "Invalid mld_id: ${mld_id}"
1032+ return 1
1033+ fi
1034+ append bss_conf "mld_ap=1" "$N"
1035+ append bss_conf "mld_id=$mld_id" "$N"
1036+ if [ -n "$mld_addr" ]; then
1037+ append bss_conf "mld_addr=$mld_addr" "$N"
1038+ fi
1039+ fi
1040+
1041+ if [ "$mld_primary" -gt 0 ]; then
1042+ append bss_conf "mld_primary=${mld_primary}" "$N"
1043+ fi
1044+
developer5b3b7a92023-08-12 03:41:52 +08001045 append "$var" "$bss_conf" "$N"
1046 return 0
1047 }
developerd1ae4aa2023-12-26 11:04:29 +08001048@@ -1219,7 +1356,7 @@ wpa_supplicant_prepare_interface() {
1049
1050 _wpa_supplicant_common "$1"
1051
1052- json_get_vars mode wds multi_ap
1053+ json_get_vars mode wds multi_ap mld_single_link mld_primary
1054
1055 [ -n "$network_bridge" ] && {
1056 fail=
1057@@ -1251,6 +1388,23 @@ wpa_supplicant_prepare_interface() {
developer18015ad2023-07-13 13:18:19 +08001058 country_str="country=$country"
1059 }
1060
developerd1ae4aa2023-12-26 11:04:29 +08001061+ local mld_force_single_link=0
1062+ [ -n "$mld_single_link" ] && {
1063+ mld_force_single_link=$mld_single_link
1064+ }
1065+
1066+ local mld_connect_band_pref=0
1067+ [ "$mld_primary" -gt 0 ] && {
1068+ if [ "$phy" = "phy0" ]; then
1069+ mld_connect_band_pref=1
1070+ elif [ "$phy" = "phy1" ]; then
1071+ mld_connect_band_pref=2
1072+ elif [ "$phy" = "phy2" ]; then
1073+ mld_connect_band_pref=3
1074+ fi
1075+ }
1076+
developer2cf3f4c2023-07-24 16:58:25 +08001077+ local tx_queue_data2_burst="tx_queue_data2_burst=0"
developer18015ad2023-07-13 13:18:19 +08001078 multiap_flag_file="${_config}.is_multiap"
1079 if [ "$multi_ap" = "1" ]; then
1080 touch "$multiap_flag_file"
developerd1ae4aa2023-12-26 11:04:29 +08001081@@ -1262,6 +1416,9 @@ wpa_supplicant_prepare_interface() {
developer18015ad2023-07-13 13:18:19 +08001082 ${scan_list:+freq_list=$scan_list}
1083 $ap_scan
1084 $country_str
1085+$tx_queue_data2_burst
developerd1ae4aa2023-12-26 11:04:29 +08001086+mld_connect_band_pref=$mld_connect_band_pref
1087+mld_force_single_link=$mld_force_single_link
developer18015ad2023-07-13 13:18:19 +08001088 EOF
1089 return 0
1090 }
developerd1ae4aa2023-12-26 11:04:29 +08001091@@ -1533,12 +1690,39 @@ wpa_supplicant_add_network() {
developer74503112023-06-29 17:34:49 +08001092 ;;
1093 esac
1094
developerbb29b5e2023-07-25 20:41:04 +08001095- [ "$wpa_cipher" = GCMP ] && {
1096- append network_data "pairwise=GCMP" "$N$T"
1097- append network_data "group=GCMP" "$N$T"
1098- }
developer74503112023-06-29 17:34:49 +08001099+ json_get_values pairwise pairwise
developer875fbb72023-12-13 15:49:01 +08001100+ json_get_vars group_cipher group_mgmt_cipher
developer9097e5e2023-07-19 10:22:24 +08001101+ if [ -n "$pairwise" ]; then
1102+ case "$pairwise" in
1103+ *tkip+aes|*tkip+ccmp|*aes+tkip|*ccmp+tkip)
1104+ wpa_cipher="CCMP TKIP"
1105+ ;;
1106+ *ccmp256)
1107+ wpa_cipher="CCMP-256"
1108+ ;;
1109+ *aes|*ccmp)
1110+ wpa_cipher="CCMP"
1111+ ;;
1112+ *tkip)
1113+ wpa_cipher="TKIP"
1114+ ;;
1115+ *gcmp256)
1116+ wpa_cipher="GCMP-256"
1117+ ;;
1118+ *gcmp)
1119+ wpa_cipher="GCMP"
1120+ ;;
1121+ *)
1122+ wpa_cipher=""
1123+ ;;
1124+ esac
1125+ fi
developer74503112023-06-29 17:34:49 +08001126+ [ -n "$wpa_cipher" ] && wpa_pairwise="$wpa_cipher"
developer74503112023-06-29 17:34:49 +08001127
1128 [ "$mode" = mesh ] || {
1129+ json_get_values sae_groups sae_groups
1130+ json_get_values owe_groups owe_groups
1131+
1132 case "$wpa" in
1133 1)
1134 append network_data "proto=WPA" "$N$T"
developerd1ae4aa2023-12-26 11:04:29 +08001135@@ -1548,12 +1732,58 @@ wpa_supplicant_add_network() {
developer74503112023-06-29 17:34:49 +08001136 ;;
1137 esac
1138
1139+ [ -n "$wpa_pairwise" ] && append network_data "pairwise=$wpa_pairwise" "$N$T"
1140+ [ -z "$group_cipher" ] && group_cipher="$wpa_cipher"
1141+
1142+ if [ -n "$sae_groups" -o -n "$owe_groups" ]; then
1143+ case "$auth_type" in
1144+ sae*)
1145+ echo "sae_groups=$sae_groups" >> "$_config"
1146+ append network_data "group=$group_cipher" "$N$T"
1147+ ;;
1148+ owe)
1149+ append network_data "owe_group=$owe_groups" "$N$T"
1150+ append network_data "group=$group_cipher" "$N$T"
1151+ ;;
1152+ esac
1153+ fi
1154+
1155+ # RSN -> allow management frame protection
1156 case "$ieee80211w" in
1157 [012])
1158- [ "$wpa" -ge 2 ] && append network_data "ieee80211w=$ieee80211w" "$N$T"
1159+ json_get_vars ieee80211w_mgmt_cipher ieee80211w_max_timeout ieee80211w_retry_timeout beacon_prot
1160+ append network_data "ieee80211w=$ieee80211w" "$N$T"
1161+ [ "$ieee80211w" -gt "0" ] && {
developer875fbb72023-12-13 15:49:01 +08001162+ if [ -z "$group_mgmt_cipher" ]; then
1163+ case "$group_cipher" in
1164+ CCMP-256)
1165+ ieee80211w_mgmt_cipher="BIP-CMAC-256"
1166+ ;;
1167+ CCMP)
1168+ ieee80211w_mgmt_cipher="AES-128-CMAC"
1169+ ;;
1170+ GCMP-256)
1171+ ieee80211w_mgmt_cipher="BIP-GMAC-256"
1172+ ;;
1173+ GCMP)
1174+ ieee80211w_mgmt_cipher="BIP-GMAC-128"
1175+ ;;
1176+ esac
1177+ else
1178+ ieee80211w_mgmt_cipher="$group_mgmt_cipher"
1179+ fi
developer74503112023-06-29 17:34:49 +08001180+ if [ "$auth_type" = "eap192" ]; then
1181+ append network_data "group_mgmt=BIP-GMAC-256" "$N$T"
1182+ else
1183+ append network_data "group_mgmt=${ieee80211w_mgmt_cipher:-AES-128-CMAC}" "$N$T"
1184+ fi
1185+ [ -n "$beacon_prot" ] && \
1186+ append network_data "beacon_prot=$beacon_prot" "$N$T"
1187+ }
1188 ;;
1189 esac
1190 }
1191+
1192 [ -n "$bssid" ] && append network_data "bssid=$bssid" "$N$T"
1193 [ -n "$beacon_int" ] && append network_data "beacon_int=$beacon_int" "$N$T"
1194
developerd1ae4aa2023-12-26 11:04:29 +08001195@@ -1564,6 +1794,20 @@ wpa_supplicant_add_network() {
developer82408892023-03-27 15:09:00 +08001196 [ -n "$bssid_blacklist" ] && append network_data "bssid_blacklist=$bssid_blacklist" "$N$T"
1197 [ -n "$bssid_whitelist" ] && append network_data "bssid_whitelist=$bssid_whitelist" "$N$T"
1198
1199+ local disable_eht
1200+ local disable_he
1201+ local disable_vht
1202+ local disable_ht
1203+ json_get_vars disable_eht
1204+ json_get_vars disable_he
1205+ json_get_vars disable_vht
1206+ json_get_vars disable_ht
1207+
1208+ [ -n "$disable_eht" ] && append network_data "disable_eht=$disable_eht" "$N$T"
1209+ [ -n "$disable_he" ] && append network_data "disable_he=$disable_he" "$N$T"
1210+ [ -n "$disable_vht" ] && append network_data "disable_vht=$disable_vht" "$N$T"
1211+ [ -n "$disable_ht" ] && append network_data "disable_ht=$disable_ht" "$N$T"
1212+
1213 [ -n "$basic_rate" ] && {
1214 local br rate_list=
1215 for br in $basic_rate; do
developerd1ae4aa2023-12-26 11:04:29 +08001216@@ -1578,6 +1822,11 @@ wpa_supplicant_add_network() {
developer85839fe2023-02-23 10:32:51 +08001217 append network_data "mcast_rate=$mc_rate" "$N$T"
1218 }
1219
1220+ if [ "$auth_type" = "sae" ]; then
1221+ json_get_vars sae_pwe sae_pwe
1222+ [ -n "$sae_pwe" ] && echo "sae_pwe=$sae_pwe" >> "$_config"
1223+ fi
1224+
1225 if [ "$key_mgmt" = "WPS" ]; then
1226 echo "wps_cred_processing=1" >> "$_config"
1227 else