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.

481 lines
10 KiB
Bash

#!/bin/sh /etc/rc.common
# Copyright (c) 2013 Qualcomm Atheros, Inc.
#
# All Rights Reserved.
# Qualcomm Atheros Confidential and Proprietary.
START=50
SERVICE_WRITE_PID=1
SERVICE_DAEMONIZE=1
#SERVICE_DEBUG=1
NETWORK_RESTART=0
SERVICE_DEBUG_OUTPUT=0
ACD_DEBUG_OUTOUT=0
SERVICE_PATH="/usr/sbin/acd"
ACD_CONFIG_FILE="/tmp/acd.conf"
WIRELESS_CONFIG_FILE="/etc/config/wireless"
EXTRA_COMMANDS="restart_in_hc_mode restart_in_hr_mode"
EXTRA_HELP=<<EOF
restart_in_hc_mode Reconfigure the system in Hybrid Client mode
restart_in_hr_mode Reconfigure the system in Hybrid Router mode
EOF
. /lib/functions/hyfi-debug.sh
. /lib/functions/hyfi-iface.sh
. /lib/functions/hyfi-network.sh
ieee1905managed= config_changed=
wsplcd_start=0 wsplcd_restart=0
hyd_start=0 vhyfid_start=0
__acd_echo() {
if [ "$ACD_DEBUG_OUTOUT" -gt 0 ]; then
echo "acd: $1" > /dev/console
else
echo "acd: $1"
fi
}
__acd_append_wireless() {
echo "$1" >> "$WIRELESS_CONFIG_FILE"
}
__acd_router_mode() {
local wan_iface
config_load network
config_get wan_iface wan ifname
[ -n "$wan_iface" ] && return 1
return 0
}
__acd_get_freq_from_standard() {
config_get hwmode $1 hwmode '11ng'
case "$hwmode" in
11ac|11na|11a)
eval "$2='5G'"
;;
*)
eval "$2='2G'"
;;
esac
}
__acd_vaps_in_default_config() {
local ssid encryption last_vap
ssid=`uci show wireless | grep "ssid=OpenWrt"`
encryption=`uci show wireless | grep "encryption=none"`
__acd_echo "ssid=$ssid encryption=$encryption"
if [ -n "$ssid" -a -n "$encryption" ]; then
return 1
fi
last_vap=`uci show wireless.@wifi-iface[-1]`
__acd_echo "last_vap=$last_vap"
[ -z "$last_vap" ] && return 1
return 0
}
__acd_destroy_vaps() {
local retval
/sbin/wifi down
/etc/init.d/network stop
uci delete wireless.@wifi-iface[0] 2>/dev/null; retval=$?
while [ "$retval" -eq 0 ]; do
uci delete wireless.@wifi-iface[0] 2>/dev/null
retval=$?
done
uci commit wireless
}
__acd_enable_wifi() {
local DEVICES=
local device changed=0
config_cb() {
local type="$1"
local section="$2"
case "$type" in
wifi-device)
append DEVICES "$section"
;;
esac
}
config_load wireless
for device in $DEVICES ; do
config_get_bool disabled $device disabled
[ -z "$disabled" ] && continue
[ "$disabled" -eq 0 ] && continue
uci_set wireless $device disabled '0'
changed=1
done
if [ "$changed" -gt 0 ]; then
uci_commit wireless
config_changed=1
fi
}
__acd_create_vaps() {
local DEVICES=
local HYFI_SEED=
local AP_disabled=0 STA_disabled=0
config_cb() {
local type="$1"
local section="$2"
case "$type" in
wifi-device)
append DEVICES "$section"
;;
esac
}
config_load wireless
HYFI_SEED=`ifconfig br-$ieee1905managed | grep HWaddr | awk '{print $5}' | awk -F":" '{print $4$5$6}'`
if [ -z "$DEVICES" ]; then
DEVICES=`ls /sys/class/net/wifi* -d1 | awk -F/ '{print $NF}'`
fi
for device in $DEVICES ; do
uci_set wireless $device disabled '0'
__acd_append_wireless ""
__acd_append_wireless "config wifi-iface"
__acd_append_wireless " option device '$device'"
__acd_append_wireless " option mode 'ap'"
__acd_append_wireless " option athnewind '0'"
__acd_append_wireless " option ssid 'Hy-Fi Network $HYFI_SEED'"
__acd_append_wireless " option wds '1'"
__acd_append_wireless " option network '$ieee1905managed'"
__acd_append_wireless " option encryption 'psk2'"
__acd_append_wireless " option key 'hyfi$HYFI_SEED'"
__acd_append_wireless " option wps_pbc '1'"
__acd_append_wireless " option disabled '$AP_disabled'"
__acd_append_wireless ""
__acd_append_wireless "config wifi-iface"
__acd_append_wireless " option device '$device'"
__acd_append_wireless " option mode 'sta'"
__acd_append_wireless " option athnewind '0'"
__acd_append_wireless " option ssid 'Hy-Fi Network $HYFI_SEED'"
__acd_append_wireless " option wds '1'"
__acd_append_wireless " option network '$ieee1905managed'"
__acd_append_wireless " option encryption 'psk2'"
__acd_append_wireless " option key 'hyfi$HYFI_SEED'"
__acd_append_wireless " option wps_pbc '1'"
__acd_append_wireless " option disabled '$STA_disabled'"
__acd_append_wireless ""
done
uci_commit wireless
}
# __acd_disable_vaps
# input: $1 config
# input: $2 network
# input: $3 mode: sta or ap
# input: $4 1 - disable, 0 - enable
# input-output: $5 change counter
__acd_disable_vaps() {
local config="$1"
local mode network disabled
local changed="$5"
config_get mode "$config" mode
config_get network "$config" network
config_get disabled "$config" disabled
if [ "$2" = "$network" -a "$3" = "$mode" -a ! "$4" = "$disabled" ]; then
uci_set wireless $config disabled $4
changed=$((changed + 1))
eval "$5='$changed'"
__acd_echo "Set VAP $config to Disabled=$4"
fi
}
__acd_config_hr_mode() {
config_load hyd
config_get mode config 'Mode'
if [ ! "$mode" = 'HYROUTER' ]; then
uci_set hyd config 'Mode' 'HYROUTER'
config_changed=1
uci commit hyd
__acd_echo "Set hyd in HR mode"
fi
config_load wsplcd
config_get mode config 'RunMode'
if [ ! "$mode" = 'REGISTRAR' ]; then
uci_set wsplcd config 'RunMode' 'REGISTRAR'
config_changed=1
uci commit wsplcd
__acd_echo "Set wsplcd in REGISTRAR mode"
wsplcd_restart=1
fi
config_load wireless
config_foreach __acd_disable_vaps wifi-iface $ieee1905managed 'sta' '1' config_changed
config_foreach __acd_disable_vaps wifi-iface $ieee1905managed 'ap' '0' config_changed
uci commit wireless
}
__acd_config_hc_mode() {
config_load hyd
config_get mode config 'Mode'
if [ ! "$mode" = 'HYCLIENT' ]; then
uci_set hyd config 'Mode' 'HYCLIENT'
config_changed=1
uci commit hyd
__acd_echo "Set hyd in HC mode"
fi
config_load wsplcd
config_get mode config 'RunMode'
if [ ! "$mode" = 'ENROLLEE' ]; then
uci_set wsplcd config 'RunMode' 'ENROLLEE'
config_changed=1
uci commit wsplcd
__acd_echo "Set wsplcd in ENROLLEE mode"
wsplcd_restart=1
fi
config_load wireless
config_foreach __acd_disable_vaps wifi-iface $ieee1905managed 'sta' '0' config_changed
config_foreach __acd_disable_vaps wifi-iface $ieee1905managed 'ap' '1' config_changed
uci commit wireless
}
__acd_config_hc_boot_mode() {
config_load hyd
config_get mode config 'Mode'
config_get_bool hyd_enabled config 'Enable' 0
config_load vhyfid
config_get_bool vhyfid_enabled config 'Enable' 0
local disable_sta=1
if [ "$hyd_enabled" -eq 1 -a "$vhyfid_enabled" -eq 0 ]; then
disable_sta=0
fi
if [ ! "$mode" = 'HYCLIENT' ]; then
uci_set hyd config 'Mode' 'HYCLIENT'
config_changed=1
uci commit hyd
__acd_echo "Set hyd in HC mode"
fi
config_load wsplcd
config_get mode config 'RunMode'
if [ ! "$mode" = 'ENROLLEE' ]; then
uci_set wsplcd config 'RunMode' 'ENROLLEE'
config_changed=1
uci commit wsplcd
__acd_echo "Set wsplcd in ENROLLEE mode"
wsplcd_restart=1
fi
config_load wireless
config_foreach __acd_disable_vaps wifi-iface $ieee1905managed 'sta' $disable_sta config_changed
uci commit wireless
}
__acd_restart_dependencies() {
__acd_echo "Restarting network stack..."
hyfi_network_restart
if [ "$wsplcd_start" -gt 0 ]; then
/etc/init.d/wsplcd start
else
[ "$wsplcd_restart" -gt 0 ] && /etc/init.d/wsplcd restart
fi
[ "$hyd_start" -gt 0 ] && /etc/init.d/hyd start
[ "$vhyfid_start" -gt 0 ] && /etc/init.d/vhyfid start
}
start() {
local enabled default_vaps router_mode
local mode
stop
config_changed=0
config_load 'acd'
config_get_bool enabled config 'AutoConfigEnable' '0'
[ "$enabled" -gt 0 ] || {
return 1
}
hyfi_echo acd "starting Hy-Fi auto-configuration"
# Get the IEEE1905.1 managed bridge name
hyfi_get_ieee1905_managed_iface ieee1905managed
__acd_echo "Managed bridge: $ieee1905managed"
__acd_vaps_in_default_config
if [ "$?" -gt 0 ]; then
__acd_destroy_vaps
__acd_create_vaps
config_changed=1
__acd_echo "Created new VAPs"
fi
__acd_enable_wifi
__acd_router_mode
if [ "$?" -gt 0 ]; then
# WAN group not empty
__acd_config_hr_mode
else
# WAN group empty or non-existent
# Disable all STAs and reset hyd state
__acd_config_hc_boot_mode
fi
local vhyfid_rcd_enabled=`ls /etc/rc.d/S??vhyfid 2> /dev/null`
config_load hyd
config_get_bool enabled config 'Enable' 0
config_get hyd_control config 'Control'
if [ "$hyd_control" = "manual" ]; then
if [ "$enabled" -eq 0 ]; then
uci_set hyd config 'Enable' '1'
config_changed=1
uci commit hyd
hyd_start=1
else
if [ ! -f /var/run/.hyd ]; then
config_changed=1
hyd_start=1
fi
fi
fi
if [ -n "$vhyfid_rcd_enabled" ]; then
config_load vhyfid
config_get_bool enabled config 'Enable' 0
if [ "$enabled" -eq 0 ]; then
uci_set vhyfid config 'Enable' '1'
config_changed=1
uci commit vhyfid
__acd_echo "Enabled Virtual Hy-Fi"
vhyfid_start=1
fi
fi
if [ -f "/etc/init.d/wsplcd" ]; then
config_load wsplcd
config_get_bool enabled config 'HyFiSecurity' 0
if [ "$enabled" -eq 0 ]; then
uci_set wsplcd config 'HyFiSecurity' '1'
config_changed=1
uci commit wsplcd
__acd_echo "Enabled security and configuration"
wsplcd_start=1
fi
fi
if [ "$config_changed" -gt 0 ]; then
__acd_restart_dependencies
fi
__acd_router_mode
if [ "$?" -eq 0 ]; then
config_load hyd
config_get_bool hyd_enabled config 'Enable' 0
hyfi_network_sync
start-stop-daemon -K -n acd-run.sh -s SIGKILL >/dev/null
if [ "$hyd_enabled" -gt 0 ]; then
# Monitor Ethernet ports
start-stop-daemon -S -x /usr/sbin/acd-run.sh -b
fi
fi
}
stop() {
hyfi_network_sync
start-stop-daemon -K -n acd-run.sh -s SIGKILL >/dev/null
}
restart() {
stop
config_load 'acd'
config_get_bool enabled config 'AutoConfigEnable' '0'
[ "$enabled" -gt 0 ] || {
return 1
}
__acd_router_mode
if [ "$?" -eq 0 ]; then
config_load hyd
config_get_bool hyd_enabled config 'Enable' 0
if [ "$hyd_enabled" -gt 0 ]; then
# Monitor Ethernet ports
start-stop-daemon -S -x /usr/sbin/acd-run.sh -b
fi
else
start
fi
}
restart_in_hc_mode() {
hyfi_get_ieee1905_managed_iface ieee1905managed
stop
__acd_config_hc_mode
__acd_restart_dependencies
/etc/init.d/hyd restart
__acd_router_mode
if [ "$?" -eq 0 ]; then
# Monitor Ethernet ports
start-stop-daemon -S -x /usr/sbin/acd-run.sh -b
fi
}
restart_in_hr_mode() {
hyfi_get_ieee1905_managed_iface ieee1905managed
stop
__acd_config_hr_mode
__acd_restart_dependencies
/etc/init.d/hyd restart
__acd_router_mode
if [ "$?" -eq 0 ]; then
# Monitor Ethernet ports
start-stop-daemon -S -x /usr/sbin/acd-run.sh -b -- hr
fi
}