This patch adds 2 packages. A package for NCM protocol with modular support for 
drivers/at-command sets. Second package adds support/driver/AT-command set for 
Huawei e3276 dongle. This package can also easily be used as a base when 
creating support for another dongles.

Signed-off-by: Oskari Rauta <oskari.rauta at gmail.com>
---
 net/ncm/Makefile                                   |  80 ++++++++++++
 .../files/etc/gcom/ncm/carrier/huawei_e3276.gcom   |  56 ++++++++
 .../files/etc/gcom/ncm/connect/huawei_e3276.gcom   |  63 +++++++++
 net/ncm/files/etc/gcom/ncm/getcardinfo.gcom        |  38 ++++++
 .../etc/gcom/ncm/initscripts/huawei_e3276.gcom     |  31 +++++
 .../files/etc/gcom/ncm/setmode/huawei_e3276.gcom   |  56 ++++++++
 .../files/etc/gcom/ncm/signal/huawei_e3276.gcom    |  61 +++++++++
 net/ncm/files/lib/netifd/ncm_dhcp.script           |  85 ++++++++++++
 net/ncm/files/lib/netifd/proto/ncm.sh              | 144 +++++++++++++++++++++
 9 files changed, 614 insertions(+)
 create mode 100644 net/ncm/Makefile
 create mode 100644 net/ncm/files/etc/gcom/ncm/carrier/huawei_e3276.gcom
 create mode 100644 net/ncm/files/etc/gcom/ncm/connect/huawei_e3276.gcom
 create mode 100644 net/ncm/files/etc/gcom/ncm/getcardinfo.gcom
 create mode 100644 net/ncm/files/etc/gcom/ncm/initscripts/huawei_e3276.gcom
 create mode 100644 net/ncm/files/etc/gcom/ncm/setmode/huawei_e3276.gcom
 create mode 100644 net/ncm/files/etc/gcom/ncm/signal/huawei_e3276.gcom
 create mode 100755 net/ncm/files/lib/netifd/ncm_dhcp.script
 create mode 100644 net/ncm/files/lib/netifd/proto/ncm.sh

