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
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
. /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