Compare commits

...

6 Commits

Author SHA1 Message Date
Chaitanya Godavarthi
077009a263 Fix ssid ratelimiting in wifi6 AP
This patch backports some fixes in netfilter
ratelimiting kernel module for wifi6 (linux v4.4.60).
These fixes are ported from until following commit id
6e323887565fe8a23c6c85faf9e395a24affd05c in
the mainline kernel.
Also, fix bugs in client ratelimiting.
Per Client Ratelimiting will be used henceforth
instead of Per ssid Ratelimiting.

Signed-off-by: Chaitanya Godavarthi <chaitanya.kiran@netexperience.com>
2021-04-08 09:49:42 -04:00
Chaitanya Godavarthi
5feaee3327 Add ESMT Nand support and ubi imgs
Add ESMT Nand support, required for ex227/ex447
Add ubi images for ex227, ex447

Signed-off-by: Chaitanya Godavarthi <chaitanya.kiran@netexperience.com>
2021-04-06 09:09:26 -04:00
ravi vaishnav
077e1cda3c Wifi-1720. Fix for the neighbor scan failure on wifi6 APs.
Tested on WF188n (wifi6) and ECW5211 (wifi5) and EA8300 (wifi5) APs.
Checked for the scan results in EquipmentScanDetails event on the cloud.

Signed-off-by: ravi vaishnav <ravi.vaishnav@netexperience.com>
2021-04-06 09:00:31 -04:00
Chaitanya Godavarthi
9cb289b605 openwrt: Revert UBUS pending list iteration method
This commit partially reverts the earlier patch:
"workaround possibly false positive uses of memory after it is freed"

This fixed the crash while freeing a list item in
ubus_process_pending_msg due to a double free.

Signed-off-by: Chaitanya Godavarthi <chaitanya.kiran@netexperience.com>
2021-03-30 16:09:42 +02:00
Yashvardhan
bc9f8ba1a7 opensync: Fix buffer overflow
Fix for buffer overflow happening during VIF state update.

Signed-off-by: Yashvardhan <yashvardhan@netexperience.com>
2021-03-29 17:03:47 +02:00
Yashvardhan
97632b83d6 wifi-1514 Fix IpEvent IP address reporting
Added missing reporting of IP Address in protobuf

Signed-off-by: Yashvardhan <yashvardhan@netexperience.com>
2021-03-25 08:56:01 -04:00
12 changed files with 457 additions and 58 deletions

View File