diff --git a/net/ncm/Makefile b/net/ncm/Makefile
new file mode 100644
index 0000000..13b4ca9
--- /dev/null
+++ b/net/ncm/Makefile
@@ -0,0 +1,80 @@
+#
+# Copyright (C) 2007-2013 OpenWrt.org
+# Copyright (C) 2010 Vertical Communications
+#
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=ncm
+PKG_VERSION:=1.0.1
+PKG_RELEASE:=1
+PKG_MAINTAINER:=Oskari Rauta <oskari.rauta at gmail com>
+PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)-$(PKG_RELEASE)
+
+include $(INCLUDE_DIR)/package.mk
+
+define Package/ncm
+  SECTION:=net
+  CATEGORY:=Network
+  TITLE:=Protocol support for NCM
+  DEPENDS:=+comgt +kmod-usb-net-cdc-ncm +kmod-usb-serial
+endef
+
+define Package/ncm/Description
+ This package contains protocol support for NCM.
+endef
+
+define Package/ncm-huawei-e3276
+  SECTION:=net
+  CATEGORY:=Network
+  TITLE:=Huawei E3276 support for NCM protocol
+  DEPENDS:=+comgt +kmod-usb-serial +kmod-usb-serial-option ncm
+endef
+
+define Package/ncm-huawei-e3276/Description
+ This package contains communication scripts for Huawei E3276
+endef
+
+define Build/Prepare
+       mkdir -p $(PKG_BUILD_DIR)
+endef
+
+define Build/Configure
+
+endef
+
+define Build/Compile/Default
+
+endef
+
+Build/Compile = $(Build/Compile/Default)
+
+define Package/ncm/install
+       $(INSTALL_DIR) $(1)/lib/ $(1)/lib/netifd/ $(1)/lib/netifd/proto/ 
$(1)/etc/ \
+               $(1)/etc/gcom/ $(1)/etc/gcom/ncm/ $(1)/etc/gcom/ncm/signal/ \
+               $(1)/etc/gcom/ncm/carrier/ $(1)/etc/gcom/ncm/setmode/ \
+               $(1)/etc/gcom/ncm/connect/ $(1)/etc/gcom/ncm/initscripts/
+
+       $(INSTALL_BIN) ./files/lib/netifd/ncm_dhcp.sh $(1)/lib/netifd/
+       $(INSTALL_BIN) ./files/lib/netifd/proto/ncm.sh $(1)/lib/netifd/proto/
+       $(INSTALL_DATA) ./files/etc/gcom/ncm/getcardinfo.gcom $(1)/etc/gcom/ncm/
+endef
+
+define Package/ncm-huawei-e3276/install
+       $(INSTALL_DIR) $(1)/etc/ $(1)/etc/gcom/ $(1)/etc/gcom/ncm/ \
+               $(1)/etc/gcom/ncm/signal/ $(1)/etc/gcom/ncm/carrier/ \
+               $(1)/etc/gcom/ncm/setmode/ $(1)/etc/gcom/ncm/connect/ \
+               $(1)/etc/gcom/ncm/initscripts/
+
+       $(INSTALL_DATA) ./files/etc/gcom/ncm/signal/huawei_e3276.gcom 
$(1)/etc/gcom/ncm/signal/
+       $(INSTALL_DATA) ./files/etc/gcom/ncm/carrier/huawei_e3276.gcom 
$(1)/etc/gcom/ncm/carrier/
+       $(INSTALL_DATA) ./files/etc/gcom/ncm/setmode/huawei_e3276.gcom 
$(1)/etc/gcom/ncm/setmode/
+       $(INSTALL_DATA) ./files/etc/gcom/ncm/connect/huawei_e3276.gcom 
$(1)/etc/gcom/ncm/connect/
+       $(INSTALL_DATA) ./files/etc/gcom/ncm/initscripts/huawei_e3276.gcom 
$(1)/etc/gcom/ncm/initscripts/
+endef
+
+$(eval $(call BuildPackage,ncm))
+$(eval $(call BuildPackage,ncm-huawei-e3276))
diff --git a/net/ncm/files/etc/gcom/ncm/carrier/huawei_e3276.gcom 
b/net/ncm/files/etc/gcom/ncm/carrier/huawei_e3276.gcom
new file mode 100644
index 0000000..58684fd
--- /dev/null
+++ b/net/ncm/files/etc/gcom/ncm/carrier/huawei_e3276.gcom
@@ -0,0 +1,56 @@
+opengt
+set com 115200n81
+set comecho off
+set senddelay 0.02
+waitquiet 0.2 0.2
+flash 0.1
+
+:getprovider
+ send "AT+COPS?^m"
+ let $r="+COPS:"
+ gosub readresult
+ system "echo \""+$x+"\" | awk -F\"[:,]\" '{print \"provider \\x27\" $4 
\"\\x27\"}'"
+
+:getmode
+ send "AT^^SYSCFGEX?^m"
+ let $r="^^SYSCFGEX:"
+ gosub readresult
+ system "echo \""+$x+"\" | awk -F\"[:,]\" '{ \\
+       if ( $2 == \"01\" ) print \"mode \\x27\" \"2G\\x27\"; \\
+       else if ( $2 == \"02\" ) print \"mode \\x27\" \"3G\\x27\"; \\
+       else if ( $2 == \"03\" ) print \"mode \\x27\" \"LTE\\x27\"; \\
+       else if ( $2 == \"0201\" ) print \"mode \\x27\" \"3G Preferred\\x27\"; 
\\
+       else if ( $2 == \"030201\" ) print \"mode \\x27\" \"LTE 
Preferred\\x27\"; \\
+       else if (( $2 == \"00\" ) or ( $2 == \"0\" )) print \"mode \\x27\" 
\"Automatic/Any\\x27\"; \\
+       else print \"mode \\x27\" \"Unknown\\x27\";}'"
+
+:getrate
+ send "AT+CGEQNEG=1^m"
+ let $r="+CGEQNEG:"
+ gosub readresult
+ system "echo \""+$x+"\" | awk -F\"[:,]\" '{ print \"downlink \\x27\" int($5) 
\"kbps\\x27\"; print \"uplink \\x27\" int($4) \"kbps\\x27\"; }'"
+ goto done
+
+:readresult
+ let i=5
+ let $x=""
+:loop
+ get 1 "^m" $s
+ let l=len($r)
+ if len($s) < l goto loop1
+ if $mid($s,1,l) <> $r goto loop1
+ let $x=$mid($s,1,len($s)-1)
+ return
+:loop1
+ if len($s) < 2 goto loop2
+ if $mid($s,1,2) = "ER" return
+ if $mid($s,1,2) = "CO" return
+:loop2
+ if i = 0 return
+ let i=i-1
+ sleep 0.25
+ goto loop
+
+:done
+ exit 0
+^@^@
diff --git a/net/ncm/files/etc/gcom/ncm/connect/huawei_e3276.gcom 
b/net/ncm/files/etc/gcom/ncm/connect/huawei_e3276.gcom
new file mode 100644
index 0000000..d7a604c
--- /dev/null
+++ b/net/ncm/files/etc/gcom/ncm/connect/huawei_e3276.gcom
@@ -0,0 +1,63 @@
+opengt
+set com 115200n81
+set comecho off
+set senddelay 0.05
+waitquiet 1 0.2
+
+:start
+ if $env("USE_DISCONNECT")="1" goto disconnect
+ send "AT^^NDISDUP=1,1,\""
+ send $env("USE_APN")
+
+ if $env("USE_AUTHTYPE")="-1" goto noauth
+ else goto auth
+
+:noauth
+ send "\"^m"
+ goto result
+
+:auth
+ send "\",\""
+ send $env("USE_USERID")
+ send "\",\""
+ send $env("USE_PASSWORD")
+ send "\","
+ send $env("USE_AUTHTYPE")
+ send "^m"
+ goto result
+
+:result
+ waitfor 5 "OK","ERR","ERROR"
+ if % = 0 goto connok
+ if % = 1 goto connerr
+ if % = 2 goto connerr
+
+:connok
+ print "WWAN connection established.\r\n"
+ goto done
+
+:connerr
+ print "WWAN error. Connection failed.\r\n"
+ exit 1
+
+:disconnect
+ send "AT^^NDISDUP=1,0,\""
+ send $env("USE_APN")
+ send "\"^m"
+
+ waitfor 5 "OK","ERR","ERROR"
+ if % = 0 goto disconnok
+ if % = 1 goto disconnerr
+ if % = 2 goto disconnerr
+
+:disconnok
+ print "WWAN connection disconnected.\r\n"
+ goto done
+
+:disconnerr
+ print "WWAN disconnection error.\r\n"
+ exit 1
+
+:done
+ exit 0
+^@^@
diff --git a/net/ncm/files/etc/gcom/ncm/getcardinfo.gcom 
b/net/ncm/files/etc/gcom/ncm/getcardinfo.gcom
new file mode 100644
index 0000000..79bea16
--- /dev/null
+++ b/net/ncm/files/etc/gcom/ncm/getcardinfo.gcom
@@ -0,0 +1,38 @@
+opengt
+ set com 115200n81
+ set comecho on
+ set senddelay 0.02
+ waitquiet 0.2 0.2
+ flash 0.1
+
+:start
+ let i=0
+
+:waitfordevice
+ waitquiet 2 0.5
+ inc i
+ send "AT^m"
+ waitfor 4 "OK","ERR","ERROR"
+ if % = 0 goto detect
+ if i < 5 goto waitfordevice
+ print "Error: Dongle not responding."
+ exit 1
+
+:detect
+ send "ATI^m"
+ waitfor 1 "ATI^m"
+ get 1 "OK" $s
+
+:output
+ system "echo \""+$s+"\" | grep \"Manufacturer:\" | awk '{print \"vendor 
\\x27\" $2 \"\\x27\"; }'"
+ system "echo \""+$s+"\" | grep \"Model:\" | awk '{print \"model \\x27\" $2 
\"\\x27\"; }'"
+ system "echo \""+$s+"\" | grep \"Revision:\" | awk '{print \"firmware \\x27\" 
$2 \"\\x27\"; }'"
+ system "echo \""+$s+"\" | grep \"IMEI:\" | awk '{print \"imei \\x27\" $2 
\"\\x27\"; }'"
+ system "echo \""+$s+"\" | egrep -i '^^Manufacturer|^^Model' | cut -d ' ' -f 2 
| tr -d '\r' | tr '\n' '_' | sed \"s/\\(.*\\)_$/\\'\\1\\'\\n/\" | awk '{ 
gsub(\"\\x27\", \"\"); \\
+       if ( $1 == \"huawei_E3276\" ) print \"driver \\x27huawei_e3276\\x27\"; 
\\
+       else print \"driver \\x27-\\x27\";}'"
+
+ goto continue
+
+:continue
+ exit 0
diff --git a/net/ncm/files/etc/gcom/ncm/initscripts/huawei_e3276.gcom 
b/net/ncm/files/etc/gcom/ncm/initscripts/huawei_e3276.gcom
new file mode 100644
index 0000000..7d60abd
--- /dev/null
+++ b/net/ncm/files/etc/gcom/ncm/initscripts/huawei_e3276.gcom
@@ -0,0 +1,31 @@
+opengt
+set com 115200n81
+set comecho off
+set senddelay 0.02
+waitquiet 0.2 0.2
+flash 0.1
+
+:start
+ send "AT^m"
+ waitfor 4 "OK","ERR","ERROR"
+ if % = 1 goto initerror
+ if % = 2 goto initerror
+
+ send "ATZ^m"
+ waitfor 4 "OK","ERR","ERROR"
+ if % = 1 goto initerror
+ if % = 2 goto initerror
+
+ send "ATQ V1 E1 S0=0^m"
+ waitfor 4 "OK","ERR","ERROR"
+ if % = 0 goto continue
+ if % = 1 goto initerror
+ if % = 2 goto initerror
+
+:modeerror
+ print "Error while initializing dongle.\n"
+ exit 1
+
+:continue
+ print "Dongle initialization complete.\n"
+ exit 0
diff --git a/net/ncm/files/etc/gcom/ncm/setmode/huawei_e3276.gcom 
b/net/ncm/files/etc/gcom/ncm/setmode/huawei_e3276.gcom
new file mode 100644
index 0000000..275cca4
--- /dev/null
+++ b/net/ncm/files/etc/gcom/ncm/setmode/huawei_e3276.gcom
@@ -0,0 +1,56 @@
+# set wwan mode from environment
+opengt
+ set com 115200n81
+ set senddelay 0.02
+ waitquiet 1 0.2
+ flash 0.1
+
+:start
+ if $env("MODE")="2g" goto 2g
+ if $env("MODE")="3g" goto 3g
+ if $env("MODE")="lte" goto lte
+ if $env("MODE")="prefer3g" goto prefer3g
+ if $env("MODE")="preferlte" goto preferlte
+ goto auto
+
+:auto
+ send "AT^^SYSCFGEX=\"00\",3FFFFFFF,2,4,7FFFFFFFFFFFFFFF,,^m"
+ goto result
+
+:2g
+ send "AT^^SYSCFGEX=\"01\",3FFFFFFF,2,4,7FFFFFFFFFFFFFFF,,^m"
+ goto result
+
+:3g
+ send "AT^^SYSCFGEX=\"02\",3FFFFFFF,2,4,7FFFFFFFFFFFFFFF,,^m"
+ goto result
+
+:lte
+ send "AT^^SYSCFGEX=\"03\",3FFFFFFF,2,4,7FFFFFFFFFFFFFFF,,^m"
+ goto result
+
+:prefer3g
+ send "AT^^SYSCFGEX=\"0201\",3FFFFFFF,2,4,7FFFFFFFFFFFFFFF,,^m"
+ goto result
+
+:preferlte
+ send "AT^^SYSCFGEX=\"030201\",3FFFFFFF,2,4,7FFFFFFFFFFFFFFF,,^m"
+ goto result
+
+:result
+ waitfor 8 "OK","ERR","ERROR"
+ if % = 0 goto continue
+ if % = 1 goto modeerror
+ if % = 2 goto modeerror
+ print "Timeout setting WWAN mode!\n"
+ exit 1
+
+:modeerror
+ print "Error setting WWAN mode!\n"
+ exit 1
+
+:continue
+ print "WWAN mode set to '"
+ print $env("MODE")
+ print "'\r\n"
+ exit 0
diff --git a/net/ncm/files/etc/gcom/ncm/signal/huawei_e3276.gcom 
b/net/ncm/files/etc/gcom/ncm/signal/huawei_e3276.gcom
new file mode 100644
index 0000000..a2ddb61
--- /dev/null
+++ b/net/ncm/files/etc/gcom/ncm/signal/huawei_e3276.gcom
@@ -0,0 +1,61 @@
+opengt
+set com 115200n81
+set comecho off
+set senddelay 0.02
+waitquiet 0.2 0.2
+flash 0.1
+
+:getcell
+ send "AT+CREG=2^m"
+ let $r="OK"
+ gosub readresult
+ if $r <> $x goto getnetwork
+
+ send "AT+CREG?^m"
+ let $r="+CREG:"
+ gosub readresult
+ system "echo \""+$x+"\" | awk -F\"[:,]\" '{print \"cellid \\x27\" \"0x\" $5 
\" (\" (\"0x\"$5)+0 \")\\x27\"; print \"lac \\x27\" \"0x\" $4 \" (\" 
(\"0x\"$4)+0 \")\\x27\";}'"
+
+:getnetwork
+ send "AT^^SYSINFOEX^m"
+ let $r="^^SYSINFOEX:"
+ gosub readresult
+ system "echo \""+$x+"\" | awk -F\"[:,]\" '{print \"network \\x27\" $8 \" / \" 
$10 \"\\x27\";}'"
+
+:getsignalstrength
+ send "AT+CSQ^m"
+ let $r="+CSQ:"
+ gosub readresult
+ system "echo \""+$x+"\" | awk -F\"[:,]\" '{ print \"signal \\x27\" int(($2 * 
100 / 31)+0.5) \"%\\x27\"; print \"rssi \\x27\" int(2 * $2 - 113) \"dBm\\x27\"; 
print \"csq \\x27\" int($2) \"\\x27\"; }'"
+
+:getnoicelevels
+ send "AT^^CSNR?^m"
+ let $r="^^CSNR:"
+ gosub readresult
+ system "echo \""+$x+"\" | awk -F\"[:,]\" '{ print \"rcsp \\x27\" int($2) 
\"dBm\\x27\"; print \"ecio \\x27\" int($3) \"dB\\x27\";}'"
+
+ goto done
+
+:readresult
+ let i=5
+ let $x=""
+:loop
+ get 1 "^m" $s
+ let l=len($r)
+ if len($s) < l goto loop1
+ if $mid($s,1,l) <> $r goto loop1
+ let $x=$mid($s,1,len($s)-1)
+ return
+:loop1
+ if len($s) < 2 goto loop2
+ if $mid($s,1,2) = "ER" return
+ if $mid($s,1,2) = "CO" return
+:loop2
+ if i = 0 return
+ let i=i-1
+ sleep 0.25
+ goto loop
+
+:done
+ exit 0
+^@^@
diff --git a/net/ncm/files/lib/netifd/ncm_dhcp.script 
b/net/ncm/files/lib/netifd/ncm_dhcp.script
new file mode 100755
index 0000000..7454436
--- /dev/null
+++ b/net/ncm/files/lib/netifd/ncm_dhcp.script
@@ -0,0 +1,85 @@
+#!/bin/sh
+[ -z "$1" ] && echo "Error: should be run by udhcpc" && exit 1
+
+. /lib/functions.sh
+. /lib/netifd/netifd-proto.sh
+
+set_classless_routes() {
+       local max=128
+       local type
+       while [ -n "$1" -a -n "$2" -a $max -gt 0 ]; do
+               proto_add_ipv4_route "${1%%/*}" "${1##*/}" "$2"
+               max=$(($max-1))
+               shift 2
+       done
+}
+
+setup_interface () {
+       proto_init_update "$interface" 1
+       proto_add_ipv4_address "$ip" "${subnet:-255.255.255.0}"
+       # TODO: apply $broadcast
+
+       for i in $router; do
+               proto_add_ipv4_route 0.0.0.0 0 "$i"
+       done
+
+       # CIDR STATIC ROUTES (rfc3442)
+       [ -n "$staticroutes" ] && set_classless_routes $staticroutes
+       [ -n "$msstaticroutes" ] && set_classless_routes $msstaticroutes
+
+       for dns in $dns; do
+               proto_add_dns_server "$dns"
+       done
+       for domain in $domain; do
+               proto_add_dns_search "$domain"
+       done
+       proto_send_update "$INTERFACE"
+
+       if [ -n "$IFACE6RD" -a -n "$ip6rd" ]; then
+               local v4mask="${ip6rd%% *}"
+               ip6rd="${ip6rd#* }"
+               local ip6rdprefixlen="${ip6rd%% *}"
+               ip6rd="${ip6rd#* }"
+               local ip6rdprefix="${ip6rd%% *}"
+               ip6rd="${ip6rd#* }"
+               local ip6rdbr="${ip6rd%% *}"
+
+               json_init
+               json_add_string name "$IFACE6RD"
+               json_add_string ifname "@$INTERFACE"
+               json_add_string proto "6rd"
+               json_add_string peeraddr "$ip6rdbr"
+               json_add_int ip4prefixlen "$v4mask"
+               json_add_string ip6prefix "$ip6rdprefix"
+               json_add_int ip6prefixlen "$ip6rdprefixlen"
+               json_add_string tunlink "$INTERFACE"
+               json_close_object
+
+               ubus call network add_dynamic "$(json_dump)"
+       fi
+
+       # TODO
+       # [ -n "$ntpsrv" ] &&   change_state network "$ifc" lease_ntpsrv 
"$ntpsrv"
+       # [ -n "$timesvr" ] &&  change_state network "$ifc" lease_timesrv 
"$timesvr"
+       # [ -n "$hostname" ] && change_state network "$ifc" lease_hostname 
"$hostname"
+       # [ -n "$timezone" ] &&         change_state network "$ifc" 
lease_timezone "$timezone"
+}
+
+deconfig_interface() {
+       proto_init_update "$interface" 0
+       proto_send_update "$INTERFACE"
+}
+
+case "$1" in
+       deconfig)
+               deconfig_interface
+       ;;
+       renew|bound)
+               setup_interface
+       ;;
+esac
+
+# user rules
+[ -f /etc/udhcpc.user ] && . /etc/udhcpc.user
+
+exit 0
diff --git a/net/ncm/files/lib/netifd/proto/ncm.sh 
b/net/ncm/files/lib/netifd/proto/ncm.sh
new file mode 100644
index 0000000..d27ab97
--- /dev/null
+++ b/net/ncm/files/lib/netifd/proto/ncm.sh
@@ -0,0 +1,144 @@
+#!/bin/sh
+
+. /lib/functions.sh
+. ../netifd-proto.sh
+init_proto "$@"
+
+proto_ncm_init_config() {
+       no_device=1
+       available=1
+       proto_config_add_string "device"
+       proto_config_add_string "mode"
+       proto_config_add_string "apn"
+       proto_config_add_string "pincode"
+       proto_config_add_string "authtype"
+       proto_config_add_string "delay"
+       proto_config_add_string "username"
+       proto_config_add_string "password"
+       proto_config_add_string "ipaddr"
+       proto_config_add_string "netmask"
+       proto_config_add_string "hostname"
+       proto_config_add_string "clientid"
+       proto_config_add_string "vendorid"
+       proto_config_add_boolean "broadcast"
+       proto_config_add_string "reqopts"
+       proto_config_add_string "iface6rd"
+       proto_config_add_string "sendopts"
+}
+
+proto_ncm_setup() {
+
+       local config="$1"
+       local iface="$JSON_ARRAY1_1"
+
+       local device mode apn pincode authtype delay username password
+       local ipaddr hostname clientid vendorid broadcast reqopts iface6rd 
sendopts
+       local cardinfo brand model driver
+       local dialupscript modescript initscript
+
+       json_get_vars device mode apn pincode delay authtype username password
+       json_get_vars ipaddr hostname clientid vendorid broadcast reqopts 
iface6rd sendopts
+
+       [ -e "$device" ] || {
+               proto_set_available "$interface" 0
+               return 1
+       }
+
+       cardinfo=$(gcom -d "$device" -s /etc/gcom/ncm/getcardinfo.gcom)
+       brand=$(echo "$cardinfo" | grep "vendor '" | awk '{ gsub("\x27", ""); 
print $2; }')
+       model=$(echo "$cardinfo" | grep "model '" | awk '{ gsub("\x27", ""); 
print $2; }')
+       driver=$(echo "$cardinfo" | grep "driver '" | awk '{ gsub("\x27", ""); 
print $2; }')    
+
+       [ "$driver" = "-" ] && {
+               logger Detected $brand $model. Device is not supported.
+               proto_notify_error "$interface" UNSUPPORTED_DEVICE
+               proto_block_restart "$interface"
+               return 1
+       }
+
+       initscript="/etc/gcom/ncm/initscripts/$driver.gcom"
+       modescript="/etc/gcom/ncm/setmode/$driver.gcom"
+       dialupscript="/etc/gcom/ncm/connect/$driver.gcom"
+
+       logger Detected $brand $model. Using driver $driver.
+
+       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
+
+       [ -e "$initscript" ] &&
+               gcom -d "$device" -s "$initscript"
+
+       [ "$authtype" = "pap" ] && authtype=1 || {
+               [ "$authtype" = "chap" ] && authtype=2 || {
+                       [ "$authtype" = "cleartext" ] && authtype=0 ||
+                               authtype=-1
+               }
+       }
+
+       [ -e "$modescript" ] &&
+               MODE="$mode" gcom -d "$device" -s "$modescript"
+
+       [ -e "$dialupscript" ] || {
+               logger Dial-up script for driver $driver is missing.
+               proto_notify_error "$interface" SCRIPT_MISSING
+               proto_block_restart "$interface"
+               return 1
+       }
+
+       USE_DISCONNECT="0" USE_APN="$apn" USE_AUTHTYPE="$authtype" 
USE_USERID="$username" USE_PASSWORD="$password" \
+               gcom -d "$device" -s "$dialupscript"
+
+       [ ! -z "${delay##*[!0-9]*}" ] && [ "$delay" != "0" ] && /bin/sleep 
$delay
+
+       local opt dhcpopts
+       for opt in $reqopts; do
+               append dhcpopts "-O $opt"
+       done
+
+       for opt in $sendopts; do
+               append dhcpopts "-x $opt"
+       done
+
+       [ "$broadcast" = 1 ] && broadcast="-B" || broadcast=
+       [ -n "$clientid" ] && clientid="-x 0x3d:${clientid//:/}" || 
clientid="-C"
+       [ -n "$iface6rd" ] && proto_export "IFACE6RD=$iface6rd"
+
+       proto_init_update "$iface" 1
+       proto_send_update "$config"
+
+       proto_export "INTERFACE=$config"
+       proto_run_command "$config" udhcpc \
+               -p /var/run/udhcpc-$iface.pid \
+               -s /lib/netifd/ncm_dhcp.script \
+               -f -t 0 -i "$iface" \
+               ${ipaddr:+-r $ipaddr} \
+               ${hostname:+-H $hostname} \
+               ${vendorid:+-V $vendorid} \
+               $clientid $broadcast $dhcpopts
+}
+
+proto_ncm_teardown() {
+       local interface="$1"
+       local device apn cardinfo driver dialupscript
+
+       json_get_vars device apn
+
+       cardinfo=$(gcom -d "$device" -s /etc/gcom/ncm/getcardinfo.gcom)
+       driver=$(echo "$cardinfo" | grep "driver '" | awk '{ gsub("\x27", ""); 
print $2; }')
+       dialupscript="/etc/gcom/ncm/connect/$driver.gcom"
+
+       [ "$driver" == "-" ] || 
+               [ -e "$device" ] && 
+                       [ -e "$dialupscript" ] && {
+                               USE_DISCONNECT="1" USE_APN="$apn" gcom -d 
"$device" -s "$dialupscript"
+                       }
+
+       proto_kill_command "$interface"
+}
+
+add_protocol ncm
-- 
1.9.0
_______________________________________________
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel

Reply via email to