Compare commits

..

2 Commits

Author SHA1 Message Date
Meng
662db5cfa8 Update makefiles commits 2025-11-03 03:51:45 +01:00
Xiaofeng Meng
903d5febbd bridgemngr with dm-framework 2025-11-03 03:50:28 +01:00
184 changed files with 1620 additions and 11953 deletions

View File

@@ -5,14 +5,14 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=bbfdm
PKG_VERSION:=1.18.22
PKG_VERSION:=1.18.12
USE_LOCAL:=0
ifneq ($(USE_LOCAL),1)
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://dev.iopsys.eu/bbf/bbfdm.git
PKG_SOURCE_VERSION:=678dea312a7fd0941a5bf5e884fffc11af1205e4
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.zst
PKG_SOURCE_VERSION:=adfdb54d625b952c533670f093dae008782ff56a
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
PKG_MIRROR_HASH:=skip
endif
@@ -107,7 +107,7 @@ endif
CMAKE_OPTIONS += \
-DBBF_VENDOR_PREFIX:String="$(CONFIG_BBF_VENDOR_PREFIX)" \
-DBBFDMD_MAX_MSG_LEN:Integer=20971520 \
-DBBFDMD_MAX_MSG_LEN:Integer=10485760 \
-DCMAKE_BUILD_TYPE:String="Debug" \
@@ -149,10 +149,10 @@ define Package/bbfdmd/install
$(INSTALL_DIR) $(1)/etc/hotplug.d/iface
$(INSTALL_BIN) ./files/etc/hotplug.d/iface/85-bbfdm-sysctl $(1)/etc/hotplug.d/iface/85-bbfdm-sysctl
$(INSTALL_DIR) $(1)/lib/upgrade/keep.d
$(INSTALL_DATA) ./files/lib/upgrade/keep.d/bbf $(1)/lib/upgrade/keep.d/bbf
$(INSTALL_DIR) $(1)/etc/uci-defaults
$(INSTALL_BIN) ./files/etc/uci-defaults/91-fix-bbfdmd-enabled-option $(1)/etc/uci-defaults/
$(INSTALL_BIN) ./files/etc/uci-defaults/ruleng.bbfdm $(1)/etc/uci-defaults

View File

@@ -25,6 +25,10 @@
"parent_dm": "Device.",
"object": "SelfTestDiagnostics"
},
{
"parent_dm": "Device.",
"object": "Syslog"
},
{
"parent_dm": "Device.",
"object": "{BBF_VENDOR_PREFIX}OpenVPN",

View File

@@ -10,8 +10,10 @@
"/etc/bbfdm/dmmap/PPP",
"/etc/bbfdm/dmmap/Routing",
"/etc/config/dhcp",
"/etc/bbfdm/dmmap/DHCPv4",
"/etc/bbfdm/dmmap/DHCPv6",
"/etc/bbfdm/dmmap/dmmap_dhcp",
"/etc/bbfdm/dmmap/dmmap_dhcp_client",
"/etc/bbfdm/dmmap/dmmap_dhcp_relay",
"/etc/bbfdm/dmmap/dmmap_dhcpv6",
"/etc/config/time",
"/etc/bbfdm/dmmap/dmmap_time",
"/etc/config/mapcontroller",
@@ -34,8 +36,10 @@
"/etc/bbfdm/dmmap/PPP",
"/etc/bbfdm/dmmap/Routing",
"/etc/config/dhcp",
"/etc/bbfdm/dmmap/DHCPv4",
"/etc/bbfdm/dmmap/DHCPv6",
"/etc/bbfdm/dmmap/dmmap_dhcp",
"/etc/bbfdm/dmmap/dmmap_dhcp_client",
"/etc/bbfdm/dmmap/dmmap_dhcp_relay",
"/etc/bbfdm/dmmap/dmmap_dhcpv6",
"/etc/config/mapcontroller",
"/etc/config/wireless",
"/etc/bbfdm/dmmap/WiFi",

View File

@@ -5,6 +5,7 @@ STOP=05
USE_PROCD=1
PROG=/usr/sbin/dm-service
DM_AGENT_PROG=/usr/sbin/dm-agent
BBFDM_MICROSERVICE_DIR="/etc/bbfdm/services"
@@ -24,7 +25,8 @@ validate_bbfdm_micro_service_section()
_add_microservice()
{
local name path loglevel
local enable enable_core unified_daemon
local enable enable_core unified_daemon dm_framework
local daemon_prog
# Check enable from micro-service
path="${1}"
@@ -47,14 +49,25 @@ _add_microservice()
return 0
fi
json_get_var dm_framework dm-framework 0
if [ "${dm_framework}" -eq "1" ] || [ "${dm_framework}" = "true" ]; then
daemon_prog="${DM_AGENT_PROG}"
else
daemon_prog="${PROG}"
fi
json_select config
json_get_var loglevel loglevel 4
procd_open_instance "${name}"
procd_set_param command ${PROG}
procd_append_param command -m "${name}"
procd_append_param command -l "${loglevel}"
procd_set_param command ${daemon_prog}
# Only add parameters for dm-service, not for dm-agent
if [ "${daemon_prog}" = "${PROG}" ]; then
procd_append_param command -m "${name}"
procd_append_param command -l "${loglevel}"
fi
if [ "${enable_core}" -eq "1" ]; then
procd_set_param limits core="unlimited"

View File

@@ -9,7 +9,7 @@ PKG_SOURCE_VERSION:=7b810a696c78b746185c11282bdbe3fb7f8c5d4b
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://github.com/dotse/bbk.git
PKG_SOURCE:=$(PKG_NAME)-$(PKG_SOURCE_VERSION).tar.zst
PKG_SOURCE:=$(PKG_NAME)-$(PKG_SOURCE_VERSION).tar.gz
PKG_SOURCE_SUBDIR:=$(PKG_NAME)
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)

View File

@@ -15,7 +15,7 @@ PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://github.com/mmeeks/bootchart.git
PKG_SOURCE_VERSION:=3ab81137cafe25c2ca4bc3a5f322a63646f9ce8d
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.zst
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
PKG_LICENSE:=GPLv2

View File

@@ -1,28 +0,0 @@
if PACKAGE_bridgemngr
config BRIDGEMNGR_BRIDGE_VLAN
bool "Use bridge-vlan backend"
help
Set this option to use bridge-vlan as backend for VLAN objects.
config BRIDGEMNGR_COPY_PBITS
bool "Copy pbits from cvlan to svlan"
default y
help
Set this option to copy cvlan pbits to svlan pbits by default (driver vlan).
config BRIDGEMNGR_BRIDGE_VENDOR_EXT
bool "Use bridge BBF vendor extensions"
default y
help
Set this option to use bridge BBF vendor extensions.
config BRIDGEMNGR_BRIDGE_VENDOR_PREFIX
string "Package specific datamodel Vendor Prefix for TR181 extensions"
default ""
config BRIDGEMNGR_USE_DM_FRAMEWORK
bool "Use new DM framework support"
default y
endif

View File

@@ -1,93 +0,0 @@
#
# Copyright (C) 2020-2024 iopsys
#
include $(TOPDIR)/rules.mk
PKG_NAME:=bridgemngr
PKG_VERSION:=1.2.0
LOCAL_DEV:=0
ifneq ($(LOCAL_DEV),1)
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://dev.iopsys.eu/network/bridgemngr.git
PKG_SOURCE_VERSION:=c9370d04dd4784d1384458a7eb907431afef9099
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.zst
PKG_MIRROR_HASH:=skip
endif
PKG_LICENSE:=GPL-2.0-only
PKG_LICENSE_FILES:=LICENSE
include $(INCLUDE_DIR)/package.mk
include ../bbfdm/bbfdm.mk
include ../dm-framework/dm-framework.mk
define Package/bridgemngr
CATEGORY:=Utilities
TITLE:=Bridge Manager
DEPENDS:=+libuci +libubox +libubus +libblobmsg-json
DEPENDS+=+libbbfdm-api +libbbfdm-ubus +dm-service
DEPENDS+= +BRIDGEMNGR_USE_DM_FRAMEWORK:dm-framework
endef
define Package/bridgemngr/description
Package to add Device.Bridging. data model support.
endef
define Package/$(PKG_NAME)/config
source "$(SOURCE)/Config.in"
endef
ifneq ($(CONFIG_BRIDGEMNGR_USE_DM_FRAMEWORK),y)
MAKE_PATH:=src
endif
ifeq ($(CONFIG_BRIDGEMNGR_BRIDGE_VENDOR_PREFIX),"")
VENDOR_PREFIX = $(CONFIG_BBF_VENDOR_PREFIX)
else
VENDOR_PREFIX = $(CONFIG_BRIDGEMNGR_BRIDGE_VENDOR_PREFIX)
endif
TARGET_CFLAGS += -DBBF_VENDOR_PREFIX=\\\"$(VENDOR_PREFIX)\\\"
ifeq ($(CONFIG_BRIDGEMNGR_BRIDGE_VLAN),y)
TARGET_CFLAGS += -DBRIDGE_VLAN_BACKEND
endif
ifeq ($(CONFIG_BRIDGEMNGR_COPY_PBITS),y)
TARGET_CFLAGS+=-DBRIDGEMNGR_COPY_PBITS
endif
ifeq ($(CONFIG_BRIDGEMNGR_USE_DM_FRAMEWORK),y)
define Build/Compile
$(call Build/Compile/DM,$(PKG_BUILD_DIR)/dmf,$(PKG_BUILD_DIR)/dmf,$(VENDOR_PREFIX))
endef
endif
define Package/bridgemngr/install
$(INSTALL_DIR) $(1)/etc/init.d
$(INSTALL_DIR) $(1)/etc/config
ifeq ($(CONFIG_BRIDGEMNGR_USE_DM_FRAMEWORK),y)
$(call Build/Install/DM,$(PKG_BUILD_DIR)/dmf,$(PKG_BUILD_DIR)/dmf,$(1),bridgemngr)
else
$(BBFDM_REGISTER_SERVICES) ./bbfdm_service.json $(1) $(PKG_NAME)
$(BBFDM_INSTALL_MS_DM) $(PKG_BUILD_DIR)/src/libbridgemngr.so $(1) $(PKG_NAME)
ifeq ($(CONFIG_BRIDGEMNGR_BRIDGE_VENDOR_EXT), y)
$(BBFDM_INSTALL_MS_PLUGIN) $(PKG_BUILD_DIR)/src/libbridgeext.so $(1) $(PKG_NAME) 10
$(BBFDM_INSTALL_MS_PLUGIN) -v ${VENDOR_PREFIX} ./files/VLAN_Filtering_Extension.json $(1) $(PKG_NAME) 11
endif
endif
$(INSTALL_BIN) ./files/etc/init.d/bridging $(1)/etc/init.d/
$(INSTALL_DATA) ./files/etc/config/bridging $(1)/etc/config/
endef
ifeq ($(LOCAL_DEV),1)
define Build/Prepare
$(CP) ~/git/bridgemngr/* $(PKG_BUILD_DIR)/
endef
endif
$(eval $(call BuildPackage,bridgemngr))

View File

@@ -1,31 +0,0 @@
{
"json_plugin_version": 2,
"Device.Bridging.Bridge.{i}.": {
"type": "object",
"protocols": [
"cwmp",
"usp"
],
"access": true,
"array": true,
"{BBF_VENDOR_PREFIX}VLANFiltering": {
"type": "boolean",
"read": true,
"write": true,
"protocols": [
"cwmp",
"usp"
],
"datatype": "boolean",
"description": "Enable or disable VLAN Filtering on this bridge.",
"mapping": [
{
"data": "@Parent",
"type": "uci_sec",
"key": "vlan_filtering"
}
]
}
}
}

View File

@@ -14,7 +14,7 @@ ifneq ($(LOCAL_DEV),1)
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://dev.iopsys.eu/bbf/bulkdata.git
PKG_SOURCE_VERSION:=f54550f2d587a701c0a8d5cac4a0910a99ce92cf
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.zst
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
PKG_MIRROR_HASH:=skip
endif

View File

@@ -11,7 +11,7 @@ PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://dev.iopsys.eu/bulut/bulut-gw-client.git
PKG_SOURCE_VERSION:=227700c44817afa2c392fa08bf4cf70fa6177f01
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.zst
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
PKG_MIRROR_HASH:=skip
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)

View File

@@ -12,7 +12,7 @@ ifneq ($(LOCAL_DEV),1)
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://dev.iopsys.eu/network/ddnsmngr.git
PKG_SOURCE_VERSION:=44af9a7b3fec3929f8554af9633a5b8068189b48
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.zst
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
PKG_MIRROR_HASH:=skip
endif

View File

@@ -6,14 +6,14 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=decollector
PKG_VERSION:=6.2.3.9
PKG_VERSION:=6.2.2.7
LOCAL_DEV=0
ifneq ($(LOCAL_DEV),1)
PKG_SOURCE_PROTO:=git
PKG_SOURCE_VERSION:=d1d948a48952fe2091e84af1293a6e77857439cf
PKG_SOURCE_VERSION:=9d1399c09f55da14a8de55828ba57c0e296ce62f
PKG_SOURCE_URL:=https://dev.iopsys.eu/multi-ap/decollector.git
PKG_SOURCE:=$(PKG_NAME)-$(PKG_SOURCE_VERSION).tar.zst
PKG_SOURCE:=$(PKG_NAME)-$(PKG_SOURCE_VERSION).tar.gz
PKG_MIRROR_HASH:=skip
endif
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
@@ -32,7 +32,6 @@ define Package/decollector
TITLE:=WiFi DataElements Collector Proxy
DEPENDS:=+libuci +libubox +ubus +libpthread +libnl-genl \
+libeasy +libwifiutils +libieee1905 +ieee1905-map-plugin
DEPENDS+=+libbbfdm-api +libbbfdm-ubus
endef
define Package/decollector/description

View File

@@ -2,13 +2,13 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=dectmngr
PKG_RELEASE:=3
PKG_VERSION:=3.7.13
PKG_VERSION:=3.7.11
LOCAL_DEV=0
ifneq ($(LOCAL_DEV),1)
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/dectmngr.git
PKG_SOURCE_PROTO:=git
PKG_SOURCE_VERSION:=5c2720563b3ed889e9d4de6fdb9b0f6a9d584094
PKG_SOURCE_VERSION:=815ee44808169b8e1efa2cac44bd7d238ad33cdc
PKG_MIRROR_HASH:=skip
endif
@@ -20,7 +20,7 @@ export BUILD_DIR
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.zst
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
PKG_BUILD_PARALLEL:=1
include $(INCLUDE_DIR)/package.mk

View File

@@ -1,12 +0,0 @@
if PACKAGE_dhcpmngr
config DHCPMNGR_ENABLE_VENDOR_EXT
bool "Use datamodel vendor extensions"
default y
help
Set this option to use bridge BBF vendor extensions.
config DHCPMNGR_VENDOR_PREFIX
string "Package specific datamodel Vendor Prefix for TR181 extensions"
default ""
endif

View File

@@ -5,14 +5,14 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=dhcpmngr
PKG_VERSION:=1.1.6
PKG_VERSION:=1.0.6
LOCAL_DEV:=0
ifneq ($(LOCAL_DEV),1)
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://dev.iopsys.eu/network/dhcpmngr.git
PKG_SOURCE_VERSION:=74d96cd70119e4ea08767d68b45b4922162d0328
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.zst
PKG_SOURCE_VERSION:=986f66608959f4f589009d580b046e250d8c620d
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
PKG_MIRROR_HASH:=skip
endif
@@ -39,22 +39,6 @@ define Package/dhcpmngr/description
Package to add Device.DHCPv4. and Device.DHCPv6. data model support.
endef
define Package/$(PKG_NAME)/config
source "$(SOURCE)/Config.in"
endef
ifeq ($(CONFIG_DHCPMNGR_ENABLE_VENDOR_EXT),y)
MAKE_FLAGS += DHCPMNGR_ENABLE_VENDOR_EXT=y
endif
ifeq ($(CONFIG_DHCPMNGR_VENDOR_PREFIX),"")
VENDOR_PREFIX = $(CONFIG_BBF_VENDOR_PREFIX)
else
VENDOR_PREFIX = $(CONFIG_DHCPMNGR_VENDOR_PREFIX)
endif
TARGET_CFLAGS += -DBBF_VENDOR_PREFIX=\\\"$(VENDOR_PREFIX)\\\"
ifeq ($(LOCAL_DEV),1)
define Build/Prepare
$(CP) -rf ~/git/dhcpmngr/* $(PKG_BUILD_DIR)/

View File

@@ -1,91 +1,207 @@
#
# Copyright (c) 2025 IOPSYS
# Copyright (c) 2023 Genexis B.V. All rights reserved.
# This Software and its content are protected by the Dutch Copyright Act
# ('Auteurswet'). All and any copying and distribution of the software
# and its content without authorization by Genexis B.V. is
# prohibited. The prohibition includes every form of reproduction and
# distribution.
#
#
include $(TOPDIR)/rules.mk
PKG_NAME:=dm-framework
PKG_VERSION:=1.0.4
PKG_VERSION:=1.0.0
PKG_RELEASE:=1
USE_LOCAL:=0
ifneq ($(USE_LOCAL),1)
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://dev.iopsys.eu/lcm/dm-framework.git
PKG_SOURCE_VERSION:=9e92a5cdf74fd3754a76498ab2da23423843c22a
PKG_SOURCE_VERSION:=37dade4a2df6eaf6a4291a06ac776641ed81a79e
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
PKG_MIRROR_HASH:=skip
endif
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
PKG_LICENSE:=BSD-3-Clause
PKG_LICENSE_FILES:=LICENSE
# Build directories for each component
DATAMODELS_BUILD_DIR:=$(PKG_BUILD_DIR)/datamodels-build
DMAPI_BUILD_DIR:=$(PKG_BUILD_DIR)/dm-api-build
DMAGENT_BUILD_DIR:=$(PKG_BUILD_DIR)/dm-agent-build
include $(INCLUDE_DIR)/package.mk
include ../bbfdm/bbfdm.mk
-include $(TOPDIR)/feeds/iopsys/bbfdm/bbfdm.mk
define Package/dm-framework
#
# Datamodels Package Definition
#
define Package/datamodels
SECTION:=utils
CATEGORY:=Genexis
TITLE:=DM JS Framework
TITLE:=dm-framework Datamodel
URL:=http://www.genexis.eu
DEPENDS:=+libsqlite3 +libjson-c +libstdcpp +quickjs +libubus +libubox +libuci +ubus
PKG_LICENSE:=GENEXIS
PKG_LICENSE_URL:=
endef
define Package/dm-framework/description
JS based TR181 datamodel framework
define Package/datamodels/description
This package contains dm-framework datamodel.
endef
#
# DM-API Package Definition
#
define Package/dm-api
CATEGORY:=Genexis
TITLE:=dm-api
PKG_BUILD_DEPENDS:=datamodels
DEPENDS:=+libsqlite3 \
+libjson-c +libstdcpp +quickjs \
+libubus +libubox +libuci
URL:=http://www.genexis.eu
PKG_LICENSE:=GENEXIS
PKG_LICENSE_URL:=
endef
define Package/dm-api/description
This package contains api for the dm-framework
endef
#
# DM-Agent Package Definition
#
define Package/dm-agent
DEPENDS:=+dm-api +datamodels +libubox +libubus +ubus
CATEGORY:=Genexis
TITLE:=dm-framework agent
URL:=http://www.genexis.eu
PKG_LICENSE:=GENEXIS
PKG_LICENSE_URL:=
endef
define Package/dm-agent/description
This package contains dm-framework agent.
endef
#
# Build Preparation
#
define Build/Prepare
$(call Build/Prepare/Default)
# Prepare datamodels
mkdir -p $(DATAMODELS_BUILD_DIR)
$(CP) -rf $(PKG_BUILD_DIR)/datamodels/* $(DATAMODELS_BUILD_DIR)/
# Copy scripts from top-level scripts directory
mkdir -p $(DATAMODELS_BUILD_DIR)/scripts
$(CP) -rf $(PKG_BUILD_DIR)/scripts/* $(DATAMODELS_BUILD_DIR)/scripts/
cd $(DATAMODELS_BUILD_DIR); \
npm install better-sqlite3 quickjs && \
node ./scripts/json2code.js && \
node ./scripts/qjs-handlers-validate.js
# Prepare dm-api
mkdir -p $(DMAPI_BUILD_DIR)
$(CP) -rf $(PKG_BUILD_DIR)/dm-api/* $(DMAPI_BUILD_DIR)/
# Prepare dm-agent
mkdir -p $(DMAGENT_BUILD_DIR)
$(CP) -rf $(PKG_BUILD_DIR)/dm-agent/* $(DMAGENT_BUILD_DIR)/
endef
TARGET_CFLAGS += $(FPIC)
ifeq ($(USE_LOCAL),1)
define Build/Prepare
$(CP) ~/git/dm-framework/* $(PKG_BUILD_DIR)/
endef
endif
#
# Build Compilation
#
define Build/Compile
# Build datamodels first (dependency for others)
$(MAKE) -C $(DATAMODELS_BUILD_DIR)\
PROJECT_ROOT="$(DATAMODELS_BUILD_DIR)" \
CROSS_COMPILE="$(TARGET_CROSS)" \
ARCH="$(LINUX_KARCH)" \
EXTRA_CFLAGS="$(TARGET_CFLAGS) -I$(DATAMODELS_BUILD_DIR)" \
all
define Package/dm-framework/install
$(INSTALL_DIR) $(1)/etc/init.d
$(INSTALL_BIN) ./files/etc/init.d/dmf $(1)/etc/init.d/
# Build dm-api (depends on datamodels)
$(MAKE) -C $(DMAPI_BUILD_DIR)\
PROJECT_ROOT="$(DMAPI_BUILD_DIR)" \
CROSS_COMPILE="$(TARGET_CROSS)" \
ARCH="$(LINUX_KARCH)" \
EXTRA_CFLAGS="$(TARGET_CFLAGS) -I$(DMAPI_BUILD_DIR)" \
all
$(INSTALL_DIR) $(1)/usr/lib
$(INSTALL_BIN) $(PKG_BUILD_DIR)/dm-api/libdmapi.so $(1)/usr/lib/
$(INSTALL_DIR) $(1)/etc/bbfdm/dmf
$(INSTALL_BIN) $(PKG_BUILD_DIR)/dm-api/quickjs/uci.js $(1)/etc/bbfdm/dmf/
$(INSTALL_BIN) $(PKG_BUILD_DIR)/dm-api/quickjs/utils.js $(1)/etc/bbfdm/dmf/
$(INSTALL_DIR) $(1)/usr/sbin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/dm-agent/dm-agent $(1)/usr/sbin
$(INSTALL_DIR) $(1)/etc/dm-framework
$(INSTALL_BIN) ./files/etc/dm-framework/dmf_apply_handler.sh $(1)/etc/dm-framework/
$(INSTALL_BIN) ./files/etc/dm-framework/dmf_revert_handler.sh $(1)/etc/dm-framework/
$(BBFDM_REGISTER_SERVICES) ./dmf_service.json $(1) dmf
# Build dm-agent (depends on both)
$(MAKE) -C $(DMAGENT_BUILD_DIR)\
PROJECT_ROOT="$(DMAGENT_BUILD_DIR)" \
CROSS_COMPILE="$(TARGET_CROSS)" \
ARCH="$(LINUX_KARCH)" \
EXTRA_CFLAGS="$(TARGET_CFLAGS) -I$(DMAGENT_BUILD_DIR)" \
all
endef
#
# Development Installation (headers and libraries)
#
define Build/InstallDev
# DM-API development files - headers are now in dm-api/include/
# Datamodels development files
$(INSTALL_DIR) $(1)/usr/include
$(CP) $(PKG_BUILD_DIR)/dm-api/include/dm_types.h $(1)/usr/include/
$(CP) $(PKG_BUILD_DIR)/dm-api/include/dm_node.h $(1)/usr/include/
$(CP) $(PKG_BUILD_DIR)/dm-api/core/dm_api.h $(1)/usr/include/
$(CP) $(PKG_BUILD_DIR)/dm-api/core/dm_linker.h $(1)/usr/include/
$(CP) $(PKG_BUILD_DIR)/dm-api/core/dbmgr.h $(1)/usr/include/
$(CP) $(PKG_BUILD_DIR)/dm-api/include/dm_log.h $(1)/usr/include/
$(CP) $(PKG_BUILD_DIR)/dm-api/utils/dm_list.h $(1)/usr/include/
$(INSTALL_DIR) $(1)/usr/lib
$(CP) $(PKG_BUILD_DIR)/dm-api/libdmapi.so $(1)/usr/lib/
$(CP) $(DATAMODELS_BUILD_DIR)/dm.h $(1)/usr/include/
$(CP) $(DATAMODELS_BUILD_DIR)/libdm.so $(1)/usr/lib/
# Install json2code.js script and package.json to staging for other packages to use
$(INSTALL_DIR) $(1)/usr/lib/dm-framework/scripts
$(CP) $(PKG_BUILD_DIR)/scripts/json2code.js $(1)/usr/lib/dm-framework/scripts/
$(CP) $(PKG_BUILD_DIR)/scripts/package.json $(1)/usr/lib/dm-framework/scripts/
# DM-API development files - headers are now in dm-api/include/
$(CP) $(DMAPI_BUILD_DIR)/include/dm_types.h $(1)/usr/include/
$(CP) $(DMAPI_BUILD_DIR)/include/dm_node.h $(1)/usr/include/
$(CP) $(DMAPI_BUILD_DIR)/core/dm_api.h $(1)/usr/include/
$(CP) $(DMAPI_BUILD_DIR)/core/dm_linker.h $(1)/usr/include/
$(CP) $(DMAPI_BUILD_DIR)/core/dbmgr.h $(1)/usr/include/
$(CP) $(DMAPI_BUILD_DIR)/include/dm_log.h $(1)/usr/include/
$(CP) $(DMAPI_BUILD_DIR)/utils/dm_list.h $(1)/usr/include/
$(CP) $(DMAPI_BUILD_DIR)/libdmapi.so $(1)/usr/lib/
endef
$(eval $(call BuildPackage,dm-framework))
#
# Package Installation - Datamodels
#
define Package/datamodels/install
$(INSTALL_DIR) $(1)/usr/lib
$(INSTALL_DIR) $(1)/etc/config
$(INSTALL_DIR) $(1)/etc/bbfdm
$(INSTALL_DIR) $(1)/usr/lib/dmf_handlers
$(INSTALL_BIN) $(DATAMODELS_BUILD_DIR)/default.db $(1)/etc/bbfdm/default_dm.db
$(INSTALL_BIN) $(DATAMODELS_BUILD_DIR)/libdm.so $(1)/usr/lib/
# Copy handler files from datamodels directory (new structure)
# Copy .js files from root datamodels directory
( cd $(DATAMODELS_BUILD_DIR); \
find . -maxdepth 1 -type f -name '*.js' -not -path './.*' -exec $(INSTALL_BIN) {} $(1)/usr/lib/dmf_handlers/{} \; )
# Copy .js files from subdirectories, preserving folder structure (skip hidden files/folders)
( cd $(DATAMODELS_BUILD_DIR); \
find . -type d -mindepth 1 -not -path './.*' -not -path './scripts*' -exec $(INSTALL_DIR) $(1)/usr/lib/dmf_handlers/{} \; ; \
find . -type f -name '*.js' -mindepth 2 -not -path './.*' -not -path './scripts*' -exec $(INSTALL_BIN) {} $(1)/usr/lib/dmf_handlers/{} \; )
endef
#
# Package Installation - DM-API
#
define Package/dm-api/install
$(INSTALL_DIR) $(1)/usr/lib
$(INSTALL_DIR) $(1)/sbin/
$(INSTALL_BIN) $(DMAPI_BUILD_DIR)/libdmapi.so $(1)/usr/lib/
endef
#
# Package Installation - DM-Agent
#
define Package/dm-agent/install
$(INSTALL_DIR) $(1)/usr/sbin
$(INSTALL_DIR) $(1)/etc/init.d
$(INSTALL_DIR) $(1)/etc/config
$(INSTALL_BIN) ./files/etc/init.d/bridging $(1)/etc/init.d/
$(INSTALL_DATA) ./files/etc/config/bridging $(1)/etc/config/
$(BBFDM_REGISTER_SERVICES) ./bbfdm_service.json $(1) dm-agent
$(INSTALL_BIN) $(DMAGENT_BUILD_DIR)/dm-agent $(1)/usr/sbin
endef
# Register all three packages
$(eval $(call BuildPackage,datamodels))
$(eval $(call BuildPackage,dm-api))
$(eval $(call BuildPackage,dm-agent))

View File

@@ -2,6 +2,7 @@
"daemon": {
"enable": "1",
"service_name": "bridgemngr",
"dm-framework": true,
"unified_daemon": false,
"services": [
{

View File

@@ -1,33 +0,0 @@
# dm-framework.mk - Common rules for DM Framework
DM_SCRIPT_DIR ?= $(STAGING_DIR)/usr/lib/dm-framework/scripts
JSON2CODE = $(DM_SCRIPT_DIR)/json2code.js
# Macro to generate code
# $(1): Input directory (datamodels)
# $(2): Output directory (where generated files go)
# $(3): Vendor Prefix (optional)
define Build/Compile/DM
$(INSTALL_DIR) $(2)
@# Install npm dependencies if not already installed
@if [ ! -d "$(DM_SCRIPT_DIR)/node_modules" ]; then \
cd $(DM_SCRIPT_DIR) && npm install --production; \
fi
node $(JSON2CODE) -i $(1) -o $(2) $(if $(3),--vendor-prefix $(3))
$(TARGET_CC) $(TARGET_CFLAGS) -I$(2) -I$(STAGING_DIR)/usr/include/ -fPIC -c $(2)/dm.c -o $(2)/dm.o
$(TARGET_CC) $(TARGET_LDFLAGS) -shared -o $(2)/lib$(PKG_NAME).so $(2)/dm.o
endef
# Macro to install DM
# $(1): Input directory (datamodels)
# $(2): Output directory (build dir)
# $(3): Destination directory (rootfs)
# $(4): Package Name (subdir in /etc/bbfdm/dmf)
define Build/Install/DM
$(INSTALL_DIR) $(3)/etc/bbfdm/dmf/$(4)
$(CP) $(2)/lib$(PKG_NAME).so $(3)/etc/bbfdm/dmf/$(4)/
$(CP) $(1)/*.js $(3)/etc/bbfdm/dmf/$(4)/
$(CP) $(2)/default.db $(3)/etc/bbfdm/dmf/default_dm.db
$(CP) $(2)/exports.js $(3)/etc/bbfdm/dmf/$(4)/exports.js
$(CP) $(2)/dm_consts.js $(3)/etc/bbfdm/dmf/$(4)/dm_consts.js
endef

View File

@@ -1,36 +0,0 @@
{
"daemon": {
"enable": "1",
"service_name": "dmf",
"unified_daemon": true,
"services": [
{
"parent_dm": "Device.",
"object": "Bridging"
}
],
"config": {
"loglevel": "3"
},
"pre_apply_handler": {
"uci": [
{
"file": [
"network"
],
"external_handler": "/etc/dm-framework/dmf_apply_handler.sh"
}
]
},
"revert_handler": {
"uci": [
{
"file": [
"network"
],
"external_handler": "/etc/dm-framework/dmf_revert_handler.sh"
}
]
}
}
}

View File

@@ -1,11 +0,0 @@
#!/bin/sh
. /usr/share/libubox/jshn.sh
logger -t dmf.commit_handler "Inputs [$@]"
json_init
json_add_string "cmd" "commit"
json_compact
data="$(json_dump)"
ubus -t 5 call bbfdm.dmf transaction "${data}"

View File

@@ -1,11 +0,0 @@
#!/bin/sh
. /usr/share/libubox/jshn.sh
logger -t dmf.revert_handler "Inputs [$@]"
json_init
json_add_string "cmd" "abort"
json_compact
data="$(json_dump)"
ubus -t 5 call bbfdm.dmf transaction "${data}"

View File

@@ -77,6 +77,7 @@ handle_ebtables_rule() {
}
start_service() {
ubus -t 30 wait_for network.device uci
config_load bridging
config_foreach handle_ebtables_chain chain
config_foreach handle_ebtables_rule rule

View File

@@ -1,12 +0,0 @@
#!/bin/sh /etc/rc.common
START=85
STOP=05
USE_PROCD=1
start_service() {
procd_open_instance dmf
procd_set_param command "/usr/sbin/dm-agent"
procd_set_param respawn
procd_close_instance
}

View File

@@ -1,48 +0,0 @@
#
# Copyright (c) 2023 Genexis Netherlands B.V. All rights reserved.
# This Software and its content are protected by the Dutch Copyright Act
# ('Auteurswet'). All and any copying and distribution of the software
# and its content without authorization by Genexis Netherlands B.V. is
# prohibited. The prohibition includes every form of reproduction and
# distribution.
#
include $(TOPDIR)/rules.mk
PKG_NAME:=dmcli-plugins
PKG_LICENSE:=PROPRIETARY GENEXIS
PKG_VERSION:=2.2.6
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://dev.iopsys.eu/gnx/dmcli-plugin-easydm.git
PKG_SOURCE_VERSION:=bc8b8527e8a41bdba73cb277a3c6c3b42b045153
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.xz
PKG_MIRROR_HASH:=skip
PKG_BUILD_PARALLEL:=1
include $(INCLUDE_DIR)/package.mk
define Package/dmcli-plugins
SECTION:=tools
CATEGORY:=Genexis
TITLE:=Easy-to-use data model on top of TR181
URL:=http://genexis.eu
DEPENDS:=+dmcli
endef
define Package/dmcli-plugins/description
EasyDM offers a user-friendly approach to configuring TR-181
simplifying the process with its intuitive interface.
endef
define Build/Compile
true
endef
define Package/dmcli-plugins/install
$(INSTALL_DIR) $(1)/usr/lib/dmcli/plugins
$(CP) $(PKG_BUILD_DIR)/src/*.js $(1)/usr/lib/dmcli/plugins/
endef
$(eval $(call BuildPackage,dmcli-plugins))

View File

@@ -1,9 +0,0 @@
if PACKAGE_dmcli
config DMCLI_REMOTE_CONNECTION
bool "Add dmcli remote controller configuration"
default n
help
This adds a usp controller configuration for dmcli remote connection from different machine/laptop/server.
endif

View File

@@ -1,76 +0,0 @@
#
# Copyright (c) 2021 Genexis Netherlands B.V. All rights reserved.
# This Software and its content are protected by the Dutch Copyright Act
# ('Auteurswet'). All and any copying and distribution of the software
# and its content without authorization by Genexis Netherlands B.V. is
# prohibited. The prohibition includes every form of reproduction and
# distribution.
#
include $(TOPDIR)/rules.mk
PKG_NAME:=dmcli
PKG_LICENSE:=PROPRIETARY GENEXIS
PKG_VERSION:=1.9.9
PKG_RELEASE:=1
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://dev.iopsys.eu/gnx/dmcli.git
PKG_SOURCE_VERSION:=3e2cdeab76552df2c63a74fe74e5d7f1e6749f9b
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.xz
PKG_MIRROR_HASH:=skip
PKG_BUILD_PARALLEL:=1
include $(INCLUDE_DIR)/package.mk
define Package/dmcli
SECTION:=tools
CATEGORY:=Genexis
TITLE:=DMCLI (datamodel-based CLI)
URL:=http://genexis.eu
DEPENDS:=+usp-js +DMCLI_REMOTE_CONNECTION:mosquitto-auth-plugin +shadow-utils +@BUSYBOX_CONFIG_ADDUSER
endef
define Package/dmcli/description
CLI to view and configure datamodels of CPE
endef
define Package/dmcli/conffiles
/etc/dmcli/dmcli.conf
endef
define Package/dmcli/config
source "$(SOURCE)/Config.in"
endef
define Package/dmcli/install
$(INSTALL_DIR) $(1)/usr/bin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/dmcli $(1)/usr/bin/
$(INSTALL_DIR) $(1)/usr/lib/dmcli
$(CP) $(PKG_BUILD_DIR)/common $(1)/usr/lib/dmcli/
mv $(1)/usr/lib/dmcli/common/os_qjs.js $(1)/usr/lib/dmcli/common/os.js
rm $(1)/usr/lib/dmcli/common/os_node.js
$(CP) $(PKG_BUILD_DIR)/core $(1)/usr/lib/dmcli/
$(CP) $(PKG_BUILD_DIR)/cli $(1)/usr/lib/dmcli/
$(CP) $(PKG_BUILD_DIR)/data $(1)/usr/lib/dmcli/
$(CP) $(PKG_BUILD_DIR)/plugins $(1)/usr/lib/dmcli/
$(INSTALL_DIR) $(1)/etc/uci-defaults
$(INSTALL_DATA) ./files/etc/uci-defaults/36-dmcli $(1)/etc/uci-defaults/
ifeq ($(CONFIG_DMCLI_REMOTE_CONNECTION),y)
$(INSTALL_DATA) ./files/etc/uci-defaults/36-dmcli-remote $(1)/etc/uci-defaults/
else
$(INSTALL_DATA) ./files/etc/uci-defaults/36-dmcli-remote-remove $(1)/etc/uci-defaults/
endif
$(INSTALL_DIR) $(1)/etc/dmcli
$(CP) ./files/etc/dmcli/dmcli.acl $(1)/etc/dmcli/
$(CP) ./files/etc/dmcli/dmcli.conf $(1)/etc/dmcli/
$(INSTALL_DIR) $(1)/etc/users/roles/
$(INSTALL_DATA) ./files/etc/users/roles/operator.json $(1)/etc/users/roles/
endef
$(eval $(call BuildPackage,dmcli))

View File

@@ -1,4 +0,0 @@
user operator
topic read /usp/operator/controller/reply-to
topic read /usp/operator/controller
topic write /usp/operator/endpoint

View File

@@ -1,45 +0,0 @@
{
"Settings": {
"USP": {
"ActiveConnectionProfile": "local",
"ConnectionProfile": [
{
"Name": "local",
"Host": "127.0.0.1",
"Port": 9002,
"Username": "operator",
"Protocol": "ws",
"FromId": "oui:000F94:device-controller-operator",
"PublishEndpoint": "/usp/operator/endpoint",
"SubscribeEndpoint": "/usp/operator/controller"
}
],
"Session": {
"AutoStart": false
},
"Notification": {
"LogTo": "console",
"Format": "brief",
"LogFile": "usp-notification.log"
}
},
"CLI": {
"Home": "/",
"Color": "true",
"Mode": "Command",
"ShowCommandTime": false,
"SortDMTree": false
},
"Prompt": {
"Auto": true,
"Color": "default",
"SelectedBackgroundColor": "yellow",
"PageSize": "3",
"AutoPromptOnEmptyCommand": false,
"AutoPromptInstanceNumbers": false
},
"Log": {
"Level": "Error"
}
}
}

View File

@@ -1,120 +0,0 @@
#!/bin/sh
. /lib/functions.sh
. /lib/functions/iopsys-environment.sh
. /usr/share/libubox/jshn.sh
DMCLI_CONF="/etc/dmcli/dmcli.conf"
CONTROLLER_ID='oui:000F94:device-controller-operator'
DMCLI_RESP_TOPIC="/usp/operator/endpoint"
DMCLI_CTRL_TOPIC="/usp/operator/controller"
DMCLI_PORT="9002"
grep -q "^operator:" /etc/passwd || {
adduser -g 'Operator' -D -H -s /usr/bin/dmcli --home '/usr/lib/dmcli' 'operator'
hash=""
if type get_operator_password_hash > /dev/null 2>&1; then
hash=$(get_operator_password_hash)
fi
if [ -z "$hash" ]; then
hash='$6$zP4Wk/VQJOLwwofC$teuhnYFQBcA8YUZo/Q0quDMi4SsOHmfBcyvt5VNchPnzgwF1nfNNliC3yBVW22NwmwttPEWeBEBfnMTBB0rYs/'
fi
echo "operator:${hash}" | chpasswd -e
}
grep -q "^/usr/bin/dmcli$" /etc/shells || {
echo '/usr/bin/dmcli' >> /etc/shells
}
uci -q del_list sshd.@sshd[0].AllowUsers='operator'
uci -q add_list sshd.@sshd[0].AllowUsers='operator'
uci -q delete users.operator
uci -q set users.operator=user
uci -q set users.operator.enabled=1
uci -q set users.operator.shell='dmcli'
uci -q set users.operator.member_roles='operator'
if [ -f "/etc/config/mosquitto" ]; then
uci_add mosquitto listener dmcli_local
uci_set mosquitto dmcli_local enabled 1
uci_set mosquitto dmcli_local port "${DMCLI_PORT}"
uci_set mosquitto dmcli_local protocol 'websockets'
uci_set mosquitto dmcli_local acl_file '/etc/dmcli/dmcli.acl'
uci_set mosquitto dmcli_local no_remote_access '1'
uci_set mosquitto dmcli_local allow_anonymous '1'
fi
if [ -f "/etc/config/obuspa" ]; then
uci_add obuspa mqtt mqtt_operator
uci_set obuspa mqtt_operator BrokerAddress '127.0.0.1'
uci_set obuspa mqtt_operator BrokerPort '1883'
uci_set obuspa mqtt_operator TransportProtocol 'TCP/IP'
uci_add obuspa mtp mtp_operator
uci_set obuspa mtp_operator Protocol 'MQTT'
uci_set obuspa mtp_operator ResponseTopicConfigured "${DMCLI_RESP_TOPIC}"
uci_set obuspa mtp_operator mqtt 'mqtt_operator'
uci_add obuspa controller controller_operator
uci_set obuspa controller_operator EndpointID "${CONTROLLER_ID}"
uci_set obuspa controller_operator Protocol 'MQTT'
uci_set obuspa controller_operator Topic "${DMCLI_CTRL_TOPIC}"
uci_set obuspa controller_operator mqtt 'mqtt_operator'
uci_set obuspa controller_operator assigned_role_name 'operator'
fi
_get_endpoint_id() {
local id serial oui
id="$(uci -q get obuspa.localagent.EndpointID)"
if [ -n "${id}" ]; then
echo "${id}"
return 0
fi
serial="$(db -q get device.deviceinfo.SerialNumber)"
oui="$(db -q get device.deviceinfo.ManufacturerOUI)"
echo "os::${oui}-${serial//+/%2B}"
}
update_dmcli_conf() {
local endpointid confTmpFile
local port fromid publish subscribe toid
if [ -f "${DMCLI_CONF}" ]; then
endpointid="$(_get_endpoint_id)"
json_load_file "${DMCLI_CONF}" || return
json_select "Settings" || return
json_select "USP" || return
json_select "ConnectionProfile" || return
json_select "1" || return
json_get_var port "Port"
json_get_var fromid "FromId"
json_get_var publish "PublishEndpoint"
json_get_var subscribe "SubscribeEndpoint"
json_get_var toid "ToId"
json_add_int "Port" "${DMCLI_PORT}"
json_add_string "FromId" "${CONTROLLER_ID}"
json_add_string "PublishEndpoint" "${DMCLI_RESP_TOPIC}"
json_add_string "SubscribeEndpoint" "${DMCLI_CTRL_TOPIC}"
json_add_string "ToId" "${endpointid}"
json_select ..
json_select ..
json_select ..
json_select ..
if [ "${port}" != "${DMCLI_PORT}" ] || [ "${fromid}" != "${CONTROLLER_ID}" ] || \
[ "${publish}" != "${DMCLI_RESP_TOPIC}" ] || [ "${subscribe}" != "${DMCLI_CTRL_TOPIC}" ] || \
[ "${toid}" != "${endpointid}" ]; then
confTmpFile="$(mktemp -u -p "$(dirname "$DMCLI_CONF")" "$(basename "$DMCLI_CONF").XXXXXXX")"
json_pretty
json_dump > "${confTmpFile}" || return
mv -f "${confTmpFile}" "${DMCLI_CONF}" || return
fi
fi
}
update_dmcli_conf || exit

View File

@@ -1,14 +0,0 @@
#!/bin/sh
. /lib/functions.sh
if [ -f "/etc/config/mosquitto" ]; then
uci_add mosquitto listener dmcli
uci_set mosquitto dmcli enabled 1
uci_set mosquitto dmcli port '9003'
uci_set mosquitto dmcli protocol 'websockets'
uci_set mosquitto dmcli auth_plugin '/usr/lib/mosquitto_auth_plugin.so'
uci_set mosquitto dmcli acl_file '/etc/dmcli/dmcli.acl'
fi
exit 0

View File

@@ -1,9 +0,0 @@
#!/bin/sh
. /lib/functions.sh
if [ -f "/etc/config/mosquitto" ]; then
uci_remove mosquitto dmcli
fi
exit 0

View File

@@ -1,14 +0,0 @@
{
"tr181": {
"name": "operator",
"instance": 6,
"permission": [
{
"object": "Device.",
"perm": [
"PERMIT_ALL"
]
}
]
}
}

View File

@@ -1,7 +0,0 @@
all: dmcli
dmcli: main.c
$(CC) $(CFLAGS) -Wall -Werror -o $@ $^
clean:
rm -f dmcli

View File

@@ -1,32 +0,0 @@
/*
* Copyright (c) 2021 Genexis Netherlands B.V. All rights reserved.
* This Software and its content are protected by the Dutch Copyright Act
* ('Auteurswet'). All and any copying and distribution of the software
* and its content without authorization by Genexis Netherlands B.V. is
* prohibited. The prohibition includes every form of reproduction and
* distribution.
*/
#include <stdio.h>
#include <string.h>
#include <unistd.h>
/* C Wrapper for operator to login to the CLI via ssh: the shell in
* the passwd file cannot be a script that requires an interpreter. */
int main(int argc, char *argv[])
{
char *cmd[3 + (argc > 1 ? argc - 1 : 0)];
cmd[0] = "/usr/bin/qjs";
cmd[1] = "/usr/lib/dmcli/cli/main.js";
cmd[2] = NULL;
if (argc > 1) {
memcpy(&cmd[2], &argv[1], (argc - 1) * sizeof(char *));
cmd[2 + argc - 1] = NULL;
}
execv(cmd[0], cmd);
fprintf(stderr, "%s: command not found\n", cmd[0]);
return 127;
}

View File

@@ -5,14 +5,14 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=dnsmngr
PKG_VERSION:=1.0.21
PKG_VERSION:=1.0.18
LOCAL_DEV:=0
ifneq ($(LOCAL_DEV),1)
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://dev.iopsys.eu/network/dnsmngr.git
PKG_SOURCE_VERSION:=ef3714cc7555f763dfab626add8f90d7bc0a33b5
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.zst
PKG_SOURCE_VERSION:=80fa147e6f1f0d9c1a62a62a693ff3adaef45363
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
PKG_MIRROR_HASH:=skip
endif

View File

@@ -15,7 +15,7 @@ ifneq ($(LOCAL_DEV),1)
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://dev.iopsys.eu/hal/dslmngr.git
PKG_SOURCE_VERSION:=8fb4093b4d26b3cb06603e110d424005e33cf5d6
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.zst
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
PKG_MAINTAINER:=Rahul Thakur <rahul.thakur@iopsys.eu>
PKG_MIRROR_HASH:=skip
endif

View File

@@ -14,7 +14,7 @@ ifneq ($(LOCAL_DEV),1)
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://dev.iopsys.eu/network/ebtables-extensions.git
PKG_SOURCE_VERSION:=7357622d806833d93d317164dc6673fbf5fd1629
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.zst
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
PKG_MIRROR_HASH:=skip
endif

View File

@@ -5,13 +5,13 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=ethmngr
PKG_VERSION:=3.1.4
PKG_VERSION:=3.1.3
LOCAL_DEV:=0
ifneq ($(LOCAL_DEV),1)
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://dev.iopsys.eu/hal/ethmngr.git
PKG_SOURCE_VERSION:=0283fb5cb74a7baca46c4360da680757c57c86ac
PKG_SOURCE_VERSION:=7bc8297e1a74adb522f7635bab4f93a1a2620216
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)_$(PKG_SOURCE_VERSION).tar.xz
PKG_MIRROR_HASH:=skip
endif

