comgt: add directip proto

add a proto handler for sierra wireless directip modems

Signed-off-by: John Crispin <blogic@openwrt.org>

SVN-Revision: 42465
This commit is contained in:
John Crispin 2014-09-11 12:26:31 +00:00
parent cc82f93251
commit 7bad68804c
4 changed files with 167 additions and 1 deletions

View file

@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=comgt
PKG_VERSION:=0.32
PKG_RELEASE:=22
PKG_RELEASE:=23
PKG_SOURCE:=$(PKG_NAME).$(PKG_VERSION).tgz
PKG_SOURCE_URL:=@SF/comgt
@ -59,10 +59,13 @@ define Package/comgt/install
$(INSTALL_DATA) ./files/getcarrier.gcom $(1)/etc/gcom/getcarrier.gcom
$(INSTALL_DATA) ./files/getcnum.gcom $(1)/etc/gcom/getcnum.gcom
$(INSTALL_DATA) ./files/getimsi.gcom $(1)/etc/gcom/getimsi.gcom
$(INSTALL_DATA) ./files/directip.gcom $(1)/etc/gcom/directip.gcom
$(INSTALL_DATA) ./files/directip-stop.gcom $(1)/etc/gcom/directip-stop.gcom
$(INSTALL_DIR) $(1)/etc/hotplug.d/tty
$(INSTALL_DATA) ./files/3g.usb $(1)/etc/hotplug.d/tty/30-3g
$(INSTALL_DIR) $(1)/lib/netifd/proto
$(INSTALL_BIN) ./files/3g.sh $(1)/lib/netifd/proto/3g.sh
$(INSTALL_BIN) ./files/directip.sh $(1)/lib/netifd/proto/directip.sh
endef
$(eval $(call BuildPackage,comgt))

View file

@ -0,0 +1,16 @@
opengt
set com 115200n81
set comecho off
set senddelay 0.05
waitquiet 1 0.2
:start
send "AT!SCACT=0,3^m"
waitfor 5 "OK"
if % = 0 goto hangupok
print "WWAN error. Hangup failed.\r\n"
exit 1
:hangupok
print "WWAN connection established.\r\n"
exit 0

View file

@ -0,0 +1,55 @@
opengt
set com 115200n81
set comecho off
set senddelay 0.05
waitquiet 1 0.2
:start
if $env("USE_AUTH") = "0" goto connect
send "AT$QCPDPP=3,"
send $env("USE_AUTH")
send ",\""
if $env("USE_USER") <> "" send $env("USE_USER")
send "\",\""
if $env("USE_PASS") <> "" send $env("USE_PASS")
send "\"^m"
waitfor 5 "OK"
if % = 0 goto connect
print "WWAN error. Auth failed.\r\n"
exit 1
:connect
send "AT+CFUN=1^m"
send "AT+CGDCONT=3,\"IP\",\""
send $env("USE_APN")
send "\"^m"
waitfor 5 "OK"
if % = 0 goto connok
print "WWAN error. Connection failed.\r\n"
exit 1
:connok
let c=1
:loop
sleep 2
send "AT+CGATT?^m"
waitfor 5 "+CGATT: 1"
if % = 0 goto carrierok
if c > 10 goto carriererr
inc c
goto loop
carriererr:
print "WWAN error. No carrier.\r\n"
exit 1
:carrierok
send "AT!SCACT=1,3^m"
waitfor 5 "OK"
if % = 0 goto dialok
print "WWAN error. Dialing failed.\r\n"
exit 1
:dialok
print "WWAN connection established.\r\n"
exit 0

View file

@ -0,0 +1,92 @@
#!/bin/sh
. /lib/functions.sh
. ../netifd-proto.sh
init_proto "$@"
proto_directip_init_config() {
available=1
proto_config_add_string "device:device"
proto_config_add_string "ifname"
proto_config_add_string "apn"
proto_config_add_string "pincode"
proto_config_add_string "auth"
proto_config_add_string "username"
proto_config_add_string "password"
}
proto_directip_setup() {
local interface="$1"
local chat
local device apn pincode ifname auth username password
json_get_vars device apn pincode ifname auth username password
[ -e "$device" ] || {
proto_notify_error "$interface" NO_DEVICE
proto_set_available "$interface" 0
return 1
}
[ -n "$ifname" ] || {
proto_notify_error "$interface" NO_IFNAME
proto_set_available "$interface" 0
return 1
}
cardinfo=$(gcom -d "$device" -s /etc/gcom/getcardinfo.gcom)
[ -n $(echo "$cardinfo" | grep -q "Sierra Wireless") ] || {
proto_notify_error "$interface" BAD_DEVICE
proto_block_restart "$interface"
return 1
}
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
# wait for carrier to avoid firmware stability bugs
gcom -d "$device" -s /etc/gcom/getcarrier.gcom || return 1
local auth_type=0
[ -z "$auth" ] && case $auth in
pap) auth_type=1;;
chap) auth_type=1;;
esac
USE_APN="$apn" USE_USER="$username" USE_PASS="$password" USE_AUTH="$auth_type" \
gcom -d "$device" -s /etc/gcom/directip.gcom || {
proto_notify_error "$interface" CONNECT_FAILED
proto_block_restart "$interface"
return 1
}
logger -p daemon.info -t "directip[$$]" "Connected, starting DHCP"
proto_init_update "*" 1
proto_send_update "$interface"
json_init
json_add_string name "${interface}_dhcp"
json_add_string ifname "@$interface"
json_add_string proto "dhcp"
ubus call network add_dynamic "$(json_dump)"
return 0
}
proto_directip_teardown() {
local interface="$1"
local device
json_get_vars device
gcom -d "$device" -s /etc/gcom/directip-stop.gcom || proto_notify_error "$interface" CONNECT_FAILED
proto_init_update "*" 0
proto_send_update "$interface"
}
add_protocol directip