[][openwrt][mt7988][tops][separate CLS_ENTRY and TOPS_ENTRY dependency]

[Description]
Refactor TOPS CLS_ENTRY and TOPS_ENTRY.

Separate CLS_ENTRY and TOPS_ENTRY implicit mapping relationship.

In previous implementation, 1 protocol can only occupy a CLS_ENTRY and a
CLS_ENTRY is corresponding to a TOPS_ENTRY. 1 TOPS_ENTRY will have a
tunnel offload function inside TOPS firmware.

However, some of the protocol may occupy several CLS_ENTRY such as ESP.
This kind of protocol may use different CLS_ENTRY to distinguish each
session.
This leads to a problem that TOPS firmware can not handle same protocol
with different TOPS_ENTRY.

To solve this problem, the idea of CLS_ENTRY and TOPS_ENTRY is no longer 1
to 1 mapping. CLS_ENTRY is now allocated dynamically and its index is
carried inside tops_tnl_params so that TOPS firmware can map that
CLS_ENTRY to a TOPS_ENTRY which will be corresponding to a tunnel offload
function.

[Release-log]
N/A

Change-Id: I162a899353b9935602d971947d8514ba8d4e7d3e
Reviewed-on: https://gerrit.mediatek.inc/c/openwrt/feeds/mtk_openwrt_feeds/+/7923904
diff --git a/package-21.02/kernel/tops/src/protocol/l2tp/udp_l2tp_data.c b/package-21.02/kernel/tops/src/protocol/l2tp/udp_l2tp_data.c
index bde94e5..e26dc62 100644
--- a/package-21.02/kernel/tops/src/protocol/l2tp/udp_l2tp_data.c
+++ b/package-21.02/kernel/tops/src/protocol/l2tp/udp_l2tp_data.c
@@ -12,31 +12,31 @@
 #include <linux/udp.h>
 
 #include <pce/cls.h>
+#include <pce/netsys.h>
 #include <pce/pce.h>
 
 #include "protocol/l2tp/l2tp.h"
 #include "protocol/ppp/ppp.h"
 #include "tunnel.h"
 
-static struct cls_entry udp_l2tp_data_cls_entry = {
-	.entry = CLS_ENTRY_UDP_L2TP_DATA,
-	.cdesc = {
-		.fport = 0x3,
-		.tport_idx = 0x4,
-		.tag_m = 0x3,
-		.tag = 0x2,
-		.dip_match_m = 0x1,
-		.dip_match = 0x1,
-		.l4_type_m = 0xFF,
-		.l4_type = 0x11,
-		.l4_valid_m = 0x7,
-		.l4_valid = 0x7,
-		.l4_dport_m = 0xFFFF,
-		.l4_dport = 1701,
-		.l4_hdr_usr_data_m = 0x80030000,
-		.l4_hdr_usr_data = 0x00020000,
-	},
-};
+static int udp_l2tp_data_cls_entry_setup(struct tops_tnl_info *tnl_info,
+					 struct cls_desc *cdesc)
+{
+	CLS_DESC_DATA(cdesc, fport, PSE_PORT_PPE0);
+	CLS_DESC_DATA(cdesc, tport_idx, 0x4);
+	CLS_DESC_MASK_DATA(cdesc, tag, CLS_DESC_TAG_MASK, CLS_DESC_TAG_MATCH_L4_USR);
+	CLS_DESC_MASK_DATA(cdesc, dip_match, CLS_DESC_DIP_MATCH, CLS_DESC_DIP_MATCH);
+	CLS_DESC_MASK_DATA(cdesc, l4_type, CLS_DESC_L4_TYPE_MASK, IPPROTO_UDP);
+	CLS_DESC_MASK_DATA(cdesc, l4_valid,
+			   CLS_DESC_L4_VALID_MASK,
+			   CLS_DESC_VALID_UPPER_HALF_WORD_BIT |
+			   CLS_DESC_VALID_LOWER_HALF_WORD_BIT |
+			   CLS_DESC_VALID_DPORT_BIT);
+	CLS_DESC_MASK_DATA(cdesc, l4_dport, CLS_DESC_L4_DPORT_MASK, 1701);
+	CLS_DESC_MASK_DATA(cdesc, l4_hdr_usr_data, 0x80030000, 0x00020000);
+
+	return 0;
+}
 
 static inline bool l2tpv2_offload_match(struct udp_l2tp_data_hdr *l2tp)
 {
@@ -293,6 +293,7 @@
 
 static struct tops_tnl_type udp_l2tp_data_type = {
 	.type_name = "udp-l2tp-data",
+	.cls_entry_setup = udp_l2tp_data_cls_entry_setup,
 	.tnl_decap_param_setup = udp_l2tp_data_tnl_decap_param_setup,
 	.tnl_encap_param_setup = udp_l2tp_data_tnl_encap_param_setup,
 	.tnl_debug_param_setup = udp_l2tp_data_tnl_debug_param_setup,
@@ -304,24 +305,10 @@
 
 int mtk_tops_udp_l2tp_data_init(void)
 {
-	int ret = 0;
-
-	ret = mtk_tops_tnl_type_register(&udp_l2tp_data_type);
-	if (ret)
-		return ret;
-
-	ret = mtk_pce_cls_entry_register(&udp_l2tp_data_cls_entry);
-	if (ret) {
-		mtk_tops_tnl_type_unregister(&udp_l2tp_data_type);
-		return ret;
-	}
-
-	return ret;
+	return mtk_tops_tnl_type_register(&udp_l2tp_data_type);
 }
 
 void mtk_tops_udp_l2tp_data_deinit(void)
 {
-	mtk_pce_cls_entry_unregister(&udp_l2tp_data_cls_entry);
-
 	mtk_tops_tnl_type_unregister(&udp_l2tp_data_type);
 }