> Shouldn't the patch be splitted because of different features?
> ( luci, non-luci stuff, hardware (huawai config))

Here is version 2 of patch, that patches against packages and does not have 
LuCI packages at all..

diff --git a/net/ncm/Makefile b/net/ncm/Makefile
new file mode 100644
index 0000000..e4c5a85
--- /dev/null
+++ b/net/ncm/Makefile
@@ -0,0 +1,94 @@
+#
+# 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
+PKG_RELEASE:=1
+PKG_MAINTAINER:=Oskari Rauta <oskari.ra...@gmail.com>
+PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)-$(PKG_RELEASE)
+
+include $(INCLUDE_DIR)/package.mk
+
+define Package/ncm/Default
+  VERSION:=$(PKG_VERSION)-$(PKG_RELEASE)
+  URL:=http://openwrt.org/
+  MAINTAINER:=Oskari Rauta <oskari.ra...@gmail.com>
+endef
+
+define Package/ncm
+$(call Package/ncm/Default)
+  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
+$(call Package/ncm/Default)
+  SECTION:=net
+  CATEGORY:=Network
+  TITLE:=Huawei E3276 support for NCM protocol
+  DEPENDS:=+ncm +comgt +kmod-usb-serial
+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
+       $(INSTALL_DIR) $(1)/lib/netifd
+       $(INSTALL_DIR) $(1)/lib/netifd/proto
+       $(INSTALL_DIR) $(1)/etc
+       $(INSTALL_DIR) $(1)/etc/gcom
+       $(INSTALL_DIR) $(1)/etc/gcom/ncm
+       $(INSTALL_DIR) $(1)/etc/gcom/ncm/signal
+       $(INSTALL_DIR) $(1)/etc/gcom/ncm/carrier
+       $(INSTALL_DIR) $(1)/etc/gcom/ncm/setmode
+       $(INSTALL_DIR) $(1)/etc/gcom/ncm/connect
+       $(INSTALL_DIR) $(1)/etc/gcom/ncm/initscripts
+       $(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
+       $(INSTALL_DIR) $(1)/etc/gcom
+       $(INSTALL_DIR) $(1)/etc/gcom/ncm
+       $(INSTALL_DIR) $(1)/etc/gcom/ncm/signal
+       $(INSTALL_DIR) $(1)/etc/gcom/ncm/carrier
+       $(INSTALL_DIR) $(1)/etc/gcom/ncm/setmode
+       $(INSTALL_DIR) $(1)/etc/gcom/ncm/connect
+       $(INSTALL_DIR) $(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/proto/ncm.sh 
b/net/ncm/files/lib/netifd/proto/ncm.sh
new file mode 100755
index 0000000..9d9f98d
--- /dev/null
+++ b/net/ncm/files/lib/netifd/proto/ncm.sh
@@ -0,0 +1,137 @@
+#!/bin/sh
+
+. /lib/functions.sh
+. ../netifd-proto.sh
+init_proto "$@"
+
+proto_ncm_init_config() {
+       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="$2"
+
+       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_export "INTERFACE=$config"
+       proto_run_command "$config" udhcpc \
+               -p /var/run/udhcpc-$iface.pid \
+               -s /lib/netifd/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
_______________________________________________
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel

Reply via email to