comgt: add ncm proto support
This will not work for all board/dongle combinations until we hit 3.17. Signed-off-by: Matti Laakso <malaakso@elisanet.fi> SVN-Revision: 42866
This commit is contained in:
		@@ -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))
 | 
			
		||||
 
 | 
			
		||||
@@ -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)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										49
									
								
								package/network/utils/comgt/files/ncm.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								package/network/utils/comgt/files/ncm.json
									
									
									
									
									
										Normal file
									
								
							@@ -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"
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										156
									
								
								package/network/utils/comgt/files/ncm.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										156
									
								
								package/network/utils/comgt/files/ncm.sh
									
									
									
									
									
										Normal file
									
								
							@@ -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
 | 
			
		||||
							
								
								
									
										26
									
								
								package/network/utils/comgt/files/runcommand.gcom
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								package/network/utils/comgt/files/runcommand.gcom
									
									
									
									
									
										Normal file
									
								
							@@ -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
 | 
			
		||||
		Reference in New Issue
	
	Block a user