@@ -48,13 +48,8 @@ define Package/nft-qos/install
$(INSTALL_DIR) $(1)/lib/nft-qos
$(INSTALL_DATA) ./files/lib/* $(1)/lib/nft-qos/
chmod 0700 $(1)/lib/nft-qos/mac-rate.sh
$(INSTALL_DIR) $(1)/etc/config
$(INSTALL_CONF) ./files/nft-qos.config $(1)/etc/config/nft-qos
$(INSTALL_DIR) $(1)/etc/init.d
$(INSTALL_BIN) ./files/nft-qos.init $(1)/etc/init.d/nft-qos
$(INSTALL_DIR) $(1)/etc/hotplug.d/dhcp
$(INSTALL_BIN) ./files/nft-qos-monitor.hotplug $(1)/etc/hotplug.d/dhcp/00-nft-qos-monitor
$(INSTALL_BIN) ./files/nft-qos-dynamic.hotplug $(1)/etc/hotplug.d/dhcp/01-nft-qos-dynamic
endef
$(eval $(call BuildPackage,nft-qos))

View File

@@ -27,23 +27,31 @@ if [ -z "$1" -o -z "$2" -o -z "$3" ]; then
exit 1
fi
logger -t "$1 $2 $3"
logger -t "mac-rate" "$1 $2 $3"
bridge=`uci get wireless.$iface.network`
if [ "$bridge" == "lan" ]; then
dlchain="download_nat"
ulchain="upload_nat"
else
dlchain="download"
ulchain="upload"
fi
if [ "$1" == "add" ]; then
config_load wireless
config_foreach handle_interface wifi-iface download
exists=`nft list chain bridge nft-qos-ssid-lan-bridge download -a | grep -ic $3`
exists=`nft list chain bridge nft-qos-ssid-lan-bridge $dlchain -a | grep -ic $3`
logger -t "mac-rate" "exists = $exists"
if [ "$exists" -ne 0 ]; then
old_drate=`nft list chain bridge nft-qos-ssid-lan-bridge download -a | grep -i $3 | awk -F'kbytes' '{print $1}' | awk '{print $NF}'`
old_drate=`nft list chain bridge nft-qos-ssid-lan-bridge $dlchain -a | grep -i $3 | awk -F'kbytes' '{print $1}' | awk '{print $NF}'`
logger -t "mac-rate" "old_drate=$old_drate"
if [ "$old_drate" -ne "$rate" ]; then
changed=1
id=`nft list chain bridge nft-qos-ssid-lan-bridge download -a | grep -i $3 | awk -F "handle " '{print $2;exit}'`
id=`nft list chain bridge nft-qos-ssid-lan-bridge $dlchain -a | grep -i $3 | awk -F "handle " '{print $2;exit}'`
if [ -n "$id" ]; then
nft delete rule bridge nft-qos-ssid-lan-bridge download handle $id
nft delete rule bridge nft-qos-ssid-lan-bridge $dlchain handle $id
fi
logger -t "mac-rate" "changed DL $old_drate to $rate, del $3"
else
@@ -54,19 +62,19 @@ if [ "$1" == "add" ]; then
if [ "$exists" == 0 -o "$changed" == 1 ]; then
if [ "$rate" -ne 0 ]; then
dok=`nft add rule bridge nft-qos-ssid-lan-bridge download ether daddr $3 limit rate over $rate kbytes/second drop`
dok=`nft add rule bridge nft-qos-ssid-lan-bridge $dlchain ether daddr $3 limit rate over $rate kbytes/second drop`
fi
fi
config_foreach handle_interface wifi-iface upload
exists=`nft list chain bridge nft-qos-ssid-lan-bridge upload -a | grep -ic $3`
exists=`nft list chain bridge nft-qos-ssid-lan-bridge $ulchain -a | grep -ic $3`
if [ "$exists" -ne 0 ]; then
old_urate=`nft list chain bridge nft-qos-ssid-lan-bridge upload -a | grep -i $3 | awk -F'kbytes' '{print $1}' | awk '{print $NF}'`
old_urate=`nft list chain bridge nft-qos-ssid-lan-bridge $ulchain -a | grep -i $3 | awk -F'kbytes' '{print $1}' | awk '{print $NF}'`
if [ "$old_urate" -ne "$rate" ]; then
changed=1
id=`nft list chain bridge nft-qos-ssid-lan-bridge upload -a | grep -i $3 | awk -F "handle " '{print $2;exit}'`
id=`nft list chain bridge nft-qos-ssid-lan-bridge $ulchain -a | grep -i $3 | awk -F "handle " '{print $2;exit}'`
if [ -n "$id" ]; then
nft delete rule bridge nft-qos-ssid-lan-bridge upload handle $id
nft delete rule bridge nft-qos-ssid-lan-bridge $ulchain handle $id
fi
logger -t "mac-rate" "changed UL $old_urate to $rate del $3"
@@ -78,20 +86,20 @@ if [ "$1" == "add" ]; then
if [ "$exists" == 0 -o "$changed" == 1 ]; then
if [ "$rate" -ne 0 ]; then
uok=`nft add rule bridge nft-qos-ssid-lan-bridge upload ether saddr $3 limit rate over $rate kbytes/second drop`
uok=`nft add rule bridge nft-qos-ssid-lan-bridge $ulchain ether saddr $3 limit rate over $rate kbytes/second drop`
fi
fi
elif [ "$1" == "del" ]; then
id=`nft list chain bridge nft-qos-ssid-lan-bridge download -a | grep -i $3 | awk -F "handle " '{print $2;exit}'`
id=`nft list chain bridge nft-qos-ssid-lan-bridge $dlchain -a | grep -i $3 | awk -F "handle " '{print $2;exit}'`
logger -t "mac-rate" "$id $3"
if [ -n "$id" ]; then
nft delete rule bridge nft-qos-ssid-lan-bridge download handle $id
nft delete rule bridge nft-qos-ssid-lan-bridge $dlchain handle $id
fi
id=`nft list chain bridge nft-qos-ssid-lan-bridge upload -a | grep -i $3 | awk -F "handle " '{print $2;exit}'`
id=`nft list chain bridge nft-qos-ssid-lan-bridge $ulchain -a | grep -i $3 | awk -F "handle " '{print $2;exit}'`
if [ -n "$id" ]; then
nft delete rule bridge nft-qos-ssid-lan-bridge upload handle $id
nft delete rule bridge nft-qos-ssid-lan-bridge $ulchain handle $id
fi
fi

View File

@@ -42,8 +42,20 @@ qosdef_append_rule_ssid() { # <section> <operator> <bridge>
rate=$((rate/8))
fi
if [ -z "$iface" -o -z "$rate" -o $rate == 0 ]; then
logger -t "nft-qos" "Error: No interface $iface or rate $rate present"
if [ -z "$iface" ]; then
logger -t "nft-qos" "Error: No interface $iface present"
return
fi
if [ -z "$rate" -o $rate == 0 ]; then
logger -t "nft-qos" "ssid-rate disabled $iface, configure client-rate"
maclist=`iwinfo $iface assoclist | grep dBm | cut -f 1 -s -d" "`
for mac in $maclist
do
logger -t "nft-qos" "Add $mac"
/lib/nft-qos/mac-rate.sh add $iface $mac
done
return
fi

View File

@@ -4,49 +4,26 @@
#
. /lib/nft-qos/core.sh
. /lib/nft-qos/monitor.sh
. /lib/nft-qos/dynamic.sh
. /lib/nft-qos/static.sh
. /lib/nft-qos/priority.sh
. /lib/nft-qos/ssid_ratelimit.sh
START=99
USE_PROCD=1
service_triggers() {
# procd_add_reload_trigger nft-qos wireless
# procd_add_reload_trigger wireless
procd_open_validate
# qosdef_validate_dynamic
# qosdef_validate_static
# qosdef_validate_priority
procd_close_validate
}
start_service() {
config_load nft-qos
# qosdef_init_env
# qosdef_flush_static
# qosdef_flush_dynamic
qosdef_flush_ssid_ratelimit
# qosdef_remove_priority
# qosdef_init_header
# qosdef_init_monitor
# qosdef_validate_dynamic default qosdef_init_dynamic
# qosdef_validate_static default qosdef_init_static
# qosdef_validate_priority default qosdef_init_priority
qosdef_init_ssid_ratelimit
qosdef_init_done
qosdef_start
}
stop_service() {
# qosdef_flush_dynamic
# qosdef_flush_static
# qosdef_remove_priority
qosdef_flush_ssid_ratelimit
qosdef_clean_cache
}

View File

@@ -1,6 +1,6 @@
--- a/src/lib/datapipeline/src/dppline.c
+++ b/src/lib/datapipeline/src/dppline.c
@@ -2147,9 +2147,10 @@ static void dppline_add_stat_events(Sts_
@@ -2147,9 +2147,11 @@ static void dppline_add_stat_events(Sts_
ipe->timestamp_ms = cs_rec->ip_event->timestamp;
if (cs_rec->ip_event->ip_addr) {
@@ -10,11 +10,12 @@
+ uint8_t ip[IPV4_BYTES_LEN] = {0};
+ sscanf(cs_rec->ip_event->ip_addr, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]);
+ ipe->ip_addr.data = malloc(IPV4_BYTES_LEN);
+ memcpy(ipe->ip_addr.data, ip, IPV4_BYTES_LEN);
+ ipe->ip_addr.len = IPV4_BYTES_LEN;
ipe->has_ip_addr = true;
}
}
@@ -2224,10 +2225,10 @@ static void dppline_add_stat_events(Sts_
@@ -2224,10 +2226,11 @@ static void dppline_add_stat_events(Sts_
}
if (cs_rec->connect_event->ip_addr) {
@@ -25,6 +26,7 @@
+ uint8_t ip[IPV4_BYTES_LEN] = {0};
+ sscanf(cs_rec->connect_event->ip_addr, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]);
+ coe->ip_addr.data = malloc(IPV4_BYTES_LEN);
+ memcpy(coe->ip_addr.data, ip, IPV4_BYTES_LEN);
+ coe->ip_addr.len = IPV4_BYTES_LEN;
coe->has_ip_addr = true;
}

View File

@@ -103,7 +103,7 @@ static void vif_add_sta_rate_rule(uint8_t *addr, char *ifname)
char *rule;
ssize_t rule_sz;
LOGI("Add mac rate rule: %s %02X:%02X:%02X:%02X:%02X:%02X",
LOGI("Add mac rate rule:%s: %02X:%02X:%02X:%02X:%02X:%02X",
ifname, addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]);
rule_sz = snprintf(NULL, 0, "/lib/nft-qos/mac-rate.sh add %s %02X:%02X:%02X:%02X:%02X:%02X",
@@ -123,7 +123,7 @@ static void vif_del_sta_rate_rule(uint8_t *addr, char *ifname)
char *rule;
ssize_t rule_sz;
LOGI("Del mac rate rule: %s %02X:%02X:%02X:%02X:%02X:%02X",
LOGI("Del mac rate rule:%s: %02X:%02X:%02X:%02X:%02X:%02X",
ifname, addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]);
rule_sz = snprintf(NULL, 0, "/lib/nft-qos/mac-rate.sh del %s %02X:%02X:%02X:%02X:%02X:%02X",
@@ -147,11 +147,10 @@ static void nl80211_add_station(struct nlattr **tb, char *ifname)
return;
addr = nla_data(tb[NL80211_ATTR_MAC]);
vif_add_sta_rate_rule(addr, ifname);
sta = avl_find_element(&sta_tree, addr, sta, avl);
if (sta) {
vif_add_sta_rate_rule(addr, ifname);
if (sta)
return;
}
wif = avl_find_element(&wif_tree, ifname, wif, avl);
if (!wif)
@@ -168,7 +167,6 @@ static void nl80211_add_station(struct nlattr **tb, char *ifname)
list_add(&sta->iface, &wif->stas);
vif_add_station(sta, ifname, 1);
vif_add_sta_rate_rule(addr, ifname);
}
static void _nl80211_del_station(char *ifname, struct wifi_station *sta)

View File

@@ -547,7 +547,7 @@ int nl80211_scan_trigger(struct nl_call_param *nl_call_param, uint32_t *chan_lis
{
struct nl_msg *msg = nl80211_call_vif(nl_call_param, NL80211_CMD_TRIGGER_SCAN, false);
struct nlattr *freq;
unsigned int i;
unsigned int i, flags = 0;
int ret = 0;
if (!msg)
@@ -555,6 +555,11 @@ int nl80211_scan_trigger(struct nl_call_param *nl_call_param, uint32_t *chan_lis
LOGT("%s: not setting dwell time\n", nl_call_param->ifname);
//nla_put_u16(msg, NL80211_ATTR_MEASUREMENT_DURATION, dwell_time);
/* Add the ap-force flag, otherwise the scan fails on wifi6 APs */
flags |= NL80211_SCAN_FLAG_AP;
nla_put(msg, NL80211_ATTR_SCAN_FLAGS, sizeof(uint32_t), &flags);
freq = nla_nest_start(msg, NL80211_ATTR_SCAN_FREQUENCIES);
for (i = 0; i < chan_num; i ++)
nla_put_u32(msg, i, ieee80211_channel_to_frequency(chan_list[i]));

