[OpenWrt-Devel] [PATCH] comgt: add ncm proto support

John Crispin blogic at openwrt.org
Tue Oct 7 23:17:44 EDT 2014


From: Matti Laakso <malaakso at elisanet.fi>

Signed-off-by: Matti Laakso <malaakso at elisanet.fi>
---
 package/network/utils/comgt/Makefile              |   15 ++
 package/network/utils/comgt/files/3g.usb          |    2 +-
 package/network/utils/comgt/files/ncm.json        |   49 +++++++
 package/network/utils/comgt/files/ncm.sh          |  156 +++++++++++++++++++++
 package/network/utils/comgt/files/runcommand.gcom |   26 ++++
 5 files changed, 247 insertions(+), 1 deletion(-)
 create mode 100644 package/network/utils/comgt/files/ncm.json
 create mode 100644 package/network/utils/comgt/files/ncm.sh
 create mode 100644 package/network/utils/comgt/files/runcommand.gcom

diff --git a/package/network/utils/comgt/Makefile b/package/network/utils/comgt/Makefile
index 11a1a49..5fccd94 100644
--- a/package/network/utils/comgt/Makefile
+++ b/package/network/utils/comgt/Makefile
@@ -40,6 +40,12 @@ $(call Package/comgt/Default)
   DEPENDS:=+comgt +kmod-usb-serial +kmod-usb-serial-sierrawireless +kmod-usb-net +kmod-usb-net-sierrawireless
 endef
 
+define Package/comgt-ncm
+$(call Package/comgt/Default)
+  TITLE+=NCM 3G/4G Support
+  DEPENDS:=+comgt +kmod-usb-serial +kmod-usb-serial-option +kmod-usb-net +kmod-usb-net-cdc-ncm +kmod-usb-net-huawei-cdc-ncm
+endef
+
 define Package/comgt/description
  comgt is a scripting language interpreter useful for establishing 
  communications on serial lines and through PCMCIA modems as well as GPRS 
@@ -86,5 +92,14 @@ define Package/comgt-directip/install
 	$(INSTALL_BIN) ./files/directip.sh $(1)/lib/netifd/proto/directip.sh
 endef
 
+define Package/comgt-ncm/install
+	$(INSTALL_DIR) $(1)/etc/gcom
+	$(INSTALL_DATA) ./files/ncm.json $(1)/etc/gcom/ncm.json
+	$(INSTALL_DATA) ./files/runcommand.gcom $(1)/etc/gcom/runcommand.gcom
+	$(INSTALL_DIR) $(1)/lib/netifd/proto
+	$(INSTALL_BIN) ./files/ncm.sh $(1)/lib/netifd/proto/ncm.sh
+endef
+
 $(eval $(call BuildPackage,comgt))
 $(eval $(call BuildPackage,comgt-directip))
