nss-ecm: switch to using named sections in uci

The way ECM uci config is handled is pretty ugly due to it not specifying a
named section for 'general'.

Current:
```
➤ uci show ecm
ecm.global=ecm
ecm.global.acceleration_engine='nss'
ecm.@general[0]=general
ecm.@general[0].enable_bridge_filtering='0'
ecm.@general[0].disable_offloads='0'
ecm.@general[0].disable_flow_control='0'
ecm.@general[0].disable_interrupt_moderation='0'
ecm.@general[0].disable_gro='0'
```

None of the options require the use of unnamed sections
(like /etc/config/dhcp does when defining configs for multiple hosts)

With this change the config would produce:
```
ecm.global=ecm
ecm.global.acceleration_engine='nss'
ecm.general=ecm
ecm.general.enable_bridge_filtering='0'
ecm.general.disable_offloads='0'
ecm.general.disable_flow_control='0'
ecm.general.disable_interrupt_moderation='0'
ecm.general.disable_gro='0'
```

Which is a lot easier to read, and access programmatically.

We can also merge `global` and `general` into a single section as it
doesn't really make sense why we need global/general when it's
technically "ALL" globally applied.

For now, to ease users on the change, let's just stick to 2 sections.

**PLEASE NOTE: For users building their own images, and storing their**
**configs in 'files/etc/config/ecm' you will need to manually update the**
**config before compiling.**

For users using **sysupgrade** or installing without custom config at build
time 'files/etc/config/ecm' should be OK.

The following can be run manually on the config file 'ecm'

```sh
conf=/etc/config/ecm
uci -q show ecm.general || {
  echo "Converting 'ECM' config to new format."
  sed -i "s/config.*general.*/config ecm 'general'/g" "$conf"
}
```

Signed-off-by: Sean Khan <datapronix@protonmail.com>
This commit is contained in:
Sean Khan 2024-04-28 13:10:58 -04:00
parent 3ffec2d091
commit 1891a290e0
5 changed files with 23 additions and 36 deletions

View File

@ -1,7 +1,7 @@
include $(TOPDIR)/rules.mk include $(TOPDIR)/rules.mk
PKG_NAME:=qca-nss-ecm PKG_NAME:=qca-nss-ecm
PKG_RELEASE:=4 PKG_RELEASE:=5
PKG_SOURCE_URL:=https://git.codelinaro.org/clo/qsdk/oss/lklm/qca-nss-ecm.git PKG_SOURCE_URL:=https://git.codelinaro.org/clo/qsdk/oss/lklm/qca-nss-ecm.git
PKG_SOURCE_PROTO:=git PKG_SOURCE_PROTO:=git

View File

