comgt: add delay option for 3g proto
[openwrt/.git] / package / network / utils / comgt / files / 3g.sh
1 #!/bin/sh
2
3 [ -n "$INCLUDE_ONLY" ] || {
4         NOT_INCLUDED=1
5         INCLUDE_ONLY=1
6
7         . ../netifd-proto.sh
8         . ./ppp.sh
9         init_proto "$@"
10 }
11
12 proto_3g_init_config() {
13         no_device=1
14         available=1
15         ppp_generic_init_config
16         proto_config_add_string "device:device"
17         proto_config_add_string "apn"
18         proto_config_add_string "service"
19         proto_config_add_string "pincode"
20         proto_config_add_string "delay"
21         proto_config_add_string "dialnumber"
22 }
23
24 proto_3g_setup() {
25         local interface="$1"
26         local chat
27
28         json_get_var device device
29         json_get_var apn apn
30         json_get_var service service
31         json_get_var pincode pincode
32         json_get_var dialnumber dialnumber
33         json_get_var delay delay
34
35         [ -n "$dat_device" ] && device=$dat_device
36
37         device="$(readlink -f $device)"
38         [ -e "$device" ] || {
39                 proto_set_available "$interface" 0
40                 return 1
41         }
42
43         [ -n "$delay" ] && sleep "$delay"
44
45         case "$service" in
46                 cdma|evdo)
47                         chat="/etc/chatscripts/evdo.chat"
48                 ;;
49                 *)
50                         chat="/etc/chatscripts/3g.chat"
51                         cardinfo=$(gcom -d "$device" -s /etc/gcom/getcardinfo.gcom)
52                         if echo "$cardinfo" | grep -q Novatel; then
53                                 case "$service" in
54                                         umts_only) CODE=2;;
55                                         gprs_only) CODE=1;;
56                                         *) CODE=0;;
57                                 esac
58                                 export MODE="AT\$NWRAT=${CODE},2"
59                         elif echo "$cardinfo" | grep -q Option; then
60                                 case "$service" in
61                                         umts_only) CODE=1;;
62                                         gprs_only) CODE=0;;
63                                         *) CODE=3;;
64                                 esac
65                                 export MODE="AT_OPSYS=${CODE}"
66                         elif echo "$cardinfo" | grep -q "Sierra Wireless"; then
67                                 SIERRA=1
68                         elif echo "$cardinfo" | grep -qi huawei; then
69                                 case "$service" in
70                                         umts_only) CODE="14,2";;
71                                         gprs_only) CODE="13,1";;
72                                         *) CODE="2,2";;
73                                 esac
74                                 export MODE="AT^SYSCFG=${CODE},3FFFFFFF,2,4"
75                         fi
76
77                         if [ -n "$pincode" ]; then
78                                 PINCODE="$pincode" gcom -d "$device" -s /etc/gcom/setpin.gcom || {
79                                         proto_notify_error "$interface" PIN_FAILED
80                                         proto_block_restart "$interface"
81                                         return 1
82                                 }
83                         fi
84                         [ -n "$MODE" ] && gcom -d "$device" -s /etc/gcom/setmode.gcom
85
86                         # wait for carrier to avoid firmware stability bugs
87                         [ -n "$SIERRA" ] && {
88                                 gcom -d "$device" -s /etc/gcom/getcarrier.gcom || return 1
89                         }
90
91                         if [ -z "$dialnumber" ]; then
92                                 dialnumber="*99***1#"
93                         fi
94
95                 ;;
96         esac
97
98         connect="${apn:+USE_APN=$apn }DIALNUMBER=$dialnumber /usr/sbin/chat -t5 -v -E -f $chat"
99         ppp_generic_setup "$interface" \
100                 noaccomp \
101                 nopcomp \
102                 novj \
103                 nobsdcomp \
104                 noauth \
105                 set EXTENDPREFIX=1 \
106                 lock \
107                 crtscts \
108                 115200 "$device"
109         return 0
110 }
111
112 proto_3g_teardown() {
113         proto_kill_command "$interface"
114 }
115
116 [ -z "$NOT_INCLUDED" ] || add_protocol 3g