You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
193 lines
6.9 KiB
Plaintext
193 lines
6.9 KiB
Plaintext
4 years ago
|
#!/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
|
||
|
. /sbin/wifi detect
|
||
|
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"
|
||
|
}
|
||
|
|
||
|
get_psk() {
|
||
|
local count=
|
||
|
local conf=$1
|
||
|
local index=
|
||
|
# This finds the last PSK in the supplicant config and strips off leading
|
||
|
# and trailing quotes (if it has them). Generally the quotes are not there
|
||
|
# when doing WPS push button.
|
||
|
psk=$(awk 'BEGIN{FS="="} /psk=/ {print $0}' $conf |grep "psk=" |tail -n 1 | cut -f 2 -d= | sed -e 's/^"\(.*\)"/\1/')
|
||
|
}
|
||
|
|
||
|
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}" = "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}" = "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
|
||
|
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
|
||
|
ssid=$(wpa_cli -i$IFNAME -p/var/run/wpa_supplicant-$IFNAME status | grep ^ssid= | cut -f2- -d =)
|
||
|
wpa_version=$(wpa_cli -i$IFNAME -p/var/run/wpa_supplicant-$IFNAME status | grep ^key_mgmt= | cut -f2- -d=)
|
||
|
get_psk /var/run/wpa_supplicant-$IFNAME.conf
|
||
|
wps_pbc_enhc_get_clone_config
|
||
|
local 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
|
||
|
;;
|
||
|
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
|
||
|
|