1 # SPDX-License-Identifier: BSD-2-Clause 2 # Copyright (c) 2017-2024 Roy Marples <roy (a] marples.name> 3 4 # Start, reconfigure and stop wpa_supplicant per wireless interface. 5 # 6 # This is only needed when using wpa_supplicant-2.5 or older, OR 7 # when wpa_supplicant has not been built with CONFIG_MATCH_IFACE, OR 8 # wpa_supplicant was launched without the -M flag to activate 9 # interface matching. 10 11 if [ -z "$wpa_supplicant_conf" ]; then 12 for x in \ 13 /etc/wpa_supplicant/wpa_supplicant-"$interface".conf \ 14 /etc/wpa_supplicant/wpa_supplicant.conf \ 15 /etc/wpa_supplicant-"$interface".conf \ 16 /etc/wpa_supplicant.conf \ 17 ; do 18 if [ -s "$x" ]; then 19 wpa_supplicant_conf="$x" 20 break 21 fi 22 done 23 fi 24 : ${wpa_supplicant_conf:=/etc/wpa_supplicant.conf} 25 26 wpa_supplicant_ctrldir() 27 { 28 dir=$(key_get_value "[[:space:]]*ctrl_interface=" \ 29 "$wpa_supplicant_conf") 30 dir=$(trim "$dir") 31 case "$dir" in 32 DIR=*) 33 dir=${dir##DIR=} 34 dir=${dir%%[[:space:]]GROUP=*} 35 dir=$(trim "$dir") 36 ;; 37 esac 38 printf %s "$dir" 39 } 40 41 wpa_supplicant_start() 42 { 43 # If the carrier is up, don't bother checking anything 44 [ "$ifcarrier" = "up" ] && return 0 45 46 # Pre flight checks 47 if [ ! -s "$wpa_supplicant_conf" ]; then 48 syslog warn \ 49 "$wpa_supplicant_conf does not exist" 50 syslog warn "not interacting with wpa_supplicant(8)" 51 return 1 52 fi 53 dir=$(wpa_supplicant_ctrldir) 54 if [ -z "$dir" ]; then 55 syslog warn \ 56 "ctrl_interface not defined in $wpa_supplicant_conf" 57 syslog warn "not interacting with wpa_supplicant(8)" 58 return 1 59 fi 60 61 wpa_cli -p "$dir" -i "$interface" status >/dev/null 2>&1 && return 0 62 syslog info "starting wpa_supplicant" 63 driver=${wpa_supplicant_driver:+-D}$wpa_supplicant_driver 64 err=$(wpa_supplicant -B -c"$wpa_supplicant_conf" -i"$interface" \ 65 "$driver" 2>&1) 66 errn=$? 67 if [ $errn != 0 ]; then 68 syslog err "failed to start wpa_supplicant" 69 syslog err "$err" 70 fi 71 return $errn 72 } 73 74 wpa_supplicant_reconfigure() 75 { 76 dir=$(wpa_supplicant_ctrldir) 77 [ -z "$dir" ] && return 1 78 if ! wpa_cli -p "$dir" -i "$interface" status >/dev/null 2>&1; then 79 wpa_supplicant_start 80 return $? 81 fi 82 syslog info "reconfiguring wpa_supplicant" 83 err=$(wpa_cli -p "$dir" -i "$interface" reconfigure 2>&1) 84 errn=$? 85 if [ $errn != 0 ]; then 86 syslog err "failed to reconfigure wpa_supplicant" 87 syslog err "$err" 88 fi 89 return $errn 90 } 91 92 wpa_supplicant_stop() 93 { 94 dir=$(wpa_supplicant_ctrldir) 95 [ -z "$dir" ] && return 1 96 wpa_cli -p "$dir" -i "$interface" status >/dev/null 2>&1 || return 0 97 syslog info "stopping wpa_supplicant" 98 err=$(wpa_cli -i"$interface" terminate 2>&1) 99 errn=$? 100 if [ $errn != 0 ]; then 101 syslog err "failed to stop wpa_supplicant" 102 syslog err "$err" 103 fi 104 return $errn 105 } 106 107 if [ "$ifwireless" = "1" ] && \ 108 command -v wpa_supplicant >/dev/null 2>&1 && \ 109 command -v wpa_cli >/dev/null 2>&1 110 then 111 case "$reason" in 112 PREINIT) wpa_supplicant_start;; 113 RECONFIGURE) wpa_supplicant_reconfigure;; 114 DEPARTED|STOPPED) wpa_supplicant_stop;; 115 esac 116 fi 117