comgt-ncm: Fix NCM protocol
authorJohn Crispin <john@openwrt.org>
Wed, 28 Jan 2015 19:19:33 +0000 (19:19 +0000)
committerJohn Crispin <john@openwrt.org>
Wed, 28 Jan 2015 19:19:33 +0000 (19:19 +0000)
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 <malaakso@elisanet.fi>
SVN-Revision: 44182

package/network/utils/comgt/Makefile
package/network/utils/comgt/files/ncm.json
package/network/utils/comgt/files/ncm.sh
package/network/utils/comgt/files/runcommand.gcom

index 9ab2f14e8caf74551ef2e55c31497251e8517c6f..500365aaabdc62c5b71aae433a2f96a011c46b48 100644 (file)
@@ -44,7 +44,7 @@ endef
 define Package/comgt-ncm
 $(call Package/comgt/Default)
   TITLE+=NCM 3G/4G Support
 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
 endef
 
 define Package/comgt/description
index b9b15cdba05760d0ba118f63d5f583900743858d..ea4f98485f72782eca0fe2672dfc16531915c69e 100644 (file)
@@ -19,7 +19,7 @@
                "connect": "AT^NDISDUP=1,1,\\\"${apn}\\\"${username:+,\\\"$username\\\"}${password:+,\\\"$password\\\"}${auth:+,$auth}",
                "disconnect": "AT^NDISDUP=1,0"
        },
                "connect": "AT^NDISDUP=1,1,\\\"${apn}\\\"${username:+,\\\"$username\\\"}${password:+,\\\"$password\\\"}${auth:+,$auth}",
                "disconnect": "AT^NDISDUP=1,0"
        },
-       "SAMSUNG": {
+       "samsung": {
                "initialize": [
                        "AT",
                        "AT+CGREG=2",
                "initialize": [
                        "AT",
                        "AT+CGREG=2",
@@ -33,7 +33,7 @@
                "connect": "AT+CGATT=1",
                "disconnect": "AT+CGATT=0"
        },
                "connect": "AT+CGATT=1",
                "disconnect": "AT+CGATT=0"
        },
-       "Sony": {
+       "sony": {
                "initialize": [
                        "AT+CFUN=1",
                        "AT+CGDCONT=1,\\\"IP\\\",\\\"${apn}\\\"",
                "initialize": [
                        "AT+CFUN=1",
                        "AT+CGDCONT=1,\\\"IP\\\",\\\"${apn}\\\"",
index 14e421fcadd81036c4dd25dcd6a1f85824f2ba0d..2c2835fe3947485ed48254047bf970797898a822 100644 (file)
@@ -1,8 +1,10 @@
 #!/bin/sh
 
 #!/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
 
 proto_ncm_init_config() {
        no_device=1
@@ -20,34 +22,52 @@ proto_ncm_init_config() {
 proto_ncm_setup() {
        local interface="$1"
 
 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" ] || {
 
        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" ] || {
                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" ] || {
                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
        }
 
                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"
 
        [ -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 ] && {
        [ $? -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
                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 ] && {
        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
                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 || {
        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
                        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 || {
 
        [ -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
                        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 || {
                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
                        proto_notify_error "$interface" SETMODE_FAILED
                        proto_set_available "$interface" 0
                        return 1
@@ -91,66 +111,66 @@ proto_ncm_setup() {
                json_select ..
        }
 
                json_select ..
        }
 
-       json_get_var connect connect
+       json_get_vars connect
        eval COMMAND="$connect" gcom -d "$device" -s /etc/gcom/runcommand.gcom || {
        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
        }
 
                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"
        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"
        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"
 
        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 manufacturer disconnect
 
-       local device 
+       local device
        json_get_vars 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 ] && {
        [ $? -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" || {
                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
        }
 
                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 || {
        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
        }
                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
+}
index ab24339dc95a7a13e03a9f323938c0375d259ab7..e99b6f922a418241b6723d257355757157e2b775 100644 (file)
@@ -6,14 +6,15 @@ opengt
  flash 0.1
 
 :start
  flash 0.1
 
 :start
send "sending -> "
print "sending -> ",$env("COMMAND"),"\n"
  send $env("COMMAND")
  send "^m"
 
  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 % = 0 goto continue
  if % = 1 goto error
  if % = 2 goto error
+ if % = 3 goto notsupported
 
  print "Timeout running AT-command\n"
  exit 1
 
  print "Timeout running AT-command\n"
  exit 1
@@ -22,5 +23,9 @@ opengt
  print "Error running AT-command\n"
  exit 1
 
  print "Error running AT-command\n"
  exit 1
 
+:notsupported
+ print "AT-command not supported\n"
+ exit 1
+
 :continue
  exit 0
 :continue
  exit 0