hostapd: reduce to a single instance per service
[openwrt/openwrt.git] / package / network / services / hostapd / files / hostapd.sh
index 540d1182cce60ad530b23c4bd3158442b6efcbb7..637f298ad9142a1725879192f4cfbae58a83b947 100644 (file)
@@ -47,6 +47,7 @@ hostapd_append_wpa_key_mgmt() {
                ;;
                eap192)
                        append wpa_key_mgmt "WPA-EAP-SUITE-B-192"
+                       [ "${ieee80211r:-0}" -gt 0 ] && append wpa_key_mgmt "FT-EAP"
                ;;
                eap-eap192)
                        append wpa_key_mgmt "WPA-EAP-SUITE-B-192"
@@ -90,6 +91,8 @@ hostapd_common_add_device_config() {
 
        config_add_string country
        config_add_boolean country_ie doth
+       config_add_boolean spectrum_mgmt_required
+       config_add_int local_pwr_constraint
        config_add_string require_mode
        config_add_boolean legacy_rates
 
@@ -106,11 +109,13 @@ hostapd_prepare_device_config() {
        local base="${config%%.conf}"
        local base_cfg=
 
-       json_get_vars country country_ie beacon_int:100 doth require_mode legacy_rates acs_chan_bias
+       json_get_vars country country_ie beacon_int:100 dtim_period:2 doth require_mode legacy_rates \
+               acs_chan_bias local_pwr_constraint spectrum_mgmt_required
 
        hostapd_set_log_options base_cfg
 
        set_default country_ie 1
+       set_default spectrum_mgmt_required 0
        set_default doth 1
        set_default legacy_rates 1
 
@@ -119,7 +124,11 @@ hostapd_prepare_device_config() {
        [ -n "$country" ] && {
                append base_cfg "country_code=$country" "$N"
 
-               [ "$country_ie" -gt 0 ] && append base_cfg "ieee80211d=1" "$N"
+               [ "$country_ie" -gt 0 ] && {
+                       append base_cfg "ieee80211d=1" "$N"
+                       [ -n "$local_pwr_constraint" ] && append base_cfg "local_pwr_constraint=$local_pwr_constraint" "$N"
+                       [ "$spectrum_mgmt_required" -gt 0 ] && append base_cfg "spectrum_mgmt_required=$spectrum_mgmt_required" "$N"
+               }
                [ "$hwmode" = "a" -a "$doth" -gt 0 ] && append base_cfg "ieee80211h=1" "$N"
        }
 
@@ -154,6 +163,7 @@ hostapd_prepare_device_config() {
        [ -n "$rlist" ] && append base_cfg "supported_rates=$rlist" "$N"
        [ -n "$brlist" ] && append base_cfg "basic_rates=$brlist" "$N"
        append base_cfg "beacon_int=$beacon_int" "$N"
+       append base_cfg "dtim_period=$dtim_period" "$N"
 
        json_get_values opts hostapd_options
        for val in $opts; do
@@ -168,7 +178,7 @@ EOF
 
 hostapd_common_add_bss_config() {
        config_add_string 'bssid:macaddr' 'ssid:string'
-       config_add_boolean wds wmm uapsd hidden
+       config_add_boolean wds wmm uapsd hidden utf8_ssid
 
        config_add_int maxassoc max_inactivity
        config_add_boolean disassoc_low_ack isolate short_preamble
@@ -176,6 +186,7 @@ hostapd_common_add_bss_config() {
        config_add_int \
                wep_rekey eap_reauth_period \
                wpa_group_rekey wpa_pair_rekey wpa_master_rekey
+       config_add_boolean wpa_strict_rekey
        config_add_boolean wpa_disable_eapol_key_retries
 
        config_add_boolean tdls_prohibit
@@ -202,6 +213,10 @@ hostapd_common_add_bss_config() {
        config_add_string radius_client_addr
        config_add_string iapp_interface
        config_add_string eap_type ca_cert client_cert identity anonymous_identity auth priv_key priv_key_pwd
+       config_add_boolean ca_cert_usesystem ca_cert2_usesystem
+       config_add_string subject_match subject_match2
+       config_add_array altsubject_match altsubject_match2
+       config_add_array domain_match domain_match2 domain_suffix_match domain_suffix_match2
        config_add_string ieee80211w_mgmt_cipher
 
        config_add_int dynamic_vlan vlan_naming
@@ -212,14 +227,19 @@ hostapd_common_add_bss_config() {
 
        config_add_string wpa_psk_file
 
+       config_add_int multi_ap
+
        config_add_boolean wps_pushbutton wps_label ext_registrar wps_pbc_in_m1
        config_add_int wps_ap_setup_locked wps_independent
        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 ieee80211v wnm_sleep_mode bss_transition
        config_add_int time_advertisement
        config_add_string time_zone
 
+       config_add_boolean ieee80211k rrm_neighbor_report rrm_beacon_report
+
        config_add_boolean ieee80211r pmk_r1_push ft_psk_generate_local ft_over_ds
        config_add_int r0_key_lifetime reassociation_deadline
        config_add_string mobility_domain r1_key_holder
@@ -249,19 +269,20 @@ hostapd_set_bss_options() {
 
        wireless_vif_parse_encryption
 
-       local bss_conf
+       local bss_conf bss_md5sum
        local wep_rekey wpa_group_rekey wpa_pair_rekey wpa_master_rekey wpa_key_mgmt
 
        json_get_vars \
-               wep_rekey wpa_group_rekey wpa_pair_rekey wpa_master_rekey \
+               wep_rekey wpa_group_rekey wpa_pair_rekey wpa_master_rekey wpa_strict_rekey \
                wpa_disable_eapol_key_retries tdls_prohibit \
                maxassoc max_inactivity disassoc_low_ack isolate auth_cache \
                wps_pushbutton wps_label ext_registrar wps_pbc_in_m1 wps_ap_setup_locked \
                wps_independent wps_device_type wps_device_name wps_manufacturer wps_pin \
-               macfilter ssid wmm uapsd hidden short_preamble rsn_preauth \
+               macfilter ssid utf8_ssid wmm uapsd hidden short_preamble rsn_preauth \
                iapp_interface eapol_version dynamic_vlan ieee80211w nasid \
                acct_server acct_secret acct_port acct_interval \
-               bss_load_update_period chan_util_avg_period sae_require_mfp
+               bss_load_update_period chan_util_avg_period sae_require_mfp \
+               multi_ap multi_ap_backhaul_ssid multi_ap_backhaul_key
 
        set_default isolate 0
        set_default maxassoc 0
@@ -277,7 +298,9 @@ hostapd_set_bss_options() {
        set_default acct_port 1813
        set_default bss_load_update_period 60
        set_default chan_util_avg_period 600
-       
+       set_default utf8_ssid 1
+       set_default multi_ap 0
+
        append bss_conf "ctrl_interface=/var/run/hostapd"
        if [ "$isolate" -gt 0 ]; then
                append bss_conf "ap_isolate=$isolate" "$N"
@@ -296,6 +319,8 @@ hostapd_set_bss_options() {
        append bss_conf "wmm_enabled=$wmm" "$N"
        append bss_conf "ignore_broadcast_ssid=$hidden" "$N"
        append bss_conf "uapsd_advertisement_enabled=$uapsd" "$N"
+       append bss_conf "utf8_ssid=$utf8_ssid" "$N"
+       append bss_conf "multi_ap=$multi_ap" "$N"
 
        [ "$tdls_prohibit" -gt 0 ] && append bss_conf "tdls_prohibit=$tdls_prohibit" "$N"
 
@@ -303,6 +328,7 @@ hostapd_set_bss_options() {
                [ -n "$wpa_group_rekey"  ] && append bss_conf "wpa_group_rekey=$wpa_group_rekey" "$N"
                [ -n "$wpa_pair_rekey"   ] && append bss_conf "wpa_ptk_rekey=$wpa_pair_rekey"    "$N"
                [ -n "$wpa_master_rekey" ] && append bss_conf "wpa_gmk_rekey=$wpa_master_rekey"  "$N"
+               [ -n "$wpa_strict_rekey" ] && append bss_conf "wpa_strict_rekey=$wpa_strict_rekey" "$N"
        }
 
        [ -n "$nasid" ] && append bss_conf "nas_identifier=$nasid" "$N"
@@ -418,6 +444,9 @@ hostapd_set_bss_options() {
        [ "$wps_pushbutton" -gt 0 ] && append config_methods push_button
        [ "$wps_label" -gt 0 ] && append config_methods label
 
+       # WPS not possible on Multi-AP backhaul-only SSID
+       [ "$multi_ap" = 1 ] && wps_possible=
+
        [ -n "$wps_possible" -a -n "$config_methods" ] && {
                set_default ext_registrar 0
                set_default wps_device_type "6-0050F204-1"
@@ -440,6 +469,19 @@ hostapd_set_bss_options() {
                append bss_conf "wps_independent=$wps_independent" "$N"
                [ -n "$wps_ap_setup_locked" ] && append bss_conf "ap_setup_locked=$wps_ap_setup_locked" "$N"
                [ "$wps_pbc_in_m1" -gt 0 ] && append bss_conf "pbc_in_m1=$wps_pbc_in_m1" "$N"
+               [ "$multi_ap" -gt 0 ] && [ -n "$multi_ap_backhaul_ssid" ] && {
+                       append bss_conf "multi_ap_backhaul_ssid=\"$multi_ap_backhaul_ssid\"" "$N"
+                       if [ -z "$multi_ap_backhaul_key" ]; then
+                               :
+                       elif [ ${#multi_ap_backhaul_key} -lt 8 ]; then
+                               wireless_setup_vif_failed INVALID_WPA_PSK
+                               return 1
+                       elif [ ${#multi_ap_backhaul_key} -eq 64 ]; then
+                               append bss_conf "multi_ap_backhaul_wpa_psk=$multi_ap_backhaul_key" "$N"
+                       else
+                               append bss_conf "multi_ap_backhaul_wpa_passphrase=$multi_ap_backhaul_key" "$N"
+                       fi
+               }
        }
 
        append bss_conf "ssid=$ssid" "$N"
@@ -465,6 +507,17 @@ hostapd_set_bss_options() {
                append bss_conf "bss_transition=$bss_transition" "$N"
        fi
 
+       json_get_vars ieee80211k
+       set_default ieee80211k 0
+       if [ "$ieee80211k" -eq "1" ]; then
+               json_get_vars rrm_neighbor_report rrm_beacon_report
+
+               set_default rrm_neighbor_report 1
+               set_default rrm_beacon_report 1
+               append bss_conf "rrm_neighbor_report=$rrm_neighbor_report" "$N"
+               append bss_conf "rrm_beacon_report=$rrm_beacon_report" "$N"
+       fi
+
        if [ "$wpa" -ge "1" ]; then
                json_get_vars ieee80211r
                set_default ieee80211r 0
@@ -473,10 +526,18 @@ hostapd_set_bss_options() {
                        json_get_vars mobility_domain ft_psk_generate_local ft_over_ds reassociation_deadline
                        
                        set_default mobility_domain "$(echo "$ssid" | md5sum | head -c 4)"
-                       set_default ft_psk_generate_local 1
                        set_default ft_over_ds 1
                        set_default reassociation_deadline 1000
 
+                       case "$auth_type" in
+                               psk|sae|psk-sae)
+                                       set_default ft_psk_generate_local 1
+                               ;;
+                               *)
+                                       set_default ft_psk_generate_local 0
+                               ;;
+                       esac
+
                        append bss_conf "mobility_domain=$mobility_domain" "$N"
                        append bss_conf "ft_psk_generate_local=$ft_psk_generate_local" "$N"
                        append bss_conf "ft_over_ds=$ft_over_ds" "$N"
@@ -516,7 +577,14 @@ hostapd_set_bss_options() {
                        append bss_conf "rsn_preauth=1" "$N"
                        append bss_conf "rsn_preauth_interfaces=$network_bridge" "$N"
                else
-                       set_default auth_cache 0
+                       case "$auth_type" in
+                       sae|psk-sae|owe)
+                               set_default auth_cache 1
+                       ;;
+                       *)
+                               set_default auth_cache 0
+                       ;;
+                       esac
                fi
 
                append bss_conf "okc=$auth_cache" "$N"
@@ -583,6 +651,9 @@ hostapd_set_bss_options() {
                }
        }
 
+       bss_md5sum=$(echo $bss_conf | md5sum | cut -d" " -f1)
+       append bss_conf "config_id=$bss_md5sum" "$N"
+
        append "$var" "$bss_conf" "$N"
        return 0
 }
@@ -638,7 +709,7 @@ wpa_supplicant_prepare_interface() {
 
        _wpa_supplicant_common "$1"
 
-       json_get_vars mode wds
+       json_get_vars mode wds multi_ap
 
        [ -n "$network_bridge" ] && {
                fail=
@@ -647,7 +718,7 @@ wpa_supplicant_prepare_interface() {
                                fail=1
                        ;;
                        sta)
-                               [ "$wds" = 1 ] || fail=1
+                               [ "$wds" = 1 -o "$multi_ap" = 1 ] || fail=1
                        ;;
                esac
 
@@ -660,12 +731,9 @@ wpa_supplicant_prepare_interface() {
        local ap_scan=
 
        _w_mode="$mode"
-       _w_modestr=
 
-       [[ "$mode" = adhoc ]] && {
+       [ "$mode" = adhoc ] && {
                ap_scan="ap_scan=2"
-
-               _w_modestr="mode=1"
        }
 
        local country_str=
@@ -673,6 +741,12 @@ wpa_supplicant_prepare_interface() {
                country_str="country=$country"
        }
 
+       multiap_flag_file="${_config}.is_multiap"
+       if [ "$multi_ap" = "1" ]; then
+               touch "$multiap_flag_file"
+       else
+               [ -e "$multiap_flag_file" ] && rm "$multiap_flag_file"
+       fi
        wpa_supplicant_teardown_interface "$ifname"
        cat > "$_config" <<EOF
 $ap_scan
@@ -714,9 +788,20 @@ wpa_supplicant_add_network() {
        json_get_vars \
                ssid bssid key \
                basic_rate mcast_rate \
-               ieee80211w ieee80211r
+               ieee80211w ieee80211r \
+               multi_ap
+
+       case "$auth_type" in
+               sae|owe|eap192|eap-eap192)
+                       set_default ieee80211w 2
+               ;;
+               psk-sae)
+                       set_default ieee80211w 1
+               ;;
+       esac
 
        set_default ieee80211r 0
+       set_default multi_ap 0
 
        local key_mgmt='NONE'
        local enc_str=
@@ -726,16 +811,17 @@ wpa_supplicant_add_network() {
        local scan_ssid="scan_ssid=1"
        local freq wpa_key_mgmt
 
-       [[ "$_w_mode" = "adhoc" ]] && {
+       [ "$_w_mode" = "adhoc" ] && {
                append network_data "mode=1" "$N$T"
                [ -n "$freq" ] && wpa_supplicant_set_fixed_freq "$freq" "$htmode"
+               [ "$noscan" = "1" ] && append network_data "noscan=1" "$N$T"
 
                scan_ssid="scan_ssid=0"
 
                [ "$_w_driver" = "nl80211" ] || append wpa_key_mgmt "WPA-NONE"
        }
 
-       [[ "$_w_mode" = "mesh" ]] && {
+       [ "$_w_mode" = "mesh" ] && {
                json_get_vars mesh_id mesh_fwding mesh_rssi_threshold
                [ -n "$mesh_id" ] && ssid="${mesh_id}"
 
@@ -748,18 +834,22 @@ wpa_supplicant_add_network() {
                scan_ssid=""
        }
 
-       [ "$_w_mode" = "adhoc" -o "$_w_mode" = "mesh" ] && append network_data "$_w_modestr" "$N$T"
+       [ "$multi_ap" = 1 -a "$_w_mode" = "sta" ] && append network_data "multi_ap_backhaul_sta=1" "$N$T"
 
        case "$auth_type" in
                none) ;;
                owe)
                        hostapd_append_wpa_key_mgmt
+                       key_mgmt="$wpa_key_mgmt"
                ;;
                wep)
                        local wep_keyidx=0
                        hostapd_append_wep_key network_data
                        append network_data "wep_tx_keyidx=$wep_keyidx" "$N$T"
                ;;
+               wps)
+                       key_mgmt='WPS'
+               ;;
                psk|sae|psk-sae)
                        local passphrase
 
@@ -784,8 +874,13 @@ wpa_supplicant_add_network() {
                        hostapd_append_wpa_key_mgmt
                        key_mgmt="$wpa_key_mgmt"
 
-                       json_get_vars eap_type identity anonymous_identity ca_cert
-                       [ -n "$ca_cert" ] && append network_data "ca_cert=\"$ca_cert\"" "$N$T"
+                       json_get_vars eap_type identity anonymous_identity ca_cert ca_cert_usesystem
+
+                       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
+                               [ -n "$ca_cert" ] && append network_data "ca_cert=\"$ca_cert\"" "$N$T"
+                       fi
                        [ -n "$identity" ] && append network_data "identity=\"$identity\"" "$N$T"
                        [ -n "$anonymous_identity" ] && append network_data "anonymous_identity=\"$anonymous_identity\"" "$N$T"
                        case "$eap_type" in
@@ -794,14 +889,47 @@ wpa_supplicant_add_network() {
                                        append network_data "client_cert=\"$client_cert\"" "$N$T"
                                        append network_data "private_key=\"$priv_key\"" "$N$T"
                                        append network_data "private_key_passwd=\"$priv_key_pwd\"" "$N$T"
+
+                                       json_get_vars subject_match
+                                       [ -n "$subject_match" ] && append network_data "subject_match=\"$subject_match\"" "$N$T"
+
+                                       json_get_values altsubject_match altsubject_match
+                                       if [ -n "$altsubject_match" ]; then
+                                               local list=
+                                               for x in $altsubject_match; do
+                                                       append list "$x" ";"
+                                               done
+                                               append network_data "altsubject_match=\"$list\"" "$N$T"
+                                       fi
+
+                                       json_get_values domain_match domain_match
+                                       if [ -n "$domain_match" ]; then
+                                               local list=
+                                               for x in $domain_match; do
+                                                       append list "$x" ";"
+                                               done
+                                               append network_data "domain_match=\"$list\"" "$N$T"
+                                       fi
+
+                                       json_get_values domain_suffix_match domain_suffix_match
+                                       if [ -n "$domain_suffix_match" ]; then
+                                               local list=
+                                               for x in $domain_suffix_match; do
+                                                       append list "$x" ";"
+                                               done
+                                               append network_data "domain_suffix_match=\"$list\"" "$N$T"
+                                       fi
                                ;;
                                fast|peap|ttls)
-                                       json_get_vars auth password ca_cert2 client_cert2 priv_key2 priv_key2_pwd
+                                       json_get_vars auth password ca_cert2 ca_cert2_usesystem client_cert2 priv_key2 priv_key2_pwd
                                        set_default auth MSCHAPV2
 
                                        if [ "$auth" = "EAP-TLS" ]; then
-                                               [ -n "$ca_cert2" ] &&
-                                                       append network_data "ca_cert2=\"$ca_cert2\"" "$N$T"
+                                               if [ "$ca_cert2_usesystem" -eq "1" -a -f "/etc/ssl/certs/ca-certificates.crt" ]; then
+                                                       append network_data "ca_cert2=\"/etc/ssl/certs/ca-certificates.crt\"" "$N$T"
+                                               else
+                                                       [ -n "$ca_cert2" ] && append network_data "ca_cert2=\"$ca_cert2\"" "$N$T"
+                                               fi
                                                append network_data "client_cert2=\"$client_cert2\"" "$N$T"
                                                append network_data "private_key2=\"$priv_key2\"" "$N$T"
                                                append network_data "private_key2_passwd=\"$priv_key2_pwd\"" "$N$T"
@@ -809,6 +937,36 @@ wpa_supplicant_add_network() {
                                                append network_data "password=\"$password\"" "$N$T"
                                        fi
 
+                                       json_get_vars subject_match
+                                       [ -n "$subject_match" ] && append network_data "subject_match=\"$subject_match\"" "$N$T"
+
+                                       json_get_values altsubject_match altsubject_match
+                                       if [ -n "$altsubject_match" ]; then
+                                               local list=
+                                               for x in $altsubject_match; do
+                                                       append list "$x" ";"
+                                               done
+                                               append network_data "altsubject_match=\"$list\"" "$N$T"
+                                       fi
+
+                                       json_get_values domain_match domain_match
+                                       if [ -n "$domain_match" ]; then
+                                               local list=
+                                               for x in $domain_match; do
+                                                       append list "$x" ";"
+                                               done
+                                               append network_data "domain_match=\"$list\"" "$N$T"
+                                       fi
+
+                                       json_get_values domain_suffix_match domain_suffix_match
+                                       if [ -n "$domain_suffix_match" ]; then
+                                               local list=
+                                               for x in $domain_suffix_match; do
+                                                       append list "$x" ";"
+                                               done
+                                               append network_data "domain_suffix_match=\"$list\"" "$N$T"
+                                       fi
+
                                        phase2proto="auth="
                                        case "$auth" in
                                                "auth"*)
@@ -818,6 +976,35 @@ wpa_supplicant_add_network() {
                                                        auth="$(echo $auth | cut -b 5- )"
                                                        [ "$eap_type" = "ttls" ] &&
                                                                phase2proto="autheap="
+                                                       json_get_vars subject_match2
+                                                       [ -n "$subject_match2" ] && append network_data "subject_match2=\"$subject_match2\"" "$N$T"
+
+                                                       json_get_values altsubject_match2 altsubject_match2
+                                                       if [ -n "$altsubject_match2" ]; then
+                                                               local list=
+                                                               for x in $altsubject_match2; do
+                                                                       append list "$x" ";"
+                                                               done
+                                                               append network_data "altsubject_match2=\"$list\"" "$N$T"
+                                                       fi
+
+                                                       json_get_values domain_match2 domain_match2
+                                                       if [ -n "$domain_match2" ]; then
+                                                               local list=
+                                                               for x in $domain_match2; do
+                                                                       append list "$x" ";"
+                                                               done
+                                                               append network_data "domain_match2=\"$list\"" "$N$T"
+                                                       fi
+
+                                                       json_get_values domain_suffix_match2 domain_suffix_match2
+                                                       if [ -n "$domain_suffix_match2" ]; then
+                                                               local list=
+                                                               for x in $domain_suffix_match2; do
+                                                                       append list "$x" ";"
+                                                               done
+                                                               append network_data "domain_suffix_match2=\"$list\"" "$N$T"
+                                                       fi
                                                ;;
                                        esac
                                        append network_data "phase2=\"$phase2proto$auth\"" "$N$T"
@@ -867,7 +1054,10 @@ wpa_supplicant_add_network() {
                append network_data "mcast_rate=$mc_rate" "$N$T"
        }
 
-       cat >> "$_config" <<EOF
+       if [ "$key_mgnt" = "WPS" ]; then
+               echo "wps_cred_processing=1" >> "$_config"
+       else
+               cat >> "$_config" <<EOF
 network={
        $scan_ssid
        ssid="$ssid"
@@ -875,31 +1065,34 @@ network={
        $network_data
 }
 EOF
+       fi
        return 0
 }
 
 wpa_supplicant_run() {
-       local ifname="$1"; shift
+       local ifname="$1"
+       local hostapd_ctrl="$2"
 
        _wpa_supplicant_common "$ifname"
 
-       /usr/sbin/wpa_supplicant -B \
-               ${network_bridge:+-b $network_bridge} \
-               -P "/var/run/wpa_supplicant-${ifname}.pid" \
-               -D ${_w_driver:-wext} \
-               -i "$ifname" \
-               -c "$_config" \
-               -C "$_rpath" \
-               "$@"
+       ubus wait_for wpa_supplicant
+       ubus call wpa_supplicant config_add "{ \
+               \"driver\": \"${_w_driver:-wext}\", \"ctrl\": \"$_rpath\", \
+               \"iface\": \"$ifname\", \"config\": \"$_config\" \
+               ${network_bridge:+, \"bridge\": \"$network_bridge\"} \
+               ${hostapd_ctrl:+, \"hostapd_ctrl\": \"$hostapd_ctrl\"} \
+               }"
 
        ret="$?"
-       wireless_add_process "$(cat "/var/run/wpa_supplicant-${ifname}.pid")" /usr/sbin/wpa_supplicant 1
 
        [ "$ret" != 0 ] && wireless_setup_vif_failed WPA_SUPPLICANT_FAILED
 
+       local supplicant_pid=$(ubus call service list '{"name": "hostapd"}' | jsonfilter -l 1 -e "@['hostapd'].instances['supplicant'].pid")
+       wireless_add_process "$supplicant_pid" "/usr/sbin/wpa_supplicant" 1
+
        return $ret
 }
 
 hostapd_common_cleanup() {
-       killall hostapd wpa_supplicant meshd-nl80211
+       killall meshd-nl80211
 }