[OpenWrt-Devel] [PATCH 1/2] wwan: Add support for CDC (Huawei 'HiLink') Modems

Bruno Randolf br1 at einfach.org
Thu Feb 18 12:12:25 EST 2016


Huawei HiLink ("h" model names) modems just provide a CDC Ethernet interface
where we have to run DHCP to get an IP address (usually in the 192.168.8.0
range). While this may be bad design in general it's sometimes necessary to
support these modems.

This adds autodetection and handling of these to wwan.

Tested with Huawei E3030h-1.

Signed-off-by: Bruno Randolf <br1 at einfach.org>
---
 package/network/utils/wwan/Makefile        |  3 +-
 package/network/utils/wwan/files/hilink.sh | 56 ++++++++++++++++++++++++++++++
 package/network/utils/wwan/files/wwan.sh   |  9 ++++-
 3 files changed, 66 insertions(+), 2 deletions(-)
 create mode 100644 package/network/utils/wwan/files/hilink.sh

diff --git a/package/network/utils/wwan/Makefile b/package/network/utils/wwan/Makefile
index 8d388dc..1917d1c 100644
--- a/package/network/utils/wwan/Makefile
+++ b/package/network/utils/wwan/Makefile
@@ -2,7 +2,7 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=wwan
 PKG_VERSION:=2014-07-17
-PKG_RELEASE=1
+PKG_RELEASE=3
 
 PKG_LICENSE:=GPL-2.0
 PKG_LICENSE_FILES:=
@@ -24,6 +24,7 @@ endef
 define Package/wwan/install
 	$(INSTALL_DIR) $(1)/lib/netifd/proto/
 	$(CP) ./files/wwan.sh $(1)/lib/netifd/proto/
+	$(CP) ./files/hilink.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
diff --git a/package/network/utils/wwan/files/hilink.sh b/package/network/utils/wwan/files/hilink.sh
new file mode 100644
index 0000000..229e1a4
--- /dev/null
+++ b/package/network/utils/wwan/files/hilink.sh
@@ -0,0 +1,56 @@
+#!/bin/sh
+
+[ -n "$INCLUDE_ONLY" ] || {
+	. /lib/functions.sh
+	. ../netifd-proto.sh
+	init_proto "$@"
+}
+
+proto_hilink_init_config() {
+	available=1
+	no_device=1
+	proto_config_add_boolean defaultroute
+	proto_config_add_boolean peerdns
+	proto_config_add_int metric
+}
+
+proto_hilink_setup() {
+	local interface="$1"
+	local ifname="$ctl_device"
+	local defaultroute peerdns metric
+
+	json_get_vars defaultroute peerdns metric
+
+	[ -n "$ifname" ] || {
+		proto_notify_error "$interface" NO_IFNAME
+		proto_set_available "$interface" 0
+		return 1
+	}
+
+	logger -p daemon.info -t "hilink[$$]" "Starting DHCP on $ifname"
+	proto_init_update "$ifname" 1
+	proto_send_update "$interface"
+
+	json_init
+	json_add_string name "${interface}_4"
+	json_add_string ifname "@$interface"
+	json_add_string proto "dhcp"
+	[ -n "$defaultroute" ] && json_add_boolean defaultroute "$defaultroute"
+	[ -n "$peerdns" ] && json_add_boolean peerdns "$peerdns"
+	[ -n "$metric" ] && json_add_int metric "$metric"
+	json_close_object
+	ubus call network add_dynamic "$(json_dump)"
+
+	return 0
+}
+
+proto_hilink_teardown() {
+	local interface="$1"
+
+	proto_init_update "*" 0
+	proto_send_update "$interface"
+}
+
+[ -n "$INCLUDE_ONLY" ] || {
+	add_protocol hilink
+}
diff --git a/package/network/utils/wwan/files/wwan.sh b/package/network/utils/wwan/files/wwan.sh
index 6b33600..3d80aba 100755
--- a/package/network/utils/wwan/files/wwan.sh
+++ b/package/network/utils/wwan/files/wwan.sh
@@ -14,12 +14,14 @@ 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"; }
+proto_hilink_setup() { echo "wwan[$$] hilink 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
+[ -f ./hilink.sh ] && . ./hilink.sh
 
 proto_wwan_init_config() {
 	available=1
@@ -66,7 +68,7 @@ proto_wwan_setup() {
 		}
 	}
 
-	[ -z "$ctl_device" ] && for net in $(ls /sys/class/net/ | grep wwan); do
+	[ -z "$ctl_device" ] && for net in $(ls /sys/class/net/ | grep -E "wwan|eth"); do
 		[ -z "$ctl_device" ] || continue
 		driver=$(grep DRIVER /sys/class/net/$net/device/uevent | cut -d= -f2)
 		case "$driver" in
@@ -76,6 +78,9 @@ proto_wwan_setup() {
 		sierra_net|*cdc_ncm)
 			ctl_device=/dev/$(cd /sys/class/net/$net/; find ../../../ -name ttyUSB* |xargs basename | head -n1)
 			;;
+		cdc_ether)
+			ctl_device=$net
+			;;
 		*) continue;;
 		esac
 		echo "wwan[$$]" "Using proto:$proto device:$ctl_device iface:$net desc:$desc"
@@ -98,6 +103,7 @@ proto_wwan_setup() {
 	sierra_net)	proto_directip_setup $@ ;;
 	comgt)		proto_3g_setup $@ ;;
 	*cdc_ncm)	proto_ncm_setup $@ ;;
+	cdc_ether)	proto_hilink_setup $@ ;;
 	esac
 }
 
@@ -113,6 +119,7 @@ proto_wwan_teardown() {
 	sierra_net)	proto_mbim_teardown $@ ;;
 	comgt)		proto_3g_teardown $@ ;;
 	*cdc_ncm)	proto_ncm_teardown $@ ;;
+	cdc_ether)	proto_hilink_teardown $@ ;;
 	esac
 }
 
-- 
1.9.1
_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel



More information about the openwrt-devel mailing list