| #!/bin/sh |
| |
| [ -n "$INCLUDE_ONLY" ] || { |
| NOT_INCLUDED=1 |
| INCLUDE_ONLY=1 |
| |
| . ../netifd-proto.sh |
| . ./ppp.sh |
| init_proto "$@" |
| } |
| |
| proto_3g_init_config() { |
| no_device=1 |
| available=1 |
| ppp_generic_init_config |
| proto_config_add_string "device:device" |
| proto_config_add_string "apn" |
| proto_config_add_string "service" |
| proto_config_add_string "pincode" |
| proto_config_add_string "delay" |
| proto_config_add_string "dialnumber" |
| } |
| |
| proto_3g_setup() { |
| local interface="$1" |
| local chat |
| |
| json_get_var device device |
| json_get_var apn apn |
| json_get_var service service |
| json_get_var pincode pincode |
| json_get_var dialnumber dialnumber |
| json_get_var delay delay |
| |
| [ -n "$dat_device" ] && device=$dat_device |
| |
| device="$(readlink -f $device)" |
| [ -e "$device" ] || { |
| proto_set_available "$interface" 0 |
| return 1 |
| } |
| |
| [ -n "$delay" ] && sleep "$delay" |
| |
| case "$service" in |
| cdma|evdo) |
| chat="/etc/chatscripts/evdo.chat" |
| ;; |
| *) |
| chat="/etc/chatscripts/3g.chat" |
| cardinfo=$(gcom -d "$device" -s /etc/gcom/getcardinfo.gcom) |
| if echo "$cardinfo" | grep -q Novatel; then |
| case "$service" in |
| umts_only) CODE=2;; |
| gprs_only) CODE=1;; |
| *) CODE=0;; |
| esac |
| export MODE="AT\$NWRAT=${CODE},2" |
| elif echo "$cardinfo" | grep -q Option; then |
| case "$service" in |
| umts_only) CODE=1;; |
| gprs_only) CODE=0;; |
| *) CODE=3;; |
| esac |
| export MODE="AT_OPSYS=${CODE}" |
| elif echo "$cardinfo" | grep -q "Sierra Wireless"; then |
| SIERRA=1 |
| elif echo "$cardinfo" | grep -qi huawei; then |
| case "$service" in |
| umts_only) CODE="14,2";; |
| gprs_only) CODE="13,1";; |
| *) CODE="2,2";; |
| esac |
| export MODE="AT^SYSCFG=${CODE},3FFFFFFF,2,4" |
| elif echo "$cardinfo" | grep -q "MikroTik"; then |
| COMMAND="AT+CFUN=1" gcom -d "$device" -s /etc/gcom/runcommand.gcom || return 1 |
| fi |
| |
| if [ -n "$pincode" ]; then |
| PINCODE="$pincode" gcom -d "$device" -s /etc/gcom/setpin.gcom || { |
| proto_notify_error "$interface" PIN_FAILED |
| proto_block_restart "$interface" |
| return 1 |
| } |
| fi |
| [ -n "$MODE" ] && gcom -d "$device" -s /etc/gcom/setmode.gcom |
| |
| # wait for carrier to avoid firmware stability bugs |
| [ -n "$SIERRA" ] && { |
| gcom -d "$device" -s /etc/gcom/getcarrier.gcom || return 1 |
| } |
| |
| if [ -z "$dialnumber" ]; then |
| dialnumber="*99***1#" |
| fi |
| |
| ;; |
| esac |
| |
| connect="${apn:+USE_APN=$apn }DIALNUMBER=$dialnumber /usr/sbin/chat -t5 -v -E -f $chat" |
| ppp_generic_setup "$interface" \ |
| noaccomp \ |
| nopcomp \ |
| novj \ |
| nobsdcomp \ |
| noauth \ |
| set EXTENDPREFIX=1 \ |
| lock \ |
| crtscts \ |
| 115200 "$device" |
| return 0 |
| } |
| |
| proto_3g_teardown() { |
| proto_kill_command "$interface" |
| } |
| |
| [ -z "$NOT_INCLUDED" ] || add_protocol 3g |