mirror of
				git://git.openwrt.org/openwrt/openwrt.git
				synced 2025-10-31 05:54:26 -04:00 
			
		
		
		
	This PR allow the 3G modem embedded in the DWR-512 to be managed by the wwan-ncm scripts. The modem will use the usb-option and usb-cdc-ether drivers. The DWR-512 DT is updated accordingly. Signed-off-by: Giuseppe Lippolis <giu.lippolis@gmail.com>
		
			
				
	
	
		
			216 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
			
		
		
	
	
			216 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
| #!/bin/sh
 | |
| 
 | |
| [ -n "$INCLUDE_ONLY" ] || {
 | |
| 	. /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_config_add_string pdptype
 | |
| 	proto_config_add_int profile
 | |
| 	proto_config_add_defaults
 | |
| }
 | |
| 
 | |
| proto_ncm_setup() {
 | |
| 	local interface="$1"
 | |
| 
 | |
| 	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
 | |
| 
 | |
| 	[ -n "$device" ] || {
 | |
| 		echo "No control device specified"
 | |
| 		proto_notify_error "$interface" NO_DEVICE
 | |
| 		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
 | |
| 	}
 | |
| 
 | |
| 	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"
 | |
| 
 | |
| 	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
 | |
| 		return 1
 | |
| 	}
 | |
| 
 | |
| 	json_load "$(cat /etc/gcom/ncm.json)"
 | |
| 	json_select "$manufacturer"
 | |
| 	[ $? -ne 0 ] && {
 | |
| 		echo "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 "Failed to initialize modem"
 | |
| 			proto_notify_error "$interface" INITIALIZE_FAILED
 | |
| 			return 1
 | |
| 		}
 | |
| 	done
 | |
| 
 | |
| 	[ -n "$pincode" ] && {
 | |
| 		PINCODE="$pincode" gcom -d "$device" -s /etc/gcom/setpin.gcom || {
 | |
| 			echo "Unable to verify PIN"
 | |
| 			proto_notify_error "$interface" PIN_FAILED
 | |
| 			proto_block_restart "$interface"
 | |
| 			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"
 | |
| 		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
 | |
| 		}
 | |
| 		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
 | |
| 	}
 | |
| 
 | |
| 	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"
 | |
| 
 | |
| 	[ "$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)"
 | |
| 	}
 | |
| 
 | |
| 	[ "$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() {
 | |
| 	local interface="$1"
 | |
| 
 | |
| 	local manufacturer disconnect
 | |
| 
 | |
| 	local device profile
 | |
| 	json_get_vars device profile
 | |
| 
 | |
| 	[ -n "$ctl_device" ] && device=$ctl_device
 | |
| 
 | |
| 	[ -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" || {
 | |
| 		echo "Unsupported modem"
 | |
| 		proto_notify_error "$interface" UNSUPPORTED_MODEM
 | |
| 		return 1
 | |
| 	}
 | |
| 
 | |
| 	json_get_vars disconnect
 | |
| 	eval COMMAND="$disconnect" gcom -d "$device" -s /etc/gcom/runcommand.gcom || {
 | |
| 		echo "Failed to disconnect"
 | |
| 		proto_notify_error "$interface" DISCONNECT_FAILED
 | |
| 		return 1
 | |
| 	}
 | |
| 
 | |
| 	proto_init_update "*" 0
 | |
| 	proto_send_update "$interface"
 | |
| }
 | |
| [ -n "$INCLUDE_ONLY" ] || {
 | |
| 	add_protocol ncm
 | |
| }
 |