4G/LTE - add watchdog and more
[tomato.git] / release / src / router / others / switch4g
blobc3f2b3596b5b2f11595b46a178c18fb982af7b6c
1 #!/bin/sh
4 # Copyright (C) 2015 shibby
7 MODE=`nvram get wan_proto`
8 LOCK="/tmp/switch4g.lock"
10 if [ ! "$MODE" == "lte" ]; then
11 exit 0
14 connect() {
15 APN=`nvram get modem_apn`
16 DEV=`nvram get modem_dev4g`
17 TYP=`nvram get modem_type`
18 IFA=`nvram get wan_4g`
20 logger 4G MODEM - connecting ...
22 if [ "$TYP" == "non-hilink" -o "$TYP" == "hw-ether" ]; then
23 CONNECTED=0
24 COUNT=0
26 if [ -z "$DEV" ]; then
27 logger 4G MODEM - DIAG interface not found - connection terminated
28 exit 0;
31 #we try use last diag iface first. If it failed then we try use any other ttyUSB device
32 TTY=`ls /dev/ttyUSB* | grep -v $DEV`
33 DEVS="$DEV $TTY"
35 while [ $CONNECTED == "0" ]; do
36 for i in $DEVS; do
37 if [ "$COUNT" -lt "5" ]; then
38 MODE="AT^NDISDUP=1,0" gcom -d $i -s /etc/gcom/setverbose.gcom > /tmp/4g.mode
39 MODE="AT^NDISDUP=1,1,\"$APN\"" gcom -d $i -s /etc/gcom/setverbose.gcom > /tmp/4g.mode
41 CHECK=`cat /tmp/4g.mode | grep "NDISSTAT:" | cut -d ":" -f2 | cut -d "," -f1`
42 if [ "$CHECK" == "1" ]; then
43 logger 4G MODEM - connected ...
44 CONNECTED=1
45 COUNT=6
46 nvram set modem_dev4g="$i"
47 break;
48 else
49 logger 4G MODEM - device $i connection failed.
50 sleep 5
51 COUNT=`expr $COUNT + 1`
54 done
56 # checked all devices but still not connected?
57 if [ $CONNECTED == "0" ]; then
58 INTERVAL=`nvram get modem_watchdog`
59 if [ "$INTERVAL" -gt 0 ]; then
60 logger 4G MODEM - connection failed - watchdog enabled
61 watchdogAdd
62 else
63 logger 4G MODEM - connection failed - process terminated!
64 watchdogDel
66 rm $LOCK;
67 exit 0;
69 done
72 GO=0
73 COUNT=1
75 while [ $GO = "0" ]; do
76 if [ "$COUNT" == "5" ]; then
77 INTERVAL=`nvram get modem_watchdog`
78 if [ "$INTERVAL" -gt 0 ]; then
79 logger 4G MODEM WAN IFACE failed - watchdog enabled
80 watchdogAdd
81 else
82 logger 4G MODEM WAN IFACE failed - connection process terminated!
83 watchdogDel
85 rm $LOCK
86 exit 0;
87 else
88 dhcpc-release
89 sleep 1
90 dhcpc-renew
92 CHECKIFA=`ifconfig | grep $IFA | wc -l`
93 if [ "$CHECKIFA" == "1" ]; then
94 GO=1
95 logger 4G MODEM - WAN IFACE configured ...
96 watchdogAdd
97 else
98 logger 4G MODEM WAN IFACE - count: $COUNT
99 COUNT=`expr $COUNT + 1`
100 sleep 5
103 done
106 disconnect() {
107 DEV=`nvram get modem_dev4g`
108 TYP=`nvram get modem_type`
110 logger 4G MODEM - disconnecting ...
111 dhcpc-release
113 if [ "$TYP" == "non-hilink" -o "$TYP" == "hw-ether" ]; then
114 MODE="AT^NDISDUP=1,0" gcom -d $DEV -s /etc/gcom/setmode.gcom
115 watchdogDel
119 watchdogRun() {
120 IFA=`nvram get wan_4g`
121 CARRIER=`cat /sys/class/net/$IFA/carrier`
123 if [ "$CARRIER" == "0" ]; then
124 logger 4G MODEM Watchdog - Connection down - Reconnecting ...
125 watchdogDel #remove Cron job. It will be added once again after succesful connection.
126 connect
130 watchdogAdd() {
131 INTERVAL=`nvram get modem_watchdog`
132 if [ "$INTERVAL" -gt 0 ]; then
133 ISSET=`cru l | grep watchdog4g | wc -l`
135 if [ "$ISSET" == "0" ]; then
136 cru a watchdog4g "*/$INTERVAL * * * * /usr/sbin/switch4g watchdog"
141 watchdogDel() {
142 ISSET=`cru l | grep watchdog4g | wc -l`
144 if [ "$ISSET" == "1" ]; then
145 cru d watchdog4g
149 checkLock() {
150 if [ -f $LOCK ]; then #lock exist
151 logger 4G MODEM - previous proces of switch4g still working
152 exit 0
155 touch $LOCK
158 setPIN() {
159 PIN=`nvram get modem_pin`
160 IS_PIN=`nvram get modem_pin | wc -w`
162 if [ "$IS_PIN" == "1" ]; then #only for non-hilink
164 #we try use last diag iface first. If it failed then we try use any other ttyUSB device
165 TTY=`ls /dev/ttyUSB* | grep -v $DEV`
166 DEVS="$DEV $TTY"
167 COUNT=1
169 if [ "$COUNT" -lt "5" ]; then
170 for i in $DEVS; do
171 PINCODE="$PIN" gcom -d $i -s /etc/gcom/setpin.gcom > /tmp/4g.pin
172 IS_READY=`cat /tmp/4g.pin | grep successfully | wc -l`
173 if [ "$IS_READY" == "1" ]; then
174 logger 4G MODEM - SIM ready
175 nvram set modem_dev4g="$i"
176 break;
177 else
178 logger 4G MODEM - SIM not ready - count: $COUNT
179 COUNT=`expr $COUNT + 1`
180 sleep 5
182 done
183 else
184 logger 4G MODEM - SIM locked - connection process terminated!
185 watchdogDel
186 exit 0;
191 switchMode() {
192 MODULES="cdc_ether huawei_ether cdc_ncm"
194 for MODULE in $MODULES; do
195 modprobe $MODULE
196 done
198 sleep 5
200 COUNT=0
201 FOUND=0
203 while [ $FOUND == "0" ]; do
204 #modem not found, try detect
205 DEVICES=`lsusb | awk '{print $6}'`
207 for SWITCH in $DEVICES; do
208 SEARCH=`ls /etc/usb_modeswitch.d/$SWITCH | wc -l`
210 # vendor:product
212 if [ "$SEARCH" == "1" ]; then
213 logger 4G MODEM FOUND - $SWITCH - Switching ...
214 DV=`echo $SWITCH | cut -d ":" -f1`
215 DP=`echo $SWITCH | cut -d ":" -f2`
216 /usr/sbin/usb_modeswitch -Q -c /etc/usb_modeswitch.d/$SWITCH -v $DV -p $DP
218 TEST1=`cat /etc/usb_modeswitch.d/$SWITCH | grep "TargetVendor" | cut -d "=" -f2 | wc -l`
219 if [ "$TEST1" == "1" ]; then
220 VENDOR=`cat /etc/usb_modeswitch.d/$SWITCH | grep "TargetVendor" | cut -d "=" -f2 | cut -d "x" -f2`
221 else
222 VENDOR=`echo $SWITCH | cut -d ":" -f1`
225 TEST2=`lsusb | awk '{print $6}' | grep $VENDOR | wc -l`
226 if [ "$TEST2" == "1" ]; then
227 PRODUCT=`lsusb | awk '{print $6}' | grep $VENDOR | cut -d ":" -f2`
228 logger 4G MODEM ready - $VENDOR:$PRODUCT
229 echo "$VENDOR:$PRODUCT" > /tmp/4g.detect
232 done
234 # is modem ready?
235 for MODULE in $MODULES; do
236 SEARCH=`cat /proc/bus/usb/devices | grep Driver | grep $MODULE | wc -l`
238 if [ "$SEARCH" -gt 0 ]; then
239 if [ "$MODULE" == "cdc_ether" ]; then
240 TYPE="hilink"
241 elif [ "$MODULE" == "cdc_ncm" ]; then
242 TYPE="non-hilink"
243 elif [ "$MODULE" == "huawei_ether" ]; then
244 TYPE="hw-ether"
245 else
246 TYPE="unknown"
249 logger 4G MODEM NDIS found - $TYPE - using $MODULE module
250 nvram set 4g_module=$MODULE
251 FOUND=1
252 break;
253 else
254 if [ "$COUNT" == "5" ]; then
255 logger 4G MODEM NDIS not found - process terminated!
256 rm $LOCK
257 exit 0;
258 else
259 logger 4G MODEM NDIS not found - $MODULE - count: $COUNT
260 COUNT=`expr $COUNT + 1`
261 sleep 5
264 done
265 done
268 searchWAN() {
270 #search WAN interface (usbX or ethX)
271 FOUND=0
272 COUNT=0
274 KERNEL=`uname -r | cut -d "." -f1,2,3`
276 while [ $FOUND == "0" ]; do
277 if [ "$TYPE" == "hw-ether" ]; then
278 WAN=`dmesg | grep huawei_ether | grep Device | grep register | cut -d ":" -f1 | tail -1`
279 elif [ "$KERNEL" == "2.6.36" ]; then #ARM
280 WAN=`dmesg | grep $MODULE | grep register | grep "'" | cut -d " " -f3 | cut -d ":" -f1 | tail -1`
281 else #MIPSEL
282 WAN=`dmesg | grep $MODULE | grep register | grep "'" | cut -d ":" -f1 | tail -1`
285 IS_WAN=`echo $WAN | wc -w`
287 if [ "$IS_WAN" -gt 0 ]; then
288 logger 4G MODEM WAN found - $TYPE - using $WAN as WAN
289 nvram set wan_4g="$WAN"
290 nvram set modem_type=$TYPE
291 FOUND=1
292 else
293 if [ "$COUNT" == "5" ]; then
294 logger 4G MODEM WAN not found - connection process terminated!
295 rm $LOCK
296 exit 0;
297 else
298 logger 4G MODEM WAN not found - count: $COUNT
299 COUNT=`expr $COUNT + 1`
300 sleep 5
303 done
306 searchDiag() {
307 FOUND=0
309 US=`cat /proc/bus/usb/devices | grep Driver | grep usbserial | wc -l`
311 if [ "$US" -gt 0 ]; then
312 logger 4G MODEM found - Diagnostic interface - using usbserial module
313 break;
314 else
315 IS_VENDOR=`echo $VENDOR | wc -w`
316 if [ "$IS_VENDOR" -gt 0 ]; then
317 IS_PRODUCT=`echo $PRODUCT | wc -w`
318 if [ "$IS_PRODUCT" -gt 0 ]; then
319 logger 4G MODEM - loading module usbserial
320 rmmod usbserial
321 insmod usbserial vendor=0x$VENDOR product=0x$PRODUCT
322 echo "$VENDOR:$PRODUCT" > /tmp/4g.detect
326 DEV=`cat /proc/bus/usb/devices | grep Driver | grep usbserial | wc -l`
327 if [ "$DEV" -gt 0 ]; then
328 logger 4G MODEM ready - using usbserial module
329 FOUND=1
330 nvram set 4g_module=usbserial
331 else
332 #last change. try load usbserial for each usb devices
333 DEVICES=`lsusb | awk '{print $6}'`
334 for SWITCH in $DEVICES; do
335 if [ "$FOUND" == "0" ]; then
336 VENDOR=`echo $SWITCH | cut -d ":" -f1`
337 PRODUCT=`echo $SWITCH | cut -d ":" -f2`
338 rmmod usbserial
339 insmod usbserial vendor=0x$VENDOR product=0x$PRODUCT
341 DEV=`cat /proc/bus/usb/devices | grep Driver | grep usbserial | wc -l`
342 if [ "$DEV" -gt 0 ]; then
343 logger 4G MODEM ready - using usbserial module
344 nvram set 4g_module=usbserial
345 echo "$VENDOR:$PRODUCT" > /tmp/4g.detect
346 FOUND=1
347 break;
350 done
354 #search diagnostic device
355 TTY=`ls /dev/ttyUSB*`
357 for i in $TTY; do
358 CHECKTTY=`gcom -d $i -e info | grep OK | wc -l`
359 if [ "$CHECKTTY" == "1" ]; then #found working interface
360 logger 4G MODEM DIAG found - $i
361 nvram set modem_dev4g=$i
362 DEVNR=$i
363 else
364 logger 4G MODEM DIAG not found
366 done
369 signal() {
370 #check signal strength
371 CSQ=`gcom -d $DEVNR -s /etc/gcom/getstrength.gcom | grep "CSQ:" | cut -d " " -f2 | cut -d "," -f1`
372 DBM=$((-113+CSQ*2))
373 logger "4G MODEM Signal Strength: $DBM dBm"
377 ###################################################
379 if [ "$1" == "connect" ]; then
380 connect
381 elif [ "$1" == "disconnect" ]; then
382 disconnect
383 elif [ "$1" == "watchdog" ]; then
384 watchdogRun
385 else
386 checkLock
388 switchMode
390 searchWAN
392 if [ "$TYPE" == "non-hilink" -o "$TYPE" == "hw-ether" ]; then #only for non-hilink
393 searchDiag
395 setPIN
397 signal
400 #force connection after detect 4G modem
401 connect
403 #remove lock
404 rm $LOCK