1#!/bin/sh
2# in brmode & extmode, this script is used to monitor wireless link
3
4. /lib/cfgmgr/cfgmgr.sh
5
6brmode_wlg_linked() {
7	[ "$(awk 'NR==3' /proc/sys/net/ath1/status)" = "RUN" ]
8}
9
10brmode_wla_linked() {
11	[ "$(awk 'NR==3' /proc/sys/net/ath0/status)" = "RUN" ]
12}
13
14extmode_wlg_linked() {
15	[ "$(awk 'NR==3' /proc/sys/net/ath1/status)" = "RUN" ]
16}
17
18extmode_wla_linked() {
19	[ "$(awk 'NR==3' /proc/sys/net/ath0/status)" = "RUN" ]
20}
21
22extmode_wlg_fixup()
23{
24	oc echo "unable to estabilish extmode 2.4G wireless link !"
25	local extchannel=$(/usr/sbin/extkit 2g scan | awk -v ssid=$(config get wlg_ext_ssid) '
26	BEGIN {var = "\x22" ssid "\x22"}
27	{ if ($1 == var) { print $2; exit } }
28	')
29
30	[ -n ${extchannel} -a "${extchannel}" != "$($CONFIG get wlg_ext_channel)" ] && {
31		oc echo "new 2.4G ext channel : $extchannel !"
32		$CONFIG set wlg_ext_channel="$extchannel" && $CONFIG commit
33		/etc/init.d/wlan-common restart
34	}
35}
36
37brmode_wlg_fixup() { oc echo "unable to estabilish brmode 2.4G wireless link !"; }
38brmode_wla_fixup() { oc echo "unable to estabilish brmode 5G wireless link !"; }
39extmode_wlg_fixup() { oc echo "unable to estabilish extmode 2.4G wireless link !"; }
40extmode_wla_fixup() { oc echo "unable to estabilish extmode 5G wireless link !"; }
41
42get_hostname() {
43	cat /proc/sys/kernel/hostname
44}
45
46udhcpc_existed() {
47	[ "x$(pidof udhcpc)" != "x" ]
48}
49
50# global variables : g_wl_linked means judge wireless link success or fail funtion.
51# g_wl_fixup means wireless link failed. 
52setup_global_variables_or_exit()
53{
54	case "$($CONFIG get i_opmode)" in
55	brmode)
56		if [ "$($CONFIG get bridge_band_choose)" = "5g" ]; then
57			g_wl_linked=brmode_wla_linked
58			g_wl_fixup=brmode_wla_fixup
59		else
60			g_wl_linked=brmode_wlg_linked
61			g_wl_fixup=brmode_wlg_fixup
62		fi
63		;;
64	extmode)
65		if [ "x$($CONFIG get wla_ext_enabled)" = "x1" ]; then
66			g_wl_linked=extmode_wla_linked
67			g_wl_fixup=extmode_wla_fixup
68		else
69			g_wl_linked=extmode_wlg_linked
70			g_wl_fixup=extmode_wlg_fixup
71		fi
72		;;
73	*)
74		echo "only for brmode or extmode !"
75		exit
76		;;
77	esac
78}
79
80setup_global_variables_or_exit
81g_udhcpc_h_arg="-h $(get_hostname)"
82g_udhcpc_r_arg="-r $($CONFIG get ap_dhcp_ipaddr)"
83oc echo "g_wl_linked=$g_wl_linked, g_wl_fixup=$g_wl_fixup"
84oc echo "g_udhcpc_h_arg=$g_udhcpc_h_arg, g_udhcpc_r_arg=$g_udhcpc_r_arg"
85
86tmp_on_time=0
87tmp_off_time=0
88newlinkstate=off
89unlink_time=0
90linkstate=off
91while true; do
92	#oc echo "xxxxxx on=$tmp_on_time, off=$tmp_off_time, s=$linkstate, ult=$unlink_time xxxxxx"
93	sleep 5
94	udhcpc_existed || udhcpc -a -b -i br0 "$g_udhcpc_h_arg" "$g_udhcpc_r_arg" &
95
96	#Check if wireless link success and keep more than 20 sec then judge it final stable.
97	if eval $g_wl_linked; then
98		tmp_off_time=0; tmp_on_time=$(($tmp_on_time + 5))
99		[ $tmp_on_time -ge 20 ] && tmp_on_time=0 && newlinkstate=on
100	else
101		tmp_on_time=0; tmp_off_time=$(($tmp_off_time + 5))
102		[ $tmp_off_time -ge 10 ] && tmp_off_time=0 && newlinkstate=off
103	fi
104
105	if [ "$newlinkstate" = "on" ]; then
106		[ "$linkstate" = "off" ] && linkstate=on && unlink_time=0 && killall -SIGUSR1 udhcpc
107	else
108		[ "$linkstate" = "on" ] && linkstate=off && killall -SIGUSR2 udhcpc
109		unlink_time=$(( $unlink_time + 5 ))
110		[ $unlink_time -ge 60 ] && unlink_time=0 && eval $g_wl_fixup
111	fi
112done
113