View File

@@ -16,7 +16,7 @@ PKG_SOURCE_VERSION:=98af6019a4a1b478a6fa35f74528cb3cd404ae40
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://git.launchpad.net/fatrace
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_RELEASE)-$(PKG_SOURCE_VERSION).tar.zst
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_RELEASE)-$(PKG_SOURCE_VERSION).tar.gz
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)

View File

@@ -18,7 +18,7 @@ PKG_MIRROR_HASH:=skip
PKG_LICENSE:=GPLv2
PKG_LICENSE_FILES:=LICENSE
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.zst
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
PKG_BUILD_PARALLEL:=1
include $(INCLUDE_DIR)/package.mk

View File

@@ -5,14 +5,14 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=firewallmngr
PKG_VERSION:=1.0.12
PKG_VERSION:=1.0.10
LOCAL_DEV:=0
ifneq ($(LOCAL_DEV),1)
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://dev.iopsys.eu/network/firewallmngr.git
PKG_SOURCE_VERSION:=30319c67fb4db285a2bcd272b1c10bc040eecf19
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.zst
PKG_SOURCE_VERSION:=05ad0d6f7f21520eecd05429c14d1963de2a8463
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
PKG_MIRROR_HASH:=skip
endif

View File

@@ -1,13 +1,21 @@
#
# Copyright (C) 2024-2025 IOPSYS
#
include $(TOPDIR)/rules.mk
PKG_NAME:=fluent-bit
PKG_VERSION:=4.2.0
PKG_RELEASE:=1
PKG_VERSION:=4.0.4
PKG_RELEASE:=$(AUTORELEASE)
LOCAL_DEV:=0
ifneq ($(LOCAL_DEV),1)
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://github.com/fluent/fluent-bit.git
PKG_SOURCE_VERSION=v$(PKG_VERSION)
PKG_MIRROR_HASH:=cad2d94cf7a720a3910c781f80187e2c399aa8acbfa1046aa7445a4d1495fafd
PKG_SOURCE:=$(PKG_NAME)-v$(PKG_VERSION).tar.gz
PKG_MIRROR_HASH:=skip
endif
PKG_LICENSE:=Apache-2.0
PKG_LICENSE_FILES:=LICENSE
@@ -16,55 +24,52 @@ include $(INCLUDE_DIR)/package.mk
include $(INCLUDE_DIR)/cmake.mk
define Package/fluent-bit
SECTION:=admin
CATEGORY:=Administration
TITLE:=Fast and Lightweight Logs and Metrics processor
URL:=https://fluentbit.io/
DEPENDS:= +libyaml +libopenssl +libcurl +libstdcpp +libatomic +musl-fts +flex +bison \
+libsasl2 +@OPENSSL_WITH_NPN
CATEGORY:=Utilities
DEPENDS:= +libyaml +libopenssl +libcurl +libatomic +musl-fts +flex +bison +libstdcpp +@OPENSSL_WITH_NPN
TITLE:=Fluent-Bit
URL:=https://fluentbit.io/
endef
define Package/fluent-bit/description
Fluent Bit is a super fast, lightweight, and highly scalable logging
and metrics processor and forwarder.
Fluent Bit is a super fast, lightweight, and highly scalable logging and metrics processor and forwarder.
endef
define Package/fluent-bit/conffiles
/etc/fluent-bit/parsers.conf
ifeq ($(LOCAL_DEV),1)
define Build/Prepare
$(CP) -rf ./fluent-bit/* $(PKG_BUILD_DIR)/
endef
endif
# General options
TARGET_LDFLAGS +=-lfts -latomic
CMAKE_OPTIONS+= \
-DFLB_RELEASE=Yes \
-DFLB_SMALL=No \
-DEXCLUDE_FROM_ALL=true \
-DFLB_SHARED_LIB=Yes \
-DFLB_DEBUG=Yes \
-DFLB_ALL=No \
-DFLB_JEMALLOC=No \
-DFLB_EXAMPLES=No \
-DFLB_CHUNK_TRACE=No \
-DFLB_BACKTRACE=No \
-DFLB_KAFKA=No \
-DFLB_WASM=No \
-DFLB_LUAJIT=Yes \
-DWITH_SASL=No \
-DWITH_ZLIB=No \
-DWITH_ZSTD=No
CMAKE_OPTIONS += \
-DFLB_SMALL=Yes \
-DFLB_ALL=No \
-DFLB_DEBUG=Yes \
-DFLB_JEMALLOC=No \
-DFLB_KAFKA=No
-DFLB_LUAJIT=No
# In plugins
CMAKE_OPTIONS += \
-DFLB_IN_SYSLOG=Yes \
-DFLB_IN_CPU=Yes \
-DFLB_IN_MEM=Yes \
-DFLB_IN_DISK=Yes \
-DFLB_IN_EXEC=Yes \
-DFLB_IN_HEAD=Yes \
-DFLB_IN_KMSG=Yes \
-DFLB_IN_TAIL=Yes \
-DFLB_IN_PROC=No \
-DFLB_IN_EXEC=No \
-DFLB_IN_FORWARD=No \
-DFLB_IN_PROC=No \
-DFLB_IN_RANDOM=No \
-DFLB_IN_SERIAL=No \
-DFLB_IN_MQTT=No \
@@ -80,6 +85,7 @@ CMAKE_OPTIONS += \
-DFLB_IN_KUBERNETES_EVENTS=No \
-DFLB_IN_KAFKA=No \
-DFLB_IN_LIB=No \
-DFLB_IN_SYSTEMD=No \
-DFLB_IN_DUMMY=No \
-DFLB_IN_NETIF=No \
-DFLB_IN_COLLECTD=No \
@@ -90,18 +96,18 @@ CMAKE_OPTIONS += \
-DFLB_IN_OPENTELEMETRY=No \
-DFLB_IN_ELASTICSEARCH=No \
-DFLB_IN_CALYPTIA_FLEET=No \
-DFLB_IN_SPLUNK=No \
-DFLB_IN_SPLUNK=No
-DFLB_IN_HEALTH=No \
-DFLB_IN_WINLOG=No \
-DFLB_IN_WINEVTLOG=No
# Filter options
CMAKE_OPTIONS += \
-DFLB_FILTER_LUA=Yes \
-DFLB_FILTER_SYSINFO=Yes \
-DFLB_FILTER_MODIFY=Yes \
-DFLB_FILTER_AWS=No \
-DFLB_FILTER_ECS=No \
-DFLB_FILTER_KUBERNETES=No \
-DFLB_FILTER_LUA=No \
-DFLB_FILTER_NEST=No \
-DFLB_FILTER_RECORD_MODIFIER=No \
-DFLB_FILTER_THROTTLE=No \
@@ -111,8 +117,10 @@ CMAKE_OPTIONS += \
-DFLB_FILTER_GEOIP2=No \
-DFLB_FILTER_NIGHTFALL=No
# out plugins
CMAKE_OPTIONS += \
-DFLB_OUT_EXIT=Yes \
-DFLB_OUT_FORWARD=Yes \
-DFLB_OUT_HTTP=Yes \
-DFLB_OUT_NATS=Yes \
-DFLB_OUT_TCP=Yes \
@@ -121,7 +129,6 @@ CMAKE_OPTIONS += \
-DFLB_OUT_STDOUT=Yes \
-DFLB_OUT_SYSLOG=Yes \
-DFLB_OUT_NULL=Yes \
-DFLB_OUT_FORWARD=No \
-DFLB_OUT_PLOT=No \
-DFLB_OUT_AZURE=No \
-DFLB_OUT_AZURE_BLOB=No \
@@ -135,7 +142,6 @@ CMAKE_OPTIONS += \
-DFLB_OUT_GELF=No \
-DFLB_OUT_INFLUXDB=No \
-DFLB_OUT_KAFKA=No \
-DFLB_OUT_KAFKA_REST=No \
-DFLB_OUT_NRLOGS=No \
-DFLB_OUT_OPENSEARCH=No \
-DFLB_OUT_TD=No \
@@ -147,6 +153,8 @@ CMAKE_OPTIONS += \
-DFLB_OUT_FLOWCOUNTER=No \
-DFLB_OUT_LOGDNA=No \
-DFLB_OUT_LOKI=No \
-DFLB_OUT_KAFKA=No \
-DFLB_OUT_KAFKA_REST=No \
-DFLB_OUT_CLOUDWATCH_LOGS=No \
-DFLB_OUT_KINESIS_FIREHOSE=No \
-DFLB_OUT_KINESIS_STREAMS=No \
@@ -162,10 +170,11 @@ CMAKE_OPTIONS += \
define Package/fluent-bit/install
$(INSTALL_DIR) $(1)/usr/sbin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/bin/fluent-bit $(1)/usr/sbin/
$(INSTALL_DIR) $(1)/etc/fluent-bit
$(INSTALL_CONF) $(PKG_BUILD_DIR)/conf/parsers.conf $(1)/etc/fluent-bit/parsers.conf
$(INSTALL_DIR) $(1)/etc/fluent-bit/conf.d
$(INSTALL_BIN) $(PKG_BUILD_DIR)/bin/fluent-bit $(1)/usr/sbin/
$(INSTALL_DATA) ./files/fluent-bit.conf $(1)/etc/fluent-bit/fluent-bit.conf
$(INSTALL_DATA) $(PKG_BUILD_DIR)/conf/parsers.conf $(1)/etc/fluent-bit/parsers.conf
endef
$(eval $(call BuildPackage,fluent-bit))

View File

@@ -1,5 +1,5 @@
diff --git a/plugins/in_kmsg/in_kmsg.c b/plugins/in_kmsg/in_kmsg.c
index fe372a9a2..6acb34893 100644
index cd5c4cd17..15f105451 100644
--- a/plugins/in_kmsg/in_kmsg.c
+++ b/plugins/in_kmsg/in_kmsg.c
@@ -36,7 +36,6 @@
@@ -10,24 +10,15 @@ index fe372a9a2..6acb34893 100644
#include "in_kmsg.h"
@@ -114,7 +113,7 @@ static inline int process_line(const char *line,
struct timeval tv; /* time value */
int line_len;
uint64_t val;
- long pri_val;
+ unsigned long pri_val;
const char *p = line;
char *end = NULL;
struct flb_time ts;
@@ -124,12 +123,17 @@ static inline int process_line(const char *line,
@@ -123,12 +122,17 @@ static inline int process_line(const char *line,
ctx->buffer_id++;
errno = 0;
- pri_val = strtol(p, &end, 10);
- if ((errno == ERANGE && (pri_val == INT_MAX || pri_val == INT_MIN))
+ pri_val = strtoul(p, &end, 10);
+ if ((errno == ERANGE && pri_val == ULONG_MAX)
|| (errno != 0 && pri_val == 0)) {
- val = strtol(p, &end, 10);
- if ((errno == ERANGE && (val == INT_MAX || val == INT_MIN))
+ val = strtoul(p, &end, 10);
+ if ((errno == ERANGE && val == ULONG_MAX)
|| (errno != 0 && val == 0)) {
goto fail;
}
@@ -37,9 +28,17 @@ index fe372a9a2..6acb34893 100644
+ }
+
/* Priority */
priority = FLB_KLOG_PRI(pri_val);
priority = FLB_KLOG_PRI(val);
@@ -152,6 +156,12 @@ static inline int process_line(const char *line,
@@ -144,24 +148,35 @@ static inline int process_line(const char *line,
}
p++;
- val = strtoul(p, &end, 10);
- if ((errno == ERANGE && (val == INT_MAX || val == INT_MIN))
+ val = strtoull(p, &end, 10);
+ if ((errno == ERANGE && val == ULLONG_MAX)
|| (errno != 0 && val == 0)) {
goto fail;
}
@@ -52,7 +51,12 @@ index fe372a9a2..6acb34893 100644
sequence = val;
p = ++end;
@@ -162,8 +172,14 @@ static inline int process_line(const char *line,
/* Timestamp */
- val = strtoul(p, &end, 10);
- if ((errno == ERANGE && (val == INT_MAX || val == INT_MIN))
+ val = strtoull(p, &end, 10);
+ if ((errno == ERANGE && val == ULLONG_MAX)
|| (errno != 0 && val == 0)) {
goto fail;
}
@@ -64,7 +68,6 @@ index fe372a9a2..6acb34893 100644
tv.tv_sec = val/1000000;
- tv.tv_usec = val - (tv.tv_sec * 1000000);
+ tv.tv_usec = val - ((uint64_t)tv.tv_sec * 1000000);
+
flb_time_set(&ts, ctx->boot_time.tv_sec + tv.tv_sec, tv.tv_usec * 1000);

View File

@@ -15,7 +15,7 @@ ifneq ($(LOCAL_DEV),1)
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://dev.iopsys.eu/bbf/gateway-info.git
PKG_SOURCE_VERSION:=dd15893a8291e556a8c49ff9e143c763db0379b5
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.zst
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
PKG_MIRROR_HASH:=skip
endif

View File

@@ -110,7 +110,7 @@ configure_send_op125() {
if [ "${uci}" = "network" ]; then
[ -n "${sendopt}" ] && new_send_opt="$sendopt $opt125" || new_send_opt="$opt125"
new_send_opt="$sendopt $opt125"
uci -q set network."${intf}".sendopts="$new_send_opt"
else
new_send_opt="$sendopt$opt125"
@@ -228,7 +228,7 @@ enable_dhcp_option125() {
if [ "${proto}" = "dhcp" ]; then
if [ ${req125_present} -eq 0 ]; then
[ -n "${reqopts}" ] && newreqopts="$reqopts 125" || newreqopts="125"
newreqopts="$reqopts 125"
uci -q set network."${wan}".reqopts="$newreqopts"
fi

View File

@@ -5,12 +5,12 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=hostmngr
PKG_VERSION:=1.4.3
PKG_VERSION:=1.4.0
LOCAL_DEV=0
ifneq ($(LOCAL_DEV),1)
PKG_SOURCE_PROTO:=git
PKG_SOURCE_VERSION:=667866b8149d3df83a05536319eac02aee0b6d75
PKG_SOURCE_VERSION:=230d55ae6769e1ebde02cef3f718e6c4cf1b1962
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/hostmngr.git
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)_$(PKG_SOURCE_VERSION).tar.xz
PKG_MIRROR_HASH:=skip

View File

@@ -19,8 +19,4 @@ config ICWMP_VENDOR_PREFIX
config ICWMP_ENABLE_SMM_SUPPORT
bool "Enable software module management support"
default n
config ICWMP_ENABLE_ANNEX_F_INFORM_PARAM
bool "Enable Device.Gateway. and Device.ManagementServer.ManageableDevice. as inform parameter"
default y
endmenu

View File

@@ -8,14 +8,14 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=icwmp
PKG_VERSION:=9.10.16
PKG_VERSION:=9.10.5
LOCAL_DEV:=0
ifneq ($(LOCAL_DEV),1)
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://dev.iopsys.eu/bbf/icwmp.git
PKG_SOURCE_VERSION:=f5064dadcf1511c1002330ca712e37a9e2712472
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.zst
PKG_SOURCE_VERSION:=7f4a159f6ff49584655e57bb801218eb083fba67
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
PKG_MIRROR_HASH:=skip
endif
@@ -84,15 +84,11 @@ define Package/icwmp/install
$(INSTALL_BIN) $(PKG_BUILD_DIR)/icwmpd $(1)/usr/sbin/icwmpd
$(INSTALL_DATA) ./files/etc/config/cwmp $(1)/etc/config/cwmp
$(INSTALL_BIN) ./files/etc/init.d/icwmpd $(1)/etc/init.d/icwmpd
$(INSTALL_BIN) ./files/etc/uci-defaults/50-cwmp-align-keep-config $(1)/etc/uci-defaults/
$(INSTALL_BIN) ./files/etc/uci-defaults/85-cwmp-set-userid $(1)/etc/uci-defaults/
$(INSTALL_BIN) ./files/etc/uci-defaults/90-cwmpfirewall $(1)/etc/uci-defaults/
$(INSTALL_BIN) ./files/etc/uci-defaults/95-set-random-inform-time $(1)/etc/uci-defaults/
$(INSTALL_BIN) ./files/etc/uci-defaults/85-migrate-gw-info $(1)/etc/uci-defaults/
$(INSTALL_BIN) ./files/etc/uci-defaults/999-cwmp-conn-config $(1)/etc/uci-defaults/
ifeq ($(CONFIG_ICWMP_ENABLE_ANNEX_F_INFORM_PARAM),y)
$(INSTALL_BIN) ./files/etc/uci-defaults/99-cwmp-annex-f-config $(1)/etc/uci-defaults/
endif
$(INSTALL_BIN) ./files/etc/icwmpd/vendor_log.sh $(1)/etc/icwmpd/vendor_log.sh
$(INSTALL_BIN) ./files/etc/icwmpd/firewall.cwmp $(1)/etc/icwmpd/firewall.cwmp
$(INSTALL_DATA) ./files/lib/upgrade/keep.d/icwmp $(1)/lib/upgrade/keep.d/icwmp

View File

@@ -42,9 +42,7 @@ config cpe 'cpe'
option periodic_notify_interval '10'
option incoming_rule 'Port_Only'
option active_notif_throttle '0'
#option KeepConfig '1'
#option KeepOpConf '1'
#option ConfigScope 'UserOnly'
option fw_upgrade_keep_settings '1'
option clock_sync_timeout '128'
option disable_datatype_check '0'
#list allowed_cr_ip '10.5.1.0/24'

View File

@@ -97,9 +97,7 @@ validate_cpe_section()
'periodic_notify_enable:bool' \
'enable:bool:1' \
'periodic_notify_interval:uinteger' \
'KeepConfig:bool' \
'KeepOpConf:bool' \
'ConfigScope:string'
'fw_upgrade_keep_settings:bool'
}
validate_defaults() {
@@ -170,21 +168,13 @@ start_service() {
stop_service()
{
local switch_bank KeepConfig KeepOpConf ConfigScope
local switch_bank
copy_cwmp_varstate_files_to_etc
switch_bank=$(uci -q -c /var/state/ get icwmp.cpe.switch_bank)
if [ "$switch_bank" = "1" ] && [ -x /etc/sysmngr/fwbank ]; then
KeepConfig="$(uci -q get cwmp.cpe.KeepConfig)"
KeepOpConf="$(uci -q get cwmp.cpe.KeepOpConf)"
ConfigScope="$(uci -q get cwmp.cpe.ConfigScope)"
json_init
[ -n "${KeepConfig}" ] && json_add_boolean "keep_config" "${KeepConfig}"
[ -n "${KeepOpConf}" ] && json_add_boolean "keep_opconf" "${KeepOpConf}"
[ -n "${ConfigScope}" ] && json_add_string "config_scope" "${ConfigScope}"
json_dump| /etc/sysmngr/fwbank call copy_config
if [ -n "$switch_bank" ] && [ "$switch_bank" = "1" ]; then
[ -x /etc/sysmngr/fwbank ] && /etc/sysmngr/fwbank call copy_config
fi
}

View File

@@ -1,7 +0,0 @@
#!/bin/sh
keep_settings="$(uci -q get cwmp.cpe.fw_upgrade_keep_settings)"
if [ -n "${keep_settings}" ]; then
uci -q delete cwmp.cpe.fw_upgrade_keep_settings
uci -q set cwmp.cpe.KeepConfig="${keep_settings}"
fi

View File

@@ -1,53 +0,0 @@
#!/bin/sh
. /lib/functions.sh
validate_inform_parameter() {
local section="${1}"
local target_param="${2}"
local parameter_name
config_get parameter_name "${section}" parameter_name
if [ "${parameter_name}" = "${target_param}" ]; then
return 0
fi
return 1
}
check_param_exists() {
local target_param="${1}"
local found=1
check_section() {
local section="${1}"
if validate_inform_parameter "${section}" "${target_param}"; then
found=0
fi
}
config_foreach check_section inform_parameter
return "${found}"
}
configure_annex_f_inform_param() {
[ -f /etc/config/gateway ] || return 0
config_load cwmp
if ! check_param_exists "Device.GatewayInfo."; then
uci -q set cwmp.gw_info_param=inform_parameter
uci -q set cwmp.gw_info_param.enable='1'
uci -q set cwmp.gw_info_param.events_list='0 BOOTSTRAP,1 BOOT'
uci -q set cwmp.gw_info_param.parameter_name='Device.GatewayInfo.'
fi
if ! check_param_exists "Device.ManagementServer.ManageableDevice."; then
uci -q set cwmp.mng_dev_param=inform_parameter
uci -q set cwmp.mng_dev_param.enable='1'
uci -q set cwmp.mng_dev_param.events_list='0 BOOTSTRAP,1 BOOT'
uci -q set cwmp.mng_dev_param.parameter_name='Device.ManagementServer.ManageableDevice.'
fi
}
configure_annex_f_inform_param

View File

@@ -6,12 +6,12 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=ieee1905
PKG_VERSION:=8.7.44
PKG_VERSION:=8.7.39
LOCAL_DEV=0
ifneq ($(LOCAL_DEV),1)
PKG_SOURCE_PROTO:=git
PKG_SOURCE_VERSION:=29ba8f04dc6bd7e77683352c0c71988f51fbadf8
PKG_SOURCE_VERSION:=85fa0fe16d6a5a3452422b72186f6bbb16a13c62
PKG_SOURCE_URL:=https://dev.iopsys.eu/multi-ap/ieee1905.git
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)_$(PKG_SOURCE_VERSION).tar.xz
PKG_MIRROR_HASH:=skip

View File

@@ -13,7 +13,7 @@ PKG_INSTALL:=1
PKG_SOURCE_PROTO=git
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/imonitor.git
PKG_SOURCE_VERSION:=4beb1d5d6925507f1850a84c0b83aaf12a082f7f
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.zst
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
PKG_MIRROR_HASH:=skip
PKG_SOURCE_SUBDIR:=${PKG_NAME}-${PKG_VERSION}
PKG_INSTALL:=1

View File

@@ -4,7 +4,7 @@ PKG_NAME:=iopsys-analytics
PKG_RELEASE:=$(COMMITCOUNT)
PKG_LICENSE:=PROPRIETARY
PKG_SOURCE_PROTO:=git
PKG_SOURCE_VERSION:=5ad41ca8eb5de887487feb7148b5dce44943218c
PKG_SOURCE_VERSION:=25e32ac5a860aec6e53e3449565b71595073e014
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/iopsys-analytics.git
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)_$(PKG_SOURCE_VERSION).tar.xz
PKG_MIRROR_HASH:=skip

View File

@@ -14,7 +14,7 @@ ifneq ($(LOCAL_DEV),1)
PKG_SOURCE_PROTO:=git
PKG_SOURCE_VERSION:=ac1beae4794f99533b28db7d0e6e80f4c268a3e8
PKG_SOURCE_URL:=https://dev.iopsys.eu/network/ipt-trigger.git
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.zst
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
PKG_MIRROR_HASH:=skip
endif

View File

@@ -5,12 +5,12 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=libdpp
PKG_VERSION:=2.1.3
PKG_VERSION:=2.1.1
LOCAL_DEV=0
ifneq ($(LOCAL_DEV),1)
PKG_SOURCE_PROTO:=git
PKG_SOURCE_VERSION:=fdfe23e51ff77ca6d2661ad6208d097758524147
PKG_SOURCE_VERSION:=6024efd3db9dd490c07465ea9b0c15120063165c
PKG_SOURCE_URL:=https://dev.iopsys.eu/multi-ap/libdpp.git
PKG_MAINTAINER:=Jakob Olsson <jakob.olsson@iopsys.eu>
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)_$(PKG_SOURCE_VERSION).tar.xz

View File

@@ -5,12 +5,12 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=libeasy
PKG_VERSION:=7.5.1
PKG_VERSION:=7.5.0
LOCAL_DEV=0
ifneq ($(LOCAL_DEV),1)
PKG_SOURCE_PROTO:=git
PKG_SOURCE_VERSION:=b981f7e1bd51f66041cd0c25d15af74ae1e3bc75
PKG_SOURCE_VERSION:=18f93677bb4d33ebb6249324a5043294f0eae16c
PKG_SOURCE_URL:=https://dev.iopsys.eu/hal/libeasy.git
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)_$(PKG_SOURCE_VERSION).tar.xz
PKG_MIRROR_HASH:=skip

View File

@@ -17,7 +17,7 @@ PKG_NAME:=libpicoevent-bcm
PKG_LICENSE:=LGPL-2.1-only
PKG_LICENSE_FILES:=LICENSE
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.zst
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
PKG_MIRROR_HASH:=skip
include $(INCLUDE_DIR)/package.mk

View File

@@ -17,7 +17,7 @@ PKG_NAME:=libpicoevent
PKG_LICENSE:=LGPL-2.1-only
PKG_LICENSE_FILES:=LICENSE
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.zst
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
PKG_MIRROR_HASH:=skip
include $(INCLUDE_DIR)/package.mk

View File

@@ -5,13 +5,13 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=libqos
PKG_VERSION:=7.2.111
PKG_VERSION:=7.2.109
LOCAL_DEV=0
ifneq ($(LOCAL_DEV),1)
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/libqos.git
PKG_SOURCE_VERSION:=2e4c6a9c27e0f4f68dfe7a5c930afefd8dc7119a
PKG_SOURCE_VERSION:=4948d372c3d7e43a0ba9aee517dbb83b94bba3dc
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)_$(PKG_SOURCE_VERSION).tar.xz
PKG_MIRROR_HASH:=skip
endif
@@ -65,7 +65,7 @@ define Package/libqos
SUBMENU:=IOPSYS HAL libs
MENU:=1
TITLE:= QoS library (libqos)
DEPENDS+=+libnl +libnl-route +libeasy +TARGET_brcmbca:bcm963xx-bsp +TARGET_airoha:libuci
DEPENDS+=+libnl +libnl-route +libeasy +TARGET_brcmbca:bcm963xx-bsp
endef
define Package/libqos/config

View File

@@ -6,7 +6,7 @@ PKG_RELEASE:=1
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://github.com/apietila/libtrace.git
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.zst
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_VERSION:=e4b4c5cce35a52da152776a00532aa0b80879c5b
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)

View File

@@ -8,7 +8,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=libvoice-airoha
PKG_RELEASE:=1
PKG_VERSION:=1.1.8
PKG_VERSION:=1.1.7
PKG_LICENSE:=PROPRIETARY
PKG_LICENSE_FILES:=LICENSE
@@ -17,8 +17,8 @@ LOCAL_DEV=0
ifneq ($(LOCAL_DEV),1)
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/$(PKG_NAME).git
PKG_SOURCE_VERSION:=9763c574ec69e2aa492db4f1296d4bcd53776fba
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.zst
PKG_SOURCE_VERSION:=3a30086a68a3409f0396acb01380f91daabf7a2f
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
PKG_MIRROR_HASH:=skip
endif

View File

@@ -25,5 +25,6 @@ db commit
# configure the PCM for DECT/DCX81
[ -f "/proc/device-tree/aliases/dcx81-uart" ] && {
uci set dect.global.pcm_fsync='SHORT_LF'
uci set dect.global.pcm_slot_start='8'
uci set dect.global.dect_channel_start='3'
}

View File

@@ -18,7 +18,7 @@ ifneq ($(LOCAL_DEV),1)
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/$(PKG_NAME).git
PKG_SOURCE_VERSION:=baf5ebfb45404714bbfcc3068080f93265934d8a
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.zst
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
PKG_MIRROR_HASH:=skip
endif

View File

@@ -18,7 +18,7 @@ ifneq ($(LOCAL_DEV),1)
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/$(PKG_NAME).git
PKG_SOURCE_VERSION:=0b2bef862fb5aea0b285e339459f46779224e2d0
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.zst
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
PKG_MIRROR_HASH:=skip
endif

View File

@@ -6,12 +6,12 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=libwifi
PKG_VERSION:=7.22.11
PKG_VERSION:=7.22.6
LOCAL_DEV=0
ifneq ($(LOCAL_DEV),1)
PKG_SOURCE_PROTO:=git
PKG_SOURCE_VERSION:=6572047d613d4dc88ed83a80fb4ae0798ab71078
PKG_SOURCE_VERSION:=ddeb681a9f99202b1ded6c965591bb8c1f5cb05d
PKG_SOURCE_URL:=https://dev.iopsys.eu/hal/libwifi.git
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)_$(PKG_SOURCE_VERSION).tar.xz
PKG_MIRROR_HASH:=skip

View File

@@ -19,13 +19,6 @@ config LOGMNGR_BACKEND_SYSLOG_NG
endchoice
config LOGMNGR_SYSLOG
bool "Device.Syslog. support"
depends on PACKAGE_logmngr
default y
help
It adds support for Device.Syslog. datamodel using bbfdm micro-services.
config LOGMNGR_LOGROTATE
bool "Logrotate support"
depends on PACKAGE_logmngr

View File

@@ -5,14 +5,14 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=logmngr
PKG_VERSION:=1.1.5
PKG_VERSION:=1.1.4
LOCAL_DEV:=0
ifneq ($(LOCAL_DEV),1)
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://dev.iopsys.eu/system/logmngr.git
PKG_SOURCE_VERSION:=62441fdfe14a39bff8fff7c62307bd7b54d7240f
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.zst
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_MIRROR_HASH:=skip
endif
@@ -59,21 +59,14 @@ define Package/logmngr/install
$(INSTALL_DATA) ./files/etc/config/logmngr $(1)/etc/config/
$(INSTALL_DATA) ./files/etc/uci-defaults/10-logmngr_config_migrate $(1)/etc/uci-defaults/
ifeq ($(CONFIG_LOGMNGR_SYSLOG),y)
$(BBFDM_REGISTER_SERVICES) ./bbfdm_service.json $(1) $(PKG_NAME)
$(BBFDM_INSTALL_MS_DM) $(PKG_BUILD_DIR)/bbf_plugin/libbbfsyslog.so $(1) $(PKG_NAME)
endif
$(BBFDM_INSTALL_MS_PLUGIN) $(PKG_BUILD_DIR)/bbf_plugin/libbbfsyslog.so $(1) core 10
# Install logmngr service backend
$(INSTALL_DIR) $(1)/lib/logmngr
ifeq ($(CONFIG_LOGMNGR_BACKEND_FLUENTBIT),y)
$(INSTALL_DIR) $(1)/sbin
$(INSTALL_DIR) $(1)/etc/fluent-bit
$(INSTALL_DIR) $(1)/etc/hotplug.d/ntp/
$(INSTALL_BIN) ./files/etc/fluent-bit/syslog_facility.lua $(1)/etc/fluent-bit/syslog_facility.lua
$(INSTALL_BIN) ./files/logread $(1)/sbin/
$(INSTALL_DATA) ./files/lib/logmngr/fluent-bit.sh $(1)/lib/logmngr/
$(INSTALL_BIN) ./files/etc/hotplug.d/ntp/20-reload_fluent_bit $(1)/etc/hotplug.d/ntp/
else ifeq ($(CONFIG_LOGMNGR_BACKEND_SYSLOG_NG),y)
$(INSTALL_DATA) ./files/lib/logmngr/syslog-ng.sh $(1)/lib/logmngr/
endif

View File

@@ -1,16 +0,0 @@
{
"daemon": {
"enable": "1",
"service_name": "logmngr",
"unified_daemon": false,
"services": [
{
"parent_dm": "Device.",
"object": "Syslog"
}
],
"config": {
"loglevel": "3"
}
}
}

View File

@@ -8,7 +8,7 @@ config source 'default_source'
config template 'default_template'
option name 'default_template'
option expression '{time} {hostname} {facility}.{severity} {ident}[{pid}]: {message}'
option expression '{time} {hostname} {ident}[{pid}]: {message}'
config action 'default_action'
option name 'default_action'

View File

@@ -1,30 +0,0 @@
function map_facility_severity(tag, timestamp, record)
local priority = record["priority"] or record["pri"]
if not priority then
record["facility"] = "user"
record["severity"] = "info"
return 2, timestamp, record
end
local facility_map = {
[0] = "kern", [1] = "user", [2] = "mail", [3] = "daemon",
[4] = "auth", [5] = "syslog", [6] = "lpr", [7] = "news",
[8] = "uucp", [9] = "cron", [10] = "authpriv", [11] = "ftp",
[16] = "local0", [17] = "local1", [18] = "local2", [19] = "local3",
[20] = "local4", [21] = "local5", [22] = "local6", [23] = "local7"
}
local severity_map = {
[0] = "emerg", [1] = "alert", [2] = "crit", [3] = "err",
[4] = "warn", [5] = "notice", [6] = "info", [7] = "debug"
}
local facility_num = math.floor(priority / 8)
local severity_num = priority % 8
record["facility"] = facility_map[facility_num] or "user"
record["severity"] = severity_map[severity_num] or "info"
return 2, timestamp, record
end

View File

@@ -1,14 +0,0 @@
#!/bin/sh
# This hotplug script reloads fluent-bit, so that kmsg logs' timestamp gets in sync
[ "$ACTION" = stratum ] || exit 0
# only once
if ! uci -q get time.global.first_use_date > /dev/null 2>&1; then
flb_pid="$(pidof fluent-bit)"
if [ -n "$flb_pid" ]; then
logger -t "logmngr.hotplug" -p info "reload fluent-bit due to ntp sync"
kill -SIGHUP "$flb_pid"
fi
fi

View File

@@ -1,6 +1,6 @@
#!/bin/sh /etc/rc.common
START=09
START=12
USE_PROCD=1

View File

@@ -63,23 +63,12 @@ create_service_section() {
append_conf " flush 1"
append_conf " daemon off"
append_conf " log_level info"
append_conf " coro_stack_size 1048576"
append_conf " coro_stack_size 24576"
append_conf " parsers_file /etc/fluent-bit/parsers.conf"
append_conf " hot_reload on"
append_conf ""
}
create_lua_filter_for_severity_facility() {
match_regex="$1"
append_conf "[FILTER]"
append_conf " name lua"
append_conf " match_regex ${match_regex}"
append_conf " script /etc/fluent-bit/syslog_facility.lua"
append_conf " call map_facility_severity"
append_conf ""
}
create_default_filters() {
append_conf "[FILTER]"
append_conf " name modify"
@@ -503,8 +492,6 @@ handle_action() {
# get the template expression if any is present
log_template="$(get_template_expression "$template_ref")"
create_lua_filter_for_severity_facility "$tag_regex"
# handle output, each action can be associated with an out_log and out_syslog
# section so figure out if any out_log or out_syslog section is associated
# with this and action and setup output accordingly.

View File

@@ -13,7 +13,7 @@ PKG_SOURCE_VERSION:=d0fb770eacd6691b98df138b60f5116e02f71a9b
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/loop-detector
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.zst
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
PKG_MIRROR_HASH:=skip
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)

View File

@@ -6,9 +6,9 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=map-agent
PKG_VERSION:=6.5.0.10
PKG_VERSION:=6.4.3.6
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
PKG_SOURCE_VERSION:=1a9763bd4e520975e6951f77e85f369487cf1318
PKG_SOURCE_VERSION:=e37b8f1a4b988b907416161e3c8fe83cd39597c3
PKG_MAINTAINER:=Jakob Olsson <jakob.olsson@iopsys.eu>
PKG_LICENSE:=BSD-3-Clause

View File

@@ -1,6 +1,6 @@
#!/bin/sh /etc/rc.common
START=97
START=98
STOP=20
USE_PROCD=1

View File

@@ -70,8 +70,7 @@ generate_multiap_config() {
ifprefix_radio=""
if is_logan; then
uci set mapagent.agent.mld_ap_prefix="bss"
uci set mapagent.agent.mld_sta_prefix="sta"
uci set mapagent.agent.mld_prefix="bss"
ifname_sta=""
case "$band" in
2g)

View File

@@ -6,9 +6,9 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=map-controller
PKG_VERSION:=6.4.5.0
PKG_VERSION:=6.4.4.8
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
PKG_SOURCE_VERSION:=f335cf5bfdf700843173fcdd5d61d1900cc0aa8a
PKG_SOURCE_VERSION:=a863fc3a9d248b0be7385524e0680155ff614467
PKG_MAINTAINER:=Jakob Olsson <jakob.olsson@genexis.eu>
LOCAL_DEV=0

View File

@@ -1,66 +0,0 @@
#!/bin/sh
. /lib/functions.sh
cfg="mapcontroller"
config_load "$cfg"
used_ids=""
collect_used_ids() {
local section="$1"
local id
id=$(uci -q get ${cfg}.${section}.id)
if [ -n "$id" ] && printf "%s" "$id" | grep -qE '^[0-9]+$'; then
used_ids="$used_ids $id"
fi
}
# Find first available ID from 0 to INT32_MAX
find_first_available_id() {
local max_int=2147483647
local expected=0
local id
# Convert list to sorted unique list
sorted_ids=$(printf "%s\n" $used_ids | sort -n | uniq)
for id in $sorted_ids; do
if [ "$id" -eq "$expected" ]; then
expected=$((expected + 1))
elif [ "$id" -gt "$expected" ]; then
# Found a gap -> return the gap
echo "$expected"
return
fi
done
# If no gaps, next available is `expected`
if [ "$expected" -le "$max_int" ]; then
echo "$expected"
else
echo -1
fi
}
# Assign ID if missing
add_qos_rule_id() {
local section="$1"
local id
id=$(uci -q get ${cfg}.${section}.id)
if [ -z "$id" ]; then
new_id=$(find_first_available_id)
[ "$new_id" -ge 0 ] || return # No available ID
uci -q set ${cfg}.${section}.id="$new_id"
used_ids="$used_ids $new_id"
fi
}
# Step 1: Collect all existing IDs
config_foreach collect_used_ids qos_rule
# Step 2: Assign IDs to rules missing them
config_foreach add_qos_rule_id qos_rule

View File

@@ -14,3 +14,5 @@ for sec in $sections; do
uci rename $cfg.$s=$sec
done
uci commit $cfg

View File

@@ -5,12 +5,12 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=map-plugins
PKG_VERSION:=1.2.7
PKG_VERSION:=1.2.5
LOCAL_DEV=0
ifneq ($(LOCAL_DEV),1)
PKG_SOURCE_PROTO:=git
PKG_SOURCE_VERSION:=dd873ca4e2cb321302dae1955da24d1be271b2b1
PKG_SOURCE_VERSION:=05c0aa02b60b27aa57bf80b8fb068b1ee8bfc8ac
PKG_SOURCE_URL:=https://dev.iopsys.eu/multi-ap/map-plugins.git
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)_$(PKG_SOURCE_VERSION).tar.xz
PKG_MIRROR_HASH:=skip
@@ -71,11 +71,5 @@ define Build/Compile
$(foreach p,$(plugins),$(call Build/Compile/map-plugins-$(p), $(1)))
endef
ifeq ($(LOCAL_DEV),1)
define Build/Prepare
rsync -r --exclude=.* ~/git/map-plugins/ $(PKG_BUILD_DIR)/
endef
endif
$(eval $(call BuildPackage,map-plugins))
$(eval $(foreach p,$(ppkg),$(call BuildPackage,$(p))))

View File

@@ -14,7 +14,7 @@ ifneq ($(LOCAL_DEV),1)
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://dev.iopsys.eu/hal/mcastmngr.git
PKG_SOURCE_VERSION:=17d73b8f1947823a0d32ed589a240a2642904fe1
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.zst
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
PKG_MIRROR_HASH:=skip
endif
@@ -32,7 +32,7 @@ define Package/mcastmngr
DEPENDS:=+libuci +libubox +libubus +libblobmsg-json
DEPENDS+=+!TARGET_brcmbca:mcproxy +!TARGET_brcmbca:sipcalc
DEPENDS+=+libbbfdm-api +libbbfdm-ubus +dm-service +!TARGET_brcmbca:kmod-ebt-igmpsnooping +!TARGET_brcmbca:kmod-ebt-mldsnooping
DEPENDS+=+!TARGET_brcmbca:ebtables-legacy +bridgemngr
DEPENDS+=+!TARGET_brcmbca:ebtables-legacy +dm-agent
endef
define Package/mcastmngr/description

View File

@@ -14,7 +14,7 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=mosquitto-auth-plugin
PKG_VERSION:=1.2.1
PKG_VERSION:=1.2.0
PKG_MAINTAINER:=Erik Karlsson <erik.karlsson@genexis.eu>
PKG_LICENSE:=EPL-2.0

View File

@@ -53,7 +53,6 @@ typedef struct {
user_acl_t users[MAX_USERS];
int user_count;
mosquitto_plugin_id_t *identifier;
char *config_file;
} plugin_data_t;
/* Parse CIDR notation for IPv4 or IPv6 (e.g., "192.168.1.0/24" or "2001:db8::/32") */
@@ -549,30 +548,6 @@ static int basic_auth_callback(int event, void *event_data, void *userdata)
return check_subnet_on_auth(pdata, ed);
}
static int reload_callback(int event, void *event_data, void *userdata)
{
plugin_data_t *pdata = userdata;
if (pdata == NULL)
return MOSQ_ERR_SUCCESS;
mosquitto_log_printf(MOSQ_LOG_NOTICE,
"subnet_acl: Reloading subnet ACL configuration from '%s'",
pdata->config_file ? pdata->config_file : "(none)");
/* Reload subnet ACL configuration */
if (load_subnet_acl_config(pdata, pdata->config_file) != 0) {
mosquitto_log_printf(MOSQ_LOG_ERR,
"subnet_acl: Failed to reload subnet ACL configuration, keeping old config");
return MOSQ_ERR_UNKNOWN;
}
mosquitto_log_printf(MOSQ_LOG_NOTICE,
"subnet_acl: Reload complete, now tracking %d user(s)", pdata->user_count);
return MOSQ_ERR_SUCCESS;
}
int mosquitto_plugin_version(int supported_version_count,
const int *supported_versions)
{
@@ -601,20 +576,8 @@ int mosquitto_plugin_init(mosquitto_plugin_id_t *identifier,
pdata->identifier = identifier;
/* Store config file path for reload */
if (config_file != NULL) {
pdata->config_file = strdup(config_file);
if (pdata->config_file == NULL) {
free(pdata);
return MOSQ_ERR_NOMEM;
}
} else {
pdata->config_file = NULL;
}
/* Load subnet ACL configuration */
if (load_subnet_acl_config(pdata, config_file) != 0) {
free(pdata->config_file);
free(pdata);
return MOSQ_ERR_UNKNOWN;
}
@@ -625,20 +588,6 @@ int mosquitto_plugin_init(mosquitto_plugin_id_t *identifier,
if (rc != MOSQ_ERR_SUCCESS) {
mosquitto_log_printf(MOSQ_LOG_ERR,
"subnet_acl: Failed to register authentication callback");
free(pdata->config_file);
free(pdata);
return rc;
}
/* Register reload callback to handle SIGHUP */
rc = mosquitto_callback_register(identifier, MOSQ_EVT_RELOAD,
reload_callback, NULL, pdata);
if (rc != MOSQ_ERR_SUCCESS) {
mosquitto_log_printf(MOSQ_LOG_ERR,
"subnet_acl: Failed to register reload callback");
mosquitto_callback_unregister(identifier, MOSQ_EVT_BASIC_AUTH,
basic_auth_callback, NULL);
free(pdata->config_file);
free(pdata);
return rc;
}
@@ -660,9 +609,6 @@ int mosquitto_plugin_cleanup(void *user_data,
if (pdata) {
mosquitto_callback_unregister(pdata->identifier, MOSQ_EVT_BASIC_AUTH,
basic_auth_callback, NULL);
mosquitto_callback_unregister(pdata->identifier, MOSQ_EVT_RELOAD,
reload_callback, NULL);
free(pdata->config_file);
free(pdata);
}

View File

@@ -5,14 +5,14 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=netmngr
PKG_VERSION:=1.2.5
PKG_VERSION:=1.2.0
LOCAL_DEV:=0
ifneq ($(LOCAL_DEV),1)
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://dev.iopsys.eu/network/netmngr.git
PKG_SOURCE_VERSION:=bb78e8a8a009f19759d8b52c7439b3c19394f223
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.zst
PKG_SOURCE_VERSION:=000da9cbb2cfe965908adf60eda0823682c8bd69
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
PKG_MIRROR_HASH:=skip
endif

View File

@@ -8,7 +8,7 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=netmode
PKG_VERSION:=1.1.11
PKG_VERSION:=1.1.8
PKG_RELEASE:=1
PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
PKG_LICENSE:=GPL-2.0-only

109
netmode/README.md Normal file
View File

@@ -0,0 +1,109 @@
# Creating Custom Netmodes in IOWRT
This guide provides developers with detailed instructions on how to create and manage custom network modes (netmodes) in IOWRT. The `netmode` script allows for flexible network configuration, and developers can define their own modes by structuring the necessary files and scripts within the `/etc/netmodes/` directory.
## Table of Contents
1. [Overview of Netmodes](#overview-of-netmodes)
2. [Directory Structure](#directory-structure)
3. [Creating a Custom Netmode](#creating-a-custom-netmode)
- [Step 1: Pre-Execution Scripts](#step-1-pre-execution-scripts)
- [Step 2: UCI Configuration Files](#step-2-uci-configuration-files)
- [Step 3: Custom Execution Scripts](#step-3-custom-execution-scripts)
- [Step 4: Post-Execution Scripts](#step-4-post-execution-scripts)
4. [Enabling and Switching Netmodes](#enabling-and-switching-netmodes)
## Overview of Netmodes
Netmodes in IOWRT provide a way to switch between different network configurations based on the needs of the environment. Developers can create custom netmodes by organizing scripts and configuration files in specific directories under `/etc/netmodes/<NETMODE_NAME>`.
## Directory Structure
A custom netmode is defined within the `/etc/netmodes/<NETMODE_NAME>` directory, which should contain the following subdirectories:
- **/lib/netmode/pre/**: Generic scripts executed before the netmode-specific configurations are applied.
- **/etc/netmodes/<NETMODE_NAME>/uci/**: Contains UCI configuration files that will be copied to `/etc/config/` during the application of the netmode.
- **/etc/netmodes/<NETMODE_NAME>/scripts/**: Custom scripts specific to the netmode that are executed after the UCI configurations are applied.
- **/lib/netmode/post/**: Generic scripts executed after the netmode-specific configurations are completed.
## Creating a Custom Netmode
To create a new netmode, follow these steps:
### Step 1: Pre-Execution Scripts
Scripts located in `/lib/netmode/pre/` are executed before any mode-specific actions. These are typically used for preparing the system or cleaning up configurations from the previous netmode.
- **Create Pre-Execution Scripts**:
- Place your generic pre-execution scripts in `/lib/netmode/pre/`.
- Example script (`/lib/netmode/pre/cleanup.sh`):
```bash
#!/bin/sh
echo "Cleaning up old network configurations..."
# Add commands here
```
### Step 2: UCI Configuration Files
The UCI configuration files stored in `/etc/netmodes/<NETMODE_NAME>/uci/` will be copied to `/etc/config/`, effectively applying the desired network configuration.
- **Place UCI Config Files**:
- Create UCI configuration files under `/etc/netmodes/<NETMODE_NAME>/uci/`.
- Example (`/etc/netmodes/bridge/uci/network`):
````bash
config device 'br_lan'
option name 'br-lan'
option type 'bridge'
option multicast_to_unicast '0'
option bridge_empty '1'
list ports 'eth1'
list ports 'eth3'
list ports 'eth4'
config interface 'lan'
option proto 'dhcp'
option device 'br-lan'
option force_link '1'
option reqopts '43 125'
````
### Step 3: Custom Execution Scripts
After the UCI files are applied, any scripts in `/etc/netmodes/<NETMODE_NAME>/scripts/` are executed. These can be used to perform additional configuration tasks that are specific to the netmode.
- **Create Custom Scripts**:
- Add scripts to `/etc/netmodes/<NETMODE_NAME>/scripts/`.
- Example (`/etc/netmodes/bridge/scripts/setup_bridge.sh`):
```bash
#!/bin/sh
echo "Setting up bridge mode..."
# Additional configuration commands here
```
### Step 4: Post-Execution Scripts
Finally, the generic scripts in `/lib/netmode/post/` are executed. These scripts typically finalize the setup or perform any necessary cleanups.
- **Create Post-Execution Scripts**:
- Place scripts in `/lib/netmode/post/`.
- Example script (`/lib/netmode/post/restart_services.sh`):
```bash
#!/bin/sh
echo "Restarting network services..."
# Add commands here
```
## Enabling and Switching Netmodes
The netmode mechanism can be enabled or disabled via the UCI configuration, and you can switch between netmodes using UCI commands.
- **Enable Netmode**:
```bash
uci set netmode.global.enabled=1
uci commit netmode
```
- **Switch Netmode**:
```bash
uci set netmode.global.mode='<NETMODE_NAME>'
uci commit netmode
```

View File

@@ -1,901 +0,0 @@
# Advanced Mode - Complete Configuration Guide
## Table of Contents
1. [Overview](#overview)
2. [Interface Types](#interface-types)
3. [Configuration Examples](#configuration-examples)
4. [Use Case Scenarios](#use-case-scenarios)
5. [TR-069/USP Configuration](#tr-069usp-configuration)
6. [Troubleshooting](#troubleshooting)
---
## Overview
The **advanced** mode is a unified, flexible network configuration mode for OpenWrt/iopsys routers. It provides a single, powerful interface for configuring:
- **Bridge interfaces** with VLAN/QinQ support (traditional VLAN devices)
- **Bridge VLAN filtering** (modern kernel bridge features - recommended)
- **Routed interfaces** with VLAN/MACVLAN support
- **Standalone interfaces** (direct VLAN without bridge)
- **Mixed scenarios** (combine bridges and routed interfaces)
### Key Features
- ✅ Unified configuration syntax
- ✅ Multiple interface types in one configuration
- ✅ VLAN (802.1Q) and QinQ (802.1ad) support
- ✅ Modern bridge VLAN filtering for better performance
- ✅ MACVLAN support for multi-service routing
- ✅ Per-interface port assignment
- ✅ Flexible protocol configuration (DHCP, none, static)
- ✅ UCI device name resolution (LAN1 → eth1)
- ✅ Automatic reconfiguration on parameter changes
### Configuration Parameters
| Parameter | Description | Example |
|-----------|-------------|---------|
| `interface_names` | Comma-separated interface names | `wan,iptv,mgmt` |
| `interface_types` | Comma-separated interface types | `bridge:transparent,brvlan:wan-tagged:1499,route:vlan:100,direct:200` |
| `ports` | Comma-separated port assignments | `ALL,LAN1-LAN2-WAN,WAN` |
| `macaddrs` | Comma-separated MAC addresses (optional) | `BaseMACAddress,BaseMACAddressP1,AA:BB:CC:DD:EE:FF` |
### How It Works
When you change any configuration parameter and restart netmode:
1. The system detects the configuration change automatically
2. Old network configuration is cleaned up (interfaces, bridges, VLANs)
3. System configuration is preserved (loopback, physical devices)
4. New configuration is applied based on your parameters
5. No manual intervention needed!
---
## Interface Types
### Bridge Types (Traditional VLAN Devices)
Bridge types create L2 bridge interfaces using traditional VLAN devices (eth0.100, etc.).
| Type | Syntax | Description |
|------|--------|-------------|
| **Transparent** | `bridge:transparent` | No VLAN tagging on any port |
| **Tagged** | `bridge:tagged:VID` | All ports tagged with same VLAN ID |
| **WAN-Tagged** | `bridge:wan-tagged:VID` | Only WAN port tagged, LAN ports untagged |
| **Transparent QinQ** | `bridge:transparent-qinq:SVID` | LAN untagged, WAN single S-tag (802.1ad) |
| **Transparent QinQ (Double)** | `bridge:transparent-qinq:CVID:SVID` | LAN untagged, WAN double-tagged (C+S) |
| **Tagged QinQ** | `bridge:tagged-qinq:CVID:SVID` | LAN C-tagged, WAN double-tagged (C+S) |
| **QinQ (All ports)** | `bridge:qinq:CVID:SVID` | All ports double-tagged |
### Bridge VLAN Filtering Types (Modern Approach)
Bridge VLAN filtering uses kernel bridge VLAN filtering instead of creating VLAN devices. **Recommended for new deployments.**
| Type | Syntax | Description |
|------|--------|-------------|
| **Tagged** | `brvlan:tagged:VID` | All ports tagged with VLAN ID (uses bridge-vlan) |
| **WAN-Tagged** | `brvlan:wan-tagged:VID` | WAN tagged, LAN untagged (uses bridge-vlan) |
| **Mixed** | `brvlan:mixed:VID` | Custom tagged/untagged configuration |
**See [BRIDGE_VLAN_FILTERING.md](BRIDGE_VLAN_FILTERING.md) for detailed documentation.**
### Routed Types
Routed types create L3 routed interfaces (with NAT/firewall).
| Type | Syntax | Description |
|------|--------|-------------|
| **VLAN Routing** | `route:vlan:VID` | Routed interface on VLAN |
| **MACVLAN Routing** | `route:macvlan:MAC` | MACVLAN device with custom MAC (supports macros) |
| **VLAN + MAC Routing** | `route:vlan:VID:MAC` | Routed interface on VLAN with custom MAC |
| **Transparent Routing** | `route:transparent` | Routed interface on base device (no VLAN) |
### Standalone Types
Standalone types create VLAN interfaces without bridges or routing (proto=none by default).
| Type | Syntax | Description |
|------|--------|-------------|
| **Direct VLAN** | `direct:VID` | Standalone VLAN interface, proto=none |
### Device Reference Types
Device reference types allow multiple interfaces to share the same underlying device.
| Type | Syntax | Description |
|------|--------|-------------|
| **Device Reference** | `device-ref:INTERFACE` | References the device from another interface |
**Use Case**: Create separate IPv4 and IPv6 interfaces (wan and wan6) that share the same bridge or VLAN device.
**Example**:
```bash
# wan creates bridge on VLAN 2501 with DHCP
# wan6 shares the same br-wan device with DHCPv6
interface_names='wan,wan6'
interface_types='bridge:tagged:2501,device-ref:wan-dhcpv6'
ports='WAN,WAN'
```
**Result**:
- `wan`: Creates `br-wan` bridge device on VLAN 2501, proto=dhcp
- `wan6`: Uses same `br-wan` device, proto=dhcpv6
**Note**: The referenced interface must be defined before the device-ref interface in the interface_names list.
### Modifiers
Modifiers can be appended to any interface type:
| Modifier | Effect | Example |
|----------|--------|---------|
| `-pppoe` | Set proto=pppoe (PPPoE authentication) | `route:vlan:101-pppoe` |
| `-dhcpv6` | Set proto=dhcpv6 (DHCPv6 client) | `bridge:tagged:2501-dhcpv6` |
| `-dhcp` | Set proto=dhcp (DHCP client - explicit) | `bridge:transparent-dhcp` |
| `-static` | Set proto=static (static IP) | `bridge:transparent-static` |
| `-none`, `-n` | Set proto=none (no IP configuration) | `bridge:tagged:100-none` or `bridge:tagged:100-n` |
| `-iptv` | Signify that this is an iptv interface (affects firewall and mcast) | `route:vlan:200-iptv` |
| `-inet` | Signify that this is an internet interface (affects firewall) | `route:vlan:200-inet` |
| `-mgmt` | Signify that this is a management interface (affects firewall) | `route:vlan:200-mgmt` |
| `-disabled`, `-d` | Create but mark as disabled | `route:vlan:200-disabled` or `route:vlan:200-d` |
#### Notes
- The `-none` and `-n` modifiers are equivalent, as are `-disabled` and `-d`.
- If no protocol modifier is specified, interfaces default to `proto=dhcp`.
- Protocols and disabled can be clubbed together, and disabled should be in the last, for example: `transparent-qinq:2-n-d` will set proto as none and disable the interface, similarly other protocols can be used.
- iptv, inet and mgmt modifier can only be used with route interfaces, and they can be clubbed with disabled modifier, but disable should be in the last.
#### Static IP Auto-Configuration
When using the `-static` modifier with an interface named `lan`, the system automatically configures:
**Network Configuration**:
- IP Address: 192.168.1.1
- Netmask: 255.255.255.0
- IPv6 Prefix: /60
**DHCP Server Configuration**:
- Start: 192.168.1.100
- Limit: 150 addresses (100-250)
- Lease time: 1 hour
- DHCPv4: server
- DHCPv6: server
- Router Advertisement: server
- SLAAC: enabled
- RA flags: managed-config, other-config
**Example**:
```bash
interface_names='lan,wan'
interface_types='bridge:transparent-static,bridge:tagged:2501'
ports='ALL_LAN,WAN'
```
For non-LAN interfaces with `-static`, only `proto=static` is set without additional configuration.
**Note**: Direct interfaces default to `proto=none`, so `-n` is implicit.
### MAC Address Assignment
You can assign custom MAC addresses to interfaces using the `macaddrs` parameter. This is useful when ISPs require specific MAC addresses per service or for multi-service configurations.
**Supported Formats:**
| Format | Description | Example |
|--------|-------------|---------|
| **Explicit MAC** | Direct MAC address assignment | `AA:BB:CC:DD:EE:FF` |
| **BaseMACAddress** | Use base MAC from `fw_printenv -n ethaddr` | `BaseMACAddress` |
| **BaseMACAddressP1** | Base MAC + 1 | `BaseMACAddressP1` |
| **BaseMACAddressPN** | Base MAC + N (any number) | `BaseMACAddressP5` |
**Example:**
```bash
# If base MAC is 94:3F:0C:D5:76:00
uci set netmode.@supported_args[3].value='BaseMACAddress,BaseMACAddressP1,AA:BB:CC:DD:EE:FF'
# Results in:
# Interface 1: 94:3F:0C:D5:76:00
# Interface 2: 94:3F:0C:D5:76:01
# Interface 3: AA:BB:CC:DD:EE:FF
```
**Note**: MAC addresses are assigned to interfaces in order. If you have 3 interfaces but only specify 2 MAC addresses, the 3rd interface will use the system default.
---
## Configuration Examples
### Example 1: Simple Transparent Bridge
**Scenario**: All ports bridged together, no VLANs
```bash
uci set netmode.global.mode='advanced'
uci set netmode.@supported_args[12].value='wan' # interface_names
uci set netmode.@supported_args[13].value='bridge:transparent' # interface_types
uci set netmode.@supported_args[14].value='ALL' # ports
uci commit netmode
service netmode restart
```
**Result**: Creates `br-wan` bridge with all LAN+WAN ports, proto=dhcp
---
### Example 2: LAN-Only Bridge with Routed WAN
**Scenario**: Bridge all LAN ports together, WAN as separate routed interface
```bash
uci set netmode.global.mode='advanced'
uci set netmode.@supported_args[12].value='lan,wan'
uci set netmode.@supported_args[13].value='bridge:transparent,route:transparent'
uci set netmode.@supported_args[14].value='ALL_LAN,WAN'
uci commit netmode
service netmode restart
```
**Result**: Creates `br-lan` bridge with all LAN ports only, WAN routed separately
---
### Example 3: VLAN-Tagged Bridge (Managed Network)
**Scenario**: All ports tagged with VLAN 100
```bash
uci set netmode.global.mode='advanced'
uci set netmode.@supported_args[12].value='mgmt'
uci set netmode.@supported_args[13].value='bridge:tagged:100'
uci set netmode.@supported_args[14].value='ALL'
uci commit netmode
service netmode restart
```
**Result**: Creates `br-mgmt` with all ports tagged as `.100`
---
### Example 4: Multiple Service Bridges (VLAN Segregation)
**Scenario**: Separate bridges for Internet (VLAN 100), IPTV (VLAN 200), Management (VLAN 300)
```bash
uci set netmode.global.mode='advanced'
uci set netmode.@supported_args[12].value='inet,iptv,mgmt'
uci set netmode.@supported_args[13].value='bridge:tagged:100-n,bridge:tagged:200-n,bridge:tagged:300'
uci set netmode.@supported_args[14].value='LAN1-LAN2-WAN,LAN3-LAN4-WAN,WAN'
uci commit netmode
service netmode restart
```
**Result**:
- `br-inet`: LAN1.100 + LAN2.100 + WAN.100, proto=none
- `br-iptv`: LAN3.200 + LAN4.200 + WAN.200, proto=none
- `br-mgmt`: WAN.300, proto=dhcp
---
### Example 5: QinQ Configuration (Wholesale Provider)
**Scenario**: Customer A on C-tag 10 S-tag 100, Customer B on C-tag 20 S-tag 100
```bash
uci set netmode.global.mode='advanced'
uci set netmode.@supported_args[12].value='customer_a,customer_b'
uci set netmode.@supported_args[13].value='bridge:qinq:10:100-n,bridge:qinq:20:100-n'
uci set netmode.@supported_args[14].value='LAN1-LAN2-WAN,LAN3-LAN4-WAN'
uci commit netmode
service netmode restart
```
**Result**:
- `br-customer_a`: All ports double-tagged (100.10)
- `br-customer_b`: All ports double-tagged (100.20)
---
### Example 6: Routed Multi-Service with Custom MAC Addresses
**Scenario**: ISP requires different MAC addresses for Internet and IPTV services
```bash
uci set netmode.global.mode='advanced'
uci set netmode.@supported_args[12].value='mgmt_wan,wan,iptv_wan,lan'
uci set netmode.@supported_args[13].value='route:macvlan:BaseMACAddressP2-mgmt,route:macvlan:BaseMACAddressP3-inet,route:macvlan:BaseMACAddressP4-iptv,bridge:transparent-static'
uci set netmode.@supported_args[14].value='WAN,WAN,WAN,ALL_LAN'
uci commit netmode
service netmode restart
```
**Result**:
- `mgmt_wan`: Routed interface on WAN with base MAC + 2(58:00:32:C0:0E:42)
- `wan`: Routed interface on WAN with base MAC + 3 (58:00:32:C0:0E:43)
- `iptv_wan`: Routed interface on WAN with base MAC + 4 (58:00:32:C0:0E:44)
- `lan`: bridged interface on ALL LAN ports with base MAC (58:00:32:C0:0E:40)
---
### Example 7: Routed Multi-Service (VLAN-based)
**Scenario**: Internet on VLAN 100, IPTV on VLAN 200, Management on VLAN 300, all routed
```bash
uci set netmode.global.mode='advanced'
uci set netmode.@supported_args[12].value='mgmt_wan,wan,iptv_wan,lan'
uci set netmode.@supported_args[13].value='route:vlan:300-mgmt,route:vlan:100-inet,route:vlan:200-iptv,bridge:transparent-static'
uci set netmode.@supported_args[14].value='WAN,WAN,WAN,ALL_LAN'
uci commit netmode
service netmode restart
```
**Result**:
- `wan`: Routed on WAN.100, proto=dhcp
- `iptv`: Routed on WAN.200, proto=dhcp
- `mgmt`: Routed on WAN.300, proto=dhcp
---
### Example 8: Routed Multi-Service (MACVLAN with Macros)
**Scenario**: Internet and IPTV using MACVLAN devices with MAC address macros
```bash
uci set netmode.global.mode='advanced'
uci set netmode.@supported_args[12].value='wan,iptv'
uci set netmode.@supported_args[13].value='route:transparent,route:macvlan:BaseMACAddressP1'
uci set netmode.@supported_args[14].value='WAN,WAN'
uci commit netmode
service netmode restart
```
**Result**:
- `wan`: Routed on WAN with default MAC (94:3F:0C:D5:76:00)
- `iptv`: MACVLAN device on WAN with base MAC + 1 (94:3F:0C:D5:76:01)
**Alternative with explicit MAC:**
```bash
uci set netmode.@supported_args[13].value='route:transparent,route:macvlan:AA:BB:CC:DD:EE:FF'
```
---
### Example 9: Routed Multi-Service (VLAN + MACVLAN)
**Scenario**: Internet on VLAN 100, IPTV on VLAN 200 with custom MAC
```bash
uci set netmode.global.mode='advanced'
uci set netmode.@supported_args[12].value='wan,iptv'
uci set netmode.@supported_args[13].value='route:vlan:100,route:vlan:200:AA:BB:CC:DD:EE:FF'
uci set netmode.@supported_args[14].value='WAN,WAN'
uci commit netmode
service netmode restart
```
**Result**:
- `wan`: Routed on WAN.100 (default MAC), proto=dhcp
- `iptv`: Routed on WAN.200 with custom MAC, proto=dhcp
---
### Example 10: Standalone VLAN Interface (Direct)
**Scenario**: WAN as standalone VLAN 2501 interface (no bridge, no routing)
```bash
uci set netmode.global.mode='advanced'
uci set netmode.@supported_args[12].value='wan'
uci set netmode.@supported_args[13].value='direct:2501'
uci set netmode.@supported_args[14].value='WAN'
uci commit netmode
service netmode restart
```
**Result**: Creates WAN.2501 interface, proto=none (no DHCP)
---
### Example 11: Mixed Bridge and Routed Interfaces
**Scenario**: IPTV bridged on VLAN 200, Internet routed on VLAN 100
```bash
uci set netmode.global.mode='advanced'
uci set netmode.@supported_args[12].value='wan,iptv'
uci set netmode.@supported_args[13].value='route:vlan:100,bridge:tagged:200-n'
uci set netmode.@supported_args[14].value='WAN,LAN1-LAN2-WAN'
uci commit netmode
service netmode restart
```
**Result**:
- `wan`: Routed on WAN.100, proto=dhcp (firewall enabled)
- `br-iptv`: Bridge on LAN1.200 + LAN2.200 + WAN.200, proto=none
---
## Use Case Scenarios
### Scenario 1: ISP Triple-Play Service (Routed)
**Requirement**: Internet on VLAN 100, IPTV on VLAN 200, VoIP on VLAN 300, all routed
**Configuration**:
```bash
uci set netmode.global.mode='advanced'
uci set netmode.@supported_args[12].value='wan,iptv,voip'
uci set netmode.@supported_args[13].value='route:vlan:100,route:vlan:200,route:vlan:300'
uci set netmode.@supported_args[14].value='WAN,WAN,WAN'
uci commit netmode
service netmode restart
```
**Network Topology**:
```
WAN (ae_wan)
├── wan (VLAN 100) - Internet - Routed
├── iptv (VLAN 200) - IPTV - Routed
└── voip (VLAN 300) - VoIP - Routed
```
---
### Scenario 2: ISP Triple-Play with MACVLAN
**Requirement**: Internet normal MAC, IPTV with custom MAC, VoIP with custom MAC
**Configuration**:
```bash
uci set netmode.global.mode='advanced'
uci set netmode.@supported_args[12].value='wan,iptv,voip'
uci set netmode.@supported_args[13].value='route:transparent,route:macvlan:AA:BB:CC:DD:EE:01,route:macvlan:AA:BB:CC:DD:EE:02'
uci set netmode.@supported_args[14].value='WAN,WAN,WAN'
uci commit netmode
service netmode restart
```
---
### Scenario 3: Enterprise VLAN Segregation (Bridged)
**Requirement**: Guest WiFi on VLAN 100, Corporate on VLAN 200, Management on VLAN 300, all bridged
**Configuration**:
```bash
uci set netmode.global.mode='advanced'
uci set netmode.@supported_args[12].value='guest,corporate,mgmt'
uci set netmode.@supported_args[13].value='bridge:tagged:100-n,bridge:tagged:200-n,bridge:tagged:300'
uci set netmode.@supported_args[14].value='LAN1-WAN,LAN2-LAN3-WAN,WAN'
uci commit netmode
service netmode restart
```
**Network Topology**:
```
LAN1.100 ──┬── WAN.100 ──[ br-guest ] (proto=none)
LAN2.200 ──┬── WAN.200 ──[ br-corporate ] (proto=none)
LAN3.200 ──┘
WAN.300 ────[ br-mgmt ] (proto=dhcp)
```
---
### Scenario 4: Wholesale QinQ Provider
**Requirement**: Multiple customers on single fiber, S-tag 100, different C-tags
**Configuration**:
```bash
uci set netmode.global.mode='advanced'
uci set netmode.@supported_args[12].value='cust_a,cust_b,cust_c'
uci set netmode.@supported_args[13].value='bridge:qinq:10:100-n,bridge:qinq:20:100-n,bridge:qinq:30:100-n'
uci set netmode.@supported_args[14].value='LAN1-LAN2-WAN,LAN3-LAN4-WAN,LAN5-LAN6-WAN'
uci commit netmode
service netmode restart
```
---
### Scenario 5: Hybrid Bridge + Routed
**Requirement**: Internet routed, IPTV bridged to STBs
**Configuration**:
```bash
uci set netmode.global.mode='advanced'
uci set netmode.@supported_args[12].value='wan,iptv'
uci set netmode.@supported_args[13].value='route:vlan:100,bridge:tagged:200-n'
uci set netmode.@supported_args[14].value='WAN,LAN1-LAN2-LAN3-WAN'
uci commit netmode
service netmode restart
```
**Network Topology**:
```
WAN.100 ─── [ wan - routed ] (NAT, firewall enabled)
LAN1.200 ──┐
LAN2.200 ──┼─ WAN.200 ──[ br-iptv ] (transparent bridge, proto=none)
LAN3.200 ──┘
```
---
## Port List Specifications
### Port List Syntax
- **`ALL`**: All LAN ports + WAN port + EXT port (resolved from UCI or board.json)
- **`ALL_LAN`**: All LAN ports only (no WAN, no EXT) - useful for LAN-only bridges
- **`LAN`**: Single LAN port (for devices with one LAN port)
- **`WAN`**: Only WAN port
- **`EXT`**: Only EXT port
- **`LAN-WAN`**: Single LAN port and WAN
- **`LAN1-LAN2-WAN`**: LAN1, LAN2, and WAN
- **`LAN1-LAN3-EXT`**: LAN1, LAN3, and EXT
- **`WAN-EXT`**: WAN and EXT ports
**Note**: For devices with a single LAN port, use `LAN`. For devices with multiple LAN ports, use `LAN1-8`. The `ALL` and `ALL_LAN` macros automatically detect which configuration is present.
#### Individual untagged port
- Suppose we have a bridge:tagged type interface, so all the ports are going to be tagged in this case. To mark any of the ports untagged individually, ":u" modifier can be used with the port, for example, to make LAN3 untagged (transparent) here: "LAN2-LAN3:u-LAN4-WAN".
### Device Name Resolution
Port macros (LAN, LAN1-LAN8, WAN, EXT) are automatically resolved to actual device names:
- `LAN``uci get network.LAN.name` → e.g., `eth1` (single LAN port devices)
- `LAN1``uci get network.LAN1.name` → e.g., `eth1` (multi-port devices)
- `WAN``uci get network.WAN.name` → e.g., `ae_wan`
- `EXT``uci get network.EXT.name` → e.g., `eth5`
If UCI device section doesn't exist, the system falls back to board.json.
---
## TR-069/USP Configuration
### TR-181 Data Model Mapping
The advanced mode uses three arguments in TR-181:
1. **SupportedArguments.1** = `interface_names`
2. **SupportedArguments.2** = `interface_types`
3. **SupportedArguments.3** = `ports`
### Example 1: Transparent Bridge via TR-069
```xml
<SetParameterValues>
<ParameterList>
<ParameterValueStruct>
<Name>Device.X_IOWRT_EU_NetMode.Mode</Name>
<Value>advanced</Value>
</ParameterValueStruct>
<ParameterValueStruct>
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.1.Value</Name>
<Value>wan</Value>
</ParameterValueStruct>
<ParameterValueStruct>
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.2.Value</Name>
<Value>bridge:transparent</Value>
</ParameterValueStruct>
<ParameterValueStruct>
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.3.Value</Name>
<Value>ALL</Value>
</ParameterValueStruct>
</ParameterList>
</SetParameterValues>
```
### Example 2: Routed Multi-Service via TR-069
```xml
<SetParameterValues>
<ParameterList>
<ParameterValueStruct>
<Name>Device.X_IOWRT_EU_NetMode.Mode</Name>
<Value>advanced</Value>
</ParameterValueStruct>
<ParameterValueStruct>
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.1.Value</Name>
<Value>wan,iptv,mgmt</Value>
</ParameterValueStruct>
<ParameterValueStruct>
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.2.Value</Name>
<Value>route:vlan:100,route:vlan:200,route:vlan:300</Value>
</ParameterValueStruct>
<ParameterValueStruct>
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.3.Value</Name>
<Value>WAN,WAN,WAN</Value>
</ParameterValueStruct>
</ParameterList>
</SetParameterValues>
```
### Example 3: QinQ Bridge via TR-069
```xml
<SetParameterValues>
<ParameterList>
<ParameterValueStruct>
<Name>Device.X_IOWRT_EU_NetMode.Mode</Name>
<Value>advanced</Value>
</ParameterValueStruct>
<ParameterValueStruct>
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.1.Value</Name>
<Value>customer_a,customer_b</Value>
</ParameterValueStruct>
<ParameterValueStruct>
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.2.Value</Name>
<Value>bridge:qinq:10:100-n,bridge:qinq:20:100-n</Value>
</ParameterValueStruct>
<ParameterValueStruct>
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.3.Value</Name>
<Value>LAN1-LAN2-WAN,LAN3-LAN4-WAN</Value>
</ParameterValueStruct>
</ParameterList>
</SetParameterValues>
```
---
## Troubleshooting
### Issue: VLANs Not Working
**Diagnosis**:
```bash
# Check VLAN devices created
uci show network | grep 8021q
# Check interface status
ip link show
ip addr show
# Verify VLAN traffic
tcpdump -i eth4 -e -n vlan
```
**Solution**:
```bash
# Ensure kernel module loaded
modprobe 8021q
lsmod | grep 8021
# Check switch configuration (if applicable)
swconfig dev switch0 show
```
---
### Issue: QinQ Not Working
**Diagnosis**:
```bash
# Check for 8021ad devices
uci show network | grep 8021ad
# Verify kernel support
modprobe 8021q
lsmod | grep 8021
```
**Solution**:
```bash
# Install QinQ support
opkg install kmod-8021q
# Verify S-tag ethertype (0x88a8)
tcpdump -i eth4 -e -n -xx vlan
```
---
### Issue: MACVLAN Interface Not Getting IP
**Diagnosis**:
```bash
# Check MACVLAN device
ip link show | grep macvlan
# Check MAC address
ip link show <interface>_macvlan | grep ether
# Test DHCP
udhcpc -i <interface>_macvlan -n
```
**Solution**:
```bash
# Verify passthru mode
uci show network | grep -A5 macvlan
# Ensure MAC is unique
# Some ISPs require specific MAC format
```
---
### Issue: Mixed Bridge/Route Not Working
**Diagnosis**:
```bash
# Check firewall status
uci show firewall.globals.enabled
# Verify interfaces
ip addr show
# Check routing table
ip route show
```
**Solution**:
Firewall is always enabled. For debugging:
```bash
# Temporarily disable firewall
uci set firewall.globals.enabled='0'
uci commit firewall
/etc/init.d/firewall restart
```
---
### Issue: Port Not Added to Bridge
**Diagnosis**:
```bash
# Check UCI device resolution
uci get network.LAN1.name
# Check bridge ports
brctl show
# Check UCI bridge configuration
uci show network | grep -A10 "type='bridge'"
```
**Solution**:
```bash
# Verify device sections exist
uci show network | grep "device="
# Check board.json for defaults
cat /etc/board.json | grep -A20 network
```
---
## Verification Commands
### Check Configuration
```bash
# View current mode
cat /etc/netmodes/.last_mode
# View netmode configuration
uci show netmode
# View network configuration
uci show network
# View environment variables (during mode switch)
logread | grep "Interface names:"
```
### Check Interface Status
```bash
# All interfaces
ip addr show
# Bridges
brctl show
bridge link show
# VLAN devices
ip -d link show type vlan
# MACVLAN devices
ip -d link show type macvlan
```
### Check Connectivity
```bash
# DHCP on interface
udhcpc -i wan -n
# Ping gateway
ping -c 3 $(ip route | grep default | awk '{print $3}')
# DNS resolution
nslookup google.com
# VLAN traffic capture
tcpdump -i eth4 -e -n vlan
```
### Check Logs
```bash
# Netmode logs
logread | grep netmode-advanced
# Network logs
logread | grep network
# Live monitoring
logread -f | grep -E "(netmode|network)"
```
---
## Migration from Old Modes
### From `bridged` Mode
**Old Configuration**:
```bash
uci set netmode.global.mode='bridged'
uci set netmode.@supported_args[0].value='wan'
uci set netmode.@supported_args[1].value='transparent'
uci set netmode.@supported_args[2].value='ALL'
```
**New Configuration**:
```bash
uci set netmode.global.mode='advanced'
uci set netmode.@supported_args[12].value='wan'
uci set netmode.@supported_args[13].value='bridge:transparent'
uci set netmode.@supported_args[14].value='ALL'
```
**Change**: Add `bridge:` prefix to interface type.
---
### From `routed-multi-service` Mode
**Old Configuration**:
```bash
uci set netmode.global.mode='routed-multi-service'
uci set netmode.@supported_args[0].value='100' # inet_vlanid
uci set netmode.@supported_args[2].value='200' # iptv_vlanid
uci set netmode.@supported_args[4].value='300' # mgmt_vlanid
```
**New Configuration**:
```bash
uci set netmode.global.mode='advanced'
uci set netmode.@supported_args[12].value='wan,iptv,mgmt'
uci set netmode.@supported_args[13].value='route:vlan:100,route:vlan:200,route:vlan:300'
uci set netmode.@supported_args[14].value='WAN,WAN,WAN'
```
**Change**: Explicit interface names and unified syntax.
---
## Best Practices
1. **VLAN Planning**: Document all VLAN IDs before deployment
2. **Port Assignment**: Create clear mapping of ports to services
3. **Testing**: Test on lab environment before production
4. **Monitoring**: Use `tcpdump` to verify VLAN tags
5. **Firewall**: Be aware that routed interfaces enable firewall
6. **Naming**: Use descriptive interface names (iptv, mgmt, voip)
7. **Documentation**: Keep ISP-specific requirements documented
8. **Backup**: Always backup configuration before major changes
---
**Document Version**: 1.0
**Package Version**: 1.1.11+
**Last Updated**: 2024-12-12
**Mode Status**: Production Ready

View File

@@ -1,567 +0,0 @@
# Advanced Mode - Implementation Summary
## Overview
The **advanced** mode is a unified network configuration mode that consolidates and extends the functionality of the previous `bridged` and `routed-multi-service` modes into a single, flexible interface.
## Design Rationale
### Problems with Old Approach
1. **Mode Fragmentation**: Separate modes for bridged and routed scenarios
2. **Limited Flexibility**: Couldn't mix bridges and routed interfaces
3. **Confusing Naming**: "bridged" mode actually supported standalone interfaces too
4. **Parameter Proliferation**: routed-multi-service had 6+ parameters for just 3 services
5. **No Scalability**: Adding new services required new parameters
### New Unified Approach
The advanced mode uses a **declarative, array-based configuration**:
```
interface_names: wan, iptv, mgmt
interface_types: route:vlan:100, bridge:tagged:200, direct:300
ports: WAN, LAN1-LAN2-WAN, WAN
```
**Benefits**:
- ✅ Single mode for all scenarios
- ✅ Scalable (add N interfaces without new parameters)
- ✅ Flexible (mix bridge/route/standalone)
- ✅ Intuitive syntax
- ✅ Self-documenting configuration
## Architecture
### File Structure
```
netmode/
├── files/
│ ├── etc/netmodes/advanced/
│ │ └── scripts/
│ │ └── 10-advanced # Main mode script
│ ├── lib/netmode/
│ │ └── advanced_helper.sh # Helper library
│ └── etc/netmodes/supported_modes.json
└── docs/
├── ADVANCED_MODE_GUIDE.md # Complete guide
└── ADVANCED_MODE_QUICK_REFERENCE.md
```
### Components
#### 1. advanced_helper.sh
**Purpose**: Core library for interface creation
**Key Functions**:
- `parse_interface_type()` - Parse interface type specifications
- `create_bridge()` - Create bridge interfaces with VLAN/QinQ
- `create_routed_interface()` - Create routed interfaces with VLAN/MACVLAN
- `create_standalone_interface()` - Create direct VLAN interfaces
- `parse_port_list()` - Resolve port macros to device names
- `resolve_device_name()` - Resolve LAN1/WAN to actual device names
- `cleanup_interfaces()` - Clean up all interfaces before applying new config
#### 2. 10-advanced Script
**Purpose**: Main mode script
**Flow**:
1. Parse environment variables (NETMODE_*)
2. Split comma-separated values
3. Loop through each interface
4. Parse interface type
5. Call appropriate creation function (bridge/route/direct)
6. Configure multicast, DHCP, firewall
7. Update service dependencies
#### 3. supported_modes.json
**Purpose**: Mode definition for UCI import
**Configuration**:
```json
{
"name": "advanced",
"description": "Advanced Mode - Unified configuration...",
"supported_args": [
{
"name": "interface_names",
"description": "Interface names (comma-separated...)",
"type": "string"
},
...
]
}
```
## Interface Type Syntax
### Design Philosophy
**Format**: `MODE:SUBTYPE[:PARAMS][:MODIFIERS]`
Examples:
- `bridge:transparent` - Mode=bridge, Subtype=transparent
- `bridge:tagged:100` - Mode=bridge, Subtype=tagged, Param=VID
- `route:vlan:100:AA:BB:CC:DD:EE:FF` - Mode=route, Subtype=vlan, Params=VID+MAC
- `direct:2501-n` - Mode=direct, Param=VID, Modifier=proto_none
### Parsing Logic
The `parse_interface_type()` function:
1. **Extract modifiers** (-n, -d)
2. **Parse mode prefix** (bridge:/route:/direct:)
3. **Parse subtype** (transparent/tagged/vlan/macvlan)
4. **Parse parameters** (VID, SVID, MAC address)
5. **Export to environment variables** for caller
## UCI Device Resolution
### Problem
Port macros (LAN1, LAN2, WAN) are logical names that need to be mapped to actual hardware interfaces.
### Solution
```bash
resolve_device_name() {
local device_id="$1"
local resolved_name=""
# Try UCI device section
resolved_name="$(uci -q get network.${device_id}.name)"
# Fallback to input
if [ -z "$resolved_name" ]; then
resolved_name="$device_id"
fi
echo "$resolved_name"
}
```
**Example**:
```
LAN1 → uci get network.LAN1.name → eth1
WAN → uci get network.WAN.name → ae_wan
```
### Port List Resolution
The `parse_port_list()` function:
1. **Check for "ALL"** → Resolve all LAN1-8 + WAN
2. **Parse dash-separated** → LAN1-LAN2-WAN → resolve each
3. **Return space-separated** → "eth1 eth2 ae_wan"
## VLAN Device Creation
### 802.1Q (C-tag)
```bash
create_vlan_device "eth0" "100" "8021q"
```
Creates:
```
config device 'eth0__100'
option type '8021q'
option enabled '1'
option vid '100'
option ifname 'eth0'
option name 'eth0.100'
```
### 802.1ad (S-tag)
```bash
create_vlan_device "eth0" "300" "8021ad"
```
Creates:
```
config device 'eth0__300'
option type '8021ad'
option enabled '1'
option vid '300'
option ifname 'eth0'
option name 'eth0.300'
```
### QinQ (Double Tagging)
For `bridge:qinq:100:300`:
```bash
# Create S-tag first
svlan=$(create_vlan_device "eth0" "300" "8021ad") # eth0.300
# Create C-tag on top of S-tag
cvlan=$(create_vlan_device "$svlan" "100" "8021q") # eth0.300.100
```
Result: `eth0.300.100` (S-tag 300, C-tag 100)
## MACVLAN Device Creation
For `route:macvlan:AA:BB:CC:DD:EE:FF`:
```bash
create_macvlan_device "ae_wan" "AA:BB:CC:DD:EE:FF" "iptv"
```
Creates:
```
config device 'iptv_macvlan'
option type 'macvlan'
option enabled '1'
option ifname 'ae_wan'
option name 'iptv_macvlan'
option macaddr 'AA:BB:CC:DD:EE:FF'
option mode 'passthru'
```
## Bridge Creation
### Transparent Bridge
For `bridge:transparent` with `ports='ALL'`:
```bash
create_bridge "wan" "bridge:transparent" "ALL"
```
Creates:
```
config interface 'wan'
option proto 'dhcp'
option device 'br-wan'
config device 'br_wan'
option name 'br-wan'
option type 'bridge'
option bridge_empty '1'
list ports 'eth1'
list ports 'eth2'
list ports 'ae_wan'
```
### VLAN-Tagged Bridge
For `bridge:tagged:100` with `ports='ALL'`:
Creates VLAN devices on all ports first, then adds to bridge:
```
config device 'br_mgmt'
option name 'br-mgmt'
option type 'bridge'
list ports 'eth1.100'
list ports 'eth2.100'
list ports 'ae_wan.100'
```
## Routed Interface Creation
For `route:vlan:100`:
```bash
create_routed_interface "wan" "vlan" "100" "" "dhcp" "ae_wan" "0"
```
Creates:
```
config device 'ae_wan__100'
option type '8021q'
option vid '100'
option ifname 'ae_wan'
option name 'ae_wan.100'
config interface 'wan'
option proto 'dhcp'
option device 'ae_wan.100'
```
## Firewall Logic
The advanced mode has **intelligent firewall handling**:
```bash
configure_firewall() {
local has_routed=0
# Check if ANY interface is routed
for if_type in $interface_types; do
if echo "$if_type" | grep -q "^route:"; then
has_routed=1
break
fi
done
if [ "$has_routed" = "1" ]; then
uci set firewall.globals.enabled="1" # Enable for routed
else
uci set firewall.globals.enabled="0" # Disable for bridge-only
fi
}
```
**Logic**:
- If **any** interface is routed → Enable firewall
- If **all** interfaces are bridges → Disable firewall
## Environment Variable Flow
### Input (UCI → Environment)
```bash
# In netmode init script
export NETMODE_interface_names="wan,iptv,mgmt"
export NETMODE_interface_types="route:vlan:100,route:vlan:200,route:vlan:300"
export NETMODE_ports="WAN,WAN,WAN"
```
### Parsing (Script)
```bash
# In 10-advanced script
local interface_names="${NETMODE_interface_names:-wan}"
local interface_types="${NETMODE_interface_types:-bridge:transparent}"
local ports="${NETMODE_ports:-ALL}"
# Split by comma
IFS=','
for name in $interface_names; do
names_arr="$names_arr $name"
done
```
### Output (UCI Network Config)
```
config interface 'wan'
option proto 'dhcp'
option device 'ae_wan.100'
config interface 'iptv'
option proto 'dhcp'
option device 'ae_wan.200'
...
```
## Cleanup Strategy
Before applying new configuration, all existing interfaces are cleaned up:
```bash
cleanup_interfaces() {
# Delete VLAN devices (8021q and 8021ad)
for vlandev_sec in $(uci show network | grep -E "\.type='(8021q|8021ad)'" ...); do
uci delete "$vlandev_sec"
done
# Delete MACVLAN devices
for macvlandev_sec in $(uci show network | grep "\.type='macvlan'" ...); do
uci delete "$macvlandev_sec"
done
# Delete bridge devices
for brdev_sec in $(uci show network | grep "\.type='bridge'" ...); do
uci delete "$brdev_sec"
done
# Delete standard interfaces
uci delete network.lan
uci delete network.wan
uci delete network.wan6
}
```
This ensures a clean slate for the new configuration.
## Migration Path
### From bridged Mode
**Before**:
```bash
mode='bridged'
interface_names='wan,lan100'
interface_types='transparent,tagged:100'
ports='ALL,LAN1-LAN2'
```
**After**:
```bash
mode='advanced'
interface_names='wan,lan100'
interface_types='bridge:transparent,bridge:tagged:100'
ports='ALL,LAN1-LAN2'
```
**Change**: Add `bridge:` prefix to types.
### From routed-multi-service Mode
**Before**:
```bash
mode='routed-multi-service'
inet_vlanid='100'
iptv_vlanid='200'
mgmt_vlanid='300'
```
**After**:
```bash
mode='advanced'
interface_names='wan,iptv,mgmt'
interface_types='route:vlan:100,route:vlan:200,route:vlan:300'
ports='WAN,WAN,WAN'
```
**Change**: Explicit interface names and unified syntax.
## Testing Approach
### Unit Testing
Test individual helper functions:
```bash
# Test device resolution
resolve_device_name "LAN1" # Should return eth1
# Test port parsing
parse_port_list "LAN1-LAN2-WAN" # Should return "eth1 eth2 ae_wan"
# Test type parsing
parse_interface_type "bridge:qinq:100:300-n"
# Should set: mode=bridge, vlan_type=qinq, cvid=100, svid=300, proto=none
```
### Integration Testing
Test complete scenarios:
```bash
# Test transparent bridge
uci set netmode.global.mode='advanced'
uci set netmode.@supported_args[0].value='wan'
uci set netmode.@supported_args[1].value='bridge:transparent'
uci set netmode.@supported_args[2].value='ALL'
uci commit netmode
service netmode restart
# Verify
brctl show | grep br-wan
```
### Validation
```bash
# Check UCI output
uci show network
# Check actual interfaces
ip addr show
brctl show
ip -d link show type vlan
# Check logs
logread | grep netmode-advanced
```
## Performance Considerations
### Comma Splitting Optimization
The script uses efficient IFS-based splitting:
```bash
local OLD_IFS="$IFS"
IFS=','
for name in $interface_names; do
names_arr="$names_arr $name"
done
IFS="$OLD_IFS"
```
This is faster than using `cut` or `awk` in loops.
### UCI Batching
All UCI commands are batched, with a single `uci commit` at the end:
```bash
# Multiple uci set commands
uci set ...
uci set ...
uci set ...
# Single commit
uci commit network
```
### Logging
Logging is selective - info level for major steps, debug for details:
```bash
_log "Creating interface $idx/$total_interfaces" # Info
logger -s -p user.debug -t "$_log_prefix" "Adding port: $port" # Debug
```
## Security Considerations
### Input Validation
- VLANs IDs: 1-4094
- MAC addresses: Validated format
- Port names: Resolved through UCI (trusted source)
### Privilege Separation
- Script runs as root (required for network config)
- No user input directly executed
- Environment variables sanitized through UCI
## Future Enhancements
Possible future additions:
1. **Static IP support**: `route:vlan:100:static:192.168.1.1`
2. **Port roles**: `ports='LAN1(tagged),LAN2(untagged)'`
3. **Bridge STP**: `bridge:transparent:stp`
4. **IPv6 specific**: `route:vlan:100:ipv6`
5. **Validation**: Pre-flight checks for VLAN conflicts
## Backward Compatibility
**Status**: ⚠️ Breaking change by design
The old `bridged` and `routed-multi-service` modes are **replaced** by advanced mode. This is acceptable because:
1. This is the **first deployment** of advanced features
2. No existing production deployments use old syntax
3. Cleaner architecture without legacy baggage
4. Documentation focuses on new syntax only
## Summary
The advanced mode represents a significant architectural improvement:
-**Unified**: One mode for all scenarios
-**Scalable**: Array-based configuration
-**Flexible**: Mix bridges, routed, standalone
-**Intuitive**: Self-documenting syntax
-**Powerful**: VLAN, QinQ, MACVLAN support
-**Clean**: No backward compatibility burden
---
**Implementation Version**: 1.0
**Date**: 2024-12-12
**Status**: Production Ready

View File

@@ -1,313 +0,0 @@
# Advanced Mode - Quick Reference
## Interface Type Syntax
### Bridge Types (Traditional VLAN Devices)
```
bridge:transparent # No VLANs
bridge:tagged:VID # All ports tagged
bridge:wan-tagged:VID # Only WAN tagged
bridge:transparent-qinq:SVID # LAN untagged, WAN S-tag
bridge:transparent-qinq:C:S # LAN untagged, WAN C+S tags
bridge:tagged-qinq:C:S # LAN C-tag, WAN C+S tags
bridge:qinq:C:S # All ports C+S tags
```
### Bridge VLAN Filtering (Modern - Recommended)
```
brvlan:tagged:VID # All ports tagged (bridge-vlan)
brvlan:wan-tagged:VID # WAN tagged, LAN untagged (bridge-vlan)
brvlan:mixed:VID # Custom tagging (bridge-vlan)
```
### Routed Types
```
route:transparent # No VLAN, default MAC
route:vlan:VID # VLAN routing
route:macvlan:MAC # MACVLAN device (supports BaseMACAddress macros)
route:vlan:VID:MAC # VLAN + custom MAC
```
### Standalone Types
```
direct:VID # Standalone VLAN (proto=none)
```
### Device Reference Types
```
device-ref:INTERFACE # Reference device from another interface
# Allows multiple interfaces to share the same device
# Example: wan6 sharing wan's device
```
### Modifiers
```
-pppoe # proto=pppoe (PPPoE authentication)
-dhcpv6 # proto=dhcpv6 (DHCPv6 client)
-dhcp # proto=dhcp (DHCP client - explicit, default if no suffix)
-static # proto=static (static IP configuration)
-none, -n # proto=none (no IP configuration)
-disabled, -d # disabled=1 (interface disabled)
```
**Default Protocol**: If no protocol modifier is specified, the interface defaults to `-dhcp`.
**Note**: When using `-static` with interface name `lan`, the system automatically configures:
- IP: 192.168.1.1/24
- IPv6 prefix delegation: /60
- DHCP server: 192.168.1.100-250, 1h lease
- DHCPv6 and RA server enabled
### MAC Address Macros
```
BaseMACAddress # Base MAC from fw_printenv -n ethaddr
BaseMACAddressP1 # Base MAC + 1
BaseMACAddressP2 # Base MAC + 2
BaseMACAddressPN # Base MAC + N
AA:BB:CC:DD:EE:FF # Explicit MAC address
```
---
## Common Configurations
### 1. Transparent Bridge
```bash
uci set netmode.global.mode='advanced'
uci set netmode.@supported_args[0].value='wan'
uci set netmode.@supported_args[1].value='bridge:transparent'
uci set netmode.@supported_args[2].value='ALL'
uci commit netmode && service netmode restart
```
### 2. Router Mode (LAN + WAN)
```bash
# LAN bridge with static IP + DHCP server, WAN bridge with DHCP client
uci set netmode.global.mode='advanced'
uci set netmode.@supported_args[0].value='lan,wan'
uci set netmode.@supported_args[1].value='bridge:transparent-static,bridge:tagged:2501'
uci set netmode.@supported_args[2].value='ALL_LAN,WAN'
uci commit netmode && service netmode restart
```
### 3. VLAN-Tagged Bridge
```bash
uci set netmode.global.mode='advanced'
uci set netmode.@supported_args[0].value='mgmt'
uci set netmode.@supported_args[1].value='bridge:tagged:100'
uci set netmode.@supported_args[2].value='ALL'
uci commit netmode && service netmode restart
```
### 4. Multiple Service Bridges
```bash
uci set netmode.global.mode='advanced'
uci set netmode.@supported_args[0].value='inet,iptv,mgmt'
uci set netmode.@supported_args[1].value='bridge:tagged:100-n,bridge:tagged:200-n,bridge:tagged:300'
uci set netmode.@supported_args[2].value='LAN1-LAN2-WAN,LAN3-LAN4-WAN,WAN'
uci commit netmode && service netmode restart
```
### 5. QinQ Configuration
```bash
uci set netmode.global.mode='advanced'
uci set netmode.@supported_args[0].value='customer_a,customer_b'
uci set netmode.@supported_args[1].value='bridge:qinq:10:100-n,bridge:qinq:20:100-n'
uci set netmode.@supported_args[2].value='LAN1-LAN2-WAN,LAN3-LAN4-WAN'
uci commit netmode && service netmode restart
```
### 6. Routed Multi-Service (VLAN)
```bash
uci set netmode.global.mode='advanced'
uci set netmode.@supported_args[0].value='wan,iptv,mgmt'
uci set netmode.@supported_args[1].value='route:vlan:100,route:vlan:200,route:vlan:300'
uci set netmode.@supported_args[2].value='WAN,WAN,WAN'
uci commit netmode && service netmode restart
```
### 7. Routed Multi-Service with Custom MAC Addresses
```bash
uci set netmode.global.mode='advanced'
uci set netmode.@supported_args[0].value='wan,iptv'
uci set netmode.@supported_args[1].value='route:transparent,route:transparent'
uci set netmode.@supported_args[2].value='WAN,WAN'
uci set netmode.@supported_args[3].value='BaseMACAddress,BaseMACAddressP1'
uci commit netmode && service netmode restart
```
### 8. IPv4 + IPv6 on Same Device (Device Reference)
```bash
# wan uses DHCP, wan6 uses DHCPv6 on the same bridge device
uci set netmode.global.mode='advanced'
uci set netmode.@supported_args[0].value='wan,wan6'
uci set netmode.@supported_args[1].value='bridge:tagged:2501,device-ref:wan-dhcpv6'
uci set netmode.@supported_args[2].value='WAN,WAN'
uci commit netmode && service netmode restart
```
### 9. Direct VLAN Interface
```bash
uci set netmode.global.mode='advanced'
uci set netmode.@supported_args[0].value='wan'
uci set netmode.@supported_args[1].value='direct:2501'
uci set netmode.@supported_args[2].value='WAN'
uci commit netmode && service netmode restart
```
### 10. Hybrid (Routed + Bridged)
```bash
uci set netmode.global.mode='advanced'
uci set netmode.mode_4_supprted_args_1.value='wan,iptv'
uci set netmode.mode_4_supprted_args_2.value='route:vlan:100,bridge:tagged:200-n'
uci set netmode.mode_4_supprted_args_3.value='WAN,LAN1-LAN2-LAN3-WAN'
uci commit netmode && service netmode restart
```
### 11. Bridge VLAN Filtering (WAN Tagged)
```bash
uci set netmode.global.mode='advanced'
uci set netmode.mode_4_supprted_args_1.value='internet'
uci set netmode.mode_4_supprted_args_2.value='brvlan:wan-tagged:1499'
uci set netmode.mode_4_supprted_args_3.value='LAN1-LAN2-WAN'
uci commit netmode && service netmode restart
```
### 12. Multiple Services with Bridge VLAN Filtering
```bash
uci set netmode.global.mode='advanced'
uci set netmode.mode_4_supprted_args_1.value='internet,tv'
uci set netmode.mode_4_supprted_args_2.value='brvlan:wan-tagged:1499,brvlan:wan-tagged:1510-n'
uci set netmode.mode_4_supprted_args_3.value='LAN1-LAN2-WAN,LAN3-LAN4-WAN'
uci commit netmode && service netmode restart
```
---
## Port List Syntax
| Syntax | Description |
|--------|-------------|
| `ALL` | All LAN + WAN + EXT ports (from UCI/board.json) |
| `ALL_LAN` | All LAN ports only (no WAN, no EXT) |
| `LAN` | Single LAN port (for devices with one LAN port) |
| `WAN` | WAN port only |
| `EXT` | EXT port only |
| `LAN-WAN` | Single LAN port and WAN |
| `LAN1-LAN2-WAN` | LAN1, LAN2, and WAN |
| `LAN1-LAN3-EXT` | LAN1, LAN3, and EXT |
| `WAN-EXT` | WAN and EXT ports |
**Note**: `LAN` is used for devices with a single LAN port, while `LAN1-8` are used for devices with multiple numbered LAN ports. The system automatically detects which is present in UCI.
---
## Verification Commands
```bash
# Check current mode
cat /etc/netmodes/.last_mode
# View configuration
uci show netmode
# View network interfaces
ip addr show
# View bridges
brctl show
# View VLAN devices
ip -d link show type vlan
# View MACVLAN devices
ip -d link show type macvlan
# View logs
logread | grep netmode-advanced
# Test DHCP
udhcpc -i wan -n
# Capture VLAN traffic
tcpdump -i eth4 -e -n vlan
```
---
## Troubleshooting
### Force mode reapply
```bash
rm /etc/netmodes/.last_mode
service netmode restart
```
### Check for errors
```bash
logread | grep -E "(error|ERROR|failed|FAILED)"
```
### Verify UCI syntax
```bash
uci show netmode
uci show network
```
### Reset to DHCP mode
```bash
uci set netmode.global.mode='routed-dhcp'
uci commit netmode
service netmode restart
```
---
## TR-181 Argument Mapping
```
Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.1.Value = interface_names
Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.2.Value = interface_types
Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.3.Value = ports
Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.4.Value = macaddrs
```
---
## Examples by Use Case
### ISP Triple-Play (VLAN-based with MAC Addresses)
```bash
# Internet VLAN 100, IPTV VLAN 200, VoIP VLAN 300 with different MACs
uci set netmode.global.mode='advanced'
uci set netmode.@supported_args[0].value='wan,iptv,voip'
uci set netmode.@supported_args[1].value='route:vlan:100,route:vlan:200,route:vlan:300'
uci set netmode.@supported_args[2].value='WAN,WAN,WAN'
uci set netmode.@supported_args[3].value='BaseMACAddress,BaseMACAddressP1,BaseMACAddressP2'
uci commit netmode && service netmode restart
```
### Enterprise Guest + Corporate Networks
```bash
# Guest VLAN 100, Corporate VLAN 200, Management VLAN 300
uci set netmode.global.mode='advanced'
uci set netmode.@supported_args[0].value='guest,corporate,mgmt'
uci set netmode.@supported_args[1].value='bridge:tagged:100-n,bridge:tagged:200-n,bridge:tagged:300'
uci set netmode.@supported_args[2].value='LAN1-WAN,LAN2-LAN3-WAN,WAN'
uci commit netmode && service netmode restart
```
### Wholesale QinQ Provider
```bash
# Multiple customers with different C-tags, same S-tag
uci set netmode.global.mode='advanced'
uci set netmode.@supported_args[0].value='cust_a,cust_b,cust_c'
uci set netmode.@supported_args[1].value='bridge:qinq:10:100-n,bridge:qinq:20:100-n,bridge:qinq:30:100-n'
uci set netmode.@supported_args[2].value='LAN1-LAN2-WAN,LAN3-LAN4-WAN,LAN5-LAN6-WAN'
uci commit netmode && service netmode restart
```
---
**Version**: 1.0
**Last Updated**: 2024-12-12

View File

@@ -1,333 +0,0 @@
# Bridge VLAN Filtering Mode
## Overview
The advanced netmode now supports **bridge VLAN filtering**, a modern approach to VLAN configuration that uses the kernel's bridge VLAN filtering feature instead of creating separate VLAN devices.
### Benefits
- **Better Performance**: No need to create multiple VLAN devices
- **Cleaner Configuration**: Single bridge with VLAN filtering instead of multiple VLAN interfaces
- **Hardware Offloading**: Better support for hardware VLAN acceleration
- **Simplified Management**: All VLANs configured in one place
## Syntax
Use the `brvlan:` prefix instead of `bridge:` to enable bridge VLAN filtering:
| Traditional Mode | Bridge VLAN Filtering Mode |
|------------------|---------------------------|
| `bridge:tagged:100` | `brvlan:tagged:100` |
| `bridge:wan-tagged:100` | `brvlan:wan-tagged:100` |
| N/A | `brvlan:mixed:100` |
## Interface Types
### `brvlan:tagged:VID`
All ports are tagged with the specified VLAN ID.
**Example**:
```bash
uci set netmode.global.mode='advanced'
uci set netmode.mode_4_supprted_args_1.value='internet'
uci set netmode.mode_4_supprted_args_2.value='brvlan:tagged:1499'
uci set netmode.mode_4_supprted_args_3.value='ALL'
uci commit netmode && service netmode restart
```
**Resulting Configuration**:
```
config interface 'internet'
option device 'br-internet.1499'
option proto 'dhcp'
config device br_internet
option name 'br-internet'
option type 'bridge'
option vlan_filtering '1'
list ports 'ae_wan'
list ports 'eth0'
list ports 'eth1'
config bridge-vlan brvlan_1499_internet
option device 'br-internet'
option vlan '1499'
list ports 'ae_wan:t'
list ports 'eth0:t'
list ports 'eth1:t'
```
---
### `brvlan:wan-tagged:VID`
WAN port is tagged, LAN ports are untagged.
**Example**:
```bash
uci set netmode.global.mode='advanced'
uci set netmode.mode_4_supprted_args_1.value='iptv'
uci set netmode.mode_4_supprted_args_2.value='brvlan:wan-tagged:1510-n'
uci set netmode.mode_4_supprted_args_3.value='LAN1-LAN2-WAN'
uci commit netmode && service netmode restart
```
**Resulting Configuration**:
```
config interface 'iptv'
option device 'br-iptv.1510'
option proto 'none'
config device br_iptv
option name 'br-iptv'
option type 'bridge'
option vlan_filtering '1'
list ports 'ae_wan'
list ports 'eth0'
list ports 'eth1'
config bridge-vlan brvlan_1510_iptv
option device 'br-iptv'
option vlan '1510'
list ports 'ae_wan:t'
list ports 'eth0:u'
list ports 'eth1:u'
```
---
### `brvlan:mixed:VID` or `brvlan:mixed:VID:TAGGED_PORTS`
Custom tagged/untagged configuration with flexible port-specific tagging.
**Syntax**:
- `brvlan:mixed:VID` - Default behavior: WAN tagged, LAN untagged
- `brvlan:mixed:VID:TAGGED_PORTS` - Specify which ports are tagged (e.g., `LAN1-WAN`)
**Example 1: Default (WAN Tagged)**:
```bash
uci set netmode.global.mode='advanced'
uci set netmode.mode_4_supprted_args_1.value='service'
uci set netmode.mode_4_supprted_args_2.value='brvlan:mixed:100'
uci set netmode.mode_4_supprted_args_3.value='LAN1-LAN2-WAN'
uci commit netmode && service netmode restart
```
**Result**: WAN tagged, LAN1 and LAN2 untagged
**Example 2: Custom Tagging (LAN1 and WAN Tagged)**:
```bash
uci set netmode.global.mode='advanced'
uci set netmode.mode_4_supprted_args_1.value='corporate'
uci set netmode.mode_4_supprted_args_2.value='brvlan:mixed:200:LAN1-WAN'
uci set netmode.mode_4_supprted_args_3.value='LAN1-LAN2-LAN3-WAN'
uci commit netmode && service netmode restart
```
**Resulting Configuration**:
```
config bridge-vlan brvlan_200_corporate
option device 'br-corporate'
option vlan '200'
list ports 'eth0:t' # LAN1 tagged
list ports 'eth1:u' # LAN2 untagged
list ports 'eth2:u' # LAN3 untagged
list ports 'ae_wan:t' # WAN tagged
```
**See [BRVLAN_MIXED_MODE_EXAMPLES.md](BRVLAN_MIXED_MODE_EXAMPLES.md) for comprehensive examples.**
---
## Comparison: Traditional vs Bridge VLAN Filtering
### Traditional VLAN Device Approach (`bridge:tagged:100`)
Creates separate VLAN devices for each port:
```
config device eth0_100
option type '8021q'
option vid '100'
option ifname 'eth0'
option name 'eth0.100'
config device wan_100
option type '8021q'
option vid '100'
option ifname 'ae_wan'
option name 'ae_wan.100'
config device br_internet
option type 'bridge'
list ports 'eth0.100'
list ports 'ae_wan.100'
```
### Bridge VLAN Filtering Approach (`brvlan:tagged:100`)
Single bridge with VLAN filtering:
```
config device br_internet
option type 'bridge'
option vlan_filtering '1'
list ports 'eth0'
list ports 'ae_wan'
config bridge-vlan brvlan_100_internet
option device 'br-internet'
option vlan '100'
list ports 'eth0:t'
list ports 'ae_wan:t'
```
---
## Use Cases
### ISP Internet Service (VLAN 1499, WAN Tagged)
```bash
uci set netmode.global.mode='advanced'
uci set netmode.mode_4_supprted_args_1.value='internet'
uci set netmode.mode_4_supprted_args_2.value='brvlan:wan-tagged:1499'
uci set netmode.mode_4_supprted_args_3.value='LAN1-LAN2-WAN'
uci commit netmode && service netmode restart
```
### IPTV Service (VLAN 1510, WAN Tagged, No DHCP)
```bash
uci set netmode.global.mode='advanced'
uci set netmode.mode_4_supprted_args_1.value='tv'
uci set netmode.mode_4_supprted_args_2.value='brvlan:wan-tagged:1510-n'
uci set netmode.mode_4_supprted_args_3.value='LAN3-LAN4-WAN'
uci commit netmode && service netmode restart
```
### Multiple Services (Internet + IPTV)
```bash
uci set netmode.global.mode='advanced'
uci set netmode.mode_4_supprted_args_1.value='internet,tv'
uci set netmode.mode_4_supprted_args_2.value='brvlan:wan-tagged:1499,brvlan:wan-tagged:1510-n'
uci set netmode.mode_4_supprted_args_3.value='LAN1-LAN2-WAN,LAN3-LAN4-WAN'
uci commit netmode && service netmode restart
```
### Corporate Network (All Ports Tagged)
```bash
uci set netmode.global.mode='advanced'
uci set netmode.mode_4_supprted_args_1.value='corporate'
uci set netmode.mode_4_supprted_args_2.value='brvlan:tagged:100'
uci set netmode.mode_4_supprted_args_3.value='ALL'
uci commit netmode && service netmode restart
```
---
## Modifiers
Bridge VLAN filtering modes support the same modifiers as traditional bridge modes:
| Modifier | Effect | Example |
|----------|--------|---------|
| `-n` | Set proto=none (no DHCP client) | `brvlan:tagged:100-n` |
| `-d` | Create but mark as disabled | `brvlan:wan-tagged:200-d` |
---
## Verification
### Check Bridge VLAN Configuration
```bash
# View bridge device
uci show network | grep "vlan_filtering"
# View bridge-vlan sections
uci show network | grep "bridge-vlan"
# View interface status
ip addr show
# View bridge VLAN table
bridge vlan show
```
### Example Output
```bash
root@router:~# bridge vlan show
port vlan-id
ae_wan 1499 Tagged
eth0 1499 Untagged
eth1 1499 Untagged
br-internet 1499
```
---
## Limitations
1. **No QinQ Support**: Bridge VLAN filtering does not currently support 802.1ad (QinQ) double tagging
2. **Single VLAN per Interface**: Each bridge-vlan section defines one VLAN
3. **Kernel Support Required**: Requires kernel with bridge VLAN filtering support
---
## Migration from Traditional Bridge
### Before (Traditional VLAN Devices)
```bash
uci set netmode.mode_4_supprted_args_2.value='bridge:wan-tagged:100'
```
### After (Bridge VLAN Filtering)
```bash
uci set netmode.mode_4_supprted_args_2.value='brvlan:wan-tagged:100'
```
Simply change the prefix from `bridge:` to `brvlan:`.
---
## Troubleshooting
### Check if VLAN Filtering is Enabled
```bash
cat /sys/class/net/br-internet/bridge/vlan_filtering
# Should output: 1
```
### View Bridge VLAN Table
```bash
bridge vlan show dev br-internet
```
### Check Kernel Support
```bash
# Check if bridge module supports vlan_filtering
cat /sys/module/bridge/parameters/vlan_filtering
```
### Enable Debug Logging
```bash
# Monitor netmode logs
logread -f | grep netmode-advanced
```
---
**Version**: 1.0
**Last Updated**: 2025-12-12
**Feature Status**: Production Ready

View File

@@ -1,318 +0,0 @@
# Bridge VLAN Filtering - Mixed Mode Examples
## Overview
The `brvlan:mixed` mode provides flexible control over which ports are tagged vs untagged in a bridge VLAN configuration. This is useful for complex scenarios where different ports need different VLAN tagging behavior.
## Syntax
### Basic Mixed Mode (Default Behavior)
```
brvlan:mixed:VID
```
**Behavior**: WAN tagged, LAN ports untagged (same as `brvlan:wan-tagged:VID`)
### Custom Mixed Mode (Specify Tagged Ports)
```
brvlan:mixed:VID:TAGGED_PORTS
```
**Behavior**: Ports listed in `TAGGED_PORTS` are tagged, all others are untagged
**TAGGED_PORTS Format**: Same as port list specification (`LAN1-LAN2-WAN`, `WAN`, etc.)
---
## Examples
### Example 1: Basic Mixed Mode (WAN Tagged by Default)
**Scenario**: Internet service where WAN needs VLAN 100, LAN ports untagged
```bash
uci set netmode.global.mode='advanced'
uci set netmode.mode_4_supprted_args_1.value='internet'
uci set netmode.mode_4_supprted_args_2.value='brvlan:mixed:100'
uci set netmode.mode_4_supprted_args_3.value='LAN1-LAN2-WAN'
uci commit netmode && service netmode restart
```
**Result**:
```
config interface 'internet'
option device 'br-internet.100'
option proto 'dhcp'
config device br_internet
option name 'br-internet'
option type 'bridge'
option vlan_filtering '1'
list ports 'eth0' # LAN1
list ports 'eth1' # LAN2
list ports 'ae_wan' # WAN
config bridge-vlan brvlan_100_internet
option device 'br-internet'
option vlan '100'
list ports 'eth0:u' # LAN1 untagged
list ports 'eth1:u' # LAN2 untagged
list ports 'ae_wan:t' # WAN tagged
```
---
### Example 2: Only Specific LAN Ports Tagged
**Scenario**: Enterprise network where LAN1 and WAN are tagged, LAN2 and LAN3 are untagged
```bash
uci set netmode.global.mode='advanced'
uci set netmode.mode_4_supprted_args_1.value='corporate'
uci set netmode.mode_4_supprted_args_2.value='brvlan:mixed:200:LAN1-WAN'
uci set netmode.mode_4_supprted_args_3.value='LAN1-LAN2-LAN3-WAN'
uci commit netmode && service netmode restart
```
**Result**:
```
config interface 'corporate'
option device 'br-corporate.200'
option proto 'dhcp'
config device br_corporate
option name 'br-corporate'
option type 'bridge'
option vlan_filtering '1'
list ports 'eth0' # LAN1
list ports 'eth1' # LAN2
list ports 'eth2' # LAN3
list ports 'ae_wan' # WAN
config bridge-vlan brvlan_200_corporate
option device 'br-corporate'
option vlan '200'
list ports 'eth0:t' # LAN1 tagged (specified)
list ports 'eth1:u' # LAN2 untagged
list ports 'eth2:u' # LAN3 untagged
list ports 'ae_wan:t' # WAN tagged (specified)
```
---
### Example 3: All LAN Ports Tagged, WAN Untagged
**Scenario**: Reverse scenario where LAN ports carry VLAN tags but WAN doesn't
```bash
uci set netmode.global.mode='advanced'
uci set netmode.mode_4_supprted_args_1.value='service'
uci set netmode.mode_4_supprted_args_2.value='brvlan:mixed:300:LAN1-LAN2-LAN3'
uci set netmode.mode_4_supprted_args_3.value='LAN1-LAN2-LAN3-WAN'
uci commit netmode && service netmode restart
```
**Result**:
```
config bridge-vlan brvlan_300_service
option device 'br-service'
option vlan '300'
list ports 'eth0:t' # LAN1 tagged
list ports 'eth1:t' # LAN2 tagged
list ports 'eth2:t' # LAN3 tagged
list ports 'ae_wan:u' # WAN untagged
```
---
### Example 4: Only WAN Tagged (Explicit)
**Scenario**: Same as `wan-tagged` but using mixed mode explicitly
```bash
uci set netmode.global.mode='advanced'
uci set netmode.mode_4_supprted_args_1.value='iptv'
uci set netmode.mode_4_supprted_args_2.value='brvlan:mixed:1510:WAN-n'
uci set netmode.mode_4_supprted_args_3.value='LAN3-LAN4-WAN'
uci commit netmode && service netmode restart
```
**Result**:
```
config interface 'iptv'
option device 'br-iptv.1510'
option proto 'none'
config bridge-vlan brvlan_1510_iptv
option device 'br-iptv'
option vlan '1510'
list ports 'eth2:u' # LAN3 untagged
list ports 'eth3:u' # LAN4 untagged
list ports 'ae_wan:t' # WAN tagged
```
---
### Example 5: Multi-Service with Different Tagging
**Scenario**: Internet with LAN1+WAN tagged, IPTV with only WAN tagged
```bash
uci set netmode.global.mode='advanced'
uci set netmode.mode_4_supprted_args_1.value='internet,tv'
uci set netmode.mode_4_supprted_args_2.value='brvlan:mixed:1499:LAN1-WAN,brvlan:mixed:1510:WAN-n'
uci set netmode.mode_4_supprted_args_3.value='LAN1-LAN2-WAN,LAN3-LAN4-WAN'
uci commit netmode && service netmode restart
```
**Result**:
**Internet Service (VLAN 1499)**:
```
config bridge-vlan brvlan_1499_internet
option device 'br-internet'
option vlan '1499'
list ports 'eth0:t' # LAN1 tagged
list ports 'eth1:u' # LAN2 untagged
list ports 'ae_wan:t' # WAN tagged
```
**TV Service (VLAN 1510)**:
```
config bridge-vlan brvlan_1510_tv
option device 'br-tv'
option vlan '1510'
list ports 'eth2:u' # LAN3 untagged
list ports 'eth3:u' # LAN4 untagged
list ports 'ae_wan:t' # WAN tagged
```
---
### Example 6: Trunk Port Configuration
**Scenario**: LAN1 as trunk port (tagged), others as access ports (untagged)
```bash
uci set netmode.global.mode='advanced'
uci set netmode.mode_4_supprted_args_1.value='vlan100'
uci set netmode.mode_4_supprted_args_2.value='brvlan:mixed:100:LAN1'
uci set netmode.mode_4_supprted_args_3.value='LAN1-LAN2-LAN3-LAN4'
uci commit netmode && service netmode restart
```
**Result**:
```
config bridge-vlan brvlan_100_vlan100
option device 'br-vlan100'
option vlan '100'
list ports 'eth0:t' # LAN1 tagged (trunk port)
list ports 'eth1:u' # LAN2 untagged (access port)
list ports 'eth2:u' # LAN3 untagged (access port)
list ports 'eth3:u' # LAN4 untagged (access port)
```
---
## Comparison: Mixed Mode vs Other Modes
| Mode | Syntax | Tagged Ports | Untagged Ports |
|------|--------|--------------|----------------|
| **tagged** | `brvlan:tagged:100` | ALL | None |
| **wan-tagged** | `brvlan:wan-tagged:100` | WAN only | All LAN |
| **mixed (default)** | `brvlan:mixed:100` | WAN only | All LAN |
| **mixed (custom)** | `brvlan:mixed:100:LAN1-WAN` | LAN1, WAN | All others |
---
## Use Cases
### Use Case 1: DMZ Configuration
- **LAN1**: Tagged (DMZ network with VLAN tag)
- **LAN2-4**: Untagged (local network)
- **WAN**: Tagged (ISP requirement)
```bash
brvlan:mixed:100:LAN1-WAN
```
### Use Case 2: Guest Network
- **LAN1-2**: Tagged (guest WiFi APs that handle VLANs)
- **LAN3-4**: Untagged (local devices)
- **WAN**: Untagged (local ISP connection)
```bash
brvlan:mixed:50:LAN1-LAN2
```
### Use Case 3: Managed Switch Uplink
- **LAN1**: Tagged (uplink to managed switch)
- **LAN2-4**: Untagged (end user devices)
- **WAN**: Tagged (ISP VLAN)
```bash
brvlan:mixed:200:LAN1-WAN
```
---
## Port Specification Reference
When specifying tagged ports in mixed mode:
| Specification | Resolves To | Example |
|---------------|-------------|---------|
| `WAN` | WAN device | `ae_wan` |
| `LAN1` | LAN1 device from UCI | `eth0` |
| `LAN1-LAN2` | LAN1 and LAN2 | `eth0`, `eth1` |
| `LAN1-WAN` | LAN1 and WAN | `eth0`, `ae_wan` |
| `ALL` | Not supported in tagged ports spec | Use `brvlan:tagged` instead |
---
## Troubleshooting
### Verify Port Tagging
```bash
# View bridge VLAN table
bridge vlan show
# Expected output shows :t (tagged) or :u (untagged)
port vlan-id
eth0 100 Tagged
eth1 100 Untagged
ae_wan 100 Tagged
```
### Check Configuration
```bash
# View bridge-vlan sections
uci show network | grep bridge-vlan -A5
# Look for ports list with :t or :u suffixes
```
### Common Mistakes
1. **Wrong Syntax**: Must use colon between VID and port spec
-`brvlan:mixed:100-LAN1-WAN`
-`brvlan:mixed:100:LAN1-WAN`
2. **Using ALL**: Don't use ALL in tagged ports
-`brvlan:mixed:100:ALL`
- ✅ Use `brvlan:tagged:100` instead
3. **Duplicate Ports**: Port appears in both bridge port list and tagged spec
- Ensure the port list in arg 3 includes all ports you reference in arg 2
---
## Advanced: Multiple VLANs on Same Bridge
While this guide focuses on single VLAN per bridge, you can create multiple bridge-vlan sections manually after netmode configuration for trunk scenarios. However, this is beyond the scope of netmode automation.
---
**Document Version**: 1.0
**Last Updated**: 2025-12-12
**Feature**: Bridge VLAN Filtering Mixed Mode

View File

@@ -1,739 +0,0 @@
# Advanced Mode - Configuration Scenarios
Complete examples for common use cases with both UCI and TR-181 configuration methods.
---
## Scenario 1: Simple Home Router (Transparent Bridge)
**Use Case**: All ports bridged together for simple home network
**Network Topology**:
```
All LAN ports + WAN → br-wan (no VLANs)
```
### UCI Configuration
```bash
uci set netmode.global.mode='advanced'
uci set netmode.mode_4_supprted_args_1.value='wan'
uci set netmode.mode_4_supprted_args_2.value='bridge:transparent'
uci set netmode.mode_4_supprted_args_3.value='ALL'
uci commit netmode && service netmode restart
```
### TR-181 Configuration
```xml
<SetParameterValues>
<ParameterList>
<ParameterValueStruct>
<Name>Device.X_IOWRT_EU_NetMode.Mode</Name>
<Value>advanced</Value>
</ParameterValueStruct>
<ParameterValueStruct>
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.1.Value</Name>
<Value>wan</Value>
</ParameterValueStruct>
<ParameterValueStruct>
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.2.Value</Name>
<Value>bridge:transparent</Value>
</ParameterValueStruct>
<ParameterValueStruct>
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.3.Value</Name>
<Value>ALL</Value>
</ParameterValueStruct>
</ParameterList>
</SetParameterValues>
```
**Result**:
- Single bridge interface `br-wan`
- All ports untagged
- DHCP client enabled
---
## Scenario 2: Traditional LAN Bridge with Routed WAN
**Use Case**: Classic router setup with LAN bridge and separate routed WAN
**Network Topology**:
```
All LAN ports → br-lan (bridge)
WAN port → wan (routed interface)
```
### UCI Configuration
```bash
uci set netmode.global.mode='advanced'
uci set netmode.mode_4_supprted_args_1.value='lan,wan'
uci set netmode.mode_4_supprted_args_2.value='bridge:transparent,route:transparent'
uci set netmode.mode_4_supprted_args_3.value='ALL_LAN,WAN'
uci commit netmode && service netmode restart
```
### TR-181 Configuration
```xml
<SetParameterValues>
<ParameterList>
<ParameterValueStruct>
<Name>Device.X_IOWRT_EU_NetMode.Mode</Name>
<Value>advanced</Value>
</ParameterValueStruct>
<ParameterValueStruct>
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.1.Value</Name>
<Value>lan,wan</Value>
</ParameterValueStruct>
<ParameterValueStruct>
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.2.Value</Name>
<Value>bridge:transparent,route:transparent</Value>
</ParameterValueStruct>
<ParameterValueStruct>
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.3.Value</Name>
<Value>ALL_LAN,WAN</Value>
</ParameterValueStruct>
</ParameterList>
</SetParameterValues>
```
**Result**:
- Bridge interface `br-lan` with all LAN ports only
- Routed interface `wan` on WAN port
- Traditional router topology
---
## Scenario 3: ISP Internet Service (Single VLAN)
**Use Case**: ISP requires VLAN 100 on WAN port for internet access
**Network Topology**:
```
WAN.100 (tagged) + LAN1-4 (untagged) → br-internet.100
```
### UCI Configuration (Bridge VLAN Filtering - Recommended)
```bash
uci set netmode.global.mode='advanced'
uci set netmode.mode_4_supprted_args_1.value='internet'
uci set netmode.mode_4_supprted_args_2.value='brvlan:wan-tagged:100'
uci set netmode.mode_4_supprted_args_3.value='ALL'
uci commit netmode && service netmode restart
```
### UCI Configuration (Traditional VLAN Devices)
```bash
uci set netmode.global.mode='advanced'
uci set netmode.mode_4_supprted_args_1.value='internet'
uci set netmode.mode_4_supprted_args_2.value='bridge:wan-tagged:100'
uci set netmode.mode_4_supprted_args_3.value='ALL'
uci commit netmode && service netmode restart
```
### TR-181 Configuration
```xml
<SetParameterValues>
<ParameterList>
<ParameterValueStruct>
<Name>Device.X_IOWRT_EU_NetMode.Mode</Name>
<Value>advanced</Value>
</ParameterValueStruct>
<ParameterValueStruct>
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.1.Value</Name>
<Value>internet</Value>
</ParameterValueStruct>
<ParameterValueStruct>
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.2.Value</Name>
<Value>brvlan:wan-tagged:100</Value>
</ParameterValueStruct>
<ParameterValueStruct>
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.3.Value</Name>
<Value>ALL</Value>
</ParameterValueStruct>
</ParameterList>
</SetParameterValues>
```
**Result**:
- WAN port tagged with VLAN 100
- LAN ports untagged
- DHCP client enabled
---
## Scenario 4: ISP Dual Service (Internet + IPTV)
**Use Case**: ISP provides Internet on VLAN 1499 and IPTV on VLAN 1510
**Network Topology**:
```
Internet: WAN.1499 (tagged) + LAN1-2 (untagged) → br-internet.1499
IPTV: WAN.1510 (tagged) + LAN3-4 (untagged) → br-tv.1510
```
### UCI Configuration
```bash
uci set netmode.global.mode='advanced'
uci set netmode.mode_4_supprted_args_1.value='internet,tv'
uci set netmode.mode_4_supprted_args_2.value='brvlan:wan-tagged:1499,brvlan:wan-tagged:1510-n'
uci set netmode.mode_4_supprted_args_3.value='LAN1-LAN2-WAN,LAN3-LAN4-WAN'
uci commit netmode && service netmode restart
```
### TR-181 Configuration
```xml
<SetParameterValues>
<ParameterList>
<ParameterValueStruct>
<Name>Device.X_IOWRT_EU_NetMode.Mode</Name>
<Value>advanced</Value>
</ParameterValueStruct>
<ParameterValueStruct>
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.1.Value</Name>
<Value>internet,tv</Value>
</ParameterValueStruct>
<ParameterValueStruct>
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.2.Value</Name>
<Value>brvlan:wan-tagged:1499,brvlan:wan-tagged:1510-n</Value>
</ParameterValueStruct>
<ParameterValueStruct>
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.3.Value</Name>
<Value>LAN1-LAN2-WAN,LAN3-LAN4-WAN</Value>
</ParameterValueStruct>
</ParameterList>
</SetParameterValues>
```
**Result**:
- Internet bridge on VLAN 1499 with LAN1-2
- IPTV bridge on VLAN 1510 with LAN3-4 (proto=none, no DHCP)
- Both services use WAN port with respective VLANs
---
## Scenario 5: ISP Triple-Play (Internet + IPTV + VoIP)
**Use Case**: Full triple-play service with Internet, IPTV, and VoIP
**Network Topology**:
```
Internet: WAN.100 (tagged) + LAN1-2 (untagged) → br-internet.100
IPTV: WAN.200 (tagged) + LAN3 (untagged) → br-tv.200
VoIP: WAN.300 (tagged) + LAN4 (untagged) → br-voip.300
```
### UCI Configuration
```bash
uci set netmode.global.mode='advanced'
uci set netmode.mode_4_supprted_args_1.value='internet,tv,voip'
uci set netmode.mode_4_supprted_args_2.value='brvlan:wan-tagged:100,brvlan:wan-tagged:200-n,brvlan:wan-tagged:300-n'
uci set netmode.mode_4_supprted_args_3.value='LAN1-LAN2-WAN,LAN3-WAN,LAN4-WAN'
uci commit netmode && service netmode restart
```
### TR-181 Configuration
```xml
<SetParameterValues>
<ParameterList>
<ParameterValueStruct>
<Name>Device.X_IOWRT_EU_NetMode.Mode</Name>
<Value>advanced</Value>
</ParameterValueStruct>
<ParameterValueStruct>
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.1.Value</Name>
<Value>internet,tv,voip</Value>
</ParameterValueStruct>
<ParameterValueStruct>
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.2.Value</Name>
<Value>brvlan:wan-tagged:100,brvlan:wan-tagged:200-n,brvlan:wan-tagged:300-n</Value>
</ParameterValueStruct>
<ParameterValueStruct>
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.3.Value</Name>
<Value>LAN1-LAN2-WAN,LAN3-WAN,LAN4-WAN</Value>
</ParameterValueStruct>
</ParameterList>
</SetParameterValues>
```
**Result**:
- Internet on VLAN 100 with DHCP (LAN1-2)
- IPTV on VLAN 200 without DHCP (LAN3)
- VoIP on VLAN 300 without DHCP (LAN4)
---
## Scenario 6: Routed Multi-Service (Internet + IPTV + Management)
**Use Case**: Multiple routed services on different VLANs with NAT/firewall
**Network Topology**:
```
WAN.100 → wan (routed, DHCP, firewall)
WAN.200 → iptv (routed, DHCP, firewall)
WAN.300 → mgmt (routed, DHCP, firewall)
```
### UCI Configuration
```bash
uci set netmode.global.mode='advanced'
uci set netmode.mode_4_supprted_args_1.value='wan,iptv,mgmt'
uci set netmode.mode_4_supprted_args_2.value='route:vlan:100,route:vlan:200,route:vlan:300'
uci set netmode.mode_4_supprted_args_3.value='WAN,WAN,WAN'
uci commit netmode && service netmode restart
```
### TR-181 Configuration
```xml
<SetParameterValues>
<ParameterList>
<ParameterValueStruct>
<Name>Device.X_IOWRT_EU_NetMode.Mode</Name>
<Value>advanced</Value>
</ParameterValueStruct>
<ParameterValueStruct>
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.1.Value</Name>
<Value>wan,iptv,mgmt</Value>
</ParameterValueStruct>
<ParameterValueStruct>
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.2.Value</Name>
<Value>route:vlan:100,route:vlan:200,route:vlan:300</Value>
</ParameterValueStruct>
<ParameterValueStruct>
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.3.Value</Name>
<Value>WAN,WAN,WAN</Value>
</ParameterValueStruct>
</ParameterList>
</SetParameterValues>
```
**Result**:
- Three separate routed interfaces
- Each with own firewall zone
- All with DHCP clients enabled
---
## Scenario 7: Hybrid Setup (Routed Internet + Bridged IPTV)
**Use Case**: Internet needs routing/NAT, but IPTV needs transparent bridge to STBs
**Network Topology**:
```
WAN.100 → wan (routed, firewall)
WAN.200 + LAN1-3 → br-iptv.200 (bridged, transparent)
```
### UCI Configuration
```bash
uci set netmode.global.mode='advanced'
uci set netmode.mode_4_supprted_args_1.value='wan,iptv'
uci set netmode.mode_4_supprted_args_2.value='route:vlan:100,brvlan:wan-tagged:200-n'
uci set netmode.mode_4_supprted_args_3.value='WAN,LAN1-LAN2-LAN3-WAN'
uci commit netmode && service netmode restart
```
### TR-181 Configuration
```xml
<SetParameterValues>
<ParameterList>
<ParameterValueStruct>
<Name>Device.X_IOWRT_EU_NetMode.Mode</Name>
<Value>advanced</Value>
</ParameterValueStruct>
<ParameterValueStruct>
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.1.Value</Name>
<Value>wan,iptv</Value>
</ParameterValueStruct>
<ParameterValueStruct>
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.2.Value</Name>
<Value>route:vlan:100,brvlan:wan-tagged:200-n</Value>
</ParameterValueStruct>
<ParameterValueStruct>
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.3.Value</Name>
<Value>WAN,LAN1-LAN2-LAN3-WAN</Value>
</ParameterValueStruct>
</ParameterList>
</SetParameterValues>
```
**Result**:
- WAN interface routed with firewall
- IPTV bridged transparently to LAN ports
- Firewall enabled (because of routed interface)
---
## Scenario 8: Corporate Network with Trunk Port
**Use Case**: LAN1 is trunk port to managed switch, other ports are access ports
**Network Topology**:
```
VLAN 200: LAN1 (tagged) + WAN (tagged) + LAN2-3 (untagged) → br-corporate.200
```
### UCI Configuration
```bash
uci set netmode.global.mode='advanced'
uci set netmode.mode_4_supprted_args_1.value='corporate'
uci set netmode.mode_4_supprted_args_2.value='brvlan:mixed:200:LAN1-WAN'
uci set netmode.mode_4_supprted_args_3.value='LAN1-LAN2-LAN3-WAN'
uci commit netmode && service netmode restart
```
### TR-181 Configuration
```xml
<SetParameterValues>
<ParameterList>
<ParameterValueStruct>
<Name>Device.X_IOWRT_EU_NetMode.Mode</Name>
<Value>advanced</Value>
</ParameterValueStruct>
<ParameterValueStruct>
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.1.Value</Name>
<Value>corporate</Value>
</ParameterValueStruct>
<ParameterValueStruct>
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.2.Value</Name>
<Value>brvlan:mixed:200:LAN1-WAN</Value>
</ParameterValueStruct>
<ParameterValueStruct>
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.3.Value</Name>
<Value>LAN1-LAN2-LAN3-WAN</Value>
</ParameterValueStruct>
</ParameterList>
</SetParameterValues>
```
**Result**:
- LAN1 and WAN tagged (trunk ports)
- LAN2-3 untagged (access ports)
- All on VLAN 200
---
## Scenario 9: Enterprise Multi-VLAN (Separate Networks)
**Use Case**: Separate networks for guest, corporate, and management
**Network Topology**:
```
Guest: WAN.100 (tagged) + LAN1 (untagged) → br-guest.100
Corporate: WAN.200 (tagged) + LAN2-3 (untagged) → br-corporate.200
Management: WAN.300 (tagged) + LAN4 (untagged) → br-mgmt.300
```
### UCI Configuration
```bash
uci set netmode.global.mode='advanced'
uci set netmode.mode_4_supprted_args_1.value='guest,corporate,mgmt'
uci set netmode.mode_4_supprted_args_2.value='brvlan:wan-tagged:100-n,brvlan:wan-tagged:200-n,brvlan:wan-tagged:300'
uci set netmode.mode_4_supprted_args_3.value='LAN1-WAN,LAN2-LAN3-WAN,LAN4-WAN'
uci commit netmode && service netmode restart
```
### TR-181 Configuration
```xml
<SetParameterValues>
<ParameterList>
<ParameterValueStruct>
<Name>Device.X_IOWRT_EU_NetMode.Mode</Name>
<Value>advanced</Value>
</ParameterValueStruct>
<ParameterValueStruct>
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.1.Value</Name>
<Value>guest,corporate,mgmt</Value>
</ParameterValueStruct>
<ParameterValueStruct>
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.2.Value</Name>
<Value>brvlan:wan-tagged:100-n,brvlan:wan-tagged:200-n,brvlan:wan-tagged:300</Value>
</ParameterValueStruct>
<ParameterValueStruct>
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.3.Value</Name>
<Value>LAN1-WAN,LAN2-LAN3-WAN,LAN4-WAN</Value>
</ParameterValueStruct>
</ParameterList>
</SetParameterValues>
```
**Result**:
- Guest network on VLAN 100 (no DHCP)
- Corporate network on VLAN 200 (no DHCP)
- Management network on VLAN 300 (DHCP enabled)
---
## Scenario 10: Wholesale QinQ Provider
**Use Case**: Service provider supporting multiple customers with QinQ (802.1ad)
**Network Topology**:
```
Customer A: All ports double-tagged (S-tag 100, C-tag 10)
Customer B: All ports double-tagged (S-tag 100, C-tag 20)
```
### UCI Configuration
```bash
uci set netmode.global.mode='advanced'
uci set netmode.mode_4_supprted_args_1.value='customer_a,customer_b'
uci set netmode.mode_4_supprted_args_2.value='bridge:qinq:10:100-n,bridge:qinq:20:100-n'
uci set netmode.mode_4_supprted_args_3.value='LAN1-LAN2-WAN,LAN3-LAN4-WAN'
uci commit netmode && service netmode restart
```
### TR-181 Configuration
```xml
<SetParameterValues>
<ParameterList>
<ParameterValueStruct>
<Name>Device.X_IOWRT_EU_NetMode.Mode</Name>
<Value>advanced</Value>
</ParameterValueStruct>
<ParameterValueStruct>
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.1.Value</Name>
<Value>customer_a,customer_b</Value>
</ParameterValueStruct>
<ParameterValueStruct>
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.2.Value</Name>
<Value>bridge:qinq:10:100-n,bridge:qinq:20:100-n</Value>
</ParameterValueStruct>
<ParameterValueStruct>
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.3.Value</Name>
<Value>LAN1-LAN2-WAN,LAN3-LAN4-WAN</Value>
</ParameterValueStruct>
</ParameterList>
</SetParameterValues>
```
**Result**:
- Customer A bridge with C-tag 10, S-tag 100
- Customer B bridge with C-tag 20, S-tag 100
- Both without DHCP (proto=none)
**Note**: QinQ requires traditional `bridge:` mode, not available with `brvlan:` mode.
---
## Scenario 11: MACVLAN Multi-Service (Different MAC Addresses)
**Use Case**: ISP requires different MAC addresses for Internet and IPTV services
**Network Topology**:
```
WAN (default MAC) → wan (routed)
WAN (custom MAC) → iptv (routed)
```
### UCI Configuration
```bash
uci set netmode.global.mode='advanced'
uci set netmode.mode_4_supprted_args_1.value='wan,iptv'
uci set netmode.mode_4_supprted_args_2.value='route:transparent,route:macvlan:AA:BB:CC:DD:EE:FF'
uci set netmode.mode_4_supprted_args_3.value='WAN,WAN'
uci commit netmode && service netmode restart
```
### TR-181 Configuration
```xml
<SetParameterValues>
<ParameterList>
<ParameterValueStruct>
<Name>Device.X_IOWRT_EU_NetMode.Mode</Name>
<Value>advanced</Value>
</ParameterValueStruct>
<ParameterValueStruct>
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.1.Value</Name>
<Value>wan,iptv</Value>
</ParameterValueStruct>
<ParameterValueStruct>
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.2.Value</Name>
<Value>route:transparent,route:macvlan:AA:BB:CC:DD:EE:FF</Value>
</ParameterValueStruct>
<ParameterValueStruct>
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.3.Value</Name>
<Value>WAN,WAN</Value>
</ParameterValueStruct>
</ParameterList>
</SetParameterValues>
```
**Result**:
- WAN interface with default MAC
- IPTV interface with custom MAC (AA:BB:CC:DD:EE:FF)
- Both routed with firewall
---
## Scenario 12: Standalone VLAN Interface
**Use Case**: WAN as standalone VLAN interface (no bridge, no routing, for custom protocols)
**Network Topology**:
```
WAN.2501 → wan (standalone, proto=none)
```
### UCI Configuration
```bash
uci set netmode.global.mode='advanced'
uci set netmode.mode_4_supprted_args_1.value='wan'
uci set netmode.mode_4_supprted_args_2.value='direct:2501'
uci set netmode.mode_4_supprted_args_3.value='WAN'
uci commit netmode && service netmode restart
```
### TR-181 Configuration
```xml
<SetParameterValues>
<ParameterList>
<ParameterValueStruct>
<Name>Device.X_IOWRT_EU_NetMode.Mode</Name>
<Value>advanced</Value>
</ParameterValueStruct>
<ParameterValueStruct>
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.1.Value</Name>
<Value>wan</Value>
</ParameterValueStruct>
<ParameterValueStruct>
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.2.Value</Name>
<Value>direct:2501</Value>
</ParameterValueStruct>
<ParameterValueStruct>
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.3.Value</Name>
<Value>WAN</Value>
</ParameterValueStruct>
</ParameterList>
</SetParameterValues>
```
**Result**:
- WAN.2501 VLAN device created
- No bridge, no routing layer
- proto=none (manual configuration needed)
---
## Scenario 13: All Ports Tagged (Managed Network)
**Use Case**: All ports need VLAN tags for managed switch environment
**Network Topology**:
```
VLAN 100: All ports tagged → br-mgmt.100
```
### UCI Configuration
```bash
uci set netmode.global.mode='advanced'
uci set netmode.mode_4_supprted_args_1.value='mgmt'
uci set netmode.mode_4_supprted_args_2.value='brvlan:tagged:100'
uci set netmode.mode_4_supprted_args_3.value='ALL'
uci commit netmode && service netmode restart
```
### TR-181 Configuration
```xml
<SetParameterValues>
<ParameterList>
<ParameterValueStruct>
<Name>Device.X_IOWRT_EU_NetMode.Mode</Name>
<Value>advanced</Value>
</ParameterValueStruct>
<ParameterValueStruct>
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.1.Value</Name>
<Value>mgmt</Value>
</ParameterValueStruct>
<ParameterValueStruct>
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.2.Value</Name>
<Value>brvlan:tagged:100</Value>
</ParameterValueStruct>
<ParameterValueStruct>
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.3.Value</Name>
<Value>ALL</Value>
</ParameterValueStruct>
</ParameterList>
</SetParameterValues>
```
**Result**:
- All ports (LAN + WAN) tagged with VLAN 100
- Single bridge with VLAN filtering
- DHCP client enabled
---
## Quick Reference: Configuration Cheat Sheet
### Interface Types
| Type | Syntax | When to Use |
|------|--------|-------------|
| Transparent Bridge | `bridge:transparent` | Simple home network, no VLANs |
| Bridge VLAN Filtering (Tagged) | `brvlan:tagged:VID` | All ports need VLAN tags, modern approach |
| Bridge VLAN Filtering (WAN Tagged) | `brvlan:wan-tagged:VID` | ISP VLAN on WAN, LAN untagged (recommended) |
| Bridge VLAN Filtering (Mixed) | `brvlan:mixed:VID:PORTS` | Custom trunk/access port setup |
| Traditional Tagged Bridge | `bridge:tagged:VID` | Legacy systems, all ports tagged |
| Traditional WAN Tagged | `bridge:wan-tagged:VID` | Legacy ISP VLAN setup |
| QinQ Bridge | `bridge:qinq:CVID:SVID` | Wholesale provider, double tagging |
| Routed VLAN | `route:vlan:VID` | Need routing/NAT per service |
| Routed MACVLAN | `route:macvlan:MAC` | Different MAC per service |
| Direct VLAN | `direct:VID` | Standalone VLAN for custom protocols |
### Modifiers
| Modifier | Effect | Example |
|----------|--------|---------|
| `-n` | Disable DHCP client (proto=none) | `brvlan:wan-tagged:100-n` |
| `-d` | Disable interface | `route:vlan:200-d` |
### Port Specifications
| Syntax | Meaning |
|--------|---------|
| `ALL` | All LAN + WAN ports |
| `WAN` | WAN port only |
| `LAN1-LAN2-WAN` | LAN1, LAN2, and WAN |
| `LAN1-LAN3` | LAN1 and LAN3 only |
### MAC Address Macros
| Macro | Description | Example Result |
|-------|-------------|----------------|
| `BaseMACAddress` | Base MAC from `fw_printenv -n ethaddr` | `94:3F:0C:D5:76:00` |
| `BaseMACAddressP1` | Base MAC + 1 | `94:3F:0C:D5:76:01` |
| `BaseMACAddressP2` | Base MAC + 2 | `94:3F:0C:D5:76:02` |
| `BaseMACAddressPN` | Base MAC + N | `BaseMACAddressP5``94:3F:0C:D5:76:05` |
| Explicit MAC | Direct assignment | `AA:BB:CC:DD:EE:FF` |
---
**Document Version**: 1.0
**Last Updated**: 2025-12-12

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,422 +0,0 @@
# Netmode - Network Mode Switching for OpenWrt/iopsys
**Version**: 1.1.11
**License**: GPL-2.0-only
**Maintainer**: iopsys
## Overview
Netmode is a network configuration management package for OpenWrt/iopsys-based routers that enables seamless switching between different WAN connection types. It provides a unified interface for managing network modes including DHCP, PPPoE, Static IP, and Bridge configurations.
### Key Features
- **Simple Mode Switching**: Change WAN connection type with a single command
- **Multiple Mode Support**: DHCP, PPPoE, Static IP, and Bridged mode
- **Automatic Configuration**: Handles network, firewall, DHCP, and multicast settings
- **TR-069/USP Integration**: Remote management via BBF data model
- **Extensible Architecture**: Easy to add custom network modes
- **Safe Transitions**: Proper cleanup and validation during mode switches
## Quick Start
### Installation
```bash
# Install via opkg
opkg update
opkg install netmode
# Or build from source
make package/feeds/iopsys/netmode/compile
```
### Basic Usage
```bash
# Check current mode
cat /etc/netmodes/.last_mode
# Switch to DHCP mode
uci set netmode.global.mode='routed-dhcp'
uci commit netmode
service netmode restart
# Switch to PPPoE mode
uci set netmode.global.mode='routed-pppoe'
uci set netmode.@supported_args[2].value='username@isp.com'
uci set netmode.@supported_args[3].value='password'
uci commit netmode
service netmode restart
```
## Supported Modes
| Mode | Description | Use Case |
|------|-------------|----------|
| **routed-dhcp** | Router with DHCP WAN | Cable/Fiber internet with automatic IP |
| **routed-pppoe** | Router with PPPoE WAN | DSL internet with authentication |
| **routed-static** | Router with Static IP WAN | Business connections with fixed IP |
| **advanced** ⭐ | **Unified Advanced Mode** | Bridges, routed interfaces, VLAN, QinQ, MACVLAN - all in one |
### Advanced Mode (v1.1.11+) - Recommended
The **advanced** mode is a unified, powerful configuration mode that replaces both `bridged` and `routed-multi-service` modes. It supports:
**Bridge interfaces** with VLAN/QinQ support (traditional VLAN devices)
**Bridge VLAN filtering** (modern kernel bridge VLAN filtering - **recommended**)
**Routed interfaces** with VLAN/MACVLAN support
**Standalone VLAN interfaces** (direct, no bridge)
**Mixed scenarios** (combine bridges and routed interfaces)
**Flexible configuration** with single, intuitive syntax
**MAC address assignment** with macros (BaseMACAddress, BaseMACAddressPNN)
**Comprehensive validation** with helpful error messages
**Quick Example - Triple-Play Service**:
```bash
uci set netmode.global.mode='advanced'
uci set netmode.@supported_args[0].value='wan,iptv,mgmt'
uci set netmode.@supported_args[1].value='route:vlan:100,route:vlan:200,route:vlan:300'
uci set netmode.@supported_args[2].value='WAN,WAN,WAN'
uci commit netmode && service netmode restart
```
See **[ADVANCED_MODE_GUIDE.md](ADVANCED_MODE_GUIDE.md)** for complete documentation.
## Documentation
Comprehensive documentation is available in the following guides:
### For Users
- **[ADVANCED_MODE_GUIDE.md](ADVANCED_MODE_GUIDE.md)** ⭐ - **Complete advanced mode guide** (RECOMMENDED)
- All interface types (bridge, routed, standalone)
- VLAN, QinQ, MACVLAN configurations
- Bridge VLAN filtering (modern approach)
- Real-world use case scenarios
- TR-069/USP examples
- Troubleshooting
- **[BRIDGE_VLAN_FILTERING.md](BRIDGE_VLAN_FILTERING.md)** 🆕 - **Bridge VLAN filtering guide**
- Modern bridge VLAN filtering feature
- Syntax and configuration examples
- Performance benefits
- Migration from traditional VLAN devices
- **[ADVANCED_MODE_QUICK_REFERENCE.md](ADVANCED_MODE_QUICK_REFERENCE.md)** - Quick reference for advanced mode
- **[CONFIGURATION_SCENARIOS.md](CONFIGURATION_SCENARIOS.md)** - Real-world configuration examples with UCI and TR-181
- **[VALIDATION_AND_ERROR_HANDLING.md](VALIDATION_AND_ERROR_HANDLING.md)** 🆕 - **Validation and error handling guide**
- Input validation rules
- Error messages and troubleshooting
- Common validation errors
- Testing validation
- **[USER_GUIDE.md](USER_GUIDE.md)** - User guide for basic modes (DHCP, PPPoE, Static)
- Getting started
- Mode descriptions
- Common use cases
- FAQ
### For Developers
- **[DEVELOPER_GUIDE.md](DEVELOPER_GUIDE.md)** - Developer documentation
- Development environment setup
- Code organization
- API reference
- Testing framework
- Contributing guidelines
### For Implementers
- **[IMPLEMENTATION_GUIDE.md](IMPLEMENTATION_GUIDE.md)** - Implementation details
- Architecture overview
- Creating custom modes
- Environment variables
- Hook system
- Data model integration
## Architecture
```
┌─────────────────────────────────────────┐
│ Netmode System │
├─────────────────────────────────────────┤
│ UCI Config → Init Service → Mode Scripts│
│ ↓ ↓ ↓ │
│ Environment Pre-hooks UCI Copy │
│ Variables ↓ ↓ │
│ ↓ Mode Scripts Post-hooks │
│ └──────────┴────────────┘ │
│ Network Reconfiguration │
└─────────────────────────────────────────┘
```
### Components
- **Init Service** (`/etc/init.d/netmode`): Orchestrates mode switching
- **Mode Scripts** (`/etc/netmodes/<mode>/scripts/`): Mode-specific configuration
- **UCI Config** (`/etc/config/netmode`): Mode definitions and parameters
- **Data Model** (`datamodel.json`): BBF TR-181 integration
- **Hooks** (`/lib/netmode/{pre,post}/`): Pre/post mode switch scripts
## Configuration Examples
### DHCP with VLAN
```bash
uci set netmode.global.mode='routed-dhcp'
uci set netmode.@supported_args[0].value='100' # VLAN ID
uci commit netmode
service netmode restart
```
### PPPoE with Custom DNS
```bash
uci set netmode.global.mode='routed-pppoe'
uci set netmode.@supported_args[2].value='user@isp.com'
uci set netmode.@supported_args[3].value='password123'
uci set netmode.@supported_args[6].value='8.8.8.8,8.8.4.4'
uci commit netmode
service netmode restart
```
### Static IP Business Connection
```bash
uci set netmode.global.mode='routed-static'
uci set netmode.@supported_args[6].value='203.0.113.10'
uci set netmode.@supported_args[7].value='255.255.255.0'
uci set netmode.@supported_args[8].value='203.0.113.1'
uci commit netmode
service netmode restart
```
## Creating Custom Modes
Custom network modes can be added by following these steps:
1. **Create mode directory structure**:
```bash
mkdir -p /etc/netmodes/my-mode/scripts
```
2. **Define mode in supported_modes.json**:
```json
{
"name": "my-mode",
"description": "My Custom Mode",
"supported_args": [...]
}
```
3. **Create mode script**:
```bash
cat > /etc/netmodes/my-mode/scripts/10-my-mode << 'EOF'
#!/bin/sh
# Configuration logic here
EOF
chmod +x /etc/netmodes/my-mode/scripts/10-my-mode
```
4. **Import to UCI and test**:
```bash
sh /etc/uci-defaults/40_netmode_populated_supported_modes
uci set netmode.global.mode='my-mode'
service netmode restart
```
See [IMPLEMENTATION_GUIDE.md](IMPLEMENTATION_GUIDE.md#creating-a-new-network-mode) for detailed instructions.
## TR-069/USP Integration
Netmode exposes a BBF TR-181 data model for remote management:
**Data Model Path**: `Device.X_IOWRT_EU_NetMode.`
```
Device.X_IOWRT_EU_NetMode.
├── Enable (boolean, r/w)
├── Mode (string, r/w)
├── SupportedModesNumberOfEntries (unsignedInt, r)
└── SupportedModes.{i}.
├── Name (string, r)
├── Description (string, r)
└── SupportedArguments.{i}.
├── Name (string, r)
├── Type (string, r)
├── Required (boolean, r)
└── Value (string, r/w)
```
Example TR-069 operation:
```xml
<SetParameterValues>
<ParameterList>
<ParameterValueStruct>
<Name>Device.X_IOWRT_EU_NetMode.Mode</Name>
<Value>routed-dhcp</Value>
</ParameterValueStruct>
</ParameterList>
</SetParameterValues>
```
## System Requirements
- **Platform**: OpenWrt/iopsys
- **Dependencies**:
- `dm-service` (BBF data model service)
- `uci`
- `procd`
- `libubox` (jshn)
- **Recommended**:
- `logread` for monitoring
- `firewall`, `odhcpd`, `mcast` for full functionality
## File Structure
```
netmode/
├── Makefile # Package build definition
├── README.md # This file
├── IMPLEMENTATION_GUIDE.md # Implementation guide
├── DEVELOPER_GUIDE.md # Developer documentation
├── USER_GUIDE.md # User documentation
├── bbfdm_service.json # BBF service registration
└── files/
├── etc/
│ ├── config/netmode # UCI configuration
│ ├── init.d/netmode # Init script (START=11)
│ ├── uci-defaults/ # First-boot scripts
│ └── netmodes/
│ ├── supported_modes.json # Mode definitions
│ ├── routed-dhcp/scripts/
│ ├── routed-pppoe/scripts/
│ ├── routed-static/scripts/
│ └── bridged/scripts/
└── lib/
├── netmode/
│ ├── pre/ # Pre-switch hooks
│ └── post/ # Post-switch hooks
└── upgrade/keep.d/netmode # Sysupgrade preservation
```
## Troubleshooting
### Mode Not Switching
```bash
# Check if enabled
uci get netmode.global.enabled
# Check logs
logread | grep netmode
# Force mode change
rm /etc/netmodes/.last_mode
service netmode restart
```
### No Internet After Switch
```bash
# Verify mode applied
cat /etc/netmodes/.last_mode
# Check WAN status
ifconfig wan
ip route
# Restart network
/etc/init.d/network restart
```
### PPPoE Authentication Failed
```bash
# Check credentials
uci show network.wan | grep -E "username|password"
# Check logs
logread | grep ppp
# Verify VLAN if required
uci get network.wan.device
```
See [USER_GUIDE.md](USER_GUIDE.md#troubleshooting) for comprehensive troubleshooting.
## Development
### Building
```bash
# Clone repository
cd feeds/iopsys/netmode
# Build package
make package/feeds/iopsys/netmode/compile V=s
# Install on device
scp bin/packages/*/iopsys/netmode_*.ipk root@192.168.1.1:/tmp/
ssh root@192.168.1.1 "opkg install /tmp/netmode_*.ipk"
```
### Testing
```bash
# Run mode switch test
./test-mode-switch.sh routed-dhcp
# Monitor logs
logread -f | grep netmode
# Verify configuration
uci show network
cat /etc/netmodes/.last_mode
```
### Contributing
Contributions are welcome! Please follow these steps:
1. Fork the repository
2. Create a feature branch
3. Make your changes
4. Test thoroughly on target hardware
5. Update documentation
6. Submit a pull request
See [DEVELOPER_GUIDE.md](DEVELOPER_GUIDE.md#contributing-guidelines) for detailed guidelines.
## License
This project is licensed under the GNU General Public License v2.0 only.
See `/LICENSE` for more information.
## Support
- **Documentation**: See guides in this repository
- **Issues**: Contact iopsys development team
- **Community**: OpenWrt and iopsys forums
## Changelog
### Version 1.1.11
- Current stable release
- Support for DHCP, PPPoE, Static IP, and Bridge modes
- BBF TR-181 data model integration
- Comprehensive documentation
## Acknowledgments
- OpenWrt project for the underlying platform
- iopsys for development and maintenance
- Contributors and testers
## Related Projects
- [OpenWrt](https://openwrt.org/) - Linux operating system for embedded devices
- [iopsys](https://www.iopsys.eu/) - Broadband device management
- [BBF](https://www.broadband-forum.org/) - Broadband Forum standards
---
**For detailed information, please refer to the specific guides:**
- Users: [USER_GUIDE.md](USER_GUIDE.md)
- Developers: [DEVELOPER_GUIDE.md](DEVELOPER_GUIDE.md)
- Implementers: [IMPLEMENTATION_GUIDE.md](IMPLEMENTATION_GUIDE.md)

Some files were not shown because too many files have changed in this diff Show More