diff options
Diffstat (limited to 'package/network/utils/wwan/files/wwan.sh')
-rwxr-xr-x | package/network/utils/wwan/files/wwan.sh | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/package/network/utils/wwan/files/wwan.sh b/package/network/utils/wwan/files/wwan.sh new file mode 100755 index 0000000..6b33600 --- /dev/null +++ b/package/network/utils/wwan/files/wwan.sh @@ -0,0 +1,119 @@ +#!/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_wwan_setup() { + local driver usb devicename desc + + 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 + + [ -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* | 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 wwan); do + [ -z "$ctl_device" ] || 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_ncm) + ctl_device=/dev/$(cd /sys/class/net/$net/; find ../../../ -name ttyUSB* |xargs 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_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_mbim_teardown $@ ;; + comgt) proto_3g_teardown $@ ;; + *cdc_ncm) proto_ncm_teardown $@ ;; + esac +} + +add_protocol wwan |