hostapd: introduce mbo option
[openwrt/staging/stintel.git] / package / network / services / hostapd / files / hostapd.sh
index 060199fa0c84527834c815137c0b5221b3155063..be3993d4bd1a2888b4a44f2052c874ea9485efa0 100644 (file)
@@ -72,6 +72,15 @@ hostapd_append_wpa_key_mgmt() {
                ;;
        esac
 
+       [ "$fils" -gt 0 ] && {
+               case "$auth_type" in
+                       eap*)
+                               append wpa_key_mgmt FILS-SHA256
+                               [ "${ieee80211r:-0}" -gt 0 ] && append wpa_key_mgmt FT-FILS-SHA256
+                       ;;
+               esac
+       }
+
        [ "$auth_osen" = "1" ] && append wpa_key_mgmt "OSEN"
 }
 
@@ -263,6 +272,8 @@ hostapd_common_add_bss_config() {
        config_add_int acct_port
        config_add_int acct_interval
 
+       config_add_int bss_load_update_period chan_util_avg_period
+
        config_add_string dae_client
        config_add_string dae_secret
        config_add_int dae_port
@@ -293,9 +304,10 @@ hostapd_common_add_bss_config() {
        config_add_string wps_device_type wps_device_name wps_manufacturer wps_pin
        config_add_string multi_ap_backhaul_ssid multi_ap_backhaul_key
 
-       config_add_boolean wnm_sleep_mode bss_transition
+       config_add_boolean wnm_sleep_mode wnm_sleep_mode_no_keys bss_transition mbo
        config_add_int time_advertisement
        config_add_string time_zone
+       config_add_string vendor_elements
 
        config_add_boolean ieee80211k rrm_neighbor_report rrm_beacon_report
 
@@ -323,6 +335,7 @@ hostapd_common_add_bss_config() {
        config_add_int sae_pwe
 
        config_add_string 'owe_transition_bssid:macaddr' 'owe_transition_ssid:string'
+       config_add_string owe_transition_ifname
 
        config_add_boolean iw_enabled iw_internet iw_asra iw_esr iw_uesa
        config_add_int iw_access_network_type iw_venue_group iw_venue_type
@@ -348,6 +361,7 @@ hostapd_common_add_bss_config() {
        config_add_boolean multicast_to_unicast proxy_arp per_sta_vif
 
        config_add_array hostapd_bss_options
+       config_add_boolean default_disabled
 
        config_add_boolean request_cui
        config_add_array radius_auth_req_attr
@@ -355,6 +369,9 @@ hostapd_common_add_bss_config() {
 
        config_add_int eap_server
        config_add_string eap_user_file ca_cert server_cert private_key private_key_passwd server_id
+
+       config_add_boolean fils
+       config_add_string fils_dhcp
 }
 
 hostapd_set_vlan_file() {
@@ -510,7 +527,7 @@ hostapd_set_bss_options() {
 
        wireless_vif_parse_encryption
 
-       local bss_conf bss_md5sum
+       local bss_conf bss_md5sum ft_key
        local wep_rekey wpa_group_rekey wpa_pair_rekey wpa_master_rekey wpa_key_mgmt
 
        json_get_vars \
@@ -526,8 +543,10 @@ hostapd_set_bss_options() {
                multi_ap multi_ap_backhaul_ssid multi_ap_backhaul_key skip_inactivity_poll \
                airtime_bss_weight airtime_bss_limit airtime_sta_weight \
                multicast_to_unicast proxy_arp per_sta_vif \
-               eap_server eap_user_file ca_cert server_cert private_key private_key_passwd server_id
+               eap_server eap_user_file ca_cert server_cert private_key private_key_passwd server_id \
+               vendor_elements fils
 
+       set_default fils 0
        set_default isolate 0
        set_default maxassoc 0
        set_default max_inactivity 0
@@ -549,6 +568,8 @@ hostapd_set_bss_options() {
        set_default airtime_bss_limit 0
        set_default eap_server 0
 
+       /usr/sbin/hostapd -vfils || fils=0
+
        append bss_conf "ctrl_interface=/var/run/hostapd"
        if [ "$isolate" -gt 0 ]; then
                append bss_conf "ap_isolate=$isolate" "$N"
@@ -574,6 +595,7 @@ hostapd_set_bss_options() {
        append bss_conf "uapsd_advertisement_enabled=$uapsd" "$N"
        append bss_conf "utf8_ssid=$utf8_ssid" "$N"
        append bss_conf "multi_ap=$multi_ap" "$N"
+       [ -n "$vendor_elements" ] && append bss_conf "vendor_elements=$vendor_elements" "$N"
 
        [ "$tdls_prohibit" -gt 0 ] && append bss_conf "tdls_prohibit=$tdls_prohibit" "$N"
 
@@ -599,10 +621,12 @@ hostapd_set_bss_options() {
                sae|owe|eap192|eap-eap192)
                        set_default ieee80211w 2
                        set_default sae_require_mfp 1
+                       set_default sae_pwe 2
                ;;
                psk-sae)
                        set_default ieee80211w 1
                        set_default sae_require_mfp 1
+                       set_default sae_pwe 2
                ;;
        esac
        [ -n "$sae_require_mfp" ] && append bss_conf "sae_require_mfp=$sae_require_mfp" "$N"
@@ -612,10 +636,11 @@ hostapd_set_bss_options() {
 
        case "$auth_type" in
                none|owe)
-                       json_get_vars owe_transition_bssid owe_transition_ssid
+                       json_get_vars owe_transition_bssid owe_transition_ssid owe_transition_ifname
 
                        [ -n "$owe_transition_ssid" ] && append bss_conf "owe_transition_ssid=\"$owe_transition_ssid\"" "$N"
                        [ -n "$owe_transition_bssid" ] && append bss_conf "owe_transition_bssid=$owe_transition_bssid" "$N"
+                       [ -n "$owe_transition_ifname" ] && append bss_conf "owe_transition_ifname=$owe_transition_ifname" "$N"
 
                        wps_possible=1
                        # Here we make the assumption that if we're in open mode
@@ -648,7 +673,9 @@ hostapd_set_bss_options() {
                                auth_server auth_secret auth_port \
                                dae_client dae_secret dae_port \
                                ownip radius_client_addr \
-                               eap_reauth_period request_cui
+                               eap_reauth_period request_cui \
+                               erp_domain mobility_domain \
+                               fils_realm fils_dhcp
 
                        # radius can provide VLAN ID for clients
                        vlan_possible=1
@@ -658,6 +685,30 @@ hostapd_set_bss_options() {
                        [ -n "$auth_port" ] || json_get_var auth_port port
                        [ -n "$auth_secret" ] || json_get_var auth_secret key
 
+                       [ "$fils" -gt 0 ] && {
+                               set_default erp_domain "$mobility_domain"
+                               set_default erp_domain "$(echo "$ssid" | md5sum | head -c 8)"
+                               set_default fils_realm "$erp_domain"
+
+                               append bss_conf "erp_send_reauth_start=1" "$N"
+                               append bss_conf "erp_domain=$erp_domain" "$N"
+                               append bss_conf "fils_realm=$fils_realm" "$N"
+                               append bss_conf "fils_cache_id=$(echo "$fils_realm" | md5sum | head -c 4)" "$N"
+
+                               [ "$fils_dhcp" = "*" ] && {
+                                       json_get_values network network
+                                       fils_dhcp=
+                                       for net in $network; do
+                                               fils_dhcp="$(ifstatus "$net" | jsonfilter -e '@.data.dhcpserver')"
+                                               [ -n "$fils_dhcp" ] && break
+                                       done
+
+                                       [ -z "$fils_dhcp" -a -n "$network_bridge" -a -n "$network_ifname" ] && \
+                                               fils_dhcp="$(udhcpc -B -n -q -s /lib/netifd/dhcp-get-server.sh -t 1 -i "$network_ifname" 2>/dev/null)"
+                               }
+                               [ -n "$fils_dhcp" ] && append bss_conf "dhcp_server=$fils_dhcp" "$N"
+                       }
+
                        set_default auth_port 1812
                        set_default dae_port 3799
                        set_default request_cui 0
@@ -693,6 +744,25 @@ hostapd_set_bss_options() {
                ;;
        esac
 
+       case "$auth_type" in
+               none|owe|psk|sae|psk-sae|wep)
+                       json_get_vars \
+                       auth_server auth_port auth_secret \
+                       ownip radius_client_addr
+
+                       [ -n "$auth_server" ] &&  {
+                               set_default auth_port 1812
+
+                               append bss_conf "auth_server_addr=$auth_server" "$N"
+                               append bss_conf "auth_server_port=$auth_port" "$N"
+                               [ -n "$auth_secret" ] && append bss_conf "auth_server_shared_secret=$auth_secret" "$N"
+                               [ -n "$ownip" ] && append bss_conf "own_ip_addr=$ownip" "$N"
+                               [ -n "$radius_client_addr" ] && append bss_conf "radius_client_addr=$radius_client_addr" "$N"
+                               append bss_conf "macaddr_acl=2" "$N"
+                       }
+               ;;
+       esac
+
        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"
@@ -747,21 +817,33 @@ hostapd_set_bss_options() {
        }
 
        append bss_conf "ssid=$ssid" "$N"
-       [ -n "$network_bridge" ] && append bss_conf "bridge=$network_bridge" "$N"
+       [ -n "$network_bridge" ] && append bss_conf "bridge=$network_bridge${N}wds_bridge=" "$N"
+       [ -n "$network_ifname" ] && append bss_conf "snoop_iface=$network_ifname" "$N"
        [ -n "$iapp_interface" ] && {
                local ifname
                network_get_device ifname "$iapp_interface" || ifname="$iapp_interface"
                append bss_conf "iapp_interface=$ifname" "$N"
        }
 
-       json_get_vars time_advertisement time_zone wnm_sleep_mode bss_transition
+       json_get_vars time_advertisement time_zone wnm_sleep_mode wnm_sleep_mode_no_keys bss_transition mbo
        set_default bss_transition 0
        set_default wnm_sleep_mode 0
+       set_default wnm_sleep_mode_no_keys 0
+
+       if [ "$enable_ax" -eq 1 ]; then
+               set_default mbo 1
+       else
+               set_default mbo 0
+       fi
 
        [ -n "$time_advertisement" ] && append bss_conf "time_advertisement=$time_advertisement" "$N"
        [ -n "$time_zone" ] && append bss_conf "time_zone=$time_zone" "$N"
-       [ "$wnm_sleep_mode" -eq "1" ] && append bss_conf "wnm_sleep_mode=1" "$N"
+       if [ "$wnm_sleep_mode" -eq "1" ]; then
+               append bss_conf "wnm_sleep_mode=1" "$N"
+               [ "$wnm_sleep_mode_no_keys" -eq "1" ] && append bss_conf "wnm_sleep_mode_no_keys=1" "$N"
+       fi
        [ "$bss_transition" -eq "1" ] && append bss_conf "bss_transition=1" "$N"
+       [ "$mbo" -eq 1 ] && append bss_conf "mbo=1" "$N"
 
        json_get_vars ieee80211k rrm_neighbor_report rrm_beacon_report
        set_default ieee80211k 0
@@ -824,10 +906,10 @@ hostapd_set_bss_options() {
                                set_default pmk_r1_push 0
 
                                [ -n "$r0kh" -a -n "$r1kh" ] || {
-                                       key=`echo -n "$mobility_domain/$auth_secret" | md5sum | awk '{print $1}'`
+                                       ft_key=`echo -n "$mobility_domain/${auth_secret:-${key}}" | md5sum | awk '{print $1}'`
 
-                                       set_default r0kh "ff:ff:ff:ff:ff:ff,*,$key"
-                                       set_default r1kh "00:00:00:00:00:00,00:00:00:00:00:00,$key"
+                                       set_default r0kh "ff:ff:ff:ff:ff:ff,*,$ft_key"
+                                       set_default r1kh "00:00:00:00:00:00,00:00:00:00:00:00,$ft_key"
                                }
 
                                [ -n "$r1_key_holder" ] && append bss_conf "r1_key_holder=$r1_key_holder" "$N"
@@ -842,6 +924,10 @@ hostapd_set_bss_options() {
                                done
                        fi
                fi
+               if [ "$fils" -gt 0 ]; then
+                       json_get_vars fils_realm
+                       set_default fils_realm "$(echo "$ssid" | md5sum | head -c 8)"
+               fi
 
                append bss_conf "wpa_disable_eapol_key_retries=$wpa_disable_eapol_key_retries" "$N"
 
@@ -866,7 +952,7 @@ hostapd_set_bss_options() {
                fi
 
                append bss_conf "okc=$auth_cache" "$N"
-               [ "$auth_cache" = 0 ] && append bss_conf "disable_pmksa_caching=1" "$N"
+               [ "$auth_cache" = 0 -a "$fils" = 0 ] && append bss_conf "disable_pmksa_caching=1" "$N"
 
                # RSN -> allow management frame protection
                case "$ieee80211w" in
@@ -962,7 +1048,6 @@ hostapd_set_bss_options() {
                [ -n "$iw_network_auth_type" ] && \
                        append bss_conf "network_auth_type=$iw_network_auth_type" "$N"
                [ -n "$iw_gas_address3" ] && append bss_conf "gas_address3=$iw_gas_address3" "$N"
-               [ -n "$iw_qos_map_set" ] && append bss_conf "qos_map_set=$iw_qos_map_set" "$N"
 
                json_for_each_item append_iw_roaming_consortium iw_roaming_consortium
                json_for_each_item append_iw_anqp_elem iw_anqp_elem
@@ -981,6 +1066,12 @@ hostapd_set_bss_options() {
                        append bss_conf "anqp_3gpp_cell_net=$iw_anqp_3gpp_cell_net_conf" "$N"
        fi
 
+       set_default iw_qos_map_set 0,0,2,16,1,1,255,255,18,22,24,38,40,40,44,46,48,56
+       case "$iw_qos_map_set" in
+               *,*);;
+               *) iw_qos_map_set="";;
+       esac
+       [ -n "$iw_qos_map_set" ] && append bss_conf "qos_map_set=$iw_qos_map_set" "$N"
 
        local hs20 disable_dgaf osen anqp_domain_id hs20_deauth_req_timeout \
                osu_ssid hs20_wan_metrics hs20_operating_class hs20_t_c_filename hs20_t_c_timestamp \
@@ -1015,6 +1106,7 @@ hostapd_set_bss_options() {
 
        if [ "$eap_server" = "1" ]; then
                append bss_conf "eap_server=1" "$N"
+               append bss_conf "eap_server_erp=1" "$N"
                [ -n "$eap_user_file" ] && append bss_conf "eap_user_file=$eap_user_file" "$N"
                [ -n "$ca_cert" ] && append bss_conf "ca_cert=$ca_cert" "$N"
                [ -n "$server_cert" ] && append bss_conf "server_cert=$server_cert" "$N"
@@ -1155,8 +1247,8 @@ wpa_supplicant_set_fixed_freq() {
        append network_data "frequency=$freq" "$N$T"
        case "$htmode" in
                NOHT) append network_data "disable_ht=1" "$N$T";;
-               HT20|VHT20) append network_data "disable_ht40=1" "$N$T";;
-               HT40*|VHT40*|VHT80*|VHT160*) append network_data "ht40=1" "$N$T";;
+               HE20|HT20|VHT20) append network_data "disable_ht40=1" "$N$T";;
+               HT40*|VHT40|VHT80|VHT160|HE40|HE80|HE160) append network_data "ht40=1" "$N$T";;
        esac
        case "$htmode" in
                VHT*) append network_data "vht=1" "$N$T";;
@@ -1181,8 +1273,9 @@ wpa_supplicant_add_network() {
        json_get_vars \
                ssid bssid key \
                basic_rate mcast_rate \
-               ieee80211w ieee80211r \
-               multi_ap
+               ieee80211w ieee80211r fils \
+               multi_ap \
+               default_disabled
 
        case "$auth_type" in
                sae|owe|eap192|eap-eap192)
@@ -1195,6 +1288,7 @@ wpa_supplicant_add_network() {
 
        set_default ieee80211r 0
        set_default multi_ap 0
+       set_default default_disabled 0
 
        local key_mgmt='NONE'
        local network_data=
@@ -1226,7 +1320,10 @@ wpa_supplicant_add_network() {
                scan_ssid=""
        }
 
-       [ "$multi_ap" = 1 -a "$_w_mode" = "sta" ] && append network_data "multi_ap_backhaul_sta=1" "$N$T"
+       [ "$_w_mode" = "sta" ] && {
+               [ "$multi_ap" = 1 ] && append network_data "multi_ap_backhaul_sta=1" "$N$T"
+               [ "$default_disabled" = 1 ] && append network_data "disabled=1" "$N$T"
+       }
 
        case "$auth_type" in
                none) ;;
@@ -1268,6 +1365,7 @@ wpa_supplicant_add_network() {
 
                        json_get_vars eap_type identity anonymous_identity ca_cert ca_cert_usesystem
 
+                       [ "$fils" -gt 0 ] && append network_data "erp=1" "$N$T"
                        if [ "$ca_cert_usesystem" -eq "1" -a -f "/etc/ssl/certs/ca-certificates.crt" ]; then
                                append network_data "ca_cert=\"/etc/ssl/certs/ca-certificates.crt\"" "$N$T"
                        else