4 # Copyright (C) 2015 shibby
9 MODE
=`nvram get "$PREFIX"_proto`
10 LOCK
="/tmp/switch4g.lock"
13 if [ ! "$MODE" == "lte" ]; then
18 APN
=`nvram get "$PREFIX"_modem_apn`
19 DEV
=`nvram get modem_dev4g`
20 TYPE
=`nvram get modem_type`
21 IFA
=`nvram get wan_4g`
22 SPEED
=`nvram get "$PREFIX"_modem_speed`
24 logger
4G MODEM
- connecting ...
26 if [ "$TYPE" == "non-hilink" -o "$TYPE" == "hw-ether" ]; then
30 if [ -z "$DEV" ]; then
31 logger
4G MODEM
- DIAG interface not found
- connection terminated
35 #we try use last diag iface first. If it failed then we try use any other ttyUSB device
36 TTY
=`ls /dev/ttyUSB* | grep -v $DEV`
39 while [ $CONNECTED == "0" ]; do
41 if [ "$COUNT" -lt "5" ]; then
43 MODE
="AT^NDISDUP=1,0" gcom
-d $i -s /etc
/gcom
/setverbose.gcom
> /tmp
/4g.mode
45 #change network type if required
46 MODE
="AT^SYSCFGEX?" gcom
-d $i -s /etc
/gcom
/setverbose.gcom
> /tmp
/4g.mode
47 RESULT
=`cat /tmp/4g.mode | grep SYSCFGEX | grep '"' | cut -d '"' -f2`
51 "03") RES1
="4G only" ;;
52 "02") RES1
="3G only" ;;
53 "0302") RES1
="4G/3G only" ;;
54 "030201") RES1
="4G/3G/2G" ;;
60 "03") SPD1
="4G only" ;;
61 "02") SPD1
="3G only" ;;
62 "0302") SPD1
="4G/3G only" ;;
63 "030201") SPD1
="4G/3G/2G" ;;
68 if [ "$RESULT" == "$SPEED" ]; then
69 logger
4G MODEM
- Network
type is
$RES1
71 logger
4G MODEM
- Network
type changed
: was
$RES1, now
$SPD1
72 MODE
="AT^SYSCFGEX=\"$SPEED\",3fffffff,2,4,7fffffffffffffff,," gcom
-d $i -s /etc
/gcom
/setverbose.gcom
77 MODE
="AT^NDISDUP=1,1,\"$APN\"" gcom
-d $i -s /etc
/gcom
/setverbose.gcom
78 MODE
="AT+CGPADDR=1" gcom
-d $i -s /etc
/gcom
/setverbose.gcom
> /tmp
/4g.mode
80 CHECK
=`cat /tmp/4g.mode | grep "+CGPADDR:" | cut -d '"' -f2 | wc -l`
81 if [ "$CHECK" == "1" ]; then
82 logger
4G MODEM
- connected ...
85 nvram
set modem_dev4g
="$i"
88 logger
4G MODEM
- device
$i connection failed.
90 COUNT
=`expr $COUNT + 1`
95 # checked all devices but still not connected?
96 if [ $CONNECTED == "0" ]; then
97 INTERVAL
=`nvram get mwan_cktime`
98 if [ "$INTERVAL" -gt 0 ]; then
99 logger
4G MODEM
- connection failed
- watchdog enabled
102 logger
4G MODEM
- connection failed
- process terminated
!
109 elif [ "$TYPE" == "qmi_wwan" ]; then
112 # wait till registered
113 while [ `uqmi -s -d "$DEV" --get-serving-system | grep searching | wc -l` != "0" ]; do
118 uqmi
-s -d "$DEV" --set-network-modes "lte"
121 if [ "$CLID" == "" ]; then
122 # get client id for wds - only once!
123 CLID
=`uqmi -s -d "$DEV" --get-client-id wds`
124 nvram
set modem_clid
=$CLID
125 logger
4G MODEM
- got new Client ID
: $CLID
130 while [ $CONNECTED == "0" ]; do
131 if [ "$COUNT" -lt "5" ]; then
133 if [ "$CLID" != "" ]; then
135 PDH
=`uqmi -s -d "$DEV" --set-client-id wds,"$CLID" --start-network "$APN" --autoconnect`
138 logger
"4G MODEM - device $DEV connection failed."
140 COUNT
=`expr $COUNT + 1`
143 logger
"4G MODEM - connected ..."
146 logger
4G MODEM
- Session ID
: $PDH
147 nvram
set modem_pdh
=$PDH
152 logger
"4G MODEM - Unable to obtain client ID"
156 # checked 5 times but still not connected?
157 INTERVAL
=`nvram get mwan_cktime`
158 if [ "$INTERVAL" -gt 0 ]; then
159 logger
4G MODEM
- connection failed
- watchdog enabled
162 logger
4G MODEM
- connection failed
- process terminated
!
174 while [ $GO = "0" ]; do
175 if [ "$COUNT" == "5" ]; then
176 INTERVAL
=`nvram get mwan_cktime`
177 if [ "$INTERVAL" -gt 0 ]; then
178 logger
4G MODEM WAN IFACE failed
- watchdog enabled
181 logger
4G MODEM WAN IFACE failed
- connection process terminated
!
187 dhcpc-release
$PREFIX
191 CHECKIFA
=`ifconfig | grep $IFA | wc -l`
192 if [ "$CHECKIFA" == "1" ]; then
194 logger
4G MODEM
- WAN IFACE configured ...
196 echo "1" > /tmp
/state_
$PREFIX
199 logger
4G MODEM WAN IFACE
- count
: $COUNT
200 COUNT
=`expr $COUNT + 1`
208 DEV
=`nvram get modem_dev4g`
209 TYPE
=`nvram get modem_type`
210 CLID
=`nvram get modem_clid`
212 logger
4G MODEM
- disconnecting ...
214 dhcpc-release
$PREFIX
216 if [ "$TYPE" == "non-hilink" -o "$TYPE" == "hw-ether" ]; then
217 MODE
="AT^NDISDUP=1,0" gcom
-d $DEV -s /etc
/gcom
/setmode.gcom
218 elif [ "$TYPE" == "qmi_wwan" ]; then
219 # disable previous autoconnect state using the global handle
220 # do not reuse previous wds client id to prevent hangs caused by stale data
221 uqmi
-s -d "$DEV" --stop-network 0xffffffff --autoconnect
222 if [ "$CLID" != "" ]; then
223 logger
4G MODEM
- release Client ID
: $CLID
224 uqmi
-s -d "$DEV" --set-client-id wds
,"$CLID" --release-client-id wds
225 nvram
unset modem_pdh
226 nvram
unset modem_clid
230 logger
4G MODEM
- disconnected ...
235 if [ -f $LOCK ]; then #lock exist
236 logger
4G MODEM
- previous proces of switch4g still working
238 TEST
=`ps | grep switch4g | grep -v "grep" | wc -l`
239 if [ "$TEST" == "0" ]; then #lock file exist but process doesn`t.
249 PIN
=`nvram get "$PREFIX"_modem_pin`
250 IS_PIN
=`nvram get "$PREFIX"_modem_pin | wc -w`
252 if [ "$IS_PIN" == "1" ]; then #only for non-hilink
254 if [ "$TYPE" == "non-hilink" -o "$TYPE" == "hw-ether" ]; then
255 #we try use last diag iface first. If it failed then we try use any other ttyUSB device
256 TTY
=`ls /dev/ttyUSB* | grep -v $DEV`
260 if [ "$COUNT" -lt "5" ]; then
262 PINCODE
="$PIN" gcom
-d $i -s /etc
/gcom
/setpin.gcom
> /tmp
/4g.pin
263 IS_READY
=`cat /tmp/4g.pin | grep successfully | wc -l`
264 if [ "$IS_READY" == "1" ]; then
265 logger
4G MODEM
- SIM ready
266 nvram
set modem_dev4g
="$i"
269 logger
4G MODEM
- SIM not ready
- count
: $COUNT
270 COUNT
=`expr $COUNT + 1`
275 logger
4G MODEM
- SIM locked
- connection process terminated
!
279 elif [ "$TYPE" == "qmi_wwan" ]; then
281 PINSTATUS
= `uqmi -s -d "$DEVNR" --get-pin-status | cut -d "," -f 1 | cut -d ":" -f 2 | cut -d "\"" -f2`
282 if [ "$PINSTATUS" != 'disabled' ]; then
283 uqmi
-s -d "$DEVNR" --verify-pin1 "$PIN"
290 MODULES
="qmi_wwan cdc_ether huawei_ether cdc_ncm"
292 for MODULE
in $MODULES; do
299 while [ $FOUND == "0" ]; do
300 #modem not found, try detect
301 DEVICES
=`lsusb | awk '{print $6}'`
303 for SWITCH
in $DEVICES; do
304 SEARCH
=`ls /etc/usb_modeswitch.d/$SWITCH | wc -l`
308 if [ "$SEARCH" == "1" ]; then
309 logger
4G MODEM FOUND
- $SWITCH - Switching ...
310 DV
=`echo $SWITCH | cut -d ":" -f1`
311 DP
=`echo $SWITCH | cut -d ":" -f2`
312 /usr
/sbin
/usb_modeswitch
-Q -c /etc
/usb_modeswitch.d
/$SWITCH -v $DV -p $DP
314 TEST1
=`cat /etc/usb_modeswitch.d/$SWITCH | grep "TargetVendor" | cut -d "=" -f2 | wc -l`
315 if [ "$TEST1" == "1" ]; then
316 VENDOR
=`cat /etc/usb_modeswitch.d/$SWITCH | grep "TargetVendor" | cut -d "=" -f2 | cut -d "x" -f2`
318 VENDOR
=`echo $SWITCH | cut -d ":" -f1`
321 TEST2
=`lsusb | awk '{print $6}' | grep $VENDOR | wc -l`
322 if [ "$TEST2" == "1" ]; then
323 PRODUCT
=`lsusb | awk '{print $6}' | grep $VENDOR | cut -d ":" -f2`
324 logger
4G MODEM ready
- $VENDOR:$PRODUCT
325 echo "$VENDOR:$PRODUCT" > /tmp
/4g.detect
330 #need few seconds before modem will be detected once again after switch
334 for MODULE
in $MODULES; do
338 SEARCH
=`cat /proc/bus/usb/devices | grep Driver | grep $MODULE | wc -l`
340 if [ "$SEARCH" -gt 0 ]; then
341 if [ "$MODULE" == "cdc_ether" ]; then
343 elif [ "$MODULE" == "cdc_ncm" ]; then
345 elif [ "$MODULE" == "huawei_ether" ]; then
347 elif [ "$MODULE" == "qmi_wwan" ]; then
353 logger
4G MODEM NDIS found
- $TYPE - using
$MODULE module
354 nvram
set 4g_module
=$MODULE
358 if [ "$COUNT" == "5" ]; then
359 logger
4G MODEM NDIS not found
- process terminated
!
363 logger
4G MODEM NDIS not found
- $MODULE - count
: $COUNT
365 COUNT
=`expr $COUNT + 1`
375 #search WAN interface (usbX or ethX)
379 KERNEL
=`uname -r | cut -d "." -f1,2,3`
381 while [ $FOUND == "0" ]; do
382 if [ "$TYPE" == "hw-ether" ]; then
383 WAN
=`dmesg | grep huawei_ether | grep Device | grep register | cut -d ":" -f1 | tail -1`
384 elif [ "$KERNEL" == "2.6.36" ]; then #ARM
385 WAN
=`dmesg | grep $MODULE | grep register | grep "'" | cut -d " " -f3 | cut -d ":" -f1 | tail -1`
387 WAN
=`dmesg | grep $MODULE | grep register | grep "'" | cut -d ":" -f1 | tail -1`
390 IS_WAN
=`echo $WAN | wc -w`
392 if [ "$IS_WAN" -gt 0 ]; then
393 logger
4G MODEM WAN found
- $TYPE - using
$WAN as WAN
394 nvram
set wan_4g
="$WAN"
395 nvram
set modem_type
=$TYPE
397 echo "$WAN" > /tmp
/4g.ready
399 if [ "$COUNT" == "5" ]; then
400 logger
4G MODEM WAN not found
- connection process terminated
!
404 logger
4G MODEM WAN not found
- count
: $COUNT
405 COUNT
=`expr $COUNT + 1`
415 if [ "$TYPE" == "non-hilink" -o "$TYPE" == "hw-ether" ]; then
416 US
=`cat /proc/bus/usb/devices | grep Driver | grep usbserial | wc -l`
418 if [ "$US" -gt 0 ]; then
419 logger
4G MODEM found
- Diagnostic interface
- using usbserial module
422 IS_VENDOR
=`echo $VENDOR | wc -w`
423 if [ "$IS_VENDOR" -gt 0 ]; then
424 IS_PRODUCT
=`echo $PRODUCT | wc -w`
425 if [ "$IS_PRODUCT" -gt 0 ]; then
426 logger
4G MODEM
- loading module usbserial
427 modprobe
-r usbserial
428 insmod usbserial vendor
=0x
$VENDOR product
=0x
$PRODUCT
429 echo "$VENDOR:$PRODUCT" > /tmp
/4g.detect
433 DEV
=`cat /proc/bus/usb/devices | grep Driver | grep usbserial | wc -l`
434 if [ "$DEV" -gt 0 ]; then
435 logger
4G MODEM ready
- using usbserial module
437 nvram
set 4g_module
=usbserial
439 #last change. try load usbserial for each usb devices
440 DEVICES
=`lsusb | awk '{print $6}'`
441 for SWITCH
in $DEVICES; do
442 if [ "$FOUND" == "0" ]; then
443 VENDOR
=`echo $SWITCH | cut -d ":" -f1`
444 PRODUCT
=`echo $SWITCH | cut -d ":" -f2`
445 modprobe
-r usbserial
446 insmod usbserial vendor
=0x
$VENDOR product
=0x
$PRODUCT
448 DEV
=`cat /proc/bus/usb/devices | grep Driver | grep usbserial | wc -l`
449 if [ "$DEV" -gt 0 ]; then
450 logger
4G MODEM ready
- using usbserial module
451 nvram
set 4g_module
=usbserial
452 echo "$VENDOR:$PRODUCT" > /tmp
/4g.detect
461 #search diagnostic device
462 TTY
=`ls /dev/ttyUSB*`
465 CHECKTTY
=`gcom -d $i -s /etc/gcom/getcardinfo.gcom | grep OK | wc -l`
466 if [ "$CHECKTTY" == "1" ]; then #found working interface
467 logger
4G MODEM DIAG found
- $i
468 nvram
set modem_dev4g
=$i
471 logger
4G MODEM DIAG not found
474 elif [ "$TYPE" == "qmi_wwan" ]; then
475 #search diagnostic device
476 TTY
=`ls /dev/cdc-wdm*`
479 CHECKTTY
=`uqmi -s -d "$i" --get-versions | grep service | wc -l`
480 if [ "$CHECKTTY" == "1" ]; then #found working interface
481 logger
4G MODEM DIAG found
- $i
482 nvram
set modem_dev4g
=$i
485 logger
4G MODEM DIAG not found
492 DEVNR
=`nvram get modem_dev4g`
493 TYPE
=`nvram get modem_type`
497 if [ "$TYPE" == "non-hilink" -o "$TYPE" == "hw-ether" ]; then
498 HCSQ
=`MODE="AT^HCSQ?" gcom -d $DEVNR -s /etc/gcom/setverbose.gcom | grep "HCSQ:" | tr -d '\r'`
499 SPEED
=`echo $HCSQ | cut -d "," -f1 | cut -d '"' -f2`
502 VALUE
=`echo $HCSQ | cut -d "," -f2`
503 RSSI
=`awk "BEGIN {print -120+$VALUE}"` #dBm
504 VALUE
=`echo $HCSQ | cut -d "," -f3`
505 RSRP
=`awk "BEGIN {print -140+$VALUE}"` #dBm
506 VALUE
=`echo $HCSQ | cut -d "," -f4`
507 SINR
=`awk "BEGIN {print -20+$VALUE*0.2}"` #dB
508 VALUE
=`echo $HCSQ | cut -d "," -f5`
509 RSRQ
=`awk "BEGIN {print -19.5+$VALUE*0.5}"` #dB
510 logger
"4G MODEM Current Mode: $SPEED"
511 logger
"4G MODEM Signal Strength: RSSI $RSSI dBm, RSRP $RSRP dBm, SINR $SINR dB, RSRQ $RSRQ dB"
514 VALUE
=`echo $HCSQ | cut -d "," -f2`
515 RSSI
=`awk "BEGIN {print -120+$VALUE}"` #dBm
516 VALUE
=`echo $HCSQ | cut -d "," -f3`
517 RSRP
=`awk "BEGIN {print -120+$VALUE}"` #dBm
518 VALUE
=`echo $HCSQ | cut -d "," -f4`
519 ECIO
=`awk "BEGIN {print -32+$VALUE*0.5}"` #dB
520 logger
"4G MODEM Current Mode: $SPEED"
521 logger
"4G MODEM Signal Strength: RSSI $RSSI dBm, RSRP $RSRP dBm, ECIO $SINR dB"
524 VALUE
=`echo $HCSQ | cut -d "," -f2`
525 RSSI
=`awk "BEGIN {print -120+$VALUE}"` #dBm
526 logger
"4G MODEM Current Mode: $SPEED"
527 logger
"4G MODEM Signal Strength: RSSI $RSSI dBm"
530 logger
"4G MODEM Current Mode: unknown"
531 logger
"4G MODEM Signal Strength: no data"
534 elif [ "$TYPE" == "qmi_wwan" ]; then
535 RSSI
=`uqmi -s -d "$DEVNR" --get-signal-info | cut -d "," -f2 | cut -d ":" -f2`
536 RSRQ
=`uqmi -s -d "$DEVNR" --get-signal-info | cut -d "," -f3 | cut -d ":" -f2`
537 RSRP
=`uqmi -s -d "$DEVNR" --get-signal-info | cut -d "," -f4 | cut -d ":" -f2`
538 logger
"4G MODEM Signal Strength: RSSI $RSSI dBm, RSRP $RSRP dB, RSRQ $RSRQ dB"
543 ###################################################
545 if [ "$2" == "connect" ]; then
547 elif [ "$2" == "disconnect" ]; then
549 elif [ "$2" == "signal" ]; then
554 if [ ! -f $READY ]; then #modem not detected
559 if [ "$TYPE" == "non-hilink" -o "$TYPE" == "hw-ether" -o "$TYPE" == "qmi_wwan" ]; then #only for non-hilink
566 #force connection after detect 4G modem