View File

@@ -697,7 +697,7 @@ bool vif_state_update(struct uci_section *s, struct schema_Wifi_VIF_Config *vcon
char mac[ETH_ALEN * 3];
char *ifname, radio[IF_NAMESIZE];
bool vifIsActive = false;
char network_name[8];
char network_name[IF_NAMESIZE];
LOGT("%s: get state", s->e.name);
@@ -766,8 +766,8 @@ bool vif_state_update(struct uci_section *s, struct schema_Wifi_VIF_Config *vcon
// SCHEMA_SET_INT(vstate.uapsd_enable, false);
if (tb[WIF_ATTR_NETWORK]) {
SCHEMA_SET_STR(vstate.bridge, blobmsg_get_string(tb[WIF_ATTR_NETWORK]));
strcpy(network_name, blobmsg_get_string(tb[WIF_ATTR_NETWORK]));
strncpy(network_name, blobmsg_get_string(tb[WIF_ATTR_NETWORK]), IF_NAMESIZE);
SCHEMA_SET_STR(vstate.bridge, network_name);
}
else
LOGW("%s: unknown bridge/network", s->e.name);

View File

@@ -0,0 +1,47 @@
From 23be9eda1f87b77a772d24510d7096c565021e16 Mon Sep 17 00:00:00 2001
From: Chaitanya Godavarthi <chaitanya.kiran@netexperience.com>
Date: Mon, 29 Mar 2021 19:22:55 -0400
Subject: [PATCH] openwrt: Revert UBUS pending list iteration method
This commit partially reverts the earlier patch:
"workaround possibly false positive uses of memory after it is freed"
This fixed the crash while freeing a list item in
ubus_process_pending_msg due to a double free.
Signed-off-by: Chaitanya Godavarthi <chaitanya.kiran@netexperience.com>
---
...revert-pending-list-iteration-method.patch | 21 +++++++++++++++++++
1 file changed, 21 insertions(+)
create mode 100644 package/system/ubus/patches/revert-pending-list-iteration-method.patch
diff --git a/package/system/ubus/patches/revert-pending-list-iteration-method.patch b/package/system/ubus/patches/revert-pending-list-iteration-method.patch
new file mode 100644
index 0000000000..ccc13fd9f2
--- /dev/null
+++ b/package/system/ubus/patches/revert-pending-list-iteration-method.patch
@@ -0,0 +1,21 @@
+Index: ubus-2019-12-27-041c9d1c/libubus.c
+===================================================================
+--- ubus-2019-12-27-041c9d1c.orig/libubus.c
++++ ubus-2019-12-27-041c9d1c/libubus.c
+@@ -115,12 +115,11 @@ ubus_process_msg(struct ubus_context *ct
+ static void ubus_process_pending_msg(struct uloop_timeout *timeout)
+ {
+ struct ubus_context *ctx = container_of(timeout, struct ubus_context, pending_timer);
+- struct ubus_pending_msg *pending, *tmp;
+-
+- list_for_each_entry_safe(pending, tmp, &ctx->pending, list) {
+- if (ctx->stack_depth)
+- break;
++
++ struct ubus_pending_msg *pending;
+
++ while (!ctx->stack_depth && !list_empty(&ctx->pending)) {
++ pending = list_first_entry(&ctx->pending, struct ubus_pending_msg, list);
+ list_del(&pending->list);
+ ubus_process_msg(ctx, &pending->hdr, -1);
+ free(pending);
--
2.25.1

View File

@@ -0,0 +1,59 @@
From 71f57ba133f983f059fc4daacb4bec67fb35cc09 Mon Sep 17 00:00:00 2001
From: Chaitanya Godavarthi <chaitanya.kiran@netexperience.com>
Date: Tue, 30 Mar 2021 08:59:14 -0400
Subject: [PATCH] Add ESMT nand support
Add ESMT nand support
Signed-off-by: Chaitanya Godavarthi <chaitanya.kiran@netexperience.com>
---
.../ipq807x/patches/110-add-esmt-nand.patch | 37 +++++++++++++++++++
1 file changed, 37 insertions(+)
create mode 100644 target/linux/ipq807x/patches/110-add-esmt-nand.patch
diff --git a/target/linux/ipq807x/patches/110-add-esmt-nand.patch b/target/linux/ipq807x/patches/110-add-esmt-nand.patch
new file mode 100644
index 0000000000..d47a4d0d16
--- /dev/null
+++ b/target/linux/ipq807x/patches/110-add-esmt-nand.patch
@@ -0,0 +1,37 @@
+Index: linux-4.4.60-qsdk-10fd7d14853b7020b804acae690c8acec5d954ce/drivers/mtd/nand/nand_ids.c
+===================================================================
+--- linux-4.4.60-qsdk-10fd7d14853b7020b804acae690c8acec5d954ce.orig/drivers/mtd/nand/nand_ids.c
++++ linux-4.4.60-qsdk-10fd7d14853b7020b804acae690c8acec5d954ce/drivers/mtd/nand/nand_ids.c
+@@ -62,6 +62,12 @@ struct nand_flash_dev nand_flash_ids[] =
+ {"TH58NYG3S0H 8G 1.8V 8-bit",
+ { .id = {0x98, 0xa3, 0x91, 0x26} },
+ SZ_4K, SZ_1K, SZ_256K, 0, 4, 256, NAND_ECC_INFO(8, SZ_512) },
++
++ {"F59D2G81KA 2G 1.8V 8-bit",
++ { .id = {0xc8, 0x5a, 0x90, 0x04} },
++ SZ_2K, SZ_256, SZ_128K, 0, 4, 128, NAND_ECC_INFO(8, SZ_512) },
++
++
+ LEGACY_ID_NAND("NAND 4MiB 5V 8-bit", 0x6B, 4, SZ_8K, SP_OPTIONS),
+ LEGACY_ID_NAND("NAND 4MiB 3,3V 8-bit", 0xE3, 4, SZ_8K, SP_OPTIONS),
+ LEGACY_ID_NAND("NAND 4MiB 3,3V 8-bit", 0xE5, 4, SZ_8K, SP_OPTIONS),
+@@ -190,6 +196,7 @@ struct nand_manufacturers nand_manuf_ids
+ {NAND_MFR_SANDISK, "SanDisk"},
+ {NAND_MFR_INTEL, "Intel"},
+ {NAND_MFR_ATO, "ATO"},
++ {NAND_MFR_ESMT, "ESMT"},
+ {NAND_MFR_GIGA, "GigaDevice"},
+ {NAND_MFR_ATO, "ATO"},
+ {NAND_MFR_WINBOND, "Winbond"},
+Index: linux-4.4.60-qsdk-10fd7d14853b7020b804acae690c8acec5d954ce/include/linux/mtd/nand.h
+===================================================================
+--- linux-4.4.60-qsdk-10fd7d14853b7020b804acae690c8acec5d954ce.orig/include/linux/mtd/nand.h
++++ linux-4.4.60-qsdk-10fd7d14853b7020b804acae690c8acec5d954ce/include/linux/mtd/nand.h
+@@ -778,6 +778,7 @@ static inline struct mtd_info *nand_to_m
+ #define NAND_MFR_ATO 0x9b
+ #define NAND_MFR_WINBOND 0xef
+ #define NAND_MFR_FIDELIX 0xe5
++#define NAND_MFR_ESMT 0xc8
+
+ /* The maximum expected count of bytes in the NAND ID sequence */
+ #define NAND_MAX_ID_LEN 8
--
2.25.1

View File

@@ -0,0 +1,258 @@
From 22c8d560c380cb3b188d2177c96121b9cd1835bd Mon Sep 17 00:00:00 2001
From: Chaitanya Godavarthi <chaitanya.kiran@netexperience.com>
Date: Sun, 4 Apr 2021 15:11:22 -0400
Subject: [PATCH] Fix ssid ratelimiting in wifi6 AP
This patch backports some fixes in
netfilter ratelimiting module for linux v4.4.60.
These fixes are ported from until following commit id
6e323887565fe8a23c6c85faf9e395a24affd05c in
the mainline kernel.
Signed-off-by: Chaitanya Godavarthi <chaitanya.kiran@netexperience.com>
---
.../patches/110-nf-ratelimit-fix.patch | 232 ++++++++++++++++++
1 file changed, 232 insertions(+)
create mode 100644 target/linux/ipq807x/patches/110-nf-ratelimit-fix.patch
diff --git a/target/linux/ipq807x/patches/110-nf-ratelimit-fix.patch b/target/linux/ipq807x/patches/110-nf-ratelimit-fix.patch
new file mode 100644
index 0000000000..d4506944b8
--- /dev/null
+++ b/target/linux/ipq807x/patches/110-nf-ratelimit-fix.patch
@@ -0,0 +1,232 @@
+Index: linux-4.4.60-qsdk-10fd7d14853b7020b804acae690c8acec5d954ce/include/uapi/linux/netfilter/nf_tables.h
+===================================================================
+--- linux-4.4.60-qsdk-10fd7d14853b7020b804acae690c8acec5d954ce.orig/include/uapi/linux/netfilter/nf_tables.h
++++ linux-4.4.60-qsdk-10fd7d14853b7020b804acae690c8acec5d954ce/include/uapi/linux/netfilter/nf_tables.h
+@@ -761,6 +761,10 @@ enum nft_limit_type {
+ NFT_LIMIT_PKT_BYTES
+ };
+
++enum nft_limit_flags {
++ NFT_LIMIT_F_INV = (1 << 0),
++};
++
+ /**
+ * enum nft_limit_attributes - nf_tables limit expression netlink attributes
+ *
+@@ -768,6 +772,7 @@ enum nft_limit_type {
+ * @NFTA_LIMIT_UNIT: refill unit (NLA_U64)
+ * @NFTA_LIMIT_BURST: burst (NLA_U32)
+ * @NFTA_LIMIT_TYPE: type of limit (NLA_U32: enum nft_limit_type)
++ * @NFTA_LIMIT_FLAGS: flags (NLA_U32: enum nft_limit_flags)
+ */
+ enum nft_limit_attributes {
+ NFTA_LIMIT_UNSPEC,
+@@ -775,6 +780,8 @@ enum nft_limit_attributes {
+ NFTA_LIMIT_UNIT,
+ NFTA_LIMIT_BURST,
+ NFTA_LIMIT_TYPE,
++ NFTA_LIMIT_FLAGS,
++ NFTA_LIMIT_PAD,
+ __NFTA_LIMIT_MAX
+ };
+ #define NFTA_LIMIT_MAX (__NFTA_LIMIT_MAX - 1)
+Index: linux-4.4.60-qsdk-10fd7d14853b7020b804acae690c8acec5d954ce/net/netfilter/nft_limit.c
+===================================================================
+--- linux-4.4.60-qsdk-10fd7d14853b7020b804acae690c8acec5d954ce.orig/net/netfilter/nft_limit.c
++++ linux-4.4.60-qsdk-10fd7d14853b7020b804acae690c8acec5d954ce/net/netfilter/nft_limit.c
+@@ -17,15 +17,15 @@
+ #include <linux/netfilter/nf_tables.h>
+ #include <net/netfilter/nf_tables.h>
+
+-static DEFINE_SPINLOCK(limit_lock);
+-
+ struct nft_limit {
++ spinlock_t lock;
+ u64 last;
+ u64 tokens;
+ u64 tokens_max;
+ u64 rate;
+ u64 nsecs;
+ u32 burst;
++ bool invert;
+ };
+
+ static inline bool nft_limit_eval(struct nft_limit *limit, u64 cost)
+@@ -33,7 +33,7 @@ static inline bool nft_limit_eval(struct
+ u64 now, tokens;
+ s64 delta;
+
+- spin_lock_bh(&limit_lock);
++ spin_lock_bh(&limit->lock);
+ now = ktime_get_ns();
+ tokens = limit->tokens + now - limit->last;
+ if (tokens > limit->tokens_max)
+@@ -43,12 +43,12 @@ static inline bool nft_limit_eval(struct
+ delta = tokens - cost;
+ if (delta >= 0) {
+ limit->tokens = delta;
+- spin_unlock_bh(&limit_lock);
+- return false;
++ spin_unlock_bh(&limit->lock);
++ return limit->invert;
+ }
+ limit->tokens = tokens;
+- spin_unlock_bh(&limit_lock);
+- return true;
++ spin_unlock_bh(&limit->lock);
++ return !limit->invert;
+ }
+
+ static int nft_limit_init(struct nft_limit *limit,
+@@ -65,20 +65,31 @@ static int nft_limit_init(struct nft_lim
+ limit->nsecs = unit * NSEC_PER_SEC;
+ if (limit->rate == 0 || limit->nsecs < unit)
+ return -EOVERFLOW;
+- limit->tokens = limit->tokens_max = limit->nsecs;
+-
+- if (tb[NFTA_LIMIT_BURST]) {
+- u64 rate;
+
++ if (tb[NFTA_LIMIT_BURST])
+ limit->burst = ntohl(nla_get_be32(tb[NFTA_LIMIT_BURST]));
++ else
++ limit->burst = 0;
++
++ if (limit->rate + limit->burst < limit->rate)
++ return -EOVERFLOW;
++
++ /* The token bucket size limits the number of tokens can be
++ * accumulated. tokens_max specifies the bucket size.
++ * tokens_max = unit * (rate + burst) / rate.
++ */
++ limit->tokens = div_u64(limit->nsecs * (limit->rate + limit->burst),
++ limit->rate);
++ limit->tokens_max = limit->tokens;
+
+- rate = limit->rate + limit->burst;
+- if (rate < limit->rate)
+- return -EOVERFLOW;
++ if (tb[NFTA_LIMIT_FLAGS]) {
++ u32 flags = ntohl(nla_get_be32(tb[NFTA_LIMIT_FLAGS]));
+
+- limit->rate = rate;
++ if (flags & NFT_LIMIT_F_INV)
++ limit->invert = true;
+ }
+ limit->last = ktime_get_ns();
++ spin_lock_init(&limit->lock);
+
+ return 0;
+ }
+@@ -86,13 +97,14 @@ static int nft_limit_init(struct nft_lim
+ static int nft_limit_dump(struct sk_buff *skb, const struct nft_limit *limit,
+ enum nft_limit_type type)
+ {
++ u32 flags = limit->invert ? NFT_LIMIT_F_INV : 0;
+ u64 secs = div_u64(limit->nsecs, NSEC_PER_SEC);
+- u64 rate = limit->rate - limit->burst;
+
+- if (nla_put_be64(skb, NFTA_LIMIT_RATE, cpu_to_be64(rate)) ||
++ if (nla_put_be64(skb, NFTA_LIMIT_RATE, cpu_to_be64(limit->rate)) ||
+ nla_put_be64(skb, NFTA_LIMIT_UNIT, cpu_to_be64(secs)) ||
+ nla_put_be32(skb, NFTA_LIMIT_BURST, htonl(limit->burst)) ||
+- nla_put_be32(skb, NFTA_LIMIT_TYPE, htonl(type)))
++ nla_put_be32(skb, NFTA_LIMIT_TYPE, htonl(type)) ||
++ nla_put_be32(skb, NFTA_LIMIT_FLAGS, htonl(flags)))
+ goto nla_put_failure;
+ return 0;
+
+@@ -120,6 +132,7 @@ static const struct nla_policy nft_limit
+ [NFTA_LIMIT_UNIT] = { .type = NLA_U64 },
+ [NFTA_LIMIT_BURST] = { .type = NLA_U32 },
+ [NFTA_LIMIT_TYPE] = { .type = NLA_U32 },
++ [NFTA_LIMIT_FLAGS] = { .type = NLA_U32 },
+ };
+
+ static int nft_limit_pkts_init(const struct nft_ctx *ctx,
+@@ -133,7 +146,7 @@ static int nft_limit_pkts_init(const str
+ if (err < 0)
+ return err;
+
+- priv->cost = div_u64(priv->limit.nsecs, priv->limit.rate);
++ priv->cost = div64_u64(priv->limit.nsecs, priv->limit.rate);
+ return 0;
+ }
+
+@@ -153,40 +166,40 @@ static const struct nft_expr_ops nft_lim
+ .dump = nft_limit_pkts_dump,
+ };
+
+-static void nft_limit_pkt_bytes_eval(const struct nft_expr *expr,
+- struct nft_regs *regs,
+- const struct nft_pktinfo *pkt)
++static void nft_limit_bytes_eval(const struct nft_expr *expr,
++ struct nft_regs *regs,
++ const struct nft_pktinfo *pkt)
+ {
+ struct nft_limit *priv = nft_expr_priv(expr);
+- u64 cost = div_u64(priv->nsecs * pkt->skb->len, priv->rate);
++ u64 cost = div64_u64(priv->nsecs * pkt->skb->len, priv->rate);
+
+ if (nft_limit_eval(priv, cost))
+ regs->verdict.code = NFT_BREAK;
+ }
+
+-static int nft_limit_pkt_bytes_init(const struct nft_ctx *ctx,
+- const struct nft_expr *expr,
+- const struct nlattr * const tb[])
++static int nft_limit_bytes_init(const struct nft_ctx *ctx,
++ const struct nft_expr *expr,
++ const struct nlattr * const tb[])
+ {
+ struct nft_limit *priv = nft_expr_priv(expr);
+
+ return nft_limit_init(priv, tb);
+ }
+
+-static int nft_limit_pkt_bytes_dump(struct sk_buff *skb,
+- const struct nft_expr *expr)
++static int nft_limit_bytes_dump(struct sk_buff *skb,
++ const struct nft_expr *expr)
+ {
+ const struct nft_limit *priv = nft_expr_priv(expr);
+
+ return nft_limit_dump(skb, priv, NFT_LIMIT_PKT_BYTES);
+ }
+
+-static const struct nft_expr_ops nft_limit_pkt_bytes_ops = {
++static const struct nft_expr_ops nft_limit_bytes_ops = {
+ .type = &nft_limit_type,
+ .size = NFT_EXPR_SIZE(sizeof(struct nft_limit)),
+- .eval = nft_limit_pkt_bytes_eval,
+- .init = nft_limit_pkt_bytes_init,
+- .dump = nft_limit_pkt_bytes_dump,
++ .eval = nft_limit_bytes_eval,
++ .init = nft_limit_bytes_init,
++ .dump = nft_limit_bytes_dump,
+ };
+
+ static const struct nft_expr_ops *
+@@ -200,7 +213,7 @@ nft_limit_select_ops(const struct nft_ct
+ case NFT_LIMIT_PKTS:
+ return &nft_limit_pkts_ops;
+ case NFT_LIMIT_PKT_BYTES:
+- return &nft_limit_pkt_bytes_ops;
++ return &nft_limit_bytes_ops;
+ }
+ return ERR_PTR(-EOPNOTSUPP);
+ }
+Index: linux-4.4.60-qsdk-10fd7d14853b7020b804acae690c8acec5d954ce/net/bridge/br_private.h
+===================================================================
+--- linux-4.4.60-qsdk-10fd7d14853b7020b804acae690c8acec5d954ce.orig/net/bridge/br_private.h
++++ linux-4.4.60-qsdk-10fd7d14853b7020b804acae690c8acec5d954ce/net/bridge/br_private.h
+@@ -926,9 +926,6 @@ BR_HOOK(uint8_t pf, unsigned int hook, s
+ struct sk_buff *skb, struct net_device *in, struct net_device *out,
+ int (*okfn)(struct net *, struct sock *, struct sk_buff *))
+ {
+- if (!br_netfilter_run_hooks())
+- return okfn(net, sk, skb);
+-
+ return NF_HOOK(pf, hook, net, sk, skb, in, out, okfn);
+ }
+
--
2.25.1

View File

@@ -0,0 +1,38 @@
From 2fa0a5779dbc4a614b19cc690a8fa14f1ca33b33 Mon Sep 17 00:00:00 2001
From: Chaitanya Godavarthi <chaitanya.kiran@netexperience.com>
Date: Thu, 1 Apr 2021 15:05:13 -0400
Subject: [PATCH] openwrt: Add ubi images for ex227, ex447
Add ubi images for ex227, ex447
---
target/linux/ipq807x/image/ipq807x.mk | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/target/linux/ipq807x/image/ipq807x.mk b/target/linux/ipq807x/image/ipq807x.mk
index 65bf99dd9c..7081769407 100644
--- a/target/linux/ipq807x/image/ipq807x.mk
+++ b/target/linux/ipq807x/image/ipq807x.mk
@@ -50,6 +50,10 @@ define Device/tplink_ex227
DEVICE_DTS_CONFIG=config@hk07
SUPPORTED_DEVICES := tplink,ex227
DEVICE_PACKAGES := ath11k-wifi-tplink-ex227
+ IMAGES := sysupgrade.tar nand-factory.bin nand-factory.ubi
+ IMAGE/sysupgrade.tar := sysupgrade-tar | append-metadata
+ IMAGE/nand-factory.bin := append-ubi | qsdk-ipq-factory-nand
+ IMAGE/nand-factory.ubi := append-ubi
endef
TARGET_DEVICES += tplink_ex227
@@ -59,5 +63,9 @@ define Device/tplink_ex447
DEVICE_DTS_CONFIG=config@hk09
SUPPORTED_DEVICES := tplink,ex447
DEVICE_PACKAGES := ath11k-wifi-tplink-ex447
+ IMAGES := sysupgrade.tar nand-factory.bin nand-factory.ubi
+ IMAGE/sysupgrade.tar := sysupgrade-tar | append-metadata
+ IMAGE/nand-factory.bin := append-ubi | qsdk-ipq-factory-nand
+ IMAGE/nand-factory.ubi := append-ubi
endef
TARGET_DEVICES += tplink_ex447
--
2.25.1