From 623716dd4318cd05022d5d1bb0875906ddfc12c2 Mon Sep 17 00:00:00 2001 From: John Crispin Date: Wed, 28 Jan 2015 19:19:33 +0000 Subject: [PATCH] comgt-ncm: Fix NCM protocol This patch fixes the NCM protocol by adding the missing ifname to the netifd script and changing one unintended "send" statement to "print" in runcommand.gcom. It also cleans up logging and makes the manufacturer names case-insensitive. Furthermore, comgt-ncm should not depend on the USB-serial-related kernel modules, as the cdc-wdm control device works without them. There is also no need to depend on kmod-huawei-cdc-ncm, since other manufacturers (like Sony-Ericsson and Samsung) which use other kernel modules should also be supported. I'd appreciate if someone with Samsung or Sony-Ericsson modems could test this, I was only able to test it with Huawei E3276, E3372 and E353. Signed-off-by: Matti Laakso SVN-Revision: 44182 --- package/network/utils/comgt/Makefile | 2 +- package/network/utils/comgt/files/ncm.json | 4 +- package/network/utils/comgt/files/ncm.sh | 82 ++++++++++++------- .../network/utils/comgt/files/runcommand.gcom | 9 +- 4 files changed, 61 insertions(+), 36 deletions(-) diff --git a/package/network/utils/comgt/Makefile b/package/network/utils/comgt/Makefile index 9ab2f14e8c..500365aaab 100644 --- a/package/network/utils/comgt/Makefile +++ b/package/network/utils/comgt/Makefile @@ -44,7 +44,7 @@ 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 + DEPENDS:=+comgt endef define Package/comgt/description diff --git a/package/network/utils/comgt/files/ncm.json b/package/network/utils/comgt/files/ncm.json index b9b15cdba0..ea4f98485f 100644 --- a/package/network/utils/comgt/files/ncm.json +++ b/package/network/utils/comgt/files/ncm.json @@ -19,7 +19,7 @@ "connect": "AT^NDISDUP=1,1,\\\"${apn}\\\"${username:+,\\\"$username\\\"}${password:+,\\\"$password\\\"}${auth:+,$auth}", "disconnect": "AT^NDISDUP=1,0" }, - "SAMSUNG": { + "samsung": { "initialize": [ "AT", "AT+CGREG=2", @@ -33,7 +33,7 @@ "connect": "AT+CGATT=1", "disconnect": "AT+CGATT=0" }, - "Sony": { + "sony": { "initialize": [ "AT+CFUN=1", "AT+CGDCONT=1,\\\"IP\\\",\\\"${apn}\\\"", diff --git a/package/network/utils/comgt/files/ncm.sh b/package/network/utils/comgt/files/ncm.sh index 14e421fcad..2c2835fe39 100644 --- a/package/network/utils/comgt/files/ncm.sh +++ b/package/network/utils/comgt/files/ncm.sh @@ -1,8 +1,10 @@ #!/bin/sh -. /lib/functions.sh -. ../netifd-proto.sh -init_proto "$@" +[ -n "$INCLUDE_ONLY" ] || { + . /lib/functions.sh + . ../netifd-proto.sh + init_proto "$@" +} proto_ncm_init_config() { no_device=1 @@ -20,34 +22,52 @@ proto_ncm_init_config() { proto_ncm_setup() { local interface="$1" - local manufacturer initialize setmode connect + local manufacturer initialize setmode connect ifname devname devpath 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" + echo "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" + echo "Control device not valid" proto_set_available "$interface" 0 return 1 } [ -n "$apn" ] || { - echo "ncm[$$]" "No APN specified" + echo "No APN specified" proto_notify_error "$interface" NO_APN proto_set_available "$interface" 0 return 1 } + devname="$(basename "$device")" + case "$devname" in + 'tty'*) + devpath="$(readlink -f /sys/class/tty/$devname/device)" + ifname="$( ls "$devpath"/../../*/net )" + ;; + *) + devpath="$(readlink -f /sys/class/usbmisc/$devname/device/)" + ifname="$( ls "$devpath"/net )" + ;; + esac + [ -n "$ifname" ] || { + echo "The interface could not be found." + proto_notify_error "$interface" NO_IFACE + proto_set_available "$interface" 0 + return 1 + } + [ -n "$delay" ] && sleep "$delay" - manufacturer=`gcom -d "$device" -s /etc/gcom/getcardinfo.gcom | awk '/Manufacturer/ { print $2 }'` + manufacturer=`gcom -d "$device" -s /etc/gcom/getcardinfo.gcom | awk '/Manufacturer/ { print tolower($2) }'` [ $? -ne 0 ] && { - echo "ncm[$$]" "Failed to get modem information" + echo "Failed to get modem information" proto_notify_error "$interface" GETINFO_FAILED proto_set_available "$interface" 0 return 1 @@ -56,7 +76,7 @@ proto_ncm_setup() { json_load "$(cat /etc/gcom/ncm.json)" json_select "$manufacturer" [ $? -ne 0 ] && { - echo "ncm[$$]" "Unsupported modem" + echo "Unsupported modem" proto_notify_error "$interface" UNSUPPORTED_MODEM proto_set_available "$interface" 0 return 1 @@ -64,7 +84,7 @@ proto_ncm_setup() { 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" + echo "Failed to initialize modem" proto_notify_error "$interface" INITIALIZE_FAILED proto_set_available "$interface" 0 return 1 @@ -73,7 +93,7 @@ proto_ncm_setup() { [ -n "$pincode" ] && { PINCODE="$pincode" gcom -d "$device" -s /etc/gcom/setpin.gcom || { - echo "ncm[$$]" "Unable to verify PIN" + echo "Unable to verify PIN" proto_notify_error "$interface" PIN_FAILED proto_block_restart "$interface" return 1 @@ -83,7 +103,7 @@ proto_ncm_setup() { 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" + echo "Failed to set operating mode" proto_notify_error "$interface" SETMODE_FAILED proto_set_available "$interface" 0 return 1 @@ -91,66 +111,66 @@ proto_ncm_setup() { json_select .. } - json_get_var connect connect + json_get_vars connect eval COMMAND="$connect" gcom -d "$device" -s /etc/gcom/runcommand.gcom || { - echo "ncm[$$]" "Failed to connect" + echo "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 + echo "Connected, starting DHCP" + + proto_init_update "$ifname" 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 + local device json_get_vars device - echo "ncm[$$]" "Stopping network" + echo "Stopping network" - manufacturer=`gcom -d "$device" -s /etc/gcom/getcardinfo.gcom | awk '/Manufacturer/ { print $2 }'` + manufacturer=`gcom -d "$device" -s /etc/gcom/getcardinfo.gcom | awk '/Manufacturer/ { print tolower($2) }'` [ $? -ne 0 ] && { - echo "ncm[$$]" "Failed to get modem information" + echo "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" + echo "Unsupported modem" proto_notify_error "$interface" UNSUPPORTED_MODEM return 1 } - json_get_var disconnect disconnect + json_get_vars disconnect COMMAND="$disconnect" gcom -d "$device" -s /etc/gcom/runcommand.gcom || { - echo "ncm[$$]" "Failed to disconnect" + echo "Failed to disconnect" proto_notify_error "$interface" DISCONNECT_FAILED return 1 } -} -add_protocol ncm + proto_init_update "*" 0 + proto_send_update "$interface" +} +[ -n "$INCLUDE_ONLY" ] || { + add_protocol ncm +} diff --git a/package/network/utils/comgt/files/runcommand.gcom b/package/network/utils/comgt/files/runcommand.gcom index ab24339dc9..e99b6f922a 100644 --- a/package/network/utils/comgt/files/runcommand.gcom +++ b/package/network/utils/comgt/files/runcommand.gcom @@ -6,14 +6,15 @@ opengt flash 0.1 :start - send "sending -> " + print "sending -> ",$env("COMMAND"),"\n" send $env("COMMAND") send "^m" - waitfor 15 "OK","ERR","ERROR" + waitfor 15 "OK","ERR","ERROR","COMMAND NOT SUPPORT" if % = 0 goto continue if % = 1 goto error if % = 2 goto error + if % = 3 goto notsupported print "Timeout running AT-command\n" exit 1 @@ -22,5 +23,9 @@ opengt print "Error running AT-command\n" exit 1 +:notsupported + print "AT-command not supported\n" + exit 1 + :continue exit 0