Remove TCP Vegas support (ARM7)
[tomato.git] / release / src-rt-6.x.4708 / router / others / switch4g
bloba2cd4d0f24eb4c5ea686d7a99010f2c3a32239df
1 #!/bin/sh
4 # Copyright (C) 2015 shibby
7 PREFIX=$1
9 MODE=`nvram get "$PREFIX"_proto`
10 LOCK="/tmp/switch4g.lock"
11 READY="/tmp/4g.ready"
13 if [ ! "$MODE" == "lte" ]; then
14 exit 0
17 connect() {
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
27 CONNECTED=0
28 COUNT=0
30 if [ -z "$DEV" ]; then
31 logger 4G MODEM - DIAG interface not found - connection terminated
32 exit 0;
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`
37 DEVS="$DEV $TTY"
39 while [ $CONNECTED == "0" ]; do
40 for i in $DEVS; do
41 if [ "$COUNT" -lt "5" ]; then
42 #disconnect first
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`
49 case "$RESULT" in
50 "00") RES1="Auto" ;;
51 "03") RES1="4G only" ;;
52 "02") RES1="3G only" ;;
53 "0302") RES1="4G/3G only" ;;
54 "030201") RES1="4G/3G/2G" ;;
55 *) RES1="unknown" ;;
56 esac
58 case "$SPEED" in
59 "00") SPD1="Auto" ;;
60 "03") SPD1="4G only" ;;
61 "02") SPD1="3G only" ;;
62 "0302") SPD1="4G/3G only" ;;
63 "030201") SPD1="4G/3G/2G" ;;
64 *) SPD1="unknown" ;;
65 esac
68 if [ "$RESULT" == "$SPEED" ]; then
69 logger 4G MODEM - Network type is $RES1
70 else
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
73 sleep 5
76 #connecting
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 ...
83 CONNECTED=1
84 COUNT=6
85 nvram set modem_dev4g="$i"
86 break;
87 else
88 logger 4G MODEM - device $i connection failed.
89 sleep 5
90 COUNT=`expr $COUNT + 1`
93 done
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
100 watchdog add
101 else
102 logger 4G MODEM - connection failed - process terminated!
103 watchdog del
105 rm $LOCK;
106 exit 0;
108 done
109 elif [ "$TYPE" == "qmi_wwan" ]; then
110 CLID=""
112 # wait till registered
113 while [ `uqmi -s -d "$DEV" --get-serving-system | grep searching | wc -l` != "0" ]; do
114 sleep 5
115 done
117 # set lte mode
118 uqmi -s -d "$DEV" --set-network-modes "lte"
119 sleep 2
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
128 CONNECTED=0
129 COUNT=0
130 while [ $CONNECTED == "0" ]; do
131 if [ "$COUNT" -lt "5" ]; then
133 if [ "$CLID" != "" ]; then
134 #connect...
135 PDH=`uqmi -s -d "$DEV" --set-client-id wds,"$CLID" --start-network "$APN" --autoconnect`
136 case $PDH in
137 ''|*[!0-9]*)
138 logger "4G MODEM - device $DEV connection failed."
139 sleep 5
140 COUNT=`expr $COUNT + 1`
143 logger "4G MODEM - connected ..."
144 CONNECTED=1
145 COUNT=6
146 logger 4G MODEM - Session ID: $PDH
147 nvram set modem_pdh=$PDH
148 break;
150 esac
151 else
152 logger "4G MODEM - Unable to obtain client ID"
153 exit 0;
155 else
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
160 watchdog add
161 else
162 logger 4G MODEM - connection failed - process terminated!
163 watchdog del
165 rm $LOCK;
166 exit 0;
168 done
171 GO=0
172 COUNT=1
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
179 watchdog add
180 else
181 logger 4G MODEM WAN IFACE failed - connection process terminated!
182 watchdog del
184 rm $LOCK
185 exit 0;
186 else
187 dhcpc-release $PREFIX
188 sleep 1
189 dhcpc-renew $PREFIX
191 CHECKIFA=`ifconfig | grep $IFA | wc -l`
192 if [ "$CHECKIFA" == "1" ]; then
193 GO=1
194 logger 4G MODEM - WAN IFACE configured ...
195 watchdog add
196 echo "1" > /tmp/state_$PREFIX
197 signal
198 else
199 logger 4G MODEM WAN IFACE - count: $COUNT
200 COUNT=`expr $COUNT + 1`
201 sleep 5
204 done
207 disconnect() {
208 DEV=`nvram get modem_dev4g`
209 TYPE=`nvram get modem_type`
210 CLID=`nvram get modem_clid`
212 logger 4G MODEM - disconnecting ...
213 watchdog del
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 ...
234 checkLock() {
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.
240 rm $LOCK
242 exit 0
243 else
244 touch $LOCK
248 setPIN() {
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`
257 DEVS="$DEV $TTY"
258 COUNT=1
260 if [ "$COUNT" -lt "5" ]; then
261 for i in $DEVS; do
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"
267 break;
268 else
269 logger 4G MODEM - SIM not ready - count: $COUNT
270 COUNT=`expr $COUNT + 1`
271 sleep 5
273 done
274 else
275 logger 4G MODEM - SIM locked - connection process terminated!
276 watchdogDel
277 exit 0;
279 elif [ "$TYPE" == "qmi_wwan" ]; then
280 # get pin status
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"
289 switchMode() {
290 MODULES="qmi_wwan cdc_ether huawei_ether cdc_ncm"
292 for MODULE in $MODULES; do
293 modprobe -r $MODULE
294 done
296 COUNT=0
297 FOUND=0
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`
306 # vendor:product
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`
317 else
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
328 done
330 #need few seconds before modem will be detected once again after switch
331 sleep 10
333 # is modem ready?
334 for MODULE in $MODULES; do
335 modprobe $MODULE
336 sleep 2
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
342 TYPE="hilink"
343 elif [ "$MODULE" == "cdc_ncm" ]; then
344 TYPE="non-hilink"
345 elif [ "$MODULE" == "huawei_ether" ]; then
346 TYPE="hw-ether"
347 elif [ "$MODULE" == "qmi_wwan" ]; then
348 TYPE="qmi_wwan"
349 else
350 TYPE="unknown"
353 logger 4G MODEM NDIS found - $TYPE - using $MODULE module
354 nvram set 4g_module=$MODULE
355 FOUND=1
356 break;
357 else
358 if [ "$COUNT" == "5" ]; then
359 logger 4G MODEM NDIS not found - process terminated!
360 rm $LOCK
361 exit 0;
362 else
363 logger 4G MODEM NDIS not found - $MODULE - count: $COUNT
364 modprobe -r $MODULE
365 COUNT=`expr $COUNT + 1`
366 sleep 5
369 done
370 done
373 searchWAN() {
375 #search WAN interface (usbX or ethX)
376 FOUND=0
377 COUNT=0
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`
386 else #MIPSEL
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
396 FOUND=1
397 echo "$WAN" > /tmp/4g.ready
398 else
399 if [ "$COUNT" == "5" ]; then
400 logger 4G MODEM WAN not found - connection process terminated!
401 rm $LOCK
402 exit 0;
403 else
404 logger 4G MODEM WAN not found - count: $COUNT
405 COUNT=`expr $COUNT + 1`
406 sleep 5
409 done
412 searchDiag() {
413 FOUND=0
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
420 break;
421 else
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
436 FOUND=1
437 nvram set 4g_module=usbserial
438 else
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
453 FOUND=1
454 break;
457 done
461 #search diagnostic device
462 TTY=`ls /dev/ttyUSB*`
464 for i in $TTY; do
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
469 DEVNR=$i
470 else
471 logger 4G MODEM DIAG not found
473 done
474 elif [ "$TYPE" == "qmi_wwan" ]; then
475 #search diagnostic device
476 TTY=`ls /dev/cdc-wdm*`
478 for i in $TTY; do
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
483 DEVNR=$i
484 else
485 logger 4G MODEM DIAG not found
487 done
491 signal() {
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`
500 case "$SPEED" in
501 "LTE")
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"
513 "WCDMA")
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"
523 "GSM")
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"
533 esac
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
546 connect
547 elif [ "$2" == "disconnect" ]; then
548 disconnect
549 elif [ "$2" == "signal" ]; then
550 signal
551 else
552 checkLock
554 if [ ! -f $READY ]; then #modem not detected
555 switchMode
557 searchWAN
559 if [ "$TYPE" == "non-hilink" -o "$TYPE" == "hw-ether" -o "$TYPE" == "qmi_wwan" ]; then #only for non-hilink
560 searchDiag
562 setPIN
566 #force connection after detect 4G modem
567 connect
569 #remove lock
570 rm $LOCK