DWR-512: adding wwan support for the dwr-512 3G modem
[openwrt/openwrt.git] / package / network / utils / comgt / files / ncm.sh
index 571cfaa28b48af646c008f5c5ec48f5d7cd9f177..60b39655ec7d008fadfd55bc79d6a40c5b4db20c 100644 (file)
@@ -18,30 +18,24 @@ proto_ncm_init_config() {
        proto_config_add_string delay
        proto_config_add_string mode
        proto_config_add_string pdptype
-       proto_config_add_boolean ipv6
+       proto_config_add_int profile
+       proto_config_add_defaults
 }
 
 proto_ncm_setup() {
        local interface="$1"
 
-       local manufacturer initialize setmode connect ifname devname devpath
-
-       local device apn auth username password pincode delay mode pdptype ipv6
-       json_get_vars device apn auth username password pincode delay mode pdptype ipv6
-       
-       if [ "$ipv6" = 0 ]; then
-               ipv6=""
-       else
-               ipv6=1
-       fi
-       
-       [ -z "$pdptype" ] && {
-               if [ -n "$ipv6" ]; then
-                       pdptype="IPV4V6"
-               else
-                       pdptype="IP"
-               fi
-       }
+       local manufacturer initialize setmode connect finalize ifname devname devpath
+
+       local device apn auth username password pincode delay mode pdptype profile $PROTO_DEFAULT_OPTIONS
+       json_get_vars device apn auth username password pincode delay mode pdptype profile $PROTO_DEFAULT_OPTIONS
+
+       [ "$metric" = "" ] && metric="0"
+
+       [ -n "$profile" ] || profile=1
+
+       pdptype=`echo "$pdptype" | awk '{print toupper($0)}'`
+       [ "$pdptype" = "IP" -o "$pdptype" = "IPV6" -o "$pdptype" = "IPV4V6" ] || pdptype="IP"
 
        [ -n "$ctl_device" ] && device=$ctl_device
 
@@ -51,16 +45,13 @@ proto_ncm_setup() {
                proto_set_available "$interface" 0
                return 1
        }
+
+       device="$(readlink -f $device)"
        [ -e "$device" ] || {
                echo "Control device not valid"
                proto_set_available "$interface" 0
                return 1
        }
-       [ -n "$apn" ] || {
-               echo "No APN specified"
-               proto_notify_error "$interface" NO_APN
-               return 1
-       }
 
        devname="$(basename "$device")"
        case "$devname" in
@@ -82,7 +73,7 @@ proto_ncm_setup() {
 
        [ -n "$delay" ] && sleep "$delay"
 
-       manufacturer=`gcom -d "$device" -s /etc/gcom/getcardinfo.gcom | awk '/Manufacturer/ { print tolower($2) }'`
+       manufacturer=`gcom -d "$device" -s /etc/gcom/getcardinfo.gcom | awk 'NF && $0 !~ /AT\+CGMI/ { sub(/\+CGMI: /,""); print tolower($1); exit; }'`
        [ $? -ne 0 ] && {
                echo "Failed to get modem information"
                proto_notify_error "$interface" GETINFO_FAILED
@@ -114,10 +105,22 @@ proto_ncm_setup() {
                        return 1
                }
        }
+
+       json_get_values configure configure
+       echo "Configuring modem"
+       for i in $configure; do
+               eval COMMAND="$i" gcom -d "$device" -s /etc/gcom/runcommand.gcom || {
+                       echo "Failed to configure modem"
+                       proto_notify_error "$interface" CONFIGURE_FAILED
+                       return 1
+               }
+       done
+
        [ -n "$mode" ] && {
                json_select modes
                json_get_var setmode "$mode"
-               COMMAND="$setmode" gcom -d "$device" -s /etc/gcom/runcommand.gcom || {
+               echo "Setting mode"
+               eval COMMAND="$setmode" gcom -d "$device" -s /etc/gcom/runcommand.gcom || {
                        echo "Failed to set operating mode"
                        proto_notify_error "$interface" SETMODE_FAILED
                        return 1
@@ -125,32 +128,51 @@ proto_ncm_setup() {
                json_select ..
        }
 
+       echo "Starting network $interface"
        json_get_vars connect
+       echo "Connecting modem"
        eval COMMAND="$connect" gcom -d "$device" -s /etc/gcom/runcommand.gcom || {
                echo "Failed to connect"
                proto_notify_error "$interface" CONNECT_FAILED
                return 1
        }
 
-       echo "Connected, starting DHCP on $ifname"
-       
+       json_get_vars finalize
+
+       echo "Setting up $ifname"
        proto_init_update "$ifname" 1
+       proto_add_data
+       json_add_string "manufacturer" "$manufacturer"
+       proto_close_data
        proto_send_update "$interface"
 
-       json_init
-       json_add_string name "${interface}_4"
-       json_add_string ifname "@$interface"
-       json_add_string proto "dhcp"
-       ubus call network add_dynamic "$(json_dump)"
+       [ "$pdptype" = "IP" -o "$pdptype" = "IPV4V6" ] && {
+               json_init
+               json_add_string name "${interface}_4"
+               json_add_string ifname "@$interface"
+               json_add_string proto "dhcp"
+               proto_add_dynamic_defaults
+               ubus call network add_dynamic "$(json_dump)"
+       }
 
-       [ -n "$ipv6" ] && {
+       [ "$pdptype" = "IPV6" -o "$pdptype" = "IPV4V6" ] && {
                json_init
                json_add_string name "${interface}_6"
                json_add_string ifname "@$interface"
                json_add_string proto "dhcpv6"
                json_add_string extendprefix 1
+               proto_add_dynamic_defaults
                ubus call network add_dynamic "$(json_dump)"
        }
+
+       [ -n "$finalize" ] && {
+               eval COMMAND="$finalize" gcom -d "$device" -s /etc/gcom/runcommand.gcom || {
+                       echo "Failed to configure modem"
+                       proto_notify_error "$interface" FINALIZE_FAILED
+                       return 1
+               }
+       }
+
 }
 
 proto_ncm_teardown() {
@@ -158,17 +180,18 @@ proto_ncm_teardown() {
 
        local manufacturer disconnect
 
-       local device
-       json_get_vars device
+       local device profile
+       json_get_vars device profile
 
-       echo "Stopping network"
+       [ -n "$ctl_device" ] && device=$ctl_device
 
-       manufacturer=`gcom -d "$device" -s /etc/gcom/getcardinfo.gcom | awk '/Manufacturer/ { print tolower($2) }'`
-       [ $? -ne 0 ] && {
-               echo "Failed to get modem information"
-               proto_notify_error "$interface" GETINFO_FAILED
-               return 1
-       }
+       [ -n "$profile" ] || profile=1
+
+       echo "Stopping network $interface"
+
+       json_load "$(ubus call network.interface.$interface status)"
+       json_select data
+       json_get_vars manufacturer
 
        json_load "$(cat /etc/gcom/ncm.json)"
        json_select "$manufacturer" || {
@@ -178,7 +201,7 @@ proto_ncm_teardown() {
        }
 
        json_get_vars disconnect
-       COMMAND="$disconnect" gcom -d "$device" -s /etc/gcom/runcommand.gcom || {
+       eval COMMAND="$disconnect" gcom -d "$device" -s /etc/gcom/runcommand.gcom || {
                echo "Failed to disconnect"
                proto_notify_error "$interface" DISCONNECT_FAILED
                return 1