4 # Copyright (C) 2015 shibby
7 MODE
=`nvram get wan_proto`
8 LOCK
="/tmp/switch4g.lock"
10 if [ ! "$MODE" == "lte" ]; then
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
26 if [ -z "$DEV" ]; then
27 logger
4G MODEM
- DIAG interface not found
- connection terminated
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`
35 while [ $CONNECTED == "0" ]; 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 ...
46 nvram
set modem_dev4g
="$i"
49 logger
4G MODEM
- device
$i connection failed.
51 COUNT
=`expr $COUNT + 1`
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
63 logger
4G MODEM
- connection failed
- process terminated
!
70 elif [ "$TYPE" == "qmi_wwan" ]; then
73 # wait till registered
74 while [ `uqmi -s -d "$DEV" --get-serving-system | grep searching | wc -l` != "0" ]; do
79 uqmi
-s -d "$DEV" --set-network-modes "lte"
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
91 while [ $CONNECTED == "0" ]; do
92 if [ "$COUNT" -lt "5" ]; then
94 if [ "$CLID" != "" ]; then
96 PDH
=`uqmi -s -d "$DEV" --set-client-id wds,"$CLID" --start-network "$APN" --autoconnect`
99 logger
"4G MODEM - device $DEV connection failed."
101 COUNT
=`expr $COUNT + 1`
104 logger
"4G MODEM - connected ..."
107 logger
4G MODEM
- Session ID
: $PDH
108 nvram
set modem_pdh
=$PDH
113 logger
"4G MODEM - Unable to obtain client ID"
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
123 logger
4G MODEM
- connection failed
- process terminated
!
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
142 logger
4G MODEM WAN IFACE failed
- connection process terminated
!
152 CHECKIFA
=`ifconfig | grep $IFA | wc -l`
153 if [ "$CHECKIFA" == "1" ]; then
155 logger
4G MODEM
- WAN IFACE configured ...
159 logger
4G MODEM WAN IFACE
- count
: $COUNT
160 COUNT
=`expr $COUNT + 1`
168 DEV
=`nvram get modem_dev4g`
169 TYPE
=`nvram get modem_type`
170 CLID
=`nvram get modem_clid`
172 logger
4G MODEM
- disconnecting ...
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 ...
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'}`
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
210 IFA
=`nvram get wan_4g`
212 RXBYTES1
=`cat /sys/class/net/$IFA/statistics/rx_bytes`
214 RXBYTES2
=`cat /sys/class/net/$IFA/statistics/rx_bytes`
215 if [ "$RXBYTES2" == "$RXBYTES1" ]; then
216 logger
4G MODEM Watchdog
- Connection down
- Reconnecting ...
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"
234 ISSET
=`cru l | grep watchdog4g | wc -l`
236 if [ "$ISSET" == "1" ]; then
242 if [ -f $LOCK ]; then #lock exist
243 logger
4G MODEM
- previous proces of switch4g still working
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`
262 if [ "$COUNT" -lt "5" ]; then
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"
271 logger
4G MODEM
- SIM not ready
- count
: $COUNT
272 COUNT
=`expr $COUNT + 1`
277 logger
4G MODEM
- SIM locked
- connection process terminated
!
281 elif [ "$TYPE" == "qmi_wwan" ]; then
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"
292 MODULES
="qmi_wwan cdc_ether huawei_ether cdc_ncm"
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`
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`
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
328 #need few seconds before modem will be detected once again after switch
332 for MODULE
in $MODULES; do
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
341 elif [ "$MODULE" == "cdc_ncm" ]; then
343 elif [ "$MODULE" == "huawei_ether" ]; then
345 elif [ "$MODULE" == "qmi_wwan" ]; then
351 logger
4G MODEM NDIS found
- $TYPE - using
$MODULE module
352 nvram
set 4g_module
=$MODULE
356 if [ "$COUNT" == "5" ]; then
357 logger
4G MODEM NDIS not found
- process terminated
!
361 logger
4G MODEM NDIS not found
- $MODULE - count
: $COUNT
363 COUNT
=`expr $COUNT + 1`
373 #search WAN interface (usbX or ethX)
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`
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
396 if [ "$COUNT" == "5" ]; then
397 logger
4G MODEM WAN not found
- connection process terminated
!
401 logger
4G MODEM WAN not found
- count
: $COUNT
402 COUNT
=`expr $COUNT + 1`
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
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
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
434 nvram
set 4g_module
=usbserial
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`
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
458 #search diagnostic device
459 TTY
=`ls /dev/ttyUSB*`
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
468 logger
4G MODEM DIAG not found
471 elif [ "$TYPE" == "qmi_wwan" ]; then
472 #search diagnostic device
473 TTY
=`ls /dev/cdc-wdm*`
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
482 logger
4G MODEM DIAG not found
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`
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"
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"
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"
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
543 elif [ "$1" == "disconnect" ]; then
545 elif [ "$1" == "watchdog" ]; then
547 elif [ "$1" == "signal" ]; then
556 if [ "$TYPE" == "non-hilink" -o "$TYPE" == "hw-ether" -o "$TYPE" == "qmi_wwan" ]; then #only for non-hilink
562 #force connection after detect 4G modem