blob: 5aef8260771adcefbd919b98834232157029c2c1 [file] [log] [blame]
developer12ea7142024-03-28 15:18:08 +08001// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 * Copyright (C) 2023 MediaTek Inc.
4 *
5 * Author: Chris.Chou <chris.chou@mediatek.com>
6 * Ren-Ting Wang <ren-ting.wang@mediatek.com>
7 * Peter Wang <peterjy.wang@mediatek.com>
8 */
9
10#include <linux/bitops.h>
11
12#include <mtk_eth_soc.h>
13#include <mtk_hnat/hnat.h>
14#include <mtk_hnat/nf_hnat_mtk.h>
15
16#include <pce/cdrt.h>
17#include <pce/cls.h>
18#include <pce/netsys.h>
19
20#include "crypto-eip/crypto-eip.h"
21#include "crypto-eip/ddk-wrapper.h"
22#include "crypto-eip/internal.h"
23
24
25struct mtk_CDRT_DTLS_entry CDRT_DTLS_params;
26struct DTLSResourceMgmt *DTLSResourceTable[CAPWAP_MAX_TUNNEL_NUM];
27
28static int
29mtk_setup_cdrt_dtls(struct cdrt_entry *cdrt_entry_p, enum cdrt_type type)
30{
31 struct cdrt_desc *cdesc = &cdrt_entry_p->desc;
32
33 cdesc->desc1.dtls.pkt_len = 0;
34 cdesc->desc1.dtls.rsv1 = 0;
35 cdesc->desc1.dtls.capwap = 1;
36 if (type == CDRT_ENCRYPT)
37 cdesc->desc1.dtls.dir = 0;
38 else
39 cdesc->desc1.dtls.dir = 1;
40 cdesc->desc1.dtls.content_type = 3;
41 cdesc->desc1.dtls.type = 3;
42 cdesc->desc1.aad_len = 0;
43 cdesc->desc1.rsv1 = 0;
44 cdesc->desc1.app_id = 0;
45 cdesc->desc1.token_len = 0x30;
46 cdesc->desc1.rsv2 = 0;
47 cdesc->desc1.p_tr[0] = 0xfffffffc;
48 cdesc->desc1.p_tr[1] = 0xffffffff;
49
50 cdesc->desc2.usr = 0;
51 cdesc->desc2.rsv1 = 0;
52 cdesc->desc2.strip_pad = 1;
53 cdesc->desc2.allow_pad = 1;
54 cdesc->desc2.hw_srv = 0x28;
55 cdesc->desc2.rsv2 = 0;
56 cdesc->desc2.flow_lookup = 0;
57 cdesc->desc2.rsv3 = 0;
58 cdesc->desc2.ofs = 14;
59 cdesc->desc2.next_hdr = 0;
60 cdesc->desc2.fl = 0;
61 cdesc->desc2.ip4_chksum = 0;
62 if (type == CDRT_ENCRYPT)
63 cdesc->desc2.l4_chksum = 1;
64 else
65 cdesc->desc2.l4_chksum = 0;
66 cdesc->desc2.parse_eth = 0;
67 cdesc->desc2.keep_outer = 0;
68 cdesc->desc2.rsv4 = 0;
69 cdesc->desc2.rsv5[0] = 0;
70 cdesc->desc2.rsv5[1] = 0;
71
72 cdesc->desc3.option_meta[0] = 0x00000000;
73 cdesc->desc3.option_meta[1] = 0x00000000;
74 cdesc->desc3.option_meta[2] = 0x00000000;
75 cdesc->desc3.option_meta[3] = 0x00000000;
76
77 return mtk_pce_cdrt_entry_write(cdrt_entry_p);
78}
79
80
81static int
82mtk_add_cdrt_dtls(enum cdrt_type type)
83{
84 int ret = 0;
85 struct cdrt_entry *cdrt_entry_p = NULL;
86
87 cdrt_entry_p = mtk_pce_cdrt_entry_alloc(type);
88 if (cdrt_entry_p == NULL) {
89 CRYPTO_ERR("%s: mtk_pce_cdrt_entry_alloc failed!\n", __func__);
90 return 1;
91 }
92
93 ret = mtk_setup_cdrt_dtls(cdrt_entry_p, type);
94 if (ret)
95 goto free_cdrt;
96
97 if (type == CDRT_DECRYPT)
98 CDRT_DTLS_params.cdrt_inbound = cdrt_entry_p;
99 else
100 CDRT_DTLS_params.cdrt_outbound = cdrt_entry_p;
101 return ret;
102
103free_cdrt:
104 mtk_pce_cdrt_entry_free(cdrt_entry_p);
105
106 return ret;
107}
108
109
110void
111mtk_update_cdrt_idx(struct mtk_cdrt_idx_param *cdrt_idx_params_p)
112{
113 cdrt_idx_params_p->cdrt_idx_inbound = CDRT_DTLS_params.cdrt_inbound->idx;
114 cdrt_idx_params_p->cdrt_idx_outbound = CDRT_DTLS_params.cdrt_outbound->idx;
115}
116
117
118void
119mtk_dtls_capwap_init(void)
120{
121 int i = 0;
122 // init cdrt for dtls
123 if (mtk_add_cdrt_dtls(CDRT_DECRYPT))
124 CRYPTO_ERR("%s: CDRT DECRYPT for DTLS init failed!\n", __func__);
125
126 if (mtk_add_cdrt_dtls(CDRT_ENCRYPT))
127 CRYPTO_ERR("%s: CDRT ENCRYPT for DTLS init failed!\n", __func__);
128 // add hook function for tops driver
129#if defined(CONFIG_MTK_TOPS_CAPWAP_DTLS)
130 mtk_submit_SAparam_to_eip_driver = mtk_update_dtls_param;
131 mtk_remove_SAparam_to_eip_driver = mtk_remove_dtls_param;
132 mtk_update_cdrt_idx_from_eip_driver = mtk_update_cdrt_idx;
133#endif
134
135 // init table as NULL
136 for (i = 0; i < CAPWAP_MAX_TUNNEL_NUM; i++)
137 DTLSResourceTable[i] = NULL;
138}
139
140
141void
142mtk_dtls_capwap_deinit(void)
143{
144 int i = 0;
145 // Loop and check if all SA in table are freed
146 for (i = 0; i < CAPWAP_MAX_TUNNEL_NUM; i++) {
147 if (DTLSResourceTable[i] != NULL)
148 mtk_ddk_remove_dtls_param(&DTLSResourceTable[i]);
149 }
150
151 if (CDRT_DTLS_params.cdrt_inbound != NULL)
152 mtk_pce_cdrt_entry_free(CDRT_DTLS_params.cdrt_inbound);
153 if (CDRT_DTLS_params.cdrt_outbound != NULL)
154 mtk_pce_cdrt_entry_free(CDRT_DTLS_params.cdrt_outbound);
155#if defined(CONFIG_MTK_TOPS_CAPWAP_DTLS)
156 mtk_update_cdrt_idx_from_eip_driver = NULL;
157 mtk_submit_SAparam_to_eip_driver = NULL;
158 mtk_remove_SAparam_to_eip_driver = NULL;
159#endif
160}
161
162void
163mtk_update_dtls_param(struct DTLS_param *DTLSParam_p, int TnlIdx)
164{
165 char *TestName_p;
166
167 if (DTLSResourceTable[TnlIdx] != NULL) {
168 CRYPTO_NOTICE("tnl_idx-%d- existed, will be removed first.\n", TnlIdx);
169 mtk_ddk_remove_dtls_param(&DTLSResourceTable[TnlIdx]);
170 }
171
172 TestName_p = "Inline DTLS-CAPWAP SA setting";
173
174 if (mtk_capwap_dtls_offload(false, true, true, true, false, DTLSParam_p,
175 &DTLSResourceTable[TnlIdx]))
176 CRYPTO_INFO("%s DONE\n", TestName_p);
177 else
178 CRYPTO_ERR("%s: %s FAILED\n", __func__, TestName_p);
179}
180
181void mtk_remove_dtls_param(struct DTLS_param *DTLSParam_p, int TnlIdx)
182{
183 mtk_ddk_remove_dtls_param(&DTLSResourceTable[TnlIdx]);
184}