mirror of
https://dev.iopsys.eu/feed/iopsys.git
synced 2025-12-26 03:53:58 +08:00
Compare commits
181 Commits
ex400
...
dual_stack
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6066487307 | ||
|
|
0fcd253304 | ||
|
|
ee9528cfa6 | ||
|
|
be03425493 | ||
|
|
60206d37fc | ||
|
|
7a7719d10e | ||
|
|
67e43d1fd7 | ||
|
|
c496d0bc1c | ||
|
|
350a814e95 | ||
|
|
91da2b0c5b | ||
|
|
e7a589a524 | ||
|
|
bd943a5eeb | ||
|
|
dafd42d2e8 | ||
|
|
3e8f59a75c | ||
|
|
a522817e1f | ||
|
|
dc4065b68b | ||
|
|
a51633f9da | ||
|
|
402b17bec2 | ||
|
|
32c232cdbe | ||
|
|
9cf5186546 | ||
|
|
dc9e060ee5 | ||
|
|
0a271e8449 | ||
|
|
b7fc922820 | ||
|
|
413bf32059 | ||
|
|
d5ccc91d7f | ||
|
|
7dab676e68 | ||
|
|
9d9f5980d3 | ||
|
|
e0fb31082b | ||
|
|
d4bae2ec02 | ||
|
|
fdc123c60b | ||
|
|
842d3b416d | ||
|
|
c75d6dfc5b | ||
|
|
a199588e9f | ||
|
|
d34a1e379e | ||
|
|
339a34490b | ||
|
|
b16d125624 | ||
|
|
12b0229129 | ||
|
|
de6c9598ba | ||
|
|
cc94b288d7 | ||
|
|
6795490c6a | ||
|
|
c36f7967ae | ||
|
|
7006566087 | ||
|
|
2870af12ed | ||
|
|
4d2cb43980 | ||
|
|
08397bed23 | ||
|
|
b1a5ff1206 | ||
|
|
129dc2cf22 | ||
|
|
db2176be45 | ||
|
|
176bbf7566 | ||
|
|
13c0240e55 | ||
|
|
1990bb5c87 | ||
|
|
5687972623 | ||
|
|
e43f9a3b87 | ||
|
|
e7b2f63e4d | ||
|
|
c4c94d544b | ||
|
|
b179460524 | ||
|
|
0e3291c267 | ||
|
|
8d901ea47f | ||
|
|
b5579e9e54 | ||
|
|
7b0eceb68a | ||
|
|
e9c4415255 | ||
|
|
64e1cfb9d1 | ||
|
|
0a3fefb3ab | ||
|
|
7de9e6c348 | ||
|
|
3472f88614 | ||
|
|
e58207edf0 | ||
|
|
54402f6602 | ||
|
|
28c2060dd0 | ||
|
|
06ac881ea8 | ||
|
|
4350dad6ca | ||
|
|
c7443c7c2d | ||
|
|
a22898c92b | ||
|
|
39dbb175b9 | ||
|
|
ef22cee7a0 | ||
|
|
27e9f13529 | ||
|
|
158927eb5f | ||
|
|
f6966c07af | ||
|
|
7f9972a43b | ||
|
|
1b10c4e030 | ||
|
|
6c4b157002 | ||
|
|
0230678f60 | ||
|
|
5cf4ea6045 | ||
|
|
13062d1ba0 | ||
|
|
4ce3134b14 | ||
|
|
e18842ac85 | ||
|
|
2a87ab3bf4 | ||
|
|
e0534180ba | ||
|
|
eaaba91dd2 | ||
|
|
15d3510256 | ||
|
|
7847ed2c93 | ||
|
|
aaae999e3e | ||
|
|
77d1d82a89 | ||
|
|
fb324be411 | ||
|
|
d3b5a45c4c | ||
|
|
0d43ed56ba | ||
|
|
391887f09d | ||
|
|
630e2131b8 | ||
|
|
a73368eb2c | ||
|
|
920a7d0346 | ||
|
|
8ff5a2870f | ||
|
|
cf306ffaeb | ||
|
|
9702bdf7e5 | ||
|
|
7f4e2c0675 | ||
|
|
9a3777dde9 | ||
|
|
964cff4e75 | ||
|
|
97398cb1f6 | ||
|
|
c1d6a3f19e | ||
|
|
cd507fc16d | ||
|
|
b07f22de1f | ||
|
|
b12efc747b | ||
|
|
505c95f23b | ||
|
|
ff2f9a084e | ||
|
|
272bdc559c | ||
|
|
995764bd31 | ||
|
|
7b483aa6e5 | ||
|
|
8b3267a444 | ||
|
|
262e344ac3 | ||
|
|
3676754e61 | ||
|
|
e8800e61b8 | ||
|
|
b58d43d19a | ||
|
|
dc6f85134d | ||
|
|
10a022c0ae | ||
|
|
f8c2a15174 | ||
|
|
5384408a63 | ||
|
|
71ea7517a7 | ||
|
|
306aabe4ea | ||
|
|
21b15495da | ||
|
|
96c2a4885a | ||
|
|
6e992b3a8b | ||
|
|
4d17441d44 | ||
|
|
41f83bb782 | ||
|
|
80fbdf2afe | ||
|
|
a0477ff19d | ||
|
|
73e6a19070 | ||
|
|
1811f4e42f | ||
|
|
177d4b43b2 | ||
|
|
c86a387a17 | ||
|
|
c8c1bb2a47 | ||
|
|
45f4468736 | ||
|
|
43fe6e522b | ||
|
|
b731667227 | ||
|
|
302a93121a | ||
|
|
212872b353 | ||
|
|
1d894d390b | ||
|
|
9b3611b287 | ||
|
|
de8c4dbc02 | ||
|
|
e8c3370f35 | ||
|
|
c37809e629 | ||
|
|
376b69eef1 | ||
|
|
92cde1ab5f | ||
|
|
f722c70859 | ||
|
|
ed1194be9d | ||
|
|
ef0c49d853 | ||
|
|
44ad141311 | ||
|
|
28e8fda73b | ||
|
|
44c6d5e7e6 | ||
|
|
6a8734ad4f | ||
|
|
91cd49c655 | ||
|
|
cb7256eba9 | ||
|
|
82fe2012eb | ||
|
|
26d9c43c7a | ||
|
|
a88061f8bf | ||
|
|
a92372c236 | ||
|
|
f4a33e75bd | ||
|
|
7c8b92e588 | ||
|
|
cd29e81357 | ||
|
|
da85372764 | ||
|
|
5b7a4d13ca | ||
|
|
86a553c697 | ||
|
|
769d814a6a | ||
|
|
51b076831a | ||
|
|
316a861269 | ||
|
|
d88eb8054b | ||
|
|
7d3387b095 | ||
|
|
f3059ca516 | ||
|
|
ae94f3390f | ||
|
|
5b3ad47604 | ||
|
|
e5bda20934 | ||
|
|
a6bde81c24 | ||
|
|
d1f74be5d5 | ||
|
|
8f3a5ca899 |
@@ -1,117 +0,0 @@
|
||||
{
|
||||
"Device.UserInterface.": {
|
||||
"type": "object",
|
||||
"version": "2.0",
|
||||
"protocols": [
|
||||
"cwmp",
|
||||
"usp"
|
||||
],
|
||||
"access": false,
|
||||
"array": false,
|
||||
"Device.UserInterface.RemoteAccess.": {
|
||||
"type": "object",
|
||||
"version": "2.0",
|
||||
"protocols": [
|
||||
"cwmp",
|
||||
"usp"
|
||||
],
|
||||
"access": false,
|
||||
"array": false,
|
||||
"Enable": {
|
||||
"type": "boolean",
|
||||
"read": true,
|
||||
"write": true,
|
||||
"version": "2.0",
|
||||
"protocols": [
|
||||
"cwmp",
|
||||
"usp"
|
||||
],
|
||||
"mapping": [
|
||||
{
|
||||
"type": "uci",
|
||||
"uci": {
|
||||
"file": "userinterface",
|
||||
"section": {
|
||||
"name": "remote_access"
|
||||
},
|
||||
"option": {
|
||||
"name": "enable"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"Port": {
|
||||
"type": "unsignedInt",
|
||||
"read": true,
|
||||
"write": true,
|
||||
"version": "2.0",
|
||||
"protocols": [
|
||||
"cwmp",
|
||||
"usp"
|
||||
],
|
||||
"range": [
|
||||
{
|
||||
"max": 65535
|
||||
}
|
||||
],
|
||||
"mapping": [
|
||||
{
|
||||
"type": "uci",
|
||||
"uci": {
|
||||
"file": "userinterface",
|
||||
"section": {
|
||||
"name": "remote_access"
|
||||
},
|
||||
"option": {
|
||||
"name": "port"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"SupportedProtocols": {
|
||||
"type": "string",
|
||||
"read": true,
|
||||
"write": false,
|
||||
"version": "2.0",
|
||||
"protocols": [
|
||||
"cwmp",
|
||||
"usp"
|
||||
],
|
||||
"list": {
|
||||
"datatype": "string",
|
||||
"enumerations": [
|
||||
"HTTP",
|
||||
"HTTPS"
|
||||
]
|
||||
},
|
||||
"default": "HTTP"
|
||||
},
|
||||
"Protocol": {
|
||||
"type": "string",
|
||||
"read": true,
|
||||
"write": true,
|
||||
"version": "2.0",
|
||||
"protocols": [
|
||||
"cwmp",
|
||||
"usp"
|
||||
],
|
||||
"mapping": [
|
||||
{
|
||||
"type": "uci",
|
||||
"uci": {
|
||||
"file": "userinterface",
|
||||
"section": {
|
||||
"name": "remote_access"
|
||||
},
|
||||
"option": {
|
||||
"name": "protocol"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,6 +0,0 @@
|
||||
config userinterface 'remote_access'
|
||||
option enable '0'
|
||||
option interface 'wan'
|
||||
option port '80'
|
||||
option protocol 'HTTP'
|
||||
|
||||
@@ -1,85 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
|
||||
#!/bin/sh
|
||||
|
||||
. /lib/functions.sh
|
||||
|
||||
IDENTIFIER="REMOTE-ACCESS-WAN"
|
||||
|
||||
log() {
|
||||
echo "${@}"|logger -t firewall.userinterface -p info
|
||||
}
|
||||
|
||||
if [ ! -f "/etc/config/userinterface" ]; then
|
||||
exit 0;
|
||||
fi
|
||||
|
||||
exec_cmd() {
|
||||
if ! "$@"; then
|
||||
log "Failed to run [$*]"
|
||||
fi
|
||||
}
|
||||
|
||||
configure_firewall_rule() {
|
||||
local enable port protocol gui_port
|
||||
local zone interface
|
||||
|
||||
config_load userinterface
|
||||
config_get_bool enable remote_access enable 1
|
||||
config_get port remote_access port
|
||||
config_get interface remote_access interface
|
||||
|
||||
if [ "${enable}" -eq "0" ] || [ -z "${port}" ] || [ -z "${interface}" ]; then
|
||||
return 0;
|
||||
fi
|
||||
|
||||
zone="zone_${interface}_input"
|
||||
iptables -w 1 -t filter -nL "${zone}" 2>/dev/null 1>&2
|
||||
if [ "$?" -eq 0 ]; then
|
||||
iptables -w 1 -I "${zone}" -p tcp -m multiport --dports "${port}" -m conntrack --ctstate NEW,ESTABLISHED -m comment --comment "${IDENTIFIER}" -j ACCEPT
|
||||
fi
|
||||
|
||||
zone="zone_${interface}_output"
|
||||
iptables -w 1 -t filter -nL "${zone}" 2>/dev/null 1>&2
|
||||
if [ "$?" -eq 0 ]; then
|
||||
iptables -w 1 -I "${zone}" -p tcp -m multiport --dports "${port}" -m conntrack --ctstate ESTABLISHED -m comment --comment "${IDENTIFIER}" -j ACCEPT
|
||||
fi
|
||||
}
|
||||
|
||||
delete_firewall_rule() {
|
||||
local zone interface
|
||||
local CMD
|
||||
|
||||
config_load userinterface
|
||||
config_get interface remote_access interface
|
||||
|
||||
# Clean remote interface rules
|
||||
if [ -z "${interface}" ]; then
|
||||
return 0
|
||||
fi
|
||||
|
||||
zone="zone_${interface}_input"
|
||||
CMD="iptables -w 1 -t filter -nL ${zone} --line-numbers"
|
||||
while ${CMD} 2>/dev/null | grep "${IDENTIFIER}"; do
|
||||
rule_num="$(${CMD} | grep "${IDENTIFIER}" | head -1|awk '{print $1}')"
|
||||
if [ -n "${rule_num}" ]; then
|
||||
exec_cmd iptables -w 1 -t filter -D "${zone}" "${rule_num}";
|
||||
fi
|
||||
done
|
||||
|
||||
zone="zone_${interface}_output"
|
||||
CMD="iptables -w 1 -t filter -nL ${zone} --line-numbers"
|
||||
while ${CMD} 2>/dev/null | grep "${IDENTIFIER}"; do
|
||||
rule_num="$(${CMD} | grep "${IDENTIFIER}" | head -1|awk '{print $1}')"
|
||||
if [ -n "${rule_num}" ]; then
|
||||
exec_cmd iptables -w 1 -t filter -D "${zone}" "${rule_num}";
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
# Delete existing remote access rules
|
||||
delete_firewall_rule
|
||||
|
||||
# Configure the User Interface rule
|
||||
configure_firewall_rule
|
||||
@@ -1,27 +0,0 @@
|
||||
#!/bin/sh /etc/rc.common
|
||||
|
||||
START=99
|
||||
STOP=01
|
||||
|
||||
USE_PROCD=1
|
||||
|
||||
start_service() {
|
||||
local enable
|
||||
|
||||
procd_open_instance usp
|
||||
|
||||
config_load userinterface
|
||||
config_get_bool enable global enable 1
|
||||
|
||||
# Inject firewall rules
|
||||
if [ "${enable}" -eq "1" ]; then
|
||||
/etc/firewall.userinterface
|
||||
fi
|
||||
|
||||
procd_close_instance
|
||||
}
|
||||
|
||||
service_triggers()
|
||||
{
|
||||
procd_add_reload_trigger "userinterface"
|
||||
}
|
||||
@@ -1,46 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
config_mosquitto_owrt() {
|
||||
sec=$(uci -q get mosquitto.owrt)
|
||||
if [ -z "${sec}" ]; then
|
||||
sec=$(uci -q add mosquitto owrt)
|
||||
uci -q rename mosquitto."${sec}=owrt"
|
||||
fi
|
||||
|
||||
uci -q set mosquitto.owrt.use_uci="1"
|
||||
uci -q set mosquitto.owrt.write_pid="1"
|
||||
uci -q commit mosquitto
|
||||
}
|
||||
|
||||
config_mosquitto_general() {
|
||||
sec=$(uci -q get mosquitto.mosquitto)
|
||||
if [ -z "${sec}" ]; then
|
||||
sec=$(uci -q add mosquitto mosquitto)
|
||||
uci -q rename mosquitto."${sec}=mosquitto"
|
||||
fi
|
||||
|
||||
uci -q set mosquitto.mosquitto.log_dest="syslog"
|
||||
uci -q set mosquitto.mosquitto.log_facility="5"
|
||||
uci -q set mosquitto.mosquitto.log_timestamp="1"
|
||||
uci -q set mosquitto.mosquitto.log_types="error"
|
||||
uci -q set mosquitto.mosquitto.per_listener_settings="1"
|
||||
uci -q commit mosquitto
|
||||
}
|
||||
|
||||
config_mosquitto_persistence() {
|
||||
sec=$(uci -q get mosquitto.persistence)
|
||||
if [ -z "${sec}" ]; then
|
||||
sec=$(uci -q add mosquitto persistence)
|
||||
uci -q rename mosquitto."${sec}=persistence"
|
||||
fi
|
||||
|
||||
uci -q set mosquitto.persistence.persistence="0"
|
||||
uci -q set mosquitto.persistence.location="/var/run"
|
||||
uci -q commit mosquitto
|
||||
}
|
||||
|
||||
if [ -f "/etc/config/mosquitto" ]; then
|
||||
config_mosquitto_owrt
|
||||
config_mosquitto_general
|
||||
config_mosquitto_persistence
|
||||
fi
|
||||
@@ -1,31 +1,30 @@
|
||||
#
|
||||
# Copyright (C) 2022 IOPSYS
|
||||
# Copyright (C) 2023 IOPSYS
|
||||
#
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=libbbfdm
|
||||
PKG_VERSION:=6.8.42
|
||||
PKG_NAME:=bbfdm
|
||||
PKG_VERSION:=1.0.4
|
||||
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/bbf.git
|
||||
PKG_SOURCE_VERSION:=976744360c6f2b676046aee5cb6f61326e876b13
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/bbf/bbfdm.git
|
||||
PKG_SOURCE_VERSION:=96b305926f8fa8cafa0638e613879537da9b6086
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
|
||||
PKG_MIRROR_HASH:=skip
|
||||
|
||||
PKG_RELEASE=$(PKG_SOURCE_VERSION)
|
||||
|
||||
PKG_LICENSE:=LGPL-2.1
|
||||
PKG_LICENSE:=BSD-3-Clause
|
||||
PKG_LICENSE_FILES:=LICENSE
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
include $(INCLUDE_DIR)/cmake.mk
|
||||
|
||||
define Package/libbbf_api
|
||||
define Package/libbbfdm-api
|
||||
SECTION:=utils
|
||||
CATEGORY:=Utilities
|
||||
SUBMENU:=TRx69
|
||||
TITLE:=BBF datamodel library, provides API to extend datamodel using DotSO plugins
|
||||
DEPENDS:=+libuci +libubox +libubus +libblobmsg-json +libjson-c
|
||||
ABI_VERSION:=1.0
|
||||
endef
|
||||
|
||||
@@ -34,14 +33,16 @@ define Package/libbbfdm/default
|
||||
CATEGORY:=Utilities
|
||||
SUBMENU:=TRx69
|
||||
TITLE:=Library for broadband forum data model support
|
||||
DEPENDS:=+libuci +libubox +libubus +libblobmsg-json +libjson-c +libcurl +libbbf_api \
|
||||
DEPENDS:=+libuci +libubox +libubus +libblobmsg-json +libjson-c +libcurl +libbbfdm-api \
|
||||
+BBF_TR471:obudpst
|
||||
endef
|
||||
|
||||
define Package/libbbfdm
|
||||
$(Package/libbbfdm/default)
|
||||
TITLE += (internal)
|
||||
VARIANT:=internal
|
||||
TITLE += (default)
|
||||
VARIANT:=default
|
||||
DEPENDS += +PACKAGE_libbbfdm-openssl:libopenssl
|
||||
DEFAULT_VARIANT:=1
|
||||
endef
|
||||
|
||||
define Package/libbbfdm-mbedtls
|
||||
@@ -49,23 +50,33 @@ define Package/libbbfdm-mbedtls
|
||||
TITLE += (mbedtls)
|
||||
DEPENDS += +PACKAGE_libbbfdm-mbedtls:libmbedtls
|
||||
VARIANT:=mbedtls
|
||||
DEFAULT_VARIANT:=1
|
||||
CONFLICTS := libbbfdm libbbfdm-openssl libbbfdm-wolfssl
|
||||
endef
|
||||
|
||||
define Package/libbbfdm-openssl
|
||||
$(Package/libbbfdm/default)
|
||||
TITLE += (openssl)
|
||||
DEPENDS += +PACKAGE_libbbfdm-openssl:libopenssl
|
||||
CONFLICTS := libbbfdm-mbedtls
|
||||
VARIANT:=openssl
|
||||
CONFLICTS := libbbfdm libbbfdm-mbedtls libbbfdm-wolfssl
|
||||
endef
|
||||
|
||||
define Package/libbbfdm-wolfssl
|
||||
$(Package/libbbfdm/default)
|
||||
TITLE += (wolfssl)
|
||||
DEPENDS += +PACKAGE_libbbfdm-wolfssl:libwolfssl
|
||||
CONFLICTS := libbbfdm-mbedtls libbbfdm-openssl
|
||||
VARIANT:=wolfssl
|
||||
CONFLICTS := libbbfdm libbbfdm-mbedtls libbbfdm-openssl
|
||||
endef
|
||||
|
||||
define Package/bbfdmd
|
||||
SECTION:=utils
|
||||
CATEGORY:=Utilities
|
||||
SUBMENU:=TRx69
|
||||
TITLE:=Datamodel ubus backend
|
||||
DEPENDS:=+libuci +libubox +libubus +libblobmsg-json +libbbfdm-api +PACKAGE_libbbfdm-mbedtls:libbbfdm-mbedtls \
|
||||
+PACKAGE_libbbfdm-openssl:libbbfdm-openssl +PACKAGE_libbbfdm-wolfssl:libbbfdm-wolfssl \
|
||||
+PACKAGE_libbbfdm:libbbfdm
|
||||
endef
|
||||
|
||||
define Package/userinterface
|
||||
@@ -76,14 +87,14 @@ define Package/userinterface
|
||||
endef
|
||||
|
||||
define Package/userinterface/description
|
||||
Package to add Device.UserInterface. datamodel support using libbbf JSON Plugin
|
||||
Package to add Device.UserInterface. datamodel support
|
||||
endef
|
||||
|
||||
define Package/libbbfdm/config
|
||||
source "$(SOURCE)/Config_bbfdm.in"
|
||||
endef
|
||||
|
||||
define Package/libbbf_api/description
|
||||
define Package/libbbfdm-api/description
|
||||
Library contains the API(UCI, UBUS, JSON, CLI and Browse) of libbbfdm
|
||||
endef
|
||||
|
||||
@@ -137,6 +148,10 @@ CMAKE_OPTIONS += \
|
||||
-DBBF_DOTSO_PLUGIN=ON
|
||||
endif
|
||||
|
||||
ifeq ($(BUILD_VARIANT),default)
|
||||
CMAKE_OPTIONS += -DWITH_OPENSSL=ON
|
||||
endif
|
||||
|
||||
ifeq ($(BUILD_VARIANT),openssl)
|
||||
CMAKE_OPTIONS += -DWITH_OPENSSL=ON
|
||||
endif
|
||||
@@ -149,24 +164,35 @@ ifeq ($(BUILD_VARIANT),mbedtls)
|
||||
CMAKE_OPTIONS += -DWITH_MBEDTLS=ON
|
||||
endif
|
||||
|
||||
define Package/libbbf_api/install
|
||||
ifeq ($(CONFIG_PACKAGE_bbfdmd),y)
|
||||
CMAKE_OPTIONS += -DBBFDMD_ENABLED=ON
|
||||
CMAKE_OPTIONS += \
|
||||
-DBBFDMD_MAX_MSG_LEN:Integer=10485760
|
||||
endif
|
||||
|
||||
define Package/libbbfdm-api/install
|
||||
$(INSTALL_DIR) $(1)/lib
|
||||
$(CP) $(PKG_BUILD_DIR)/libbbfdm-api/libbbfdm-api.so $(1)/lib/
|
||||
endef
|
||||
|
||||
define Package/libbbfdm/default/install
|
||||
$(INSTALL_DIR) $(1)/lib
|
||||
$(INSTALL_DIR) $(1)/etc/bbfdm
|
||||
$(INSTALL_DIR) $(1)/etc/bbfdm/dmmap
|
||||
$(INSTALL_DIR) $(1)/etc/bbfdm/json
|
||||
$(INSTALL_DIR) $(1)/lib/upgrade/keep.d
|
||||
$(CP) $(PKG_BUILD_DIR)/libbbfdm/libbbfdm.so $(1)/lib/
|
||||
$(INSTALL_DATA) ./files/lib/upgrade/keep.d/bbf $(1)/lib/upgrade/keep.d/bbf
|
||||
ifeq ($(CONFIG_BBF_TR143),y)
|
||||
$(INSTALL_DIR) $(1)/usr/share/bbfdm
|
||||
$(INSTALL_DIR) $(1)/usr/lib/bbfdm
|
||||
$(INSTALL_DIR) $(1)/usr/libexec/rpcd
|
||||
$(CP) $(PKG_BUILD_DIR)/libbbfdm.so $(1)/lib/
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/scripts/* $(1)/usr/share/bbfdm
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/libbbfdm/scripts/* $(1)/usr/share/bbfdm
|
||||
$(LN) /usr/share/bbfdm/bbf.diag $(1)/usr/libexec/rpcd/bbf.diag
|
||||
ifeq ($(CONFIG_PACKAGE_mosquitto-ssl),y)
|
||||
$(INSTALL_DIR) $(1)/etc/uci-defaults
|
||||
$(INSTALL_BIN) ./files/etc/uci-defaults/01-mosquitto-config $(1)/etc/uci-defaults/
|
||||
endif
|
||||
ifeq ($(CONFIG_BBFDM_ENABLE_JSON_PLUGIN),y)
|
||||
$(INSTALL_DIR) $(1)/etc/bbfdm/json
|
||||
endif
|
||||
ifeq ($(CONFIG_BBFDM_ENABLE_DOTSO_PLUGIN),y)
|
||||
$(INSTALL_DIR) $(1)/usr/lib/bbfdm
|
||||
endif
|
||||
endef
|
||||
|
||||
@@ -176,22 +202,34 @@ define Package/libbbfdm/default/prerm
|
||||
exit 0
|
||||
endef
|
||||
|
||||
define Package/bbfdmd/install
|
||||
$(INSTALL_DIR) $(1)/etc/init.d
|
||||
$(INSTALL_DIR) $(1)/etc/config
|
||||
$(INSTALL_DIR) $(1)/usr/sbin
|
||||
$(INSTALL_BIN) ./files/etc/init.d/bbfdmd $(1)/etc/init.d/bbfdmd
|
||||
$(INSTALL_CONF) ./files/etc/config/bbfdm $(1)/etc/config/bbfdm
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/bbfdmd/src/bbfdmd $(1)/usr/sbin/
|
||||
endef
|
||||
|
||||
define Package/userinterface/install
|
||||
$(INSTALL_DIR) $(1)/etc/bbfdm/json
|
||||
$(INSTALL_DIR) $(1)/etc/config
|
||||
$(INSTALL_DIR) $(1)/etc/uci-defaults
|
||||
$(INSTALL_DIR) $(1)/etc/init.d
|
||||
$(INSTALL_DATA) ./files/etc/bbfdm/json/UserInterface.json $(1)/etc/bbfdm/json/
|
||||
$(INSTALL_DIR) $(1)/lib/upgrade/keep.d
|
||||
$(INSTALL_DATA) ./files/etc/config/userinterface $(1)/etc/config/userinterface
|
||||
$(INSTALL_DATA) ./files/lib/upgrade/keep.d/userinterface $(1)/lib/upgrade/keep.d/userinterface
|
||||
$(INSTALL_BIN) ./files/etc/init.d/userinterface $(1)/etc/init.d/userinterface
|
||||
$(INSTALL_BIN) ./files/etc/uci-defaults/93-userinterface-firewall $(1)/etc/uci-defaults/93-userinterface-firewall
|
||||
$(INSTALL_BIN) ./files/etc/uci-defaults/94-userinterface-json $(1)/etc/uci-defaults/94-userinterface-json
|
||||
$(INSTALL_BIN) ./files/etc/firewall.userinterface $(1)/etc/firewall.userinterface
|
||||
endef
|
||||
|
||||
Package/libbbfdm/prerm = $(Package/libbbfdm/default/prerm)
|
||||
Package/libbbfdm-openssl/prerm = $(Package/libbbfdm/default/prerm)
|
||||
Package/libbbfdm-wolfssl/prerm = $(Package/libbbfdm/default/prerm)
|
||||
Package/libbbfdm-mbedtls/prerm = $(Package/libbbfdm/default/prerm)
|
||||
|
||||
Package/libbbfdm/install = $(Package/libbbfdm/default/install)
|
||||
Package/libbbfdm-openssl/install = $(Package/libbbfdm/default/install)
|
||||
Package/libbbfdm-wolfssl/install = $(Package/libbbfdm/default/install)
|
||||
Package/libbbfdm-mbedtls/install = $(Package/libbbfdm/default/install)
|
||||
@@ -200,16 +238,22 @@ define Build/InstallDev
|
||||
$(INSTALL_DIR) $(1)/usr/lib
|
||||
$(INSTALL_DIR) $(1)/usr/include
|
||||
$(INSTALL_DIR) $(1)/usr/include/libbbfdm
|
||||
$(INSTALL_DIR) $(1)/usr/include/libbbfdm-api
|
||||
$(INSTALL_DIR) $(1)/usr/include/libbbf_api
|
||||
$(INSTALL_DATA) $(PKG_BUILD_DIR)/include/*.h $(1)/usr/include/
|
||||
$(INSTALL_DATA) $(PKG_BUILD_DIR)/*.h $(1)/usr/include/libbbfdm/
|
||||
$(INSTALL_DATA) $(PKG_BUILD_DIR)/libbbf_api/*.h $(1)/usr/include/libbbf_api/
|
||||
$(CP) $(PKG_BUILD_DIR)/libbbfdm.so $(1)/usr/lib/
|
||||
$(INSTALL_DATA) $(PKG_BUILD_DIR)/libbbfdm-api/include/*.h $(1)/usr/include/
|
||||
$(INSTALL_DATA) $(PKG_BUILD_DIR)/libbbfdm/dmtree/tr181/device.h $(1)/usr/include/libbbfdm/
|
||||
$(INSTALL_DATA) $(PKG_BUILD_DIR)/libbbfdm/dmtree/vendor/vendor.h $(1)/usr/include/libbbfdm/
|
||||
$(INSTALL_DATA) $(PKG_BUILD_DIR)/libbbfdm-api/*.h $(1)/usr/include/libbbfdm-api/
|
||||
# Work around for backward compatibility
|
||||
$(INSTALL_DATA) $(PKG_BUILD_DIR)/libbbfdm-api/*.h $(1)/usr/include/libbbf_api/
|
||||
$(INSTALL_DATA) $(PKG_BUILD_DIR)/libbbfdm-api/include/libbbfdm_api.h $(1)/usr/include/libbbf_api.h
|
||||
endef
|
||||
|
||||
$(eval $(call BuildPackage,userinterface))
|
||||
$(eval $(call BuildPackage,libbbf_api))
|
||||
$(eval $(call BuildPackage,libbbfdm-api))
|
||||
$(eval $(call BuildPackage,libbbfdm))
|
||||
$(eval $(call BuildPackage,libbbfdm-openssl))
|
||||
$(eval $(call BuildPackage,libbbfdm-wolfssl))
|
||||
$(eval $(call BuildPackage,libbbfdm-mbedtls))
|
||||
$(eval $(call BuildPackage,bbfdmd))
|
||||
|
||||
$(eval $(call BuildPackage,userinterface))
|
||||
5
bbfdm/files/etc/config/bbfdm
Normal file
5
bbfdm/files/etc/config/bbfdm
Normal file
@@ -0,0 +1,5 @@
|
||||
|
||||
config bbfdmd 'bbfdmd'
|
||||
option loglevel '1'
|
||||
option refresh_time '10'
|
||||
option transaction_timeout '10'
|
||||
3
bbfdm/files/etc/config/userinterface
Normal file
3
bbfdm/files/etc/config/userinterface
Normal file
@@ -0,0 +1,3 @@
|
||||
config userinterface 'global'
|
||||
option enable '1'
|
||||
|
||||
125
bbfdm/files/etc/firewall.userinterface
Executable file
125
bbfdm/files/etc/firewall.userinterface
Executable file
@@ -0,0 +1,125 @@
|
||||
#!/bin/sh
|
||||
|
||||
. /lib/functions.sh
|
||||
|
||||
IDENTIFIER="UI-REMOTE-ACCESS-WAN"
|
||||
|
||||
log() {
|
||||
echo "${@}"|logger -t firewall.userinterface -p info
|
||||
}
|
||||
|
||||
if [ ! -f "/etc/config/userinterface" ] || [ ! -f "/etc/config/nginx" ]; then
|
||||
exit 0;
|
||||
fi
|
||||
|
||||
exec_cmd() {
|
||||
if ! "$@"; then
|
||||
log "Failed to run [$*]"
|
||||
fi
|
||||
}
|
||||
|
||||
delete_ui_firewall_rules() {
|
||||
input_chains=$(iptables -S | grep -E "^-N zone[a-zA-Z0-9_]+input$" | cut -d' ' -f 2)
|
||||
output_chains=$(iptables -S | grep -E "^-N zone[a-zA-Z0-9_]+output$" | cut -d' ' -f 2)
|
||||
|
||||
for chain in ${input_chains}; do
|
||||
CMD="iptables -w 1 -t filter -nL ${chain} --line-numbers"
|
||||
while ${CMD} 2>/dev/null | grep "${IDENTIFIER}"; do
|
||||
rule_num="$(${CMD} | grep "${IDENTIFIER}" | head -1|awk '{print $1}')"
|
||||
if [ -n "${rule_num}" ]; then
|
||||
exec_cmd iptables -w 1 -t filter -D "${chain}" "${rule_num}";
|
||||
fi
|
||||
done
|
||||
done
|
||||
|
||||
for chain in ${output_chains}; do
|
||||
CMD="iptables -w 1 -t filter -nL ${chain} --line-numbers"
|
||||
while ${CMD} 2>/dev/null | grep "${IDENTIFIER}"; do
|
||||
rule_num="$(${CMD} | grep "${IDENTIFIER}" | head -1|awk '{print $1}')"
|
||||
if [ -n "${rule_num}" ]; then
|
||||
exec_cmd iptables -w 1 -t filter -D "${chain}" "${rule_num}";
|
||||
fi
|
||||
done
|
||||
done
|
||||
|
||||
input6_chains=$(ip6tables -S | grep -E "^-N zone[a-zA-Z0-9_]+input$" | cut -d' ' -f 2)
|
||||
output6_chains=$(ip6tables -S | grep -E "^-N zone[a-zA-Z0-9_]+output$" | cut -d' ' -f 2)
|
||||
|
||||
for chain in ${input6_chains}; do
|
||||
CMD="ip6tables -w 1 -t filter -nL ${chain} --line-numbers"
|
||||
while ${CMD} 2>/dev/null | grep "${IDENTIFIER}"; do
|
||||
rule_num="$(${CMD} | grep "${IDENTIFIER}" | head -1|awk '{print $1}')"
|
||||
if [ -n "${rule_num}" ]; then
|
||||
exec_cmd ip6tables -w 1 -t filter -D "${chain}" "${rule_num}";
|
||||
fi
|
||||
done
|
||||
done
|
||||
|
||||
for chain in ${output6_chains}; do
|
||||
CMD="ip6tables -w 1 -t filter -nL ${chain} --line-numbers"
|
||||
while ${CMD} 2>/dev/null | grep "${IDENTIFIER}"; do
|
||||
rule_num="$(${CMD} | grep "${IDENTIFIER}" | head -1|awk '{print $1}')"
|
||||
if [ -n "${rule_num}" ]; then
|
||||
exec_cmd ip6tables -w 1 -t filter -D "${chain}" "${rule_num}";
|
||||
fi
|
||||
done
|
||||
done
|
||||
}
|
||||
|
||||
configure_ui_firewall_rule() {
|
||||
local sec="${1}"
|
||||
local enabled access interface
|
||||
local port=""
|
||||
|
||||
config_get_bool enabled "${sec}" uci_enable '1'
|
||||
config_get access "${sec}" uci_access ""
|
||||
config_get interface "${sec}" uci_interface ""
|
||||
|
||||
if [ "${enabled}" -eq "1" ] && [ "${access}" == "remote" ] && [ -n "${interface}" ]; then
|
||||
port_list=$(uci -q show nginx."${1}".listen|cut -d'=' -f 2|sed "s/'/ /g"|sed "s/\[\:\:\]\://g")
|
||||
for item in ${port_list}; do
|
||||
if [ -z "${item##[0-9]*}" ]; then
|
||||
port="${item}"
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
if [ -z "${port}" ]; then
|
||||
return 0
|
||||
fi
|
||||
|
||||
zone="zone_${interface}_input"
|
||||
iptables -w 1 -t filter -nL ${zone} 2>/dev/null 1>&2
|
||||
if [ "$?" -eq 0 ]; then
|
||||
iptables -w 1 -I "${zone}" -p tcp -m multiport --dports "${port}" -m conntrack --ctstate NEW,ESTABLISHED -m comment --comment "${IDENTIFIER}" -j ACCEPT
|
||||
fi
|
||||
|
||||
ip6tables -w 1 -t filter -nL ${zone} 2>/dev/null 1>&2
|
||||
if [ "$?" -eq 0 ]; then
|
||||
ip6tables -w 1 -I "${zone}" -p tcp -m multiport --dports "${port}" -m conntrack --ctstate NEW,ESTABLISHED -m comment --comment "${IDENTIFIER}" -j ACCEPT
|
||||
fi
|
||||
|
||||
zone="zone_${interface}_output"
|
||||
iptables -w 1 -t filter -nL "${zone}" 2>/dev/null 1>&2
|
||||
if [ "$?" -eq 0 ]; then
|
||||
iptables -w 1 -I "${zone}" -p tcp -m multiport --dports "${port}" -m conntrack --ctstate ESTABLISHED -m comment --comment "${IDENTIFIER}" -j ACCEPT
|
||||
fi
|
||||
|
||||
ip6tables -w 1 -t filter -nL "${zone}" 2>/dev/null 1>&2
|
||||
if [ "$?" -eq 0 ]; then
|
||||
ip6tables -w 1 -I "${zone}" -p tcp -m multiport --dports "${port}" -m conntrack --ctstate ESTABLISHED -m comment --comment "${IDENTIFIER}" -j ACCEPT
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
# Delete existing remote access rules
|
||||
delete_ui_firewall_rules
|
||||
|
||||
config_load userinterface
|
||||
config_get_bool serv_enable global enable 1
|
||||
|
||||
if [ "${serv_enable}" -eq "1" ]; then
|
||||
config_load nginx
|
||||
# Configure the User Interface rule
|
||||
config_foreach configure_ui_firewall_rule server
|
||||
fi
|
||||
83
bbfdm/files/etc/init.d/bbfdmd
Normal file
83
bbfdm/files/etc/init.d/bbfdmd
Normal file
@@ -0,0 +1,83 @@
|
||||
#!/bin/sh /etc/rc.common
|
||||
|
||||
START=96
|
||||
STOP=10
|
||||
|
||||
USE_PROCD=1
|
||||
PROG=/usr/sbin/bbfdmd
|
||||
|
||||
log() {
|
||||
echo "${@}"|logger -t bbfdmd.init -p info
|
||||
}
|
||||
|
||||
validate_bbfdm_bbfdmd_section()
|
||||
{
|
||||
uci_validate_section bbfdm bbfdmd "bbfdmd" \
|
||||
'enabled:bool:true' \
|
||||
'debug:bool:false' \
|
||||
'loglevel:uinteger' \
|
||||
'sock:string' \
|
||||
'transaction_timeout:string'
|
||||
}
|
||||
|
||||
configure_bbfdmd()
|
||||
{
|
||||
local enabled debug sock transaction_timeout
|
||||
|
||||
config_load bbfdm
|
||||
|
||||
validate_bbfdm_bbfdmd_section || {
|
||||
log "Validation of bbfdmd section failed"
|
||||
return 1;
|
||||
}
|
||||
|
||||
[ "${enabled}" -eq 0 ] && return 0
|
||||
|
||||
procd_set_param command ${PROG}
|
||||
if [ "${debug}" -eq 1 ]; then
|
||||
procd_set_param stdout 1
|
||||
procd_set_param stderr 1
|
||||
fi
|
||||
|
||||
if [ -f "${sock}" ]; then
|
||||
procd_append_param command -s "${sock}"
|
||||
fi
|
||||
|
||||
if [ -n "${transaction_timeout}" ]; then
|
||||
procd_append_param command -t "${transaction_timeout}"
|
||||
fi
|
||||
}
|
||||
|
||||
apply_sysctl_configuration() {
|
||||
local sysctl_conf
|
||||
|
||||
sysctl_conf="/etc/bbfdm/sysctl.conf"
|
||||
|
||||
[ -f "${sysctl_conf}" ] || touch "${sysctl_conf}"
|
||||
|
||||
sysctl -e -p "${sysctl_conf}" >&-
|
||||
}
|
||||
|
||||
start_service() {
|
||||
local sysctl_reload
|
||||
|
||||
ubus -t 5 wait_for network.device
|
||||
[ "$?" -eq 0 ] && sysctl_reload=1
|
||||
|
||||
procd_open_instance bbf
|
||||
configure_bbfdmd
|
||||
procd_set_param respawn
|
||||
procd_close_instance
|
||||
|
||||
[ "${sysctl_reload}" -eq 1 ] && apply_sysctl_configuration
|
||||
}
|
||||
|
||||
reload_service() {
|
||||
ubus -t 5 wait_for network.device
|
||||
apply_sysctl_configuration
|
||||
}
|
||||
|
||||
service_triggers()
|
||||
{
|
||||
procd_add_reload_trigger "bbfdm" "network"
|
||||
}
|
||||
33
bbfdm/files/etc/init.d/userinterface
Normal file
33
bbfdm/files/etc/init.d/userinterface
Normal file
@@ -0,0 +1,33 @@
|
||||
#!/bin/sh /etc/rc.common
|
||||
|
||||
START=99
|
||||
STOP=01
|
||||
|
||||
USE_PROCD=1
|
||||
|
||||
start_service() {
|
||||
local enable
|
||||
|
||||
config_load userinterface
|
||||
config_get_bool enable global enable 1
|
||||
|
||||
if [ ! -f "/etc/config/nginx" ]; then
|
||||
return 0
|
||||
fi
|
||||
|
||||
if [ "${enable}" -eq "1" ]; then
|
||||
ubus call service state '{"name":"nginx", "spawn":true}'
|
||||
else
|
||||
ubus call service state '{"name":"nginx", "spawn":false}'
|
||||
fi
|
||||
|
||||
# Inject firewall rules
|
||||
procd_open_instance userinterface
|
||||
/etc/firewall.userinterface
|
||||
procd_close_instance
|
||||
}
|
||||
|
||||
service_triggers()
|
||||
{
|
||||
procd_add_reload_trigger "userinterface" "nginx"
|
||||
}
|
||||
9
bbfdm/files/etc/uci-defaults/94-userinterface-json
Executable file
9
bbfdm/files/etc/uci-defaults/94-userinterface-json
Executable file
@@ -0,0 +1,9 @@
|
||||
#!/bin/sh
|
||||
|
||||
# This deletes the userinterface json plugin if exists in case of upgrade
|
||||
if [ -f "/etc/bbfdm/json/UserInterface.json" ]; then
|
||||
rm /etc/bbfdm/json/UserInterface.json
|
||||
fi
|
||||
|
||||
exit 0
|
||||
|
||||
1
bbfdm/files/lib/upgrade/keep.d/bbf
Normal file
1
bbfdm/files/lib/upgrade/keep.d/bbf
Normal file
@@ -0,0 +1 @@
|
||||
/etc/bbfdm/sysctl.conf
|
||||
1
bbfdm/files/lib/upgrade/keep.d/userinterface
Normal file
1
bbfdm/files/lib/upgrade/keep.d/userinterface
Normal file
@@ -0,0 +1 @@
|
||||
/etc/nginx/allow_host_*
|
||||
@@ -1,28 +1,24 @@
|
||||
#
|
||||
# Copyright (C) 2022 iopsys Software Solutions AB
|
||||
#
|
||||
# This is free software, licensed under the GNU General Public License v2.
|
||||
# See /LICENSE for more information.
|
||||
#
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=bulkdata
|
||||
PKG_VERSION:=2.0.10
|
||||
PKG_VERSION:=2.1.0
|
||||
|
||||
LOCAL_DEV:=0
|
||||
ifneq ($(LOCAL_DEV),1)
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/bulkdata.git
|
||||
PKG_SOURCE_VERSION:=6e85d2032e66df581fae7c72cd83cc89367b8fc8
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/bbf/bulkdata.git
|
||||
PKG_SOURCE_VERSION:=2dd55d9c9eb01ed1b11e16bad9e2c3e8badfffeb
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
|
||||
PKG_MIRROR_HASH:=skip
|
||||
endif
|
||||
|
||||
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
|
||||
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
|
||||
|
||||
PKG_LICENSE:=GPL-2.0-only
|
||||
PKG_LICENSE:=BSD-3-Clause
|
||||
PKG_LICENSE_FILES:=LICENSE
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
#
|
||||
# Copyright (C) 2021 IOPSYS
|
||||
# Copyright (C) 2021-2023 IOPSYS
|
||||
#
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=wfa-capi
|
||||
PKG_VERSION:=2.0.1
|
||||
PKG_NAME:=capiagent
|
||||
PKG_VERSION:=2.1.0
|
||||
|
||||
LOCAL_DEV=0
|
||||
ifneq ($(LOCAL_DEV),1)
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_VERSION:=3e671db8f567b19c109fc13b25bc571c4c73a962
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/wfa-capi.git
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/multi-ap/capiagent.git
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)_$(PKG_SOURCE_VERSION).tar.xz
|
||||
PKG_MIRROR_HASH:=skip
|
||||
endif
|
||||
@@ -24,18 +24,18 @@ PKG_LICENSE_FILES:=LICENSE
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
|
||||
#define Package/wfa-capi/config
|
||||
#define Package/capiagent/config
|
||||
# source "$(SOURCE)/Config.in"
|
||||
#endef
|
||||
|
||||
define Package/wfa-capi
|
||||
TITLE+= wfa-capi (agent daemon for Wi-Fi Alliance's CAPI commands)
|
||||
define Package/capiagent
|
||||
TITLE+= capiagent (daemon implementing Wi-Fi Alliance's CAPI commands)
|
||||
DEPENDS= +libubox +libuci +libubus +libnl-genl +libeasy +libwifi \
|
||||
+libjson-c +libblobmsg-json +ubus +libieee1905
|
||||
endef
|
||||
|
||||
define Package/wfa-capi/description
|
||||
This package provides agent for WiFi Alliance's CAPI specification.
|
||||
define Package/capiagent/description
|
||||
This package provides agent for the WiFi Alliance's CAPI specification.
|
||||
endef
|
||||
|
||||
TARGET_CFLAGS += \
|
||||
@@ -46,7 +46,7 @@ TARGET_CFLAGS += \
|
||||
MAKE_PATH:=src
|
||||
|
||||
|
||||
define Package/wfa-capi/install
|
||||
define Package/capiagent/install
|
||||
$(CP) ./files/* $(1)/
|
||||
$(INSTALL_DIR) $(1)/usr/sbin
|
||||
$(INSTALL_DIR) $(1)/lib/wifi/capi
|
||||
@@ -54,4 +54,4 @@ define Package/wfa-capi/install
|
||||
$(CP) $(PKG_BUILD_DIR)/src/scripts/* $(1)/lib/wifi/capi
|
||||
endef
|
||||
|
||||
$(eval $(call BuildPackage,wfa-capi))
|
||||
$(eval $(call BuildPackage,capiagent))
|
||||
@@ -4,14 +4,14 @@
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=wfadatad
|
||||
PKG_VERSION:=4.0.1.6
|
||||
PKG_NAME:=decollector
|
||||
PKG_VERSION:=4.0.2.0
|
||||
|
||||
LOCAL_DEV=0
|
||||
ifneq ($(LOCAL_DEV),1)
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_VERSION:=7f882307d34a09b1cf09ea3335c2fa71a59ce92f
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/wfadatad.git
|
||||
PKG_SOURCE_VERSION:=162654487bfbff7d68d0c87ae9498a3def738d84
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/multi-ap/decollector.git
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_SOURCE_VERSION).tar.gz
|
||||
PKG_MIRROR_HASH:=skip
|
||||
endif
|
||||
@@ -22,7 +22,7 @@ PKG_LICENSE_FILES:=LICENSE
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
define Package/wfadatad-collector
|
||||
define Package/decollector
|
||||
SECTION:=utils
|
||||
CATEGORY:=Utilities
|
||||
TITLE:=WiFi DataElements Collector Proxy
|
||||
@@ -30,12 +30,13 @@ define Package/wfadatad-collector
|
||||
+libeasy +libwifiutils +libieee1905 +map-plugin
|
||||
endef
|
||||
|
||||
define Package/wfadatad-collector/description
|
||||
It implements the WiFi DataElements Collector Proxy component.
|
||||
define Package/decollector/description
|
||||
It implements the WiFi DataElements Agent as defined in the Wi-Fi Alliance's
|
||||
DataElements specification.
|
||||
endef
|
||||
|
||||
|
||||
define Package/wfadatad-collector/config
|
||||
define Package/decollector/config
|
||||
source "$(SOURCE)/Config.in"
|
||||
endef
|
||||
|
||||
@@ -54,7 +55,7 @@ TARGET_CFLAGS += \
|
||||
|
||||
ifeq ($(LOCAL_DEV),1)
|
||||
define Build/Prepare
|
||||
rsync -r --exclude=.* ~/git/wfadatad/ $(PKG_BUILD_DIR)/
|
||||
rsync -r --exclude=.* ~/git/decollector/ $(PKG_BUILD_DIR)/
|
||||
endef
|
||||
endif
|
||||
|
||||
@@ -63,15 +64,15 @@ MAKE_PATH:=src
|
||||
TARGET_CFLAGS += -DEASYMESH_VERSION=$(CONFIG_DECOLLECTOR_EASYMESH_VERSION)
|
||||
|
||||
EXECS := \
|
||||
$(if $(CONFIG_PACKAGE_wfadatad-collector),decollector)
|
||||
$(if $(CONFIG_PACKAGE_decollector),decollector)
|
||||
|
||||
MAKE_FLAGS += EXECS="$(EXECS)"
|
||||
|
||||
define Package/wfadatad-collector/install
|
||||
define Package/decollector/install
|
||||
$(INSTALL_DIR) $(1)/etc/init.d
|
||||
$(INSTALL_DIR) $(1)/usr/sbin
|
||||
$(INSTALL_BIN) ./files/decollector.init $(1)/etc/init.d/decollector
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/src/decollector $(1)/usr/sbin/
|
||||
endef
|
||||
|
||||
$(eval $(call BuildPackage,wfadatad-collector))
|
||||
$(eval $(call BuildPackage,decollector))
|
||||
@@ -8,13 +8,13 @@ include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=dectmngr
|
||||
PKG_RELEASE:=3
|
||||
PKG_VERSION:=3.5.6
|
||||
PKG_VERSION:=3.5.7
|
||||
|
||||
LOCAL_DEV=0
|
||||
ifneq ($(LOCAL_DEV),1)
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/dectmngr.git
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_VERSION:=81450033d98fcdb68911e2148f48d190492090a6
|
||||
PKG_SOURCE_VERSION:=83f89a83cf860bbcf2b7f2e030215db315a5bbbf
|
||||
PKG_MIRROR_HASH:=skip
|
||||
endif
|
||||
|
||||
@@ -34,7 +34,7 @@ include $(INCLUDE_DIR)/package.mk
|
||||
define Package/$(PKG_NAME)
|
||||
CATEGORY:=Utilities
|
||||
TITLE:=DECT Manager
|
||||
DEPENDS:= +libubox +ubus +uci +libxml2 +libjson-c
|
||||
DEPENDS:= +libubox +ubus +uci +libxml2 +libjson-c +gpiod-tools
|
||||
endef
|
||||
|
||||
define Package/$(PKG_NAME)/description
|
||||
|
||||
@@ -10,8 +10,9 @@ NAME=dectmngr
|
||||
PROG=/usr/sbin/dectmngr
|
||||
LOG_PATH=/var/log/dectmngr
|
||||
DB_PATH=/etc/dect
|
||||
DCX81_UART_DT_ALIAS=/proc/device-tree/aliases/dcx81-uart
|
||||
|
||||
DECT_GPIO=$(db -q get hw.board.dect_gpio)
|
||||
DECT_GPIO="$(gpiofind DCX81_RSTN | cut -d ' ' -f 2 2>/dev/null)"
|
||||
|
||||
# Ask dectmngr to exit nicely and wait for it to clean up, which is a slow process.
|
||||
stop_and_wait_dectmngr() {
|
||||
@@ -19,18 +20,48 @@ stop_and_wait_dectmngr() {
|
||||
|
||||
pidof $NAME && sleep 2 # wait for the process to stop gracefully
|
||||
while pidof $NAME; do
|
||||
killall -q -9 $NAME
|
||||
killall -q -9 $NAME
|
||||
sleep 1
|
||||
done
|
||||
}
|
||||
|
||||
has_dect() {
|
||||
[ -f "$DCX81_UART_DT_ALIAS" ]
|
||||
}
|
||||
|
||||
get_dcx81_device() {
|
||||
readonly dcx81_uart_dt_node="/proc/device-tree/$(cat "$DCX81_UART_DT_ALIAS" 2>/dev/null)"
|
||||
[ -e "$dcx81_uart_dt_node" ] || return 1
|
||||
for tty_dt_node in /sys/class/tty/*/device/of_node; do
|
||||
if [ "$tty_dt_node" -ef "$dcx81_uart_dt_node" ]; then
|
||||
readonly uevent_file="${tty_dt_node%%/device/of_node}/uevent"
|
||||
local device_name_line
|
||||
device_name_line="$(grep '^DEVNAME=' "$uevent_file")" || return 1
|
||||
readonly device="/dev/${device_name_line##DEVNAME=}"
|
||||
[ -c "$device" ] || return 1
|
||||
printf "%s" "$device"
|
||||
return 0
|
||||
fi
|
||||
done
|
||||
return 1
|
||||
}
|
||||
|
||||
start_service() {
|
||||
local opt_ext=
|
||||
local rfpi=
|
||||
local model_id=
|
||||
local rxtun=
|
||||
|
||||
test $(db get hw.board.hasDect) = "0" && return
|
||||
if ! has_dect; then
|
||||
logger -t "$PROG" "Not starting because no DECT hardware is available."
|
||||
return 0
|
||||
fi
|
||||
|
||||
local dcx81_uart_device
|
||||
if ! dcx81_uart_device="$(get_dcx81_device)"; then
|
||||
logger -t "$PROG" -p daemon.warning "Could not determine DCX81 UART device. Falling back to default ttyH0."
|
||||
dcx81_uart_device=/dev/ttyH0
|
||||
fi
|
||||
|
||||
[ -n "$DECT_GPIO" ] && echo 1 > /sys/class/gpio/gpio${DECT_GPIO}/value
|
||||
|
||||
@@ -51,18 +82,25 @@ start_service() {
|
||||
config_get log_dect_cmbs global log_dect_cmbs syslog
|
||||
|
||||
procd_open_instance
|
||||
if [ "$log_dect_cmbs" = "none" ]; then
|
||||
|
||||
# dectmngr takes expects device without /dev
|
||||
readonly dcx81_uart_device_wo_dev="${dcx81_uart_device##/dev/}"
|
||||
case "$log_dect_cmbs" in
|
||||
none)
|
||||
echo "Starting dectmngr with cmbs logging disabled"
|
||||
procd_set_param command $PROG -comname ttyH0 $opt_ext
|
||||
procd_set_param command "$PROG" -comname "$dcx81_uart_device_wo_dev" $opt_ext
|
||||
rm -f $LOG_PATH/*
|
||||
elif [ "$log_dect_cmbs" = "file" ]; then
|
||||
;;
|
||||
file)
|
||||
echo "Starting dectmngr with cmbs logging enabled to file"
|
||||
procd_set_param command $PROG -comname ttyH0 -log $LOG_PATH/dect-cmbs.log $opt_ext
|
||||
else
|
||||
procd_set_param command "$PROG" -comname "$dcx81_uart_device_wo_dev" -log $LOG_PATH/dect-cmbs.log $opt_ext
|
||||
;;
|
||||
*)
|
||||
echo "Starting dectmngr with cmbs logging enabled to syslog"
|
||||
procd_set_param command $PROG -comname ttyH0 -syslog $opt_ext
|
||||
procd_set_param command "$PROG" -comname "$dcx81_uart_device_wo_dev" -syslog $opt_ext
|
||||
rm -f $LOG_PATH/*
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
|
||||
procd_set_param respawn 6 2 3
|
||||
procd_set_param term_timeout 20
|
||||
@@ -71,7 +109,7 @@ start_service() {
|
||||
}
|
||||
|
||||
stop_service() {
|
||||
test $(db get hw.board.hasDect) = "0" && return
|
||||
has_dect || return 0
|
||||
|
||||
[ -n "$DECT_GPIO" ] && echo 0 > /sys/class/gpio/gpio${DECT_GPIO}/value
|
||||
stop_and_wait_dectmngr
|
||||
@@ -81,8 +119,7 @@ reload_service() {
|
||||
ubus call dect reload
|
||||
}
|
||||
|
||||
service_triggers()
|
||||
{
|
||||
service_triggers() {
|
||||
procd_add_config_trigger "config.change" "asterisk" /etc/init.d/dectmngr restart
|
||||
procd_add_config_trigger "config.change" "dect" /etc/init.d/dectmngr reload
|
||||
}
|
||||
@@ -97,4 +134,3 @@ boot() {
|
||||
[ ! -d $DB_PATH ] && mkdir -p $DB_PATH
|
||||
start
|
||||
}
|
||||
|
||||
|
||||
@@ -21,8 +21,6 @@ start_service() {
|
||||
}
|
||||
|
||||
stop_service() {
|
||||
[ -n "$DSLMNGR" ] && service_stop $DSLMNGR
|
||||
|
||||
xtm_remove_devices
|
||||
xdsl_stop
|
||||
}
|
||||
@@ -45,4 +43,3 @@ reload_service() {
|
||||
service_triggers() {
|
||||
procd_add_reload_trigger dsl
|
||||
}
|
||||
|
||||
|
||||
@@ -1,163 +0,0 @@
|
||||
#
|
||||
# Copyright (C) 2020 iopsys Software Solutions AB
|
||||
#
|
||||
# This is free software, licensed under the GNU General Public License v2.
|
||||
#
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=easy-soc-libs
|
||||
PKG_VERSION:=7.2.16
|
||||
PKG_RELEASE:=1
|
||||
|
||||
LOCAL_DEV=0
|
||||
ifneq ($(LOCAL_DEV),1)
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_VERSION:=ff2fca6e57f6da1384f6a5f7741d8d1b2aa114fb
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/easy-soc-libs.git
|
||||
PKG_MAINTAINER:=Anjan Chanda <anjan.chanda@iopsys.eu>
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)_$(PKG_SOURCE_VERSION).tar.xz
|
||||
PKG_MIRROR_HASH:=skip
|
||||
endif
|
||||
|
||||
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
|
||||
|
||||
PKG_LICENSE:=GPLv2
|
||||
PKG_LICENSE_FILES:=LICENSE
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
define Package/easy-soc-libs
|
||||
SECTION:=libs
|
||||
CATEGORY:=Libraries
|
||||
TITLE:=IOPSYS Easy SoC libraries
|
||||
SUBMENU:=IOPSYS Easy SoC libraries
|
||||
DEPENDS:=+libopenssl
|
||||
MENU:=1
|
||||
endef
|
||||
|
||||
ifeq ($(CONFIG_TARGET_brcmbca),y)
|
||||
TARGET_PLATFORM=BROADCOM
|
||||
TARGET_WIFI_TYPE=BROADCOM
|
||||
CHIP_ID=$(patsubst "%",%,$(CONFIG_BCM_CHIP_ID))
|
||||
TARGET_CFLAGS +=-DIOPSYS_BROADCOM -DCHIP_$(CHIP_ID) -DCONFIG_BCM9$(CHIP_ID) \
|
||||
-I$(STAGING_DIR)/usr/include/bcm963xx/bcmdrivers/opensource/include/bcm963xx \
|
||||
-I$(STAGING_DIR)/usr/include/bcm963xx/userspace/public/include
|
||||
else ifeq ($(CONFIG_TARGET_iopsys_ramips),y)
|
||||
TARGET_PLATFORM=MEDIATEK
|
||||
TARGET_WIFI_TYPE=MAC80211
|
||||
TARGET_CFLAGS +=-DIOPSYS_MAC80211
|
||||
else ifeq ($(CONFIG_TARGET_iopsys_x86),y)
|
||||
TARGET_PLATFORM=TEST
|
||||
TARGET_WIFI_TYPE=TEST
|
||||
TARGET_CFLAGS +=-DIOPSYS_TEST
|
||||
else ifeq ($(CONFIG_TARGET_iopsys_armvirt),y)
|
||||
TARGET_PLATFORM=TEST
|
||||
TARGET_WIFI_TYPE=TEST
|
||||
TARGET_CFLAGS +=-DIOPSYS_TEST
|
||||
else ifeq ($(CONFIG_TARGET_airoha),y)
|
||||
TARGET_PLATFORM=ECONET
|
||||
TARGET_WIFI_TYPE=MAC80211
|
||||
TARGET_CFLAGS +=-DIOPSYS_ECONET
|
||||
else ifeq ($(CONFIG_TARGET_ipq95xx),y)
|
||||
TARGET_PLATFORM=IPQ95XX
|
||||
TARGET_WIFI_TYPE=MAC80211
|
||||
TARGET_CFLAGS +=-DIPQ95XX
|
||||
else ifeq ($(CONFIG_TARGET_iopsys_mediatek),y)
|
||||
TARGET_PLATFORM=LINUX
|
||||
TARGET_WIFI_TYPE=MAC80211
|
||||
TARGET_CFLAGS +=-DIOPSYS_LINUX
|
||||
else
|
||||
$(info Unexpected CONFIG_TARGET, use default MAC80211)
|
||||
TARGET_PLATFORM=MAC80211
|
||||
TARGET_WIFI_TYPE=MAC80211
|
||||
TARGET_CFLAGS +=-DIOPSYS_MAC80211
|
||||
endif
|
||||
|
||||
export TARGET_PLATFORM
|
||||
export TARGET_WIFI_TYPE
|
||||
|
||||
subdirs := \
|
||||
$(if $(CONFIG_PACKAGE_libeasy),libeasy) \
|
||||
$(if $(CONFIG_PACKAGE_libwifiutils),libwifi) \
|
||||
$(if $(CONFIG_PACKAGE_libwifi),libwifi) \
|
||||
$(if $(CONFIG_PACKAGE_libdsl),libdsl) \
|
||||
$(if $(CONFIG_PACKAGE_libethernet),libethernet) \
|
||||
$(if $(CONFIG_PACKAGE_libqos),libqos)
|
||||
|
||||
ifneq ($(CONFIG_PACKAGE_libwifi),)
|
||||
TARGET_CFLAGS +=-DHAS_WIFI
|
||||
endif
|
||||
|
||||
esl-pkgs := \
|
||||
$(if $(CONFIG_PACKAGE_libeasy),libeasy) \
|
||||
$(if $(CONFIG_PACKAGE_libwifiutils),libwifiutils) \
|
||||
$(if $(CONFIG_PACKAGE_libwifi),libwifi) \
|
||||
$(if $(CONFIG_PACKAGE_libdsl),libdsl) \
|
||||
$(if $(CONFIG_PACKAGE_libethernet),libethernet) \
|
||||
$(if $(CONFIG_PACKAGE_libqos),libqos)
|
||||
|
||||
esl-pkgs-all := \
|
||||
libeasy \
|
||||
libwifiutils \
|
||||
libwifi \
|
||||
libdsl \
|
||||
libethernet \
|
||||
libqos
|
||||
|
||||
ifeq ($(CONFIG_LIBWIFI_USE_CTRL_IFACE),y)
|
||||
TARGET_CFLAGS +=-DLIBWIFI_USE_CTRL_IFACE
|
||||
endif
|
||||
|
||||
TARGET_CFLAGS += \
|
||||
-I$(STAGING_DIR)/usr/include \
|
||||
-I$(STAGING_DIR)/usr/include/openssl \
|
||||
-I$(STAGING_DIR)/usr/include/libnl3
|
||||
|
||||
MAKE_FLAGS += \
|
||||
CFLAGS="$(TARGET_CFLAGS) -Wall -I./" \
|
||||
LDFLAGS="$(TARGET_LDFLAGS)" \
|
||||
FPIC="$(FPIC)" \
|
||||
PLATFORM="$(TARGET_PLATFORM)" \
|
||||
WIFI_TYPE="$(TARGET_WIFI_TYPE)" \
|
||||
subdirs="$(subdirs)"
|
||||
|
||||
ifeq ($(LOCAL_DEV),1)
|
||||
define Build/Prepare
|
||||
rsync -r --exclude=.* ~/git/easy-soc-libs/ $(PKG_BUILD_DIR)/
|
||||
endef
|
||||
endif
|
||||
|
||||
include easy.mk
|
||||
include wifi.mk
|
||||
include dsl.mk
|
||||
include ethernet.mk
|
||||
include qos.mk
|
||||
|
||||
ifneq ($(wildcard $(PKG_BUILD_DIR)/.config_*),\
|
||||
$(PKG_BUILD_DIR)/.config_$(patsubst "%",%,$(CONFIG_TARGET_PROFILE)))
|
||||
define Build/Compile/rebuild
|
||||
$(FIND) $(PKG_BUILD_DIR) -name \*.o -or -name \*.so\* | $(XARGS) rm -f;
|
||||
$(if $(wildcard $(PKG_BUILD_DIR)/config_*), \
|
||||
rm -f $(PKG_BUILD_DIR)/.config_*)
|
||||
endef
|
||||
endif
|
||||
|
||||
STAMP_CONFIGURED:=$(strip $(STAMP_CONFIGURED))_$(shell echo $(TARGET_CFLAGS) | mkhash md5)
|
||||
|
||||
define Build/Compile
|
||||
$(Build/Compile/rebuild)
|
||||
touch $(PKG_BUILD_DIR)/.config_$(CONFIG_TARGET_PROFILE)
|
||||
$(call Build/Compile/Default)
|
||||
$(foreach dir,$(esl-pkgs),$(call Build/Compile/$(dir)))
|
||||
endef
|
||||
|
||||
define Build/InstallDev
|
||||
$(foreach dir,$(esl-pkgs),$(call Build/InstallDev/$(dir),$(1),$(2));)
|
||||
endef
|
||||
|
||||
define Package/easy-soc-libs/install
|
||||
:
|
||||
endef
|
||||
|
||||
$(eval $(foreach e,$(esl-pkgs-all),$(call BuildPackage,$(e))))
|
||||
@@ -1,44 +0,0 @@
|
||||
|
||||
define Package/libdsl
|
||||
$(call Package/easy-soc-libs)
|
||||
TITLE:= xDSL library (libdsl)
|
||||
endef
|
||||
|
||||
define Package/libdsl/config
|
||||
if PACKAGE_libdsl
|
||||
config LIBDSL_DEBUG
|
||||
depends on PACKAGE_libdsl
|
||||
bool "Enable dsl debugging"
|
||||
default n
|
||||
|
||||
config LIBDSL_TEST
|
||||
depends on PACKAGE_libdsl
|
||||
bool "Enable dsl test program"
|
||||
default n
|
||||
|
||||
endif
|
||||
endef
|
||||
|
||||
define Build/InstallDev/libdsl
|
||||
$(INSTALL_DIR) $(1)/usr/include/xdsl
|
||||
$(INSTALL_DIR) $(1)/usr/lib
|
||||
$(CP) $(PKG_BUILD_DIR)/libdsl/xdsl.h $(1)/usr/include/xdsl
|
||||
$(CP) $(PKG_BUILD_DIR)/libdsl/xtm.h $(1)/usr/include/xdsl
|
||||
$(CP) $(PKG_BUILD_DIR)/libdsl/common.h $(1)/usr/include/xdsl
|
||||
$(CP) $(PKG_BUILD_DIR)/libdsl/libdsl.so* $(1)/usr/lib/
|
||||
endef
|
||||
|
||||
ifeq ($(CONFIG_LIBDSL_TEST),y)
|
||||
define Build/Compile/libdsl
|
||||
$(MAKE) -C "$(PKG_BUILD_DIR)/libdsl/test" $(MAKE_FLAGS)
|
||||
endef
|
||||
endif
|
||||
|
||||
define Package/libdsl/install
|
||||
$(INSTALL_DIR) $(1)/usr/lib
|
||||
$(INSTALL_DIR) $(1)/usr/bin
|
||||
$(CP) $(PKG_BUILD_DIR)/libdsl/libdsl.so* $(1)/usr/lib/
|
||||
ifeq ($(CONFIG_LIBDSL_TEST),y)
|
||||
$(CP) $(PKG_BUILD_DIR)/libdsl/test/libdsl_test $(1)/usr/bin/
|
||||
endif
|
||||
endef
|
||||
@@ -1,25 +0,0 @@
|
||||
|
||||
|
||||
define Package/libeasy
|
||||
$(call Package/easy-soc-libs)
|
||||
TITLE:= Common helper functions library (libeasy)
|
||||
DEPENDS+=+libnl +libnl-route
|
||||
endef
|
||||
|
||||
define Build/InstallDev/libeasy
|
||||
$(INSTALL_DIR) $(1)/usr/include/easy
|
||||
$(INSTALL_DIR) $(1)/usr/lib
|
||||
$(CP) $(PKG_BUILD_DIR)/libeasy/easy.h $(1)/usr/include/easy/
|
||||
$(CP) $(PKG_BUILD_DIR)/libeasy/event.h $(1)/usr/include/easy/
|
||||
$(CP) $(PKG_BUILD_DIR)/libeasy/utils.h $(1)/usr/include/easy/
|
||||
$(CP) $(PKG_BUILD_DIR)/libeasy/if_utils.h $(1)/usr/include/easy/
|
||||
$(CP) $(PKG_BUILD_DIR)/libeasy/debug.h $(1)/usr/include/easy/
|
||||
$(CP) $(PKG_BUILD_DIR)/libeasy/hlist.h $(1)/usr/include/easy/
|
||||
$(CP) $(PKG_BUILD_DIR)/libeasy/libeasy*.so* $(1)/usr/lib/
|
||||
endef
|
||||
|
||||
define Package/libeasy/install
|
||||
$(INSTALL_DIR) $(1)/usr/lib
|
||||
$(CP) $(PKG_BUILD_DIR)/libeasy/libeasy*.so* $(1)/usr/lib/
|
||||
endef
|
||||
|
||||
@@ -1,27 +0,0 @@
|
||||
|
||||
define Package/libethernet
|
||||
$(call Package/easy-soc-libs)
|
||||
TITLE:= Ethernet library (libethernet)
|
||||
DEPENDS+=+libnl +libnl-route +libeasy +TARGET_iopsys_ramips:swconfig +TARGET_airoha:ecnt_api
|
||||
endef
|
||||
|
||||
define Package/libethernet/config
|
||||
config LIBETHERNET_DEBUG
|
||||
depends on PACKAGE_libethernet
|
||||
bool "Enable ethernet debugging"
|
||||
default n
|
||||
|
||||
endef
|
||||
|
||||
define Build/InstallDev/libethernet
|
||||
$(INSTALL_DIR) $(1)/usr/include
|
||||
$(INSTALL_DIR) $(1)/usr/lib
|
||||
$(CP) $(PKG_BUILD_DIR)/libethernet/ethernet.h $(1)/usr/include/
|
||||
$(CP) $(PKG_BUILD_DIR)/libethernet/libethernet.so $(1)/usr/lib/
|
||||
endef
|
||||
|
||||
define Package/libethernet/install
|
||||
$(INSTALL_DIR) $(1)/usr/lib
|
||||
$(CP) $(PKG_BUILD_DIR)/libethernet/libethernet.so* $(1)/usr/lib/
|
||||
endef
|
||||
|
||||
@@ -1,27 +0,0 @@
|
||||
|
||||
define Package/libqos
|
||||
$(call Package/easy-soc-libs)
|
||||
TITLE:= QoS library (libqos)
|
||||
DEPENDS+=+libnl +libnl-route +libeasy
|
||||
endef
|
||||
|
||||
define Package/libqos/config
|
||||
config LIBQOS_DEBUG
|
||||
depends on PACKAGE_libqos
|
||||
bool "Enable qos debugging"
|
||||
default n
|
||||
|
||||
endef
|
||||
|
||||
define Build/InstallDev/libqos
|
||||
$(INSTALL_DIR) $(1)/usr/include
|
||||
$(INSTALL_DIR) $(1)/usr/lib
|
||||
$(CP) $(PKG_BUILD_DIR)/libqos/include/qos.h $(1)/usr/include/
|
||||
$(CP) $(PKG_BUILD_DIR)/libqos/libqos.so $(1)/usr/lib/
|
||||
endef
|
||||
|
||||
define Package/libqos/install
|
||||
$(INSTALL_DIR) $(1)/usr/lib
|
||||
$(CP) $(PKG_BUILD_DIR)/libqos/libqos*.so* $(1)/usr/lib/
|
||||
endef
|
||||
|
||||
@@ -1,53 +0,0 @@
|
||||
|
||||
define Package/libwifiutils
|
||||
$(call Package/easy-soc-libs)
|
||||
TITLE:= WiFi utility library (libwifiutils.so)
|
||||
DEPENDS+=+libnl +libnl-route +libeasy
|
||||
endef
|
||||
|
||||
define Build/InstallDev/libwifiutils
|
||||
$(INSTALL_DIR) $(1)/usr/include
|
||||
$(INSTALL_DIR) $(1)/usr/lib
|
||||
$(CP) $(PKG_BUILD_DIR)/libwifi/wifidefs.h $(1)/usr/include/
|
||||
$(CP) $(PKG_BUILD_DIR)/libwifi/wifiutils.h $(1)/usr/include/
|
||||
$(CP) $(PKG_BUILD_DIR)/libwifi/libwifiutils*.so* $(1)/usr/lib/
|
||||
endef
|
||||
|
||||
define Package/libwifiutils/install
|
||||
$(INSTALL_DIR) $(1)/usr/lib
|
||||
$(CP) $(PKG_BUILD_DIR)/libwifi/libwifiutils*.so* $(1)/usr/lib/
|
||||
endef
|
||||
|
||||
|
||||
define Package/libwifi
|
||||
$(call Package/easy-soc-libs)
|
||||
TITLE:= WiFi library (libwifi)
|
||||
DEPENDS+=+libnl +libnl-route +libeasy +libwifiutils +TARGET_brcmbca:bcmkernel
|
||||
endef
|
||||
|
||||
define Package/libwifi/config
|
||||
if PACKAGE_libwifi
|
||||
config LIBWIFI_DEBUG
|
||||
depends on PACKAGE_libwifi
|
||||
bool "Enable debugging in libwifi"
|
||||
default n
|
||||
|
||||
config LIBWIFI_USE_CTRL_IFACE
|
||||
bool "Create UNIX sockets to interface with hostapd/wpa_supplicant"
|
||||
default n
|
||||
endif
|
||||
endef
|
||||
|
||||
|
||||
define Build/InstallDev/libwifi
|
||||
$(INSTALL_DIR) $(1)/usr/include
|
||||
$(INSTALL_DIR) $(1)/usr/lib
|
||||
$(CP) $(PKG_BUILD_DIR)/libwifi/wifiops.h $(1)/usr/include/
|
||||
$(CP) $(PKG_BUILD_DIR)/libwifi/wifi.h $(1)/usr/include/
|
||||
$(CP) $(PKG_BUILD_DIR)/libwifi/libwifi-7*.so* $(1)/usr/lib/
|
||||
endef
|
||||
|
||||
define Package/libwifi/install
|
||||
$(INSTALL_DIR) $(1)/usr/lib
|
||||
$(CP) $(PKG_BUILD_DIR)/libwifi/libwifi-7*.so* $(1)/usr/lib/
|
||||
endef
|
||||
@@ -1,4 +0,0 @@
|
||||
|
||||
config ENDPT_OPEN
|
||||
bool "Use pre-compiled version for Open SDK"
|
||||
default n
|
||||
@@ -1,68 +0,0 @@
|
||||
#
|
||||
# Copyright (C) 2018 IOPSYS Software Solutions AB
|
||||
#
|
||||
# This is free software, licensed under the GNU General Public License v2.
|
||||
# See /LICENSE for more information.
|
||||
#
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=endptmngr
|
||||
PKG_VERSION:=0.6
|
||||
|
||||
LOCAL_DEV=0
|
||||
ifneq ($(LOCAL_DEV),1)
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/endptmngr.git
|
||||
PKG_SOURCE_VERSION:=fb85081443c19b5062bede49c80b1802c0f05d34
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
|
||||
PKG_MIRROR_HASH:=skip
|
||||
endif
|
||||
|
||||
PKG_LICENSE:=PROPRIETARY
|
||||
PKG_LICENSE_FILES:=LICENSE
|
||||
|
||||
export BUILD_DIR
|
||||
|
||||
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
|
||||
PKG_BUILD_PARALLEL:=1
|
||||
|
||||
# All config variable that are passed to the make invocation, directly or
|
||||
# indirectly. This ensures that the package is rebuilt on config-changes.
|
||||
PKG_CONFIG_DEPENDS:=CONFIG_TARGET_BOARD
|
||||
|
||||
export CONFIG_BCM_CHIP_ID
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
define Package/endptmngr/config
|
||||
source "$(SOURCE)/Config.in"
|
||||
endef
|
||||
|
||||
define Package/endptmngr
|
||||
CATEGORY:=Utilities
|
||||
TITLE:=Broadcom Voice Endpoint Manager
|
||||
URL:=
|
||||
DEPENDS:= +libubox +ubus +libpicoevent +uci +bcmkernel @TARGET_HAS_VOICE @BCM_VOICE
|
||||
endef
|
||||
|
||||
define Package/endptmngr/description
|
||||
endptmngr
|
||||
endef
|
||||
|
||||
ifeq ($(LOCAL_DEV),1)
|
||||
define Build/Prepare
|
||||
rsync -av --exclude=.* ~/git/endptmngr/* $(PKG_BUILD_DIR)/
|
||||
endef
|
||||
endif
|
||||
|
||||
TARGET_CFLAGS += \
|
||||
-Wall \
|
||||
-Werror
|
||||
|
||||
define Package/endptmngr/install
|
||||
$(CP) ./files/* $(1)/
|
||||
$(INSTALL_DIR) $(1)/usr/sbin
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/src/endptmngr $(1)/usr/sbin/
|
||||
endef
|
||||
|
||||
$(eval $(call BuildPackage,endptmngr))
|
||||
@@ -1,27 +0,0 @@
|
||||
#!/bin/sh /etc/rc.common
|
||||
|
||||
START=68
|
||||
STOP=12
|
||||
|
||||
USE_PROCD=1
|
||||
NAME=endptmngr
|
||||
|
||||
start_service() {
|
||||
[ "$(db -q get hw.board.hasVoice)" = "1" ] || return
|
||||
|
||||
procd_open_instance
|
||||
procd_set_param env hw_board_hasDect=$(db get hw.board.hasDect)
|
||||
procd_set_param command $NAME
|
||||
procd_set_param respawn "5" "0" "3"
|
||||
procd_set_param nice -12
|
||||
procd_close_instance
|
||||
}
|
||||
|
||||
reload_service() {
|
||||
stop
|
||||
start
|
||||
}
|
||||
|
||||
service_triggers() {
|
||||
procd_add_reload_trigger asterisk
|
||||
}
|
||||
@@ -46,8 +46,6 @@ define Package/ethmngr/install
|
||||
$(CP) ./files/common/* $(1)/
|
||||
ifneq ($(CONFIG_TARGET_brcmbca),)
|
||||
$(CP) ./files/broadcom/* $(1)/
|
||||
else ifneq ($(CONFIG_TARGET_airoha),)
|
||||
$(CP) ./files/airoha/* $(1)/
|
||||
else
|
||||
$(CP) ./files/linux/* $(1)/
|
||||
endif
|
||||
|
||||
@@ -1,208 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
. /lib/functions.sh
|
||||
|
||||
unset -f switchmgr
|
||||
# alias for switchmgr
|
||||
switchmgr() {
|
||||
"/userfs/bin/switchmgr" "$@"
|
||||
}
|
||||
|
||||
unset -f tc3162_get_lan_port
|
||||
# get lan port port by ifname
|
||||
# arg1: port ifname, ex: eth0.1
|
||||
tc3162_get_lan_port() {
|
||||
[[ -z "$1" ]] && return 255
|
||||
|
||||
local ifname="$1"
|
||||
local if_idx=255
|
||||
|
||||
# only for tc3162 eth switch ports (eth0.x, 0 < x < 7)
|
||||
case "${ifname}" in
|
||||
eth0.*)
|
||||
;;
|
||||
*)
|
||||
logger -t "port-management" \
|
||||
"unsupported - ${ifname} is not tc3162 switch port"
|
||||
return 255
|
||||
;;
|
||||
esac
|
||||
|
||||
let "if_idx=$(echo "${ifname}" | cut -f2 -d'.')"
|
||||
[[ -z "${if_idx}" ]] && return 255
|
||||
[[ ${if_idx} -lt 1 || ${if_idx} -gt 6 ]] && {
|
||||
logger -t "port-management" \
|
||||
"incorrect tc3162 lan port index ${if_idx} picked from ifname ${ifname}"
|
||||
return 255
|
||||
}
|
||||
let "if_idx=${if_idx}-1"
|
||||
return ${if_idx}
|
||||
}
|
||||
|
||||
|
||||
unset -f tc3162_get_mapped_port
|
||||
# get mapped switch port by ifname
|
||||
# arg1: port ifname, ex: eth0.1
|
||||
tc3162_get_mapped_port() {
|
||||
[[ -z "$1" ]] && return 255
|
||||
|
||||
local ifname="$1"
|
||||
local if_idx=255
|
||||
local prtmap_procfile="/proc/tc3162/eth_portmap"
|
||||
local lan_prt=255
|
||||
local port=255
|
||||
local prtmap_out_line_num=4
|
||||
local prtmap_out_line=""
|
||||
|
||||
# check "lan port map" marker in portmap output string
|
||||
prtmap_out_line="$(sed -n "${prtmap_out_line_num}p" ${prtmap_procfile})"
|
||||
[[ ${prtmap_out_line} != "lan_port_map" ]] && return 255
|
||||
|
||||
tc3162_get_lan_port "${ifname}"
|
||||
let "if_idx=$?"
|
||||
[[ -z "${if_idx}" || ${if_idx} -eq 255 ]] && return
|
||||
|
||||
# get lan portmapping string "lan_port mapped_port" for ifname by it's index
|
||||
let "prtmap_out_line_num=${prtmap_out_line_num}+1+${if_idx}"
|
||||
prtmap_out_line="$(sed -n "${prtmap_out_line_num}p" ${prtmap_procfile})"
|
||||
|
||||
# get and check lan port index from lan portmapping string
|
||||
lan_prt=$(echo "${prtmap_out_line}" | cut -f 1 -d' ')
|
||||
[[ -z "${lan_prt}" || "${if_idx}" != "${lan_prt}" ]] && return 255
|
||||
|
||||
# get and check mapped port from lan portmapping string
|
||||
let "port=$(echo "${prtmap_out_line}" | cut -f 2 -d' ')"
|
||||
[[ ${port} -lt 0 || ${port} -gt 255 ]] && return 255
|
||||
|
||||
return ${port}
|
||||
}
|
||||
|
||||
unset -f get_max_port_speed
|
||||
# arg1: port ifname, ex: eth0.1
|
||||
get_max_port_speed() {
|
||||
[[ -z "$1" ]] && { echo 0; return; }
|
||||
|
||||
local ifname="$1"
|
||||
local port=255
|
||||
local speed=0
|
||||
|
||||
[[ -d "/sys/class/net/${ifname}" ]] || {
|
||||
logger -t "port-management" "interface ${ifname} is not found"
|
||||
return
|
||||
}
|
||||
|
||||
tc3162_get_lan_port "${ifname}"
|
||||
let "port=$?"
|
||||
[[ -z "${port}" || ${port} -eq 255 ]] && return
|
||||
|
||||
# tc3162 capability for all ports is 1Gbps
|
||||
speed=1000
|
||||
|
||||
echo $speed
|
||||
}
|
||||
|
||||
unset -f power_updown
|
||||
# arg1: port ifname, ex: eth0.1
|
||||
# arg2: port enabled, ex: 0/1/off/on/..
|
||||
power_updown() {
|
||||
[[ -z "$1" ]] && return
|
||||
[[ -z "$2" ]] && return
|
||||
|
||||
local ifname="$1"
|
||||
local enabled="$2"
|
||||
local port=255
|
||||
|
||||
[[ -d "/sys/class/net/${ifname}" ]] || {
|
||||
logger -t "port-management" "interface ${ifname} is not found"
|
||||
return
|
||||
}
|
||||
|
||||
let "enabled=$(get_bool "${enabled}" "-1")"
|
||||
[[ ${enabled} -eq -1 ]] && return
|
||||
|
||||
tc3162_get_lan_port "${ifname}"
|
||||
let "port=$?"
|
||||
[[ -z "${port}" || ${port} -eq 255 ]] && return
|
||||
|
||||
switchmgr phy admin "${port}" "${enabled}"
|
||||
}
|
||||
|
||||
unset -f set_port_settings
|
||||
# arg1: port ifname, ex: eth0.1
|
||||
# arg2: port enabled, ex: 0/1/off/on/..
|
||||
# arg3: port speed, ex: 1000
|
||||
# arg4: port duplex, ex: full
|
||||
# arg5: port autoneg, ex: 0/1/off/on/..
|
||||
# arg6: port eee, ex: 0/1/off/on/..
|
||||
# arg7: port pause, ex: 0/1/off/on/..
|
||||
set_port_settings() {
|
||||
[[ -z "$1" ]] && return
|
||||
[[ -z "$2" ]] && return
|
||||
[[ -z "$3" ]] && return
|
||||
[[ -z "$4" ]] && return
|
||||
[[ -z "$5" ]] && return
|
||||
[[ -z "$6" ]] && return
|
||||
[[ -z "$7" ]] && return
|
||||
|
||||
local ifname="$1"
|
||||
local enabled="$2"
|
||||
local speed="$3"
|
||||
local duplex="$4"
|
||||
local autoneg=$5
|
||||
local eee="$6"
|
||||
local pause="$7"
|
||||
local port=255
|
||||
local speedmode=1
|
||||
local last_speed=0
|
||||
|
||||
[[ -d "/sys/class/net/${ifname}" ]] || {
|
||||
logger -t "port-management" "interface ${ifname} is not found"
|
||||
return
|
||||
}
|
||||
|
||||
let "enabled=$(get_bool "${enabled}" "-1")"
|
||||
[[ ${enabled} -eq -1 ]] && return
|
||||
|
||||
let "autoneg=$(get_bool "${autoneg}" "-1")"
|
||||
[[ ${autoneg} -eq -1 ]] && return
|
||||
|
||||
let "eee=$(get_bool "${eee}" "-1")"
|
||||
[[ ${eee} -eq -1 ]] && return
|
||||
|
||||
let "pause=$(get_bool "${pause}" "-1")"
|
||||
[[ ${pause} -eq -1 ]] && return
|
||||
|
||||
duplex="$(echo "${duplex}" | awk '{print tolower($0)}')"
|
||||
[[ "${duplex}" != "half" && "${duplex}" != "full" ]] && return
|
||||
|
||||
tc3162_get_lan_port "${ifname}"
|
||||
let "port=$?"
|
||||
[[ -z "${port}" || ${port} -eq 255 ]] && return
|
||||
|
||||
last_speed="$(switchmgr phy maxspeed "${port}" | cut -f2 -d':')"
|
||||
[[ -z "${last_speed}" || "${last_speed}" == "*Down*" ]] \
|
||||
&& last_speed=${speed}
|
||||
|
||||
switchmgr phy pause "${port}" "${pause}"
|
||||
|
||||
# set speedmode: speed+duplex+autoneg
|
||||
# FIXME: switchmgr has no separate setting for 1Gbps speed - use autoneg instead
|
||||
if [[ ${autoneg} -eq 1 || ${speed} -gt 100 ]]; then
|
||||
switchmgr phy speedmode ${port} "1"
|
||||
else
|
||||
[[ ${speed} -gt 10 ]] && let "speedmode=2" || let "speedmode=4"
|
||||
[[ "${duplex}" == "half" ]] && let "speedmode=${speedmode}+1"
|
||||
switchmgr phy speedmode "${port}" "${speedmode}"
|
||||
fi
|
||||
|
||||
# TODO: implement MAC control register manipulations (mapped ports used) for
|
||||
# eee settings change
|
||||
# separate (tx/rx) pause (flow control) settings change
|
||||
# set speed to 1Gbps separately from autoneg mode
|
||||
|
||||
# FIXME: workaround for duplex/pause settings being not applied if speed is unchanged
|
||||
[[ ${last_speed} -eq ${speed} ]] && power_updown "${ifname}" 0
|
||||
|
||||
power_updown "${ifname}" ${enabled}
|
||||
|
||||
}
|
||||
@@ -40,6 +40,12 @@ get_port_number() {
|
||||
done
|
||||
}
|
||||
|
||||
# arg1: port ifname, ex: eth0
|
||||
reset_port() {
|
||||
local ifname="$1"
|
||||
ethctl $ifname phy-reset >/dev/null
|
||||
}
|
||||
|
||||
# arg1: port ifname, ex: eth0
|
||||
# arg2: port enabled, ex: 1
|
||||
power_updown() {
|
||||
@@ -86,6 +92,9 @@ set_port_settings() {
|
||||
phycaps="$(ethctl $ifname media-type ${pyhendpoint:+ port $pyhendpoint} | awk -F'PHY Capabilities: ' '{print$2}')"
|
||||
numofcaps="$(echo $phycaps | tr '|' ' ' | wc -w)"
|
||||
|
||||
# Reset the port before setting new params
|
||||
reset_port $ifname
|
||||
|
||||
if [ "$numofcaps" == "1" ]; then
|
||||
logger -t "port-management" "$ifname is capable of $phycaps only; not setting speed/duplex"
|
||||
else
|
||||
|
||||
@@ -6,7 +6,7 @@ get_max_port_speed() {
|
||||
fi
|
||||
|
||||
local ifname="$1"
|
||||
local phycap="$(ethtool $ifname | grep -A 10 "Supported link modes" | grep 000 | tail -n 1 | awk '{print$NF}')"
|
||||
local phycap="$(ethtool $ifname | grep -A 10 "Supported link modes" | grep 00 | tail -n 1 | awk '{print$NF}')"
|
||||
local speed=1000
|
||||
|
||||
case "$phycap" in
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright (C) 2020-2022 IOPSYS Software Solutions AB
|
||||
# Copyright (C) 2020-2023 IOPSYS Software Solutions AB
|
||||
#
|
||||
# This is free software, licensed under the BSD-3-Clause
|
||||
# See /LICENSE for more information.
|
||||
@@ -8,11 +8,11 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=icwmp
|
||||
PKG_VERSION:=9.1.14
|
||||
PKG_VERSION:=9.3.2
|
||||
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/icwmp.git
|
||||
PKG_SOURCE_VERSION:=d135d87f65e569b504464738e2b0c2041865a20a
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/bbf/icwmp.git
|
||||
PKG_SOURCE_VERSION:=a68417ec44251e9f619f2682618b06dae083bd32
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
|
||||
PKG_MIRROR_HASH:=skip
|
||||
|
||||
@@ -29,33 +29,44 @@ define Package/icwmp/default
|
||||
CATEGORY:=Utilities
|
||||
SUBMENU:=TRx69
|
||||
TITLE:=TR069 CWMP client
|
||||
DEPENDS:=+libuci +libubox +libblobmsg-json +libubus +libjson-c +libcurl +mxml +libuuid +libbbf_api
|
||||
DEPENDS:=+libuci +libubox +libblobmsg-json +libubus +libjson-c +libcurl +mxml +libuuid +libbbfdm-api
|
||||
endef
|
||||
|
||||
define Package/icwmp
|
||||
$(Package/icwmp/default)
|
||||
VARIANT:=default
|
||||
DEFAULT_VARIANT:=1
|
||||
DEPENDS += +PACKAGE_icwmp-openssl:libopenssl
|
||||
endef
|
||||
|
||||
define Package/icwmp-openssl
|
||||
$(Package/icwmp/default)
|
||||
TITLE += (openssl)
|
||||
DEPENDS += +PACKAGE_icwmp-openssl:libopenssl
|
||||
VARIANT:=openssl
|
||||
DEPENDS += +PACKAGE_icwmp-openssl:libopenssl
|
||||
CONFLICTS := icwmp icwmp-mbedtls icwmp-wolfssl
|
||||
endef
|
||||
|
||||
define Package/icwmp-wolfssl
|
||||
$(Package/icwmp/default)
|
||||
TITLE += (wolfssl)
|
||||
DEPENDS += +PACKAGE_icwmp-wolfssl:libwolfssl
|
||||
CONFLICTS := icwmp-openssl
|
||||
VARIANT:=wolfssl
|
||||
DEPENDS += +PACKAGE_icwmp-wolfssl:libwolfssl
|
||||
CONFLICTS := icwmp icwmp-mbedtls icwmp-openssl
|
||||
endef
|
||||
|
||||
define Package/icwmp-mbedtls
|
||||
$(Package/icwmp/default)
|
||||
TITLE += (mbedtls)
|
||||
DEPENDS += +PACKAGE_icwmp-mbedtls:libmbedtls
|
||||
CONFLICTS := icwmp-openssl icwmp-wolfssl
|
||||
VARIANT:=mbedtls
|
||||
DEFAULT_VARIANT:=1
|
||||
CONFLICTS := icwmp icwmp-wolfssl icwmp-openssl
|
||||
endef
|
||||
|
||||
ifeq ($(BUILD_VARIANT),default)
|
||||
CMAKE_OPTIONS += -DWITH_OPENSSL=ON
|
||||
endif
|
||||
|
||||
ifeq ($(BUILD_VARIANT),openssl)
|
||||
CMAKE_OPTIONS += -DWITH_OPENSSL=ON
|
||||
endif
|
||||
@@ -99,10 +110,12 @@ define Package/icwmp/default/install
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/files/etc/udhcpc.user.d/udhcpc_icwmp_opt43.user $(1)/etc/udhcpc.user.d/udhcpc_icwmp_opt43.user
|
||||
endef
|
||||
|
||||
Package/icwmp/install = $(Package/icwmp/default/install)
|
||||
Package/icwmp-openssl/install = $(Package/icwmp/default/install)
|
||||
Package/icwmp-wolfssl/install = $(Package/icwmp/default/install)
|
||||
Package/icwmp-mbedtls/install = $(Package/icwmp/default/install)
|
||||
|
||||
$(eval $(call BuildPackage,icwmp))
|
||||
$(eval $(call BuildPackage,icwmp-openssl))
|
||||
$(eval $(call BuildPackage,icwmp-wolfssl))
|
||||
$(eval $(call BuildPackage,icwmp-mbedtls))
|
||||
|
||||
@@ -11,8 +11,6 @@ config acs 'acs'
|
||||
option retry_min_wait_interval '5'
|
||||
# possible configs interval :[1000:65535]
|
||||
option retry_interval_multiplier '2000'
|
||||
option ipv6_enable '0'
|
||||
option ip_version '4'
|
||||
|
||||
config cpe 'cpe'
|
||||
option enable '1'
|
||||
@@ -38,6 +36,7 @@ config cpe 'cpe'
|
||||
option periodic_notify_enable '1'
|
||||
option periodic_notify_interval '10'
|
||||
option incoming_rule 'Port_Only'
|
||||
option active_notif_throttle '0'
|
||||
|
||||
config lwn 'lwn'
|
||||
option enable '1'
|
||||
|
||||
@@ -320,7 +320,6 @@ validate_acs_section()
|
||||
'compression:or("GZIP","Deflate","Disabled")' \
|
||||
'retry_min_wait_interval:range(1, 65535)' \
|
||||
'retry_interval_multiplier:range(1000, 65535)' \
|
||||
'ipv6_enable:bool' \
|
||||
'ssl_capath:string'
|
||||
|
||||
}
|
||||
@@ -382,12 +381,15 @@ boot() {
|
||||
|
||||
config_load cwmp
|
||||
config_get_bool enable_cwmp cpe enable 1
|
||||
local wan_interface=""
|
||||
|
||||
config_get wan_interface cpe default_wan_interface "wan"
|
||||
|
||||
if [ "$enable_cwmp" = "0" ]; then
|
||||
return 0
|
||||
fi
|
||||
|
||||
config_get dhcp_discovery acs dhcp_discovery "0"
|
||||
config_get wan_interface cpe default_wan_interface "wan"
|
||||
|
||||
if [ "${dhcp_discovery}" = "enable" ] || [ "${dhcp_discovery}" = "1" ]; then
|
||||
# Set dhcp option 43 if not already configured
|
||||
@@ -411,7 +413,6 @@ boot() {
|
||||
|
||||
# Copy backup data so that if it restart latter on, it gets the info
|
||||
copy_cwmp_etc_files_to_varstate
|
||||
touch /etc/icwmpd/cwmp_notification
|
||||
mkdir -p /var/run/icwmpd/
|
||||
touch /var/run/icwmpd/cwmp
|
||||
|
||||
|
||||
@@ -5,13 +5,13 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=ieee1905
|
||||
PKG_VERSION:=8.0.10
|
||||
PKG_VERSION:=8.0.15
|
||||
|
||||
LOCAL_DEV=0
|
||||
ifneq ($(LOCAL_DEV),1)
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_VERSION:=69b1073cfe3dc936c9cbe3e8a71005e9fa9f57e0
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/ieee1905.git
|
||||
PKG_SOURCE_VERSION:=1717f97c054c232d393c91fa7e95a571bf893680
|
||||
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
|
||||
endif
|
||||
|
||||
@@ -18,12 +18,7 @@ start_service() {
|
||||
procd_close_instance
|
||||
}
|
||||
|
||||
stop() {
|
||||
service_stop imonitor
|
||||
}
|
||||
|
||||
reload_service() {
|
||||
stop
|
||||
start
|
||||
}
|
||||
|
||||
|
||||
18
iop/config
18
iop/config
@@ -65,7 +65,7 @@ CONFIG_PACKAGE_ieee1905=y
|
||||
CONFIG_PACKAGE_map-agent=m
|
||||
CONFIG_PACKAGE_map-controller=m
|
||||
CONFIG_PACKAGE_map-topology=y
|
||||
CONFIG_PACKAGE_wfadatad-collector=y
|
||||
CONFIG_PACKAGE_decollector=y
|
||||
|
||||
# Network #
|
||||
CONFIG_PACKAGE_netmode=y
|
||||
@@ -79,12 +79,13 @@ CONFIG_PACKAGE_rulengd=y
|
||||
CONFIG_PACKAGE_usermngr=y
|
||||
|
||||
# TR-x69 #
|
||||
CONFIG_PACKAGE_uspd-mbedtls=y
|
||||
CONFIG_PACKAGE_icwmp-mbedtls=y
|
||||
CONFIG_PACKAGE_libbbfdm=y
|
||||
CONFIG_PACKAGE_bbfdmd=y
|
||||
CONFIG_PACKAGE_icwmp=y
|
||||
CONFIG_PACKAGE_obuspa=y
|
||||
CONFIG_PACKAGE_bulkdata=y
|
||||
CONFIG_PACKAGE_periodicstats=y
|
||||
CONFIG_PACKAGE_stunc-mbedtls=m
|
||||
CONFIG_PACKAGE_stunc=m
|
||||
CONFIG_PACKAGE_swmodd=m
|
||||
CONFIG_PACKAGE_twamp=m
|
||||
CONFIG_PACKAGE_udpecho-client=m
|
||||
@@ -108,6 +109,8 @@ CONFIG_PACKAGE_comgt=y
|
||||
CONFIG_PACKAGE_comgt-directip=y
|
||||
CONFIG_PACKAGE_comgt-ncm=y
|
||||
CONFIG_PACKAGE_ds-lite=y
|
||||
CONFIG_PACKAGE_firewall=y
|
||||
# CONFIG_PACKAGE_firewall4 is not set
|
||||
CONFIG_PACKAGE_gre=y
|
||||
CONFIG_PACKAGE_map=y
|
||||
CONFIG_PACKAGE_ntfs-3g=y
|
||||
@@ -303,10 +306,3 @@ CONFIG_BUSYBOX_CONFIG_FEATURE_VOLUMEID_SQUASHFS=y
|
||||
CONFIG_BUSYBOX_CONFIG_FEATURE_VOLUMEID_UBIFS=y
|
||||
CONFIG_BUSYBOX_CONFIG_TIMEOUT=y
|
||||
CONFIG_BUSYBOX_CONFIG_NOHUP=y
|
||||
|
||||
# Use fw3 iptables-based instead of newer nftables-based fw4
|
||||
# TODO: for now we cannot build an image with fw3 and luci-app-firewall (i.e. fw3)
|
||||
# Enabling luci-app-firewall enables fw4
|
||||
# CONFIG_PACKAGE_luci-app-firewall is not set
|
||||
CONFIG_PACKAGE_firewall=y
|
||||
# CONFIG_PACKAGE_firewall4 is not set
|
||||
|
||||
@@ -30,23 +30,18 @@ function feeds_update {
|
||||
./scripts/feeds install -f -p openwrt_core -a
|
||||
fi
|
||||
|
||||
(
|
||||
echo '# DO NOT EDIT. Autogenerated file by ./iop feeds_update'
|
||||
echo 'FEED_DEVICES_DIRS:='
|
||||
find feeds -type f -name .is-feed-devices-dir -printf 'FEED_DEVICES_DIRS+=$(TOPDIR)/%h'
|
||||
) > target/linux/feed-devices/feed-devices-list.mk
|
||||
|
||||
# targets need to be installed explicitly
|
||||
for target in $(ls ./feeds/targets); do
|
||||
rm -f target/linux/$target
|
||||
./scripts/feeds install -p targets $target
|
||||
done
|
||||
|
||||
# Workaround for bug in 22.03.0-rc4 where installed target path has been
|
||||
# moved to target/linux/feeds but Config.in and Makefile from installed
|
||||
# targets are not properly included from the new location.
|
||||
# This hack is to be removed once the issues are fixed.
|
||||
# Note that the above block of code might no longer necessary because
|
||||
# targets no longer need to be installed explicitly.
|
||||
echo "Working around installed-target-bug"
|
||||
for f in target/linux/feeds/*; do
|
||||
ln -vsf "feeds/$(basename "$f")" "target/linux/$(basename "$f")"
|
||||
done
|
||||
|
||||
# install all packages
|
||||
./scripts/feeds install -a
|
||||
|
||||
|
||||
@@ -14,7 +14,6 @@ function genconfig {
|
||||
target="bogus"
|
||||
target_config_path=""
|
||||
brcmbca_feed="target/linux/feeds/brcmbca"
|
||||
ramips_feed="target/linux/feeds/iopsys-ramips"
|
||||
airoha_feed="target/linux/feeds/airoha"
|
||||
x86_feed="target/linux/feeds/iopsys-x86"
|
||||
armvirt_feed="target/linux/feeds/iopsys-armvirt"
|
||||
@@ -111,8 +110,6 @@ function genconfig {
|
||||
|
||||
[ -e $brcmbca_feed/genconfig ] &&
|
||||
brcmbca=$(cd $brcmbca_feed; ./genconfig)
|
||||
[ -e $ramips_feed/genconfig ] &&
|
||||
iopsys_ramips=$(cd $ramips_feed; ./genconfig)
|
||||
[ -e $airoha_feed/genconfig ] &&
|
||||
airoha=$(cd $airoha_feed; ./genconfig)
|
||||
[ -e $x86_feed/genconfig ] &&
|
||||
@@ -125,7 +122,7 @@ function genconfig {
|
||||
ipq95xx=$(cd $qualcomm_ipq95xx_feed; ./genconfig)
|
||||
|
||||
if [ "$profile" == "LIST" ]; then
|
||||
for list in brcmbca iopsys_ramips airoha iopsys_x86 iopsys_armvirt iopsys_mediatek ipq95xx; do
|
||||
for list in brcmbca airoha iopsys_x86 iopsys_armvirt iopsys_mediatek ipq95xx; do
|
||||
echo "$list based boards:"
|
||||
for b in ${!list}; do
|
||||
echo -e "\t$b"
|
||||
@@ -142,14 +139,6 @@ function genconfig {
|
||||
fi
|
||||
done
|
||||
|
||||
for p in $iopsys_ramips; do
|
||||
if [ $p == $profile ]; then
|
||||
target="iopsys_ramips"
|
||||
target_config_path="$ramips_feed/config"
|
||||
return
|
||||
fi
|
||||
done
|
||||
|
||||
for p in $airoha; do
|
||||
if [ $p == $profile ]; then
|
||||
target="airoha"
|
||||
@@ -309,6 +298,24 @@ function genconfig {
|
||||
fi
|
||||
}
|
||||
|
||||
get_subtarget_for_device() {
|
||||
readonly target="$1"
|
||||
readonly device="$2"
|
||||
readonly targetinfo_file="tmp/info/.targetinfo-feeds_$target"
|
||||
readonly target_profile_line="Target-Profile: DEVICE_$device"
|
||||
# We want to know after which Target: $target/$subtarget line
|
||||
# our $target_profile_line appears
|
||||
# This is a crude way to "parse" the file using shell 🤯
|
||||
# 1. grep for both lines with line number output
|
||||
# 2. grep again to determine the device profile line that we looked for
|
||||
# but output one context line before as well to determine corresponding subtarget line
|
||||
# 4. Use head and sed to extract the subtarget
|
||||
grep "^Target: $target/\|^$target_profile_line" "$targetinfo_file" \
|
||||
| grep -E -B1 "^$target_profile_line" \
|
||||
| head -n1 \
|
||||
| sed -E "s|^Target: $target/||"
|
||||
}
|
||||
|
||||
create_and_copy_files()
|
||||
{
|
||||
local BOARDTYPE=$1
|
||||
@@ -353,15 +360,14 @@ function genconfig {
|
||||
|
||||
# Special handling for targets which use TARGET_DEVICES
|
||||
case "$target" in
|
||||
iopsys_ramips | airoha | iopsys_mediatek | brcmbca | ipq95xx)
|
||||
airoha | iopsys_mediatek | brcmbca | ipq95xx)
|
||||
# This assumes the device name to be unique within one target,
|
||||
# which is a fair assumption to make.
|
||||
local mk_file="$(grep -Fx --files-with-matches "define Device/${BOARDTYPE}" "$target_config_path/../image/"*.mk)"
|
||||
if [ -z "$mk_file" ]; then
|
||||
local subtarget="$(get_subtarget_for_device "${target/_/-}" "$BOARDTYPE")"
|
||||
if [ -z "$subtarget" ]; then
|
||||
echo "Error determining subtarget for $target / ${BOARDTYPE}"
|
||||
return 1
|
||||
fi
|
||||
local subtarget="$(basename "${mk_file%.mk}")"
|
||||
echo "CONFIG_TARGET_${target}=y" >> .config
|
||||
echo "CONFIG_TARGET_${target}_${subtarget}=y" >> .config
|
||||
echo "CONFIG_TARGET_DEVICE_${target}_${subtarget}_DEVICE_${BOARDTYPE}=y" >> .config
|
||||
|
||||
@@ -13,7 +13,6 @@ function genconfig_min {
|
||||
target="bogus"
|
||||
target_config_path=""
|
||||
brcmbca_feed="target/linux/feeds/brcmbca"
|
||||
ramips_feed="target/linux/feeds/iopsys-ramips"
|
||||
airoha_feed="target/linux/feeds/airoha"
|
||||
x86_feed="target/linux/feeds/iopsys-x86"
|
||||
armvirt_feed="target/linux/feeds/iopsys-armvirt"
|
||||
@@ -110,8 +109,6 @@ function genconfig_min {
|
||||
|
||||
[ -e $brcmbca_feed/genconfig ] &&
|
||||
brcmbca=$(cd $brcmbca_feed; ./genconfig)
|
||||
[ -e $ramips_feed/genconfig ] &&
|
||||
iopsys_ramips=$(cd $ramips_feed; ./genconfig)
|
||||
[ -e $airoha_feed/genconfig ] &&
|
||||
airoha=$(cd $airoha_feed; ./genconfig)
|
||||
[ -e $x86_feed/genconfig ] &&
|
||||
@@ -124,7 +121,7 @@ function genconfig_min {
|
||||
ipq95xx=$(cd $qualcomm_ipq95xx_feed; ./genconfig)
|
||||
|
||||
if [ "$profile" == "LIST" ]; then
|
||||
for list in brcmbca iopsys_ramips airoha iopsys_x86 iopsys_armvirt iopsys_mediatek ipq95xx; do
|
||||
for list in brcmbca airoha iopsys_x86 iopsys_armvirt iopsys_mediatek ipq95xx; do
|
||||
echo "$list based boards:"
|
||||
for b in ${!list}; do
|
||||
echo -e "\t$b"
|
||||
@@ -141,14 +138,6 @@ function genconfig_min {
|
||||
fi
|
||||
done
|
||||
|
||||
for p in $iopsys_ramips; do
|
||||
if [ $p == $profile ]; then
|
||||
target="iopsys_ramips"
|
||||
target_config_path="$ramips_feed/config"
|
||||
return
|
||||
fi
|
||||
done
|
||||
|
||||
for p in $airoha; do
|
||||
if [ $p == $profile ]; then
|
||||
target="airoha"
|
||||
@@ -283,6 +272,24 @@ function genconfig_min {
|
||||
fi
|
||||
}
|
||||
|
||||
get_subtarget_for_device() {
|
||||
readonly target="$1"
|
||||
readonly device="$2"
|
||||
readonly targetinfo_file="tmp/info/.targetinfo-feeds_$target"
|
||||
readonly target_profile_line="Target-Profile: DEVICE_$device"
|
||||
# We want to know after which Target: $target/$subtarget line
|
||||
# our $target_profile_line appears
|
||||
# This is a crude way to "parse" the file using shell 🤯
|
||||
# 1. grep for both lines with line number output
|
||||
# 2. grep again to determine the device profile line that we looked for
|
||||
# but output one context line before as well to determine corresponding subtarget line
|
||||
# 4. Use head and sed to extract the subtarget
|
||||
grep "^Target: $target/\|^$target_profile_line" "$targetinfo_file" \
|
||||
| grep -E -B1 "^$target_profile_line" \
|
||||
| head -n1 \
|
||||
| sed -E "s|^Target: $target/||"
|
||||
}
|
||||
|
||||
create_and_copy_files()
|
||||
{
|
||||
local BOARDTYPE=$1
|
||||
@@ -327,15 +334,14 @@ function genconfig_min {
|
||||
|
||||
# Special handling for targets which use TARGET_DEVICES
|
||||
case "$target" in
|
||||
iopsys_ramips | airoha | iopsys_mediatek | brcmbca | ipq95xx)
|
||||
airoha | iopsys_mediatek | brcmbca | ipq95xx)
|
||||
# This assumes the device name to be unique within one target,
|
||||
# which is a fair assumption to make.
|
||||
local mk_file="$(grep -Fx --files-with-matches "define Device/${BOARDTYPE}" "$target_config_path/../image/"*.mk)"
|
||||
if [ -z "$mk_file" ]; then
|
||||
local subtarget="$(get_subtarget_for_device "${target/_/-}" "$BOARDTYPE")"
|
||||
if [ -z "$subtarget" ]; then
|
||||
echo "Error determining subtarget for $target / ${BOARDTYPE}"
|
||||
return 1
|
||||
fi
|
||||
local subtarget="$(basename "${mk_file%.mk}")"
|
||||
echo "CONFIG_TARGET_${target}=y" >> .config
|
||||
echo "CONFIG_TARGET_${target}_${subtarget}=y" >> .config
|
||||
echo "CONFIG_TARGET_DEVICE_${target}_${subtarget}_DEVICE_${BOARDTYPE}=y" >> .config
|
||||
|
||||
@@ -32,8 +32,3 @@ start_service() {
|
||||
procd_set_param respawn
|
||||
procd_close_instance
|
||||
}
|
||||
|
||||
#stop() {
|
||||
# service_stop /sbin/iwatchdog
|
||||
#}
|
||||
|
||||
|
||||
95
libdsl/Makefile
Normal file
95
libdsl/Makefile
Normal file
@@ -0,0 +1,95 @@
|
||||
#
|
||||
# Copyright (C) 2020-2023 Iopsys
|
||||
#
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=libdsl
|
||||
PKG_VERSION:=7.2.99
|
||||
|
||||
LOCAL_DEV=0
|
||||
ifneq ($(LOCAL_DEV),1)
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_VERSION:=54d53295b5e4ca74884045d0fa6bb0dc279ace3d
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/libdsl.git
|
||||
PKG_MAINTAINER:=Anjan Chanda <anjan.chanda@iopsys.eu>
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)_$(PKG_SOURCE_VERSION).tar.xz
|
||||
PKG_MIRROR_HASH:=skip
|
||||
endif
|
||||
|
||||
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
|
||||
PKG_LICENSE:=LGPL-2.1-only
|
||||
PKG_LICENSE_FILES:=LICENSE
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
ifeq ($(CONFIG_TARGET_brcmbca),y)
|
||||
TARGET_PLATFORM=BROADCOM
|
||||
CHIP_ID=$(patsubst "%",%,$(CONFIG_BCM_CHIP_ID))
|
||||
TARGET_CFLAGS +=-DIOPSYS_BROADCOM -DCHIP_$(CHIP_ID) -DCONFIG_BCM9$(CHIP_ID) \
|
||||
-I$(STAGING_DIR)/usr/include/bcm963xx/bcmdrivers/opensource/include/bcm963xx \
|
||||
-I$(STAGING_DIR)/usr/include/bcm963xx/userspace/public/include
|
||||
else ifeq ($(CONFIG_TARGET_iopsys_x86),y)
|
||||
TARGET_PLATFORM=TEST
|
||||
TARGET_CFLAGS +=-DIOPSYS_TEST
|
||||
else ifeq ($(CONFIG_TARGET_iopsys_armvirt),y)
|
||||
TARGET_PLATFORM=TEST
|
||||
TARGET_CFLAGS +=-DIOPSYS_TEST
|
||||
endif
|
||||
|
||||
define Package/libdsl
|
||||
SECTION:=libs
|
||||
CATEGORY:=Libraries
|
||||
SUBMENU:=IOPSYS HAL libs
|
||||
MENU:=1
|
||||
TITLE:= xDSL library (libdsl)
|
||||
endef
|
||||
|
||||
define Package/libdsl/description
|
||||
Library provides xDSL/GFAST HAL APIs
|
||||
endef
|
||||
|
||||
define Package/libdsl/config
|
||||
if PACKAGE_libdsl
|
||||
config LIBDSL_DEBUG
|
||||
depends on PACKAGE_libdsl
|
||||
bool "Enable dsl debugging"
|
||||
default n
|
||||
|
||||
config LIBDSL_TEST
|
||||
depends on PACKAGE_libdsl
|
||||
bool "Enable dsl test program"
|
||||
default n
|
||||
|
||||
endif
|
||||
endef
|
||||
|
||||
define Build/InstallDev/libdsl
|
||||
$(INSTALL_DIR) $(1)/usr/include/xdsl
|
||||
$(INSTALL_DIR) $(1)/usr/lib
|
||||
$(CP) $(PKG_BUILD_DIR)/xdsl.h $(1)/usr/include/xdsl
|
||||
$(CP) $(PKG_BUILD_DIR)/xtm.h $(1)/usr/include/xdsl
|
||||
$(CP) $(PKG_BUILD_DIR)/common.h $(1)/usr/include/xdsl
|
||||
$(CP) $(PKG_BUILD_DIR)/libdsl.so* $(1)/usr/lib/
|
||||
endef
|
||||
|
||||
define Build/InstallDev
|
||||
$(call Build/InstallDev/libdsl,$(1),$(2))
|
||||
endef
|
||||
|
||||
ifeq ($(CONFIG_LIBDSL_TEST),y)
|
||||
define Build/Compile/libdsl
|
||||
$(MAKE) -C "$(PKG_BUILD_DIR)/test" $(MAKE_FLAGS)
|
||||
endef
|
||||
endif
|
||||
|
||||
define Package/libdsl/install
|
||||
$(INSTALL_DIR) $(1)/usr/lib
|
||||
$(INSTALL_DIR) $(1)/usr/bin
|
||||
$(CP) $(PKG_BUILD_DIR)/libdsl.so* $(1)/usr/lib/
|
||||
ifeq ($(CONFIG_LIBDSL_TEST),y)
|
||||
$(CP) $(PKG_BUILD_DIR)/test/libdsl_test $(1)/usr/bin/
|
||||
endif
|
||||
endef
|
||||
|
||||
$(eval $(call BuildPackage,libdsl))
|
||||
68
libeasy/Makefile
Normal file
68
libeasy/Makefile
Normal file
@@ -0,0 +1,68 @@
|
||||
#
|
||||
# Copyright (C) 2020-2023 Iopsys
|
||||
#
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=libeasy
|
||||
PKG_VERSION:=7.2.99
|
||||
|
||||
LOCAL_DEV=0
|
||||
ifneq ($(LOCAL_DEV),1)
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_VERSION:=bca982ba1e3c59fc900d297145b731dd0ad588a0
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/libeasy.git
|
||||
PKG_MAINTAINER:=Anjan Chanda <anjan.chanda@iopsys.eu>
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)_$(PKG_SOURCE_VERSION).tar.xz
|
||||
PKG_MIRROR_HASH:=skip
|
||||
endif
|
||||
|
||||
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
|
||||
PKG_LICENSE:=LGPL-2.1-only
|
||||
PKG_LICENSE_FILES:=LICENSE
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
TARGET_CFLAGS += \
|
||||
-I$(STAGING_DIR)/usr/include \
|
||||
-I$(STAGING_DIR)/usr/include/openssl \
|
||||
-I$(STAGING_DIR)/usr/include/libnl3
|
||||
|
||||
MAKE_FLAGS += \
|
||||
CFLAGS="$(TARGET_CFLAGS) -Wall"
|
||||
|
||||
define Package/libeasy
|
||||
SECTION:=libs
|
||||
CATEGORY:=Libraries
|
||||
SUBMENU:=IOPSYS HAL libs
|
||||
MENU:=1
|
||||
TITLE:= Common helper library (libeasy)
|
||||
DEPENDS+=+libnl +libnl-route +libopenssl
|
||||
endef
|
||||
|
||||
define Package/libeasy/description
|
||||
Library provides common utility functions
|
||||
endef
|
||||
|
||||
define Build/InstallDev/libeasy
|
||||
$(INSTALL_DIR) $(1)/usr/include/easy
|
||||
$(INSTALL_DIR) $(1)/usr/lib
|
||||
$(CP) $(PKG_BUILD_DIR)/easy.h $(1)/usr/include/easy/
|
||||
$(CP) $(PKG_BUILD_DIR)/event.h $(1)/usr/include/easy/
|
||||
$(CP) $(PKG_BUILD_DIR)/utils.h $(1)/usr/include/easy/
|
||||
$(CP) $(PKG_BUILD_DIR)/if_utils.h $(1)/usr/include/easy/
|
||||
$(CP) $(PKG_BUILD_DIR)/debug.h $(1)/usr/include/easy/
|
||||
$(CP) $(PKG_BUILD_DIR)/hlist.h $(1)/usr/include/easy/
|
||||
$(CP) $(PKG_BUILD_DIR)/libeasy*.so* $(1)/usr/lib/
|
||||
endef
|
||||
|
||||
define Build/InstallDev
|
||||
$(call Build/InstallDev/libeasy,$(1),$(2))
|
||||
endef
|
||||
|
||||
define Package/libeasy/install
|
||||
$(INSTALL_DIR) $(1)/usr/lib
|
||||
$(CP) $(PKG_BUILD_DIR)/libeasy*.so* $(1)/usr/lib/
|
||||
endef
|
||||
|
||||
$(eval $(call BuildPackage,libeasy))
|
||||
110
libethernet/Makefile
Normal file
110
libethernet/Makefile
Normal file
@@ -0,0 +1,110 @@
|
||||
#
|
||||
# Copyright (C) 2020-2023 Iopsys
|
||||
#
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=libethernet
|
||||
PKG_VERSION:=7.2.102
|
||||
|
||||
LOCAL_DEV=0
|
||||
ifneq ($(LOCAL_DEV),1)
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_VERSION:=30df74671870acef99036217e002d1f4418c8d4f
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/libethernet.git
|
||||
PKG_MAINTAINER:=Anjan Chanda <anjan.chanda@iopsys.eu>
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)_$(PKG_SOURCE_VERSION).tar.xz
|
||||
PKG_MIRROR_HASH:=skip
|
||||
endif
|
||||
|
||||
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
|
||||
PKG_LICENSE:=LGPL-2.1-only
|
||||
PKG_LICENSE_FILES:=LICENSE
|
||||
PKG_BUILD_DEPENDS:=+TARGET_brcmbca:bcmkernel
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
ifeq ($(CONFIG_TARGET_brcmbca),y)
|
||||
TARGET_PLATFORM=BROADCOM
|
||||
CHIP_ID=$(patsubst "%",%,$(CONFIG_BCM_CHIP_ID))
|
||||
TARGET_CFLAGS +=-DIOPSYS_BROADCOM -DCHIP_$(CHIP_ID) -DCONFIG_BCM9$(CHIP_ID) \
|
||||
-I$(STAGING_DIR)/usr/include/bcm963xx/shared/opensource/include/bcm963xx \
|
||||
-I$(STAGING_DIR)/usr/include/bcm963xx/bcmdrivers/opensource/include/bcm963xx \
|
||||
-I$(STAGING_DIR)/usr/include/bcm963xx/userspace/public/include
|
||||
else ifeq ($(CONFIG_TARGET_iopsys_x86),y)
|
||||
TARGET_PLATFORM=TEST
|
||||
TARGET_CFLAGS +=-DIOPSYS_TEST
|
||||
else ifeq ($(CONFIG_TARGET_iopsys_armvirt),y)
|
||||
TARGET_PLATFORM=TEST
|
||||
TARGET_CFLAGS +=-DIOPSYS_TEST
|
||||
else ifeq ($(CONFIG_TARGET_airoha),y)
|
||||
TARGET_PLATFORM=ECONET
|
||||
TARGET_CFLAGS +=-DIOPSYS_ECONET
|
||||
else ifeq ($(CONFIG_TARGET_ipq95xx),y)
|
||||
TARGET_PLATFORM=IPQ95XX
|
||||
TARGET_CFLAGS +=-DIPQ95XX
|
||||
else ifeq ($(CONFIG_TARGET_iopsys_mediatek),y)
|
||||
TARGET_PLATFORM=LINUX
|
||||
TARGET_CFLAGS +=-DIOPSYS_LINUX
|
||||
else
|
||||
$(info Unexpected CONFIG_TARGET, use default LINUX)
|
||||
TARGET_PLATFORM=LINUX
|
||||
TARGET_CFLAGS +=-DIOPSYS_LINUX
|
||||
endif
|
||||
|
||||
TARGET_CFLAGS += \
|
||||
-I$(STAGING_DIR)/usr/include \
|
||||
-I$(STAGING_DIR)/usr/include/openssl \
|
||||
-I$(STAGING_DIR)/usr/include/libnl3
|
||||
|
||||
MAKE_FLAGS += \
|
||||
CFLAGS="$(TARGET_CFLAGS) -Wall -I./" \
|
||||
LDFLAGS="$(TARGET_LDFLAGS)" \
|
||||
FPIC="$(FPIC)" \
|
||||
PLATFORM="$(TARGET_PLATFORM)" \
|
||||
subdirs="$(subdirs)"
|
||||
|
||||
define Package/libethernet
|
||||
SECTION:=libs
|
||||
CATEGORY:=Libraries
|
||||
SUBMENU:=IOPSYS HAL libs
|
||||
MENU:=1
|
||||
TITLE:= Ethernet library (libethernet)
|
||||
DEPENDS+=+libnl +libnl-route +libeasy +TARGET_airoha:ecnt_api
|
||||
endef
|
||||
|
||||
define Package/libethernet/description
|
||||
Library provides ethernet HAL APIs
|
||||
endef
|
||||
|
||||
define Package/libethernet/config
|
||||
config LIBETHERNET_DEBUG
|
||||
depends on PACKAGE_libethernet
|
||||
bool "Enable ethernet debugging"
|
||||
default n
|
||||
|
||||
endef
|
||||
|
||||
ifeq ($(LOCAL_DEV),1)
|
||||
define Build/Prepare
|
||||
$(CP) -rf ./libethernet/* $(PKG_BUILD_DIR)/
|
||||
endef
|
||||
endif
|
||||
|
||||
define Build/InstallDev/libethernet
|
||||
$(INSTALL_DIR) $(1)/usr/include
|
||||
$(INSTALL_DIR) $(1)/usr/lib
|
||||
$(CP) $(PKG_BUILD_DIR)/ethernet.h $(1)/usr/include/
|
||||
$(CP) $(PKG_BUILD_DIR)/libethernet.so $(1)/usr/lib/
|
||||
endef
|
||||
|
||||
define Build/InstallDev
|
||||
$(call Build/InstallDev/libethernet,$(1),$(2))
|
||||
endef
|
||||
|
||||
define Package/libethernet/install
|
||||
$(INSTALL_DIR) $(1)/usr/lib
|
||||
$(CP) $(PKG_BUILD_DIR)/libethernet.so* $(1)/usr/lib/
|
||||
endef
|
||||
|
||||
$(eval $(call BuildPackage,libethernet))
|
||||
52
libpicoevent-bcm/Makefile
Normal file
52
libpicoevent-bcm/Makefile
Normal file
@@ -0,0 +1,52 @@
|
||||
#
|
||||
# Copyright (C) 2006-2010 OpenWrt.org
|
||||
#
|
||||
# This is free software, licensed under the GNU General Public License v2.
|
||||
# See /LICENSE for more information.
|
||||
#
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_RELEASE:=1
|
||||
PKG_VERSION:=0.3
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/libpicoevent.git
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_VERSION:=f446f186102539cceedaa15a95a33547ac3c1fd7
|
||||
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.gz
|
||||
PKG_MIRROR_HASH:=skip
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
define Package/libpicoevent-bcm
|
||||
CATEGORY:=Libraries
|
||||
TITLE:=Libpicoevent-bcm
|
||||
URL:=
|
||||
DEPENDS:= +TARGET_brcmbca:bcmkernel
|
||||
include $(TOPDIR)/feeds/broadcom/bcmkernel/bcm-toolchain.mk
|
||||
TARGET_CFLAGS := -Os -pipe -mfpu=vfpv3-d16 -mfloat-abi=softfp -DCONFIG_TARGET_brcmbca -g3 -fno-caller-saves -fno-plt -Wno-error=unused-but-set-variable -Wno-error=unused-result \
|
||||
-mfloat-abi=soft -fmacro-prefix-map=$(BUILD_DIR)libpicoevent-bcm-0.3=libpicoevent-bcm-0.3 -Wformat -Werror=format-security -fstack-protector -D_FORTIFY_SOURCE=1 \
|
||||
-Wl,-z,now -Wl,-z,relro -Wl,--build-i
|
||||
endef
|
||||
|
||||
define Package/libpicoevent-bcm/description
|
||||
Minimal event library
|
||||
endef
|
||||
|
||||
define Package/libpicoevent-bcm/install
|
||||
$(INSTALL_DIR) $(1)/usr/lib
|
||||
$(INSTALL_DIR) $(STAGING_DIR)/usr/lib
|
||||
$(INSTALL_DIR) $(STAGING_DIR)/usr/lib/broadcom
|
||||
$(INSTALL_DIR) $(STAGING_DIR)/usr/include
|
||||
$(INSTALL_DIR) $(STAGING_DIR)/usr/include/bcm963xx
|
||||
$(CP) $(PKG_BUILD_DIR)/libpicoevent.h $(STAGING_DIR)/usr/include/bcm963xx
|
||||
mkdir -p $(1)/usr/lib/broadcom
|
||||
$(CP) $(PKG_BUILD_DIR)/libpicoevent.so $(STAGING_DIR)/usr/lib/broadcom
|
||||
$(INSTALL_DATA) $(PKG_BUILD_DIR)/libpicoevent.so $(1)/usr/lib/broadcom
|
||||
endef
|
||||
|
||||
$(eval $(call BuildPackage,libpicoevent-bcm))
|
||||
105
libqos/Makefile
Normal file
105
libqos/Makefile
Normal file
@@ -0,0 +1,105 @@
|
||||
#
|
||||
# Copyright (C) 2020-2023 Iopsys
|
||||
#
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=libqos
|
||||
PKG_VERSION:=7.2.100
|
||||
|
||||
LOCAL_DEV=0
|
||||
ifneq ($(LOCAL_DEV),1)
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_VERSION:=3a37af002fee1c0d35da49cefee2d24ee92a5d0a
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/libqos.git
|
||||
PKG_MAINTAINER:=Anjan Chanda <anjan.chanda@iopsys.eu>
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)_$(PKG_SOURCE_VERSION).tar.xz
|
||||
PKG_MIRROR_HASH:=skip
|
||||
endif
|
||||
|
||||
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
|
||||
PKG_LICENSE:=LGPL-2.1-only
|
||||
PKG_LICENSE_FILES:=LICENSE
|
||||
PKG_BUILD_DEPENDS:=+TARGET_brcmbca:bcmkernel
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
ifeq ($(CONFIG_TARGET_brcmbca),y)
|
||||
TARGET_PLATFORM=BROADCOM
|
||||
CHIP_ID=$(patsubst "%",%,$(CONFIG_BCM_CHIP_ID))
|
||||
TARGET_CFLAGS +=-DIOPSYS_BROADCOM -DCHIP_$(CHIP_ID) -DCONFIG_BCM9$(CHIP_ID) \
|
||||
-I$(STAGING_DIR)/usr/include/bcm963xx/bcmdrivers/opensource/include/bcm963xx \
|
||||
-I$(STAGING_DIR)/usr/include/bcm963xx/userspace/public/include
|
||||
else ifeq ($(CONFIG_TARGET_iopsys_x86),y)
|
||||
TARGET_PLATFORM=TEST
|
||||
TARGET_CFLAGS +=-DIOPSYS_TEST
|
||||
else ifeq ($(CONFIG_TARGET_iopsys_armvirt),y)
|
||||
TARGET_PLATFORM=TEST
|
||||
TARGET_CFLAGS +=-DIOPSYS_TEST
|
||||
else ifeq ($(CONFIG_TARGET_airoha),y)
|
||||
TARGET_PLATFORM=ECONET
|
||||
TARGET_CFLAGS +=-DIOPSYS_ECONET
|
||||
else ifeq ($(CONFIG_TARGET_ipq95xx),y)
|
||||
TARGET_PLATFORM=IPQ95XX
|
||||
TARGET_CFLAGS +=-DIPQ95XX
|
||||
else ifeq ($(CONFIG_TARGET_iopsys_mediatek),y)
|
||||
TARGET_PLATFORM=LINUX
|
||||
TARGET_CFLAGS +=-DIOPSYS_LINUX
|
||||
else
|
||||
$(info Unexpected CONFIG_TARGET, use default LINUX)
|
||||
TARGET_PLATFORM=LINUX
|
||||
TARGET_CFLAGS +=-DIOPSYS_LINUX
|
||||
endif
|
||||
|
||||
TARGET_CFLAGS += \
|
||||
-I$(STAGING_DIR)/usr/include \
|
||||
-I$(STAGING_DIR)/usr/include/openssl \
|
||||
-I$(STAGING_DIR)/usr/include/libnl3
|
||||
|
||||
MAKE_FLAGS += \
|
||||
CFLAGS="$(TARGET_CFLAGS) -Wall -I./" \
|
||||
LDFLAGS="$(TARGET_LDFLAGS)" \
|
||||
FPIC="$(FPIC)" \
|
||||
PLATFORM="$(TARGET_PLATFORM)" \
|
||||
subdirs="$(subdirs)"
|
||||
|
||||
define Package/libqos
|
||||
SECTION:=libs
|
||||
CATEGORY:=Libraries
|
||||
SUBMENU:=IOPSYS HAL libs
|
||||
MENU:=1
|
||||
TITLE:= QoS library (libqos)
|
||||
DEPENDS+=+libnl +libnl-route +libeasy
|
||||
endef
|
||||
|
||||
define Package/libqos/config
|
||||
config LIBQOS_DEBUG
|
||||
depends on PACKAGE_libqos
|
||||
bool "Enable qos debugging"
|
||||
default n
|
||||
|
||||
endef
|
||||
|
||||
ifeq ($(LOCAL_DEV),1)
|
||||
define Build/Prepare
|
||||
$(CP) -rf ./libqos/* $(PKG_BUILD_DIR)/
|
||||
endef
|
||||
endif
|
||||
|
||||
define Build/InstallDev/libqos
|
||||
$(INSTALL_DIR) $(1)/usr/include
|
||||
$(INSTALL_DIR) $(1)/usr/lib
|
||||
$(CP) $(PKG_BUILD_DIR)/include/qos.h $(1)/usr/include/
|
||||
$(CP) $(PKG_BUILD_DIR)/libqos.so $(1)/usr/lib/
|
||||
endef
|
||||
|
||||
define Build/InstallDev
|
||||
$(call Build/InstallDev/libqos,$(1),$(2))
|
||||
endef
|
||||
|
||||
define Package/libqos/install
|
||||
$(INSTALL_DIR) $(1)/usr/lib
|
||||
$(CP) $(PKG_BUILD_DIR)/libqos*.so* $(1)/usr/lib/
|
||||
endef
|
||||
|
||||
$(eval $(call BuildPackage,libqos))
|
||||
@@ -7,7 +7,8 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=libvoice-airoha
|
||||
PKG_VERSION:=0.1
|
||||
PKG_RELEASE:=1
|
||||
PKG_VERSION:=1.0.0
|
||||
PKG_LICENSE:=PROPRIETARY
|
||||
PKG_LICENSE_FILES:=LICENSE
|
||||
|
||||
@@ -16,7 +17,7 @@ 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:=9133eacf5665dc01fa58d819bcc96f0a97ebd63c
|
||||
PKG_SOURCE_VERSION:=2a6ef141747ad0f7b32a536b5b5bd174834a7af5
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
|
||||
PKG_MIRROR_HASH:=skip
|
||||
endif
|
||||
@@ -49,9 +50,7 @@ endef
|
||||
endif
|
||||
|
||||
define Package/$(PKG_NAME)/install
|
||||
# Although there is nothing needs to be installed, but the install section must NOT be empty. Otherwise the package will be skipped as below.
|
||||
# WARNING: skipping libvoice-airoha -- package has no install section
|
||||
$(INSTALL_DIR) $(1)/usr/lib
|
||||
$(CP) ./files/* $(1)/
|
||||
endef
|
||||
|
||||
$(eval $(call BuildPackage,$(PKG_NAME)))
|
||||
|
||||
59
libvoice-airoha/files/lib/voice/codecs.json
Normal file
59
libvoice-airoha/files/lib/voice/codecs.json
Normal file
@@ -0,0 +1,59 @@
|
||||
{
|
||||
"ulaw": {
|
||||
"name": "G.711MuLaw",
|
||||
"ptime_min": 10,
|
||||
"ptime_max": 30,
|
||||
"ptime_default": 20,
|
||||
"ptime_increment": 10,
|
||||
"bitrate": 64
|
||||
},
|
||||
"alaw": {
|
||||
"name": "G.711ALaw",
|
||||
"ptime_min": 10,
|
||||
"ptime_max": 30,
|
||||
"ptime_default": 20,
|
||||
"ptime_increment": 10,
|
||||
"bitrate": 64
|
||||
},
|
||||
"g726": {
|
||||
"name": "G.726",
|
||||
"ptime_min": 10,
|
||||
"ptime_max": 30,
|
||||
"ptime_default": 20,
|
||||
"ptime_increment": 10,
|
||||
"bitrate": 16
|
||||
},
|
||||
"g723": {
|
||||
"name": "G.723.1",
|
||||
"ptime_min": 10,
|
||||
"ptime_max": 30,
|
||||
"ptime_default": 30,
|
||||
"ptime_increment": 30,
|
||||
"bitrate": 5.3
|
||||
},
|
||||
"g729": {
|
||||
"name": "G.729",
|
||||
"ptime_min": 10,
|
||||
"ptime_max": 30,
|
||||
"ptime_default": 20,
|
||||
"ptime_increment": 10,
|
||||
"bitrate": 8
|
||||
},
|
||||
"ilbc": {
|
||||
"name": "iLBC",
|
||||
"ptime_min": 10,
|
||||
"ptime_max": 30,
|
||||
"ptime_default": 20,
|
||||
"ptime_increment": 30,
|
||||
"bitrate": 15.2
|
||||
},
|
||||
"gsm": {
|
||||
"name": "GSM-AMR",
|
||||
"ptime_min": 10,
|
||||
"ptime_max": 30,
|
||||
"ptime_default": 20,
|
||||
"ptime_increment": 20,
|
||||
"bitrate": 12.2
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,7 +7,8 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=libvoice-broadcom
|
||||
PKG_VERSION:=0.1
|
||||
PKG_RELEASE:=1
|
||||
PKG_VERSION:=1.0.0
|
||||
PKG_LICENSE:=PROPRIETARY
|
||||
PKG_LICENSE_FILES:=LICENSE
|
||||
|
||||
@@ -16,7 +17,7 @@ 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:=415e36c4007040f723b164dee79a1719d9c77f0a
|
||||
PKG_SOURCE_VERSION:=401a392a72e2933f527eb92466faaf2907c38730
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
|
||||
PKG_MIRROR_HASH:=skip
|
||||
endif
|
||||
@@ -27,7 +28,6 @@ PKG_CONFIG_DEPENDS:=CONFIG_TARGET_BOARD
|
||||
|
||||
LIBVOICE_PKG_BUILD_DIR := $(PKG_BUILD_DIR)
|
||||
|
||||
export BCM_VOICEMNGR_WORKAROUND=y
|
||||
export CONFIG_BCM_CHIP_ID
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
@@ -52,9 +52,7 @@ endef
|
||||
endif
|
||||
|
||||
define Package/$(PKG_NAME)/install
|
||||
# Although there is nothing needs to be installed, but the install section must NOT be empty. Otherwise the package will be skipped as below.
|
||||
# WARNING: skipping libvoice-broadcom -- package has no install section
|
||||
$(INSTALL_DIR) $(1)/usr/lib
|
||||
$(CP) ./files/* $(1)/
|
||||
endef
|
||||
|
||||
$(eval $(call BuildPackage,$(PKG_NAME)))
|
||||
|
||||
59
libvoice-broadcom/files/lib/voice/codecs.json
Normal file
59
libvoice-broadcom/files/lib/voice/codecs.json
Normal file
@@ -0,0 +1,59 @@
|
||||
{
|
||||
"ulaw": {
|
||||
"name": "G.711MuLaw",
|
||||
"ptime_min": 10,
|
||||
"ptime_max": 30,
|
||||
"ptime_default": 20,
|
||||
"ptime_increment": 10,
|
||||
"bitrate": 64
|
||||
},
|
||||
"alaw": {
|
||||
"name": "G.711ALaw",
|
||||
"ptime_min": 10,
|
||||
"ptime_max": 30,
|
||||
"ptime_default": 20,
|
||||
"ptime_increment": 10,
|
||||
"bitrate": 64
|
||||
},
|
||||
"g726": {
|
||||
"name": "G.726",
|
||||
"ptime_min": 10,
|
||||
"ptime_max": 30,
|
||||
"ptime_default": 20,
|
||||
"ptime_increment": 10,
|
||||
"bitrate": 16
|
||||
},
|
||||
"g723": {
|
||||
"name": "G.723.1",
|
||||
"ptime_min": 10,
|
||||
"ptime_max": 30,
|
||||
"ptime_default": 30,
|
||||
"ptime_increment": 30,
|
||||
"bitrate": 5.3
|
||||
},
|
||||
"g729": {
|
||||
"name": "G.729",
|
||||
"ptime_min": 10,
|
||||
"ptime_max": 30,
|
||||
"ptime_default": 20,
|
||||
"ptime_increment": 10,
|
||||
"bitrate": 8
|
||||
},
|
||||
"ilbc": {
|
||||
"name": "iLBC",
|
||||
"ptime_min": 10,
|
||||
"ptime_max": 30,
|
||||
"ptime_default": 20,
|
||||
"ptime_increment": 30,
|
||||
"bitrate": 15.2
|
||||
},
|
||||
"gsm": {
|
||||
"name": "GSM-AMR",
|
||||
"ptime_min": 10,
|
||||
"ptime_max": 30,
|
||||
"ptime_default": 20,
|
||||
"ptime_increment": 20,
|
||||
"bitrate": 12.2
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,7 +7,8 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=libvoice-d2
|
||||
PKG_VERSION:=0.1
|
||||
PKG_RELEASE:=1
|
||||
PKG_VERSION:=1.0.2
|
||||
PKG_LICENSE:=PROPRIETARY
|
||||
PKG_LICENSE_FILES:=LICENSE
|
||||
|
||||
@@ -16,7 +17,7 @@ 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:=abedc475cac1a21ad434dbf2131eb42aa495744d
|
||||
PKG_SOURCE_VERSION:=7ca102e62fa439a7188f2c5e4c72e3fcfd3fb28a
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
|
||||
PKG_MIRROR_HASH:=skip
|
||||
endif
|
||||
@@ -25,17 +26,17 @@ endif
|
||||
# indirectly. This ensures that the package is rebuilt on config-changes.
|
||||
PKG_CONFIG_DEPENDS:=CONFIG_TARGET_BOARD
|
||||
|
||||
LIBVOICE_PKG_BUILD_DIR := $(PKG_BUILD_DIR)
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
export D2_VTSP_PLATFORM := $(shell echo $(CONFIG_D2_VTSP_PLATFORM))
|
||||
|
||||
TARGET_CFLAGS += -Wall -Werror
|
||||
|
||||
define Package/$(PKG_NAME)
|
||||
CATEGORY:=Utilities
|
||||
TITLE:=IOPSYS libvoice for D2 which is software DSP
|
||||
URL:=
|
||||
DEPENDS:=
|
||||
DEPENDS:=+d2-voice
|
||||
endef
|
||||
|
||||
define Package/$(PKG_NAME)/description
|
||||
@@ -49,9 +50,7 @@ endef
|
||||
endif
|
||||
|
||||
define Package/$(PKG_NAME)/install
|
||||
# Although there is nothing needs to be installed, but the install section must NOT be empty. Otherwise the package will be skipped as below.
|
||||
# WARNING: skipping libvoice-d2 -- package has no install section
|
||||
$(INSTALL_DIR) $(1)/usr/lib
|
||||
$(CP) ./files/* $(1)/
|
||||
endef
|
||||
|
||||
$(eval $(call BuildPackage,$(PKG_NAME)))
|
||||
|
||||
42
libvoice-d2/files/lib/voice/codecs.json
Normal file
42
libvoice-d2/files/lib/voice/codecs.json
Normal file
@@ -0,0 +1,42 @@
|
||||
{
|
||||
"ulaw": {
|
||||
"name": "G.711MuLaw",
|
||||
"ptime_min": 10,
|
||||
"ptime_max": 40,
|
||||
"ptime_default": 20,
|
||||
"ptime_increment": 10,
|
||||
"bitrate": 64
|
||||
},
|
||||
"alaw": {
|
||||
"name": "G.711ALaw",
|
||||
"ptime_min": 10,
|
||||
"ptime_max": 40,
|
||||
"ptime_default": 20,
|
||||
"ptime_increment": 10,
|
||||
"bitrate": 64
|
||||
},
|
||||
"g729a": {
|
||||
"name": "G.729a",
|
||||
"ptime_min": 10,
|
||||
"ptime_max": 40,
|
||||
"ptime_default": 20,
|
||||
"ptime_increment": 10,
|
||||
"bitrate": 64
|
||||
},
|
||||
"g729": {
|
||||
"name": "G.729",
|
||||
"ptime_min": 10,
|
||||
"ptime_max": 40,
|
||||
"ptime_default": 20,
|
||||
"ptime_increment": 10,
|
||||
"bitrate": 8
|
||||
},
|
||||
"g722": {
|
||||
"name": "G.722",
|
||||
"ptime_min": 10,
|
||||
"ptime_max": 40,
|
||||
"ptime_default": 20,
|
||||
"ptime_increment": 10,
|
||||
"bitrate": 56
|
||||
}
|
||||
}
|
||||
162
libwifi/Makefile
Normal file
162
libwifi/Makefile
Normal file
@@ -0,0 +1,162 @@
|
||||
#
|
||||
# Copyright (C) 2020-2023 Iopsys
|
||||
#
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=libwifi
|
||||
PKG_VERSION:=7.2.100
|
||||
|
||||
LOCAL_DEV=0
|
||||
ifneq ($(LOCAL_DEV),1)
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_VERSION:=d6e14d7a0b747ca09d3f6843cea9ae3584d18dd3
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/libwifi.git
|
||||
PKG_MAINTAINER:=Anjan Chanda <anjan.chanda@iopsys.eu>
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)_$(PKG_SOURCE_VERSION).tar.xz
|
||||
PKG_MIRROR_HASH:=skip
|
||||
endif
|
||||
|
||||
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
|
||||
PKG_LICENSE:=LGPL-2.1-only
|
||||
PKG_LICENSE_FILES:=LICENSE
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
ifeq ($(CONFIG_TARGET_brcmbca),y)
|
||||
TARGET_PLATFORM=BROADCOM
|
||||
TARGET_WIFI_TYPE=BROADCOM
|
||||
CHIP_ID=$(patsubst "%",%,$(CONFIG_BCM_CHIP_ID))
|
||||
TARGET_CFLAGS +=-DIOPSYS_BROADCOM -DCHIP_$(CHIP_ID) -DCONFIG_BCM9$(CHIP_ID) \
|
||||
-I$(STAGING_DIR)/usr/include/bcm963xx/bcmdrivers/opensource/include/bcm963xx \
|
||||
-I$(STAGING_DIR)/usr/include/bcm963xx/userspace/public/include
|
||||
else ifeq ($(CONFIG_TARGET_iopsys_x86),y)
|
||||
TARGET_PLATFORM=TEST
|
||||
TARGET_WIFI_TYPE=TEST
|
||||
TARGET_CFLAGS +=-DIOPSYS_TEST
|
||||
else ifeq ($(CONFIG_TARGET_iopsys_armvirt),y)
|
||||
TARGET_PLATFORM=TEST
|
||||
TARGET_WIFI_TYPE=TEST
|
||||
TARGET_CFLAGS +=-DIOPSYS_TEST
|
||||
else ifeq ($(CONFIG_TARGET_airoha),y)
|
||||
TARGET_PLATFORM=ECONET
|
||||
TARGET_WIFI_TYPE=MEDIATEK MAC80211
|
||||
TARGET_CFLAGS +=-DIOPSYS_ECONET
|
||||
else ifeq ($(CONFIG_TARGET_ipq95xx),y)
|
||||
TARGET_PLATFORM=IPQ95XX
|
||||
TARGET_WIFI_TYPE=MAC80211
|
||||
TARGET_CFLAGS +=-DIPQ95XX
|
||||
else ifeq ($(CONFIG_TARGET_iopsys_mediatek),y)
|
||||
TARGET_PLATFORM=LINUX
|
||||
TARGET_WIFI_TYPE=MAC80211
|
||||
TARGET_CFLAGS +=-DIOPSYS_LINUX
|
||||
else
|
||||
$(info Unexpected CONFIG_TARGET, use default MAC80211)
|
||||
TARGET_PLATFORM=MAC80211
|
||||
TARGET_WIFI_TYPE=MAC80211
|
||||
TARGET_CFLAGS +=-DIOPSYS_MAC80211
|
||||
endif
|
||||
|
||||
ifneq ($(CONFIG_PACKAGE_libwifi),)
|
||||
TARGET_CFLAGS +=-DHAS_WIFI
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_LIBWIFI_USE_CTRL_IFACE),y)
|
||||
TARGET_CFLAGS +=-DLIBWIFI_USE_CTRL_IFACE
|
||||
endif
|
||||
|
||||
TARGET_CFLAGS += \
|
||||
-I$(STAGING_DIR)/usr/include \
|
||||
-I$(STAGING_DIR)/usr/include/openssl \
|
||||
-I$(STAGING_DIR)/usr/include/libnl3
|
||||
|
||||
MAKE_FLAGS += \
|
||||
CFLAGS="$(TARGET_CFLAGS) -Wall -I./" \
|
||||
LDFLAGS="$(TARGET_LDFLAGS)" \
|
||||
FPIC="$(FPIC)" \
|
||||
PLATFORM="$(TARGET_PLATFORM)" \
|
||||
WIFI_TYPE="$(TARGET_WIFI_TYPE)" \
|
||||
subdirs="$(subdirs)"
|
||||
|
||||
ifeq ($(LOCAL_DEV),1)
|
||||
define Build/Prepare
|
||||
rsync -r --exclude=.* ~/git/libwifi/ $(PKG_BUILD_DIR)/
|
||||
endef
|
||||
endif
|
||||
|
||||
define Package/libwifi-common
|
||||
SECTION:=libs
|
||||
CATEGORY:=Libraries
|
||||
TITLE:=libwifi
|
||||
SUBMENU:=IOPSYS HAL libs
|
||||
DEPENDS:=+libopenssl
|
||||
MENU:=1
|
||||
endef
|
||||
|
||||
define Package/libwifi/description
|
||||
Library provides WiFi HAL APIs and WiFi common utility functions
|
||||
endef
|
||||
|
||||
define Package/libwifiutils
|
||||
$(call Package/libwifi-common)
|
||||
TITLE:= WiFi utility library (libwifiutils.so)
|
||||
DEPENDS+=+libnl +libnl-route +libeasy
|
||||
endef
|
||||
|
||||
define Build/InstallDev/libwifiutils
|
||||
$(INSTALL_DIR) $(1)/usr/include
|
||||
$(INSTALL_DIR) $(1)/usr/lib
|
||||
$(CP) $(PKG_BUILD_DIR)/wifidefs.h $(1)/usr/include/
|
||||
$(CP) $(PKG_BUILD_DIR)/wifiutils.h $(1)/usr/include/
|
||||
$(CP) $(PKG_BUILD_DIR)/libwifiutils*.so* $(1)/usr/lib/
|
||||
endef
|
||||
|
||||
define Package/libwifiutils/install
|
||||
$(INSTALL_DIR) $(1)/usr/lib
|
||||
$(CP) $(PKG_BUILD_DIR)/libwifiutils*.so* $(1)/usr/lib/
|
||||
endef
|
||||
|
||||
|
||||
define Package/libwifi
|
||||
$(call Package/libwifi-common)
|
||||
TITLE:= WiFi library (libwifi)
|
||||
DEPENDS+=+libnl +libnl-route +libeasy +libwifiutils +TARGET_brcmbca:bcmkernel
|
||||
endef
|
||||
|
||||
define Package/libwifi/config
|
||||
if PACKAGE_libwifi
|
||||
config LIBWIFI_DEBUG
|
||||
depends on PACKAGE_libwifi
|
||||
bool "Enable debugging in libwifi"
|
||||
default n
|
||||
|
||||
config LIBWIFI_USE_CTRL_IFACE
|
||||
bool "Create UNIX sockets to interface with hostapd/wpa_supplicant"
|
||||
default n
|
||||
endif
|
||||
endef
|
||||
|
||||
|
||||
define Build/InstallDev/libwifi
|
||||
$(INSTALL_DIR) $(1)/usr/include
|
||||
$(INSTALL_DIR) $(1)/usr/lib
|
||||
$(CP) $(PKG_BUILD_DIR)/wifiops.h $(1)/usr/include/
|
||||
$(CP) $(PKG_BUILD_DIR)/wifi.h $(1)/usr/include/
|
||||
$(CP) $(PKG_BUILD_DIR)/libwifi-7*.so* $(1)/usr/lib/
|
||||
endef
|
||||
|
||||
|
||||
define Build/InstallDev
|
||||
$(call Build/InstallDev/libwifiutils,$(1),$(2))
|
||||
ifneq ($(CONFIG_PACKAGE_libwifi),)
|
||||
$(call Build/InstallDev/libwifi,$(1),$(2))
|
||||
endif
|
||||
endef
|
||||
|
||||
define Package/libwifi/install
|
||||
$(INSTALL_DIR) $(1)/usr/lib
|
||||
$(CP) $(PKG_BUILD_DIR)/libwifi-7*.so* $(1)/usr/lib/
|
||||
endef
|
||||
|
||||
$(eval $(call BuildPackage,libwifiutils))
|
||||
$(eval $(call BuildPackage,libwifi))
|
||||
@@ -20,10 +20,6 @@ start_service() {
|
||||
fi
|
||||
}
|
||||
|
||||
stop() {
|
||||
service_stop /sbin/loop-detector
|
||||
}
|
||||
|
||||
service_triggers()
|
||||
{
|
||||
procd_add_reload_trigger loop_detection
|
||||
@@ -33,4 +29,3 @@ reload_service() {
|
||||
stop
|
||||
start
|
||||
}
|
||||
|
||||
|
||||
@@ -5,9 +5,9 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=map-agent
|
||||
PKG_VERSION:=4.2.0.4
|
||||
PKG_VERSION:=4.3.1.1
|
||||
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
|
||||
PKG_SOURCE_VERSION:=57a01fc4c8846486960a53d4ca808617520a051c
|
||||
PKG_SOURCE_VERSION:=a6c5d7cbbc6363e123cfacc9333e5ae507f6dcd7
|
||||
PKG_MAINTAINER:=Anjan Chanda <anjan.chanda@iopsys.eu>
|
||||
|
||||
PKG_LICENSE:=BSD-3-Clause
|
||||
@@ -16,7 +16,7 @@ PKG_LICENSE_FILES:=LICENSE
|
||||
LOCAL_DEV=0
|
||||
ifneq ($(LOCAL_DEV),1)
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/map-agent
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/multi-ap/map-agent
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)_$(PKG_SOURCE_VERSION).tar.xz
|
||||
PKG_MIRROR_HASH:=skip
|
||||
endif
|
||||
|
||||
@@ -5,14 +5,14 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=map-controller
|
||||
PKG_VERSION:=4.2.0.2
|
||||
PKG_VERSION:=4.3.0.3
|
||||
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
|
||||
PKG_SOURCE_VERSION:=47e0c27b8a4f08e1dbebab98c3c3aa72dae22dd0
|
||||
PKG_SOURCE_VERSION:=fb600940ac54456bcde650ccee7055f7c9bb785b
|
||||
|
||||
LOCAL_DEV=0
|
||||
ifneq ($(LOCAL_DEV),1)
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/map-controller
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/multi-ap/map-controller
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)_$(PKG_SOURCE_VERSION).tar.xz
|
||||
PKG_MIRROR_HASH:=skip
|
||||
endif
|
||||
|
||||
@@ -6,13 +6,13 @@ include $(TOPDIR)/rules.mk
|
||||
include $(INCLUDE_DIR)/kernel.mk
|
||||
|
||||
PKG_NAME:=map-topology
|
||||
PKG_VERSION:=2.5.1.17
|
||||
PKG_VERSION:=2.5.1.19
|
||||
|
||||
LOCAL_DEV:=0
|
||||
ifneq ($(LOCAL_DEV),1)
|
||||
PKG_SOURCE_VERSION:=7683a1b6a08996f07de573c67a33ad143dffeaa8
|
||||
PKG_SOURCE_VERSION:=7b2f5dc086207dd74c5c56421dea65b7dabb6944
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/map-topology.git
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/multi-ap/map-topology.git
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.xz
|
||||
PKG_MIRROR_HASH:=skip
|
||||
endif
|
||||
|
||||
@@ -51,10 +51,6 @@ boot() {
|
||||
start
|
||||
}
|
||||
|
||||
stop_service() {
|
||||
service_stop "${PROG_EXE}"
|
||||
}
|
||||
|
||||
reload_service() {
|
||||
stop
|
||||
start
|
||||
|
||||
@@ -20,9 +20,31 @@ generate_igmp_global_params(){
|
||||
uci commit mcast
|
||||
}
|
||||
|
||||
generate_mcast_config(){
|
||||
generate_mld_proxy_config(){
|
||||
local u_itf="$1"
|
||||
|
||||
up_itf="$(uci -q get network.wan.device)"
|
||||
uci add mcast proxy
|
||||
uci rename mcast.@proxy[-1]="mc_proxy_MLD"
|
||||
uci set mcast.@proxy[-1].enable="1"
|
||||
uci set mcast.@proxy[-1].proto="mld"
|
||||
uci set mcast.@proxy[-1].version="2"
|
||||
uci set mcast.@proxy[-1].robustness="2"
|
||||
uci set mcast.@proxy[-1].query_interval="125"
|
||||
uci set mcast.@proxy[-1].query_response_interval="100"
|
||||
uci set mcast.@proxy[-1].last_member_query_interval="10"
|
||||
uci set mcast.@proxy[-1].fast_leave="1"
|
||||
uci set mcast.@proxy[-1].snooping_mode="2"
|
||||
uci add_list mcast.@proxy[-1].downstream_interface="br-lan"
|
||||
|
||||
IFS=" "
|
||||
for itf in $u_itf; do
|
||||
uci add_list mcast.@proxy[-1].upstream_interface="$itf"
|
||||
done
|
||||
|
||||
}
|
||||
|
||||
generate_igmp_proxy_config(){
|
||||
local u_itf="$1"
|
||||
|
||||
uci add mcast proxy
|
||||
uci rename mcast.@proxy[-1]="igmp_proxy_1"
|
||||
@@ -38,46 +60,56 @@ generate_mcast_config(){
|
||||
uci add_list mcast.@proxy[-1].downstream_interface="br-lan"
|
||||
|
||||
IFS=" "
|
||||
for itf in $up_itf; do
|
||||
for itf in $u_itf; do
|
||||
uci add_list mcast.@proxy[-1].upstream_interface="$itf"
|
||||
done
|
||||
|
||||
uci add_list mcast.@proxy[-1].filter="239.0.0.0/8"
|
||||
}
|
||||
|
||||
generate_mcast_config(){
|
||||
|
||||
uci add mcast proxy
|
||||
uci rename mcast.@proxy[-1]="mc_proxy_MLD"
|
||||
uci set mcast.@proxy[-1].enable="1"
|
||||
uci set mcast.@proxy[-1].proto="mld"
|
||||
uci set mcast.@proxy[-1].version="1"
|
||||
uci set mcast.@proxy[-1].robustness="2"
|
||||
uci set mcast.@proxy[-1].query_interval="125"
|
||||
uci set mcast.@proxy[-1].query_response_interval="100"
|
||||
uci set mcast.@proxy[-1].last_member_query_interval="10"
|
||||
uci set mcast.@proxy[-1].fast_leave="1"
|
||||
uci set mcast.@proxy[-1].snooping_mode="2"
|
||||
uci add_list mcast.@proxy[-1].downstream_interface="br-lan"
|
||||
|
||||
IFS=" "
|
||||
for itf in $up_itf; do
|
||||
uci add_list mcast.@proxy[-1].upstream_interface="$itf"
|
||||
done
|
||||
up_itf="$(uci -q get network.wan.device)"
|
||||
|
||||
generate_igmp_proxy_config "$up_itf"
|
||||
generate_mld_proxy_config "$up_itf"
|
||||
|
||||
uci commit mcast
|
||||
}
|
||||
|
||||
interfaces_ok(){
|
||||
local section_name=$1
|
||||
|
||||
local up_interf=$(uci -q get ${section_name}.upstream_interface)
|
||||
[ -z "$up_interf" ] && return 1
|
||||
|
||||
local down_interf=$(uci -q get ${section_name}.downstream_interface)
|
||||
[ -z "$down_interf" ] && return 1
|
||||
|
||||
# check if upstream untagged
|
||||
IFS=" "
|
||||
for itf in $up_interf; do
|
||||
# check if there exist a device section for this upstream interface, if yes the
|
||||
# do nothing, if no then split the it at . and use the native interface as
|
||||
# upstream interface
|
||||
dev_section=$(ubus call uci get '{"config":"network", "type":"device", "match":{"name":"'"$itf"'"}}' | jsonfilter -e @.values | jq keys[])
|
||||
|
||||
# mcast config is outdated, simply generate as per new logic
|
||||
[ -z "$dev_section" ] && return 1
|
||||
done
|
||||
}
|
||||
|
||||
|
||||
if [ -s "/etc/config/mcast" ]; then
|
||||
if uci -q get mcast.@proxy[0] >/dev/null; then
|
||||
# return if there is any valid content
|
||||
exit
|
||||
interfaces_ok "mcast.@proxy[0]" && exit
|
||||
elif uci -q get mcast.@snooping[0] >/dev/null; then
|
||||
# return if there is any valid content
|
||||
exit
|
||||
else
|
||||
rm -f /etc/config/mcast
|
||||
fi
|
||||
fi
|
||||
|
||||
rm -f /etc/config/mcast
|
||||
touch /etc/config/mcast
|
||||
|
||||
generate_igmp_global_params
|
||||
|
||||
@@ -5,13 +5,13 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=obuspa
|
||||
PKG_VERSION:=7.0.0.7
|
||||
PKG_VERSION:=7.0.2.4
|
||||
|
||||
LOCAL_DEV:=0
|
||||
ifneq ($(LOCAL_DEV),1)
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/fork/obuspa.git
|
||||
PKG_SOURCE_VERSION:=0a2a3481dddea672a2b12d1fcaa689d7fa761fe3
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/bbf/obuspa.git
|
||||
PKG_SOURCE_VERSION:=902d7a9586c3faa16337fef71f538daa878a47b8
|
||||
PKG_MAINTAINER:=Vivek Dutta <vivek.dutta@iopsys.eu>
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
|
||||
PKG_MIRROR_HASH:=skip
|
||||
@@ -110,7 +110,6 @@ define Package/obuspa/install
|
||||
$(INSTALL_DATA) ./files/etc/bbfdm/json/USPAgent.json $(1)/etc/bbfdm/json/USPAgent.json
|
||||
$(INSTALL_DATA) ./files/etc/bbfdm/json/TransferComplete.json $(1)/etc/bbfdm/json/TransferComplete.json
|
||||
$(INSTALL_BIN) ./files/etc/uci-defaults/01-fix-upgrade-uci $(1)/etc/uci-defaults/
|
||||
$(INSTALL_BIN) ./files/etc/uci-defaults/50-add-mqtt-usp-test $(1)/etc/uci-defaults/
|
||||
endef
|
||||
|
||||
$(eval $(call BuildPackage,obuspa))
|
||||
|
||||
@@ -10,23 +10,3 @@ config obuspa 'global'
|
||||
#option client_cert '/etc/obuspa/client.pem'
|
||||
#option log_dest '/var/log/obuspa'
|
||||
|
||||
# Adds Device.LocalAgent.MTP.
|
||||
config mtp 'test_mtp'
|
||||
option Protocol 'MQTT'
|
||||
option ResponseTopicConfigured '/usp/endpoint'
|
||||
option mqtt 'testmqtt'
|
||||
|
||||
# Adds Device.MQTT.Client.
|
||||
config mqtt 'testmqtt'
|
||||
option BrokerAddress '127.0.0.1'
|
||||
option BrokerPort '1883'
|
||||
option TransportProtocol 'TCP/IP'
|
||||
|
||||
# Adds Device.LocalAgent.Controller.
|
||||
config controller 'testcontroller'
|
||||
option EndpointID 'proto::interop-usp-controller'
|
||||
option Protocol 'MQTT'
|
||||
option Topic '/usp/controller'
|
||||
option mqtt 'testmqtt'
|
||||
option assigned_role_name 'full_access'
|
||||
|
||||
|
||||
@@ -300,56 +300,6 @@ validate_challenge_section()
|
||||
'LockoutPeriod:uinteger:0'
|
||||
}
|
||||
|
||||
get_oui_from_db()
|
||||
{
|
||||
db -q get device.deviceinfo.ManufacturerOUI
|
||||
}
|
||||
|
||||
get_serial_from_db()
|
||||
{
|
||||
db -q get device.deviceinfo.SerialNumber
|
||||
}
|
||||
|
||||
publish_endpoint()
|
||||
{
|
||||
local AgentEndpointID serial oui user pass
|
||||
|
||||
if ! uci -q get obuspa.testmqtt; then
|
||||
return 0;
|
||||
fi
|
||||
|
||||
# return if mosquitto_pub is not present
|
||||
if [ ! "$(command -v mosquitto_pub)" ]; then
|
||||
log "mosquitto_pub not present can't publish EndpointID"
|
||||
return 0;
|
||||
fi
|
||||
|
||||
# Get endpoint id from obuspa config first
|
||||
config_load obuspa
|
||||
config_get AgentEndpointID localagent EndpointID ""
|
||||
if [ -z "${AgentEndpointID}" ]; then
|
||||
serial=$(get_serial_from_db)
|
||||
oui=$(get_oui_from_db)
|
||||
AgentEndpointID="os::${oui}-${serial//+/%2B}"
|
||||
fi
|
||||
|
||||
config_get user testmqtt Username
|
||||
config_get pass testmqtt Password
|
||||
|
||||
# publish Agent's EndpointID in mosquito broker for discovery by usp-js
|
||||
# This is a work around till obuspa adds supports for mDNS discovery
|
||||
if [ -n "${user}" ] && [ -n "${pass}" ]; then
|
||||
log "Publishing EndpointID ${AgentEndpointID} to local mqtt broker with username, password"
|
||||
mosquitto_pub -r -t "obuspa/EndpointID" -m "${AgentEndpointID}" -u "${user}" -P "${pass}"
|
||||
elif [ -n "${user}" ]; then
|
||||
log "Publishing EndpointID ${AgentEndpointID} to local mqtt broker with username only"
|
||||
mosquitto_pub -r -t "obuspa/EndpointID" -m "${AgentEndpointID}" -u "${user}"
|
||||
else
|
||||
log "Publishing EndpointID ${AgentEndpointID} to local mqtt broker"
|
||||
mosquitto_pub -r -t "obuspa/EndpointID" -m "${AgentEndpointID}"
|
||||
fi
|
||||
}
|
||||
|
||||
configure_localagent()
|
||||
{
|
||||
local EndpointID
|
||||
@@ -1075,14 +1025,10 @@ register_service()
|
||||
"${respawn_threshold:-5}" \
|
||||
"${respawn_timeout:-10}" "${respawn_retry:-3}"
|
||||
|
||||
procd_set_param watch usp.raw
|
||||
procd_set_param watch bbfdm
|
||||
procd_close_instance
|
||||
}
|
||||
|
||||
service_running() {
|
||||
publish_endpoint
|
||||
}
|
||||
|
||||
start_service() {
|
||||
local enabled
|
||||
|
||||
@@ -1113,7 +1059,7 @@ service_triggers() {
|
||||
# Create a reload trigger if schema update avaialble
|
||||
procd_open_trigger
|
||||
json_add_array
|
||||
json_add_string "" "usp.raw"
|
||||
json_add_string "" "bbfdm"
|
||||
json_add_array
|
||||
json_add_string "" "if"
|
||||
json_add_array
|
||||
|
||||
@@ -1,14 +0,0 @@
|
||||
add_usp_test()
|
||||
{
|
||||
if ! uci_get mosquitto usptest >/dev/null 2>&1; then
|
||||
uci_add mosquitto listener usptest
|
||||
uci_set mosquitto usptest enabled 1
|
||||
uci_set mosquitto usptest port '9001'
|
||||
uci_set mosquitto usptest protocol 'websockets'
|
||||
uci_set mosquitto usptest require_certificates '0'
|
||||
uci_set mosquitto usptest auth_plugin '/usr/lib/mosquitto_auth_shadow.so'
|
||||
fi
|
||||
}
|
||||
|
||||
uci_load mosquitto
|
||||
add_usp_test
|
||||
372
obuspa/patches/0006-bdc_json_obj_hierarchy.patch
Normal file
372
obuspa/patches/0006-bdc_json_obj_hierarchy.patch
Normal file
@@ -0,0 +1,372 @@
|
||||
diff --git a/src/core/bdc_exec.c b/src/core/bdc_exec.c
|
||||
index 6b5c11d..3670361 100644
|
||||
--- a/src/core/bdc_exec.c
|
||||
+++ b/src/core/bdc_exec.c
|
||||
@@ -548,9 +548,14 @@ int StartSendingReport(bdc_connection_t *bc)
|
||||
// Set the list of headers
|
||||
bc->headers = NULL;
|
||||
bc->headers = curl_slist_append(bc->headers, "Content-Type: application/json; charset=UTF-8");
|
||||
- bc->headers = curl_slist_append(bc->headers, "BBF-Report-Format: NameValuePair");
|
||||
+ if (bc->flags & BDC_FLAG_HEADER_OBJ_HIER)
|
||||
+ bc->headers = curl_slist_append(bc->headers, "BBF-Report-Format: ObjectHierarchy");
|
||||
+ else
|
||||
+ bc->headers = curl_slist_append(bc->headers, "BBF-Report-Format: NameValuePair");
|
||||
+
|
||||
if (bc->flags & BDC_FLAG_GZIP)
|
||||
{
|
||||
+ curl_easy_setopt(curl_ctx, CURLOPT_ACCEPT_ENCODING, "gzip");
|
||||
bc->headers = curl_slist_append(bc->headers, "Content-Encoding: gzip");
|
||||
}
|
||||
|
||||
diff --git a/src/core/bdc_exec.h b/src/core/bdc_exec.h
|
||||
index c58c6d5..ff37a2d 100644
|
||||
--- a/src/core/bdc_exec.h
|
||||
+++ b/src/core/bdc_exec.h
|
||||
@@ -53,6 +53,6 @@ void BDC_EXEC_ScheduleExit(void);
|
||||
#define BDC_FLAG_PUT 0x00000001 // If set, HTTP PUT should be used instead of HTTP POST when sending the report to the BDC server
|
||||
#define BDC_FLAG_GZIP 0x00000002 // If set, the reports contants are Gzipped
|
||||
#define BDC_FLAG_DATE_HEADER 0x00000004 // If set, the date header should be included in the HTTP post.
|
||||
-
|
||||
+#define BDC_FLAG_HEADER_OBJ_HIER 0x00000008 // If set, report format in header would be ObjectHierarchy otherwise NameValuePair
|
||||
|
||||
#endif
|
||||
diff --git a/src/core/device_bulkdata.c b/src/core/device_bulkdata.c
|
||||
index 5b1aff2..a7d1b3e 100755
|
||||
--- a/src/core/device_bulkdata.c
|
||||
+++ b/src/core/device_bulkdata.c
|
||||
@@ -68,7 +68,8 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// Definitions for formats that we support
|
||||
#define BULKDATA_ENCODING_TYPE "JSON"
|
||||
-#define BULKDATA_JSON_REPORT_FORMAT "NameValuePair"
|
||||
+#define BULKDATA_JSON_REPORT_FORMAT_NAME_VALUE "NameValuePair"
|
||||
+#define BULKDATA_JSON_REPORT_FORMAT_OBJ_HIER "ObjectHierarchy"
|
||||
|
||||
|
||||
// Definitions for Device.BulkData.Profile.{i}.JSONEncoding.ReportTimestamp
|
||||
@@ -159,6 +160,7 @@ typedef struct
|
||||
char compression[9];
|
||||
char method[9];
|
||||
bool use_date_header;
|
||||
+ char report_format[20];
|
||||
} profile_ctrl_params_t;
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
@@ -233,7 +235,7 @@ bulkdata_profile_t *bulkdata_find_free_profile(void);
|
||||
bulkdata_profile_t *bulkdata_find_profile(int profile_id);
|
||||
int bulkdata_calc_report_map(bulkdata_profile_t *bp, kv_vector_t *report_map);
|
||||
int bulkdata_reduce_to_alt_name(char *spec, char *path, char *alt_name, char *out_buf, int buf_len);
|
||||
-char *bulkdata_generate_json_report(bulkdata_profile_t *bp, char *report_timestamp);
|
||||
+char *bulkdata_generate_json_report(bulkdata_profile_t *bp, char *report_timestamp, char *report_format);
|
||||
unsigned char *bulkdata_compress_report(profile_ctrl_params_t *ctrl, char *input_buf, int input_len, int *p_output_len);
|
||||
int bulkdata_schedule_sending_http_report(profile_ctrl_params_t *ctrl, bulkdata_profile_t *bp, unsigned char *json_report, int report_len);
|
||||
int bulkdata_start_profile(bulkdata_profile_t *bp);
|
||||
@@ -307,7 +309,7 @@ int DEVICE_BULKDATA_Init(void)
|
||||
err |= USP_REGISTER_DBParam_ReadWrite("Device.BulkData.Profile.{i}.Parameter.{i}.Reference", "", Validate_BulkDataReference, NULL, DM_STRING);
|
||||
|
||||
// Device.BulkData.Profile.{i}.JSONEncoding
|
||||
- err |= USP_REGISTER_DBParam_ReadWrite("Device.BulkData.Profile.{i}.JSONEncoding.ReportFormat", BULKDATA_JSON_REPORT_FORMAT, Validate_BulkDataReportFormat, NULL, DM_STRING);
|
||||
+ err |= USP_REGISTER_DBParam_ReadWrite("Device.BulkData.Profile.{i}.JSONEncoding.ReportFormat", BULKDATA_JSON_REPORT_FORMAT_NAME_VALUE, Validate_BulkDataReportFormat, NULL, DM_STRING);
|
||||
err |= USP_REGISTER_DBParam_ReadWrite("Device.BulkData.Profile.{i}.JSONEncoding.ReportTimestamp", BULKDATA_JSON_TIMESTAMP_FORMAT_EPOCH, Validate_BulkDataReportTimestamp, NULL, DM_STRING);
|
||||
|
||||
// Device.BulkData.Profile.{i}.HTTP
|
||||
@@ -661,9 +663,11 @@ int Validate_BulkDataReference(dm_req_t *req, char *value)
|
||||
int Validate_BulkDataReportFormat(dm_req_t *req, char *value)
|
||||
{
|
||||
// Exit if trying to set a value outside of the range we accept
|
||||
- if (strcmp(value, BULKDATA_JSON_REPORT_FORMAT) != 0)
|
||||
+ if (strcmp(value, BULKDATA_JSON_REPORT_FORMAT_NAME_VALUE) != 0 &&
|
||||
+ strcmp(value, BULKDATA_JSON_REPORT_FORMAT_OBJ_HIER) != 0)
|
||||
{
|
||||
- USP_ERR_SetMessage("%s: Only JSON Report Format supported is '%s'", __FUNCTION__, BULKDATA_JSON_REPORT_FORMAT);
|
||||
+ USP_ERR_SetMessage("%s: Only JSON Report Format supported are '%s', '%s'", __FUNCTION__,
|
||||
+ BULKDATA_JSON_REPORT_FORMAT_NAME_VALUE, BULKDATA_JSON_REPORT_FORMAT_OBJ_HIER);
|
||||
return USP_ERR_INVALID_VALUE;
|
||||
}
|
||||
|
||||
@@ -1974,6 +1978,14 @@ int bulkdata_platform_get_profile_control_params(bulkdata_profile_t *bp, profile
|
||||
return err;
|
||||
}
|
||||
|
||||
+ // Exit if unable to get ReportFormat
|
||||
+ USP_SNPRINTF(path, sizeof(path), "Device.BulkData.Profile.%d.JSONEncoding.ReportFormat", bp->profile_id);
|
||||
+ err = DATA_MODEL_GetParameterValue(path, ctrl_params->report_format, sizeof(ctrl_params->report_format), 0);
|
||||
+ if (err != USP_ERR_OK)
|
||||
+ {
|
||||
+ return err;
|
||||
+ }
|
||||
+
|
||||
return USP_ERR_OK;
|
||||
}
|
||||
|
||||
@@ -2249,7 +2261,7 @@ void bulkdata_process_profile_http(bulkdata_profile_t *bp)
|
||||
}
|
||||
|
||||
// Exit if unable to generate the report
|
||||
- json_report = bulkdata_generate_json_report(bp, ctrl.report_timestamp);
|
||||
+ json_report = bulkdata_generate_json_report(bp, ctrl.report_timestamp, ctrl.report_format);
|
||||
if (json_report == NULL)
|
||||
{
|
||||
USP_ERR_SetMessage("%s: bulkdata_generate_json_report failed", __FUNCTION__);
|
||||
@@ -2299,7 +2311,8 @@ void bulkdata_process_profile_usp_event(bulkdata_profile_t *bp)
|
||||
kv_pair_t kv;
|
||||
report_t *cur_report;
|
||||
char *json_report;
|
||||
- char report_timestamp[33];
|
||||
+ char report_timestamp[33] = {0};
|
||||
+ char report_format[20] = {0};
|
||||
|
||||
// Exit if the MTP has not been connected to successfully after bootup
|
||||
// This is to prevent BDC events being enqueued before the Boot! event is sent (the Boot! event is only sent after successfully connecting to the MTP).
|
||||
@@ -2316,6 +2329,14 @@ void bulkdata_process_profile_usp_event(bulkdata_profile_t *bp)
|
||||
return;
|
||||
}
|
||||
|
||||
+ // Exit if unable to get ReportFormat
|
||||
+ USP_SNPRINTF(path, sizeof(path), "Device.BulkData.Profile.%d.JSONEncoding.ReportFormat", bp->profile_id);
|
||||
+ err = DATA_MODEL_GetParameterValue(path, report_format, sizeof(report_format), 0);
|
||||
+ if (err != USP_ERR_OK)
|
||||
+ {
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
// When sending via USP events, only one report is ever sent in each USP event
|
||||
// So ensure all retained reports are removed. NOTE: Clearing the reports here is only necessary when switching protocol from HTTP to USP event, and where HTTP had some unsent reports
|
||||
bulkdata_clear_retained_reports(bp);
|
||||
@@ -2333,7 +2354,7 @@ void bulkdata_process_profile_usp_event(bulkdata_profile_t *bp)
|
||||
bp->num_retained_reports = 1;
|
||||
|
||||
// Exit if unable to generate the report
|
||||
- json_report = bulkdata_generate_json_report(bp, report_timestamp);
|
||||
+ json_report = bulkdata_generate_json_report(bp, report_timestamp, report_format);
|
||||
if (json_report == NULL)
|
||||
{
|
||||
USP_ERR_SetMessage("%s: bulkdata_generate_json_report failed", __FUNCTION__);
|
||||
@@ -2545,21 +2566,7 @@ int bulkdata_reduce_to_alt_name(char *spec, char *path, char *alt_name, char *ou
|
||||
return USP_ERR_OK;
|
||||
}
|
||||
|
||||
-/*********************************************************************//**
|
||||
-**
|
||||
-** bulkdata_generate_json_report
|
||||
-**
|
||||
-** Generates a JSON name-value pair format report
|
||||
-** NOTE: The report contains all retained failed reports, as well as the current report
|
||||
-** See TR-157 section A.4.2 (end) for an example, and section A.3.5.2 for layout of content containing failed report transmissions
|
||||
-**
|
||||
-** \param bp - pointer to bulk data profile containing all reports (current and retained)
|
||||
-** \param report_timestamp - value of Device.BulkData.Profile.{i}.JSONEncoding.ReportTimestamp
|
||||
-**
|
||||
-** \return pointer to NULL terminated dynamically allocated buffer containing the serialized report to send
|
||||
-**
|
||||
-**************************************************************************/
|
||||
-char *bulkdata_generate_json_report(bulkdata_profile_t *bp, char *report_timestamp)
|
||||
+static char *create_json_name_value_pair_report(bulkdata_profile_t *bp, char *report_timestamp)
|
||||
{
|
||||
JsonNode *top; // top of report
|
||||
JsonNode *array; // array of reports (retained + current)
|
||||
@@ -2574,7 +2581,6 @@ char *bulkdata_generate_json_report(bulkdata_profile_t *bp, char *report_timesta
|
||||
long long value_as_ll;
|
||||
unsigned long long value_as_ull;
|
||||
bool value_as_bool;
|
||||
- char *result;
|
||||
int i, j;
|
||||
char buf[32];
|
||||
kv_pair_t *kv;
|
||||
@@ -2597,7 +2603,7 @@ char *bulkdata_generate_json_report(bulkdata_profile_t *bp, char *report_timesta
|
||||
}
|
||||
else if (strcmp(report_timestamp, "ISO-8601")==0)
|
||||
{
|
||||
- result = iso8601_from_unix_time(report->collection_time, buf, sizeof(buf));
|
||||
+ char *result = iso8601_from_unix_time(report->collection_time, buf, sizeof(buf));
|
||||
if (result != NULL)
|
||||
{
|
||||
json_append_member(element, "CollectionTime", json_mkstring(buf));
|
||||
@@ -2656,11 +2662,174 @@ char *bulkdata_generate_json_report(bulkdata_profile_t *bp, char *report_timesta
|
||||
json_append_member(top, "Report", array);
|
||||
|
||||
// Serialize the JSON tree
|
||||
- result = json_stringify(top, " ");
|
||||
+ char *output = json_stringify(top, " ");
|
||||
+
|
||||
+ // Clean up the JSON tree
|
||||
+ json_delete(top); // Other JsonNodes which are children of this top level tree will be deleted
|
||||
+
|
||||
+ return output;
|
||||
+}
|
||||
+
|
||||
+static char *create_json_obj_hier_report(bulkdata_profile_t *bp, char *report_timestamp)
|
||||
+{
|
||||
+ JsonNode *top; // top of report
|
||||
+ JsonNode *array; // array of reports (retained + current)
|
||||
+ JsonNode *element; // element of json array, containing an individual report
|
||||
+ JsonNode *temp;
|
||||
+ char *param_path;
|
||||
+ char *param_type_value;
|
||||
+ char param_type;
|
||||
+ char *param_value;
|
||||
+ kv_vector_t *report_map;
|
||||
+ report_t *report;
|
||||
+ double value_as_number;
|
||||
+ long long value_as_ll;
|
||||
+ unsigned long long value_as_ull;
|
||||
+ bool value_as_bool;
|
||||
+ int i, j;
|
||||
+ char buf[32];
|
||||
+ kv_pair_t *kv;
|
||||
+ int err;
|
||||
+
|
||||
+ top = json_mkobject();
|
||||
+ array = json_mkarray();
|
||||
+
|
||||
+ // Iterate over all reports adding them to the JSON array
|
||||
+ for (i=0; i < bp->num_retained_reports; i++)
|
||||
+ {
|
||||
+ report = &bp->reports[i];
|
||||
+ report_map = &report->report_map;
|
||||
+
|
||||
+ // Add Collection time to each json report element (only if specified and not 'None')
|
||||
+ element = json_mkobject();
|
||||
+ if (strcmp(report_timestamp, "Unix-Epoch")==0)
|
||||
+ {
|
||||
+ json_append_member(element, "CollectionTime", json_mknumber(report->collection_time));
|
||||
+ }
|
||||
+ else if (strcmp(report_timestamp, "ISO-8601")==0)
|
||||
+ {
|
||||
+ char *result = iso8601_from_unix_time(report->collection_time, buf, sizeof(buf));
|
||||
+ if (result != NULL)
|
||||
+ {
|
||||
+ json_append_member(element, "CollectionTime", json_mkstring(buf));
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ temp = element;
|
||||
+ // Iterate over each parameter, adding it to the json element. Take account of the parameter's type
|
||||
+ for (j=0; j < report_map->num_entries; j++)
|
||||
+ {
|
||||
+ char buff[2056] = {0};
|
||||
+ char *pch = NULL, *pchr = NULL, *argv[128] = {0};
|
||||
+ int n = 0;
|
||||
+
|
||||
+ kv = &report_map->vector[j];
|
||||
+ param_path = kv->key;
|
||||
+ param_type_value = kv->value;
|
||||
+ param_type = param_type_value[0]; // First character denotes the type of the parameter
|
||||
+ param_value = ¶m_type_value[1]; // Subsequent characters contain the parameter's value
|
||||
+
|
||||
+ strncpy(buff, param_path, sizeof(buff));
|
||||
+ for (pch = strtok_r(buff, ".", &pchr); pch != NULL; pch = strtok_r(NULL, ".", &pchr)) {
|
||||
+ int idx;
|
||||
+ JsonNode *obj = element;
|
||||
+ argv[n] = pch;
|
||||
+
|
||||
+ for (idx = 0; idx <= n; idx++) {
|
||||
+ if (obj == NULL)
|
||||
+ break;
|
||||
+ obj = json_find_member(obj, argv[idx]);
|
||||
+ }
|
||||
+
|
||||
+ if (obj)
|
||||
+ temp = obj;
|
||||
+ else {
|
||||
+ if (pchr != NULL && *pchr != '\0') {
|
||||
+ // It is a DMOBJ
|
||||
+ JsonNode *new = json_mkobject();
|
||||
+ json_append_member(temp, pch, new);
|
||||
+ temp = new;
|
||||
+ } else {
|
||||
+ // It is a DMPARAM
|
||||
+ switch (param_type)
|
||||
+ {
|
||||
+ case 'S':
|
||||
+ json_append_member(temp, pch, json_mkstring(param_value) );
|
||||
+ break;
|
||||
+
|
||||
+ case 'U':
|
||||
+ value_as_ull = strtoull(param_value, NULL, 10);
|
||||
+ json_append_member(temp, pch, json_mkulonglong(value_as_ull) );
|
||||
+ break;
|
||||
+
|
||||
+ case 'L':
|
||||
+ value_as_ll = strtoll(param_value, NULL, 10);
|
||||
+ json_append_member(temp, pch, json_mklonglong(value_as_ll) );
|
||||
+ break;
|
||||
+
|
||||
+ case 'N':
|
||||
+ value_as_number = atof(param_value);
|
||||
+ json_append_member(temp, pch, json_mknumber(value_as_number) );
|
||||
+ break;
|
||||
+
|
||||
+ case 'B':
|
||||
+ err = TEXT_UTILS_StringToBool(param_value, &value_as_bool);
|
||||
+ if (err == USP_ERR_OK)
|
||||
+ {
|
||||
+ json_append_member(temp, pch, json_mkbool(value_as_bool) );
|
||||
+ }
|
||||
+ break;
|
||||
+
|
||||
+ default:
|
||||
+ USP_ERR_SetMessage("%s: Invalid JSON parameter type ('%c') in report map for %s", __FUNCTION__, param_type_value[0], param_path);
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+ n++;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ // Add the json element to the json array
|
||||
+ json_append_element(array, element);
|
||||
+ }
|
||||
+
|
||||
+ // Finally add the array to the report top level
|
||||
+ json_append_member(top, "Report", array);
|
||||
+
|
||||
+ // Serialize the JSON tree
|
||||
+ char *output = json_stringify(top, " ");
|
||||
|
||||
// Clean up the JSON tree
|
||||
json_delete(top); // Other JsonNodes which are children of this top level tree will be deleted
|
||||
|
||||
+ return output;
|
||||
+}
|
||||
+
|
||||
+/*********************************************************************//**
|
||||
+**
|
||||
+** bulkdata_generate_json_report
|
||||
+**
|
||||
+** Generates a JSON name-value pair or object-hierarchy format report
|
||||
+** NOTE: The report contains all retained failed reports, as well as the current report
|
||||
+** See TR-157 section A.4.2 (end) for an example, and section A.3.5.2 for layout of content containing failed report transmissions
|
||||
+**
|
||||
+** \param bp - pointer to bulk data profile containing all reports (current and retained)
|
||||
+** \param report_timestamp - value of Device.BulkData.Profile.{i}.JSONEncoding.ReportTimestamp
|
||||
+**
|
||||
+** \return pointer to NULL terminated dynamically allocated buffer containing the serialized report to send
|
||||
+**
|
||||
+**************************************************************************/
|
||||
+char *bulkdata_generate_json_report(bulkdata_profile_t *bp, char *report_timestamp, char *report_format)
|
||||
+{
|
||||
+ char *result = NULL;
|
||||
+
|
||||
+ if (strcmp(report_format, BULKDATA_JSON_REPORT_FORMAT_NAME_VALUE) == 0) {
|
||||
+ result = create_json_name_value_pair_report(bp, report_timestamp);
|
||||
+ } else if (strcmp(report_format, BULKDATA_JSON_REPORT_FORMAT_OBJ_HIER) == 0) {
|
||||
+ result = create_json_obj_hier_report(bp, report_timestamp);
|
||||
+ }
|
||||
+
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -2817,6 +2986,11 @@ int bulkdata_schedule_sending_http_report(profile_ctrl_params_t *ctrl, bulkdata_
|
||||
flags |= BDC_FLAG_DATE_HEADER;
|
||||
}
|
||||
|
||||
+ if (strcmp(ctrl->report_format, BULKDATA_JSON_REPORT_FORMAT_OBJ_HIER) == 0)
|
||||
+ {
|
||||
+ flags |= BDC_FLAG_HEADER_OBJ_HIER;
|
||||
+ }
|
||||
+
|
||||
// Exit if failed to post a message to BDC thread
|
||||
// NOTE: Ownership of full_url, query_string, report, username and password passes to BDC_EXEC
|
||||
err = BDC_EXEC_PostReportToSend(bp->profile_id, full_url, query_string, username, password, report, report_len, flags);
|
||||
673
obuspa/patches/0007-bdc_csv_format.patch
Normal file
673
obuspa/patches/0007-bdc_csv_format.patch
Normal file
@@ -0,0 +1,673 @@
|
||||
diff --git a/src/core/bdc_exec.c b/src/core/bdc_exec.c
|
||||
index 3670361..6a6325d 100644
|
||||
--- a/src/core/bdc_exec.c
|
||||
+++ b/src/core/bdc_exec.c
|
||||
@@ -547,11 +547,19 @@ int StartSendingReport(bdc_connection_t *bc)
|
||||
|
||||
// Set the list of headers
|
||||
bc->headers = NULL;
|
||||
- bc->headers = curl_slist_append(bc->headers, "Content-Type: application/json; charset=UTF-8");
|
||||
- if (bc->flags & BDC_FLAG_HEADER_OBJ_HIER)
|
||||
+ if (bc->flags & BDC_FLAG_HEADER_OBJ_HIER) {
|
||||
+ bc->headers = curl_slist_append(bc->headers, "Content-Type: application/json; charset=UTF-8");
|
||||
bc->headers = curl_slist_append(bc->headers, "BBF-Report-Format: ObjectHierarchy");
|
||||
- else
|
||||
+ } else if (bc->flags & BDC_FLAG_HEADER_NAME_VAL) {
|
||||
+ bc->headers = curl_slist_append(bc->headers, "Content-Type: application/json; charset=UTF-8");
|
||||
bc->headers = curl_slist_append(bc->headers, "BBF-Report-Format: NameValuePair");
|
||||
+ } else if (bc->flags & BDC_FLAG_HEADER_PER_COL) {
|
||||
+ bc->headers = curl_slist_append(bc->headers, "Content-Type: text/csv; charset=UTF-8");
|
||||
+ bc->headers = curl_slist_append(bc->headers, "BBF-Report-Format: ParameterPerColumn");
|
||||
+ } else {
|
||||
+ bc->headers = curl_slist_append(bc->headers, "Content-Type: text/csv; charset=UTF-8");
|
||||
+ bc->headers = curl_slist_append(bc->headers, "BBF-Report-Format: ParameterPerRow");
|
||||
+ }
|
||||
|
||||
if (bc->flags & BDC_FLAG_GZIP)
|
||||
{
|
||||
diff --git a/src/core/bdc_exec.h b/src/core/bdc_exec.h
|
||||
index ff37a2d..ee29c85 100644
|
||||
--- a/src/core/bdc_exec.h
|
||||
+++ b/src/core/bdc_exec.h
|
||||
@@ -53,6 +53,9 @@ void BDC_EXEC_ScheduleExit(void);
|
||||
#define BDC_FLAG_PUT 0x00000001 // If set, HTTP PUT should be used instead of HTTP POST when sending the report to the BDC server
|
||||
#define BDC_FLAG_GZIP 0x00000002 // If set, the reports contants are Gzipped
|
||||
#define BDC_FLAG_DATE_HEADER 0x00000004 // If set, the date header should be included in the HTTP post.
|
||||
-#define BDC_FLAG_HEADER_OBJ_HIER 0x00000008 // If set, report format in header would be ObjectHierarchy otherwise NameValuePair
|
||||
+#define BDC_FLAG_HEADER_OBJ_HIER 0x00000008 // If set, report format in header would be json ObjectHierarchy
|
||||
+#define BDC_FLAG_HEADER_NAME_VAL 0x00000010 // If set, report format in header would be json NameValuePair
|
||||
+#define BDC_FLAG_HEADER_PER_ROW 0x00000020 // If set, report format in header would be csv ParameterPerRow
|
||||
+#define BDC_FLAG_HEADER_PER_COL 0x00000040 // If set, report format in header would be csv ParameterPerColumn
|
||||
|
||||
#endif
|
||||
diff --git a/src/core/device_bulkdata.c b/src/core/device_bulkdata.c
|
||||
index a7d1b3e..fab9731 100755
|
||||
--- a/src/core/device_bulkdata.c
|
||||
+++ b/src/core/device_bulkdata.c
|
||||
@@ -67,9 +67,12 @@
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Definitions for formats that we support
|
||||
-#define BULKDATA_ENCODING_TYPE "JSON"
|
||||
+#define BULKDATA_ENCODING_TYPE_JSON "JSON"
|
||||
+#define BULKDATA_ENCODING_TYPE_CSV "CSV"
|
||||
#define BULKDATA_JSON_REPORT_FORMAT_NAME_VALUE "NameValuePair"
|
||||
#define BULKDATA_JSON_REPORT_FORMAT_OBJ_HIER "ObjectHierarchy"
|
||||
+#define BULKDATA_CSV_REPORT_FORMAT_PER_COLUMN "ParameterPerColumn"
|
||||
+#define BULKDATA_CSV_REPORT_FORMAT_PER_ROW "ParameterPerRow"
|
||||
|
||||
|
||||
// Definitions for Device.BulkData.Profile.{i}.JSONEncoding.ReportTimestamp
|
||||
@@ -153,6 +156,7 @@ static char *profile_push_event_args[] =
|
||||
typedef struct
|
||||
{
|
||||
int num_retained_failed_reports;
|
||||
+ char encoding_type[10];
|
||||
char report_timestamp[33];
|
||||
char url[1025];
|
||||
char username[257];
|
||||
@@ -161,6 +165,11 @@ typedef struct
|
||||
char method[9];
|
||||
bool use_date_header;
|
||||
char report_format[20];
|
||||
+ char field_separator[10];
|
||||
+ char row_separator[10];
|
||||
+ char escape_char[10];
|
||||
+ char csv_format[20];
|
||||
+ char row_timestamp[33];
|
||||
} profile_ctrl_params_t;
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
@@ -208,6 +217,7 @@ int Validate_BulkDataEncodingType(dm_req_t *req, char *value);
|
||||
int Validate_BulkDataReportingInterval(dm_req_t *req, char *value);
|
||||
int Validate_BulkDataReference(dm_req_t *req, char *value);
|
||||
int Validate_BulkDataReportFormat(dm_req_t *req, char *value);
|
||||
+int Validate_BulkDataCSVReportFormat(dm_req_t *req, char *value);
|
||||
int Validate_BulkDataReportTimestamp(dm_req_t *req, char *value);
|
||||
int Validate_BulkDataCompression(dm_req_t *req, char *value);
|
||||
int Validate_BulkDataHTTPMethod(dm_req_t *req, char *value);
|
||||
@@ -236,6 +246,8 @@ bulkdata_profile_t *bulkdata_find_profile(int profile_id);
|
||||
int bulkdata_calc_report_map(bulkdata_profile_t *bp, kv_vector_t *report_map);
|
||||
int bulkdata_reduce_to_alt_name(char *spec, char *path, char *alt_name, char *out_buf, int buf_len);
|
||||
char *bulkdata_generate_json_report(bulkdata_profile_t *bp, char *report_timestamp, char *report_format);
|
||||
+char *bulkdata_generate_csv_report(bulkdata_profile_t *bp, char *field_separator, char *row_separator,
|
||||
+ char *escape_char, char *csv_format, char *row_timestamp);
|
||||
unsigned char *bulkdata_compress_report(profile_ctrl_params_t *ctrl, char *input_buf, int input_len, int *p_output_len);
|
||||
int bulkdata_schedule_sending_http_report(profile_ctrl_params_t *ctrl, bulkdata_profile_t *bp, unsigned char *json_report, int report_len);
|
||||
int bulkdata_start_profile(bulkdata_profile_t *bp);
|
||||
@@ -250,6 +262,7 @@ char *bulkdata_platform_calc_uri_query_string(kv_vector_t *escaped_map);
|
||||
int bulkdata_platform_get_param_refs(int profile_id, param_ref_vector_t *param_refs);
|
||||
void bulkdata_expand_param_ref(param_ref_entry_t *pr, group_get_vector_t *ggv);
|
||||
void bulkdata_append_to_result_map(param_ref_entry_t *pr, group_get_vector_t *ggv, kv_vector_t *report_map);
|
||||
+void append_string_to_target(char *str, char **output);
|
||||
|
||||
/*********************************************************************//**
|
||||
**
|
||||
@@ -282,7 +295,7 @@ int DEVICE_BULKDATA_Init(void)
|
||||
err |= USP_REGISTER_VendorParam_ReadOnly("Device.BulkData.Status", Get_BulkDataGlobalStatus, DM_STRING);
|
||||
err |= USP_REGISTER_Param_Constant("Device.BulkData.MinReportingInterval", BULKDATA_MINIMUM_REPORTING_INTERVAL_STR, DM_UINT);
|
||||
err |= USP_REGISTER_Param_SupportedList("Device.BulkData.Protocols", bdc_protocols, NUM_ELEM(bdc_protocols));
|
||||
- err |= USP_REGISTER_Param_Constant("Device.BulkData.EncodingTypes", BULKDATA_ENCODING_TYPE, DM_STRING);
|
||||
+ err |= USP_REGISTER_Param_Constant("Device.BulkData.EncodingTypes", "CSV,JSON", DM_STRING);
|
||||
err |= USP_REGISTER_Param_Constant("Device.BulkData.ParameterWildCardSupported", "true", DM_BOOL);
|
||||
err |= USP_REGISTER_Param_Constant("Device.BulkData.MaxNumberOfProfiles", BULKDATA_MAX_PROFILES_STR, DM_INT);
|
||||
err |= USP_REGISTER_Param_Constant("Device.BulkData.MaxNumberOfParameterReferences", "-1", DM_INT);
|
||||
@@ -297,7 +310,7 @@ int DEVICE_BULKDATA_Init(void)
|
||||
err |= USP_REGISTER_DBParam_ReadWrite("Device.BulkData.Profile.{i}.Name", "", NULL, NULL, DM_STRING);
|
||||
err |= USP_REGISTER_DBParam_ReadWrite("Device.BulkData.Profile.{i}.NumberOfRetainedFailedReports", "0", Validate_NumberOfRetainedFailedReports, NULL, DM_INT);
|
||||
err |= USP_REGISTER_DBParam_ReadWrite("Device.BulkData.Profile.{i}.Protocol", BULKDATA_PROTOCOL_HTTP, Validate_BulkDataProtocol, NULL, DM_STRING);
|
||||
- err |= USP_REGISTER_DBParam_ReadWrite("Device.BulkData.Profile.{i}.EncodingType", BULKDATA_ENCODING_TYPE, Validate_BulkDataEncodingType, NULL, DM_STRING);
|
||||
+ err |= USP_REGISTER_DBParam_ReadWrite("Device.BulkData.Profile.{i}.EncodingType", BULKDATA_ENCODING_TYPE_JSON, Validate_BulkDataEncodingType, NULL, DM_STRING);
|
||||
err |= USP_REGISTER_DBParam_ReadWrite("Device.BulkData.Profile.{i}.ReportingInterval", "86400", Validate_BulkDataReportingInterval, NotifyChange_BulkDataReportingInterval, DM_UINT);
|
||||
err |= USP_REGISTER_DBParam_ReadWrite("Device.BulkData.Profile.{i}.TimeReference", UNKNOWN_TIME_STR, NULL, NotifyChange_BulkDataTimeReference, DM_DATETIME);
|
||||
|
||||
@@ -312,6 +325,13 @@ int DEVICE_BULKDATA_Init(void)
|
||||
err |= USP_REGISTER_DBParam_ReadWrite("Device.BulkData.Profile.{i}.JSONEncoding.ReportFormat", BULKDATA_JSON_REPORT_FORMAT_NAME_VALUE, Validate_BulkDataReportFormat, NULL, DM_STRING);
|
||||
err |= USP_REGISTER_DBParam_ReadWrite("Device.BulkData.Profile.{i}.JSONEncoding.ReportTimestamp", BULKDATA_JSON_TIMESTAMP_FORMAT_EPOCH, Validate_BulkDataReportTimestamp, NULL, DM_STRING);
|
||||
|
||||
+ // Device.BulkData.Profile.{i}.CSVEncoding
|
||||
+ err |= USP_REGISTER_DBParam_ReadWrite("Device.BulkData.Profile.{i}.CSVEncoding.FieldSeparator", ",", NULL, NULL, DM_STRING);
|
||||
+ err |= USP_REGISTER_DBParam_ReadWrite("Device.BulkData.Profile.{i}.CSVEncoding.RowSeparator", " ", NULL, NULL, DM_STRING);
|
||||
+ err |= USP_REGISTER_DBParam_ReadWrite("Device.BulkData.Profile.{i}.CSVEncoding.EscapeCharacter", """, NULL, NULL, DM_STRING);
|
||||
+ err |= USP_REGISTER_DBParam_ReadWrite("Device.BulkData.Profile.{i}.CSVEncoding.ReportFormat", BULKDATA_CSV_REPORT_FORMAT_PER_COLUMN, Validate_BulkDataCSVReportFormat, NULL, DM_STRING);
|
||||
+ err |= USP_REGISTER_DBParam_ReadWrite("Device.BulkData.Profile.{i}.CSVEncoding.RowTimestamp", BULKDATA_JSON_TIMESTAMP_FORMAT_EPOCH, Validate_BulkDataReportTimestamp, NULL, DM_STRING);
|
||||
+
|
||||
// Device.BulkData.Profile.{i}.HTTP
|
||||
err |= USP_REGISTER_DBParam_ReadWrite("Device.BulkData.Profile.{i}.HTTP.URL", "", NULL, NotifyChange_BulkDataURL, DM_STRING);
|
||||
err |= USP_REGISTER_DBParam_ReadWrite("Device.BulkData.Profile.{i}.HTTP.Username", "", NULL, NULL, DM_STRING);
|
||||
@@ -591,9 +611,10 @@ int Validate_BulkDataProtocol(dm_req_t *req, char *value)
|
||||
int Validate_BulkDataEncodingType(dm_req_t *req, char *value)
|
||||
{
|
||||
// Exit if trying to set a value outside of the range we accept
|
||||
- if (strcmp(value, BULKDATA_ENCODING_TYPE) != 0)
|
||||
+ if (strcmp(value, BULKDATA_ENCODING_TYPE_JSON) != 0 && strcmp(value, BULKDATA_ENCODING_TYPE_CSV) != 0)
|
||||
{
|
||||
- USP_ERR_SetMessage("%s: Only EncodingType supported is '%s'", __FUNCTION__, BULKDATA_ENCODING_TYPE);
|
||||
+ USP_ERR_SetMessage("%s: Only EncodingType supported are '%s,%s'", __FUNCTION__,
|
||||
+ BULKDATA_ENCODING_TYPE_JSON, BULKDATA_ENCODING_TYPE_CSV);
|
||||
return USP_ERR_INVALID_VALUE;
|
||||
}
|
||||
|
||||
@@ -674,6 +695,32 @@ int Validate_BulkDataReportFormat(dm_req_t *req, char *value)
|
||||
return USP_ERR_OK;
|
||||
}
|
||||
|
||||
+/*********************************************************************//**
|
||||
+**
|
||||
+** Validate_BulkDataCSVReportFormat
|
||||
+**
|
||||
+** Validates Device.BulkData.Profile.{i}.CSVEncoding.ReportFormat
|
||||
+**
|
||||
+** \param req - pointer to structure identifying the parameter
|
||||
+** \param value - value that the controller would like to set the parameter to
|
||||
+**
|
||||
+** \return USP_ERR_OK if successful
|
||||
+**
|
||||
+**************************************************************************/
|
||||
+int Validate_BulkDataCSVReportFormat(dm_req_t *req, char *value)
|
||||
+{
|
||||
+ // Exit if trying to set a value outside of the range we accept
|
||||
+ if (strcmp(value, BULKDATA_CSV_REPORT_FORMAT_PER_COLUMN) != 0 &&
|
||||
+ strcmp(value, BULKDATA_CSV_REPORT_FORMAT_PER_ROW) != 0)
|
||||
+ {
|
||||
+ USP_ERR_SetMessage("%s: Only JSON Report Format supported are '%s', '%s'", __FUNCTION__,
|
||||
+ BULKDATA_CSV_REPORT_FORMAT_PER_COLUMN, BULKDATA_CSV_REPORT_FORMAT_PER_ROW);
|
||||
+ return USP_ERR_INVALID_VALUE;
|
||||
+ }
|
||||
+
|
||||
+ return USP_ERR_OK;
|
||||
+}
|
||||
+
|
||||
/*********************************************************************//**
|
||||
**
|
||||
** Validate_BulkDataReportTimestamp
|
||||
@@ -1970,6 +2017,14 @@ int bulkdata_platform_get_profile_control_params(bulkdata_profile_t *bp, profile
|
||||
return err;
|
||||
}
|
||||
|
||||
+ // Exit if unable to get EncodingType
|
||||
+ USP_SNPRINTF(path, sizeof(path), "Device.BulkData.Profile.%d.EncodingType", bp->profile_id);
|
||||
+ err = DATA_MODEL_GetParameterValue(path, ctrl_params->encoding_type, sizeof(ctrl_params->encoding_type), 0);
|
||||
+ if (err != USP_ERR_OK)
|
||||
+ {
|
||||
+ return err;
|
||||
+ }
|
||||
+
|
||||
// Exit if unable to get ReportTimestamp
|
||||
USP_SNPRINTF(path, sizeof(path), "Device.BulkData.Profile.%d.JSONEncoding.ReportTimestamp", bp->profile_id);
|
||||
err = DATA_MODEL_GetParameterValue(path, ctrl_params->report_timestamp, sizeof(ctrl_params->report_timestamp), 0);
|
||||
@@ -1986,6 +2041,46 @@ int bulkdata_platform_get_profile_control_params(bulkdata_profile_t *bp, profile
|
||||
return err;
|
||||
}
|
||||
|
||||
+ // Exit if unable to get FieldSeparator
|
||||
+ USP_SNPRINTF(path, sizeof(path), "Device.BulkData.Profile.%d.CSVEncoding.FieldSeparator", bp->profile_id);
|
||||
+ err = DATA_MODEL_GetParameterValue(path, ctrl_params->field_separator, sizeof(ctrl_params->field_separator), 0);
|
||||
+ if (err != USP_ERR_OK)
|
||||
+ {
|
||||
+ return err;
|
||||
+ }
|
||||
+
|
||||
+ // Exit if unable to get RowSeparator
|
||||
+ USP_SNPRINTF(path, sizeof(path), "Device.BulkData.Profile.%d.CSVEncoding.RowSeparator", bp->profile_id);
|
||||
+ err = DATA_MODEL_GetParameterValue(path, ctrl_params->row_separator, sizeof(ctrl_params->row_separator), 0);
|
||||
+ if (err != USP_ERR_OK)
|
||||
+ {
|
||||
+ return err;
|
||||
+ }
|
||||
+
|
||||
+ // Exit if unable to get EscapeCharacter
|
||||
+ USP_SNPRINTF(path, sizeof(path), "Device.BulkData.Profile.%d.CSVEncoding.EscapeCharacter", bp->profile_id);
|
||||
+ err = DATA_MODEL_GetParameterValue(path, ctrl_params->escape_char, sizeof(ctrl_params->escape_char), 0);
|
||||
+ if (err != USP_ERR_OK)
|
||||
+ {
|
||||
+ return err;
|
||||
+ }
|
||||
+
|
||||
+ // Exit if unable to get ReportFormat
|
||||
+ USP_SNPRINTF(path, sizeof(path), "Device.BulkData.Profile.%d.CSVEncoding.ReportFormat", bp->profile_id);
|
||||
+ err = DATA_MODEL_GetParameterValue(path, ctrl_params->csv_format, sizeof(ctrl_params->csv_format), 0);
|
||||
+ if (err != USP_ERR_OK)
|
||||
+ {
|
||||
+ return err;
|
||||
+ }
|
||||
+
|
||||
+ // Exit if unable to get RowTimestamp
|
||||
+ USP_SNPRINTF(path, sizeof(path), "Device.BulkData.Profile.%d.CSVEncoding.RowTimestamp", bp->profile_id);
|
||||
+ err = DATA_MODEL_GetParameterValue(path, ctrl_params->row_timestamp, sizeof(ctrl_params->row_timestamp), 0);
|
||||
+ if (err != USP_ERR_OK)
|
||||
+ {
|
||||
+ return err;
|
||||
+ }
|
||||
+
|
||||
return USP_ERR_OK;
|
||||
}
|
||||
|
||||
@@ -2222,7 +2317,7 @@ void bulkdata_process_profile_http(bulkdata_profile_t *bp)
|
||||
{
|
||||
int err;
|
||||
report_t *cur_report;
|
||||
- char *json_report;
|
||||
+ char *report;
|
||||
profile_ctrl_params_t ctrl;
|
||||
unsigned char *compressed_report;
|
||||
int compressed_len;
|
||||
@@ -2261,10 +2356,23 @@ void bulkdata_process_profile_http(bulkdata_profile_t *bp)
|
||||
}
|
||||
|
||||
// Exit if unable to generate the report
|
||||
- json_report = bulkdata_generate_json_report(bp, ctrl.report_timestamp, ctrl.report_format);
|
||||
- if (json_report == NULL)
|
||||
- {
|
||||
- USP_ERR_SetMessage("%s: bulkdata_generate_json_report failed", __FUNCTION__);
|
||||
+ if (strcmp(ctrl.encoding_type, BULKDATA_ENCODING_TYPE_JSON) == 0) {
|
||||
+ report = bulkdata_generate_json_report(bp, ctrl.report_timestamp, ctrl.report_format);
|
||||
+ if (report == NULL)
|
||||
+ {
|
||||
+ USP_ERR_SetMessage("%s: bulkdata_generate_json_report failed", __FUNCTION__);
|
||||
+ return;
|
||||
+ }
|
||||
+ } else if (strcmp(ctrl.encoding_type, BULKDATA_ENCODING_TYPE_CSV) == 0) {
|
||||
+ report = bulkdata_generate_csv_report(bp, ctrl.field_separator, ctrl.row_separator, ctrl.escape_char,
|
||||
+ ctrl.csv_format, ctrl.row_timestamp);
|
||||
+ if (report == NULL)
|
||||
+ {
|
||||
+ USP_ERR_SetMessage("%s: bulkdata_generate_csv_report failed", __FUNCTION__);
|
||||
+ return;
|
||||
+ }
|
||||
+ } else {
|
||||
+ USP_ERR_SetMessage("%s: bulkdata invalid report encoding type %s", __FUNCTION__, ctrl.encoding_type);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -2273,14 +2381,14 @@ void bulkdata_process_profile_http(bulkdata_profile_t *bp)
|
||||
USP_LOG_Info("BULK DATA: using compression method=%s", ctrl.compression);
|
||||
if (enable_protocol_trace)
|
||||
{
|
||||
- USP_LOG_String(kLogLevel_Info, kLogType_Protocol, json_report);
|
||||
+ USP_LOG_String(kLogLevel_Info, kLogType_Protocol, report);
|
||||
}
|
||||
|
||||
// Compress the report, if enabled
|
||||
- compressed_report = bulkdata_compress_report(&ctrl, json_report, strlen(json_report), &compressed_len);
|
||||
- if (compressed_report != (unsigned char *)json_report)
|
||||
+ compressed_report = bulkdata_compress_report(&ctrl, report, strlen(report), &compressed_len);
|
||||
+ if (compressed_report != (unsigned char *)report)
|
||||
{
|
||||
- free(json_report);
|
||||
+ free(report);
|
||||
}
|
||||
// NOTE: From this point on, only the compressed_report exists
|
||||
|
||||
@@ -2310,9 +2418,15 @@ void bulkdata_process_profile_usp_event(bulkdata_profile_t *bp)
|
||||
kv_vector_t event_args;
|
||||
kv_pair_t kv;
|
||||
report_t *cur_report;
|
||||
- char *json_report;
|
||||
+ char *report;
|
||||
+ char encoding_type[10] = {0};
|
||||
char report_timestamp[33] = {0};
|
||||
char report_format[20] = {0};
|
||||
+ char field_separator[10];
|
||||
+ char row_separator[10];
|
||||
+ char escape_char[10];
|
||||
+ char csv_format[20];
|
||||
+ char row_timestamp[33];
|
||||
|
||||
// Exit if the MTP has not been connected to successfully after bootup
|
||||
// This is to prevent BDC events being enqueued before the Boot! event is sent (the Boot! event is only sent after successfully connecting to the MTP).
|
||||
@@ -2321,20 +2435,62 @@ void bulkdata_process_profile_usp_event(bulkdata_profile_t *bp)
|
||||
goto exit;
|
||||
}
|
||||
|
||||
- // Exit if unable to get ReportTimestamp
|
||||
- USP_SNPRINTF(path, sizeof(path), "Device.BulkData.Profile.%d.JSONEncoding.ReportTimestamp", bp->profile_id);
|
||||
- err = DATA_MODEL_GetParameterValue(path, report_timestamp, sizeof(report_timestamp), 0);
|
||||
- if (err != USP_ERR_OK)
|
||||
- {
|
||||
+ // Exit if unable to get EncodingType
|
||||
+ USP_SNPRINTF(path, sizeof(path), "Device.BulkData.Profile.%d.EncodingType", bp->profile_id);
|
||||
+ err = DATA_MODEL_GetParameterValue(path, encoding_type, sizeof(encoding_type), 0);
|
||||
+ if (err != USP_ERR_OK) {
|
||||
return;
|
||||
}
|
||||
|
||||
- // Exit if unable to get ReportFormat
|
||||
- USP_SNPRINTF(path, sizeof(path), "Device.BulkData.Profile.%d.JSONEncoding.ReportFormat", bp->profile_id);
|
||||
- err = DATA_MODEL_GetParameterValue(path, report_format, sizeof(report_format), 0);
|
||||
- if (err != USP_ERR_OK)
|
||||
- {
|
||||
- return;
|
||||
+ if (strcmp(encoding_type, BULKDATA_ENCODING_TYPE_JSON) == 0) {
|
||||
+ // Exit if unable to get ReportTimestamp
|
||||
+ USP_SNPRINTF(path, sizeof(path), "Device.BulkData.Profile.%d.JSONEncoding.ReportTimestamp", bp->profile_id);
|
||||
+ err = DATA_MODEL_GetParameterValue(path, report_timestamp, sizeof(report_timestamp), 0);
|
||||
+ if (err != USP_ERR_OK) {
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ // Exit if unable to get ReportFormat
|
||||
+ USP_SNPRINTF(path, sizeof(path), "Device.BulkData.Profile.%d.JSONEncoding.ReportFormat", bp->profile_id);
|
||||
+ err = DATA_MODEL_GetParameterValue(path, report_format, sizeof(report_format), 0);
|
||||
+ if (err != USP_ERR_OK) {
|
||||
+ return;
|
||||
+ }
|
||||
+ } else {
|
||||
+ // Exit if unable to get FieldSeparator
|
||||
+ USP_SNPRINTF(path, sizeof(path), "Device.BulkData.Profile.%d.CSVEncoding.FieldSeparator", bp->profile_id);
|
||||
+ err = DATA_MODEL_GetParameterValue(path, field_separator, sizeof(field_separator), 0);
|
||||
+ if (err != USP_ERR_OK) {
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ // Exit if unable to get RowSeparator
|
||||
+ USP_SNPRINTF(path, sizeof(path), "Device.BulkData.Profile.%d.CSVEncoding.RowSeparator", bp->profile_id);
|
||||
+ err = DATA_MODEL_GetParameterValue(path, row_separator, sizeof(row_separator), 0);
|
||||
+ if (err != USP_ERR_OK) {
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ // Exit if unable to get EscapeCharacter
|
||||
+ USP_SNPRINTF(path, sizeof(path), "Device.BulkData.Profile.%d.CSVEncoding.EscapeCharacter", bp->profile_id);
|
||||
+ err = DATA_MODEL_GetParameterValue(path, escape_char, sizeof(escape_char), 0);
|
||||
+ if (err != USP_ERR_OK) {
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ // Exit if unable to get ReportFormat
|
||||
+ USP_SNPRINTF(path, sizeof(path), "Device.BulkData.Profile.%d.CSVEncoding.ReportFormat", bp->profile_id);
|
||||
+ err = DATA_MODEL_GetParameterValue(path, csv_format, sizeof(csv_format), 0);
|
||||
+ if (err != USP_ERR_OK) {
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ // Exit if unable to get RowTimestamp
|
||||
+ USP_SNPRINTF(path, sizeof(path), "Device.BulkData.Profile.%d.CSVEncoding.RowTimestamp", bp->profile_id);
|
||||
+ err = DATA_MODEL_GetParameterValue(path, row_timestamp, sizeof(row_timestamp), 0);
|
||||
+ if (err != USP_ERR_OK) {
|
||||
+ return;
|
||||
+ }
|
||||
}
|
||||
|
||||
// When sending via USP events, only one report is ever sent in each USP event
|
||||
@@ -2354,10 +2510,16 @@ void bulkdata_process_profile_usp_event(bulkdata_profile_t *bp)
|
||||
bp->num_retained_reports = 1;
|
||||
|
||||
// Exit if unable to generate the report
|
||||
- json_report = bulkdata_generate_json_report(bp, report_timestamp, report_format);
|
||||
- if (json_report == NULL)
|
||||
+ if (strcmp(encoding_type, BULKDATA_ENCODING_TYPE_JSON) == 0) {
|
||||
+ report = bulkdata_generate_json_report(bp, report_timestamp, report_format);
|
||||
+ } else {
|
||||
+ report = bulkdata_generate_csv_report(bp, field_separator, row_separator, escape_char,
|
||||
+ csv_format, row_timestamp);
|
||||
+ }
|
||||
+
|
||||
+ if (report == NULL)
|
||||
{
|
||||
- USP_ERR_SetMessage("%s: bulkdata_generate_json_report failed", __FUNCTION__);
|
||||
+ USP_ERR_SetMessage("%s: bulkdata failed to generate report", __FUNCTION__);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -2365,15 +2527,15 @@ void bulkdata_process_profile_usp_event(bulkdata_profile_t *bp)
|
||||
|
||||
// Construct event_args manually to avoid the overhead of a malloc and copy of the report in KV_VECTOR_Add()
|
||||
kv.key = "Data";
|
||||
- kv.value = json_report;
|
||||
+ kv.value = report;
|
||||
event_args.vector = &kv;
|
||||
event_args.num_entries = 1;
|
||||
|
||||
USP_SNPRINTF(path, sizeof(path), "Device.BulkData.Profile.%d.Push!", bp->profile_id);
|
||||
DEVICE_SUBSCRIPTION_ProcessAllEventCompleteSubscriptions(path, &event_args);
|
||||
|
||||
- // Free the report. No need to free the event_args as json_report is the only thing dynamically allocated in it
|
||||
- free(json_report); // The report is not allocated via USP_MALLOC
|
||||
+ // Free the report. No need to free the event_args as report is the only thing dynamically allocated in it
|
||||
+ free(report); // The report is not allocated via USP_MALLOC
|
||||
|
||||
// From the point of view of this code, the report(s) have been successfully sent, so don't retain them
|
||||
// NOTE: Sending of the reports successfully is delegated to the USP notification retry mechanism
|
||||
@@ -2833,6 +2995,219 @@ char *bulkdata_generate_json_report(bulkdata_profile_t *bp, char *report_timesta
|
||||
return result;
|
||||
}
|
||||
|
||||
+/*********************************************************************//**
|
||||
+**
|
||||
+** append_string_to_target
|
||||
+**
|
||||
+** concatenates the src string with target string in newly allocated memory
|
||||
+** and assign back the new pointer.
|
||||
+**
|
||||
+** \param str - pointer to the src string
|
||||
+** \param output - address of the pointer that points to the target string
|
||||
+**
|
||||
+** \return None
|
||||
+**
|
||||
+**************************************************************************/
|
||||
+void append_string_to_target(char *str, char **output)
|
||||
+{
|
||||
+ char *tmp = NULL;
|
||||
+
|
||||
+ if (str == NULL || strlen(str) == 0)
|
||||
+ return;
|
||||
+
|
||||
+ if (*output == NULL || strlen(*output) == 0) {
|
||||
+ *output = USP_STRDUP(str);
|
||||
+ return;
|
||||
+ } else {
|
||||
+ tmp = USP_STRDUP(*output);
|
||||
+ free(*output);
|
||||
+ }
|
||||
+
|
||||
+ assert(tmp != NULL);
|
||||
+ asprintf(output, "%s%s", tmp, str);
|
||||
+ free(tmp);
|
||||
+}
|
||||
+
|
||||
+/*********************************************************************//**
|
||||
+**
|
||||
+** bulkdata_generate_csv_report
|
||||
+**
|
||||
+** Generates a CSV ParameterPerRow or ParameterPerColumn format report
|
||||
+** NOTE: The report contains all retained failed reports, as well as the current report
|
||||
+** See TR-157 section A.4.2 (end) for an example, and section A.3.5.2 for layout of content containing failed report transmissions
|
||||
+**
|
||||
+** \param bp - pointer to bulk data profile containing all reports (current and retained)
|
||||
+** \param field_separator - value of Device.Bulkdata.Profile.{i}.CSVEncoding.FieldSeparator
|
||||
+** \param row_separator - value of Device.Bulkdata.Profile.{i}.CSVEncoding.RowSeparator
|
||||
+** \param escape_char - value of Device.Bulkdata.Profile.{i}.CSVEncoding.EscapeCharacter
|
||||
+** \param csv_format - value of Device.BulkData.Profile.{i}.CSVEncoding.ReportFormat
|
||||
+** \param row_timestamp - value of Device.Bulkdata.Profile.{i}.CSVEncoding.RowTimestamp
|
||||
+**
|
||||
+** \return pointer to NULL terminated dynamically allocated buffer containing the serialized report to send
|
||||
+**
|
||||
+**************************************************************************/
|
||||
+char *bulkdata_generate_csv_report(bulkdata_profile_t *bp, char *field_separator, char *row_separator,
|
||||
+ char *escape_char, char *csv_format, char *row_timestamp)
|
||||
+{
|
||||
+ char *param_path;
|
||||
+ char *param_type_value;
|
||||
+ char param_type;
|
||||
+ char *param_value;
|
||||
+ kv_vector_t *report_map;
|
||||
+ report_t *report;
|
||||
+ int i, j;
|
||||
+ bool value_as_bool;
|
||||
+ char buf[32];
|
||||
+ kv_pair_t *kv;
|
||||
+ int err;
|
||||
+ char *output = NULL, *str = NULL, *str1 = NULL, *str2 = NULL, rowseparator = '\0', separator = '\0';
|
||||
+
|
||||
+ if (strcmp(row_separator, " ") == 0)
|
||||
+ rowseparator = '\n';
|
||||
+ else if (strcmp(row_separator, " ") == 0)
|
||||
+ rowseparator = '\r';
|
||||
+
|
||||
+ if (field_separator)
|
||||
+ separator = field_separator[0];
|
||||
+
|
||||
+ if (strcasecmp(csv_format, "ParameterPerRow") == 0) {
|
||||
+ if (strcmp(row_timestamp, "None") == 0)
|
||||
+ asprintf(&str, "ParameterName%cParameterValue%cParameterType%c", separator, separator, rowseparator);
|
||||
+ else
|
||||
+ asprintf(&str, "ReportTimestamp%cParameterName%cParameterValue%cParameterType%c", separator, separator, separator, rowseparator);
|
||||
+
|
||||
+ assert(str != NULL);
|
||||
+ append_string_to_target(str, &output);
|
||||
+ free(str);
|
||||
+ str = NULL;
|
||||
+ }
|
||||
+
|
||||
+ for (i=0; i < bp->num_retained_reports; i++)
|
||||
+ {
|
||||
+ char *timestamp = NULL;
|
||||
+ report = &bp->reports[i];
|
||||
+ report_map = &report->report_map;
|
||||
+
|
||||
+ // Add Collection time to each csv report element (only if specified and not 'None')
|
||||
+ if (strcmp(row_timestamp, "Unix-Epoch")==0)
|
||||
+ {
|
||||
+ asprintf(×tamp, "%lld", (long long int)report->collection_time);
|
||||
+ }
|
||||
+ else if (strcmp(row_timestamp, "ISO-8601")==0)
|
||||
+ {
|
||||
+ char *result = iso8601_from_unix_time(report->collection_time, buf, sizeof(buf));
|
||||
+ if (result != NULL)
|
||||
+ {
|
||||
+ asprintf(×tamp, "%s", buf);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ if (strcasecmp(csv_format, "ParameterPerColumn") == 0 && timestamp) {
|
||||
+ append_string_to_target("ReportTimestamp", &str1);
|
||||
+ append_string_to_target(timestamp, &str2);
|
||||
+ }
|
||||
+
|
||||
+ // Iterate over each parameter, adding it to the json element. Take account of the parameter's type
|
||||
+ for (j=0; j < report_map->num_entries; j++)
|
||||
+ {
|
||||
+ kv = &report_map->vector[j];
|
||||
+ param_path = kv->key;
|
||||
+ param_type_value = kv->value;
|
||||
+ param_type = param_type_value[0]; // First character denotes the type of the parameter
|
||||
+ param_value = ¶m_type_value[1]; // Subsequent characters contain the parameter's valu
|
||||
+ char *type = NULL;
|
||||
+ switch (param_type)
|
||||
+ {
|
||||
+ case 'S':
|
||||
+ type = "string";
|
||||
+ break;
|
||||
+
|
||||
+ case 'U':
|
||||
+ type = "unsignedInt";
|
||||
+ break;
|
||||
+
|
||||
+ case 'L':
|
||||
+ type = "long";
|
||||
+ break;
|
||||
+
|
||||
+ case 'N':
|
||||
+ type = "decimal";
|
||||
+ break;
|
||||
+
|
||||
+ case 'B':
|
||||
+ err = TEXT_UTILS_StringToBool(param_value, &value_as_bool);
|
||||
+ if (err == USP_ERR_OK)
|
||||
+ {
|
||||
+ type = "boolean";
|
||||
+ param_value = value_as_bool ? "True" : "False";
|
||||
+ }
|
||||
+ break;
|
||||
+
|
||||
+ default:
|
||||
+ USP_ERR_SetMessage("%s: Invalid JSON parameter type ('%c') in report map for %s", __FUNCTION__, param_type_value[0], param_path);
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ if (type) {
|
||||
+ if (strcasecmp(csv_format, "ParameterPerRow") == 0) {
|
||||
+ if (timestamp == NULL)
|
||||
+ asprintf(&str, "%s%c%s%c%s%c", param_path, separator, param_value, separator, type, rowseparator);
|
||||
+ else
|
||||
+ asprintf(&str, "%s%c%s%c%s%c%s%c", timestamp, separator, param_path, separator, param_value, separator, type, rowseparator);
|
||||
+
|
||||
+ assert(str != NULL);
|
||||
+ append_string_to_target(str, &output);
|
||||
+ free(str);
|
||||
+ str = NULL;
|
||||
+ } else {
|
||||
+ if (str1 == NULL || strlen(str1) == 0)
|
||||
+ asprintf(&str, "%s", param_path);
|
||||
+ else
|
||||
+ asprintf(&str, "%c%s", separator, param_path);
|
||||
+
|
||||
+ assert(str != NULL);
|
||||
+ append_string_to_target(str, &str1);
|
||||
+ free(str);
|
||||
+ str = NULL;
|
||||
+
|
||||
+ if (str2 == NULL || strlen(str2) == 0)
|
||||
+ asprintf(&str, "%s", param_value);
|
||||
+ else
|
||||
+ asprintf(&str, "%c%s", separator, param_value);
|
||||
+
|
||||
+ assert(str != NULL);
|
||||
+ append_string_to_target(str, &str2);
|
||||
+ free(str);
|
||||
+ str = NULL;
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ if (timestamp) {
|
||||
+ free(timestamp);
|
||||
+ timestamp = NULL;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ if (strcasecmp(csv_format, "ParameterPerColumn") == 0) {
|
||||
+ asprintf(&str, "%c", rowseparator);
|
||||
+ assert(str != NULL);
|
||||
+ append_string_to_target(str, &str1);
|
||||
+ append_string_to_target(str, &str2);
|
||||
+ append_string_to_target(str1, &output);
|
||||
+ append_string_to_target(str2, &output);
|
||||
+ }
|
||||
+
|
||||
+ if (str)
|
||||
+ free(str);
|
||||
+ if (str1)
|
||||
+ free(str1);
|
||||
+ if (str2)
|
||||
+ free(str2);
|
||||
+
|
||||
+ return output;
|
||||
+}
|
||||
+
|
||||
/*********************************************************************//**
|
||||
**
|
||||
** bulkdata_compress_report
|
||||
@@ -2986,9 +3361,18 @@ int bulkdata_schedule_sending_http_report(profile_ctrl_params_t *ctrl, bulkdata_
|
||||
flags |= BDC_FLAG_DATE_HEADER;
|
||||
}
|
||||
|
||||
- if (strcmp(ctrl->report_format, BULKDATA_JSON_REPORT_FORMAT_OBJ_HIER) == 0)
|
||||
- {
|
||||
- flags |= BDC_FLAG_HEADER_OBJ_HIER;
|
||||
+ if (strcmp(ctrl->encoding_type, BULKDATA_ENCODING_TYPE_JSON) == 0) {
|
||||
+ if (strcmp(ctrl->report_format, BULKDATA_JSON_REPORT_FORMAT_OBJ_HIER) == 0) {
|
||||
+ flags |= BDC_FLAG_HEADER_OBJ_HIER;
|
||||
+ } else {
|
||||
+ flags |= BDC_FLAG_HEADER_NAME_VAL;
|
||||
+ }
|
||||
+ } else {
|
||||
+ if (strcmp(ctrl->csv_format, BULKDATA_CSV_REPORT_FORMAT_PER_COLUMN) == 0) {
|
||||
+ flags |= BDC_FLAG_HEADER_PER_COL;
|
||||
+ } else {
|
||||
+ flags |= BDC_FLAG_HEADER_PER_ROW;
|
||||
+ }
|
||||
}
|
||||
|
||||
// Exit if failed to post a message to BDC thread
|
||||
@@ -404,11 +404,6 @@ start_service() {
|
||||
|
||||
}
|
||||
|
||||
#stop_service()
|
||||
#{
|
||||
# service_stop ${PROG}
|
||||
#}
|
||||
|
||||
reload_service() {
|
||||
stop
|
||||
start
|
||||
|
||||
@@ -1,23 +1,22 @@
|
||||
#
|
||||
# Copyright (C) 2021 IOPSYS
|
||||
# Copyright (C) 2021-2023 IOPSYS Software Solutions AB
|
||||
#
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=periodicstats
|
||||
PKG_VERSION:=1.2.1
|
||||
PKG_VERSION:=1.4.1
|
||||
|
||||
LOCAL_DEV:=0
|
||||
ifneq ($(LOCAL_DEV),1)
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_VERSION:=6c68428405bc88a9990e855f911aecc86f07f4a8
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/periodicstats.git
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/bbf/periodicstats.git
|
||||
PKG_SOURCE_VERSION:=415b7b59d7cd84cb133b20e27eca63a8cd74a155
|
||||
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:=GPL-2.0-only
|
||||
PKG_LICENSE:=BSD-3-Clause
|
||||
PKG_LICENSE_FILES:=LICENSE
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
@@ -26,7 +25,7 @@ define Package/periodicstats
|
||||
SECTION:=utils
|
||||
CATEGORY:=Utilities
|
||||
TITLE:=Periodic Statistics Daemon
|
||||
DEPENDS:=+libuci +libubox +libubus +libblobmsg-json +libjson-c +libbbf_api
|
||||
DEPENDS:=+libuci +libubox +libubus +libblobmsg-json +libjson-c +libbbfdm-api
|
||||
endef
|
||||
|
||||
define Package/periodicstats/description
|
||||
|
||||
@@ -1,15 +1,11 @@
|
||||
#!/bin/sh /etc/rc.common
|
||||
|
||||
START=99
|
||||
STOP=10
|
||||
STOP=01
|
||||
|
||||
USE_PROCD=1
|
||||
PROG=/usr/sbin/periodicstatsd
|
||||
|
||||
service_running() {
|
||||
ubus -t 10 wait_for usp.raw
|
||||
}
|
||||
|
||||
start_service() {
|
||||
local enable
|
||||
|
||||
@@ -29,9 +25,3 @@ start_service() {
|
||||
service_triggers() {
|
||||
procd_add_reload_trigger periodicstats
|
||||
}
|
||||
|
||||
reload_service() {
|
||||
stop
|
||||
start
|
||||
}
|
||||
|
||||
|
||||
@@ -22,6 +22,4 @@ service_running() {
|
||||
|
||||
stop_service() {
|
||||
ubus call leds set '{"state":"alloff"}'
|
||||
service_stop /sbin/peripheral_manager
|
||||
}
|
||||
|
||||
|
||||
@@ -6,6 +6,8 @@ set_serial_number() {
|
||||
vendor_id=$1
|
||||
vssn=$2
|
||||
|
||||
# Vendor id is not taken from serial automatically, propagate it as well
|
||||
/userfs/bin/omcicfgCmd set vendorId ${vendor_id}
|
||||
/userfs/bin/omcicfgCmd set sn ${vendor_id}${vssn}
|
||||
}
|
||||
|
||||
|
||||
@@ -173,27 +173,6 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
"TransceiverNumberOfEntries": {
|
||||
"type": "unsignedInt",
|
||||
"read": true,
|
||||
"write": false,
|
||||
"protocols": [
|
||||
"cwmp",
|
||||
"usp"
|
||||
],
|
||||
"datatype": "unsignedInt",
|
||||
"mapping": [
|
||||
{
|
||||
"type": "ubus",
|
||||
"ubus": {
|
||||
"object": "xpon",
|
||||
"method": "status",
|
||||
"args": {},
|
||||
"key": "ONU[@index].Transceiver.@Count"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"Device.XPON.ONU.{i}.SoftwareImage.{i}.": {
|
||||
"type": "object",
|
||||
"protocols": [
|
||||
@@ -621,6 +600,27 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
"TransceiverNumberOfEntries": {
|
||||
"type": "unsignedInt",
|
||||
"read": true,
|
||||
"write": false,
|
||||
"protocols": [
|
||||
"cwmp",
|
||||
"usp"
|
||||
],
|
||||
"datatype": "unsignedInt",
|
||||
"mapping": [
|
||||
{
|
||||
"type": "ubus",
|
||||
"ubus": {
|
||||
"object": "xpon",
|
||||
"method": "status",
|
||||
"args": {},
|
||||
"key": "ONU[@index].ANI[@index].Transceiver.@Count"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"Device.XPON.ONU.{i}.ANI.{i}.Stats.": {
|
||||
"type": "object",
|
||||
"protocols": [
|
||||
@@ -804,247 +804,247 @@
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Device.XPON.ONU.{i}.Transceiver.{i}.": {
|
||||
"type": "object",
|
||||
"protocols": [
|
||||
"cwmp",
|
||||
"usp"
|
||||
],
|
||||
"access": false,
|
||||
"array": true,
|
||||
"mapping": [
|
||||
{
|
||||
"type": "ubus",
|
||||
"ubus": {
|
||||
"object": "xpon",
|
||||
"method": "status",
|
||||
"args": {},
|
||||
"key": "ONU[@index].Transceiver"
|
||||
},
|
||||
"Device.XPON.ONU.{i}.ANI.{i}.Transceiver.{i}.": {
|
||||
"type": "object",
|
||||
"protocols": [
|
||||
"cwmp",
|
||||
"usp"
|
||||
],
|
||||
"access": false,
|
||||
"array": true,
|
||||
"mapping": [
|
||||
{
|
||||
"type": "ubus",
|
||||
"ubus": {
|
||||
"object": "xpon",
|
||||
"method": "status",
|
||||
"args": {},
|
||||
"key": "ONU[@index].ANI[@index].Transceiver"
|
||||
}
|
||||
}
|
||||
],
|
||||
"ID": {
|
||||
"type": "unsignedInt",
|
||||
"read": true,
|
||||
"write": false,
|
||||
"protocols": [
|
||||
"cwmp",
|
||||
"usp"
|
||||
],
|
||||
"datatype": "unsignedInt",
|
||||
"mapping": [
|
||||
{
|
||||
"data": "@Parent",
|
||||
"type": "json",
|
||||
"key": "ID"
|
||||
}
|
||||
]
|
||||
},
|
||||
"Identifier": {
|
||||
"type": "unsignedInt",
|
||||
"read": true,
|
||||
"write": false,
|
||||
"protocols": [
|
||||
"cwmp",
|
||||
"usp"
|
||||
],
|
||||
"datatype": "unsignedInt",
|
||||
"mapping": [
|
||||
{
|
||||
"data": "@Parent",
|
||||
"type": "json",
|
||||
"key": "Identifier"
|
||||
}
|
||||
]
|
||||
},
|
||||
"ModuleVendor": {
|
||||
"type": "string",
|
||||
"read": true,
|
||||
"write": false,
|
||||
"protocols": [
|
||||
"cwmp",
|
||||
"usp"
|
||||
],
|
||||
"datatype": "string",
|
||||
"mapping": [
|
||||
{
|
||||
"data": "@Parent",
|
||||
"type": "json",
|
||||
"key": "ModuleVendor"
|
||||
}
|
||||
]
|
||||
},
|
||||
"ModuleName": {
|
||||
"type": "string",
|
||||
"read": true,
|
||||
"write": false,
|
||||
"protocols": [
|
||||
"cwmp",
|
||||
"usp"
|
||||
],
|
||||
"datatype": "string",
|
||||
"mapping": [
|
||||
{
|
||||
"data": "@Parent",
|
||||
"type": "json",
|
||||
"key": "ModuleName"
|
||||
}
|
||||
]
|
||||
},
|
||||
"ModuleVersion": {
|
||||
"type": "string",
|
||||
"read": true,
|
||||
"write": false,
|
||||
"protocols": [
|
||||
"cwmp",
|
||||
"usp"
|
||||
],
|
||||
"datatype": "string",
|
||||
"mapping": [
|
||||
{
|
||||
"data": "@Parent",
|
||||
"type": "json",
|
||||
"key": "ModuleVersion"
|
||||
}
|
||||
]
|
||||
},
|
||||
"ModuleFirmwareVersion": {
|
||||
"type": "string",
|
||||
"read": true,
|
||||
"write": false,
|
||||
"protocols": [
|
||||
"cwmp",
|
||||
"usp"
|
||||
],
|
||||
"datatype": "string",
|
||||
"mapping": [
|
||||
{
|
||||
"data": "@Parent",
|
||||
"type": "json",
|
||||
"key": "ModuleFirmwareVersion"
|
||||
}
|
||||
]
|
||||
},
|
||||
"PONMode": {
|
||||
"type": "string",
|
||||
"read": true,
|
||||
"write": false,
|
||||
"protocols": [
|
||||
"cwmp",
|
||||
"usp"
|
||||
],
|
||||
"datatype": "string",
|
||||
"mapping": [
|
||||
{
|
||||
"data": "@Parent",
|
||||
"type": "json",
|
||||
"key": "PONMode"
|
||||
}
|
||||
]
|
||||
},
|
||||
"Connector": {
|
||||
"type": "string",
|
||||
"read": true,
|
||||
"write": false,
|
||||
"protocols": [
|
||||
"cwmp",
|
||||
"usp"
|
||||
],
|
||||
"datatype": "string",
|
||||
"mapping": [
|
||||
{
|
||||
"data": "@Parent",
|
||||
"type": "json",
|
||||
"key": "connector"
|
||||
}
|
||||
]
|
||||
},
|
||||
"RxPower": {
|
||||
"type": "int",
|
||||
"read": true,
|
||||
"write": false,
|
||||
"protocols": [
|
||||
"cwmp",
|
||||
"usp"
|
||||
],
|
||||
"datatype": "int",
|
||||
"mapping": [
|
||||
{
|
||||
"data": "@Parent",
|
||||
"type": "json",
|
||||
"key": "RxPower"
|
||||
}
|
||||
]
|
||||
},
|
||||
"TxPower": {
|
||||
"type": "int",
|
||||
"read": true,
|
||||
"write": false,
|
||||
"protocols": [
|
||||
"cwmp",
|
||||
"usp"
|
||||
],
|
||||
"datatype": "int",
|
||||
"mapping": [
|
||||
{
|
||||
"data": "@Parent",
|
||||
"type": "json",
|
||||
"key": "TxPower"
|
||||
}
|
||||
]
|
||||
},
|
||||
"Voltage": {
|
||||
"type": "unsignedInt",
|
||||
"read": true,
|
||||
"write": false,
|
||||
"protocols": [
|
||||
"cwmp",
|
||||
"usp"
|
||||
],
|
||||
"datatype": "unsignedInt",
|
||||
"mapping": [
|
||||
{
|
||||
"data": "@Parent",
|
||||
"type": "json",
|
||||
"key": "Voltage"
|
||||
}
|
||||
]
|
||||
},
|
||||
"Bias": {
|
||||
"type": "unsignedInt",
|
||||
"read": true,
|
||||
"write": false,
|
||||
"protocols": [
|
||||
"cwmp",
|
||||
"usp"
|
||||
],
|
||||
"datatype": "unsignedInt",
|
||||
"mapping": [
|
||||
{
|
||||
"data": "@Parent",
|
||||
"type": "json",
|
||||
"key": "Bias"
|
||||
}
|
||||
]
|
||||
},
|
||||
"Temperature": {
|
||||
"type": "int",
|
||||
"read": true,
|
||||
"write": false,
|
||||
"protocols": [
|
||||
"cwmp",
|
||||
"usp"
|
||||
],
|
||||
"datatype": "int",
|
||||
"mapping": [
|
||||
{
|
||||
"data": "@Parent",
|
||||
"type": "json",
|
||||
"key": "Temperature"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"ID": {
|
||||
"type": "unsignedInt",
|
||||
"read": true,
|
||||
"write": false,
|
||||
"protocols": [
|
||||
"cwmp",
|
||||
"usp"
|
||||
],
|
||||
"datatype": "unsignedInt",
|
||||
"mapping": [
|
||||
{
|
||||
"data": "@Parent",
|
||||
"type": "json",
|
||||
"key": "ID"
|
||||
}
|
||||
]
|
||||
},
|
||||
"Identifier": {
|
||||
"type": "unsignedInt",
|
||||
"read": true,
|
||||
"write": false,
|
||||
"protocols": [
|
||||
"cwmp",
|
||||
"usp"
|
||||
],
|
||||
"datatype": "unsignedInt",
|
||||
"mapping": [
|
||||
{
|
||||
"data": "@Parent",
|
||||
"type": "json",
|
||||
"key": "Identifier"
|
||||
}
|
||||
]
|
||||
},
|
||||
"ModuleVendor": {
|
||||
"type": "string",
|
||||
"read": true,
|
||||
"write": false,
|
||||
"protocols": [
|
||||
"cwmp",
|
||||
"usp"
|
||||
],
|
||||
"datatype": "string",
|
||||
"mapping": [
|
||||
{
|
||||
"data": "@Parent",
|
||||
"type": "json",
|
||||
"key": "ModuleVendor"
|
||||
}
|
||||
]
|
||||
},
|
||||
"ModuleName": {
|
||||
"type": "string",
|
||||
"read": true,
|
||||
"write": false,
|
||||
"protocols": [
|
||||
"cwmp",
|
||||
"usp"
|
||||
],
|
||||
"datatype": "string",
|
||||
"mapping": [
|
||||
{
|
||||
"data": "@Parent",
|
||||
"type": "json",
|
||||
"key": "ModuleName"
|
||||
}
|
||||
]
|
||||
},
|
||||
"ModuleVersion": {
|
||||
"type": "string",
|
||||
"read": true,
|
||||
"write": false,
|
||||
"protocols": [
|
||||
"cwmp",
|
||||
"usp"
|
||||
],
|
||||
"datatype": "string",
|
||||
"mapping": [
|
||||
{
|
||||
"data": "@Parent",
|
||||
"type": "json",
|
||||
"key": "ModuleVersion"
|
||||
}
|
||||
]
|
||||
},
|
||||
"ModuleFirmwareVersion": {
|
||||
"type": "string",
|
||||
"read": true,
|
||||
"write": false,
|
||||
"protocols": [
|
||||
"cwmp",
|
||||
"usp"
|
||||
],
|
||||
"datatype": "string",
|
||||
"mapping": [
|
||||
{
|
||||
"data": "@Parent",
|
||||
"type": "json",
|
||||
"key": "ModuleFirmwareVersion"
|
||||
}
|
||||
]
|
||||
},
|
||||
"PONMode": {
|
||||
"type": "string",
|
||||
"read": true,
|
||||
"write": false,
|
||||
"protocols": [
|
||||
"cwmp",
|
||||
"usp"
|
||||
],
|
||||
"datatype": "string",
|
||||
"mapping": [
|
||||
{
|
||||
"data": "@Parent",
|
||||
"type": "json",
|
||||
"key": "PONMode"
|
||||
}
|
||||
]
|
||||
},
|
||||
"Connector": {
|
||||
"type": "string",
|
||||
"read": true,
|
||||
"write": false,
|
||||
"protocols": [
|
||||
"cwmp",
|
||||
"usp"
|
||||
],
|
||||
"datatype": "string",
|
||||
"mapping": [
|
||||
{
|
||||
"data": "@Parent",
|
||||
"type": "json",
|
||||
"key": "connector"
|
||||
}
|
||||
]
|
||||
},
|
||||
"RxPower": {
|
||||
"type": "int",
|
||||
"read": true,
|
||||
"write": false,
|
||||
"protocols": [
|
||||
"cwmp",
|
||||
"usp"
|
||||
],
|
||||
"datatype": "int",
|
||||
"mapping": [
|
||||
{
|
||||
"data": "@Parent",
|
||||
"type": "json",
|
||||
"key": "RxPower"
|
||||
}
|
||||
]
|
||||
},
|
||||
"TxPower": {
|
||||
"type": "int",
|
||||
"read": true,
|
||||
"write": false,
|
||||
"protocols": [
|
||||
"cwmp",
|
||||
"usp"
|
||||
],
|
||||
"datatype": "int",
|
||||
"mapping": [
|
||||
{
|
||||
"data": "@Parent",
|
||||
"type": "json",
|
||||
"key": "TxPower"
|
||||
}
|
||||
]
|
||||
},
|
||||
"Voltage": {
|
||||
"type": "unsignedInt",
|
||||
"read": true,
|
||||
"write": false,
|
||||
"protocols": [
|
||||
"cwmp",
|
||||
"usp"
|
||||
],
|
||||
"datatype": "unsignedInt",
|
||||
"mapping": [
|
||||
{
|
||||
"data": "@Parent",
|
||||
"type": "json",
|
||||
"key": "Voltage"
|
||||
}
|
||||
]
|
||||
},
|
||||
"Bias": {
|
||||
"type": "unsignedInt",
|
||||
"read": true,
|
||||
"write": false,
|
||||
"protocols": [
|
||||
"cwmp",
|
||||
"usp"
|
||||
],
|
||||
"datatype": "unsignedInt",
|
||||
"mapping": [
|
||||
{
|
||||
"data": "@Parent",
|
||||
"type": "json",
|
||||
"key": "Bias"
|
||||
}
|
||||
]
|
||||
},
|
||||
"Temperature": {
|
||||
"type": "int",
|
||||
"read": true,
|
||||
"write": false,
|
||||
"protocols": [
|
||||
"cwmp",
|
||||
"usp"
|
||||
],
|
||||
"datatype": "int",
|
||||
"mapping": [
|
||||
{
|
||||
"data": "@Parent",
|
||||
"type": "json",
|
||||
"key": "Temperature"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,7 +11,7 @@ PKG_VERSION:=1.0.5
|
||||
LOCAL_DEV:=0
|
||||
ifneq ($(LOCAL_DEV),1)
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_VERSION:=56ebfed11f8f2eb376afda02ebac929c5ad4ee9b
|
||||
PKG_SOURCE_VERSION:=2e6d5650cb30e5ae4cc47c1fb9d85b48c49e6100
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/qosmngr.git
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
|
||||
PKG_MIRROR_HASH:=skip
|
||||
|
||||
@@ -1,64 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
. /lib/functions.sh
|
||||
|
||||
ethwan="$(db -q get hw.board.ethernetWanPort)"
|
||||
|
||||
populate_no_of_queue(){
|
||||
queue_num=8
|
||||
|
||||
# writing no. of queue per port into file and read on classify generate
|
||||
if [ ! -d "/tmp/qos" ]; then
|
||||
mkdir -p "/tmp/qos"
|
||||
fi
|
||||
no_queue_file="/tmp/qos/no_queue_per_port"
|
||||
touch "$no_queue_file"
|
||||
echo $queue_num >"$no_queue_file"
|
||||
}
|
||||
|
||||
generate_queue(){
|
||||
section="$1"
|
||||
|
||||
config_get ifname "$section" "ifname"
|
||||
|
||||
if [ "$ifname" != "$ethwan" ]; then
|
||||
return 0
|
||||
fi
|
||||
|
||||
# guaranteed number of queues
|
||||
no_of_q="0 1 2 3 4 5 6 7"
|
||||
|
||||
i=0
|
||||
local total_q=$((${no_of_q##* } + 1))
|
||||
for i in $no_of_q; do
|
||||
order=$((total_q - i))
|
||||
uci add qos queue
|
||||
uci rename qos.@queue[-1]="q_${i}_${ifname}"
|
||||
uci set qos.@queue[-1].enable="1"
|
||||
uci set qos.@queue[-1].ifname="$ifname"
|
||||
uci set qos.@queue[-1].precedence="$order"
|
||||
uci set qos.@queue[-1].scheduling="SP"
|
||||
uci set qos.@queue[-1].rate="0"
|
||||
uci set qos.@queue[-1].burst_size="0"
|
||||
uci set qos.@queue[-1].weight="1"
|
||||
done
|
||||
|
||||
uci commit qos
|
||||
}
|
||||
|
||||
populate_no_of_queue
|
||||
|
||||
if [ -s "/etc/config/qos" ]; then
|
||||
if uci -q get qos.@queue[0] >/dev/null; then
|
||||
# return if there is any valid content
|
||||
exit
|
||||
else
|
||||
rm -f /etc/config/qos
|
||||
fi
|
||||
fi
|
||||
touch /etc/config/qos
|
||||
|
||||
# generate qos queue config
|
||||
config_load ports
|
||||
config_foreach generate_queue ethport
|
||||
|
||||
@@ -1,97 +1,6 @@
|
||||
#!/bin/sh
|
||||
# Install ebtables rules
|
||||
|
||||
BR_RULE=""
|
||||
BR6_RULE=""
|
||||
|
||||
init_broute_rule() {
|
||||
BR_RULE=""
|
||||
BR6_RULE=""
|
||||
}
|
||||
|
||||
broute_filter_on_src_if() {
|
||||
BR_RULE="$BR_RULE --in-if $1"
|
||||
}
|
||||
|
||||
broute_filter_on_src_mac() {
|
||||
BR_RULE="$BR_RULE --src $1"
|
||||
}
|
||||
|
||||
broute_filter_on_dst_mac() {
|
||||
BR_RULE="$BR_RULE --dst $1"
|
||||
}
|
||||
|
||||
broute_filter_on_pcp() {
|
||||
case "$BR_RULE" in
|
||||
*proto*)
|
||||
BR_RULE="$BR_RULE --vlan-prio $1"
|
||||
;;
|
||||
*)
|
||||
BR_RULE="$BR_RULE --proto 802_1Q --vlan-prio $1"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
broute_filter_on_ether_type() {
|
||||
BR_RULE="$BR_RULE --proto $1"
|
||||
}
|
||||
|
||||
broute_filter_on_ether_type6() {
|
||||
BR6_RULE="$BR6_RULE --proto IPv6"
|
||||
}
|
||||
|
||||
ebt_match_src_ip() {
|
||||
BR_RULE="$BR_RULE --ip-src $1"
|
||||
}
|
||||
|
||||
ebt_match_dst_ip() {
|
||||
BR_RULE="$BR_RULE --ip-dst $1"
|
||||
}
|
||||
|
||||
ebt_match_ipv6_src_ip() {
|
||||
BR_RULE="$BR_RULE --ip6-src $1"
|
||||
}
|
||||
|
||||
ebt_match_ipv6_dst_ip() {
|
||||
BR_RULE="$BR_RULE --ip6-dst $1"
|
||||
}
|
||||
|
||||
ebt_match_ip_src_port() {
|
||||
BR_RULE="$BR_RULE --ip-source-port $1"
|
||||
}
|
||||
|
||||
ebt_match_ip_dst_port() {
|
||||
BR_RULE="$BR_RULE --ip-destination-port $1"
|
||||
}
|
||||
|
||||
ebt_match_ipv6_src_port() {
|
||||
if [ -n "$BR6_RULE" ]; then
|
||||
BR6_RULE="$BR6_RULE --ip6-source-port $1"
|
||||
else
|
||||
BR_RULE="$BR_RULE --ip6-source-port $1"
|
||||
fi
|
||||
}
|
||||
|
||||
ebt_match_ipv6_dst_port() {
|
||||
if [ -n "$BR6_RULE" ]; then
|
||||
BR6_RULE="$BR6_RULE --ip6-destination-port $1"
|
||||
else
|
||||
BR_RULE="$BR_RULE --ip6-destination-port $1"
|
||||
fi
|
||||
}
|
||||
|
||||
ebt_match_ip_protocol() {
|
||||
BR_RULE="$BR_RULE --ip-proto $1"
|
||||
}
|
||||
|
||||
ebt_match_ipv6_protocol() {
|
||||
if [ -n "$BR6_RULE" ]; then
|
||||
BR6_RULE="$BR6_RULE --ip6-proto $1"
|
||||
else
|
||||
BR_RULE="$BR_RULE --ip6-proto $1"
|
||||
fi
|
||||
}
|
||||
|
||||
ebt_match_ipv6_dscp() {
|
||||
if [ -n "$BR6_RULE" ]; then
|
||||
BR6_RULE="$BR6_RULE --ip6-tclass $1"
|
||||
@@ -100,22 +9,6 @@ ebt_match_ipv6_dscp() {
|
||||
fi
|
||||
}
|
||||
|
||||
broute_filter_on_vid() {
|
||||
|
||||
if [ -z "$1" ] || [ "$1" -lt 0 ]; then
|
||||
return
|
||||
fi
|
||||
|
||||
case "$BR_RULE" in
|
||||
*proto*)
|
||||
BR_RULE="$BR_RULE --vlan-id $1"
|
||||
;;
|
||||
*)
|
||||
BR_RULE="$BR_RULE --proto 802_1Q --vlan-id $1"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
broute_rule_set_traffic_class() {
|
||||
BR_RULE="$BR_RULE -j mark --mark-or 0x${1}0 --mark-target ACCEPT"
|
||||
if [ -n "$BR6_RULE" ]; then
|
||||
@@ -123,92 +16,6 @@ broute_rule_set_traffic_class() {
|
||||
fi
|
||||
}
|
||||
|
||||
broute_append_rule() {
|
||||
echo "ebtables -t broute -A qos $BR_RULE" >> /tmp/qos/classify.ebtables
|
||||
if [ -n "$BR6_RULE" ]; then
|
||||
echo "ebtables -t broute -A qos $BR6_RULE" >> /tmp/qos/classify.ebtables
|
||||
fi
|
||||
}
|
||||
|
||||
set_ip_addr()
|
||||
{
|
||||
local cid="$1"
|
||||
local match_src_ip_func="$2"
|
||||
local match_dst_ip_func="$3"
|
||||
|
||||
config_get src_ip "$cid" "src_ip"
|
||||
config_get dst_ip "$cid" "dest_ip"
|
||||
|
||||
if [ -n "$src_ip" ]; then
|
||||
$match_src_ip_func "$src_ip"
|
||||
fi
|
||||
|
||||
if [ -n "$dst_ip" ]; then
|
||||
$match_dst_ip_func "$dst_ip"
|
||||
fi
|
||||
}
|
||||
|
||||
set_ports()
|
||||
{
|
||||
local cid="$1"
|
||||
local match_src_port_func="$2"
|
||||
local match_dst_port_func="$3"
|
||||
local src_port=""
|
||||
local dst_port=""
|
||||
local src_port_range=""
|
||||
local dst_port_range=""
|
||||
|
||||
config_get src_port "$cid" "src_port"
|
||||
config_get dst_port "$cid" "dest_port"
|
||||
config_get src_port_range "$cid" "src_port_range"
|
||||
config_get dst_port_range "$cid" "dest_port_range"
|
||||
|
||||
if [ -n "$src_port" ] && [ -n "$src_port_range" ] ; then
|
||||
$match_src_port_func "$src_port:$src_port_range"
|
||||
elif [ -n "$src_port" ] ; then
|
||||
$match_src_port_func "$src_port"
|
||||
fi
|
||||
|
||||
if [ -n "$dst_port" ] && [ -n "$dst_port_range" ] ; then
|
||||
$match_dst_port_func "$dst_port:$dst_port_range"
|
||||
elif [ -n "$dst_port" ] ; then
|
||||
$match_dst_port_func "$dst_port"
|
||||
fi
|
||||
}
|
||||
|
||||
protocol_string_to_num()
|
||||
{
|
||||
local value="-1"
|
||||
|
||||
case "$1" in
|
||||
*[0-9]*)
|
||||
value="$1"
|
||||
;;
|
||||
TCP|tcp)
|
||||
value=6
|
||||
;;
|
||||
UDP|udp)
|
||||
value=17
|
||||
;;
|
||||
ICMP|icmp)
|
||||
value=1
|
||||
;;
|
||||
ICMPv6|icmpv6)
|
||||
value=58
|
||||
;;
|
||||
IGMP|igmp)
|
||||
value=2
|
||||
;;
|
||||
SCTP|sctp)
|
||||
value=132
|
||||
;;
|
||||
*)
|
||||
value=-1
|
||||
;;
|
||||
esac
|
||||
echo $value
|
||||
}
|
||||
|
||||
broute_ipv4_rule_options()
|
||||
{
|
||||
local cid="$1"
|
||||
@@ -259,195 +66,3 @@ broute_ipv6_rule_options()
|
||||
fi
|
||||
}
|
||||
|
||||
handle_ebtables_rules() {
|
||||
local sid="$1"
|
||||
local is_l2_rule=0
|
||||
local src_dhcp_options=""
|
||||
local dst_dhcp_options=""
|
||||
local protocol=""
|
||||
local ip_version=""
|
||||
|
||||
init_broute_rule
|
||||
|
||||
config_get src_if "$sid" "ifname"
|
||||
config_get src_mac "$sid" "src_mac"
|
||||
config_get dst_mac "$sid" "dst_mac"
|
||||
config_get dscp_filter "$sid" "dscp_filter"
|
||||
config_get pcp_check "$sid" "pcp_check"
|
||||
config_get eth_type "$sid" "ethertype"
|
||||
config_get vid "$sid" "vid_check"
|
||||
config_get dhcp_type "$sid" "dhcp_type" # dhcpv4 or v6
|
||||
config_get src_vcid "$sid" "src_vendor_class_id" # dhcp option 60
|
||||
config_get dst_vcid "$sid" "dst_vendor_class_id" # dhcp option 60
|
||||
config_get src_clid "$sid" "src_client_id" # dhcp option 61
|
||||
config_get dst_clid "$sid" "dst_client_id" # dhcp option 61
|
||||
config_get src_ucid "$sid" "src_user_class_id" # dhcp option 77
|
||||
config_get dst_ucid "$sid" "dst_user_class_id" # dhcp option 77
|
||||
config_get traffic_class "$sid" "traffic_class"
|
||||
config_get protocol "$sid" "proto"
|
||||
|
||||
if [ -n "$src_if" ]; then
|
||||
for interf in $(db -q get hw.board.ethernetPortOrder); do
|
||||
if [ "$src_if" == "$interf" ]; then
|
||||
src_if="$src_if+"
|
||||
broute_filter_on_src_if "$src_if"
|
||||
is_l2_rule=1
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
if [ -n "$src_mac" ]; then
|
||||
broute_filter_on_src_mac "$src_mac"
|
||||
is_l2_rule=1
|
||||
fi
|
||||
|
||||
if [ -n "$dst_mac" ]; then
|
||||
broute_filter_on_dst_mac "$dst_mac"
|
||||
is_l2_rule=1
|
||||
fi
|
||||
|
||||
if [ -n "$pcp_check" ]; then
|
||||
broute_filter_on_pcp "$pcp_check"
|
||||
is_l2_rule=1
|
||||
fi
|
||||
|
||||
if [ -n "$eth_type" ]; then
|
||||
broute_filter_on_ether_type "$eth_type"
|
||||
is_l2_rule=1
|
||||
fi
|
||||
|
||||
if [ -n "$vid" ]; then
|
||||
broute_filter_on_vid "$vid"
|
||||
is_l2_rule=1
|
||||
fi
|
||||
|
||||
case $eth_type in
|
||||
IPv4|IPV4|0800)
|
||||
ip_version=4
|
||||
;;
|
||||
IPv6|IPV6|86DD)
|
||||
ip_version=6
|
||||
;;
|
||||
*)
|
||||
if [ -z "$eth_type" ]; then
|
||||
case "$src_ip$dst_ip" in
|
||||
*.*)
|
||||
ip_version=4
|
||||
broute_filter_on_ether_type "IPv4"
|
||||
;;
|
||||
*:*)
|
||||
ip_version=6
|
||||
broute_filter_on_ether_type "IPv6"
|
||||
;;
|
||||
*)
|
||||
if [ -n "$protocol" ] || [ -n "$dscp_filter" ]; then
|
||||
# Neither ether_type nor ip address used,
|
||||
# ethertype is not configured by user, so install
|
||||
# both proto IPv4 and IPv6 rule (version 1)
|
||||
ip_version=1
|
||||
BR6_RULE="$BR_RULE"
|
||||
broute_filter_on_ether_type "IPv4"
|
||||
broute_filter_on_ether_type6 "IPv6"
|
||||
fi
|
||||
esac
|
||||
fi
|
||||
esac
|
||||
|
||||
if [ "$ip_version" == "4" ] || [ "$ip_version" == "1" ]; then
|
||||
broute_ipv4_rule_options "$sid"
|
||||
is_l2_rule=1
|
||||
fi
|
||||
|
||||
if [ "$ip_version" == "6" ] || [ "$ip_version" == "1" ]; then
|
||||
broute_ipv6_rule_options "$sid"
|
||||
is_l2_rule=1
|
||||
fi
|
||||
|
||||
# first process options that will help figure our source mac address
|
||||
# dhcp option for "vendor class id"
|
||||
if [ -n "$src_vcid" ]; then
|
||||
src_dhcp_options="$src_dhcp_options vcid=$src_vcid"
|
||||
is_l2_rule=1
|
||||
fi
|
||||
|
||||
# dhcp option for "client id"
|
||||
if [ -n "$src_clid" ]; then
|
||||
src_dhcp_options="$src_dhcp_options clid=$src_clid"
|
||||
is_l2_rule=1
|
||||
fi
|
||||
|
||||
# dhcp option for "user class id"
|
||||
if [ -n "$src_ucid" ]; then
|
||||
src_dhcp_options="$src_dhcp_options ucid=$src_ucid"
|
||||
is_l2_rule=1
|
||||
fi
|
||||
|
||||
# if src mac is already a classification criteria, then it
|
||||
# does not really make sense to add it as a criteria to
|
||||
# filter packets again based on source mac
|
||||
if [ -n "$src_dhcp_options" ] && [ -z "$src_mac" ]; then
|
||||
comp="$(grep -i "$src_dhcp_options" /tmp/dhcp.client.options)"
|
||||
if [ -n "$comp" ]; then
|
||||
s_mac_add="$(echo $comp | head -n1 | awk '{print $1;}')"
|
||||
if [ -n "$s_mac_add" ]; then
|
||||
broute_filter_on_src_mac "$s_mac_add"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
# Now process options that will help figure our destination mac address
|
||||
# dhcp option for "vendor class id"
|
||||
if [ -n "$dst_vcid" ]; then
|
||||
dst_dhcp_options="$dst_dhcp_options vcid=$dst_vcid"
|
||||
is_l2_rule=1
|
||||
fi
|
||||
|
||||
# dhcp option for "client id"
|
||||
if [ -n "$dst_clid" ]; then
|
||||
dst_dhcp_options="$dst_dhcp_options clid=$dst_clid"
|
||||
is_l2_rule=1
|
||||
fi
|
||||
|
||||
# dhcp option for "user class id"
|
||||
if [ -n "$dst_ucid" ]; then
|
||||
dst_dhcp_options="$dst_dhcp_options ucid=$dst_ucid"
|
||||
is_l2_rule=1
|
||||
fi
|
||||
|
||||
# if dst mac is already a classification criteria, then it
|
||||
# does not really make sense to add it as a criteria to
|
||||
# filter packets again based on destination mac
|
||||
if [ -n "$dst_dhcp_options" ] && [ -z "$dst_mac" ] ; then
|
||||
comp="$(grep -i "$dst_dhcp_options" /tmp/dhcp.client.options)"
|
||||
if [ -n "$comp" ]; then
|
||||
d_mac_add="$(echo $comp | head -n1 | awk '{print $1;}')"
|
||||
if [ -n "$d_mac_add" ]; then
|
||||
broute_filter_on_dst_mac "$d_mac_add"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ $is_l2_rule -eq 0 ]; then
|
||||
return
|
||||
fi
|
||||
|
||||
[ -n "$traffic_class" ] && broute_rule_set_traffic_class "$traffic_class"
|
||||
|
||||
[ -n "$BR_RULE" ] && broute_append_rule
|
||||
}
|
||||
|
||||
create_ebtables_chains() {
|
||||
ebtables -t broute -N qos
|
||||
ret=$?
|
||||
if [ $ret -eq 0 ]; then
|
||||
ebtables -t broute -I BROUTING -j qos
|
||||
else
|
||||
ebtables -t broute -D BROUTING -j qos
|
||||
ebtables -t broute -I BROUTING -j qos
|
||||
fi
|
||||
}
|
||||
|
||||
flush_ebtables_chains() {
|
||||
echo "ebtables -t broute -F qos" > /tmp/qos/classify.ebtables
|
||||
}
|
||||
|
||||
|
||||
@@ -1,12 +0,0 @@
|
||||
#!/bin/sh
|
||||
# Set up or flush all chains
|
||||
|
||||
setup_qos() {
|
||||
create_ebtables_chains
|
||||
create_iptables_chains
|
||||
}
|
||||
|
||||
flush_chains() {
|
||||
flush_ebtables_chains
|
||||
flush_iptables_chains
|
||||
}
|
||||
@@ -4,15 +4,23 @@
|
||||
. /lib/functions.sh
|
||||
include /lib/ethernet
|
||||
|
||||
. /lib/qos/common/chains.sh
|
||||
. /lib/qos/iptables.sh
|
||||
. /lib/qos/common/chains.ebtables.sh
|
||||
. /lib/qos/common/chains.iptables.sh
|
||||
. /lib/qos/common/classify.sh
|
||||
. /lib/qos/ebtables.sh
|
||||
. /lib/qos/ip_rule.sh
|
||||
. /lib/qos/classify.sh
|
||||
. /lib/qos/common/policer.sh
|
||||
. /lib/qos/common/queue.sh
|
||||
. /lib/qos/common/shaper.sh
|
||||
. /lib/qos/airoha.sh
|
||||
. /lib/qos/ip_rule.sh
|
||||
|
||||
get_rate_per_queue() {
|
||||
echo "0"
|
||||
}
|
||||
|
||||
get_burst_size_per_queue() {
|
||||
echo "0"
|
||||
}
|
||||
|
||||
configure_qos() {
|
||||
# queue configuration is being done after shaper configuration,
|
||||
@@ -24,6 +32,9 @@ configure_qos() {
|
||||
configure_queue
|
||||
configure_policer
|
||||
configure_classify
|
||||
if [ -f "/tmp/qos/classify.ebtables" ]; then
|
||||
sh /tmp/qos/classify.ebtables
|
||||
fi
|
||||
}
|
||||
|
||||
reload_qos() {
|
||||
@@ -40,6 +51,9 @@ reload_qos() {
|
||||
;;
|
||||
classify)
|
||||
configure_classify
|
||||
if [ -f "/tmp/qos/classify.ebtables" ]; then
|
||||
sh /tmp/qos/classify.ebtables
|
||||
fi
|
||||
;;
|
||||
policer)
|
||||
configure_policer
|
||||
|
||||
@@ -4,21 +4,25 @@ include /lib/ethernet
|
||||
|
||||
# include common code
|
||||
. /lib/qos/ip_rule.sh
|
||||
|
||||
IP_RULE=""
|
||||
BR_RULE=""
|
||||
BR6_RULE=""
|
||||
. /lib/qos/iptables.sh
|
||||
. /lib/qos/ebtables.sh
|
||||
. /lib/qos/classify.sh
|
||||
|
||||
POLICER_COUNT=0
|
||||
Q_COUNT=0
|
||||
SP_Q_PRIO=7
|
||||
|
||||
#counter variable to assign classify order value if not added in config
|
||||
temp_order=1
|
||||
|
||||
cfg_name=""
|
||||
cfg_type=""
|
||||
|
||||
get_rate_per_queue() {
|
||||
echo "0"
|
||||
}
|
||||
|
||||
get_burst_size_per_queue() {
|
||||
echo "0"
|
||||
}
|
||||
|
||||
# Function to handle a queue order and
|
||||
# update total number of queues
|
||||
handle_q_order() {
|
||||
@@ -172,217 +176,6 @@ handle_queue() {
|
||||
Q_COUNT=$((Q_COUNT + 1))
|
||||
}
|
||||
|
||||
#function to handle a policer section
|
||||
handle_policer() {
|
||||
local p_sec="$1" # policer section ID
|
||||
local dir=1 # default direction, upstream
|
||||
|
||||
config_get is_enable "$p_sec" "enable"
|
||||
|
||||
#no need to configure disabled policer
|
||||
if [ $is_enable == '0' ]; then
|
||||
return
|
||||
fi
|
||||
|
||||
config_get cir "$p_sec" "committed_rate"
|
||||
config_get cbs "$p_sec" "committed_burst_size" -1
|
||||
config_get ebs "$p_sec" "excess_burst_size" 0
|
||||
config_get pir "$p_sec" "peak_rate" 0
|
||||
config_get pbs "$p_sec" "peak_burst_size" 0
|
||||
config_get meter "$p_sec" "meter_type" 0
|
||||
|
||||
# Call tmctl which is a broadcomm command to configure policer.
|
||||
tmctl createpolicer --dir $dir --pid $POLICER_COUNT --ptype $meter --cir $cir --cbs $cbs --ebs $ebs --pir $pir --pbs $pbs
|
||||
|
||||
POLICER_COUNT=$((POLICER_COUNT + 1))
|
||||
}
|
||||
|
||||
#function to handle a shaper section
|
||||
handle_shaper() {
|
||||
sid="$1" #queue section ID
|
||||
|
||||
config_get is_enable "$sid" "enable"
|
||||
# no need to configure disabled queues
|
||||
if [ $is_enable == '0' ]; then
|
||||
return
|
||||
fi
|
||||
|
||||
|
||||
config_get ifname "$sid" "ifname"
|
||||
# if ifname is empty that is good enough to break
|
||||
if [ -z "$ifname" ];then
|
||||
return
|
||||
fi
|
||||
|
||||
config_get rate "$sid" "rate"
|
||||
# Convert the rate from bps to kbps.
|
||||
if [ $rate -lt 1000 ];then
|
||||
return
|
||||
fi
|
||||
|
||||
rate=$(($rate / 1000))
|
||||
config_get bs "$sid" "burst_size"
|
||||
tmctl setportshaper --devtype 0 --if $ifname --shapingrate $rate --burstsize $bs
|
||||
}
|
||||
|
||||
setup_qos() {
|
||||
if [ ! -d "/tmp/qos" ]; then
|
||||
mkdir -p /tmp/qos
|
||||
fi
|
||||
if [ ! -f "/tmp/qos/qos" ]; then
|
||||
touch /tmp/qos/qos
|
||||
cp /etc/config/qos /tmp/qos/qos
|
||||
fi
|
||||
|
||||
ebtables -t broute -N qos
|
||||
ret=$?
|
||||
if [ $ret -eq 0 ]; then
|
||||
ebtables -t broute -I BROUTING -j qos
|
||||
else
|
||||
ebtables -t broute -D BROUTING -j qos
|
||||
ebtables -t broute -I BROUTING -j qos
|
||||
fi
|
||||
|
||||
iptables -w -t mangle -N qos_forward
|
||||
ret=$?
|
||||
[ $ret -eq 0 ] && iptables -w -t mangle -I FORWARD -j qos_forward
|
||||
|
||||
iptables -w -t mangle -N qos_prerouting
|
||||
ret=$?
|
||||
[ $ret -eq 0 ] && iptables -w -t mangle -I PREROUTING -j qos_prerouting
|
||||
|
||||
iptables -w -t mangle -N qos_output
|
||||
ret=$?
|
||||
[ $ret -eq 0 ] && iptables -w -t mangle -I OUTPUT -j qos_output
|
||||
|
||||
ip6tables -t mangle -N qos_forward
|
||||
ret=$?
|
||||
[ $ret -eq 0 ] && ip6tables -t mangle -I FORWARD -j qos_forward
|
||||
|
||||
ip6tables -t mangle -N qos_prerouting
|
||||
ret=$?
|
||||
[ $ret -eq 0 ] && ip6tables -t mangle -I PREROUTING -j qos_prerouting
|
||||
|
||||
ip6tables -t mangle -N qos_output
|
||||
ret=$?
|
||||
[ $ret -eq 0 ] && ip6tables -t mangle -I OUTPUT -j qos_output
|
||||
}
|
||||
|
||||
flush_chains() {
|
||||
echo "ebtables -t broute -F qos" > /tmp/qos/classify.ebtables
|
||||
|
||||
echo "iptables -w -t mangle -F qos_forward" > /tmp/qos/classify.iptables
|
||||
echo "iptables -w -t mangle -F qos_prerouting" >> /tmp/qos/classify.iptables
|
||||
echo "iptables -w -t mangle -F qos_output" >> /tmp/qos/classify.iptables
|
||||
|
||||
echo "ip6tables -w -t mangle -F qos_forward" > /tmp/qos/classify.ip6tables
|
||||
echo "ip6tables -w -t mangle -F qos_prerouting" >> /tmp/qos/classify.ip6tables
|
||||
echo "ip6tables -w -t mangle -F qos_output" >> /tmp/qos/classify.ip6tables
|
||||
}
|
||||
|
||||
init_broute_rule() {
|
||||
BR_RULE=""
|
||||
BR6_RULE=""
|
||||
}
|
||||
|
||||
broute_filter_on_src_if() {
|
||||
BR_RULE="$BR_RULE --in-if $1"
|
||||
}
|
||||
|
||||
broute_filter_on_src_mac() {
|
||||
BR_RULE="$BR_RULE --src $1"
|
||||
}
|
||||
|
||||
broute_filter_on_dst_mac() {
|
||||
BR_RULE="$BR_RULE --dst $1"
|
||||
}
|
||||
|
||||
broute_filter_on_pcp() {
|
||||
# 5.04 onwards the vlan extension in ebtables is used for classification
|
||||
# on the basis of vlan params which needs proto to be defined as 802_1Q in
|
||||
# order to add a rule, now, proto can also be defined by specifying proto uci
|
||||
# option as well as the rule may have a vlan id as well in which case the
|
||||
# proto will already be present, hence, this check to not add --proto more
|
||||
# than once
|
||||
case "$BR_RULE" in
|
||||
*proto*)
|
||||
BR_RULE="$BR_RULE --vlan-prio $1"
|
||||
;;
|
||||
*)
|
||||
BR_RULE="$BR_RULE --proto 802_1Q --vlan-prio $1"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
broute_filter_on_ether_type() {
|
||||
BR_RULE="$BR_RULE --proto $1"
|
||||
}
|
||||
|
||||
broute_filter_on_ether_type6() {
|
||||
BR6_RULE="$BR6_RULE --proto IPv6"
|
||||
}
|
||||
|
||||
ebt_match_src_ip() {
|
||||
BR_RULE="$BR_RULE --ip-src $1"
|
||||
}
|
||||
|
||||
ebt_match_dst_ip() {
|
||||
BR_RULE="$BR_RULE --ip-dst $1"
|
||||
}
|
||||
|
||||
ebt_match_ipv6_src_ip() {
|
||||
BR_RULE="$BR_RULE --ip6-src $1"
|
||||
}
|
||||
|
||||
ebt_match_ipv6_dst_ip() {
|
||||
BR_RULE="$BR_RULE --ip6-dst $1"
|
||||
}
|
||||
|
||||
ebt_match_ip_src_port() {
|
||||
BR_RULE="$BR_RULE --ip-source-port $1"
|
||||
}
|
||||
|
||||
ebt_match_ip_dst_port() {
|
||||
BR_RULE="$BR_RULE --ip-destination-port $1"
|
||||
}
|
||||
|
||||
ebt_match_ipv6_src_port() {
|
||||
#when ethertype is not configured by user then both proto rules of ipv4
|
||||
#and ipv6 to be installed so update BR6_RULE string as well otherwise
|
||||
#update BR_RULE only for installation of ipv6 proto rule only.
|
||||
if [ ! -z "$BR6_RULE" ]; then
|
||||
BR6_RULE="$BR6_RULE --ip6-source-port $1"
|
||||
else
|
||||
BR_RULE="$BR_RULE --ip6-source-port $1"
|
||||
fi
|
||||
}
|
||||
|
||||
ebt_match_ipv6_dst_port() {
|
||||
#when ethertype is not configured by user then both proto rules of ipv4
|
||||
#and ipv6 to be installed so update BR6_RULE string as well otherwise
|
||||
#update BR_RULE only for installation of ipv6 proto rule only.
|
||||
if [ ! -z "$BR6_RULE" ]; then
|
||||
BR6_RULE="$BR6_RULE --ip6-destination-port $1"
|
||||
else
|
||||
BR_RULE="$BR_RULE --ip6-destination-port $1"
|
||||
fi
|
||||
}
|
||||
|
||||
ebt_match_ip_protocol() {
|
||||
BR_RULE="$BR_RULE --ip-proto $1"
|
||||
}
|
||||
|
||||
ebt_match_ipv6_protocol() {
|
||||
#when ethertype is not configured by user then both proto rules of ipv4
|
||||
#and ipv6 to be installed so update BR6_RULE string as well otherwise
|
||||
#update BR_RULE only for installation of ipv6 proto rule only.
|
||||
if [ ! -z "$BR6_RULE" ]; then
|
||||
BR6_RULE="$BR6_RULE --ip6-proto $1"
|
||||
else
|
||||
BR_RULE="$BR_RULE --ip6-proto $1"
|
||||
fi
|
||||
}
|
||||
|
||||
ebt_match_ipv6_dscp() {
|
||||
#when ethertype is not configured by user then both proto rules of ipv4
|
||||
#and ipv6 to be installed so update BR6_RULE string as well otherwise
|
||||
@@ -403,112 +196,6 @@ broute_filter_on_dscp() {
|
||||
BR_RULE="$BR_RULE --ip-dscp-extend $tos_hex"
|
||||
}
|
||||
|
||||
broute_filter_on_vid() {
|
||||
|
||||
if [ $1 -lt 0 ]; then
|
||||
return
|
||||
fi
|
||||
|
||||
case "$BR_RULE" in
|
||||
*proto*)
|
||||
BR_RULE="$BR_RULE --vlan-id $1"
|
||||
;;
|
||||
*)
|
||||
BR_RULE="$BR_RULE --proto 802_1Q --vlan-id $1"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
broute_rule_set_traffic_class() {
|
||||
#when ethertype is not configured by user then both proto rules of ipv4
|
||||
#and ipv6 to be installed so update BR6_RULE string as well otherwise
|
||||
#update BR_RULE only for installation of ipv6 proto rule only.
|
||||
BR_RULE="$BR_RULE -j mark --mark-or 0x$1 --mark-target ACCEPT"
|
||||
if [ ! -z "$BR6_RULE" ]; then
|
||||
BR6_RULE="$BR6_RULE -j mark --mark-or 0x$1 --mark-target ACCEPT"
|
||||
fi
|
||||
}
|
||||
|
||||
broute_append_rule() {
|
||||
#when ethertype is not configured by user then both proto rules of ipv4
|
||||
#and ipv6 to be installed otherwise install ipv6 proto rule only.
|
||||
echo "ebtables -t broute -A qos $BR_RULE" >> /tmp/qos/classify.ebtables
|
||||
if [ -n "$BR6_RULE" ]; then
|
||||
echo "ebtables -t broute -A qos $BR6_RULE" >> /tmp/qos/classify.ebtables
|
||||
fi
|
||||
}
|
||||
|
||||
set_ip_addr()
|
||||
{
|
||||
local cid=$1
|
||||
local match_src_ip_func=$2
|
||||
local match_dst_ip_func=$3
|
||||
|
||||
config_get src_ip "$cid" "src_ip"
|
||||
config_get dst_ip "$cid" "dest_ip"
|
||||
|
||||
if [ ! -z "$src_ip" ]; then
|
||||
$match_src_ip_func "$src_ip"
|
||||
fi
|
||||
|
||||
if [ ! -z "$dst_ip" ]; then
|
||||
$match_dst_ip_func "$dst_ip"
|
||||
fi
|
||||
}
|
||||
|
||||
set_ports()
|
||||
{
|
||||
local cid=$1
|
||||
local match_src_port_func=$2
|
||||
local match_dst_port_func=$3
|
||||
local src_port=""
|
||||
local dst_port=""
|
||||
local src_port_range=""
|
||||
local dst_port_range=""
|
||||
|
||||
config_get src_port "$cid" "src_port"
|
||||
config_get dst_port "$cid" "dest_port"
|
||||
config_get src_port_range "$cid" "src_port_range"
|
||||
config_get dst_port_range "$cid" "dest_port_range"
|
||||
|
||||
if ! [ -z $src_port ] && ! [ -z $src_port_range ]; then
|
||||
$match_src_port_func "$src_port:$src_port_range"
|
||||
elif [ ! -z $src_port ]; then
|
||||
$match_src_port_func $src_port
|
||||
fi
|
||||
|
||||
if ! [ -z $dst_port ] && ! [ -z $dst_port_range ]; then
|
||||
$match_dst_port_func "$dst_port:$dst_port_range"
|
||||
elif [ ! -z $dst_port ]; then
|
||||
$match_dst_port_func $dst_port
|
||||
fi
|
||||
}
|
||||
|
||||
protocol_string_to_num()
|
||||
{
|
||||
local value=-1
|
||||
|
||||
case "$1" in
|
||||
*[0-9]*) value="$1"
|
||||
;;
|
||||
TCP|tcp) value=6
|
||||
;;
|
||||
UDP|udp) value=17
|
||||
;;
|
||||
ICMP|icmp) value=1
|
||||
;;
|
||||
ICMPv6|icmpv6) value=58
|
||||
;;
|
||||
IGMP|igmp) value=2
|
||||
;;
|
||||
SCTP|sctp) value=132
|
||||
;;
|
||||
*) value=-1
|
||||
;;
|
||||
esac
|
||||
echo $value
|
||||
}
|
||||
|
||||
broute_ipv4_rule_options()
|
||||
{
|
||||
local cid=$1
|
||||
@@ -561,371 +248,66 @@ broute_ipv6_rule_options()
|
||||
fi
|
||||
}
|
||||
|
||||
handle_ebtables_rules() {
|
||||
sid=$1
|
||||
local is_l2_rule=0
|
||||
local src_dhcp_options=""
|
||||
local dst_dhcp_options=""
|
||||
local protocol=""
|
||||
local ip_version=""
|
||||
|
||||
init_broute_rule
|
||||
|
||||
config_get src_if "$sid" "ifname"
|
||||
config_get src_mac "$sid" "src_mac"
|
||||
config_get dst_mac "$sid" "dst_mac"
|
||||
config_get dscp_filter "$sid" "dscp_filter"
|
||||
config_get pcp_check "$sid" "pcp_check"
|
||||
config_get eth_type "$sid" "ethertype"
|
||||
config_get vid "$sid" "vid_check"
|
||||
config_get dhcp_type "$sid" "dhcp_type" # dhcpv4 or v6
|
||||
config_get src_vcid "$sid" "src_vendor_class_id" # dhcp option 60
|
||||
config_get dst_vcid "$sid" "dst_vendor_class_id" # dhcp option 60
|
||||
config_get src_clid "$sid" "src_client_id" # dhcp option 61
|
||||
config_get dst_clid "$sid" "dst_client_id" # dhcp option 61
|
||||
config_get src_ucid "$sid" "src_user_class_id" # dhcp option 77
|
||||
config_get dst_ucid "$sid" "dst_user_class_id" # dhcp option 77
|
||||
config_get traffic_class "$sid" "traffic_class"
|
||||
config_get protocol "$sid" "proto"
|
||||
|
||||
|
||||
if [ -n "$src_if" ]; then
|
||||
for interf in $(db -q get hw.board.ethernetPortOrder); do
|
||||
if [ "$src_if" == "$interf" ]; then
|
||||
src_if="$src_if+"
|
||||
broute_filter_on_src_if $src_if
|
||||
is_l2_rule=1
|
||||
fi
|
||||
done
|
||||
broute_rule_set_traffic_class() {
|
||||
#when ethertype is not configured by user then both proto rules of ipv4
|
||||
#and ipv6 to be installed so update BR6_RULE string as well otherwise
|
||||
#update BR_RULE only for installation of ipv6 proto rule only.
|
||||
BR_RULE="$BR_RULE -j mark --mark-or 0x$1 --mark-target ACCEPT"
|
||||
if [ ! -z "$BR6_RULE" ]; then
|
||||
BR6_RULE="$BR6_RULE -j mark --mark-or 0x$1 --mark-target ACCEPT"
|
||||
fi
|
||||
}
|
||||
|
||||
if [ -n "$src_mac" ]; then
|
||||
broute_filter_on_src_mac $src_mac
|
||||
is_l2_rule=1
|
||||
fi
|
||||
#function to handle a policer section
|
||||
handle_policer() {
|
||||
local p_sec="$1" # policer section ID
|
||||
local dir=1 # default direction, upstream
|
||||
|
||||
if [ -n "$dst_mac" ]; then
|
||||
broute_filter_on_dst_mac $dst_mac
|
||||
is_l2_rule=1
|
||||
fi
|
||||
config_get is_enable "$p_sec" "enable"
|
||||
|
||||
if [ -n "$pcp_check" ]; then
|
||||
broute_filter_on_pcp $pcp_check
|
||||
is_l2_rule=1
|
||||
fi
|
||||
|
||||
if [ -n "$eth_type" ]; then
|
||||
broute_filter_on_ether_type $eth_type
|
||||
is_l2_rule=1
|
||||
fi
|
||||
|
||||
if [ -n "$vid" ]; then
|
||||
broute_filter_on_vid $vid
|
||||
is_l2_rule=1
|
||||
fi
|
||||
|
||||
case $eth_type in
|
||||
IPv4|IPV4|0800)
|
||||
ip_version=4
|
||||
;;
|
||||
IPv6|IPV6|86DD)
|
||||
ip_version=6
|
||||
;;
|
||||
*)
|
||||
if [ -z "$eth_type" ]; then
|
||||
case $src_ip$dest_ip in
|
||||
*.*)
|
||||
ip_version=4
|
||||
broute_filter_on_ether_type "IPv4"
|
||||
;;
|
||||
*:*)
|
||||
ip_version=6
|
||||
broute_filter_on_ether_type "IPv6"
|
||||
;;
|
||||
*)
|
||||
if [ -n "$protocol" ] || [ -n "$dscp_filter" ]; then
|
||||
ip_version=1 #neither ether_type nor ip address used
|
||||
#ethertype is not configured by user so install
|
||||
#both proto ipv4 and ipv6 rule
|
||||
BR6_RULE="$BR_RULE"
|
||||
broute_filter_on_ether_type "IPv4"
|
||||
broute_filter_on_ether_type6 "IPv6"
|
||||
fi
|
||||
esac
|
||||
fi
|
||||
esac
|
||||
|
||||
if [ "$ip_version" == "4" ] || [ "$ip_version" == "1" ]; then
|
||||
broute_ipv4_rule_options "$sid"
|
||||
is_l2_rule=1
|
||||
fi
|
||||
|
||||
if [ "$ip_version" == "6" ] || [ "$ip_version" == "1" ]; then
|
||||
broute_ipv6_rule_options "$sid"
|
||||
is_l2_rule=1
|
||||
fi
|
||||
|
||||
# first process options that will help figure our source mac address
|
||||
# dhcp option for "vendor class id"
|
||||
if [ -n "$src_vcid" ]; then
|
||||
src_dhcp_options="$src_dhcp_options vcid=$src_vcid"
|
||||
is_l2_rule=1
|
||||
fi
|
||||
|
||||
# dhcp option for "client id"
|
||||
if [ -n "$src_clid" ]; then
|
||||
src_dhcp_options="$src_dhcp_options clid=$src_clid"
|
||||
is_l2_rule=1
|
||||
fi
|
||||
|
||||
# dhcp option for "user class id"
|
||||
if [ -n "$src_ucid" ]; then
|
||||
src_dhcp_options="$src_dhcp_options ucid=$src_ucid"
|
||||
is_l2_rule=1
|
||||
fi
|
||||
|
||||
# if src mac is already a classification criteria, then it
|
||||
# does not really make sense to add it as a criteria to
|
||||
# filter packets again based on source mac
|
||||
if [ -n "$src_dhcp_options" -a -z "$src_mac" ]; then
|
||||
comp="$(grep -i "$src_dhcp_options" /tmp/dhcp.client.options)"
|
||||
if [ -n "$comp" ]; then
|
||||
s_mac_add="$(echo $comp | head -n1 | awk '{print $1;}')"
|
||||
if [ -n "$s_mac_add" ]; then
|
||||
broute_filter_on_src_mac $s_mac_add
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
# Now process options that will help figure our destination mac address
|
||||
# dhcp option for "vendor class id"
|
||||
if [ -n "$dst_vcid" ]; then
|
||||
dst_dhcp_options="$dst_dhcp_options vcid=$dst_vcid"
|
||||
is_l2_rule=1
|
||||
fi
|
||||
|
||||
# dhcp option for "client id"
|
||||
if [ -n "$dst_clid" ]; then
|
||||
dst_dhcp_options="$dst_dhcp_options clid=$dst_clid"
|
||||
is_l2_rule=1
|
||||
fi
|
||||
|
||||
# dhcp option for "user class id"
|
||||
if [ -n "$dst_ucid" ]; then
|
||||
dst_dhcp_options="$dst_dhcp_options ucid=$dst_ucid"
|
||||
is_l2_rule=1
|
||||
fi
|
||||
|
||||
# if dst mac is already a classification criteria, then it
|
||||
# does not really make sense to add it as a criteria to
|
||||
# filter packets again based on dstination mac
|
||||
if [ -n "$dst_dhcp_options" -a -z "$dst_mac" ]; then
|
||||
comp="$(grep -i "$dst_dhcp_options" /tmp/dhcp.client.options)"
|
||||
if [ -n "$comp" ]; then
|
||||
d_mac_add="$(echo $comp | head -n1 | awk '{print $1;}')"
|
||||
if [ -n "$d_mac_add" ]; then
|
||||
broute_filter_on_dst_mac $d_mac_add
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ $is_l2_rule -eq 0 ]; then
|
||||
#no need to configure disabled policer
|
||||
if [ $is_enable == '0' ]; then
|
||||
return
|
||||
fi
|
||||
|
||||
[ -n "$traffic_class" ] && broute_rule_set_traffic_class $traffic_class
|
||||
config_get cir "$p_sec" "committed_rate"
|
||||
config_get cbs "$p_sec" "committed_burst_size" -1
|
||||
config_get ebs "$p_sec" "excess_burst_size" 0
|
||||
config_get pir "$p_sec" "peak_rate" 0
|
||||
config_get pbs "$p_sec" "peak_burst_size" 0
|
||||
config_get meter "$p_sec" "meter_type" 0
|
||||
|
||||
[ -n "$BR_RULE" ] && broute_append_rule
|
||||
# Call tmctl which is a broadcomm command to configure policer.
|
||||
tmctl createpolicer --dir $dir --pid $POLICER_COUNT --ptype $meter --cir $cir --cbs $cbs --ebs $ebs --pir $pir --pbs $pbs
|
||||
|
||||
POLICER_COUNT=$((POLICER_COUNT + 1))
|
||||
}
|
||||
|
||||
init_iptables_rule() {
|
||||
IP_RULE=""
|
||||
}
|
||||
#function to handle a shaper section
|
||||
handle_shaper() {
|
||||
sid="$1" #queue section ID
|
||||
|
||||
iptables_filter_intf() {
|
||||
IP_RULE="$IP_RULE -i $1"
|
||||
}
|
||||
|
||||
iptables_filter_proto() {
|
||||
IP_RULE="$IP_RULE -p $1"
|
||||
}
|
||||
|
||||
iptables_filter_ip_src() {
|
||||
IP_RULE="$IP_RULE -s $1"
|
||||
}
|
||||
|
||||
iptables_filter_ip_dest() {
|
||||
IP_RULE="$IP_RULE -d $1"
|
||||
}
|
||||
|
||||
iptables_filter_port_dest() {
|
||||
IP_RULE="$IP_RULE --dport $1"
|
||||
}
|
||||
|
||||
iptables_filter_port_src() {
|
||||
IP_RULE="$IP_RULE --sport $1"
|
||||
}
|
||||
|
||||
iptables_filter_port_dest_range() {
|
||||
IP_RULE="$IP_RULE --dport $1:$2"
|
||||
}
|
||||
|
||||
iptables_filter_port_src_range() {
|
||||
IP_RULE="$IP_RULE --sport $1:$2"
|
||||
}
|
||||
|
||||
iptables_filter_dscp_filter() {
|
||||
IP_RULE="$IP_RULE -m dscp --dscp $1"
|
||||
}
|
||||
|
||||
iptables_filter_ip_len_min() {
|
||||
IP_RULE="$IP_RULE -m length --length $1"
|
||||
}
|
||||
|
||||
iptables_filter_ip_len_max() {
|
||||
IP_RULE="$IP_RULE:$1"
|
||||
}
|
||||
|
||||
iptables_set_dscp_mark() {
|
||||
IP_RULE="$IP_RULE -j DSCP --set-dscp $1"
|
||||
}
|
||||
|
||||
iptables_set_traffic_class() {
|
||||
IP_RULE="$IP_RULE -j MARK --set-xmark 0x$1/0x$1"
|
||||
}
|
||||
|
||||
append_rule_to_mangle_table() {
|
||||
if [ $2 == 4 ]; then
|
||||
echo "iptables -w -t mangle -A $1 $IP_RULE" >> /tmp/qos/classify.iptables
|
||||
elif [ $2 == 6 ]; then
|
||||
echo "ip6tables -w -t mangle -A $1 $IP_RULE" >> /tmp/qos/classify.ip6tables
|
||||
elif [ $2 == 1 ]; then
|
||||
echo "iptables -w -t mangle -A $1 $IP_RULE" >> /tmp/qos/classify.iptables
|
||||
echo "ip6tables -w -t mangle -A $1 $IP_RULE" >> /tmp/qos/classify.ip6tables
|
||||
fi
|
||||
}
|
||||
|
||||
handle_iptables_rules() {
|
||||
cid=$1
|
||||
local ip_version=0
|
||||
local is_l3_rule=0
|
||||
|
||||
init_iptables_rule
|
||||
config_get proto "$cid" "proto"
|
||||
config_get traffic_class "$cid" "traffic_class"
|
||||
config_get dscp_mark "$cid" "dscp_mark"
|
||||
config_get dscp_filter "$cid" "dscp_filter"
|
||||
config_get dest_port "$cid" "dest_port"
|
||||
config_get dest_port_range "$cid" "dest_port_range"
|
||||
config_get src_port "$cid" "src_port"
|
||||
config_get src_port_range "$cid" "src_port_range"
|
||||
config_get dest_ip "$cid" "dest_ip"
|
||||
config_get src_ip "$cid" "src_ip"
|
||||
config_get ip_len_min "$cid" "ip_len_min"
|
||||
config_get ip_len_max "$cid" "ip_len_max"
|
||||
config_get ifname "$cid" "ifname"
|
||||
|
||||
#check version of ip
|
||||
case $src_ip$dest_ip in
|
||||
*.*)
|
||||
ip_version=4
|
||||
;;
|
||||
*:*)
|
||||
ip_version=6
|
||||
;;
|
||||
*)
|
||||
ip_version=1 #ip address not used
|
||||
esac
|
||||
|
||||
#filter interface
|
||||
if [ -n "$ifname" ]; then
|
||||
if [ "$ifname" != "lo" ]; then
|
||||
iptables_filter_intf $ifname
|
||||
fi
|
||||
fi
|
||||
|
||||
# filter proto
|
||||
if [ -n "$proto" ]; then
|
||||
iptables_filter_proto $proto
|
||||
is_l3_rule=1
|
||||
fi
|
||||
|
||||
#filter src. ip
|
||||
if [ -n "$src_ip" ]; then
|
||||
iptables_filter_ip_src $src_ip
|
||||
is_l3_rule=1
|
||||
fi
|
||||
|
||||
#filter dest. ip
|
||||
if [ -n "$dest_ip" ]; then
|
||||
iptables_filter_ip_dest $dest_ip
|
||||
is_l3_rule=1
|
||||
fi
|
||||
|
||||
#filter dest. port
|
||||
if [ -n "$dest_port" -a -z "$dest_port_range" ]; then
|
||||
iptables_filter_port_dest $dest_port
|
||||
is_l3_rule=1
|
||||
fi
|
||||
|
||||
#filter src. port
|
||||
if [ -n "$src_port" -a -z "$src_port_range" ]; then
|
||||
iptables_filter_port_src $src_port
|
||||
is_l3_rule=1
|
||||
fi
|
||||
|
||||
#filter dest. port range
|
||||
if [ -n "$dest_port" -a -n "$dest_port_range" ]; then
|
||||
iptables_filter_port_dest_range $dest_port $dest_port_range
|
||||
is_l3_rule=1
|
||||
fi
|
||||
|
||||
#filter src. port range
|
||||
if [ -n "$src_port" -a -n "$src_port_range" ]; then
|
||||
iptables_filter_port_src_range $src_port $src_port_range
|
||||
is_l3_rule=1
|
||||
fi
|
||||
|
||||
#filter dscp
|
||||
if [ -n "$dscp_filter" ]; then
|
||||
iptables_filter_dscp_filter $dscp_filter
|
||||
is_l3_rule=1
|
||||
fi
|
||||
|
||||
#filter min. IP packet len.
|
||||
if [ -n "$ip_len_min" ]; then
|
||||
iptables_filter_ip_len_min $ip_len_min
|
||||
is_l3_rule=1
|
||||
fi
|
||||
|
||||
#filter max. IP packet len.
|
||||
if [ -n "$ip_len_max" ]; then
|
||||
iptables_filter_ip_len_max $ip_len_max
|
||||
is_l3_rule=1
|
||||
fi
|
||||
|
||||
if [ $is_l3_rule -eq 0 ]; then
|
||||
config_get is_enable "$sid" "enable"
|
||||
# no need to configure disabled queues
|
||||
if [ $is_enable == '0' ]; then
|
||||
return
|
||||
fi
|
||||
|
||||
#set dscp mark
|
||||
[ -n "$dscp_mark" ] && iptables_set_dscp_mark $dscp_mark
|
||||
|
||||
#set packet queue mark
|
||||
[ -n "$traffic_class" ] && iptables_set_traffic_class $traffic_class
|
||||
|
||||
#write iptables rule for dscp marking
|
||||
[ -n "$IP_RULE" -a -n "$dscp_mark" ] && append_rule_to_mangle_table "qos_forward" $ip_version
|
||||
|
||||
if [ -n "$IP_RULE" -a -n "$traffic_class" ]; then
|
||||
if [ "$ifname" == "lo" ]; then
|
||||
#write iptables rule for putting WAN directed internal packets in different queue
|
||||
append_rule_to_mangle_table "qos_output" $ip_version
|
||||
else
|
||||
#write iptables rule for putting WAN directed LAN packets in different queue
|
||||
append_rule_to_mangle_table "qos_prerouting" $ip_version
|
||||
fi
|
||||
config_get ifname "$sid" "ifname"
|
||||
# if ifname is empty that is good enough to break
|
||||
if [ -z "$ifname" ];then
|
||||
return
|
||||
fi
|
||||
|
||||
config_get rate "$sid" "rate"
|
||||
# Convert the rate from bps to kbps.
|
||||
if [ $rate -lt 1000 ];then
|
||||
return
|
||||
fi
|
||||
|
||||
rate=$(($rate / 1000))
|
||||
config_get bs "$sid" "burst_size"
|
||||
tmctl setportshaper --devtype 0 --if $ifname --shapingrate $rate --burstsize $bs
|
||||
}
|
||||
|
||||
assign_policer_to_port() {
|
||||
@@ -1015,66 +397,6 @@ config_ingress_rate_limit() {
|
||||
ethswctl -c rxratectrl -n $unit -p $port -x $ingress_rate -y $in_burst_size
|
||||
}
|
||||
|
||||
# Function to handle a classify order
|
||||
handle_classify_order() {
|
||||
local cid="$1" #classify section ID
|
||||
|
||||
config_get is_enable "$cid" "enable" 1
|
||||
|
||||
# No need to configure disabled classify
|
||||
if [ $is_enable == '0' ]; then
|
||||
return
|
||||
fi
|
||||
|
||||
# Create classify file containing classify order
|
||||
local corder_file="/tmp/qos/classify.order"
|
||||
|
||||
config_get c_order "$cid" "order"
|
||||
|
||||
if [ -z "$c_order" ]; then
|
||||
c_order=$temp_order;
|
||||
temp_order=$((temp_order + 1))
|
||||
fi
|
||||
|
||||
value=${c_order}_${cid}
|
||||
echo $value >> $corder_file
|
||||
|
||||
}
|
||||
|
||||
# Sort classify, lower value in uci means higher precedence, so this
|
||||
# function sorts the classify order in assending order
|
||||
sort_classify_by_order() {
|
||||
local corder_file="/tmp/qos/classify.order"
|
||||
local tmp_corder_file="/tmp/qos/tmp_classify.order"
|
||||
|
||||
sort -n -k1 $corder_file > $tmp_corder_file
|
||||
cp $tmp_corder_file $corder_file
|
||||
rm -f $tmp_corder_file
|
||||
}
|
||||
|
||||
#function to handle a classify section
|
||||
handle_classify() {
|
||||
|
||||
local corder_file="/tmp/qos/classify.order"
|
||||
|
||||
while read -r line; do
|
||||
line_cid=${line#*_}
|
||||
|
||||
# add ip rule only for classify rules which has non empty
|
||||
# value forwarding policy option
|
||||
# if forwarding policy option value empty then add iptables/
|
||||
# ip6tables/ebtables/rate_limit rules
|
||||
config_get fwding_policy "$line_cid" "forwarding_policy"
|
||||
if [ -n "$fwding_policy" ]; then
|
||||
handle_ip_rule $line_cid $fwding_policy
|
||||
else
|
||||
handle_ebtables_rules $line_cid
|
||||
handle_iptables_rules $line_cid
|
||||
handle_policer_rules $line_cid
|
||||
fi
|
||||
done < "$corder_file"
|
||||
}
|
||||
|
||||
configure_shaper() {
|
||||
# Delete existing shaper
|
||||
for intf in $(db get hw.board.ethernetPortOrder); do
|
||||
@@ -1086,49 +408,6 @@ configure_shaper() {
|
||||
config_foreach handle_shaper shaper
|
||||
}
|
||||
|
||||
configure_classify() {
|
||||
#processing classify section
|
||||
# First remove old files
|
||||
rm -f /tmp/qos/classify.ebtables
|
||||
rm -f /tmp/qos/classify.iptables
|
||||
rm -f /tmp/qos/classify.ip6tables
|
||||
rm -f /tmp/qos/classify.order
|
||||
rm -f /tmp/qos/tmp_classify.order
|
||||
rm -f /tmp/qos/classify.iprule
|
||||
|
||||
#create files that will contain the rules if not present already
|
||||
mkdir -p /tmp/qos/
|
||||
touch /tmp/qos/classify.iptables
|
||||
touch /tmp/qos/classify.ip6tables
|
||||
touch /tmp/qos/classify.ebtables
|
||||
touch /tmp/qos/classify.order
|
||||
touch /tmp/qos/tmp_classify.order
|
||||
touch /tmp/qos/classify.iprule
|
||||
|
||||
#add flush chain rules
|
||||
flush_chains
|
||||
|
||||
#flush added ip rule
|
||||
flush_ip_rule
|
||||
|
||||
# Load UCI file
|
||||
config_load qos
|
||||
config_foreach handle_classify_order classify
|
||||
sort_classify_by_order
|
||||
handle_classify
|
||||
|
||||
sh /tmp/qos/classify.ebtables
|
||||
sh /tmp/qos/classify.iptables
|
||||
sh /tmp/qos/classify.ip6tables
|
||||
sh /tmp/qos/classify.iprule
|
||||
|
||||
# broadcom recommends that each time traffic class is set,
|
||||
# the flows should be flushed for the new mapping to take
|
||||
# effect, it then makes sense to make it a part of the
|
||||
# qosmngr package itself.
|
||||
fcctl flush
|
||||
}
|
||||
|
||||
pre_configure_queue() {
|
||||
# Delete queues
|
||||
for intf in $(db get hw.board.ethernetPortOrder); do
|
||||
@@ -1218,6 +497,14 @@ configure_qos() {
|
||||
configure_queue
|
||||
configure_policer
|
||||
configure_classify
|
||||
if [ -f "/tmp/qos/classify.ebtables" ]; then
|
||||
sh /tmp/qos/classify.ebtables
|
||||
fi
|
||||
# broadcom recommends that each time traffic class is set,
|
||||
# the flows should be flushed for the new mapping to take
|
||||
# effect, it then makes sense to make it a part of the
|
||||
# qosmngr package itself.
|
||||
fcctl flush
|
||||
}
|
||||
|
||||
reload_qos() {
|
||||
@@ -1236,6 +523,14 @@ reload_qos() {
|
||||
configure_queue
|
||||
elif [ "$service_name" == "classify" ]; then
|
||||
configure_classify
|
||||
if [ -f "/tmp/qos/classify.ebtables" ]; then
|
||||
sh /tmp/qos/classify.ebtables
|
||||
fi
|
||||
# broadcom recommends that each time traffic class is set,
|
||||
# the flows should be flushed for the new mapping to take
|
||||
# effect, it then makes sense to make it a part of the
|
||||
# qosmngr package itself.
|
||||
fcctl flush
|
||||
elif [ "$service_name" == "policer" ]; then
|
||||
configure_policer
|
||||
fi
|
||||
|
||||
@@ -1,27 +1,19 @@
|
||||
#!/bin/sh
|
||||
|
||||
. /lib/functions.sh
|
||||
. /lib/qos/qos.sh
|
||||
|
||||
ethwan="$(db -q get hw.board.ethernetWanPort)"
|
||||
cpu_model="$(cat /proc/socinfo | grep 'SoC Name' | cut -d':' -f2)"
|
||||
|
||||
queue_num=8
|
||||
|
||||
populate_no_of_queue(){
|
||||
case $cpu_model in
|
||||
BCM68[3,4,5]*) queue_num=4 ;;
|
||||
esac
|
||||
if grep -qE '[0-9]+ archer$' /proc/devices; then
|
||||
queue_num=4
|
||||
fi
|
||||
|
||||
# writing no. of queue per port into file and read on classify generate
|
||||
if [ ! -d "/tmp/qos" ]; then
|
||||
mkdir -p "/tmp/qos"
|
||||
fi
|
||||
no_queue_file="/tmp/qos/no_queue_per_port"
|
||||
touch "$no_queue_file"
|
||||
echo $queue_num >"$no_queue_file"
|
||||
echo $1 >"$no_queue_file"
|
||||
}
|
||||
|
||||
generate_queue(){
|
||||
@@ -30,13 +22,16 @@ generate_queue(){
|
||||
config_get ifname "$section" "ifname"
|
||||
|
||||
local is_lan=0
|
||||
queue_num=$(qosmngr -q $ifname)
|
||||
|
||||
if [ "$ifname" != "$ethwan" ]; then
|
||||
is_lan=1
|
||||
populate_no_of_queue $queue_num
|
||||
fi
|
||||
|
||||
local no_of_q="0 1 2 3 4 5 6 7"
|
||||
|
||||
if [ $is_lan -eq 1 ] -a [ $queue_num -eq 4 ]; then
|
||||
if [ $is_lan -eq 1 ] && [ $queue_num -eq 4 ]; then
|
||||
no_of_q="0 1 2 3"
|
||||
fi
|
||||
|
||||
@@ -50,16 +45,14 @@ generate_queue(){
|
||||
uci set qos.@queue[-1].ifname="$ifname"
|
||||
uci set qos.@queue[-1].precedence="$order"
|
||||
uci set qos.@queue[-1].scheduling="SP"
|
||||
uci set qos.@queue[-1].rate="0"
|
||||
uci set qos.@queue[-1].burst_size="0"
|
||||
uci set qos.@queue[-1].rate=$(get_rate_per_queue)
|
||||
uci set qos.@queue[-1].burst_size=$(get_burst_size_per_queue)
|
||||
uci set qos.@queue[-1].weight="1"
|
||||
done
|
||||
|
||||
uci commit qos
|
||||
}
|
||||
|
||||
populate_no_of_queue
|
||||
|
||||
if [ -s "/etc/config/qos" ]; then
|
||||
if uci -q get qos.@queue[0] >/dev/null; then
|
||||
exit
|
||||
@@ -60,7 +60,6 @@ generate_icmp_rule(){
|
||||
|
||||
generate_classify(){
|
||||
|
||||
|
||||
no_queue_file="/tmp/qos/no_queue_per_port"
|
||||
queue_num=$(cat "$no_queue_file")
|
||||
rm -f "$no_queue_file"
|
||||
|
||||
@@ -45,7 +45,7 @@ handle_classify() {
|
||||
local corder_file="/tmp/qos/classify.order"
|
||||
|
||||
while read -r line; do
|
||||
line_cid=$(echo $line | cut -d '_' -f 2)
|
||||
line_cid=${line#*_}
|
||||
|
||||
# add ip rule only for classify rules which has non empty
|
||||
# value forwarding policy option
|
||||
@@ -94,9 +94,25 @@ configure_classify() {
|
||||
sort_classify_by_order
|
||||
handle_classify
|
||||
|
||||
sh /tmp/qos/classify.ebtables
|
||||
sh /tmp/qos/classify.iptables
|
||||
sh /tmp/qos/classify.ip6tables
|
||||
sh /tmp/qos/classify.iprule
|
||||
|
||||
}
|
||||
|
||||
setup_qos() {
|
||||
if [ ! -d "/tmp/qos" ]; then
|
||||
mkdir -p /tmp/qos
|
||||
fi
|
||||
if [ ! -f "/tmp/qos/qos" ]; then
|
||||
touch /tmp/qos/qos
|
||||
cp /etc/config/qos /tmp/qos/qos
|
||||
fi
|
||||
|
||||
create_ebtables_chains
|
||||
create_iptables_chains
|
||||
}
|
||||
|
||||
flush_chains() {
|
||||
flush_ebtables_chains
|
||||
flush_iptables_chains
|
||||
}
|
||||
405
qosmngr/files/common/lib/qos/ebtables.sh
Executable file
405
qosmngr/files/common/lib/qos/ebtables.sh
Executable file
@@ -0,0 +1,405 @@
|
||||
#!/bin/sh
|
||||
# Install ebtables rules
|
||||
|
||||
BR_RULE=""
|
||||
BR6_RULE=""
|
||||
|
||||
init_broute_rule() {
|
||||
BR_RULE=""
|
||||
BR6_RULE=""
|
||||
}
|
||||
|
||||
broute_filter_on_src_if() {
|
||||
BR_RULE="$BR_RULE --in-if $1"
|
||||
}
|
||||
|
||||
broute_filter_on_src_mac() {
|
||||
BR_RULE="$BR_RULE --src $1"
|
||||
}
|
||||
|
||||
broute_filter_on_dst_mac() {
|
||||
BR_RULE="$BR_RULE --dst $1"
|
||||
}
|
||||
|
||||
broute_filter_on_pcp() {
|
||||
# 5.04 onwards the vlan extension in ebtables is used for classification
|
||||
# on the basis of vlan params which needs proto to be defined as 802_1Q in
|
||||
# order to add a rule, now, proto can also be defined by specifying proto uci
|
||||
# option as well as the rule may have a vlan id as well in which case the
|
||||
# proto will already be present, hence, this check to not add --proto more
|
||||
# than once
|
||||
case "$BR_RULE" in
|
||||
*proto*)
|
||||
BR_RULE="$BR_RULE --vlan-prio $1"
|
||||
;;
|
||||
*)
|
||||
BR_RULE="$BR_RULE --proto 802_1Q --vlan-prio $1"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
broute_filter_on_ether_type() {
|
||||
BR_RULE="$BR_RULE --proto $1"
|
||||
}
|
||||
|
||||
broute_filter_on_ether_type6() {
|
||||
BR6_RULE="$BR6_RULE --proto IPv6"
|
||||
}
|
||||
|
||||
ebt_match_src_ip() {
|
||||
BR_RULE="$BR_RULE --ip-src $1"
|
||||
}
|
||||
|
||||
ebt_match_dst_ip() {
|
||||
BR_RULE="$BR_RULE --ip-dst $1"
|
||||
}
|
||||
|
||||
ebt_match_ipv6_src_ip() {
|
||||
BR_RULE="$BR_RULE --ip6-src $1"
|
||||
}
|
||||
|
||||
ebt_match_ipv6_dst_ip() {
|
||||
BR_RULE="$BR_RULE --ip6-dst $1"
|
||||
}
|
||||
|
||||
ebt_match_ip_src_port() {
|
||||
BR_RULE="$BR_RULE --ip-source-port $1"
|
||||
}
|
||||
|
||||
ebt_match_ip_dst_port() {
|
||||
BR_RULE="$BR_RULE --ip-destination-port $1"
|
||||
}
|
||||
|
||||
ebt_match_ipv6_src_port() {
|
||||
#when ethertype is not configured by user then both proto rules of ipv4
|
||||
#and ipv6 to be installed so update BR6_RULE string as well otherwise
|
||||
#update BR_RULE only for installation of ipv6 proto rule only.
|
||||
if [ -n "$BR6_RULE" ]; then
|
||||
BR6_RULE="$BR6_RULE --ip6-source-port $1"
|
||||
else
|
||||
BR_RULE="$BR_RULE --ip6-source-port $1"
|
||||
fi
|
||||
}
|
||||
|
||||
ebt_match_ipv6_dst_port() {
|
||||
#when ethertype is not configured by user then both proto rules of ipv4
|
||||
#and ipv6 to be installed so update BR6_RULE string as well otherwise
|
||||
#update BR_RULE only for installation of ipv6 proto rule only.
|
||||
if [ -n "$BR6_RULE" ]; then
|
||||
BR6_RULE="$BR6_RULE --ip6-destination-port $1"
|
||||
else
|
||||
BR_RULE="$BR_RULE --ip6-destination-port $1"
|
||||
fi
|
||||
}
|
||||
|
||||
ebt_match_ip_protocol() {
|
||||
BR_RULE="$BR_RULE --ip-proto $1"
|
||||
}
|
||||
|
||||
ebt_match_ipv6_protocol() {
|
||||
#when ethertype is not configured by user then both proto rules of ipv4
|
||||
#and ipv6 to be installed so update BR6_RULE string as well otherwise
|
||||
#update BR_RULE only for installation of ipv6 proto rule only.
|
||||
if [ -n "$BR6_RULE" ]; then
|
||||
BR6_RULE="$BR6_RULE --ip6-proto $1"
|
||||
else
|
||||
BR_RULE="$BR_RULE --ip6-proto $1"
|
||||
fi
|
||||
}
|
||||
|
||||
broute_filter_on_vid() {
|
||||
|
||||
if [ -z "$1" ] || [ "$1" -lt 0 ]; then
|
||||
return
|
||||
fi
|
||||
|
||||
case "$BR_RULE" in
|
||||
*proto*)
|
||||
BR_RULE="$BR_RULE --vlan-id $1"
|
||||
;;
|
||||
*)
|
||||
BR_RULE="$BR_RULE --proto 802_1Q --vlan-id $1"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
broute_append_rule() {
|
||||
#when ethertype is not configured by user then both proto rules of ipv4
|
||||
#and ipv6 to be installed otherwise install ipv6 proto rule only.
|
||||
echo "ebtables -t broute -A qos $BR_RULE" >> /tmp/qos/classify.ebtables
|
||||
if [ -n "$BR6_RULE" ]; then
|
||||
echo "ebtables -t broute -A qos $BR6_RULE" >> /tmp/qos/classify.ebtables
|
||||
fi
|
||||
}
|
||||
|
||||
set_ip_addr()
|
||||
{
|
||||
local cid="$1"
|
||||
local match_src_ip_func="$2"
|
||||
local match_dst_ip_func="$3"
|
||||
|
||||
config_get src_ip "$cid" "src_ip"
|
||||
config_get dst_ip "$cid" "dest_ip"
|
||||
|
||||
if [ -n "$src_ip" ]; then
|
||||
$match_src_ip_func "$src_ip"
|
||||
fi
|
||||
|
||||
if [ -n "$dst_ip" ]; then
|
||||
$match_dst_ip_func "$dst_ip"
|
||||
fi
|
||||
}
|
||||
|
||||
set_ports()
|
||||
{
|
||||
local cid="$1"
|
||||
local match_src_port_func="$2"
|
||||
local match_dst_port_func="$3"
|
||||
local src_port=""
|
||||
local dst_port=""
|
||||
local src_port_range=""
|
||||
local dst_port_range=""
|
||||
|
||||
config_get src_port "$cid" "src_port"
|
||||
config_get dst_port "$cid" "dest_port"
|
||||
config_get src_port_range "$cid" "src_port_range"
|
||||
config_get dst_port_range "$cid" "dest_port_range"
|
||||
|
||||
if [ -n "$src_port" ] && [ -n "$src_port_range" ] ; then
|
||||
$match_src_port_func "$src_port:$src_port_range"
|
||||
elif [ -n "$src_port" ] ; then
|
||||
$match_src_port_func "$src_port"
|
||||
fi
|
||||
|
||||
if [ -n "$dst_port" ] && [ -n "$dst_port_range" ] ; then
|
||||
$match_dst_port_func "$dst_port:$dst_port_range"
|
||||
elif [ -n "$dst_port" ] ; then
|
||||
$match_dst_port_func "$dst_port"
|
||||
fi
|
||||
}
|
||||
|
||||
protocol_string_to_num()
|
||||
{
|
||||
local value="-1"
|
||||
|
||||
case "$1" in
|
||||
*[0-9]*)
|
||||
value="$1"
|
||||
;;
|
||||
TCP|tcp)
|
||||
value=6
|
||||
;;
|
||||
UDP|udp)
|
||||
value=17
|
||||
;;
|
||||
ICMP|icmp)
|
||||
value=1
|
||||
;;
|
||||
ICMPv6|icmpv6)
|
||||
value=58
|
||||
;;
|
||||
IGMP|igmp)
|
||||
value=2
|
||||
;;
|
||||
SCTP|sctp)
|
||||
value=132
|
||||
;;
|
||||
*)
|
||||
value=-1
|
||||
;;
|
||||
esac
|
||||
echo $value
|
||||
}
|
||||
|
||||
handle_ebtables_rules() {
|
||||
local sid="$1"
|
||||
local is_l2_rule=0
|
||||
local src_dhcp_options=""
|
||||
local dst_dhcp_options=""
|
||||
local protocol=""
|
||||
local ip_version=""
|
||||
|
||||
init_broute_rule
|
||||
|
||||
config_get src_if "$sid" "ifname"
|
||||
config_get src_mac "$sid" "src_mac"
|
||||
config_get dst_mac "$sid" "dst_mac"
|
||||
config_get dscp_filter "$sid" "dscp_filter"
|
||||
config_get pcp_check "$sid" "pcp_check"
|
||||
config_get eth_type "$sid" "ethertype"
|
||||
config_get vid "$sid" "vid_check"
|
||||
config_get dhcp_type "$sid" "dhcp_type" # dhcpv4 or v6
|
||||
config_get src_vcid "$sid" "src_vendor_class_id" # dhcp option 60
|
||||
config_get dst_vcid "$sid" "dst_vendor_class_id" # dhcp option 60
|
||||
config_get src_clid "$sid" "src_client_id" # dhcp option 61
|
||||
config_get dst_clid "$sid" "dst_client_id" # dhcp option 61
|
||||
config_get src_ucid "$sid" "src_user_class_id" # dhcp option 77
|
||||
config_get dst_ucid "$sid" "dst_user_class_id" # dhcp option 77
|
||||
config_get traffic_class "$sid" "traffic_class"
|
||||
config_get protocol "$sid" "proto"
|
||||
|
||||
if [ -n "$src_if" ]; then
|
||||
for interf in $(db -q get hw.board.ethernetPortOrder); do
|
||||
if [ "$src_if" == "$interf" ]; then
|
||||
src_if="$src_if+"
|
||||
broute_filter_on_src_if "$src_if"
|
||||
is_l2_rule=1
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
if [ -n "$src_mac" ]; then
|
||||
broute_filter_on_src_mac "$src_mac"
|
||||
is_l2_rule=1
|
||||
fi
|
||||
|
||||
if [ -n "$dst_mac" ]; then
|
||||
broute_filter_on_dst_mac "$dst_mac"
|
||||
is_l2_rule=1
|
||||
fi
|
||||
|
||||
if [ -n "$pcp_check" ]; then
|
||||
broute_filter_on_pcp "$pcp_check"
|
||||
is_l2_rule=1
|
||||
fi
|
||||
|
||||
if [ -n "$eth_type" ]; then
|
||||
broute_filter_on_ether_type "$eth_type"
|
||||
is_l2_rule=1
|
||||
fi
|
||||
|
||||
if [ -n "$vid" ]; then
|
||||
broute_filter_on_vid "$vid"
|
||||
is_l2_rule=1
|
||||
fi
|
||||
|
||||
case $eth_type in
|
||||
IPv4|IPV4|0800)
|
||||
ip_version=4
|
||||
;;
|
||||
IPv6|IPV6|86DD)
|
||||
ip_version=6
|
||||
;;
|
||||
*)
|
||||
if [ -z "$eth_type" ]; then
|
||||
case "$src_ip$dst_ip" in
|
||||
*.*)
|
||||
ip_version=4
|
||||
broute_filter_on_ether_type "IPv4"
|
||||
;;
|
||||
*:*)
|
||||
ip_version=6
|
||||
broute_filter_on_ether_type "IPv6"
|
||||
;;
|
||||
*)
|
||||
if [ -n "$protocol" ] || [ -n "$dscp_filter" ]; then
|
||||
# Neither ether_type nor ip address used,
|
||||
# ethertype is not configured by user, so install
|
||||
# both proto IPv4 and IPv6 rule (version 1)
|
||||
ip_version=1
|
||||
BR6_RULE="$BR_RULE"
|
||||
broute_filter_on_ether_type "IPv4"
|
||||
broute_filter_on_ether_type6 "IPv6"
|
||||
fi
|
||||
esac
|
||||
fi
|
||||
esac
|
||||
|
||||
if [ "$ip_version" == "4" ] || [ "$ip_version" == "1" ]; then
|
||||
broute_ipv4_rule_options "$sid"
|
||||
is_l2_rule=1
|
||||
fi
|
||||
|
||||
if [ "$ip_version" == "6" ] || [ "$ip_version" == "1" ]; then
|
||||
broute_ipv6_rule_options "$sid"
|
||||
is_l2_rule=1
|
||||
fi
|
||||
|
||||
# first process options that will help figure our source mac address
|
||||
# dhcp option for "vendor class id"
|
||||
if [ -n "$src_vcid" ]; then
|
||||
src_dhcp_options="$src_dhcp_options vcid=$src_vcid"
|
||||
is_l2_rule=1
|
||||
fi
|
||||
|
||||
# dhcp option for "client id"
|
||||
if [ -n "$src_clid" ]; then
|
||||
src_dhcp_options="$src_dhcp_options clid=$src_clid"
|
||||
is_l2_rule=1
|
||||
fi
|
||||
|
||||
# dhcp option for "user class id"
|
||||
if [ -n "$src_ucid" ]; then
|
||||
src_dhcp_options="$src_dhcp_options ucid=$src_ucid"
|
||||
is_l2_rule=1
|
||||
fi
|
||||
|
||||
# if src mac is already a classification criteria, then it
|
||||
# does not really make sense to add it as a criteria to
|
||||
# filter packets again based on source mac
|
||||
if [ -n "$src_dhcp_options" ] && [ -z "$src_mac" ]; then
|
||||
comp="$(grep -i "$src_dhcp_options" /tmp/dhcp.client.options)"
|
||||
if [ -n "$comp" ]; then
|
||||
s_mac_add="$(echo $comp | head -n1 | awk '{print $1;}')"
|
||||
if [ -n "$s_mac_add" ]; then
|
||||
broute_filter_on_src_mac "$s_mac_add"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
# Now process options that will help figure our destination mac address
|
||||
# dhcp option for "vendor class id"
|
||||
if [ -n "$dst_vcid" ]; then
|
||||
dst_dhcp_options="$dst_dhcp_options vcid=$dst_vcid"
|
||||
is_l2_rule=1
|
||||
fi
|
||||
|
||||
# dhcp option for "client id"
|
||||
if [ -n "$dst_clid" ]; then
|
||||
dst_dhcp_options="$dst_dhcp_options clid=$dst_clid"
|
||||
is_l2_rule=1
|
||||
fi
|
||||
|
||||
# dhcp option for "user class id"
|
||||
if [ -n "$dst_ucid" ]; then
|
||||
dst_dhcp_options="$dst_dhcp_options ucid=$dst_ucid"
|
||||
is_l2_rule=1
|
||||
fi
|
||||
|
||||
# if dst mac is already a classification criteria, then it
|
||||
# does not really make sense to add it as a criteria to
|
||||
# filter packets again based on destination mac
|
||||
if [ -n "$dst_dhcp_options" ] && [ -z "$dst_mac" ] ; then
|
||||
comp="$(grep -i "$dst_dhcp_options" /tmp/dhcp.client.options)"
|
||||
if [ -n "$comp" ]; then
|
||||
d_mac_add="$(echo $comp | head -n1 | awk '{print $1;}')"
|
||||
if [ -n "$d_mac_add" ]; then
|
||||
broute_filter_on_dst_mac "$d_mac_add"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ $is_l2_rule -eq 0 ]; then
|
||||
return
|
||||
fi
|
||||
|
||||
[ -n "$traffic_class" ] && broute_rule_set_traffic_class "$traffic_class"
|
||||
|
||||
[ -n "$BR_RULE" ] && broute_append_rule
|
||||
}
|
||||
|
||||
create_ebtables_chains() {
|
||||
ebtables -t broute -N qos
|
||||
ret=$?
|
||||
if [ $ret -eq 0 ]; then
|
||||
ebtables -t broute -I BROUTING -j qos
|
||||
else
|
||||
ebtables -t broute -D BROUTING -j qos
|
||||
ebtables -t broute -I BROUTING -j qos
|
||||
fi
|
||||
}
|
||||
|
||||
flush_ebtables_chains() {
|
||||
echo "ebtables -t broute -F qos" > /tmp/qos/classify.ebtables
|
||||
}
|
||||
|
||||
4
qosmngr/files/common/lib/qos/ip_rule.sh
Normal file → Executable file
4
qosmngr/files/common/lib/qos/ip_rule.sh
Normal file → Executable file
@@ -40,7 +40,9 @@ ip_rule_match_src_port_range() {
|
||||
}
|
||||
|
||||
ip_rule_match_tos() {
|
||||
IP_RULE="$IP_RULE tos $1"
|
||||
dscp_filter=$1
|
||||
tos_val=$((dscp_filter<<2))
|
||||
IP_RULE="$IP_RULE tos 0x$tos_val"
|
||||
}
|
||||
|
||||
ip_rule_match_fwmark() {
|
||||
|
||||
@@ -1,57 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
. /lib/functions.sh
|
||||
|
||||
ethwan="$(db -q get hw.board.ethernetWanPort)"
|
||||
|
||||
populate_no_of_queue(){
|
||||
queue_num=8
|
||||
|
||||
# writing no. of queue per port into file and read on classify generate
|
||||
if [ ! -d "/tmp/qos" ]; then
|
||||
mkdir -p "/tmp/qos"
|
||||
fi
|
||||
no_queue_file="/tmp/qos/no_queue_per_port"
|
||||
touch "$no_queue_file"
|
||||
echo $queue_num >"$no_queue_file"
|
||||
}
|
||||
|
||||
generate_queue(){
|
||||
section="$1"
|
||||
|
||||
config_get ifname "$section" "ifname"
|
||||
|
||||
local no_of_q="0 1 2 3 4 5 6 7"
|
||||
|
||||
i=0
|
||||
local total_q=$((${no_of_q##* } + 1))
|
||||
for i in $no_of_q; do
|
||||
order=$((total_q - i))
|
||||
uci add qos queue
|
||||
uci rename qos.@queue[-1]="q_${i}_${ifname}"
|
||||
uci set qos.@queue[-1].enable="1"
|
||||
uci set qos.@queue[-1].ifname="$ifname"
|
||||
uci set qos.@queue[-1].precedence="$order"
|
||||
uci set qos.@queue[-1].scheduling="SP"
|
||||
uci set qos.@queue[-1].rate="1000000"
|
||||
uci set qos.@queue[-1].burst_size="1500"
|
||||
uci set qos.@queue[-1].weight="1"
|
||||
done
|
||||
|
||||
uci commit qos
|
||||
}
|
||||
|
||||
populate_no_of_queue
|
||||
|
||||
if [ -s "/etc/config/qos" ]; then
|
||||
if uci -q get qos.@queue[0] >/dev/null; then
|
||||
# return if there is any valid content
|
||||
exit
|
||||
else
|
||||
rm -f /etc/config/qos
|
||||
fi
|
||||
fi
|
||||
touch /etc/config/qos
|
||||
|
||||
config_load ports
|
||||
config_foreach generate_queue ethport
|
||||
@@ -4,16 +4,23 @@
|
||||
|
||||
# include common code
|
||||
. /lib/qos/ip_rule.sh
|
||||
. /lib/qos/iptables.sh
|
||||
. /lib/qos/ebtables.sh
|
||||
. /lib/qos/classify.sh
|
||||
|
||||
IP_RULE=""
|
||||
MAJOR=""
|
||||
|
||||
POLICER_COUNT=0
|
||||
Q_COUNT=0
|
||||
SP_Q_PRIO=7
|
||||
|
||||
#counter variable to assign classify order value if not added in config
|
||||
temp_order=1
|
||||
get_rate_per_queue() {
|
||||
echo "1000000"
|
||||
}
|
||||
|
||||
get_burst_size_per_queue() {
|
||||
echo "1500"
|
||||
}
|
||||
|
||||
# Function to handle a queue order and
|
||||
# update total number of queues
|
||||
@@ -144,6 +151,88 @@ handle_queue() {
|
||||
Q_COUNT=$((Q_COUNT + 1))
|
||||
}
|
||||
|
||||
ebt_match_ipv6_dscp() {
|
||||
#when ethertype is not configured by user then both proto rules of ipv4
|
||||
#and ipv6 to be installed so update BR6_RULE string as well otherwise
|
||||
#update BR_RULE only for installation of ipv6 proto rule only.
|
||||
if [ ! -z "$BR6_RULE" ]; then
|
||||
BR6_RULE="$BR6_RULE --ip6-tclass $1"
|
||||
else
|
||||
BR_RULE="$BR_RULE --ip6-tclass $1"
|
||||
fi
|
||||
}
|
||||
|
||||
broute_filter_on_dscp() {
|
||||
# The broadcom option --ip-dscp-extend actually accepts tos
|
||||
# and not dscp and that too in hex, hence, perform the conversion
|
||||
# from dscp in uci to tos first and then convert to hex
|
||||
tos_val=$(($1<<2))
|
||||
tos_hex=$(printf "%x" $tos_val)
|
||||
BR_RULE="$BR_RULE --ip-dscp-extend $tos_hex"
|
||||
}
|
||||
|
||||
broute_ipv4_rule_options()
|
||||
{
|
||||
local cid=$1
|
||||
config_get protocol "$cid" "proto"
|
||||
config_get dscp_filter "$cid" "dscp_filter"
|
||||
|
||||
set_ip_addr $cid ebt_match_src_ip ebt_match_dst_ip
|
||||
|
||||
if [ ! -z $dscp_filter ]; then
|
||||
broute_filter_on_dscp "$dscp_filter"
|
||||
fi
|
||||
|
||||
if [ ! -z $protocol ]; then
|
||||
local proto_num=$(protocol_string_to_num "$protocol")
|
||||
ebt_match_ip_protocol "$proto_num"
|
||||
|
||||
#port installation for protol tcp/udp/sctp
|
||||
if [ $proto_num = "6" ] || [ $proto_num = "17" ] || [ $proto_num = "132" ] ; then
|
||||
set_ports "$cid" ebt_match_ip_src_port ebt_match_ip_dst_port
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
broute_ipv6_rule_options()
|
||||
{
|
||||
local cid=$1
|
||||
|
||||
config_get protocol "$cid" "proto"
|
||||
config_get dscp_filter "$cid" "dscp_filter"
|
||||
|
||||
set_ip_addr $cid ebt_match_ipv6_src_ip ebt_match_ipv6_dst_ip
|
||||
|
||||
if [ ! -z $dscp_filter ]; then
|
||||
local tos_val
|
||||
local tos_hex
|
||||
|
||||
tos_val=$(($dscp_filter<<2))
|
||||
tos_hex=$(printf "%x" $tos_val)
|
||||
ebt_match_ipv6_dscp "$tos_hex"
|
||||
fi
|
||||
|
||||
if [ ! -z $protocol ]; then
|
||||
local proto_num=$(protocol_string_to_num "$protocol")
|
||||
ebt_match_ipv6_protocol "$proto_num"
|
||||
|
||||
#port installation for protol tcp/udp/sctp
|
||||
if [ $proto_num = "6" ] || [ $proto_num = "17" ] || [ $proto_num = "132" ]; then
|
||||
set_ports "$cid" ebt_match_ipv6_src_port ebt_match_ipv6_dst_port
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
broute_rule_set_traffic_class() {
|
||||
#when ethertype is not configured by user then both proto rules of ipv4
|
||||
#and ipv6 to be installed so update BR6_RULE string as well otherwise
|
||||
#update BR_RULE only for installation of ipv6 proto rule only.
|
||||
BR_RULE="$BR_RULE -j mark --mark-or 0x$1 --mark-target ACCEPT"
|
||||
if [ ! -z "$BR6_RULE" ]; then
|
||||
BR6_RULE="$BR6_RULE -j mark --mark-or 0x$1 --mark-target ACCEPT"
|
||||
fi
|
||||
}
|
||||
|
||||
#function to handle a policer section
|
||||
handle_policer() {
|
||||
local p_sec="$1" # policer section ID
|
||||
@@ -159,243 +248,6 @@ handle_policer() {
|
||||
POLICER_COUNT=$((POLICER_COUNT + 1))
|
||||
}
|
||||
|
||||
setup_qos() {
|
||||
if [ ! -d "/tmp/qos" ]; then
|
||||
mkdir -p /tmp/qos
|
||||
fi
|
||||
|
||||
ebtables -t broute -N qos
|
||||
ret=$?
|
||||
if [ $ret -eq 0 ]; then
|
||||
ebtables -t broute -I BROUTING -j qos
|
||||
else
|
||||
ebtables -t broute -D BROUTING -j qos
|
||||
ebtables -t broute -I BROUTING -j qos
|
||||
fi
|
||||
|
||||
iptables -w -t mangle -N qos_prerouting
|
||||
ret=$?
|
||||
[ $ret -eq 0 ] && iptables -w -t mangle -I PREROUTING -j qos_prerouting
|
||||
|
||||
iptables -w -t mangle -N qos_forward
|
||||
ret=$?
|
||||
[ $ret -eq 0 ] && iptables -w -t mangle -I FORWARD -j qos_forward
|
||||
|
||||
iptables -w -t mangle -N qos_output
|
||||
ret=$?
|
||||
[ $ret -eq 0 ] && iptables -w -t mangle -I OUTPUT -j qos_output
|
||||
|
||||
ip6tables -w -t mangle -N qos_prerouting
|
||||
ret=$?
|
||||
[ $ret -eq 0 ] && ip6tables -w -t mangle -I PREROUTING -j qos_prerouting
|
||||
|
||||
ip6tables -t mangle -N qos_forward
|
||||
ret=$?
|
||||
[ $ret -eq 0 ] && ip6tables -t mangle -I FORWARD -j qos_forward
|
||||
|
||||
ip6tables -t mangle -N qos_output
|
||||
ret=$?
|
||||
[ $ret -eq 0 ] && ip6tables -t mangle -I OUTPUT -j qos_output
|
||||
|
||||
}
|
||||
|
||||
flush_chains() {
|
||||
echo "iptables -w -t mangle -F qos_forward" > /tmp/qos/classify.iptables
|
||||
echo "iptables -w -t mangle -F qos_output" >> /tmp/qos/classify.iptables
|
||||
echo "iptables -w -t mangle -F qos_prerouting" >> /tmp/qos/classify.iptables
|
||||
|
||||
echo "ip6tables -w -t mangle -F qos_forward" > /tmp/qos/classify.ip6tables
|
||||
echo "ip6tables -w -t mangle -F qos_output" >> /tmp/qos/classify.ip6tables
|
||||
echo "ip6tables -w -t mangle -F qos_prerouting" >> /tmp/qos/classify.ip6tables
|
||||
}
|
||||
|
||||
init_iptables_rule() {
|
||||
IP_RULE=""
|
||||
}
|
||||
|
||||
iptables_filter_intf() {
|
||||
IP_RULE="$IP_RULE -i $1"
|
||||
}
|
||||
|
||||
iptables_filter_proto() {
|
||||
IP_RULE="$IP_RULE -p $1"
|
||||
}
|
||||
|
||||
iptables_filter_ip_src() {
|
||||
IP_RULE="$IP_RULE -s $1"
|
||||
}
|
||||
|
||||
iptables_filter_ip_dest() {
|
||||
IP_RULE="$IP_RULE -d $1"
|
||||
}
|
||||
|
||||
iptables_filter_port_dest() {
|
||||
IP_RULE="$IP_RULE --dport $1"
|
||||
}
|
||||
|
||||
iptables_filter_port_src() {
|
||||
IP_RULE="$IP_RULE --sport $1"
|
||||
}
|
||||
|
||||
iptables_filter_port_dest_range() {
|
||||
IP_RULE="$IP_RULE --dport $1:$2"
|
||||
}
|
||||
|
||||
iptables_filter_port_src_range() {
|
||||
IP_RULE="$IP_RULE --sport $1:$2"
|
||||
}
|
||||
|
||||
iptables_filter_dscp_filter() {
|
||||
IP_RULE="$IP_RULE -m dscp --dscp $1"
|
||||
}
|
||||
|
||||
iptables_filter_ip_len_min() {
|
||||
IP_RULE="$IP_RULE -m length --length $1"
|
||||
}
|
||||
|
||||
iptables_filter_ip_len_max() {
|
||||
IP_RULE="$IP_RULE:$1"
|
||||
}
|
||||
|
||||
iptables_set_dscp_mark() {
|
||||
IP_RULE="$IP_RULE -j DSCP --set-dscp $1"
|
||||
}
|
||||
|
||||
iptables_set_traffic_class() {
|
||||
IP_RULE="$IP_RULE -j MARK --set-mark $1"
|
||||
}
|
||||
|
||||
append_rule_to_mangle_table() {
|
||||
if [ $2 == 4 ]; then
|
||||
echo "iptables -w -t mangle -A $1 $IP_RULE" >> /tmp/qos/classify.iptables
|
||||
elif [ $2 == 6 ]; then
|
||||
echo "ip6tables -w -t mangle -A $1 $IP_RULE" >> /tmp/qos/classify.ip6tables
|
||||
elif [ $2 == 1 ]; then
|
||||
echo "iptables -w -t mangle -A $1 $IP_RULE" >> /tmp/qos/classify.iptables
|
||||
echo "ip6tables -w -t mangle -A $1 $IP_RULE" >> /tmp/qos/classify.ip6tables
|
||||
fi
|
||||
}
|
||||
|
||||
handle_iptables_rules() {
|
||||
cid=$1
|
||||
local ip_version=0
|
||||
local is_l3_rule=0
|
||||
|
||||
init_iptables_rule
|
||||
config_get proto "$cid" "proto"
|
||||
config_get traffic_class "$cid" "traffic_class"
|
||||
config_get dscp_mark "$cid" "dscp_mark"
|
||||
config_get dscp_filter "$cid" "dscp_filter"
|
||||
config_get dest_port "$cid" "dest_port"
|
||||
config_get dest_port_range "$cid" "dest_port_range"
|
||||
config_get src_port "$cid" "src_port"
|
||||
config_get src_port_range "$cid" "src_port_range"
|
||||
config_get dest_ip "$cid" "dest_ip"
|
||||
config_get src_ip "$cid" "src_ip"
|
||||
config_get ip_len_min "$cid" "ip_len_min"
|
||||
config_get ip_len_max "$cid" "ip_len_max"
|
||||
config_get ifname "$cid" "ifname"
|
||||
|
||||
#check version of ip
|
||||
case $src_ip$dest_ip in
|
||||
*.*)
|
||||
ip_version=4
|
||||
;;
|
||||
*:*)
|
||||
ip_version=6
|
||||
;;
|
||||
*)
|
||||
ip_version=1 #ip address not used
|
||||
esac
|
||||
|
||||
#filter interface
|
||||
if [ -n "$ifname" ]; then
|
||||
if [ "$ifname" != "lo" ]; then
|
||||
iptables_filter_intf $ifname
|
||||
fi
|
||||
fi
|
||||
|
||||
# filter proto
|
||||
if [ -n "$proto" ]; then
|
||||
iptables_filter_proto $proto
|
||||
is_l3_rule=1
|
||||
fi
|
||||
|
||||
#filter src. ip
|
||||
if [ -n "$src_ip" ]; then
|
||||
iptables_filter_ip_src $src_ip
|
||||
is_l3_rule=1
|
||||
fi
|
||||
|
||||
#filter dest. ip
|
||||
if [ -n "$dest_ip" ]; then
|
||||
iptables_filter_ip_dest $dest_ip
|
||||
is_l3_rule=1
|
||||
fi
|
||||
|
||||
#filter dest. port
|
||||
if [ -n "$dest_port" -a -z "$dest_port_range" ]; then
|
||||
iptables_filter_port_dest $dest_port
|
||||
is_l3_rule=1
|
||||
fi
|
||||
#filter src. port
|
||||
if [ -n "$src_port" -a -z "$src_port_range" ]; then
|
||||
iptables_filter_port_src $src_port
|
||||
is_l3_rule=1
|
||||
fi
|
||||
|
||||
#filter dest. port range
|
||||
if [ -n "$dest_port" -a -n "$dest_port_range" ]; then
|
||||
iptables_filter_port_dest_range $dest_port $dest_port_range
|
||||
is_l3_rule=1
|
||||
fi
|
||||
|
||||
#filter src. port range
|
||||
if [ -n "$src_port" -a -n "$src_port_range" ]; then
|
||||
iptables_filter_port_src_range $src_port $src_port_range
|
||||
is_l3_rule=1
|
||||
fi
|
||||
|
||||
#filter dscp
|
||||
if [ -n "$dscp_filter" ]; then
|
||||
iptables_filter_dscp_filter $dscp_filter
|
||||
is_l3_rule=1
|
||||
fi
|
||||
|
||||
#filter min. IP packet len.
|
||||
if [ -n "$ip_len_min" ]; then
|
||||
iptables_filter_ip_len_min $ip_len_min
|
||||
is_l3_rule=1
|
||||
fi
|
||||
#filter max. IP packet len.
|
||||
if [ -n "$ip_len_max" ]; then
|
||||
iptables_filter_ip_len_max $ip_len_max
|
||||
is_l3_rule=1
|
||||
fi
|
||||
|
||||
if [ $is_l3_rule -eq 0 ]; then
|
||||
return
|
||||
fi
|
||||
|
||||
#set dscp mark
|
||||
[ -n "$dscp_mark" ] && iptables_set_dscp_mark $dscp_mark
|
||||
|
||||
#set packet queue mark
|
||||
[ -n "$traffic_class" ] && iptables_set_traffic_class $traffic_class
|
||||
|
||||
#write iptables rule for dscp marking
|
||||
[ -n "$IP_RULE" -a -n "$dscp_mark" ] && append_rule_to_mangle_table "qos_forward" $ip_version
|
||||
if [ -n "$IP_RULE" -a -n "$traffic_class" ]; then
|
||||
if [ "$ifname" == "lo" ]; then
|
||||
#write iptables rule for putting WAN directed internal packets in different queue
|
||||
append_rule_to_mangle_table "qos_output" $ip_version
|
||||
else
|
||||
#write iptables rule for putting WAN directed LAN packets in different queue
|
||||
append_rule_to_mangle_table "qos_prerouting" $ip_version
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
handle_policer_rules() {
|
||||
local c_sec=$1
|
||||
local policer_name
|
||||
@@ -471,94 +323,6 @@ config_ingress_rate_limit() {
|
||||
|
||||
}
|
||||
|
||||
# Function to handle a classify order
|
||||
handle_classify_order() {
|
||||
local cid="$1" #classify section ID
|
||||
|
||||
config_get is_enable "$cid" "enable" 1
|
||||
|
||||
# No need to configure disabled classify
|
||||
if [ $is_enable == '0' ]; then
|
||||
return
|
||||
fi
|
||||
|
||||
# Create classify file containing classify order
|
||||
local corder_file="/tmp/qos/classify.order"
|
||||
|
||||
config_get c_order "$cid" "order"
|
||||
|
||||
if [ -z "$c_order" ]; then
|
||||
c_order=$temp_order;
|
||||
temp_order=$((temp_order + 1))
|
||||
fi
|
||||
|
||||
value=${c_order}_${cid}
|
||||
echo $value >> $corder_file
|
||||
|
||||
}
|
||||
|
||||
# Sort classify, lower value in uci means higher precedence, so this
|
||||
# function sorts the classify order in assending order
|
||||
sort_classify_by_order() {
|
||||
local corder_file="/tmp/qos/classify.order"
|
||||
local tmp_corder_file="/tmp/qos/tmp_classify.order"
|
||||
|
||||
sort -n -k1 $corder_file > $tmp_corder_file
|
||||
cp $tmp_corder_file $corder_file
|
||||
rm -f $tmp_corder_file
|
||||
}
|
||||
|
||||
#function to handle a classify section
|
||||
handle_classify() {
|
||||
local corder_file="/tmp/qos/classify.order"
|
||||
while read -r line; do
|
||||
line_cid=$(echo $line | cut -d '_' -f 2)
|
||||
# add ip rule only for classify rules which has non empty
|
||||
# value forwarding policy option
|
||||
# if forwarding policy option value empty then add iptables/
|
||||
# ip6tables/ebtables/rate_limit rules
|
||||
config_get fwding_policy "$line_cid" "forwarding_policy"
|
||||
|
||||
if [ -n "$fwding_policy" ]; then
|
||||
handle_ip_rule $line_cid $fwding_policy
|
||||
else
|
||||
handle_iptables_rules $line_cid
|
||||
handle_policer_rules $line_cid
|
||||
fi
|
||||
done < "$corder_file"
|
||||
}
|
||||
|
||||
configure_classify() {
|
||||
#processing classify section
|
||||
rm -f /tmp/qos/classify.iptables
|
||||
rm -f /tmp/qos/classify.ip6tables
|
||||
rm -f /tmp/qos/classify.order
|
||||
rm -f /tmp/qos/classify.iprule
|
||||
|
||||
# create files that will contain the rules if not present already
|
||||
mkdir -p /tmp/qos/
|
||||
touch /tmp/qos/classify.iptables
|
||||
touch /tmp/qos/classify.ip6tables
|
||||
touch /tmp/qos/classify.order
|
||||
touch /tmp/qos/classify.iprule
|
||||
|
||||
flush_chains
|
||||
|
||||
#flush added ip rule
|
||||
flush_ip_rule
|
||||
|
||||
# Load UCI file
|
||||
config_load qos
|
||||
config_foreach handle_classify_order classify
|
||||
sort_classify_by_order
|
||||
handle_classify
|
||||
|
||||
sh /tmp/qos/classify.iptables
|
||||
sh /tmp/qos/classify.ip6tables
|
||||
sh /tmp/qos/classify.iprule
|
||||
|
||||
}
|
||||
|
||||
pre_configure_queue() {
|
||||
# Delete queues
|
||||
for intf in $(db get hw.board.ethernetPortOrder); do
|
||||
@@ -676,7 +440,6 @@ configure_policer() {
|
||||
echo $POLICER_COUNT > /tmp/qos/max_policer_inst
|
||||
}
|
||||
|
||||
|
||||
configure_qos() {
|
||||
pre_configure_queue
|
||||
configure_queue
|
||||
|
||||
@@ -5,8 +5,8 @@ PKG_RELEASE:=1
|
||||
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_URL:=https://github.com/bellard/quickjs.git
|
||||
PKG_SOURCE_DATE:=2020-11-08
|
||||
PKG_SOURCE_VERSION:=204682fb87ab9312f0cf81f959ecd181180457bc
|
||||
PKG_SOURCE_DATE:=2022-03-06
|
||||
PKG_SOURCE_VERSION:=2788d71e823b522b178db3b3660ce93689534e6d
|
||||
PKG_MIRROR_HASH:=skip
|
||||
PKG_LICENSE:=MIT
|
||||
|
||||
@@ -30,18 +30,16 @@ define Package/quickjs/description
|
||||
generators, proxies and BigInt.
|
||||
endef
|
||||
|
||||
MAKE_VARS += \
|
||||
LIBS="-latomic"
|
||||
|
||||
MAKE_FLAGS = \
|
||||
prefix=/usr \
|
||||
CONFIG_SMALL=y \
|
||||
EXTRA_LIBS="-latomic" \
|
||||
CROSS_PREFIX="$(TARGET_CROSS)"
|
||||
|
||||
define Build/InstallDev
|
||||
$(INSTALL_DIR) $(1)/usr/lib/quickjs
|
||||
$(CP) $(PKG_INSTALL_DIR)/usr/lib/quickjs/libquickjs.a $(1)/usr/lib/quickjs/
|
||||
$(CP) $(PKG_INSTALL_DIR)/usr/lib/quickjs/libquickjs.lto.a $(1)/usr/lib/quickjs/
|
||||
$(CP) $(PKG_INSTALL_DIR)/usr/lib/quickjs/libquickjs.a $(1)/usr/lib/
|
||||
$(CP) $(PKG_INSTALL_DIR)/usr/lib/quickjs/libquickjs.lto.a $(1)/usr/lib/
|
||||
$(INSTALL_DIR) $(1)/usr/include/quickjs
|
||||
$(CP) $(PKG_INSTALL_DIR)/usr/include/quickjs/quickjs.h $(1)/usr/include/quickjs/
|
||||
$(CP) $(PKG_INSTALL_DIR)/usr/include/quickjs/quickjs-libc.h $(1)/usr/include/quickjs/
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
diff --git a/Makefile b/Makefile
|
||||
index e6ae827..bbd3ce8 100644
|
||||
index 49b1f6f..2c96eae 100644
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -33,6 +33,8 @@ CONFIG_LTO=y
|
||||
@@ -58,16 +58,7 @@ index e6ae827..bbd3ce8 100644
|
||||
ifdef CONFIG_LTO
|
||||
CFLAGS_SMALL+=-flto
|
||||
CFLAGS_OPT+=-flto
|
||||
@@ -175,7 +188,7 @@ QJS_OBJS+=$(OBJDIR)/qjscalc.o
|
||||
endif
|
||||
|
||||
HOST_LIBS=-lm -ldl -lpthread
|
||||
-LIBS=-lm
|
||||
+LIBS+=-lm
|
||||
ifndef CONFIG_WIN32
|
||||
LIBS+=-ldl -lpthread
|
||||
endif
|
||||
@@ -194,6 +207,8 @@ qjsc$(EXE): $(OBJDIR)/qjsc.o $(QJS_LIB_OBJS)
|
||||
@@ -195,6 +208,8 @@ qjsc$(EXE): $(OBJDIR)/qjsc.o $(QJS_LIB_OBJS)
|
||||
|
||||
ifneq ($(CROSS_PREFIX),)
|
||||
|
||||
@@ -76,7 +67,7 @@ index e6ae827..bbd3ce8 100644
|
||||
$(QJSC): $(OBJDIR)/qjsc.host.o \
|
||||
$(patsubst %.o, %.host.o, $(QJS_LIB_OBJS))
|
||||
$(HOST_CC) $(LDFLAGS) -o $@ $^ $(HOST_LIBS)
|
||||
@@ -261,6 +276,8 @@ run-test262-32: $(patsubst %.o, %.m32.o, $(OBJDIR)/run-test262.o $(QJS_LIB_OBJS)
|
||||
@@ -262,6 +277,8 @@ run-test262-32: $(patsubst %.o, %.m32.o, $(OBJDIR)/run-test262.o $(QJS_LIB_OBJS)
|
||||
$(OBJDIR)/%.o: %.c | $(OBJDIR)
|
||||
$(CC) $(CFLAGS_OPT) -c -o $@ $<
|
||||
|
||||
@@ -85,7 +76,7 @@ index e6ae827..bbd3ce8 100644
|
||||
$(OBJDIR)/%.host.o: %.c | $(OBJDIR)
|
||||
$(HOST_CC) $(CFLAGS_OPT) -c -o $@ $<
|
||||
|
||||
@@ -285,6 +302,8 @@ $(OBJDIR)/%.check.o: %.c | $(OBJDIR)
|
||||
@@ -286,6 +303,8 @@ $(OBJDIR)/%.check.o: %.c | $(OBJDIR)
|
||||
regexp_test: libregexp.c libunicode.c cutils.c
|
||||
$(CC) $(LDFLAGS) $(CFLAGS) -DTEST -o $@ libregexp.c libunicode.c cutils.c $(LIBS)
|
||||
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
diff --git a/quickjs.c b/quickjs.c
|
||||
index a39ff8f..635c506 100644
|
||||
index 7916013..3936eec 100644
|
||||
--- a/quickjs.c
|
||||
+++ b/quickjs.c
|
||||
@@ -65,6 +65,16 @@
|
||||
@@ -67,6 +67,16 @@
|
||||
#define CONFIG_PRINTF_RNDN
|
||||
#endif
|
||||
|
||||
@@ -19,7 +19,7 @@ index a39ff8f..635c506 100644
|
||||
/* define to include Atomics.* operations which depend on the OS
|
||||
threads */
|
||||
#if !defined(EMSCRIPTEN)
|
||||
@@ -11253,6 +11263,11 @@ static char *i64toa(char *buf_end, int64_t n, unsigned int base)
|
||||
@@ -11299,6 +11309,11 @@ static char *i64toa(char *buf_end, int64_t n, unsigned int base)
|
||||
return q;
|
||||
}
|
||||
|
||||
@@ -31,7 +31,7 @@ index a39ff8f..635c506 100644
|
||||
/* buf1 contains the printf result */
|
||||
static void js_ecvt1(double d, int n_digits, int *decpt, int *sign, char *buf,
|
||||
int rounding_mode, char *buf1, int buf1_size)
|
||||
@@ -11272,9 +11287,6 @@ static void js_ecvt1(double d, int n_digits, int *decpt, int *sign, char *buf,
|
||||
@@ -11318,9 +11333,6 @@ static void js_ecvt1(double d, int n_digits, int *decpt, int *sign, char *buf,
|
||||
*decpt = atoi(buf1 + n_digits + 2 + (n_digits > 1)) + 1;
|
||||
}
|
||||
|
||||
@@ -41,7 +41,7 @@ index a39ff8f..635c506 100644
|
||||
/* needed because ecvt usually limits the number of digits to
|
||||
17. Return the number of digits. */
|
||||
static int js_ecvt(double d, int n_digits, int *decpt, int *sign, char *buf,
|
||||
@@ -11383,6 +11395,8 @@ static void js_fcvt(char *buf, int buf_size, double d, int n_digits)
|
||||
@@ -11429,6 +11441,8 @@ static void js_fcvt(char *buf, int buf_size, double d, int n_digits)
|
||||
js_fcvt1(buf, buf_size, d, n_digits, rounding_mode);
|
||||
}
|
||||
|
||||
@@ -50,7 +50,7 @@ index a39ff8f..635c506 100644
|
||||
/* radix != 10 is only supported with flags = JS_DTOA_VAR_FORMAT */
|
||||
/* use as many digits as necessary */
|
||||
#define JS_DTOA_VAR_FORMAT (0 << 0)
|
||||
@@ -11396,8 +11410,10 @@ static void js_fcvt(char *buf, int buf_size, double d, int n_digits)
|
||||
@@ -11442,8 +11456,10 @@ static void js_fcvt(char *buf, int buf_size, double d, int n_digits)
|
||||
/* XXX: slow and maybe not fully correct. Use libbf when it is fast enough.
|
||||
XXX: radix != 10 is only supported for small integers
|
||||
*/
|
||||
@@ -62,7 +62,7 @@ index a39ff8f..635c506 100644
|
||||
char *q;
|
||||
|
||||
if (!isfinite(d)) {
|
||||
@@ -11419,6 +11435,25 @@ static void js_dtoa1(char *buf, double d, int radix, int n_digits, int flags)
|
||||
@@ -11465,6 +11481,25 @@ static void js_dtoa1(char *buf, double d, int radix, int n_digits, int flags)
|
||||
ptr = i64toa(buf1 + sizeof(buf1), i64, radix);
|
||||
strcpy(buf, ptr);
|
||||
} else {
|
||||
@@ -88,7 +88,7 @@ index a39ff8f..635c506 100644
|
||||
if (d == 0.0)
|
||||
d = 0.0; /* convert -0 to 0 */
|
||||
if (flags == JS_DTOA_FRAC_FORMAT) {
|
||||
@@ -11482,14 +11517,8 @@ static void js_dtoa1(char *buf, double d, int radix, int n_digits, int flags)
|
||||
@@ -11528,14 +11563,8 @@ static void js_dtoa1(char *buf, double d, int radix, int n_digits, int flags)
|
||||
sprintf(q, "%d", p);
|
||||
}
|
||||
}
|
||||
|
||||
126
quickjs/patches/002-fix_std_loadFile.patch
Normal file
126
quickjs/patches/002-fix_std_loadFile.patch
Normal file
@@ -0,0 +1,126 @@
|
||||
diff --git a/quickjs-libc.c b/quickjs-libc.c
|
||||
index e180dd0..76182d2 100644
|
||||
--- a/quickjs-libc.c
|
||||
+++ b/quickjs-libc.c
|
||||
@@ -358,12 +358,89 @@ fail:
|
||||
return JS_EXCEPTION;
|
||||
}
|
||||
|
||||
+// For reading files that are not seekable, per second answer from stackoverflow:
|
||||
+// https://stackoverflow.com/questions/14002954/c-programming-how-to-read-the-whole-file-contents-into-a-buffer
|
||||
+
|
||||
+#define READALL_CHUNK 10*1024
|
||||
+
|
||||
+static int readall(FILE *f, JSContext *ctx, uint8_t **dataptr, size_t *sizeptr)
|
||||
+{
|
||||
+ uint8_t *data = NULL, *temp;
|
||||
+ size_t size = 0;
|
||||
+ size_t used = 0;
|
||||
+ size_t n;
|
||||
+
|
||||
+ while (1) {
|
||||
+ if (used + READALL_CHUNK + 1 > size) {
|
||||
+ size = used + READALL_CHUNK + 1;
|
||||
+
|
||||
+ /* Overflow check. Some ANSI C compilers
|
||||
+ may optimize this away, though. */
|
||||
+ if (size <= used) {
|
||||
+ if (ctx)
|
||||
+ js_free(ctx, data);
|
||||
+ else
|
||||
+ free(data);
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
+ if (ctx)
|
||||
+ temp = js_realloc(ctx, data, size);
|
||||
+ else
|
||||
+ temp = realloc(data, size);
|
||||
+
|
||||
+ if (temp == NULL) {
|
||||
+ if (ctx)
|
||||
+ js_free(ctx, data);
|
||||
+ else
|
||||
+ free(data);
|
||||
+ return -1;
|
||||
+ }
|
||||
+ data = temp;
|
||||
+ }
|
||||
+
|
||||
+ n = fread(data + used, 1, READALL_CHUNK, f);
|
||||
+ if (n == 0)
|
||||
+ break;
|
||||
+
|
||||
+ used += n;
|
||||
+ }
|
||||
+
|
||||
+ if (ferror(f)) {
|
||||
+ if (ctx)
|
||||
+ js_free(ctx, data);
|
||||
+ else
|
||||
+ free(data);
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
+ if (ctx)
|
||||
+ temp = js_realloc(ctx, data, used + 1);
|
||||
+ else
|
||||
+ temp = realloc(data, used + 1);
|
||||
+
|
||||
+ if (temp == NULL) {
|
||||
+ if (ctx)
|
||||
+ js_free(ctx, data);
|
||||
+ else
|
||||
+ free(data);
|
||||
+ return -1;
|
||||
+ }
|
||||
+ data = temp;
|
||||
+ data[used] = '\0';
|
||||
+
|
||||
+ *dataptr = data;
|
||||
+ *sizeptr = used;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
uint8_t *js_load_file(JSContext *ctx, size_t *pbuf_len, const char *filename)
|
||||
{
|
||||
FILE *f;
|
||||
uint8_t *buf;
|
||||
size_t buf_len;
|
||||
- long lret;
|
||||
+ long lret = 0;
|
||||
|
||||
f = fopen(filename, "rb");
|
||||
if (!f)
|
||||
@@ -371,7 +448,7 @@ uint8_t *js_load_file(JSContext *ctx, size_t *pbuf_len, const char *filename)
|
||||
if (fseek(f, 0, SEEK_END) < 0)
|
||||
goto fail;
|
||||
lret = ftell(f);
|
||||
- if (lret < 0)
|
||||
+ if (lret <= 0)
|
||||
goto fail;
|
||||
/* XXX: on Linux, ftell() return LONG_MAX for directories */
|
||||
if (lret == LONG_MAX) {
|
||||
@@ -387,13 +464,19 @@ uint8_t *js_load_file(JSContext *ctx, size_t *pbuf_len, const char *filename)
|
||||
buf = malloc(buf_len + 1);
|
||||
if (!buf)
|
||||
goto fail;
|
||||
- if (fread(buf, 1, buf_len, f) != buf_len) {
|
||||
- errno = EIO;
|
||||
+ buf_len = fread(buf, 1, buf_len, f);
|
||||
+ if (ferror(f)) {
|
||||
if (ctx)
|
||||
js_free(ctx, buf);
|
||||
else
|
||||
free(buf);
|
||||
fail:
|
||||
+ // Files in proc and sysfs may not be seekable or may falsely
|
||||
+ // appear to be of zero size. Try to read them in another way.
|
||||
+ if (lret == 0 && readall(f, ctx, &buf, pbuf_len) == 0) {
|
||||
+ fclose(f);
|
||||
+ return buf;
|
||||
+ }
|
||||
fclose(f);
|
||||
return NULL;
|
||||
}
|
||||
@@ -13,10 +13,6 @@ start_service() {
|
||||
procd_close_instance
|
||||
}
|
||||
|
||||
stop() {
|
||||
service_stop rulengd
|
||||
}
|
||||
|
||||
service_triggers()
|
||||
{
|
||||
procd_add_reload_trigger ruleng
|
||||
@@ -26,4 +22,3 @@ reload_service() {
|
||||
stop
|
||||
start
|
||||
}
|
||||
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
#
|
||||
# Copyright (C) 2020-2022 IOPSYS Software Solutions AB
|
||||
#
|
||||
# This is free software, licensed under the GNU General Public License v2.
|
||||
# See /LICENSE for more information.
|
||||
#
|
||||
|
||||
@@ -9,28 +8,38 @@ include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=stunc
|
||||
PKG_RELEASE:=1
|
||||
PKG_VERSION:=1.1.15
|
||||
PKG_VERSION:=1.2.0
|
||||
|
||||
LOCAL_DEV:=0
|
||||
ifneq ($(LOCAL_DEV),1)
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/stunc.git
|
||||
PKG_SOURCE_VERSION:=09f9868a79e1b5037a99a97fd4dee678869fe98a
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/bbf/stunc.git
|
||||
PKG_SOURCE_VERSION:=b8231dc570ecc914b52d9e3f8fc9c009280d1791
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
|
||||
PKG_MIRROR_HASH:=skip
|
||||
endif
|
||||
|
||||
PKG_LICENSE:=GPL-2.0-only
|
||||
PKG_LICENSE:=BSD-3-Clause
|
||||
PKG_LICENSE_FILES:=LICENSE
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
MAKE_PATH:=src
|
||||
|
||||
define Package/stunc/default
|
||||
SECTION:=utils
|
||||
CATEGORY:=Utilities
|
||||
SUBMENU:=TRx69
|
||||
TITLE:=BBF STUN Client
|
||||
DEPENDS:=+libubus +libuci +libubox +libjson-c +libblobmsg-json +libbbf_api
|
||||
DEPENDS:=+libubus +libuci +libubox +libjson-c +libblobmsg-json +libbbfdm-api
|
||||
endef
|
||||
|
||||
define Package/stunc
|
||||
$(Package/stunc/default)
|
||||
TITLE += (default)
|
||||
DEPENDS += +libopenssl
|
||||
VARIANT:=default
|
||||
DEFAULT_VARIANT:=1
|
||||
endef
|
||||
|
||||
define Package/stunc-mbedtls
|
||||
@@ -38,29 +47,34 @@ define Package/stunc-mbedtls
|
||||
TITLE += (mbedtls)
|
||||
DEPENDS += +PACKAGE_stunc-mbedtls:libmbedtls
|
||||
VARIANT:=mbedtls
|
||||
DEFAULT_VARIANT:=1
|
||||
CONFLICTS := stunc stunc-openssl stunc-wolfssl
|
||||
endef
|
||||
|
||||
define Package/stunc-openssl
|
||||
$(Package/stunc/default)
|
||||
TITLE += (openssl)
|
||||
DEPENDS += +PACKAGE_stunc-openssl:libopenssl
|
||||
CONFLICTS := stunc-mbedtls
|
||||
VARIANT:=openssl
|
||||
CONFLICTS := stunc stunc-mbedtls stunc-wolfssl
|
||||
endef
|
||||
|
||||
define Package/stunc-wolfssl
|
||||
$(Package/stunc/default)
|
||||
TITLE += (wolfssl)
|
||||
DEPENDS += +PACKAGE_stunc-wolfssl:libwolfssl
|
||||
CONFLICTS := stunc-mbedtls stunc-openssl
|
||||
VARIANT:=wolfssl
|
||||
CONFLICTS := stunc stunc-openssl stunc-mbedtls
|
||||
endef
|
||||
|
||||
TARGET_CFLAGS += \
|
||||
-D_GNU_SOURCE \
|
||||
-Wall -Werror
|
||||
|
||||
ifeq ($(BUILD_VARIANT),default)
|
||||
MAKE_FLAGS += \
|
||||
USE_OPENSSL="yes"
|
||||
endif
|
||||
|
||||
ifeq ($(BUILD_VARIANT),wolfssl)
|
||||
MAKE_FLAGS += \
|
||||
USE_WOLFSSL="yes"
|
||||
@@ -87,16 +101,18 @@ define Package/stunc/default/install
|
||||
$(INSTALL_DIR) $(1)/etc/config
|
||||
$(INSTALL_DIR) $(1)/etc/init.d
|
||||
$(INSTALL_DIR) $(1)/usr/lib/bbfdm
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/libstunc.so $(1)/usr/lib/bbfdm/libstunc.so
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/stunc $(1)/usr/sbin/
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/src/libstunc.so $(1)/usr/lib/bbfdm/libstunc.so
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/src/stunc $(1)/usr/sbin/
|
||||
$(INSTALL_BIN) ./files/etc/init.d/stunc $(1)/etc/init.d/stunc
|
||||
$(INSTALL_DATA) ./files/etc/config/stunc $(1)/etc/config/stunc
|
||||
endef
|
||||
|
||||
Package/stunc/install = $(Package/stunc/default/install)
|
||||
Package/stunc-openssl/install = $(Package/stunc/default/install)
|
||||
Package/stunc-wolfssl/install = $(Package/stunc/default/install)
|
||||
Package/stunc-mbedtls/install = $(Package/stunc/default/install)
|
||||
|
||||
$(eval $(call BuildPackage,stunc))
|
||||
$(eval $(call BuildPackage,stunc-openssl))
|
||||
$(eval $(call BuildPackage,stunc-wolfssl))
|
||||
$(eval $(call BuildPackage,stunc-mbedtls))
|
||||
|
||||
@@ -5,11 +5,11 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=sulu-base
|
||||
PKG_VERSION:=2.0.3
|
||||
PKG_VERSION:=2.1.0
|
||||
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/websdk/sulu.git
|
||||
PKG_SOURCE_VERSION:=424fb2c76b8b59d235705c5ea8cb0a188d72024d
|
||||
PKG_SOURCE_VERSION:=624710be04dcdba5434840c539518d22a18e537a
|
||||
PKG_MIRROR_HASH:=skip
|
||||
|
||||
SULU_MOD:=core
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user