mirror of
https://github.com/openwrt/openwrt.git
synced 2025-01-10 23:12:48 +00:00
c45c7606cc
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>
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
|