openwrt/package/network/utils/wwan/files/wwan.sh
Florian Eckert c45c7606cc wwan: check new uci bus option on proto setup event
If system has more then one and different wwan interface (modem). Then the
wwan protohandler will always take the modem which is discovered first.
The protohandler will always setup the same interface. To fix this add a
new usb "bus" option which is associated with wwan device and so will set
the specified interface up. With this change more then one interface
could be mananged by the wwan protohandler.

If the "bus" option is not set in the uci network config then the protohandler
behaves as before the change. The protohanldler will take the first
interface which he founds.

Signed-off-by: Florian Eckert <fe@dev.tdt.de>
2019-10-18 19:46:21 +02:00

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