mirror of
https://github.com/Ysurac/openmptcprouter-feeds.git
synced 2025-03-09 15:40:03 +00:00
316 lines
11 KiB
Bash
316 lines
11 KiB
Bash
#!/bin/sh
|
|
#
|
|
# Copyright (c) 2017 Qualcomm Technologies, Inc.
|
|
# All Rights Reserved.
|
|
# Confidential and Proprietary - Qualcomm Technologies, Inc.
|
|
#
|
|
|
|
#
|
|
# Copyright (c) 2014, The Linux Foundation. All rights reserved.
|
|
#
|
|
|
|
IFNAME=$1
|
|
CMD=$2
|
|
|
|
if [ $CMD = "CONNECTED" ]; then
|
|
ker_ver=`uname -r |cut -d. -f1`
|
|
if [ $ker_ver == 5 ]; then
|
|
. /sbin/wifi config
|
|
else
|
|
. /sbin/wifi detect
|
|
fi
|
|
fi
|
|
|
|
parent=$(cat /sys/class/net/${IFNAME}/parent)
|
|
|
|
is_section_ifname() {
|
|
local config=$1
|
|
local ifname
|
|
config_get ifname "$config" ifname
|
|
[ "${ifname}" = "$2" ] && eval "$3=$config"
|
|
}
|
|
|
|
# Obtain the named configuration value in the supplicant config file,
|
|
# stripping off any double quotes.
|
|
#
|
|
# Return the value in the config_val global variable.
|
|
get_config_val() {
|
|
local conf=$1
|
|
local key=$2
|
|
|
|
# This finds the last key in the supplicant config and strips off leading
|
|
# and trailing quotes (if it has them).
|
|
#
|
|
# Note that it uses a leading space to ensure that only an exact match
|
|
# on the key is used.
|
|
config_val=$(awk "BEGIN{FS=\"=\"} /[[:space:]]${key}=/ {print \$0}" $conf |grep "${key}=" |tail -n 1 | cut -f 2 -d= | sed -e 's/^"\(.*\)"/\1/')
|
|
}
|
|
|
|
get_ssid() {
|
|
local conf=$1
|
|
|
|
get_config_val $conf 'ssid'
|
|
ssid=${config_val}
|
|
}
|
|
|
|
get_wpa_version() {
|
|
local conf=$1
|
|
|
|
local proto_key_str
|
|
get_config_val $conf 'proto'
|
|
proto_key_str="${config_val}"
|
|
|
|
get_config_val $conf 'key_mgmt'
|
|
proto_key_str="${proto_key_str} ${config_val}"
|
|
|
|
case "${proto_key_str}" in
|
|
"RSN WPA-PSK")
|
|
wpa_version="WPA2-PSK"
|
|
;;
|
|
|
|
"WPA WPA-PSK")
|
|
wpa_version="WPA-PSK"
|
|
;;
|
|
|
|
"RSN WPA-PSK SAE")
|
|
wpa_version="WPA3-PSK"
|
|
;;
|
|
|
|
"RSN SAE")
|
|
wpa_version="WPA3-SAE"
|
|
;;
|
|
|
|
# Since the proto key does not appear when no encryption
|
|
# is being used, we need to match against all possible
|
|
# combinations since the proto might have been extracted
|
|
# from a previous network section.
|
|
" NONE"|"RSN NONE"|"WPA NONE")
|
|
wpa_version="NONE"
|
|
;;
|
|
esac
|
|
}
|
|
|
|
get_psk() {
|
|
local conf=$1
|
|
|
|
get_config_val $conf 'psk'
|
|
psk=${config_val}
|
|
}
|
|
|
|
wps_pbc_enhc_get_clone_config() {
|
|
if [ -r $wps_pbc_enhc_file ]; then
|
|
local overwrite_ap_all=$(awk "/\-:overwrite_ap_settings_all/ {print;exit}" $wps_pbc_enhc_file | sed "s/\-://")
|
|
local overwrite_sta_all=$(awk "/\-:overwrite_sta_settings_all/ {print;exit}" $wps_pbc_enhc_file | sed "s/\-://")
|
|
local overwrite_ap=$(awk "/$parent:overwrite_ap_settings/ {print;exit}" $wps_pbc_enhc_file | sed "s/$parent://")
|
|
|
|
[ -n "$overwrite_ap_all" ] && \
|
|
IFNAME_OVERWRITE_AP=$(awk "/:[0-9\-]*:[0-9\-]*:.*:clone/" $wps_pbc_enhc_file | cut -f1 -d:)
|
|
|
|
[ -n "$overwrite_sta_all" ] && \
|
|
IFNAME_OVERWRITE_STA=$(awk "/:[0-9\-]*:[0-9\-]*:.*:clone/" $wps_pbc_enhc_file | cut -f1 -d:)
|
|
|
|
[ -z "$overwrite_ap_all" -a -n "$overwrite_ap" ] && \
|
|
IFNAME_OVERWRITE_AP=$(awk "/:[0-9\-]*:[0-9\-]*:$parent:clone/" $wps_pbc_enhc_file | cut -f1 -d:)
|
|
fi
|
|
}
|
|
|
|
wps_pbc_enhc_overwrite_ap_settings() {
|
|
local ifname_overwrite=$1
|
|
local ssid_overwrite=$2
|
|
local auth_overwrite=$3
|
|
local encr_overwrite=$4
|
|
local key_overwrite=
|
|
local parent_overwrite=$(cat /sys/class/net/${ifname_overwrite}/parent)
|
|
local ssid_suffix=$(awk "/\-:overwrite_ssid_suffix:/ {print;exit}" $wps_pbc_enhc_file | \
|
|
sed "s/\-:overwrite_ssid_suffix://")
|
|
local ssid_band_suffix=$(awk "/$parent_overwrite:overwrite_ssid_band_suffix:/ {print;exit}" $wps_pbc_enhc_file | \
|
|
sed "s/$parent_overwrite:overwrite_ssid_band_suffix://")
|
|
|
|
[ "${auth_overwrite}" = "SAE" -o "${auth_overwrite}" = "WPA2PSK" -o "${auth_overwrite}" = "WPAPSK" ] && key_overwrite=$5
|
|
|
|
if [ -r /var/run/hostapd-${parent_overwrite}/${ifname_overwrite} ]; then
|
|
hostapd_cli -i${ifname_overwrite} -p/var/run/hostapd-${parent_overwrite} wps_config \
|
|
${ssid_overwrite}${ssid_suffix}${ssid_band_suffix} ${auth_overwrite} ${encr_overwrite} ${key_overwrite}
|
|
fi
|
|
}
|
|
|
|
wps_pbc_enhc_overwrite_sta_settings() {
|
|
local ifname_overwrite=$1
|
|
local ssid_overwrite=$2
|
|
local auth_overwrite=$3
|
|
local key_overwrite=
|
|
local key_overwrite_len=
|
|
local nw=
|
|
local sect=
|
|
config_foreach is_section_ifname wifi-iface $ifname_overwrite sect
|
|
|
|
[ "${auth_overwrite}" = "WPA3-SAE" -o "${auth_overwrite}" = "WPA3-PSK" -o "${auth_overwrite}" = "WPA2-PSK" -o "${auth_overwrite}" = "WPA-PSK" ] && {
|
|
key_overwrite=$4
|
|
key_overwrite_len=${#key_overwrite}
|
|
}
|
|
|
|
if [ -r /var/run/wpa_supplicant-${ifname_overwrite} ]; then
|
|
nw=`wpa_cli -p /var/run/wpa_supplicant-${ifname_overwrite} add_network | cut -d ' ' -f 4`
|
|
wpa_cli -p /var/run/wpa_supplicant-${ifname_overwrite} set_network $nw ssid \"${ssid_overwrite}\"
|
|
uci set wireless.${sect}.ssid="$ssid_overwrite"
|
|
case $auth_overwrite in
|
|
WPA3-SAE)
|
|
wpa_cli -p /var/run/wpa_supplicant-${ifname_overwrite} set_network $nw key_mgmt SAE
|
|
wpa_cli -p /var/run/wpa_supplicant-${ifname_overwrite} set_network $nw ieee80211w 2
|
|
wpa_cli -p /var/run/wpa_supplicant-${ifname_overwrite} set_network $nw sae 1
|
|
wpa_cli -p /var/run/wpa_supplicant-${ifname_overwrite} set_network $nw auth_alg OPEN
|
|
wpa_cli -p /var/run/wpa_supplicant-${ifname_overwrite} set_network $nw pairwise CCMP
|
|
wpa_cli -p /var/run/wpa_supplicant-${ifname_overwrite} set_network $nw proto RSN
|
|
if [ $key_overwrite_len -eq 64 ]; then
|
|
wpa_cli -p /var/run/wpa_supplicant-${ifname_overwrite} set_network $nw psk ${key_overwrite}
|
|
else
|
|
wpa_cli -p /var/run/wpa_supplicant-${ifname_overwrite} set_network $nw psk \"${key_overwrite}\"
|
|
fi
|
|
uci set wireless.${sect}.encryption='ccmp'
|
|
uci set wireless.${sect}.sae_password=$key_overwrite
|
|
uci set wireless.${sect}.sae=1
|
|
uci set wireless.${sect}.key=''
|
|
;;
|
|
WPA3-PSK)
|
|
wpa_cli -p /var/run/wpa_supplicant-${ifname_overwrite} set_network $nw key_mgmt WPA-PSK SAE
|
|
wpa_cli -p /var/run/wpa_supplicant-${ifname_overwrite} set_network $nw ieee80211w 1
|
|
wpa_cli -p /var/run/wpa_supplicant-${ifname_overwrite} set_network $nw sae 1
|
|
wpa_cli -p /var/run/wpa_supplicant-${ifname_overwrite} set_network $nw auth_alg OPEN
|
|
wpa_cli -p /var/run/wpa_supplicant-${ifname_overwrite} set_network $nw pairwise CCMP
|
|
wpa_cli -p /var/run/wpa_supplicant-${ifname_overwrite} set_network $nw proto RSN
|
|
if [ $key_overwrite_len -eq 64 ]; then
|
|
wpa_cli -p /var/run/wpa_supplicant-${ifname_overwrite} set_network $nw psk ${key_overwrite}
|
|
else
|
|
wpa_cli -p /var/run/wpa_supplicant-${ifname_overwrite} set_network $nw psk \"${key_overwrite}\"
|
|
fi
|
|
uci set wireless.${sect}.encryption='psk2+ccmp'
|
|
uci set wireless.${sect}.key=$key_overwrite
|
|
uci set wireless.${sect}.sae='1'
|
|
;;
|
|
|
|
WPA2-PSK)
|
|
wpa_cli -p /var/run/wpa_supplicant-${ifname_overwrite} set_network $nw key_mgmt WPA-PSK
|
|
wpa_cli -p /var/run/wpa_supplicant-${ifname_overwrite} set_network $nw auth_alg OPEN
|
|
wpa_cli -p /var/run/wpa_supplicant-${ifname_overwrite} set_network $nw pairwise CCMP
|
|
wpa_cli -p /var/run/wpa_supplicant-${ifname_overwrite} set_network $nw proto RSN
|
|
if [ $key_overwrite_len -eq 64 ]; then
|
|
wpa_cli -p /var/run/wpa_supplicant-${ifname_overwrite} set_network $nw psk ${key_overwrite}
|
|
else
|
|
wpa_cli -p /var/run/wpa_supplicant-${ifname_overwrite} set_network $nw psk \"${key_overwrite}\"
|
|
fi
|
|
uci set wireless.${sect}.encryption='psk2'
|
|
uci set wireless.${sect}.key=$key_overwrite
|
|
;;
|
|
WPA-PSK)
|
|
wpa_cli -p /var/run/wpa_supplicant-${ifname_overwrite} set_network $nw key_mgmt WPA-PSK
|
|
wpa_cli -p /var/run/wpa_supplicant-${ifname_overwrite} set_network $nw auth_alg OPEN
|
|
wpa_cli -p /var/run/wpa_supplicant-${ifname_overwrite} set_network $nw pairwise TKIP
|
|
wpa_cli -p /var/run/wpa_supplicant-${ifname_overwrite} set_network $nw proto WPA
|
|
if [ $key_overwrite_len -eq 64 ]; then
|
|
wpa_cli -p /var/run/wpa_supplicant-${ifname_overwrite} set_network $nw psk ${key_overwrite}
|
|
else
|
|
wpa_cli -p /var/run/wpa_supplicant-${ifname_overwrite} set_network $nw psk \"${key_overwrite}\"
|
|
fi
|
|
uci set wireless.${sect}.encryption='psk'
|
|
uci set wireless.${sect}.key=$key_overwrite
|
|
;;
|
|
NONE)
|
|
wpa_cli -p /var/run/wpa_supplicant-${ifname_overwrite} set_network $nw key_mgmt NONE
|
|
uci set wireless.${sect}.encryption='none'
|
|
uci set wireless.${sect}.key=''
|
|
;;
|
|
esac
|
|
wpa_cli -p /var/run/wpa_supplicant-${ifname_overwrite} enable_network $nw
|
|
wpa_cli -p /var/run/wpa_supplicant-${ifname_overwrite} save_config
|
|
fi
|
|
}
|
|
|
|
psk=
|
|
ssid=
|
|
wpa_version=
|
|
IFNAME_OVERWRITE_AP=
|
|
IFNAME_OVERWRITE_STA=
|
|
wps_pbc_enhc_file=/var/run/wifi-wps-enhc-extn.conf
|
|
|
|
case "$CMD" in
|
|
CONNECTED)
|
|
wpa_cli -i$IFNAME -p/var/run/wpa_supplicant-$IFNAME save_config
|
|
|
|
# Read the configuration from the file to avoid a potential
|
|
# race where the supplicant is not in the associated state when
|
|
# its status command is executed.
|
|
get_ssid /var/run/wpa_supplicant-$IFNAME.conf
|
|
get_wpa_version /var/run/wpa_supplicant-$IFNAME.conf
|
|
get_psk /var/run/wpa_supplicant-$IFNAME.conf
|
|
wps_pbc_enhc_get_clone_config
|
|
sect=
|
|
config_foreach is_section_ifname wifi-iface $IFNAME sect
|
|
case $wpa_version in
|
|
WPA2-PSK)
|
|
uci set wireless.${sect}.encryption='psk2'
|
|
uci set wireless.${sect}.key=$psk
|
|
for intf in $IFNAME_OVERWRITE_AP; do
|
|
wps_pbc_enhc_overwrite_ap_settings $intf $ssid WPA2PSK CCMP $psk
|
|
done
|
|
;;
|
|
WPA-PSK)
|
|
uci set wireless.${sect}.encryption='psk'
|
|
uci set wireless.${sect}.key=$psk
|
|
for intf in $IFNAME_OVERWRITE_AP; do
|
|
wps_pbc_enhc_overwrite_ap_settings $intf $ssid WPAPSK TKIP $psk
|
|
done
|
|
;;
|
|
WPA2-PSK-SHA256)
|
|
uci set wireless.${sect}.encryption='psk2'
|
|
uci set wireless.${sect}.key=$psk
|
|
for intf in $IFNAME_OVERWRITE_AP; do
|
|
wps_pbc_enhc_overwrite_ap_settings $intf $ssid WPA2PSK CCMP $psk
|
|
done
|
|
;;
|
|
WPA3-PSK)
|
|
uci set wireless.${sect}.encryption='psk2+ccmp'
|
|
uci set wireless.${sect}.key=$psk
|
|
uci set wireless.${sect}.sae='1'
|
|
for intf in $IFNAME_OVERWRITE_AP; do
|
|
wps_pbc_enhc_overwrite_ap_settings $intf $ssid WPA2PSK CCMP $psk
|
|
done
|
|
;;
|
|
WPA3-SAE)
|
|
uci set wireless.${sect}.encryption='ccmp'
|
|
uci set wireless.${sect}.sae_password=$psk
|
|
uci set wireless.${sect}.sae='1'
|
|
uci set wireless.${sect}.key=''
|
|
for intf in $IFNAME_OVERWRITE_AP; do
|
|
wps_pbc_enhc_overwrite_ap_settings $intf $ssid SAE CCMP $psk
|
|
done
|
|
;;
|
|
|
|
NONE)
|
|
uci set wireless.${sect}.encryption='none'
|
|
uci set wireless.${sect}.key=''
|
|
for intf in $IFNAME_OVERWRITE_AP; do
|
|
wps_pbc_enhc_overwrite_ap_settings $intf $ssid OPEN NONE
|
|
done
|
|
;;
|
|
esac
|
|
uci set wireless.${sect}.ssid="$ssid"
|
|
for intf in $IFNAME_OVERWRITE_STA; do
|
|
[ "$IFNAME" != "$intf" ] && wps_pbc_enhc_overwrite_sta_settings $intf $ssid $wpa_version $psk
|
|
done
|
|
uci commit
|
|
if [ -r /var/run/wifi-wps-enhc-extn.pid ]; then
|
|
echo $IFNAME > /var/run/wifi-wps-enhc-extn.done
|
|
kill -SIGUSR1 "$(cat "/var/run/wifi-wps-enhc-extn.pid")"
|
|
fi
|
|
kill "$(cat "/var/run/wps-hotplug-$IFNAME.pid")"
|
|
#post hotplug event to whom take care of
|
|
env -i ACTION="wps-connected" INTERFACE=$IFNAME /sbin/hotplug-call iface
|
|
;;
|
|
WPS-TIMEOUT)
|
|
kill "$(cat "/var/run/wps-hotplug-$IFNAME.pid")"
|
|
env -i ACTION="wps-timeout" INTERFACE=$IFNAME /sbin/hotplug-call iface
|
|
;;
|
|
DISCONNECTED)
|
|
;;
|
|
esac
|
|
|