@ -1,5 +1,5 @@
#!/bin/sh #!/bin/sh
# shellcheck disable=3014 # shellcheck disable=3014,3043,2086,1091,2154
# #
# Helper script which uses ethtool to disable (most) # Helper script which uses ethtool to disable (most)
# interface offloads, if possible. # interface offloads, if possible.
@ -172,19 +172,14 @@ disable_interrupt_moderation() {
fi fi
} }
parse_opt() {
local cfg="$1"
config_get_bool enable_bridge_filtering "$cfg" enable_bridge_filtering 0
config_get_bool disable_offloads "$cfg" disable_offloads 0
config_get_bool disable_flow_control "$cfg" disable_flow_control 0
config_get_bool disable_interrupt_moderation "$cfg" disable_interrupt_moderation 0
config_get_bool disable_gro "$cfg" disable_gro 0
}
disable_offload() { disable_offload() {
config_load ecm config_load ecm
config_foreach parse_opt general
config_get_bool enable_bridge_filtering ecm enable_bridge_filtering 0
config_get_bool disable_offloads ecm disable_offloads 0
config_get_bool disable_flow_control ecm disable_flow_control 0
config_get_bool disable_interrupt_moderation ecm disable_interrupt_moderation 0
config_get_bool disable_gro ecm disable_gro 0
[ -z $1 ] && interface=$(echo /sys/class/net/*) || interface=$* [ -z $1 ] && interface=$(echo /sys/class/net/*) || interface=$*

View File

@ -1,19 +1,10 @@
#!/bin/sh #!/bin/sh
#
# Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. # convert old ecm config to new format
# uci -q show ecm.general || {
# Permission to use, copy, modify, and/or distribute this software for any echo "Converting 'ECM' config to new format."
# purpose with or without fee is hereby granted, provided that the above sed -i "s/config.*general.*/config ecm 'general'/g" /etc/config/ecm
# copyright notice and this permission notice appear in all copies. }
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#
uci -q batch << EOF uci -q batch << EOF
delete firewall.qcanssecm delete firewall.qcanssecm

View File

@ -1,4 +1,5 @@
#!/bin/sh /etc/rc.common #!/bin/sh /etc/rc.common
# shellcheck disable=3043,3060,2086,2034
# #
# Copyright (c) 2014, 2019-2020 The Linux Foundation. All rights reserved. # Copyright (c) 2014, 2019-2020 The Linux Foundation. All rights reserved.
# #
@ -22,9 +23,11 @@ START=26
sysctl_update() { sysctl_update() {
local name value file local name value file
name=${1//\//\\/} name=${1//\//\\/}
value=${2//\//\\/} value=${2//\//\\/}
file=${3:-/etc/sysctl.d/qca-nss-ecm.conf} file=${3:-/etc/sysctl.d/qca-nss-ecm.conf}
sed -i -e '/^#\?\(\s*'"${name}"'\s*=\s*\).*/{s//\1'"${value}"'/;:a;n;ba;q}' \ sed -i -e '/^#\?\(\s*'"${name}"'\s*=\s*\).*/{s//\1'"${value}"'/;:a;n;ba;q}' \
-e '$a'"${name}"'='"${value}" "${file}" -e '$a'"${name}"'='"${value}" "${file}"
sysctl -w ${name}=${value} sysctl -w ${name}=${value}
@ -32,8 +35,10 @@ sysctl_update() {
get_front_end_mode() { get_front_end_mode() {
config_load "ecm" config_load "ecm"
config_get front_end global acceleration_engine "auto" config_get front_end global acceleration_engine "auto"
# shellcheck disable=2154
case $front_end in case $front_end in
auto) auto)
echo '0' echo '0'
@ -75,6 +80,7 @@ load_ecm() {
echo 1 > /sys/kernel/debug/ecm/ecm_classifier_default/accel_delay_pkts echo 1 > /sys/kernel/debug/ecm/ecm_classifier_default/accel_delay_pkts
} }
# shellcheck disable=1091
. /lib/netifd/offload/disable_offloads.sh . /lib/netifd/offload/disable_offloads.sh
disable_offload disable_offload
@ -119,12 +125,6 @@ unload_ecm() {
fi fi
} }
parse_opt() {
local cfg="$1"
config_get_bool enable_bridge_filtering "$cfg" enable_bridge_filtering 0
}
start() { start() {
load_ecm load_ecm
@ -133,8 +133,9 @@ start() {
# If bridge filtering is enabled, apply and persist the sysctl flags # If bridge filtering is enabled, apply and persist the sysctl flags
config_load ecm config_load ecm
config_foreach parse_opt general config_get enable_bridge_filtering general enable_bridge_filtering "0"
# shellcheck disable=2154
if [ "$enable_bridge_filtering" -eq 1 ]; then if [ "$enable_bridge_filtering" -eq 1 ]; then
echo "Bridge filtering is enabled in the ECM config, this will cause issues with NAT loopback!" echo "Bridge filtering is enabled in the ECM config, this will cause issues with NAT loopback!"
enable_bridge_filtering enable_bridge_filtering

View File

@ -1,7 +1,7 @@
config ecm 'global' config ecm 'global'
option acceleration_engine 'auto' option acceleration_engine 'auto'
config general config ecm 'general'
option enable_bridge_filtering '0' option enable_bridge_filtering '0'
option disable_offloads '0' option disable_offloads '0'
option disable_flow_control '0' option disable_flow_control '0'