[][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);
}