[OpenWrt-Devel] [PATCH] comgt: add hso support

John Crispin blogic at openwrt.org
Tue Feb 24 02:24:17 EST 2015


Hi,

some comments inline

On 22/02/2015 10:19, Cezary Jackiewicz wrote:
> Add HSO support to comgt. This is work of Kyklas (see 
> https://dev.openwrt.org/ticket/6995), tested with Option GTM382.
> 
> Signed-off-by: Cezary Jackiewicz <cezary.jackiewicz at gmail.com>
> ---
> 
> diff --git a/package/network/utils/comgt/Makefile b/package/network/utils/comgt/Makefile
> index 8fcf54e..1e12b68 100644
> --- a/package/network/utils/comgt/Makefile
> +++ b/package/network/utils/comgt/Makefile
> @@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
>  
>  PKG_NAME:=comgt
>  PKG_VERSION:=0.32
> -PKG_RELEASE:=25
> +PKG_RELEASE:=26
>  
>  PKG_SOURCE:=$(PKG_NAME).$(PKG_VERSION).tgz
>  PKG_SOURCE_URL:=@SF/comgt
> @@ -47,6 +47,12 @@ $(call Package/comgt/Default)
>    DEPENDS:=+comgt
>  endef
>  
> +define Package/comgt-hso
> +$(call Package/comgt/Default)
> +  TITLE+=HSO Support
> +  DEPENDS:=+comgt +kmod-usb-net +kmod-usb-net-hso
> +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 
> @@ -101,6 +107,17 @@ define Package/comgt-ncm/install
>  	$(INSTALL_BIN) ./files/ncm.sh $(1)/lib/netifd/proto/ncm.sh
>  endef
>  
> +define Package/comgt-hso/install
> +    $(INSTALL_DIR) $(1)/etc/chatscripts
> +    $(INSTALL_DATA) ./files/hso.chat $(1)/etc/chatscripts/hso.chat
> +    $(INSTALL_DATA) ./files/hsohup.chat $(1)/etc/chatscripts/hsohup.chat
> +    $(INSTALL_DIR) $(1)/etc/gcom
> +    $(INSTALL_DATA) ./files/setuser.gcom $(1)/etc/gcom/setuser.gcom
> +    $(INSTALL_DIR) $(1)/lib/netifd/proto
> +    $(INSTALL_BIN) ./files/hso.sh $(1)/lib/netifd/proto/hso.sh
> +endef
> +
>  $(eval $(call BuildPackage,comgt))
>  $(eval $(call BuildPackage,comgt-directip))
>  $(eval $(call BuildPackage,comgt-ncm))
> +$(eval $(call BuildPackage,comgt-hso))
> diff --git a/package/network/utils/comgt/files/hso.chat b/package/network/utils/comgt/files/hso.chat
> new file mode 100644
> index 0000000..cb87d5a
> --- /dev/null
> +++ b/package/network/utils/comgt/files/hso.chat
> @@ -0,0 +1,13 @@
> +ABORT   BUSY
> +ABORT   'NO CARRIER'
> +ABORT   ERROR
> +REPORT  CONNECT
> +TIMEOUT 10
> +""	"ATZ"
> +OK	'AT+CGDCONT=2,"IP","$USE_APN"'
> +SAY	"Service Mode $MODE"
> +TIMEOUT 30
> +OK	"AT_OPSYS=$MODE,2"
> +OK	"AT_OWANCALL=2,1,0"
> +OK	"\d\d\d\d\d\dAT_OWANDATA=2"
> +OK	""
> diff --git a/package/network/utils/comgt/files/hso.sh b/package/network/utils/comgt/files/hso.sh
> new file mode 100644
> index 0000000..5f10420
> --- /dev/null
> +++ b/package/network/utils/comgt/files/hso.sh
> @@ -0,0 +1,135 @@
> +#!/bin/sh
> +INCLUDE_ONLY=1
> +
> +. ../netifd-proto.sh
> +init_proto "$@"
> +
> +proto_hso_init_config() {
> +
> +	no_device=1
> +	available=1
> +
> +	proto_config_add_string "device"
> +	proto_config_add_string "maxwait"
> +	proto_config_add_string "apn"
> +	proto_config_add_string "pincode"
> +	proto_config_add_int "mtu"
> +	proto_config_add_string "username"
> +	proto_config_add_string "password"
> +	proto_config_add_string "ifname"
> +}
> +
> +
> +proto_hso_setup() {
> +
> +	local iface="$1"
> +	local chat="/etc/chatscripts/hso.chat"
> +
> +	json_get_var device device
> +	json_get_var maxwait maxwait
> +	maxwait=${maxwait:-20}
> +	while [ ! -e "$device" -a $maxwait -gt 0 ];do # wait for driver loading to catch up
> +		maxwait=$(($maxwait - 1))


This bit is correct with the maxwait logic, but below ...

> +		sleep 1
> +	done
> +
> +	json_get_var apn apn
> +	json_get_var pincode pincode
> +	json_get_var mtu mtu
> +	json_get_var service service
> +	json_get_var username username
> +	json_get_var password password
> +	json_get_type ifnametype ifname
> +
> +	if [ "$ifnametype" = "array" ]
> +	then
> +		json_select ifname
> +		json_get_var ifname 1
> +		json_select ".."
> +	fi
> +
> +	if [ "$ifnametype" = "string" ]
> +	then
> +		json_get_var ifname ifname
> +	fi
> +
> +	# set pin if configured
> +	if [ ! -z "$pincode" ]
> +	then
> +		PINCODE="$pincode" gcom -d "$device" -s /etc/gcom/setpin.gcom || {
> +			echo "$iface (hso): Failed to set the PIN code."
> +			proto_notify_error "$iface" PIN_FAILED
> +			return 1
> +		}
> +	fi
> +
> +	# set username and password if configured
> +	if [ -n "$username" -a -n "$password" ]
> +	then
> +		USER="$username" PASS="$password" gcom -d "$device" -s /etc/gcom/setuser.gcom || {
> +			echo "$iface (hso): Failed to set username and password."
> +			proto_notify_error "$iface" AUTH_FAILED
> +			return 1
> +		}
> +	fi
> +
> +	case "$service" in
> +		umts_only) service_mode=1;;
> +		gprs_only) service_mode=0;;
> +		*) service_mode=3;;
> +	esac
> +
> +	local pip counter
> +	local outputfile="/tmp/hsoout.$$"
> +	while [ -z "$pip" -a "$counter" != "---------------" ]
> +	do

