@ -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 di sconnect 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
}