| #!/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 |