4G: better Signal Strength detection cd ..
[tomato.git] / release / src / router / others / switch4g
blob627b628e13c66d3ac81344644ec62b1df65600e2
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 TYPE=`nvram get modem_type`
18 IFA=`nvram get wan_4g`
20 logger 4G MODEM - connecting ...
22 if [ "$TYPE" == "non-hilink" -o "$TYPE" == "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
70 elif [ "$TYPE" == "qmi_wwan" ]; then
71 CLID=""
73 # wait till registered
74 while [ `uqmi -s -d "$DEV" --get-serving-system | grep searching | wc -l` != "0" ]; do
75 sleep 5
76 done
78 # set lte mode
79 uqmi -s -d "$DEV" --set-network-modes "lte"
80 sleep 2
82 if [ "$CLID" == "" ]; then
83 # get client id for wds - only once!
84 CLID=`uqmi -s -d "$DEV" --get-client-id wds`
85 nvram set modem_clid=$CLID
86 logger 4G MODEM - got new Client ID: $CLID
89 CONNECTED=0
90 COUNT=0
91 while [ $CONNECTED == "0" ]; do
92 if [ "$COUNT" -lt "5" ]; then
94 if [ "$CLID" != "" ]; then
95 #connect...
96 PDH=`uqmi -s -d "$DEV" --set-client-id wds,"$CLID" --start-network "$APN" --autoconnect`
97 case $PDH in
98 ''|*[!0-9]*)
99 logger "4G MODEM - device $DEV connection failed."
100 sleep 5
101 COUNT=`expr $COUNT + 1`
104 logger "4G MODEM - connected ..."
105 CONNECTED=1
106 COUNT=6
107 logger 4G MODEM - Session ID: $PDH
108 nvram set modem_pdh=$PDH
109 break;
111 esac
112 else
113 logger "4G MODEM - Unable to obtain client ID"
114 exit 0;
116 else
117 # checked 5 times but still not connected?
118 INTERVAL=`nvram get modem_watchdog`
119 if [ "$INTERVAL" -gt 0 ]; then
120 logger 4G MODEM - connection failed - watchdog enabled
121 watchdogAdd
122 else
123 logger 4G MODEM - connection failed - process terminated!
124 watchdogDel
126 rm $LOCK;
127 exit 0;
129 done
132 GO=0
133 COUNT=1
135 while [ $GO = "0" ]; do
136 if [ "$COUNT" == "5" ]; then
137 INTERVAL=`nvram get modem_watchdog`
138 if [ "$INTERVAL" -gt 0 ]; then
139 logger 4G MODEM WAN IFACE failed - watchdog enabled
140 watchdogAdd
141 else
142 logger 4G MODEM WAN IFACE failed - connection process terminated!
143 watchdogDel
145 rm $LOCK
146 exit 0;
147 else
148 dhcpc-release
149 sleep 1
150 dhcpc-renew
152 CHECKIFA=`ifconfig | grep $IFA | wc -l`
153 if [ "$CHECKIFA" == "1" ]; then
154 GO=1
155 logger 4G MODEM - WAN IFACE configured ...
156 watchdogAdd
157 signal
158 else
159 logger 4G MODEM WAN IFACE - count: $COUNT
160 COUNT=`expr $COUNT + 1`
161 sleep 5
164 done
167 disconnect() {
168 DEV=`nvram get modem_dev4g`
169 TYPE=`nvram get modem_type`
170 CLID=`nvram get modem_clid`
172 logger 4G MODEM - disconnecting ...
173 watchdogDel
174 dhcpc-release
176 if [ "$TYPE" == "non-hilink" -o "$TYPE" == "hw-ether" ]; then
177 MODE="AT^NDISDUP=1,0" gcom -d $DEV -s /etc/gcom/setmode.gcom
178 elif [ "$TYPE" == "qmi_wwan" ]; then
179 # disable previous autoconnect state using the global handle
180 # do not reuse previous wds client id to prevent hangs caused by stale data
181 uqmi -s -d "$DEV" --stop-network 0xffffffff --autoconnect
182 if [ "$CLID" != "" ]; then
183 logger 4G MODEM - release Client ID: $CLID
184 uqmi -s -d "$DEV" --set-client-id wds,"$CLID" --release-client-id wds
185 nvram unset modem_pdh
186 nvram unset modem_clid
190 logger 4G MODEM - disconnected ...
194 doWANCalls() {
195 if [ `nvram get wan_get_dns | wc -w` -gt "0" ]; then #DHCP
196 DNS=`nvram get wan_get_dns | awk {'print $1'}`
197 elif [ `nvram get wan_dns | wc -w` -gt "0" ]; then #STATIC
198 DNS=`nvram get wan_dns | awk {'print $1'}`
199 else
200 DNS="8.8.8.8" #Google public DNS
203 HOSTLIST="www.google.com www.microsoft.com www.facebook.com"
204 for HOST in $HOSTLIST; do
205 nslookup $HOST $DNS> /dev/null 2>&1
206 done
209 watchdogRun() {
210 IFA=`nvram get wan_4g`
212 RXBYTES1=`cat /sys/class/net/$IFA/statistics/rx_bytes`
213 doWANCalls
214 RXBYTES2=`cat /sys/class/net/$IFA/statistics/rx_bytes`
215 if [ "$RXBYTES2" == "$RXBYTES1" ]; then
216 logger 4G MODEM Watchdog - Connection down - Reconnecting ...
217 disconnect
218 connect
222 watchdogAdd() {
223 INTERVAL=`nvram get modem_watchdog`
224 if [ "$INTERVAL" -gt 0 ]; then
225 ISSET=`cru l | grep watchdog4g | wc -l`
227 if [ "$ISSET" == "0" ]; then
228 cru a watchdog4g "*/$INTERVAL * * * * /usr/sbin/switch4g watchdog"
233 watchdogDel() {
234 ISSET=`cru l | grep watchdog4g | wc -l`
236 if [ "$ISSET" == "1" ]; then
237 cru d watchdog4g
241 checkLock() {
242 if [ -f $LOCK ]; then #lock exist
243 logger 4G MODEM - previous proces of switch4g still working
244 exit 0
247 touch $LOCK
250 setPIN() {
251 PIN=`nvram get modem_pin`
252 IS_PIN=`nvram get modem_pin | wc -w`
254 if [ "$IS_PIN" == "1" ]; then #only for non-hilink
256 if [ "$TYPE" == "non-hilink" -o "$TYPE" == "hw-ether" ]; then
257 #we try use last diag iface first. If it failed then we try use any other ttyUSB device
258 TTY=`ls /dev/ttyUSB* | grep -v $DEV`
259 DEVS="$DEV $TTY"
260 COUNT=1
262 if [ "$COUNT" -lt "5" ]; then
263 for i in $DEVS; do
264 PINCODE="$PIN" gcom -d $i -s /etc/gcom/setpin.gcom > /tmp/4g.pin
265 IS_READY=`cat /tmp/4g.pin | grep successfully | wc -l`
266 if [ "$IS_READY" == "1" ]; then
267 logger 4G MODEM - SIM ready
268 nvram set modem_dev4g="$i"
269 break;
270 else
271 logger 4G MODEM - SIM not ready - count: $COUNT
272 COUNT=`expr $COUNT + 1`
273 sleep 5
275 done
276 else
277 logger 4G MODEM - SIM locked - connection process terminated!
278 watchdogDel
279 exit 0;
281 elif [ "$TYPE" == "qmi_wwan" ]; then
282 # get pin status
283 PINSTATUS = `uqmi -s -d "$DEVNR" --get-pin-status | cut -d "," -f 1 | cut -d ":" -f 2 | cut -d "\"" -f2`
284 if [ "$PINSTATUS" != 'disabled' ]; then
285 uqmi -s -d "$DEVNR" --verify-pin1 "$PIN"
291 switchMode() {
292 MODULES="qmi_wwan cdc_ether huawei_ether cdc_ncm"
294 COUNT=0
295 FOUND=0
297 while [ $FOUND == "0" ]; do
298 #modem not found, try detect
299 DEVICES=`lsusb | awk '{print $6}'`
301 for SWITCH in $DEVICES; do
302 SEARCH=`ls /etc/usb_modeswitch.d/$SWITCH | wc -l`
304 # vendor:product
306 if [ "$SEARCH" == "1" ]; then
307 logger 4G MODEM FOUND - $SWITCH - Switching ...
308 DV=`echo $SWITCH | cut -d ":" -f1`
309 DP=`echo $SWITCH | cut -d ":" -f2`
310 /usr/sbin/usb_modeswitch -Q -c /etc/usb_modeswitch.d/$SWITCH -v $DV -p $DP
312 TEST1=`cat /etc/usb_modeswitch.d/$SWITCH | grep "TargetVendor" | cut -d "=" -f2 | wc -l`
313 if [ "$TEST1" == "1" ]; then
314 VENDOR=`cat /etc/usb_modeswitch.d/$SWITCH | grep "TargetVendor" | cut -d "=" -f2 | cut -d "x" -f2`
315 else
316 VENDOR=`echo $SWITCH | cut -d ":" -f1`
319 TEST2=`lsusb | awk '{print $6}' | grep $VENDOR | wc -l`
320 if [ "$TEST2" == "1" ]; then
321 PRODUCT=`lsusb | awk '{print $6}' | grep $VENDOR | cut -d ":" -f2`
322 logger 4G MODEM ready - $VENDOR:$PRODUCT
323 echo "$VENDOR:$PRODUCT" > /tmp/4g.detect
326 done
328 #need few seconds before modem will be detected once again after switch
329 sleep 10
331 # is modem ready?
332 for MODULE in $MODULES; do
333 modprobe $MODULE
334 sleep 2
336 SEARCH=`cat /proc/bus/usb/devices | grep Driver | grep $MODULE | wc -l`
338 if [ "$SEARCH" -gt 0 ]; then
339 if [ "$MODULE" == "cdc_ether" ]; then
340 TYPE="hilink"
341 elif [ "$MODULE" == "cdc_ncm" ]; then
342 TYPE="non-hilink"
343 elif [ "$MODULE" == "huawei_ether" ]; then
344 TYPE="hw-ether"
345 elif [ "$MODULE" == "qmi_wwan" ]; then
346 TYPE="qmi_wwan"
347 else
348 TYPE="unknown"
351 logger 4G MODEM NDIS found - $TYPE - using $MODULE module
352 nvram set 4g_module=$MODULE
353 FOUND=1
354 break;
355 else
356 if [ "$COUNT" == "5" ]; then
357 logger 4G MODEM NDIS not found - process terminated!
358 rm $LOCK
359 exit 0;
360 else
361 logger 4G MODEM NDIS not found - $MODULE - count: $COUNT
362 modprobe -r $MODULE
363 COUNT=`expr $COUNT + 1`
364 sleep 5
367 done
368 done
371 searchWAN() {
373 #search WAN interface (usbX or ethX)
374 FOUND=0
375 COUNT=0
377 KERNEL=`uname -r | cut -d "." -f1,2,3`
379 while [ $FOUND == "0" ]; do
380 if [ "$TYPE" == "hw-ether" ]; then
381 WAN=`dmesg | grep huawei_ether | grep Device | grep register | cut -d ":" -f1 | tail -1`
382 elif [ "$KERNEL" == "2.6.36" ]; then #ARM
383 WAN=`dmesg | grep $MODULE | grep register | grep "'" | cut -d " " -f3 | cut -d ":" -f1 | tail -1`
384 else #MIPSEL
385 WAN=`dmesg | grep $MODULE | grep register | grep "'" | cut -d ":" -f1 | tail -1`
388 IS_WAN=`echo $WAN | wc -w`
390 if [ "$IS_WAN" -gt 0 ]; then
391 logger 4G MODEM WAN found - $TYPE - using $WAN as WAN
392 nvram set wan_4g="$WAN"
393 nvram set modem_type=$TYPE
394 FOUND=1
395 else
396 if [ "$COUNT" == "5" ]; then
397 logger 4G MODEM WAN not found - connection process terminated!
398 rm $LOCK
399 exit 0;
400 else
401 logger 4G MODEM WAN not found - count: $COUNT
402 COUNT=`expr $COUNT + 1`
403 sleep 5
406 done
409 searchDiag() {
410 FOUND=0
412 if [ "$TYPE" == "non-hilink" -o "$TYPE" == "hw-ether" ]; then
413 US=`cat /proc/bus/usb/devices | grep Driver | grep usbserial | wc -l`
415 if [ "$US" -gt 0 ]; then
416 logger 4G MODEM found - Diagnostic interface - using usbserial module
417 break;
418 else
419 IS_VENDOR=`echo $VENDOR | wc -w`
420 if [ "$IS_VENDOR" -gt 0 ]; then
421 IS_PRODUCT=`echo $PRODUCT | wc -w`
422 if [ "$IS_PRODUCT" -gt 0 ]; then
423 logger 4G MODEM - loading module usbserial
424 rmmod usbserial
425 insmod usbserial vendor=0x$VENDOR product=0x$PRODUCT
426 echo "$VENDOR:$PRODUCT" > /tmp/4g.detect
430 DEV=`cat /proc/bus/usb/devices | grep Driver | grep usbserial | wc -l`
431 if [ "$DEV" -gt 0 ]; then
432 logger 4G MODEM ready - using usbserial module
433 FOUND=1
434 nvram set 4g_module=usbserial
435 else
436 #last change. try load usbserial for each usb devices
437 DEVICES=`lsusb | awk '{print $6}'`
438 for SWITCH in $DEVICES; do
439 if [ "$FOUND" == "0" ]; then
440 VENDOR=`echo $SWITCH | cut -d ":" -f1`
441 PRODUCT=`echo $SWITCH | cut -d ":" -f2`
442 rmmod usbserial
443 insmod usbserial vendor=0x$VENDOR product=0x$PRODUCT
445 DEV=`cat /proc/bus/usb/devices | grep Driver | grep usbserial | wc -l`
446 if [ "$DEV" -gt 0 ]; then
447 logger 4G MODEM ready - using usbserial module
448 nvram set 4g_module=usbserial
449 echo "$VENDOR:$PRODUCT" > /tmp/4g.detect
450 FOUND=1
451 break;
454 done
458 #search diagnostic device
459 TTY=`ls /dev/ttyUSB*`
461 for i in $TTY; do
462 CHECKTTY=`gcom -d $i -e info | grep OK | wc -l`
463 if [ "$CHECKTTY" == "1" ]; then #found working interface
464 logger 4G MODEM DIAG found - $i
465 nvram set modem_dev4g=$i
466 DEVNR=$i
467 else
468 logger 4G MODEM DIAG not found
470 done
471 elif [ "$TYPE" == "qmi_wwan" ]; then
472 #search diagnostic device
473 TTY=`ls /dev/cdc-wdm*`
475 for i in $TTY; do
476 CHECKTTY=`uqmi -s -d "$i" --get-versions | grep service | wc -l`
477 if [ "$CHECKTTY" == "1" ]; then #found working interface
478 logger 4G MODEM DIAG found - $i
479 nvram set modem_dev4g=$i
480 DEVNR=$i
481 else
482 logger 4G MODEM DIAG not found
484 done
488 signal() {
489 DEVNR=`nvram get modem_dev4g`
490 TYPE=`nvram get modem_type`
493 if [ "$TYPE" == "non-hilink" -o "$TYPE" == "hw-ether" ]; then
494 HCSQ=`MODE="AT^HCSQ?" gcom -d $DEVNR -s /etc/gcom/setverbose.gcom | grep "HCSQ:" | tr -d '\r'`
495 SPEED=`echo $HCSQ | cut -d "," -f1 | cut -d '"' -f2`
496 case "$SPEED" in
497 "LTE")
498 VALUE=`echo $HCSQ | cut -d "," -f2`
499 RSSI=`awk "BEGIN {print -120+$VALUE}"` #dBm
500 VALUE=`echo $HCSQ | cut -d "," -f3`
501 RSRP=`awk "BEGIN {print -140+$VALUE}"` #dBm
502 VALUE=`echo $HCSQ | cut -d "," -f4`
503 SINR=`awk "BEGIN {print -20+$VALUE*0.2}"` #dB
504 VALUE=`echo $HCSQ | cut -d "," -f5`
505 RSRQ=`awk "BEGIN {print -19.5+$VALUE*0.5}"` #dB
506 logger "4G MODEM Current Mode: $SPEED"
507 logger "4G MODEM Signal Strength: RSSI $RSSI dBm, RSRP $RSRP dBm, SINR $SINR dB, RSRQ $RSRQ dB"
509 "WCDMA")
510 VALUE=`echo $HCSQ | cut -d "," -f2`
511 RSSI=`awk "BEGIN {print -120+$VALUE}"` #dBm
512 VALUE=`echo $HCSQ | cut -d "," -f3`
513 RSRP=`awk "BEGIN {print -120+$VALUE}"` #dBm
514 VALUE=`echo $HCSQ | cut -d "," -f4`
515 ECIO=`awk "BEGIN {print -32+$VALUE*0.5}"` #dB
516 logger "4G MODEM Current Mode: $SPEED"
517 logger "4G MODEM Signal Strength: RSSI $RSSI dBm, RSRP $RSRP dBm, ECIO $SINR dB"
519 "GSM")
520 VALUE=`echo $HCSQ | cut -d "," -f2`
521 RSSI=`awk "BEGIN {print -120+$VALUE}"` #dBm
522 logger "4G MODEM Current Mode: $SPEED"
523 logger "4G MODEM Signal Strength: RSSI $RSSI dBm"
526 logger "4G MODEM Current Mode: unknown"
527 logger "4G MODEM Signal Strength: no data"
529 esac
530 elif [ "$TYPE" == "qmi_wwan" ]; then
531 RSSI=`uqmi -s -d "$DEVNR" --get-signal-info | cut -d "," -f2 | cut -d ":" -f2`
532 RSRQ=`uqmi -s -d "$DEVNR" --get-signal-info | cut -d "," -f3 | cut -d ":" -f2`
533 RSRP=`uqmi -s -d "$DEVNR" --get-signal-info | cut -d "," -f4 | cut -d ":" -f2`
534 logger "4G MODEM Signal Strength: RSSI $RSSI dBm, RSRP $RSRP dB, RSRQ $RSRQ dB"
539 ###################################################
541 if [ "$1" == "connect" ]; then
542 connect
543 elif [ "$1" == "disconnect" ]; then
544 disconnect
545 elif [ "$1" == "watchdog" ]; then
546 watchdogRun
547 elif [ "$1" == "signal" ]; then
548 signal
549 else
550 checkLock
552 switchMode
554 searchWAN
556 if [ "$TYPE" == "non-hilink" -o "$TYPE" == "hw-ether" -o "$TYPE" == "qmi_wwan" ]; then #only for non-hilink
557 searchDiag
559 setPIN
562 #force connection after detect 4G modem
563 connect
565 #remove lock
566 rm $LOCK