the e3267 that sami sent me works with this proto, but i am failing to
get a DHCP addr. could someone with a ncm dongle please try this patch
on top of latest trunk please and tell me if they are getting a dhcp addr ?


On 08/10/2014 05:17, John Crispin wrote:
> From: Matti Laakso <malaa...@elisanet.fi>
>
> Signed-off-by: Matti Laakso <malaa...@elisanet.fi>
> ---
>  package/network/utils/comgt/Makefile              |   15 ++
>  package/network/utils/comgt/files/3g.usb          |    2 +-
>  package/network/utils/comgt/files/ncm.json        |   49 +++++++
>  package/network/utils/comgt/files/ncm.sh          |  156 
> +++++++++++++++++++++
>  package/network/utils/comgt/files/runcommand.gcom |   26 ++++
>  5 files changed, 247 insertions(+), 1 deletion(-)
>  create mode 100644 package/network/utils/comgt/files/ncm.json
>  create mode 100644 package/network/utils/comgt/files/ncm.sh
>  create mode 100644 package/network/utils/comgt/files/runcommand.gcom
>
> diff --git a/package/network/utils/comgt/Makefile 
> b/package/network/utils/comgt/Makefile
> index 11a1a49..5fccd94 100644
> --- a/package/network/utils/comgt/Makefile
> +++ b/package/network/utils/comgt/Makefile
> @@ -40,6 +40,12 @@ $(call Package/comgt/Default)
>    DEPENDS:=+comgt +kmod-usb-serial +kmod-usb-serial-sierrawireless 
> +kmod-usb-net +kmod-usb-net-sierrawireless
>  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
> +endef
> +
>  define Package/comgt/description
>   comgt is a scripting language interpreter useful for establishing 
>   communications on serial lines and through PCMCIA modems as well as GPRS 
> @@ -86,5 +92,14 @@ define Package/comgt-directip/install
>       $(INSTALL_BIN) ./files/directip.sh $(1)/lib/netifd/proto/directip.sh
>  endef
>  
> +define Package/comgt-ncm/install
> +     $(INSTALL_DIR) $(1)/etc/gcom
> +     $(INSTALL_DATA) ./files/ncm.json $(1)/etc/gcom/ncm.json
> +     $(INSTALL_DATA) ./files/runcommand.gcom $(1)/etc/gcom/runcommand.gcom
> +     $(INSTALL_DIR) $(1)/lib/netifd/proto
> +     $(INSTALL_BIN) ./files/ncm.sh $(1)/lib/netifd/proto/ncm.sh
> +endef
> +
>  $(eval $(call BuildPackage,comgt))
>  $(eval $(call BuildPackage,comgt-directip))
> +$(eval $(call BuildPackage,comgt-ncm))
> diff --git a/package/network/utils/comgt/files/3g.usb 
> b/package/network/utils/comgt/files/3g.usb
> index fd6837e..ac8326b 100644
> --- a/package/network/utils/comgt/files/3g.usb
> +++ b/package/network/utils/comgt/files/3g.usb
> @@ -8,7 +8,7 @@ find_3g_iface() {
>  
>       local proto
>       config_get proto "$cfg" proto
> -     [ "$proto" = 3g ] || return 0
> +     [ "$proto" = 3g ] || [ "$proto" = ncm ] || return 0
>  
>       # bypass state vars here because 00-netstate could clobber .device
>       local dev=$(uci_get network "$cfg" device)
> diff --git a/package/network/utils/comgt/files/ncm.json 
> b/package/network/utils/comgt/files/ncm.json
> new file mode 100644
> index 0000000..b9b15cd
> --- /dev/null
> +++ b/package/network/utils/comgt/files/ncm.json
> @@ -0,0 +1,49 @@
> +{
> +     "huawei": {
> +             "initialize": [
> +                     "AT",
> +                     "ATZ",
> +                     "ATQ0",
> +                     "ATV1",
> +                     "ATE1",
> +                     "ATS0=0"
> +             ],
> +             "modes": {
> +                     "preferlte": 
> "AT^SYSCFGEX=\\\"030201\\\",3fffffff,2,4,7fffffffffffffff,,",
> +                     "preferumts": 
> "AT^SYSCFGEX=\\\"0201\\\",3fffffff,2,4,7fffffffffffffff,,",
> +                     "lte": 
> "AT^SYSCFGEX=\\\"03\\\",3fffffff,2,4,7fffffffffffffff,,",
> +                     "umts": 
> "AT^SYSCFGEX=\\\"02\\\",3fffffff,2,4,7fffffffffffffff,,",
> +                     "gsm": 
> "AT^SYSCFGEX=\\\"01\\\",3fffffff,2,4,7fffffffffffffff,,",
> +                     "auto": 
> "AT^SYSCFGEX=\\\"00\\\",3fffffff,2,4,7fffffffffffffff,,"
> +             },
> +             "connect": 
> "AT^NDISDUP=1,1,\\\"${apn}\\\"${username:+,\\\"$username\\\"}${password:+,\\\"$password\\\"}${auth:+,$auth}",
> +             "disconnect": "AT^NDISDUP=1,0"
> +     },
> +     "SAMSUNG": {
> +             "initialize": [
> +                     "AT",
> +                     "AT+CGREG=2",
> +                     "AT+CFUN=5",
> +                     "AT+MODESELECT=3",
> +                     "AT+CGDCONT=1,\\\"IP\\\",\\\"${apn}\\\""
> +             ],
> +             "modes": {
> +                     "umts": "AT+CHANGEALLPATH=1"
> +             },
> +             "connect": "AT+CGATT=1",
> +             "disconnect": "AT+CGATT=0"
> +     },
> +     "Sony": {
> +             "initialize": [
> +                     "AT+CFUN=1",
> +                     "AT+CGDCONT=1,\\\"IP\\\",\\\"${apn}\\\"",
> +                     
> "AT*EIAAUW=1,1,\\\"${username}\\\",\\\"${password}\\\",${auth:-00111}"
> +             ],
> +             "modes": {
> +                     "umts": "AT+CFUN=6",
> +                     "gsm": "AT+CFUN=5"
> +             },
> +             "connect": "AT*ENAP=1,1",
> +             "disconnect": "AT*ENAP=0"
> +     }
> +}
> diff --git a/package/network/utils/comgt/files/ncm.sh 
> b/package/network/utils/comgt/files/ncm.sh
> new file mode 100644
> index 0000000..14e421f
> --- /dev/null
> +++ b/package/network/utils/comgt/files/ncm.sh
> @@ -0,0 +1,156 @@
> +#!/bin/sh
> +
> +. /lib/functions.sh
> +. ../netifd-proto.sh
> +init_proto "$@"
> +
> +proto_ncm_init_config() {
> +     no_device=1
> +     available=1
> +     proto_config_add_string "device:device"
> +     proto_config_add_string apn
> +     proto_config_add_string auth
> +     proto_config_add_string username
> +     proto_config_add_string password
> +     proto_config_add_string pincode
> +     proto_config_add_string delay
> +     proto_config_add_string mode
> +}
> +
> +proto_ncm_setup() {
> +     local interface="$1"
> +
> +     local manufacturer initialize setmode connect
> +
> +     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"
> +             proto_notify_error "$interface" NO_DEVICE
> +             proto_set_available "$interface" 0
> +             return 1
> +     }
> +     [ -e "$device" ] || {
> +             echo "ncm[$$]" "Control device not valid"
> +             proto_set_available "$interface" 0
> +             return 1
> +     }
> +     [ -n "$apn" ] || {
> +             echo "ncm[$$]" "No APN specified"
> +             proto_notify_error "$interface" NO_APN
> +             proto_set_available "$interface" 0
> +             return 1
> +     }
> +
> +     [ -n "$delay" ] && sleep "$delay"
> +
> +     manufacturer=`gcom -d "$device" -s /etc/gcom/getcardinfo.gcom | awk 
> '/Manufacturer/ { print $2 }'`
> +     [ $? -ne 0 ] && {
> +             echo "ncm[$$]" "Failed to get modem information"
> +             proto_notify_error "$interface" GETINFO_FAILED
> +             proto_set_available "$interface" 0
> +             return 1
> +     }
> +
> +     json_load "$(cat /etc/gcom/ncm.json)"
> +     json_select "$manufacturer"
> +     [ $? -ne 0 ] && {
> +             echo "ncm[$$]" "Unsupported modem"
> +             proto_notify_error "$interface" UNSUPPORTED_MODEM
> +             proto_set_available "$interface" 0
> +             return 1
> +     }
> +     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"
> +                     proto_notify_error "$interface" INITIALIZE_FAILED
> +                     proto_set_available "$interface" 0
> +                     return 1
> +             }
> +     done
> +
> +     [ -n "$pincode" ] && {
> +             PINCODE="$pincode" gcom -d "$device" -s /etc/gcom/setpin.gcom 
> || {
> +                     echo "ncm[$$]" "Unable to verify PIN"
> +                     proto_notify_error "$interface" PIN_FAILED
> +                     proto_block_restart "$interface"
> +                     return 1
> +             }
> +     }
> +     [ -n "$mode" ] && {
> +             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"
> +                     proto_notify_error "$interface" SETMODE_FAILED
> +                     proto_set_available "$interface" 0
> +                     return 1
> +             }
> +             json_select ..
> +     }
> +
> +     json_get_var connect connect
> +     eval COMMAND="$connect" gcom -d "$device" -s /etc/gcom/runcommand.gcom 
> || {
> +             echo "ncm[$$]" "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
> +     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 
> +     json_get_vars device
> +
> +     echo "ncm[$$]" "Stopping network"
> +
> +     manufacturer=`gcom -d "$device" -s /etc/gcom/getcardinfo.gcom | awk 
> '/Manufacturer/ { print $2 }'`
> +     [ $? -ne 0 ] && {
> +             echo "ncm[$$]" "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"
> +             proto_notify_error "$interface" UNSUPPORTED_MODEM
> +             return 1
> +     }
> +
> +     json_get_var disconnect disconnect
> +     COMMAND="$disconnect" gcom -d "$device" -s /etc/gcom/runcommand.gcom || 
> {
> +             echo "ncm[$$]" "Failed to disconnect"
> +             proto_notify_error "$interface" DISCONNECT_FAILED
> +             return 1
> +     }
> +}
> +
> +add_protocol ncm
> diff --git a/package/network/utils/comgt/files/runcommand.gcom 
> b/package/network/utils/comgt/files/runcommand.gcom
> new file mode 100644
> index 0000000..6ba061f
> --- /dev/null
> +++ b/package/network/utils/comgt/files/runcommand.gcom
> @@ -0,0 +1,26 @@
> +# run AT-command from environment
> +opengt
> + set com 115200n81
> + set senddelay 0.02
> + waitquiet 1 0.2
> + flash 0.1
> +
> +:start
> + send "sending -> "
> + send $env("COMMAND")
> + send "^n"
> +
> + waitfor 15 "OK","ERR","ERROR"
> + if % = 0 goto continue
> + if % = 1 goto error
> + if % = 2 goto error
> +
> + print "Timeout running AT-command\n"
> + exit 1
> +
> +:error
> + print "Error running AT-command\n"
> + exit 1
> +
> +:continue
> + exit 0
_______________________________________________
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel

Reply via email to