there is a weird way to solve the problem.

> +		sleep 2
> +		rm -f $outputfile
> +		( USE_APN=$apn MODE=$service_mode /usr/sbin/chat -E -v -V -f $chat <$device > $device ) 2> $outputfile
> +		iserror=`grep '^ERROR' $outputfile`
> +		if [ -z "$iserror" ]
> +		then
> +			pip="`grep '^_OWANDATA' $outputfile | cut -d, -f2`"
> +			gw="`grep '^_OWANDATA' $outputfile | cut -d, -f3`"
> +			ns1="`grep '^_OWANDATA' $outputfile | cut -d, -f4`"
> +			ns2="`grep '^_OWANDATA' $outputfile | cut -d, -f5`"
> +		fi
> +
> +		counter="${counter}-"
> +	done
> +
> +	rm -f $outputfile
> +
> +	if [ -z $pip ]
> +	then
> +		echo "$iface (hso): Failed to connect and obtain IP address."

missing a proto_notify_error here

> +		return 1
> +	fi
> +
> +	proto_init_update $ifname 1
> +	proto_set_keep 1
> +	proto_add_ipv4_address "$pip" 32
> +	proto_add_dns_server "$ns1"
> +	proto_add_dns_server "$ns2"
> +	proto_add_ipv4_route "0.0.0.0" 0 $gw
> +	proto_add_data
> +	json_add_string "ppp-type" "hso"
> +	proto_close_data
> +	proto_send_update "$iface"
> +
> +	touch /var/run/$ifname.pid
> +}
> +
> +
> +proto_hso_teardown() {
> +
> +	local config="$1"
> +	local chat="/etc/chatscripts/hsohup.chat"
> +
> +	json_get_var device device
> +	/usr/sbin/chat -v -f $chat <$device > $device
> +
> +	killall gcom >/dev/null 2>/dev/null

we should really track the pid and killt hat instead of all gcoms.
although this is not critical, have a look at how other gcom scripts do it

	John


> +}
> +
> +add_protocol hso
> diff --git a/package/network/utils/comgt/files/hsohup.chat b/package/network/utils/comgt/files/hsohup.chat
> new file mode 100644
> index 0000000..9e82183
> --- /dev/null
> +++ b/package/network/utils/comgt/files/hsohup.chat
> @@ -0,0 +1,8 @@
> +ABORT   BUSY
> +ABORT   'NO CARRIER'
> +ABORT   ERROR
> +REPORT  CONNECT
> +SAY	"Hanging up..."
> +TIMEOUT 30
> +""	"AT_OWANCALL=2,0"
> +OK	""
> diff --git a/package/network/utils/comgt/files/setuser.gcom b/package/network/utils/comgt/files/setuser.gcom
> new file mode 100644
> index 0000000..511d90b
> --- /dev/null
> +++ b/package/network/utils/comgt/files/setuser.gcom
> @@ -0,0 +1,29 @@
> +# set username and password
> +opengt
> + set com 115200n81
> + set senddelay 0.02
> + waitquiet 1 0.2
> + flash 0.1
> +
> +:start
> + print "Trying to set username and password\n"
> + send "AT$QCPDPP=1,1,"
> + send $env("USER")
> + send ","
> + send $env("PASS")
> + send "^m"
> +
> + waitfor 15 "OK","ERR","ERROR"
> + if % = 0 goto continue
> + if % = 1 goto modeerror
> + if % = 2 goto modeerror
> +
> + print "Timeout setting username and password!\n"
> + exit 1
> +
> +:modeerror
> + print "Error setting username and password!\n"
> + exit 1
> +
> +:continue
> + exit 0
> 
> 
_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel



More information about the openwrt-devel mailing list