147 lines
4.2 KiB
Bash
Executable File
147 lines
4.2 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
. /lib/functions.sh
|
|
. ../netifd-proto.sh
|
|
init_proto "$@"
|
|
|
|
INCLUDE_ONLY=1
|
|
|
|
ctl_device=""
|
|
dat_device=""
|
|
|
|
proto_mbim_setup() { echo "wwan[$$] mbim proto is missing"; }
|
|
proto_qmi_setup() { echo "wwan[$$] qmi proto is missing"; }
|
|
proto_ncm_setup() { echo "wwan[$$] ncm proto is missing"; }
|
|
proto_3g_setup() { echo "wwan[$$] 3g proto is missing"; }
|
|
proto_directip_setup() { echo "wwan[$$] directip proto is missing"; }
|
|
|
|
[ -f ./mbim.sh ] && . ./mbim.sh
|
|
[ -f ./ncm.sh ] && . ./ncm.sh
|
|
[ -f ./qmi.sh ] && . ./qmi.sh
|
|
[ -f ./3g.sh ] && { . ./ppp.sh; . ./3g.sh; }
|
|
[ -f ./directip.sh ] && . ./directip.sh
|
|
|
|
proto_wwan_init_config() {
|
|
available=1
|
|
no_device=1
|
|
|
|
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 modes
|
|
proto_config_add_string bus
|
|
}
|
|
|
|
proto_wwan_setup() {
|
|
local driver usb devicename desc bus
|
|
|
|
json_get_vars bus
|
|
|
|
if [ -L "/sys/bus/usb/devices/${bus}" ]; then
|
|
if [ -f "/sys/bus/usb/devices/${bus}/idVendor" ] \
|
|
&& [ -f "/sys/bus/usb/devices/${bus}/idProduct" ]; then
|
|
local vendor product
|
|
vendor=$(cat /sys/bus/usb/devices/${bus}/idVendor)
|
|
product=$(cat /sys/bus/usb/devices/${bus}/idProduct)
|
|
[ -f /lib/network/wwan/$vendor:$product ] && {
|
|
usb=/lib/network/wwan/$vendor:$product
|
|
devicename=$bus
|
|
}
|
|
else
|
|
echo "wwan[$$]" "Specified usb bus ${bus} was not found"
|
|
proto_notify_error "$interface" NO_USB
|
|
proto_block_restart "$interface"
|
|
return 1
|
|
fi
|
|
else
|
|
echo "wwan[$$]" "Searching for a valid wwan usb device..."
|
|
for a in $(ls /sys/bus/usb/devices); do
|
|
local vendor product
|
|
[ -z "$usb" -a -f /sys/bus/usb/devices/$a/idVendor -a -f /sys/bus/usb/devices/$a/idProduct ] || continue
|
|
vendor=$(cat /sys/bus/usb/devices/$a/idVendor)
|
|
product=$(cat /sys/bus/usb/devices/$a/idProduct)
|
|
[ -f /lib/network/wwan/$vendor:$product ] && {
|
|
usb=/lib/network/wwan/$vendor:$product
|
|
devicename=$a
|
|
}
|
|
done
|
|
fi
|
|
|
|
echo "wwan[$$]" "Using wwan usb device on bus $devicename"
|
|
|
|
[ -n "$usb" ] && {
|
|
local old_cb control data
|
|
|
|
json_set_namespace wwan old_cb
|
|
json_init
|
|
json_load "$(cat "$usb")"
|
|
json_select
|
|
json_get_vars desc control data
|
|
json_set_namespace "$old_cb"
|
|
|
|
[ -n "$control" -a -n "$data" ] && {
|
|
ttys=$(ls -d /sys/bus/usb/devices/$devicename/${devicename}*/tty?* /sys/bus/usb/devices/$devicename/${devicename}*/tty/tty?* | sed "s/.*\///g" | tr "\n" " ")
|
|
ctl_device=/dev/$(echo $ttys | cut -d" " -f $((control + 1)))
|
|
dat_device=/dev/$(echo $ttys | cut -d" " -f $((data + 1)))
|
|
driver=comgt
|
|
}
|
|
}
|
|
|
|
[ -z "$ctl_device" ] && for net in $(ls /sys/class/net/ | grep -e wwan -e usb); do
|
|
[ -z "$ctl_device" ] || continue
|
|
[ -n "$bus" ] && {
|
|
[ $(readlink /sys/class/net/$net | grep $bus) ] || continue
|
|
}
|
|
driver=$(grep DRIVER /sys/class/net/$net/device/uevent | cut -d= -f2)
|
|
case "$driver" in
|
|
qmi_wwan|cdc_mbim)
|
|
ctl_device=/dev/$(ls /sys/class/net/$net/device/usbmisc)
|
|
;;
|
|
sierra_net|cdc_ether|*cdc_ncm)
|
|
ctl_device=/dev/$(cd /sys/class/net/$net/; find ../../../ -name ttyUSB* |xargs -n1 basename | head -n1)
|
|
;;
|
|
*) continue;;
|
|
esac
|
|
echo "wwan[$$]" "Using proto:$proto device:$ctl_device iface:$net desc:$desc"
|
|
done
|
|
|
|
[ -n "$ctl_device" ] || {
|
|
echo "wwan[$$]" "No valid device was found"
|
|
proto_notify_error "$interface" NO_DEVICE
|
|
proto_block_restart "$interface"
|
|
return 1
|
|
}
|
|
|
|
uci_set_state network "$interface" driver "$driver"
|
|
uci_set_state network "$interface" ctl_device "$ctl_device"
|
|
uci_set_state network "$interface" dat_device "$dat_device"
|
|
|
|
case $driver in
|
|
qmi_wwan) proto_qmi_setup $@ ;;
|
|
cdc_mbim) proto_mbim_setup $@ ;;
|
|
sierra_net) proto_directip_setup $@ ;;
|
|
comgt) proto_3g_setup $@ ;;
|
|
cdc_ether|*cdc_ncm) proto_ncm_setup $@ ;;
|
|
esac
|
|
}
|
|
|
|
proto_wwan_teardown() {
|
|
local interface=$1
|
|
local driver=$(uci_get_state network "$interface" driver)
|
|
ctl_device=$(uci_get_state network "$interface" ctl_device)
|
|
dat_device=$(uci_get_state network "$interface" dat_device)
|
|
|
|
case $driver in
|
|
qmi_wwan) proto_qmi_teardown $@ ;;
|
|
cdc_mbim) proto_mbim_teardown $@ ;;
|
|
sierra_net) proto_directip_teardown $@ ;;
|
|
comgt) proto_3g_teardown $@ ;;
|
|
cdc_ether|*cdc_ncm) proto_ncm_teardown $@ ;;
|
|
esac
|
|
}
|
|
|
|
add_protocol wwan
|