mirror of https://github.com/hak5/openwrt.git
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 <malaakso@elisanet.fi> SVN-Revision: 44182lede-17.01
parent
e25e6df2cf
commit
623716dd43
|
@ -44,7 +44,7 @@ endef
|
||||||
define Package/comgt-ncm
|
define Package/comgt-ncm
|
||||||
$(call Package/comgt/Default)
|
$(call Package/comgt/Default)
|
||||||
TITLE+=NCM 3G/4G Support
|
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
|
endef
|
||||||
|
|
||||||
define Package/comgt/description
|
define Package/comgt/description
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
"connect": "AT^NDISDUP=1,1,\\\"${apn}\\\"${username:+,\\\"$username\\\"}${password:+,\\\"$password\\\"}${auth:+,$auth}",
|
"connect": "AT^NDISDUP=1,1,\\\"${apn}\\\"${username:+,\\\"$username\\\"}${password:+,\\\"$password\\\"}${auth:+,$auth}",
|
||||||
"disconnect": "AT^NDISDUP=1,0"
|
"disconnect": "AT^NDISDUP=1,0"
|
||||||
},
|
},
|
||||||
"SAMSUNG": {
|
"samsung": {
|
||||||
"initialize": [
|
"initialize": [
|
||||||
"AT",
|
"AT",
|
||||||
"AT+CGREG=2",
|
"AT+CGREG=2",
|
||||||
|
@ -33,7 +33,7 @@
|
||||||
"connect": "AT+CGATT=1",
|
"connect": "AT+CGATT=1",
|
||||||
"disconnect": "AT+CGATT=0"
|
"disconnect": "AT+CGATT=0"
|
||||||
},
|
},
|
||||||
"Sony": {
|
"sony": {
|
||||||
"initialize": [
|
"initialize": [
|
||||||
"AT+CFUN=1",
|
"AT+CFUN=1",
|
||||||
"AT+CGDCONT=1,\\\"IP\\\",\\\"${apn}\\\"",
|
"AT+CGDCONT=1,\\\"IP\\\",\\\"${apn}\\\"",
|
||||||
|
|
|
@ -1,8 +1,10 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
. /lib/functions.sh
|
[ -n "$INCLUDE_ONLY" ] || {
|
||||||
. ../netifd-proto.sh
|
. /lib/functions.sh
|
||||||
init_proto "$@"
|
. ../netifd-proto.sh
|
||||||
|
init_proto "$@"
|
||||||
|
}
|
||||||
|
|
||||||
proto_ncm_init_config() {
|
proto_ncm_init_config() {
|
||||||
no_device=1
|
no_device=1
|
||||||
|
@ -20,34 +22,52 @@ proto_ncm_init_config() {
|
||||||
proto_ncm_setup() {
|
proto_ncm_setup() {
|
||||||
local interface="$1"
|
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
|
local device apn auth username password pincode delay mode
|
||||||
json_get_vars device apn auth username password pincode delay mode
|
json_get_vars device apn auth username password pincode delay mode
|
||||||
|
|
||||||
[ -n "$device" ] || {
|
[ -n "$device" ] || {
|
||||||
echo "ncm[$$]" "No control device specified"
|
echo "No control device specified"
|
||||||
proto_notify_error "$interface" NO_DEVICE
|
proto_notify_error "$interface" NO_DEVICE
|
||||||
proto_set_available "$interface" 0
|
proto_set_available "$interface" 0
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
[ -e "$device" ] || {
|
[ -e "$device" ] || {
|
||||||
echo "ncm[$$]" "Control device not valid"
|
echo "Control device not valid"
|
||||||
proto_set_available "$interface" 0
|
proto_set_available "$interface" 0
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
[ -n "$apn" ] || {
|
[ -n "$apn" ] || {
|
||||||
echo "ncm[$$]" "No APN specified"
|
echo "No APN specified"
|
||||||
proto_notify_error "$interface" NO_APN
|
proto_notify_error "$interface" NO_APN
|
||||||
proto_set_available "$interface" 0
|
proto_set_available "$interface" 0
|
||||||
return 1
|
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_notify_error "$interface" GETINFO_FAILED
|
||||||
proto_set_available "$interface" 0
|
proto_set_available "$interface" 0
|
||||||
return 1
|
return 1
|
||||||
|
@ -56,7 +76,7 @@ proto_ncm_setup() {
|
||||||
json_load "$(cat /etc/gcom/ncm.json)"
|
json_load "$(cat /etc/gcom/ncm.json)"
|
||||||
json_select "$manufacturer"
|
json_select "$manufacturer"
|
||||||
[ $? -ne 0 ] && {
|
[ $? -ne 0 ] && {
|
||||||
echo "ncm[$$]" "Unsupported modem"
|
echo "Unsupported modem"
|
||||||
proto_notify_error "$interface" UNSUPPORTED_MODEM
|
proto_notify_error "$interface" UNSUPPORTED_MODEM
|
||||||
proto_set_available "$interface" 0
|
proto_set_available "$interface" 0
|
||||||
return 1
|
return 1
|
||||||
|
@ -64,7 +84,7 @@ proto_ncm_setup() {
|
||||||
json_get_values initialize initialize
|
json_get_values initialize initialize
|
||||||
for i in $initialize; do
|
for i in $initialize; do
|
||||||
eval COMMAND="$i" gcom -d "$device" -s /etc/gcom/runcommand.gcom || {
|
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_notify_error "$interface" INITIALIZE_FAILED
|
||||||
proto_set_available "$interface" 0
|
proto_set_available "$interface" 0
|
||||||
return 1
|
return 1
|
||||||
|
@ -73,7 +93,7 @@ proto_ncm_setup() {
|
||||||
|
|
||||||
[ -n "$pincode" ] && {
|
[ -n "$pincode" ] && {
|
||||||
PINCODE="$pincode" gcom -d "$device" -s /etc/gcom/setpin.gcom || {
|
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_notify_error "$interface" PIN_FAILED
|
||||||
proto_block_restart "$interface"
|
proto_block_restart "$interface"
|
||||||
return 1
|
return 1
|
||||||
|
@ -83,7 +103,7 @@ proto_ncm_setup() {
|
||||||
json_select modes
|
json_select modes
|
||||||
json_get_var setmode "$mode"
|
json_get_var setmode "$mode"
|
||||||
COMMAND="$setmode" gcom -d "$device" -s /etc/gcom/runcommand.gcom || {
|
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_notify_error "$interface" SETMODE_FAILED
|
||||||
proto_set_available "$interface" 0
|
proto_set_available "$interface" 0
|
||||||
return 1
|
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_notify_error "$interface" CONNECT_FAILED
|
||||||
proto_set_available "$interface" 0
|
proto_set_available "$interface" 0
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
echo "ncm[$$]" "Connected, starting DHCP"
|
echo "Connected, starting DHCP"
|
||||||
proto_init_update "*" 1
|
|
||||||
|
proto_init_update "$ifname" 1
|
||||||
proto_send_update "$interface"
|
proto_send_update "$interface"
|
||||||
|
|
||||||
json_init
|
json_init
|
||||||
json_add_string name "${interface}_dhcp"
|
json_add_string name "${interface}_dhcp"
|
||||||
json_add_string ifname "@$interface"
|
json_add_string ifname "@$interface"
|
||||||
json_add_string proto "dhcp"
|
json_add_string proto "dhcp"
|
||||||
json_close_object
|
|
||||||
ubus call network add_dynamic "$(json_dump)"
|
ubus call network add_dynamic "$(json_dump)"
|
||||||
|
|
||||||
json_init
|
json_init
|
||||||
json_add_string name "${interface}_dhcpv6"
|
json_add_string name "${interface}_dhcpv6"
|
||||||
json_add_string ifname "@$interface"
|
json_add_string ifname "@$interface"
|
||||||
json_add_string proto "dhcpv6"
|
json_add_string proto "dhcpv6"
|
||||||
json_close_object
|
|
||||||
ubus call network add_dynamic "$(json_dump)"
|
ubus call network add_dynamic "$(json_dump)"
|
||||||
}
|
}
|
||||||
|
|
||||||
proto_ncm_teardown() {
|
proto_ncm_teardown() {
|
||||||
local interface="$1"
|
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
|
proto_notify_error "$interface" GETINFO_FAILED
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
json_load "$(cat /etc/gcom/ncm.json)"
|
json_load "$(cat /etc/gcom/ncm.json)"
|
||||||
json_select "$manufacturer" || {
|
json_select "$manufacturer" || {
|
||||||
echo "ncm[$$]" "Unsupported modem"
|
echo "Unsupported modem"
|
||||||
proto_notify_error "$interface" UNSUPPORTED_MODEM
|
proto_notify_error "$interface" UNSUPPORTED_MODEM
|
||||||
return 1
|
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
|
proto_notify_error "$interface" DISCONNECT_FAILED
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
add_protocol ncm
|
proto_init_update "*" 0
|
||||||
|
proto_send_update "$interface"
|
||||||
|
}
|
||||||
|
[ -n "$INCLUDE_ONLY" ] || {
|
||||||
|
add_protocol ncm
|
||||||
|
}
|
||||||
|
|
|
@ -6,14 +6,15 @@ opengt
|
||||||
flash 0.1
|
flash 0.1
|
||||||
|
|
||||||
:start
|
:start
|
||||||
send "sending -> "
|
print "sending -> ",$env("COMMAND"),"\n"
|
||||||
send $env("COMMAND")
|
send $env("COMMAND")
|
||||||
send "^m"
|
send "^m"
|
||||||
|
|
||||||
waitfor 15 "OK","ERR","ERROR"
|
waitfor 15 "OK","ERR","ERROR","COMMAND NOT SUPPORT"
|
||||||
if % = 0 goto continue
|
if % = 0 goto continue
|
||||||
if % = 1 goto error
|
if % = 1 goto error
|
||||||
if % = 2 goto error
|
if % = 2 goto error
|
||||||
|
if % = 3 goto notsupported
|
||||||
|
|
||||||
print "Timeout running AT-command\n"
|
print "Timeout running AT-command\n"
|
||||||
exit 1
|
exit 1
|
||||||
|
@ -22,5 +23,9 @@ opengt
|
||||||
print "Error running AT-command\n"
|
print "Error running AT-command\n"
|
||||||
exit 1
|
exit 1
|
||||||
|
|
||||||
|
:notsupported
|
||||||
|
print "AT-command not supported\n"
|
||||||
|
exit 1
|
||||||
|
|
||||||
:continue
|
:continue
|
||||||
exit 0
|
exit 0
|
||||||
|
|
Loading…
Reference in New Issue