+$(eval $(call BuildPackage,comgt-ncm))
diff --git a/package/network/utils/comgt/files/3g.usb b/package/network/utils/comgt/files/3g.usb
index fd6837e..ac8326b 100644
--- a/package/network/utils/comgt/files/3g.usb
+++ b/package/network/utils/comgt/files/3g.usb
@@ -8,7 +8,7 @@ find_3g_iface() {
 
 	local proto
 	config_get proto "$cfg" proto
-	[ "$proto" = 3g ] || return 0
+	[ "$proto" = 3g ] || [ "$proto" = ncm ] || return 0
 
 	# bypass state vars here because 00-netstate could clobber .device
 	local dev=$(uci_get network "$cfg" device)
diff --git a/package/network/utils/comgt/files/ncm.json b/package/network/utils/comgt/files/ncm.json
new file mode 100644
index 0000000..b9b15cd
--- /dev/null
+++ b/package/network/utils/comgt/files/ncm.json
@@ -0,0 +1,49 @@
+{
+	"huawei": {
+		"initialize": [
+			"AT",
+			"ATZ",
+			"ATQ0",
+			"ATV1",
+			"ATE1",
+			"ATS0=0"
+		],
+		"modes": {
+			"preferlte": "AT^SYSCFGEX=\\\"030201\\\",3fffffff,2,4,7fffffffffffffff,,",
+			"preferumts": "AT^SYSCFGEX=\\\"0201\\\",3fffffff,2,4,7fffffffffffffff,,",
+			"lte": "AT^SYSCFGEX=\\\"03\\\",3fffffff,2,4,7fffffffffffffff,,",
+			"umts": "AT^SYSCFGEX=\\\"02\\\",3fffffff,2,4,7fffffffffffffff,,",
+			"gsm": "AT^SYSCFGEX=\\\"01\\\",3fffffff,2,4,7fffffffffffffff,,",
+			"auto": "AT^SYSCFGEX=\\\"00\\\",3fffffff,2,4,7fffffffffffffff,,"
+		},
+		"connect": "AT^NDISDUP=1,1,\\\"${apn}\\\"${username:+,\\\"$username\\\"}${password:+,\\\"$password\\\"}${auth:+,$auth}",
+		"disconnect": "AT^NDISDUP=1,0"
+	},
+	"SAMSUNG": {
+		"initialize": [
+			"AT",
+			"AT+CGREG=2",
+			"AT+CFUN=5",
+			"AT+MODESELECT=3",
+			"AT+CGDCONT=1,\\\"IP\\\",\\\"${apn}\\\""
+		],
+		"modes": {
+			"umts": "AT+CHANGEALLPATH=1"
+		},
+		"connect": "AT+CGATT=1",
+		"disconnect": "AT+CGATT=0"
+	},
+	"Sony": {
+		"initialize": [
+			"AT+CFUN=1",
+			"AT+CGDCONT=1,\\\"IP\\\",\\\"${apn}\\\"",
+			"AT*EIAAUW=1,1,\\\"${username}\\\",\\\"${password}\\\",${auth:-00111}"
+		],
+		"modes": {
+			"umts": "AT+CFUN=6",
+			"gsm": "AT+CFUN=5"
+		},
+		"connect": "AT*ENAP=1,1",
+		"disconnect": "AT*ENAP=0"
+	}
+}
diff --git a/package/network/utils/comgt/files/ncm.sh b/package/network/utils/comgt/files/ncm.sh
new file mode 100644
index 0000000..14e421f
--- /dev/null
+++ b/package/network/utils/comgt/files/ncm.sh
@@ -0,0 +1,156 @@
+#!/bin/sh
+
+. /lib/functions.sh
+. ../netifd-proto.sh
+init_proto "$@"
+
+proto_ncm_init_config() {
+	no_device=1
+	available=1
+	proto_config_add_string "device:device"
+	proto_config_add_string apn
+	proto_config_add_string auth
+	proto_config_add_string username
+	proto_config_add_string password
+	proto_config_add_string pincode
+	proto_config_add_string delay
+	proto_config_add_string mode
+}
+
+proto_ncm_setup() {
+	local interface="$1"
+
+	local manufacturer initialize setmode connect
+
+	local device apn auth username password pincode delay mode
+	json_get_vars device apn auth username password pincode delay mode
+
+	[ -n "$device" ] || {
+		echo "ncm[$$]" "No control device specified"
+		proto_notify_error "$interface" NO_DEVICE
+		proto_set_available "$interface" 0
+		return 1
+	}
+	[ -e "$device" ] || {
+		echo "ncm[$$]" "Control device not valid"
+		proto_set_available "$interface" 0
+		return 1
+	}
+	[ -n "$apn" ] || {
+		echo "ncm[$$]" "No APN specified"
+		proto_notify_error "$interface" NO_APN
+		proto_set_available "$interface" 0
+		return 1
+	}
+
+	[ -n "$delay" ] && sleep "$delay"
+
+	manufacturer=`gcom -d "$device" -s /etc/gcom/getcardinfo.gcom | awk '/Manufacturer/ { print $2 }'`
+	[ $? -ne 0 ] && {
+		echo "ncm[$$]" "Failed to get modem information"
+		proto_notify_error "$interface" GETINFO_FAILED
+		proto_set_available "$interface" 0
+		return 1
+	}
+
+	json_load "$(cat /etc/gcom/ncm.json)"
+	json_select "$manufacturer"
+	[ $? -ne 0 ] && {
+		echo "ncm[$$]" "Unsupported modem"
+		proto_notify_error "$interface" UNSUPPORTED_MODEM
+		proto_set_available "$interface" 0
+		return 1
+	}
+	json_get_values initialize initialize
+	for i in $initialize; do
+		eval COMMAND="$i" gcom -d "$device" -s /etc/gcom/runcommand.gcom || {
+			echo "ncm[$$]" "Failed to initialize modem"
+			proto_notify_error "$interface" INITIALIZE_FAILED
+			proto_set_available "$interface" 0
+			return 1
+		}
+	done
+
+	[ -n "$pincode" ] && {
+		PINCODE="$pincode" gcom -d "$device" -s /etc/gcom/setpin.gcom || {
+			echo "ncm[$$]" "Unable to verify PIN"
+			proto_notify_error "$interface" PIN_FAILED
+			proto_block_restart "$interface"
+			return 1
+		}
+	}
+	[ -n "$mode" ] && {
+		json_select modes
+		json_get_var setmode "$mode"
+		COMMAND="$setmode" gcom -d "$device" -s /etc/gcom/runcommand.gcom || {
+			echo "ncm[$$]" "Failed to set operating mode"
+			proto_notify_error "$interface" SETMODE_FAILED
+			proto_set_available "$interface" 0
+			return 1
+		}
+		json_select ..
+	}
+
+	json_get_var connect connect
+	eval COMMAND="$connect" gcom -d "$device" -s /etc/gcom/runcommand.gcom || {
+		echo "ncm[$$]" "Failed to connect"
+		proto_notify_error "$interface" CONNECT_FAILED
+		proto_set_available "$interface" 0
+		return 1
+	}
+
+	echo "ncm[$$]" "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"
+	json_close_object
+	ubus call network add_dynamic "$(json_dump)"
+
+	json_init
+	json_add_string name "${interface}_dhcpv6"
+	json_add_string ifname "@$interface"
+	json_add_string proto "dhcpv6"
+	json_close_object
+	ubus call network add_dynamic "$(json_dump)"
+}
+
+proto_ncm_teardown() {
+	local interface="$1"
+
+	proto_init_update "*" 0
+	proto_send_update "$interface"
+
+	local manufacturer disconnect
+
+	local device 
+	json_get_vars device
+
+	echo "ncm[$$]" "Stopping network"
+
+	manufacturer=`gcom -d "$device" -s /etc/gcom/getcardinfo.gcom | awk '/Manufacturer/ { print $2 }'`
+	[ $? -ne 0 ] && {
+		echo "ncm[$$]" "Failed to get modem information"
+		proto_notify_error "$interface" GETINFO_FAILED
+		return 1
+	}
+
+	json_load "$(cat /etc/gcom/ncm.json)"
+	json_select "$manufacturer" || {
+		echo "ncm[$$]" "Unsupported modem"
+		proto_notify_error "$interface" UNSUPPORTED_MODEM
+		return 1
+	}
+
+	json_get_var disconnect disconnect
+	COMMAND="$disconnect" gcom -d "$device" -s /etc/gcom/runcommand.gcom || {
+		echo "ncm[$$]" "Failed to disconnect"
+		proto_notify_error "$interface" DISCONNECT_FAILED
+		return 1
+	}
+}
+
+add_protocol ncm
diff --git a/package/network/utils/comgt/files/runcommand.gcom b/package/network/utils/comgt/files/runcommand.gcom
new file mode 100644
index 0000000..6ba061f
--- /dev/null
+++ b/package/network/utils/comgt/files/runcommand.gcom
@@ -0,0 +1,26 @@
+# run AT-command from environment
+opengt
+ set com 115200n81
+ set senddelay 0.02
+ waitquiet 1 0.2
+ flash 0.1
+
+:start
+ send "sending -> "
+ send $env("COMMAND")
+ send "^n"
+
+ waitfor 15 "OK","ERR","ERROR"
+ if % = 0 goto continue
+ if % = 1 goto error
+ if % = 2 goto error
+
+ print "Timeout running AT-command\n"
+ exit 1
+
+:error
+ print "Error running AT-command\n"
+ exit 1
+
+:continue
+ exit 0
-- 
1.7.10.4
_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel



More information about the openwrt-devel mailing list