[][kernel][common][hnat][Fix Issue of nf_conntrack statistics missing after read all_entry]
[Description]
Fix Issue of nf_conntrack statistics missing after after all_entry
Without this patch, the all_entry read operation would not update
nf_conntrack statistics, then the statistic values would be missing.
[Release-log]
N/A
Change-Id: I85040e13a98ff5f334bf0be78ea2298fb11cdf47
Reviewed-on: https://gerrit.mediatek.inc/c/openwrt/feeds/mtk_openwrt_feeds/+/9116932
diff --git a/21.02/files/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat.h b/21.02/files/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat.h
index 991a875..6af93af 100644
--- a/21.02/files/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat.h
+++ b/21.02/files/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat.h
@@ -888,6 +888,7 @@
struct hnat_accounting {
u64 bytes;
u64 packets;
+ u64 nfct; /* For retrieving nf_conn info */
};
enum mtk_hnat_version {
diff --git a/21.02/files/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat_debugfs.c b/21.02/files/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat_debugfs.c
index 31271d8..d111cb3 100644
--- a/21.02/files/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat_debugfs.c
+++ b/21.02/files/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat_debugfs.c
@@ -18,6 +18,8 @@
#include <linux/iopoll.h>
#include <linux/inet.h>
#include <net/ipv6.h>
+#include <net/netfilter/nf_conntrack.h>
+#include <net/netfilter/nf_conntrack_acct.h>
#include "hnat.h"
#include "nf_hnat_mtk.h"
@@ -976,6 +978,30 @@
}
+static int hnat_nfct_counter_update(struct mtk_hnat *h, u32 ppe_id,
+ u32 index, u64 bytes, u64 packets)
+{
+ struct nf_conn *ct;
+ struct nf_conn_acct *acct;
+ struct nf_conn_counter *counter;
+ enum ip_conntrack_info ctinfo;
+ u64 nfct;
+
+ nfct = h->acct[ppe_id][index].nfct;
+ ctinfo = nfct & NFCT_INFOMASK;
+ ct = (struct nf_conn *)(nfct & NFCT_PTRMASK);
+ if (ct) {
+ acct = nf_conn_acct_find(ct);
+ if (acct) {
+ counter = acct->counter;
+ atomic64_add(bytes, &counter[CTINFO2DIR(ctinfo)].bytes);
+ atomic64_add(packets, &counter[CTINFO2DIR(ctinfo)].packets);
+ }
+ }
+
+ return 0;
+}
+
struct hnat_accounting *hnat_get_count(struct mtk_hnat *h, u32 ppe_id,
u32 index, struct hnat_accounting *diff)
@@ -1002,6 +1028,8 @@
diff->packets = packets;
}
+ hnat_nfct_counter_update(h, ppe_id, index, bytes, packets);
+
return &h->acct[ppe_id][index];
}
EXPORT_SYMBOL(hnat_get_count);
diff --git a/21.02/files/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat_nf_hook.c b/21.02/files/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat_nf_hook.c
index c5e26e8..b86a7dd 100644
--- a/21.02/files/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat_nf_hook.c
+++ b/21.02/files/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat_nf_hook.c
@@ -1893,9 +1893,11 @@
/*reset statistic for this entry*/
if (hnat_priv->data->per_flow_accounting &&
skb_hnat_entry(skb) < hnat_priv->foe_etry_num &&
- skb_hnat_ppe(skb) < CFG_PPE_NUM)
+ skb_hnat_ppe(skb) < CFG_PPE_NUM) {
memset(&hnat_priv->acct[skb_hnat_ppe(skb)][skb_hnat_entry(skb)],
- 0, sizeof(struct mib_entry));
+ 0, sizeof(struct hnat_accounting));
+ hnat_priv->acct[skb_hnat_ppe(skb)][skb_hnat_entry(skb)].nfct = skb_get_nfct(skb);
+ }
return 0;
}
@@ -2365,28 +2367,6 @@
}
}
-static void mtk_hnat_nf_update(struct sk_buff *skb)
-{
- struct nf_conn *ct;
- struct nf_conn_acct *acct;
- struct nf_conn_counter *counter;
- enum ip_conntrack_info ctinfo;
- struct hnat_accounting diff;
-
- ct = nf_ct_get(skb, &ctinfo);
- if (ct) {
- if (!hnat_get_count(hnat_priv, skb_hnat_ppe(skb), skb_hnat_entry(skb), &diff))
- return;
-
- acct = nf_conn_acct_find(ct);
- if (acct) {
- counter = acct->counter;
- atomic64_add(diff.packets, &counter[CTINFO2DIR(ctinfo)].packets);
- atomic64_add(diff.bytes, &counter[CTINFO2DIR(ctinfo)].bytes);
- }
- }
-}
-
int mtk_464xlat_fill_mac(struct foe_entry *entry, struct sk_buff *skb,
const struct net_device *out, bool l2w)
{
@@ -2731,7 +2711,7 @@
case HIT_BIND_KEEPALIVE_DUP_OLD_HDR:
/* update hnat count to nf_conntrack by keepalive */
if (hnat_priv->data->per_flow_accounting && hnat_priv->nf_stat_en)
- mtk_hnat_nf_update(skb);
+ hnat_get_count(hnat_priv, skb_hnat_ppe(skb), skb_hnat_entry(skb), NULL);
if (fn && !mtk_hnat_accel_type(skb))
break;