diff options
author | John Crispin <john@openwrt.org> | 2014-10-08 08:01:20 +0000 |
---|---|---|
committer | John Crispin <john@openwrt.org> | 2014-10-08 08:01:20 +0000 |
commit | 90120bb7712361d67edb84faee78f2b191e1158b (patch) | |
tree | 09269a89a6d98cd7f0c5589f07ff37556b896e1c /package/network/utils/wwan | |
parent | 1df98fcd5adbf50c9fb0d2718879616d0e3c67b8 (diff) | |
download | upstream-90120bb7712361d67edb84faee78f2b191e1158b.tar.gz upstream-90120bb7712361d67edb84faee78f2b191e1158b.tar.bz2 upstream-90120bb7712361d67edb84faee78f2b191e1158b.zip |
wwan: add a generic 3g/4g proto
this proto handler will detect which of 3g, qmi, mbim, ncm or directip you need
for a stick and setup uci automagically
Signed-off-by: John Crispin <blogic@openwrt.org>
SVN-Revision: 42837
Diffstat (limited to 'package/network/utils/wwan')
-rw-r--r-- | package/network/utils/wwan/Makefile | 33 | ||||
-rwxr-xr-x | package/network/utils/wwan/files/wwan.sh | 119 | ||||
-rw-r--r-- | package/network/utils/wwan/files/wwan.usb | 18 | ||||
-rw-r--r-- | package/network/utils/wwan/files/wwan.usbmisc | 25 |
4 files changed, 195 insertions, 0 deletions
diff --git a/package/network/utils/wwan/Makefile b/package/network/utils/wwan/Makefile new file mode 100644 index 0000000000..f114a359db --- /dev/null +++ b/package/network/utils/wwan/Makefile @@ -0,0 +1,33 @@ +include $(TOPDIR)/rules.mk + +PKG_NAME:=wwan +PKG_VERSION:=2014-07-17 +PKG_RELEASE=1 + +PKG_LICENSE:=GPLv2 +PKG_LICENSE_FILES:= + +PKG_MAINTAINER:=John Crispin <blogic@openwrt.org> + +include $(INCLUDE_DIR)/package.mk + +define Package/wwan + SECTION:=net + CATEGORY:=Network + TITLE:=Generic OpenWrt 3G/4G proto handler +endef + +define Build/Compile + true +endef + +define Package/wwan/install + $(INSTALL_DIR) $(1)/lib/netifd/proto/ + $(CP) ./files/wwan.sh $(1)/lib/netifd/proto/ + $(INSTALL_DIR) $(1)/etc/hotplug.d/usb + $(INSTALL_BIN) ./files/wwan.usb $(1)/etc/hotplug.d/usb/00_wwan.sh + $(INSTALL_DIR) $(1)/etc/hotplug.d/usbmisc + $(INSTALL_BIN) ./files/wwan.usbmisc $(1)/etc/hotplug.d/usbmisc/00_wwan.sh +endef + +$(eval $(call BuildPackage,wwan)) diff --git a/package/network/utils/wwan/files/wwan.sh b/package/network/utils/wwan/files/wwan.sh new file mode 100755 index 0000000000..6b33600b32 --- /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 diff --git a/package/network/utils/wwan/files/wwan.usb b/package/network/utils/wwan/files/wwan.usb new file mode 100644 index 0000000000..507b002d14 --- /dev/null +++ b/package/network/utils/wwan/files/wwan.usb @@ -0,0 +1,18 @@ +[ "$ACTION" = add -a "$DEVTYPE" = usb_device ] || exit 0 + +vid=$(cat /sys$DEVPATH/idVendor) +pid=$(cat /sys$DEVPATH/idProduct) +[ -f "/lib/network/wwan/$vid:$pid" ] || exit 0 + +find_wwan_iface() { + local cfg="$1" + local proto + config_get proto "$cfg" proto + [ "$proto" = wwan ] || return 0 + proto_set_available "$cfg" 1 + ifup $cfg + exit 0 +} + +config_load network +config_foreach find_wwan_iface interface diff --git a/package/network/utils/wwan/files/wwan.usbmisc b/package/network/utils/wwan/files/wwan.usbmisc new file mode 100644 index 0000000000..404a5cc0a6 --- /dev/null +++ b/package/network/utils/wwan/files/wwan.usbmisc @@ -0,0 +1,25 @@ +#!/bin/sh + +[ "$ACTION" = add ] || exit 0 +[ "${DEVNAME/[0-9]/}" = cdc-wdm ] || exit 0 + +. /lib/functions.sh +. /lib/netifd/netifd-proto.sh + +find_wwan_iface() { + local cfg="$1" + + local proto device + config_get proto "$cfg" proto + config_get device "$cfg" device + + [ "$proto" = wwan ] || [ "$proto" = mbim ] || [ "$proto" = qmi ] || return 0 + [ -z "$device" -a "$proto" = wwan ] || [ "$device" = "/dev/$DEVNAME" ] || return 0 + + proto_set_available "$cfg" 1 + ifup "$cfg" + exit 0 +} + +config_load network +config_foreach find_wwan_iface interface |