blob: 7fc68f60369ddf94feae4c2b4870d4fbffd3154c [file] [log] [blame]
Pavel Kotucek9c7ef032016-12-21 07:46:45 +01001/*
2 *------------------------------------------------------------------
3 * ipsec_api.c - ipsec api
4 *
5 * Copyright (c) 2016 Cisco and/or its affiliates.
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at:
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 *------------------------------------------------------------------
18 */
19
20#include <vnet/vnet.h>
21#include <vlibmemory/api.h>
22
23#include <vnet/interface.h>
24#include <vnet/api_errno.h>
25#include <vnet/ip/ip.h>
Neale Ranns17dcec02019-01-09 21:22:20 -080026#include <vnet/ip/ip_types_api.h>
Prashant Maheshwaridbf68c92019-11-14 12:42:59 +053027#include <vnet/ipsec/ipsec_types_api.h>
Neale Rannsdd4ccf22020-06-30 07:47:14 +000028#include <vnet/tunnel/tunnel_types_api.h>
Pierre Pfister4c422f92018-12-10 11:19:08 +010029#include <vnet/fib/fib.h>
Neale Ranns12989b52019-09-26 16:20:19 +000030#include <vnet/ipip/ipip.h>
Neale Ranns041add72020-01-02 04:06:10 +000031#include <vnet/tunnel/tunnel_types_api.h>
Pavel Kotucek9c7ef032016-12-21 07:46:45 +010032#include <vnet/ipsec/ipsec.h>
Neale Rannsc87b66c2019-02-07 07:26:12 -080033#include <vnet/ipsec/ipsec_tun.h>
Neale Rannsdd4ccf22020-06-30 07:47:14 +000034#include <vnet/ipsec/ipsec_itf.h>
Pavel Kotucek9c7ef032016-12-21 07:46:45 +010035
Filip Tehlarc73f3292021-06-22 08:21:31 +000036#include <vnet/format_fns.h>
37#include <vnet/ipsec/ipsec.api_enum.h>
38#include <vnet/ipsec/ipsec.api_types.h>
Pavel Kotucek9c7ef032016-12-21 07:46:45 +010039
Filip Tehlarc73f3292021-06-22 08:21:31 +000040#define REPLY_MSG_ID_BASE ipsec_main.msg_id_base
Pavel Kotucek9c7ef032016-12-21 07:46:45 +010041#include <vlibapi/api_helper_macros.h>
42
Klement Sekerab4d30532018-11-08 13:00:02 +010043static void
44vl_api_ipsec_spd_add_del_t_handler (vl_api_ipsec_spd_add_del_t * mp)
Pavel Kotucek9c7ef032016-12-21 07:46:45 +010045{
Pavel Kotucek9c7ef032016-12-21 07:46:45 +010046 vlib_main_t *vm __attribute__ ((unused)) = vlib_get_main ();
47 vl_api_ipsec_spd_add_del_reply_t *rmp;
48 int rv;
49
Pavel Kotucek9c7ef032016-12-21 07:46:45 +010050 rv = ipsec_add_del_spd (vm, ntohl (mp->spd_id), mp->is_add);
Pavel Kotucek9c7ef032016-12-21 07:46:45 +010051
52 REPLY_MACRO (VL_API_IPSEC_SPD_ADD_DEL_REPLY);
Pavel Kotucek9c7ef032016-12-21 07:46:45 +010053}
54
55static void vl_api_ipsec_interface_add_del_spd_t_handler
56 (vl_api_ipsec_interface_add_del_spd_t * mp)
57{
58 vlib_main_t *vm __attribute__ ((unused)) = vlib_get_main ();
59 vl_api_ipsec_interface_add_del_spd_reply_t *rmp;
60 int rv;
61 u32 sw_if_index __attribute__ ((unused));
62 u32 spd_id __attribute__ ((unused));
63
64 sw_if_index = ntohl (mp->sw_if_index);
65 spd_id = ntohl (mp->spd_id);
66
67 VALIDATE_SW_IF_INDEX (mp);
68
Pavel Kotucek9c7ef032016-12-21 07:46:45 +010069 rv = ipsec_set_interface_spd (vm, sw_if_index, spd_id, mp->is_add);
Pavel Kotucek9c7ef032016-12-21 07:46:45 +010070
71 BAD_SW_IF_INDEX_LABEL;
72
73 REPLY_MACRO (VL_API_IPSEC_INTERFACE_ADD_DEL_SPD_REPLY);
74}
75
Neale Rannsc87b66c2019-02-07 07:26:12 -080076static void vl_api_ipsec_tunnel_protect_update_t_handler
77 (vl_api_ipsec_tunnel_protect_update_t * mp)
78{
79 vlib_main_t *vm __attribute__ ((unused)) = vlib_get_main ();
80 vl_api_ipsec_tunnel_protect_update_reply_t *rmp;
81 u32 sw_if_index, ii, *sa_ins = NULL;
Neale Ranns28287212019-12-16 00:53:11 +000082 ip_address_t nh;
Neale Rannsc87b66c2019-02-07 07:26:12 -080083 int rv;
84
85 sw_if_index = ntohl (mp->tunnel.sw_if_index);
86
87 VALIDATE_SW_IF_INDEX (&(mp->tunnel));
88
Neale Rannsc87b66c2019-02-07 07:26:12 -080089 for (ii = 0; ii < mp->tunnel.n_sa_in; ii++)
90 vec_add1 (sa_ins, ntohl (mp->tunnel.sa_in[ii]));
91
Neale Ranns28287212019-12-16 00:53:11 +000092 ip_address_decode2 (&mp->tunnel.nh, &nh);
93
94 rv = ipsec_tun_protect_update (sw_if_index, &nh,
Neale Rannsc87b66c2019-02-07 07:26:12 -080095 ntohl (mp->tunnel.sa_out), sa_ins);
Neale Rannsc87b66c2019-02-07 07:26:12 -080096
97 BAD_SW_IF_INDEX_LABEL;
98
99 REPLY_MACRO (VL_API_IPSEC_TUNNEL_PROTECT_UPDATE_REPLY);
100}
101
102static void vl_api_ipsec_tunnel_protect_del_t_handler
103 (vl_api_ipsec_tunnel_protect_del_t * mp)
104{
105 vlib_main_t *vm __attribute__ ((unused)) = vlib_get_main ();
106 vl_api_ipsec_tunnel_protect_del_reply_t *rmp;
Neale Ranns28287212019-12-16 00:53:11 +0000107 ip_address_t nh;
Neale Rannsc87b66c2019-02-07 07:26:12 -0800108 u32 sw_if_index;
Neale Ranns28287212019-12-16 00:53:11 +0000109 int rv;
Neale Rannsc87b66c2019-02-07 07:26:12 -0800110
111 sw_if_index = ntohl (mp->sw_if_index);
112
113 VALIDATE_SW_IF_INDEX (mp);
114
Neale Ranns28287212019-12-16 00:53:11 +0000115 ip_address_decode2 (&mp->nh, &nh);
116 rv = ipsec_tun_protect_del (sw_if_index, &nh);
Neale Rannsc87b66c2019-02-07 07:26:12 -0800117
118 BAD_SW_IF_INDEX_LABEL;
119
120 REPLY_MACRO (VL_API_IPSEC_TUNNEL_PROTECT_DEL_REPLY);
121}
122
Neale Ranns12989b52019-09-26 16:20:19 +0000123typedef struct ipsec_dump_walk_ctx_t_
Neale Rannsc87b66c2019-02-07 07:26:12 -0800124{
125 vl_api_registration_t *reg;
126 u32 context;
Neale Rannsbed9b722021-10-22 14:10:06 +0000127 u32 sw_if_index;
Neale Ranns12989b52019-09-26 16:20:19 +0000128} ipsec_dump_walk_ctx_t;
Neale Rannsc87b66c2019-02-07 07:26:12 -0800129
130static walk_rc_t
131send_ipsec_tunnel_protect_details (index_t itpi, void *arg)
132{
Neale Ranns12989b52019-09-26 16:20:19 +0000133 ipsec_dump_walk_ctx_t *ctx = arg;
Neale Rannsc87b66c2019-02-07 07:26:12 -0800134 vl_api_ipsec_tunnel_protect_details_t *mp;
135 ipsec_tun_protect_t *itp;
Matthew Smith5cee0bc2020-03-31 09:52:17 -0500136 u32 ii = 0;
137 ipsec_sa_t *sa;
Neale Rannsc87b66c2019-02-07 07:26:12 -0800138
139 itp = ipsec_tun_protect_get (itpi);
140
Neale Rannsc87b66c2019-02-07 07:26:12 -0800141 mp = vl_msg_api_alloc (sizeof (*mp) + (sizeof (u32) * itp->itp_n_sa_in));
142 clib_memset (mp, 0, sizeof (*mp));
Filip Tehlarc73f3292021-06-22 08:21:31 +0000143 mp->_vl_msg_id =
144 ntohs (REPLY_MSG_ID_BASE + VL_API_IPSEC_TUNNEL_PROTECT_DETAILS);
Neale Rannsc87b66c2019-02-07 07:26:12 -0800145 mp->context = ctx->context;
146
147 mp->tun.sw_if_index = htonl (itp->itp_sw_if_index);
Neale Ranns28287212019-12-16 00:53:11 +0000148 ip_address_encode2 (itp->itp_key, &mp->tun.nh);
Neale Rannsc87b66c2019-02-07 07:26:12 -0800149
Matthew Smith5cee0bc2020-03-31 09:52:17 -0500150 sa = ipsec_sa_get (itp->itp_out_sa);
151 mp->tun.sa_out = htonl (sa->id);
Neale Rannsc87b66c2019-02-07 07:26:12 -0800152 mp->tun.n_sa_in = itp->itp_n_sa_in;
153 /* *INDENT-OFF* */
Matthew Smith5cee0bc2020-03-31 09:52:17 -0500154 FOR_EACH_IPSEC_PROTECT_INPUT_SA(itp, sa,
Neale Rannsc87b66c2019-02-07 07:26:12 -0800155 ({
Matthew Smith5cee0bc2020-03-31 09:52:17 -0500156 mp->tun.sa_in[ii++] = htonl (sa->id);
Neale Rannsc87b66c2019-02-07 07:26:12 -0800157 }));
158 /* *INDENT-ON* */
159
160 vl_api_send_msg (ctx->reg, (u8 *) mp);
161
162 return (WALK_CONTINUE);
163}
164
165static void
166vl_api_ipsec_tunnel_protect_dump_t_handler (vl_api_ipsec_tunnel_protect_dump_t
167 * mp)
168{
169 vl_api_registration_t *reg;
170 u32 sw_if_index;
171
Neale Rannsc87b66c2019-02-07 07:26:12 -0800172 reg = vl_api_client_index_to_registration (mp->client_index);
173 if (!reg)
174 return;
175
Neale Ranns12989b52019-09-26 16:20:19 +0000176 ipsec_dump_walk_ctx_t ctx = {
Neale Rannsc87b66c2019-02-07 07:26:12 -0800177 .reg = reg,
178 .context = mp->context,
179 };
180
181 sw_if_index = ntohl (mp->sw_if_index);
182
183 if (~0 == sw_if_index)
184 {
185 ipsec_tun_protect_walk (send_ipsec_tunnel_protect_details, &ctx);
186 }
187 else
188 {
Neale Ranns28287212019-12-16 00:53:11 +0000189 ipsec_tun_protect_walk_itf (sw_if_index,
190 send_ipsec_tunnel_protect_details, &ctx);
Neale Rannsc87b66c2019-02-07 07:26:12 -0800191 }
Neale Rannsc87b66c2019-02-07 07:26:12 -0800192}
193
Neale Ranns17dcec02019-01-09 21:22:20 -0800194static int
195ipsec_spd_action_decode (vl_api_ipsec_spd_action_t in,
196 ipsec_policy_action_t * out)
197{
198 in = clib_net_to_host_u32 (in);
199
200 switch (in)
201 {
202#define _(v,f,s) case IPSEC_API_SPD_ACTION_##f: \
203 *out = IPSEC_POLICY_ACTION_##f; \
204 return (0);
205 foreach_ipsec_policy_action
206#undef _
207 }
208 return (VNET_API_ERROR_UNIMPLEMENTED);
209}
210
211static void vl_api_ipsec_spd_entry_add_del_t_handler
212 (vl_api_ipsec_spd_entry_add_del_t * mp)
Pavel Kotucek9c7ef032016-12-21 07:46:45 +0100213{
214 vlib_main_t *vm __attribute__ ((unused)) = vlib_get_main ();
Neale Ranns17dcec02019-01-09 21:22:20 -0800215 vl_api_ipsec_spd_entry_add_del_reply_t *rmp;
216 ip46_type_t itype;
Neale Rannsa09c1ff2019-02-04 01:10:30 -0800217 u32 stat_index;
Pavel Kotucek9c7ef032016-12-21 07:46:45 +0100218 int rv;
219
Neale Ranns8c2dd1b2019-02-19 08:27:34 -0800220 stat_index = ~0;
221
Pavel Kotucek9c7ef032016-12-21 07:46:45 +0100222 ipsec_policy_t p;
223
Dave Barachb7b92992018-10-17 10:38:51 -0400224 clib_memset (&p, 0, sizeof (p));
Pavel Kotucek9c7ef032016-12-21 07:46:45 +0100225
Neale Ranns17dcec02019-01-09 21:22:20 -0800226 p.id = ntohl (mp->entry.spd_id);
227 p.priority = ntohl (mp->entry.priority);
Pavel Kotucek9c7ef032016-12-21 07:46:45 +0100228
Neale Ranns17dcec02019-01-09 21:22:20 -0800229 itype = ip_address_decode (&mp->entry.remote_address_start, &p.raddr.start);
230 ip_address_decode (&mp->entry.remote_address_stop, &p.raddr.stop);
231 ip_address_decode (&mp->entry.local_address_start, &p.laddr.start);
232 ip_address_decode (&mp->entry.local_address_stop, &p.laddr.stop);
233
234 p.is_ipv6 = (itype == IP46_TYPE_IP6);
235
Piotr Bronowski815c6a42022-06-09 09:09:28 +0000236 p.protocol =
237 mp->entry.protocol ? mp->entry.protocol : IPSEC_POLICY_PROTOCOL_ANY;
Neale Rannsa4d24312019-07-10 13:46:21 +0000238 p.rport.start = ntohs (mp->entry.remote_port_start);
239 p.rport.stop = ntohs (mp->entry.remote_port_stop);
240 p.lport.start = ntohs (mp->entry.local_port_start);
241 p.lport.stop = ntohs (mp->entry.local_port_stop);
Neale Ranns17dcec02019-01-09 21:22:20 -0800242
243 rv = ipsec_spd_action_decode (mp->entry.policy, &p.policy);
244
245 if (rv)
246 goto out;
247
Pavel Kotucek9c7ef032016-12-21 07:46:45 +0100248 /* policy action resolve unsupported */
Neale Ranns17dcec02019-01-09 21:22:20 -0800249 if (p.policy == IPSEC_POLICY_ACTION_RESOLVE)
Pavel Kotucek9c7ef032016-12-21 07:46:45 +0100250 {
251 clib_warning ("unsupported action: 'resolve'");
252 rv = VNET_API_ERROR_UNIMPLEMENTED;
253 goto out;
254 }
Neale Ranns17dcec02019-01-09 21:22:20 -0800255 p.sa_id = ntohl (mp->entry.sa_id);
Neale Ranns9f231d42019-03-19 10:06:00 +0000256 rv =
257 ipsec_policy_mk_type (mp->entry.is_outbound, p.is_ipv6, p.policy,
258 &p.type);
259 if (rv)
260 goto out;
Pavel Kotucek9c7ef032016-12-21 07:46:45 +0100261
Neale Rannsa09c1ff2019-02-04 01:10:30 -0800262 rv = ipsec_add_del_policy (vm, &p, mp->is_add, &stat_index);
Pavel Kotucek9c7ef032016-12-21 07:46:45 +0100263 if (rv)
264 goto out;
265
Pavel Kotucek9c7ef032016-12-21 07:46:45 +0100266out:
Neale Rannsa09c1ff2019-02-04 01:10:30 -0800267 /* *INDENT-OFF* */
268 REPLY_MACRO2 (VL_API_IPSEC_SPD_ENTRY_ADD_DEL_REPLY,
269 ({
270 rmp->stat_index = ntohl(stat_index);
271 }));
272 /* *INDENT-ON* */
Pavel Kotucek9c7ef032016-12-21 07:46:45 +0100273}
274
Piotr Bronowski815c6a42022-06-09 09:09:28 +0000275static void
276vl_api_ipsec_spd_entry_add_del_v2_t_handler (
277 vl_api_ipsec_spd_entry_add_del_v2_t *mp)
278{
279 vlib_main_t *vm __attribute__ ((unused)) = vlib_get_main ();
280 vl_api_ipsec_spd_entry_add_del_reply_t *rmp;
281 ip46_type_t itype;
282 u32 stat_index;
283 int rv;
284
285 stat_index = ~0;
286
287 ipsec_policy_t p;
288
289 clib_memset (&p, 0, sizeof (p));
290
291 p.id = ntohl (mp->entry.spd_id);
292 p.priority = ntohl (mp->entry.priority);
293
294 itype = ip_address_decode (&mp->entry.remote_address_start, &p.raddr.start);
295 ip_address_decode (&mp->entry.remote_address_stop, &p.raddr.stop);
296 ip_address_decode (&mp->entry.local_address_start, &p.laddr.start);
297 ip_address_decode (&mp->entry.local_address_stop, &p.laddr.stop);
298
299 p.is_ipv6 = (itype == IP46_TYPE_IP6);
300
301 p.protocol = mp->entry.protocol;
302 p.rport.start = ntohs (mp->entry.remote_port_start);
303 p.rport.stop = ntohs (mp->entry.remote_port_stop);
304 p.lport.start = ntohs (mp->entry.local_port_start);
305 p.lport.stop = ntohs (mp->entry.local_port_stop);
306
307 rv = ipsec_spd_action_decode (mp->entry.policy, &p.policy);
308
309 if (rv)
310 goto out;
311
312 /* policy action resolve unsupported */
313 if (p.policy == IPSEC_POLICY_ACTION_RESOLVE)
314 {
315 clib_warning ("unsupported action: 'resolve'");
316 rv = VNET_API_ERROR_UNIMPLEMENTED;
317 goto out;
318 }
319 p.sa_id = ntohl (mp->entry.sa_id);
320 rv =
321 ipsec_policy_mk_type (mp->entry.is_outbound, p.is_ipv6, p.policy, &p.type);
322 if (rv)
323 goto out;
324
325 rv = ipsec_add_del_policy (vm, &p, mp->is_add, &stat_index);
326 if (rv)
327 goto out;
328
329out:
Vratko Polak520cde42022-11-25 17:10:10 +0100330 REPLY_MACRO2 (VL_API_IPSEC_SPD_ENTRY_ADD_DEL_V2_REPLY,
Piotr Bronowski815c6a42022-06-09 09:09:28 +0000331 ({ rmp->stat_index = ntohl (stat_index); }));
332}
333
Neale Ranns17dcec02019-01-09 21:22:20 -0800334static void vl_api_ipsec_sad_entry_add_del_t_handler
335 (vl_api_ipsec_sad_entry_add_del_t * mp)
Pavel Kotucek9c7ef032016-12-21 07:46:45 +0100336{
Neale Ranns17dcec02019-01-09 21:22:20 -0800337 vl_api_ipsec_sad_entry_add_del_reply_t *rmp;
Neale Ranns8d7c5022019-02-06 01:41:05 -0800338 ipsec_key_t crypto_key, integ_key;
339 ipsec_crypto_alg_t crypto_alg;
340 ipsec_integ_alg_t integ_alg;
341 ipsec_protocol_t proto;
342 ipsec_sa_flags_t flags;
Dave Baracha5160d72019-03-13 15:29:15 -0400343 u32 id, spi, sa_index = ~0;
Neale Ranns9ec846c2021-02-09 14:04:02 +0000344 tunnel_t tun = {
345 .t_flags = TUNNEL_FLAG_NONE,
346 .t_encap_decap_flags = TUNNEL_ENCAP_DECAP_FLAG_NONE,
347 .t_dscp = 0,
348 .t_mode = TUNNEL_MODE_P2P,
349 .t_table_id = 0,
350 .t_hop_limit = 255,
351 };
Pavel Kotucek9c7ef032016-12-21 07:46:45 +0100352 int rv;
Neale Ranns8d7c5022019-02-06 01:41:05 -0800353
Neale Ranns8d7c5022019-02-06 01:41:05 -0800354 id = ntohl (mp->entry.sad_id);
Neale Rannsff2e4132021-06-24 14:57:56 +0000355 if (!mp->is_add)
356 {
357 rv = ipsec_sa_unlock_id (id);
358 goto out;
359 }
Neale Ranns8d7c5022019-02-06 01:41:05 -0800360 spi = ntohl (mp->entry.spi);
Pavel Kotucek9c7ef032016-12-21 07:46:45 +0100361
Neale Ranns8d7c5022019-02-06 01:41:05 -0800362 rv = ipsec_proto_decode (mp->entry.protocol, &proto);
Neale Ranns17dcec02019-01-09 21:22:20 -0800363
364 if (rv)
365 goto out;
366
Neale Ranns8d7c5022019-02-06 01:41:05 -0800367 rv = ipsec_crypto_algo_decode (mp->entry.crypto_algorithm, &crypto_alg);
Neale Ranns17dcec02019-01-09 21:22:20 -0800368
369 if (rv)
370 goto out;
371
Neale Ranns8d7c5022019-02-06 01:41:05 -0800372 rv = ipsec_integ_algo_decode (mp->entry.integrity_algorithm, &integ_alg);
Neale Ranns17dcec02019-01-09 21:22:20 -0800373
374 if (rv)
375 goto out;
376
Neale Ranns8d7c5022019-02-06 01:41:05 -0800377 ipsec_key_decode (&mp->entry.crypto_key, &crypto_key);
378 ipsec_key_decode (&mp->entry.integrity_key, &integ_key);
Neale Ranns17dcec02019-01-09 21:22:20 -0800379
Neale Ranns8d7c5022019-02-06 01:41:05 -0800380 flags = ipsec_sa_flags_decode (mp->entry.flags);
Neale Ranns17dcec02019-01-09 21:22:20 -0800381
Neale Ranns9ec846c2021-02-09 14:04:02 +0000382 ip_address_decode2 (&mp->entry.tunnel_src, &tun.t_src);
383 ip_address_decode2 (&mp->entry.tunnel_dst, &tun.t_dst);
Pavel Kotucek9c7ef032016-12-21 07:46:45 +0100384
Neale Rannsff2e4132021-06-24 14:57:56 +0000385 rv = ipsec_sa_add_and_lock (id, spi, proto, crypto_alg, &crypto_key,
386 integ_alg, &integ_key, flags, mp->entry.salt,
387 htons (mp->entry.udp_src_port),
388 htons (mp->entry.udp_dst_port), &tun, &sa_index);
Neale Ranns8d7c5022019-02-06 01:41:05 -0800389
Pavel Kotucek9c7ef032016-12-21 07:46:45 +0100390out:
Neale Rannseba31ec2019-02-17 18:04:27 +0000391 /* *INDENT-OFF* */
392 REPLY_MACRO2 (VL_API_IPSEC_SAD_ENTRY_ADD_DEL_REPLY,
393 {
394 rmp->stat_index = htonl (sa_index);
395 });
396 /* *INDENT-ON* */
Pavel Kotucek9c7ef032016-12-21 07:46:45 +0100397}
398
Neale Ranns041add72020-01-02 04:06:10 +0000399static void vl_api_ipsec_sad_entry_add_del_v2_t_handler
400 (vl_api_ipsec_sad_entry_add_del_v2_t * mp)
401{
402 vlib_main_t *vm __attribute__ ((unused)) = vlib_get_main ();
403 vl_api_ipsec_sad_entry_add_del_v2_reply_t *rmp;
Neale Ranns041add72020-01-02 04:06:10 +0000404 ipsec_key_t crypto_key, integ_key;
405 ipsec_crypto_alg_t crypto_alg;
406 ipsec_integ_alg_t integ_alg;
407 ipsec_protocol_t proto;
408 ipsec_sa_flags_t flags;
409 u32 id, spi, sa_index = ~0;
410 int rv;
Neale Ranns9ec846c2021-02-09 14:04:02 +0000411 tunnel_t tun = {
412 .t_flags = TUNNEL_FLAG_NONE,
413 .t_encap_decap_flags = TUNNEL_ENCAP_DECAP_FLAG_NONE,
414 .t_dscp = 0,
415 .t_mode = TUNNEL_MODE_P2P,
416 .t_table_id = htonl (mp->entry.tx_table_id),
417 .t_hop_limit = 255,
418 };
419
Neale Ranns9ec846c2021-02-09 14:04:02 +0000420 id = ntohl (mp->entry.sad_id);
Neale Rannsff2e4132021-06-24 14:57:56 +0000421 if (!mp->is_add)
422 {
423 rv = ipsec_sa_unlock_id (id);
424 goto out;
425 }
426
Neale Ranns9ec846c2021-02-09 14:04:02 +0000427 spi = ntohl (mp->entry.spi);
428
429 rv = ipsec_proto_decode (mp->entry.protocol, &proto);
430
431 if (rv)
432 goto out;
433
434 rv = ipsec_crypto_algo_decode (mp->entry.crypto_algorithm, &crypto_alg);
435
436 if (rv)
437 goto out;
438
439 rv = ipsec_integ_algo_decode (mp->entry.integrity_algorithm, &integ_alg);
440
441 if (rv)
442 goto out;
443
444 rv = tunnel_encap_decap_flags_decode (mp->entry.tunnel_flags,
445 &tun.t_encap_decap_flags);
446
447 if (rv)
448 goto out;
449
450 ipsec_key_decode (&mp->entry.crypto_key, &crypto_key);
451 ipsec_key_decode (&mp->entry.integrity_key, &integ_key);
452
453 flags = ipsec_sa_flags_decode (mp->entry.flags);
454 tun.t_dscp = ip_dscp_decode (mp->entry.dscp);
455
456 ip_address_decode2 (&mp->entry.tunnel_src, &tun.t_src);
457 ip_address_decode2 (&mp->entry.tunnel_dst, &tun.t_dst);
458
Neale Ranns9ec846c2021-02-09 14:04:02 +0000459 rv = ipsec_sa_add_and_lock (
460 id, spi, proto, crypto_alg, &crypto_key, integ_alg, &integ_key, flags,
461 mp->entry.salt, htons (mp->entry.udp_src_port),
462 htons (mp->entry.udp_dst_port), &tun, &sa_index);
Neale Ranns9ec846c2021-02-09 14:04:02 +0000463
Neale Ranns9ec846c2021-02-09 14:04:02 +0000464out:
465 /* *INDENT-OFF* */
466 REPLY_MACRO2 (VL_API_IPSEC_SAD_ENTRY_ADD_DEL_V2_REPLY,
467 {
468 rmp->stat_index = htonl (sa_index);
469 });
470 /* *INDENT-ON* */
471}
472
Neale Rannsff2e4132021-06-24 14:57:56 +0000473static int
474ipsec_sad_entry_add_v3 (const vl_api_ipsec_sad_entry_v3_t *entry,
475 u32 *sa_index)
Neale Ranns9ec846c2021-02-09 14:04:02 +0000476{
Neale Ranns9ec846c2021-02-09 14:04:02 +0000477 ipsec_key_t crypto_key, integ_key;
478 ipsec_crypto_alg_t crypto_alg;
479 ipsec_integ_alg_t integ_alg;
480 ipsec_protocol_t proto;
481 ipsec_sa_flags_t flags;
Neale Rannsff2e4132021-06-24 14:57:56 +0000482 u32 id, spi;
Andrew Yourtchenko4b4aded2022-08-23 17:09:25 +0000483 tunnel_t tun = { 0 };
Neale Ranns9ec846c2021-02-09 14:04:02 +0000484 int rv;
Neale Rannsc7eaa712021-02-04 11:09:33 +0000485
Neale Rannsff2e4132021-06-24 14:57:56 +0000486 id = ntohl (entry->sad_id);
487 spi = ntohl (entry->spi);
Neale Rannsc7eaa712021-02-04 11:09:33 +0000488
Neale Rannsff2e4132021-06-24 14:57:56 +0000489 rv = ipsec_proto_decode (entry->protocol, &proto);
Neale Rannsc7eaa712021-02-04 11:09:33 +0000490
491 if (rv)
Neale Rannsff2e4132021-06-24 14:57:56 +0000492 return (rv);
Neale Rannsc7eaa712021-02-04 11:09:33 +0000493
Neale Rannsff2e4132021-06-24 14:57:56 +0000494 rv = ipsec_crypto_algo_decode (entry->crypto_algorithm, &crypto_alg);
Neale Rannsc7eaa712021-02-04 11:09:33 +0000495
496 if (rv)
Neale Rannsff2e4132021-06-24 14:57:56 +0000497 return (rv);
Neale Rannsc7eaa712021-02-04 11:09:33 +0000498
Neale Rannsff2e4132021-06-24 14:57:56 +0000499 rv = ipsec_integ_algo_decode (entry->integrity_algorithm, &integ_alg);
Neale Rannsc7eaa712021-02-04 11:09:33 +0000500
501 if (rv)
Neale Rannsff2e4132021-06-24 14:57:56 +0000502 return (rv);
Neale Rannsc7eaa712021-02-04 11:09:33 +0000503
Neale Rannsff2e4132021-06-24 14:57:56 +0000504 flags = ipsec_sa_flags_decode (entry->flags);
Neale Rannsc7eaa712021-02-04 11:09:33 +0000505
Neale Ranns9ec846c2021-02-09 14:04:02 +0000506 if (flags & IPSEC_SA_FLAG_IS_TUNNEL)
507 {
Neale Rannsff2e4132021-06-24 14:57:56 +0000508 rv = tunnel_decode (&entry->tunnel, &tun);
Neale Ranns9ec846c2021-02-09 14:04:02 +0000509
510 if (rv)
Neale Rannsff2e4132021-06-24 14:57:56 +0000511 return (rv);
Neale Ranns9ec846c2021-02-09 14:04:02 +0000512 }
Neale Rannsc7eaa712021-02-04 11:09:33 +0000513
Neale Rannsff2e4132021-06-24 14:57:56 +0000514 ipsec_key_decode (&entry->crypto_key, &crypto_key);
515 ipsec_key_decode (&entry->integrity_key, &integ_key);
Neale Rannsc7eaa712021-02-04 11:09:33 +0000516
Neale Rannsff2e4132021-06-24 14:57:56 +0000517 return ipsec_sa_add_and_lock (id, spi, proto, crypto_alg, &crypto_key,
518 integ_alg, &integ_key, flags, entry->salt,
519 htons (entry->udp_src_port),
520 htons (entry->udp_dst_port), &tun, sa_index);
521}
522
523static void
524vl_api_ipsec_sad_entry_add_del_v3_t_handler (
525 vl_api_ipsec_sad_entry_add_del_v3_t *mp)
526{
527 vl_api_ipsec_sad_entry_add_del_v3_reply_t *rmp;
528 u32 id, sa_index = ~0;
529 int rv;
530
531 id = ntohl (mp->entry.sad_id);
532
533 if (!mp->is_add)
534 {
535 rv = ipsec_sa_unlock_id (id);
536 }
Neale Rannsc7eaa712021-02-04 11:09:33 +0000537 else
Neale Rannsff2e4132021-06-24 14:57:56 +0000538 {
539 rv = ipsec_sad_entry_add_v3 (&mp->entry, &sa_index);
540 }
Neale Rannsc7eaa712021-02-04 11:09:33 +0000541
Neale Ranns9ec846c2021-02-09 14:04:02 +0000542 REPLY_MACRO2 (VL_API_IPSEC_SAD_ENTRY_ADD_DEL_V3_REPLY,
543 { rmp->stat_index = htonl (sa_index); });
Neale Rannsc7eaa712021-02-04 11:09:33 +0000544}
545
546static void
Neale Rannsff2e4132021-06-24 14:57:56 +0000547vl_api_ipsec_sad_entry_del_t_handler (vl_api_ipsec_sad_entry_del_t *mp)
548{
549 vl_api_ipsec_sad_entry_del_reply_t *rmp;
550 int rv;
551
552 rv = ipsec_sa_unlock_id (ntohl (mp->id));
553
554 REPLY_MACRO (VL_API_IPSEC_SAD_ENTRY_DEL_REPLY);
555}
556
557static void
558vl_api_ipsec_sad_entry_add_t_handler (vl_api_ipsec_sad_entry_add_t *mp)
559{
560 vl_api_ipsec_sad_entry_add_reply_t *rmp;
561 u32 sa_index = ~0;
562 int rv;
563
564 rv = ipsec_sad_entry_add_v3 (&mp->entry, &sa_index);
565
566 REPLY_MACRO2 (VL_API_IPSEC_SAD_ENTRY_ADD_REPLY,
567 { rmp->stat_index = htonl (sa_index); });
568}
569
570static void
Arthur de Kerhor4117b242022-08-31 19:13:03 +0200571vl_api_ipsec_sad_entry_update_t_handler (vl_api_ipsec_sad_entry_update_t *mp)
572{
573 vl_api_ipsec_sad_entry_update_reply_t *rmp;
574 u32 id;
575 tunnel_t tun = { 0 };
576 int rv;
577
578 id = ntohl (mp->sad_id);
579
580 if (mp->is_tun)
581 {
582 rv = tunnel_decode (&mp->tunnel, &tun);
583
584 if (rv)
585 goto out;
586 }
587
588 rv = ipsec_sa_update (id, htons (mp->udp_src_port), htons (mp->udp_dst_port),
589 &tun, mp->is_tun);
590
591out:
592 REPLY_MACRO (VL_API_IPSEC_SAD_ENTRY_UPDATE_REPLY);
593}
594
595static void
Maxime Peim1271e3a2023-03-20 14:13:56 +0000596vl_api_ipsec_sad_bind_t_handler (vl_api_ipsec_sad_bind_t *mp)
597{
598 vl_api_ipsec_sad_bind_reply_t *rmp;
599 u32 sa_id;
600 u32 worker;
601 int rv;
602
603 sa_id = ntohl (mp->sa_id);
604 worker = ntohl (mp->worker);
605
606 rv = ipsec_sa_bind (sa_id, worker, true /* bind */);
607
608 REPLY_MACRO (VL_API_IPSEC_SAD_BIND_REPLY);
609}
610
611static void
612vl_api_ipsec_sad_unbind_t_handler (vl_api_ipsec_sad_unbind_t *mp)
613{
614 vl_api_ipsec_sad_unbind_reply_t *rmp;
615 u32 sa_id;
616 int rv;
617
618 sa_id = ntohl (mp->sa_id);
619
620 rv = ipsec_sa_bind (sa_id, ~0, false /* bind */);
621
622 REPLY_MACRO (VL_API_IPSEC_SAD_UNBIND_REPLY);
623}
624
625static void
Matus Fabiana9a0b2c2018-10-02 01:13:25 -0700626send_ipsec_spds_details (ipsec_spd_t * spd, vl_api_registration_t * reg,
627 u32 context)
628{
629 vl_api_ipsec_spds_details_t *mp;
Neale Rannsa09c1ff2019-02-04 01:10:30 -0800630 u32 n_policies = 0;
Matus Fabiana9a0b2c2018-10-02 01:13:25 -0700631
632 mp = vl_msg_api_alloc (sizeof (*mp));
Dave Barachb7b92992018-10-17 10:38:51 -0400633 clib_memset (mp, 0, sizeof (*mp));
Filip Tehlarc73f3292021-06-22 08:21:31 +0000634 mp->_vl_msg_id = ntohs (REPLY_MSG_ID_BASE + VL_API_IPSEC_SPDS_DETAILS);
Matus Fabiana9a0b2c2018-10-02 01:13:25 -0700635 mp->context = context;
636
637 mp->spd_id = htonl (spd->id);
Neale Rannsa09c1ff2019-02-04 01:10:30 -0800638#define _(s, n) n_policies += vec_len (spd->policies[IPSEC_SPD_POLICY_##s]);
639 foreach_ipsec_spd_policy_type
640#undef _
641 mp->npolicies = htonl (n_policies);
Matus Fabiana9a0b2c2018-10-02 01:13:25 -0700642
643 vl_api_send_msg (reg, (u8 *) mp);
644}
645
646static void
647vl_api_ipsec_spds_dump_t_handler (vl_api_ipsec_spds_dump_t * mp)
648{
649 vl_api_registration_t *reg;
650 ipsec_main_t *im = &ipsec_main;
651 ipsec_spd_t *spd;
Damjan Marion97898982021-04-19 18:15:31 +0200652
Matus Fabiana9a0b2c2018-10-02 01:13:25 -0700653 reg = vl_api_client_index_to_registration (mp->client_index);
654 if (!reg)
655 return;
656
Damjan Marionb2c31b62020-12-13 21:47:40 +0100657 pool_foreach (spd, im->spds) {
Matus Fabiana9a0b2c2018-10-02 01:13:25 -0700658 send_ipsec_spds_details (spd, reg, mp->context);
Damjan Marionb2c31b62020-12-13 21:47:40 +0100659 }
Matus Fabiana9a0b2c2018-10-02 01:13:25 -0700660}
661
Neale Ranns17dcec02019-01-09 21:22:20 -0800662vl_api_ipsec_spd_action_t
663ipsec_spd_action_encode (ipsec_policy_action_t in)
664{
665 vl_api_ipsec_spd_action_t out = IPSEC_API_SPD_ACTION_BYPASS;
666
667 switch (in)
668 {
669#define _(v,f,s) case IPSEC_POLICY_ACTION_##f: \
670 out = IPSEC_API_SPD_ACTION_##f; \
671 break;
672 foreach_ipsec_policy_action
673#undef _
674 }
675 return (clib_host_to_net_u32 (out));
676}
677
Matus Fabiana9a0b2c2018-10-02 01:13:25 -0700678static void
Florin Coras6c4dae22018-01-09 06:39:23 -0800679send_ipsec_spd_details (ipsec_policy_t * p, vl_api_registration_t * reg,
680 u32 context)
Pavel Kotucek9c7ef032016-12-21 07:46:45 +0100681{
682 vl_api_ipsec_spd_details_t *mp;
683
684 mp = vl_msg_api_alloc (sizeof (*mp));
Dave Barachb7b92992018-10-17 10:38:51 -0400685 clib_memset (mp, 0, sizeof (*mp));
Filip Tehlarc73f3292021-06-22 08:21:31 +0000686 mp->_vl_msg_id = ntohs (REPLY_MSG_ID_BASE + VL_API_IPSEC_SPD_DETAILS);
Pavel Kotucek9c7ef032016-12-21 07:46:45 +0100687 mp->context = context;
688
Neale Ranns17dcec02019-01-09 21:22:20 -0800689 mp->entry.spd_id = htonl (p->id);
690 mp->entry.priority = htonl (p->priority);
Neale Ranns9f231d42019-03-19 10:06:00 +0000691 mp->entry.is_outbound = ((p->type == IPSEC_SPD_POLICY_IP6_OUTBOUND) ||
692 (p->type == IPSEC_SPD_POLICY_IP4_OUTBOUND));
Neale Ranns17dcec02019-01-09 21:22:20 -0800693
694 ip_address_encode (&p->laddr.start, IP46_TYPE_ANY,
695 &mp->entry.local_address_start);
696 ip_address_encode (&p->laddr.stop, IP46_TYPE_ANY,
697 &mp->entry.local_address_stop);
698 ip_address_encode (&p->raddr.start, IP46_TYPE_ANY,
699 &mp->entry.remote_address_start);
700 ip_address_encode (&p->raddr.stop, IP46_TYPE_ANY,
701 &mp->entry.remote_address_stop);
Neale Rannsa4d24312019-07-10 13:46:21 +0000702 mp->entry.local_port_start = htons (p->lport.start);
703 mp->entry.local_port_stop = htons (p->lport.stop);
704 mp->entry.remote_port_start = htons (p->rport.start);
705 mp->entry.remote_port_stop = htons (p->rport.stop);
Neale Ranns17dcec02019-01-09 21:22:20 -0800706 mp->entry.protocol = p->protocol;
707 mp->entry.policy = ipsec_spd_action_encode (p->policy);
708 mp->entry.sa_id = htonl (p->sa_id);
709
Florin Coras6c4dae22018-01-09 06:39:23 -0800710 vl_api_send_msg (reg, (u8 *) mp);
Pavel Kotucek9c7ef032016-12-21 07:46:45 +0100711}
712
713static void
714vl_api_ipsec_spd_dump_t_handler (vl_api_ipsec_spd_dump_t * mp)
715{
Florin Coras6c4dae22018-01-09 06:39:23 -0800716 vl_api_registration_t *reg;
Pavel Kotucek9c7ef032016-12-21 07:46:45 +0100717 ipsec_main_t *im = &ipsec_main;
Neale Ranns9f231d42019-03-19 10:06:00 +0000718 ipsec_spd_policy_type_t ptype;
Pavel Kotucek9c7ef032016-12-21 07:46:45 +0100719 ipsec_policy_t *policy;
720 ipsec_spd_t *spd;
721 uword *p;
Neale Rannsa09c1ff2019-02-04 01:10:30 -0800722 u32 spd_index, *ii;
Damjan Marion97898982021-04-19 18:15:31 +0200723
Florin Coras6c4dae22018-01-09 06:39:23 -0800724 reg = vl_api_client_index_to_registration (mp->client_index);
725 if (!reg)
Pavel Kotucek9c7ef032016-12-21 07:46:45 +0100726 return;
727
728 p = hash_get (im->spd_index_by_spd_id, ntohl (mp->spd_id));
729 if (!p)
730 return;
731
732 spd_index = p[0];
733 spd = pool_elt_at_index (im->spds, spd_index);
734
Neale Rannsa09c1ff2019-02-04 01:10:30 -0800735 FOR_EACH_IPSEC_SPD_POLICY_TYPE(ptype) {
736 vec_foreach(ii, spd->policies[ptype])
737 {
738 policy = pool_elt_at_index(im->policies, *ii);
739
740 if (mp->sa_id == ~(0) || ntohl (mp->sa_id) == policy->sa_id)
741 send_ipsec_spd_details (policy, reg, mp->context);
742 }
743 }
Pavel Kotucek9c7ef032016-12-21 07:46:45 +0100744}
745
746static void
Filip Varga871bca92018-11-02 13:51:44 +0100747send_ipsec_spd_interface_details (vl_api_registration_t * reg, u32 spd_index,
748 u32 sw_if_index, u32 context)
749{
750 vl_api_ipsec_spd_interface_details_t *mp;
751
752 mp = vl_msg_api_alloc (sizeof (*mp));
753 clib_memset (mp, 0, sizeof (*mp));
Filip Tehlarc73f3292021-06-22 08:21:31 +0000754 mp->_vl_msg_id =
755 ntohs (REPLY_MSG_ID_BASE + VL_API_IPSEC_SPD_INTERFACE_DETAILS);
Filip Varga871bca92018-11-02 13:51:44 +0100756 mp->context = context;
757
758 mp->spd_index = htonl (spd_index);
759 mp->sw_if_index = htonl (sw_if_index);
760
761 vl_api_send_msg (reg, (u8 *) mp);
762}
763
764static void
765vl_api_ipsec_spd_interface_dump_t_handler (vl_api_ipsec_spd_interface_dump_t *
766 mp)
767{
768 ipsec_main_t *im = &ipsec_main;
769 vl_api_registration_t *reg;
770 u32 k, v, spd_index;
771
Filip Varga871bca92018-11-02 13:51:44 +0100772 reg = vl_api_client_index_to_registration (mp->client_index);
773 if (!reg)
774 return;
775
776 if (mp->spd_index_valid)
777 {
778 spd_index = ntohl (mp->spd_index);
779 /* *INDENT-OFF* */
780 hash_foreach(k, v, im->spd_index_by_sw_if_index, ({
781 if (v == spd_index)
782 send_ipsec_spd_interface_details(reg, v, k, mp->context);
783 }));
784 /* *INDENT-ON* */
785 }
786 else
787 {
Filip Varga871bca92018-11-02 13:51:44 +0100788 hash_foreach(k, v, im->spd_index_by_sw_if_index, ({
789 send_ipsec_spd_interface_details(reg, v, k, mp->context);
790 }));
Filip Varga871bca92018-11-02 13:51:44 +0100791 }
Filip Varga871bca92018-11-02 13:51:44 +0100792}
793
Neale Rannsdd4ccf22020-06-30 07:47:14 +0000794static void
795vl_api_ipsec_itf_create_t_handler (vl_api_ipsec_itf_create_t * mp)
796{
797 vl_api_ipsec_itf_create_reply_t *rmp;
798 tunnel_mode_t mode;
799 u32 sw_if_index = ~0;
800 int rv;
801
802 rv = tunnel_mode_decode (mp->itf.mode, &mode);
803
804 if (!rv)
805 rv = ipsec_itf_create (ntohl (mp->itf.user_instance), mode, &sw_if_index);
806
807 /* *INDENT-OFF* */
808 REPLY_MACRO2 (VL_API_IPSEC_ITF_CREATE_REPLY,
809 ({
810 rmp->sw_if_index = htonl (sw_if_index);
811 }));
812 /* *INDENT-ON* */
813}
814
815static void
816vl_api_ipsec_itf_delete_t_handler (vl_api_ipsec_itf_delete_t * mp)
817{
818 vl_api_ipsec_itf_delete_reply_t *rmp;
819 int rv;
820
821 rv = ipsec_itf_delete (ntohl (mp->sw_if_index));
822
823 REPLY_MACRO (VL_API_IPSEC_ITF_DELETE_REPLY);
824}
825
Neale Ranns89d939e2021-06-07 09:34:07 +0000826static walk_rc_t
827send_ipsec_itf_details (ipsec_itf_t *itf, void *arg)
828{
829 ipsec_dump_walk_ctx_t *ctx = arg;
830 vl_api_ipsec_itf_details_t *mp;
831
Neale Rannsbed9b722021-10-22 14:10:06 +0000832 if (~0 != ctx->sw_if_index && ctx->sw_if_index != itf->ii_sw_if_index)
833 return (WALK_CONTINUE);
834
Neale Ranns89d939e2021-06-07 09:34:07 +0000835 mp = vl_msg_api_alloc (sizeof (*mp));
836 clib_memset (mp, 0, sizeof (*mp));
Filip Tehlarc73f3292021-06-22 08:21:31 +0000837 mp->_vl_msg_id = ntohs (REPLY_MSG_ID_BASE + VL_API_IPSEC_ITF_DETAILS);
Neale Ranns89d939e2021-06-07 09:34:07 +0000838 mp->context = ctx->context;
839
840 mp->itf.mode = tunnel_mode_encode (itf->ii_mode);
841 mp->itf.user_instance = htonl (itf->ii_user_instance);
842 mp->itf.sw_if_index = htonl (itf->ii_sw_if_index);
843 vl_api_send_msg (ctx->reg, (u8 *) mp);
844
845 return (WALK_CONTINUE);
846}
847
Neale Rannsdd4ccf22020-06-30 07:47:14 +0000848static void
849vl_api_ipsec_itf_dump_t_handler (vl_api_ipsec_itf_dump_t * mp)
850{
Neale Ranns89d939e2021-06-07 09:34:07 +0000851 vl_api_registration_t *reg;
852
853 reg = vl_api_client_index_to_registration (mp->client_index);
854 if (!reg)
855 return;
856
857 ipsec_dump_walk_ctx_t ctx = {
858 .reg = reg,
859 .context = mp->context,
Neale Rannsbed9b722021-10-22 14:10:06 +0000860 .sw_if_index = ntohl (mp->sw_if_index),
Neale Ranns89d939e2021-06-07 09:34:07 +0000861 };
862
863 ipsec_itf_walk (send_ipsec_itf_details, &ctx);
Neale Rannsdd4ccf22020-06-30 07:47:14 +0000864}
865
Neale Ranns12989b52019-09-26 16:20:19 +0000866typedef struct ipsec_sa_dump_match_ctx_t_
Matthew Smith28029532017-09-26 13:33:44 -0500867{
Neale Ranns12989b52019-09-26 16:20:19 +0000868 index_t sai;
869 u32 sw_if_index;
870} ipsec_sa_dump_match_ctx_t;
871
872static walk_rc_t
873ipsec_sa_dump_match_sa (index_t itpi, void *arg)
874{
875 ipsec_sa_dump_match_ctx_t *ctx = arg;
876 ipsec_tun_protect_t *itp;
877 index_t sai;
878
879 itp = ipsec_tun_protect_get (itpi);
880
881 if (itp->itp_out_sa == ctx->sai)
882 {
883 ctx->sw_if_index = itp->itp_sw_if_index;
884 return (WALK_STOP);
885 }
Damjan Marion97898982021-04-19 18:15:31 +0200886
Neale Ranns12989b52019-09-26 16:20:19 +0000887 FOR_EACH_IPSEC_PROTECT_INPUT_SAI (itp, sai,
888 ({
889 if (sai == ctx->sai)
890 {
891 ctx->sw_if_index = itp->itp_sw_if_index;
892 return (WALK_STOP);
893 }
894 }));
Neale Ranns12989b52019-09-26 16:20:19 +0000895
896 return (WALK_CONTINUE);
897}
898
899static walk_rc_t
900send_ipsec_sa_details (ipsec_sa_t * sa, void *arg)
901{
902 ipsec_dump_walk_ctx_t *ctx = arg;
Matthew Smith28029532017-09-26 13:33:44 -0500903 vl_api_ipsec_sa_details_t *mp;
904
905 mp = vl_msg_api_alloc (sizeof (*mp));
Dave Barachb7b92992018-10-17 10:38:51 -0400906 clib_memset (mp, 0, sizeof (*mp));
Filip Tehlarc73f3292021-06-22 08:21:31 +0000907 mp->_vl_msg_id = ntohs (REPLY_MSG_ID_BASE + VL_API_IPSEC_SA_DETAILS);
Neale Ranns12989b52019-09-26 16:20:19 +0000908 mp->context = ctx->context;
Matthew Smith28029532017-09-26 13:33:44 -0500909
Neale Ranns8d7c5022019-02-06 01:41:05 -0800910 mp->entry.sad_id = htonl (sa->id);
911 mp->entry.spi = htonl (sa->spi);
912 mp->entry.protocol = ipsec_proto_encode (sa->protocol);
Neale Ranns9ec846c2021-02-09 14:04:02 +0000913 mp->entry.tx_table_id = htonl (sa->tunnel.t_table_id);
Matthew Smith28029532017-09-26 13:33:44 -0500914
Neale Ranns8d7c5022019-02-06 01:41:05 -0800915 mp->entry.crypto_algorithm = ipsec_crypto_algo_encode (sa->crypto_alg);
916 ipsec_key_encode (&sa->crypto_key, &mp->entry.crypto_key);
Matthew Smith28029532017-09-26 13:33:44 -0500917
Neale Ranns8d7c5022019-02-06 01:41:05 -0800918 mp->entry.integrity_algorithm = ipsec_integ_algo_encode (sa->integ_alg);
919 ipsec_key_encode (&sa->integ_key, &mp->entry.integrity_key);
Matthew Smith28029532017-09-26 13:33:44 -0500920
Neale Ranns8d7c5022019-02-06 01:41:05 -0800921 mp->entry.flags = ipsec_sad_flags_encode (sa);
Neale Ranns12989b52019-09-26 16:20:19 +0000922 mp->entry.salt = clib_host_to_net_u32 (sa->salt);
923
924 if (ipsec_sa_is_set_IS_PROTECT (sa))
925 {
926 ipsec_sa_dump_match_ctx_t ctx = {
Neale Rannsc5fe57d2021-02-25 16:01:28 +0000927 .sai = sa - ipsec_sa_pool,
928 .sw_if_index = ~0,
Neale Ranns12989b52019-09-26 16:20:19 +0000929 };
930 ipsec_tun_protect_walk (ipsec_sa_dump_match_sa, &ctx);
931
932 mp->sw_if_index = htonl (ctx.sw_if_index);
933 }
934 else
935 mp->sw_if_index = ~0;
Matthew Smith28029532017-09-26 13:33:44 -0500936
Damjan Mariond709cbc2019-03-26 13:16:42 +0100937 if (ipsec_sa_is_set_IS_TUNNEL (sa))
Matthew Smith28029532017-09-26 13:33:44 -0500938 {
Neale Ranns9ec846c2021-02-09 14:04:02 +0000939 ip_address_encode2 (&sa->tunnel.t_src, &mp->entry.tunnel_src);
940 ip_address_encode2 (&sa->tunnel.t_dst, &mp->entry.tunnel_dst);
Matthew Smith28029532017-09-26 13:33:44 -0500941 }
Neale Rannsabc56602020-04-01 09:45:23 +0000942 if (ipsec_sa_is_set_UDP_ENCAP (sa))
943 {
944 mp->entry.udp_src_port = sa->udp_hdr.src_port;
945 mp->entry.udp_dst_port = sa->udp_hdr.dst_port;
946 }
Matthew Smith28029532017-09-26 13:33:44 -0500947
Matthew Smith28029532017-09-26 13:33:44 -0500948 mp->seq_outbound = clib_host_to_net_u64 (((u64) sa->seq));
Neale Ranns5b891102021-06-28 13:31:28 +0000949 mp->last_seq_inbound = clib_host_to_net_u64 (((u64) sa->seq));
Damjan Marion1e3aa5e2019-03-28 10:58:59 +0100950 if (ipsec_sa_is_set_USE_ESN (sa))
Matthew Smith28029532017-09-26 13:33:44 -0500951 {
952 mp->seq_outbound |= (u64) (clib_host_to_net_u32 (sa->seq_hi));
Neale Ranns5b891102021-06-28 13:31:28 +0000953 mp->last_seq_inbound |= (u64) (clib_host_to_net_u32 (sa->seq_hi));
Matthew Smith28029532017-09-26 13:33:44 -0500954 }
Damjan Mariond709cbc2019-03-26 13:16:42 +0100955 if (ipsec_sa_is_set_USE_ANTI_REPLAY (sa))
Matthew Smith28029532017-09-26 13:33:44 -0500956 mp->replay_window = clib_host_to_net_u64 (sa->replay_window);
Pierre Pfister4c422f92018-12-10 11:19:08 +0100957
Matthew Smith48d32b42020-04-02 07:45:49 -0500958 mp->stat_index = clib_host_to_net_u32 (sa->stat_index);
959
Neale Ranns12989b52019-09-26 16:20:19 +0000960 vl_api_send_msg (ctx->reg, (u8 *) mp);
Matthew Smith28029532017-09-26 13:33:44 -0500961
Neale Ranns12989b52019-09-26 16:20:19 +0000962 return (WALK_CONTINUE);
963}
Matthew Smith28029532017-09-26 13:33:44 -0500964
965static void
966vl_api_ipsec_sa_dump_t_handler (vl_api_ipsec_sa_dump_t * mp)
967{
Florin Coras6c4dae22018-01-09 06:39:23 -0800968 vl_api_registration_t *reg;
Matthew Smith28029532017-09-26 13:33:44 -0500969
Florin Coras6c4dae22018-01-09 06:39:23 -0800970 reg = vl_api_client_index_to_registration (mp->client_index);
Neale Ranns12989b52019-09-26 16:20:19 +0000971 if (!reg)
Matthew Smith28029532017-09-26 13:33:44 -0500972 return;
973
Neale Ranns12989b52019-09-26 16:20:19 +0000974 ipsec_dump_walk_ctx_t ctx = {
975 .reg = reg,
976 .context = mp->context,
977 };
Matthew Smith28029532017-09-26 13:33:44 -0500978
Neale Ranns12989b52019-09-26 16:20:19 +0000979 ipsec_sa_walk (send_ipsec_sa_details, &ctx);
Matthew Smith28029532017-09-26 13:33:44 -0500980}
981
Neale Ranns041add72020-01-02 04:06:10 +0000982static walk_rc_t
983send_ipsec_sa_v2_details (ipsec_sa_t * sa, void *arg)
984{
985 ipsec_dump_walk_ctx_t *ctx = arg;
986 vl_api_ipsec_sa_v2_details_t *mp;
Neale Ranns041add72020-01-02 04:06:10 +0000987
988 mp = vl_msg_api_alloc (sizeof (*mp));
989 clib_memset (mp, 0, sizeof (*mp));
Filip Tehlarc73f3292021-06-22 08:21:31 +0000990 mp->_vl_msg_id = ntohs (REPLY_MSG_ID_BASE + VL_API_IPSEC_SA_V2_DETAILS);
Neale Ranns041add72020-01-02 04:06:10 +0000991 mp->context = ctx->context;
992
993 mp->entry.sad_id = htonl (sa->id);
994 mp->entry.spi = htonl (sa->spi);
995 mp->entry.protocol = ipsec_proto_encode (sa->protocol);
Neale Ranns9ec846c2021-02-09 14:04:02 +0000996 mp->entry.tx_table_id = htonl (sa->tunnel.t_table_id);
Neale Ranns041add72020-01-02 04:06:10 +0000997
998 mp->entry.crypto_algorithm = ipsec_crypto_algo_encode (sa->crypto_alg);
999 ipsec_key_encode (&sa->crypto_key, &mp->entry.crypto_key);
1000
1001 mp->entry.integrity_algorithm = ipsec_integ_algo_encode (sa->integ_alg);
1002 ipsec_key_encode (&sa->integ_key, &mp->entry.integrity_key);
1003
1004 mp->entry.flags = ipsec_sad_flags_encode (sa);
1005 mp->entry.salt = clib_host_to_net_u32 (sa->salt);
1006
1007 if (ipsec_sa_is_set_IS_PROTECT (sa))
1008 {
1009 ipsec_sa_dump_match_ctx_t ctx = {
Neale Rannsc5fe57d2021-02-25 16:01:28 +00001010 .sai = sa - ipsec_sa_pool,
1011 .sw_if_index = ~0,
Neale Ranns041add72020-01-02 04:06:10 +00001012 };
1013 ipsec_tun_protect_walk (ipsec_sa_dump_match_sa, &ctx);
1014
1015 mp->sw_if_index = htonl (ctx.sw_if_index);
1016 }
1017 else
1018 mp->sw_if_index = ~0;
1019
1020 if (ipsec_sa_is_set_IS_TUNNEL (sa))
1021 {
Neale Ranns9ec846c2021-02-09 14:04:02 +00001022 ip_address_encode2 (&sa->tunnel.t_src, &mp->entry.tunnel_src);
1023 ip_address_encode2 (&sa->tunnel.t_dst, &mp->entry.tunnel_dst);
Neale Ranns041add72020-01-02 04:06:10 +00001024 }
1025 if (ipsec_sa_is_set_UDP_ENCAP (sa))
1026 {
1027 mp->entry.udp_src_port = sa->udp_hdr.src_port;
1028 mp->entry.udp_dst_port = sa->udp_hdr.dst_port;
1029 }
1030
Neale Ranns9ec846c2021-02-09 14:04:02 +00001031 mp->entry.tunnel_flags =
1032 tunnel_encap_decap_flags_encode (sa->tunnel.t_encap_decap_flags);
1033 mp->entry.dscp = ip_dscp_encode (sa->tunnel.t_dscp);
Neale Ranns041add72020-01-02 04:06:10 +00001034
1035 mp->seq_outbound = clib_host_to_net_u64 (((u64) sa->seq));
Neale Ranns5b891102021-06-28 13:31:28 +00001036 mp->last_seq_inbound = clib_host_to_net_u64 (((u64) sa->seq));
Neale Ranns041add72020-01-02 04:06:10 +00001037 if (ipsec_sa_is_set_USE_ESN (sa))
1038 {
1039 mp->seq_outbound |= (u64) (clib_host_to_net_u32 (sa->seq_hi));
Neale Ranns5b891102021-06-28 13:31:28 +00001040 mp->last_seq_inbound |= (u64) (clib_host_to_net_u32 (sa->seq_hi));
Neale Ranns041add72020-01-02 04:06:10 +00001041 }
1042 if (ipsec_sa_is_set_USE_ANTI_REPLAY (sa))
1043 mp->replay_window = clib_host_to_net_u64 (sa->replay_window);
1044
1045 mp->stat_index = clib_host_to_net_u32 (sa->stat_index);
1046
1047 vl_api_send_msg (ctx->reg, (u8 *) mp);
1048
1049 return (WALK_CONTINUE);
1050}
1051
1052static void
Neale Ranns9ec846c2021-02-09 14:04:02 +00001053vl_api_ipsec_sa_v2_dump_t_handler (vl_api_ipsec_sa_v2_dump_t *mp)
Neale Ranns041add72020-01-02 04:06:10 +00001054{
1055 vl_api_registration_t *reg;
1056
Neale Ranns041add72020-01-02 04:06:10 +00001057 reg = vl_api_client_index_to_registration (mp->client_index);
1058 if (!reg)
1059 return;
1060
1061 ipsec_dump_walk_ctx_t ctx = {
1062 .reg = reg,
1063 .context = mp->context,
1064 };
1065
1066 ipsec_sa_walk (send_ipsec_sa_v2_details, &ctx);
Neale Ranns041add72020-01-02 04:06:10 +00001067}
1068
Neale Ranns9ec846c2021-02-09 14:04:02 +00001069static walk_rc_t
1070send_ipsec_sa_v3_details (ipsec_sa_t *sa, void *arg)
1071{
1072 ipsec_dump_walk_ctx_t *ctx = arg;
1073 vl_api_ipsec_sa_v3_details_t *mp;
Neale Ranns9ec846c2021-02-09 14:04:02 +00001074
1075 mp = vl_msg_api_alloc (sizeof (*mp));
1076 clib_memset (mp, 0, sizeof (*mp));
Filip Tehlarc73f3292021-06-22 08:21:31 +00001077 mp->_vl_msg_id = ntohs (REPLY_MSG_ID_BASE + VL_API_IPSEC_SA_V3_DETAILS);
Neale Ranns9ec846c2021-02-09 14:04:02 +00001078 mp->context = ctx->context;
1079
1080 mp->entry.sad_id = htonl (sa->id);
1081 mp->entry.spi = htonl (sa->spi);
1082 mp->entry.protocol = ipsec_proto_encode (sa->protocol);
1083
1084 mp->entry.crypto_algorithm = ipsec_crypto_algo_encode (sa->crypto_alg);
1085 ipsec_key_encode (&sa->crypto_key, &mp->entry.crypto_key);
1086
1087 mp->entry.integrity_algorithm = ipsec_integ_algo_encode (sa->integ_alg);
1088 ipsec_key_encode (&sa->integ_key, &mp->entry.integrity_key);
1089
1090 mp->entry.flags = ipsec_sad_flags_encode (sa);
1091 mp->entry.salt = clib_host_to_net_u32 (sa->salt);
1092
1093 if (ipsec_sa_is_set_IS_PROTECT (sa))
1094 {
1095 ipsec_sa_dump_match_ctx_t ctx = {
Neale Rannsc5fe57d2021-02-25 16:01:28 +00001096 .sai = sa - ipsec_sa_pool,
Neale Ranns9ec846c2021-02-09 14:04:02 +00001097 .sw_if_index = ~0,
1098 };
1099 ipsec_tun_protect_walk (ipsec_sa_dump_match_sa, &ctx);
1100
1101 mp->sw_if_index = htonl (ctx.sw_if_index);
1102 }
1103 else
1104 mp->sw_if_index = ~0;
1105
1106 if (ipsec_sa_is_set_IS_TUNNEL (sa))
1107 tunnel_encode (&sa->tunnel, &mp->entry.tunnel);
1108
1109 if (ipsec_sa_is_set_UDP_ENCAP (sa))
1110 {
1111 mp->entry.udp_src_port = sa->udp_hdr.src_port;
1112 mp->entry.udp_dst_port = sa->udp_hdr.dst_port;
1113 }
1114
1115 mp->seq_outbound = clib_host_to_net_u64 (((u64) sa->seq));
Neale Ranns5b891102021-06-28 13:31:28 +00001116 mp->last_seq_inbound = clib_host_to_net_u64 (((u64) sa->seq));
Neale Ranns9ec846c2021-02-09 14:04:02 +00001117 if (ipsec_sa_is_set_USE_ESN (sa))
1118 {
1119 mp->seq_outbound |= (u64) (clib_host_to_net_u32 (sa->seq_hi));
Neale Ranns5b891102021-06-28 13:31:28 +00001120 mp->last_seq_inbound |= (u64) (clib_host_to_net_u32 (sa->seq_hi));
Neale Ranns9ec846c2021-02-09 14:04:02 +00001121 }
1122 if (ipsec_sa_is_set_USE_ANTI_REPLAY (sa))
1123 mp->replay_window = clib_host_to_net_u64 (sa->replay_window);
1124
1125 mp->stat_index = clib_host_to_net_u32 (sa->stat_index);
1126
1127 vl_api_send_msg (ctx->reg, (u8 *) mp);
1128
1129 return (WALK_CONTINUE);
1130}
1131
1132static void
1133vl_api_ipsec_sa_v3_dump_t_handler (vl_api_ipsec_sa_v3_dump_t *mp)
1134{
1135 vl_api_registration_t *reg;
1136
Neale Ranns9ec846c2021-02-09 14:04:02 +00001137 reg = vl_api_client_index_to_registration (mp->client_index);
1138 if (!reg)
1139 return;
1140
1141 ipsec_dump_walk_ctx_t ctx = {
1142 .reg = reg,
1143 .context = mp->context,
1144 };
1145
1146 ipsec_sa_walk (send_ipsec_sa_v3_details, &ctx);
Neale Ranns9ec846c2021-02-09 14:04:02 +00001147}
1148
Maxime Peim1271e3a2023-03-20 14:13:56 +00001149static walk_rc_t
1150send_ipsec_sa_v4_details (ipsec_sa_t *sa, void *arg)
1151{
1152 ipsec_dump_walk_ctx_t *ctx = arg;
1153 vl_api_ipsec_sa_v4_details_t *mp;
1154
1155 mp = vl_msg_api_alloc (sizeof (*mp));
1156 clib_memset (mp, 0, sizeof (*mp));
1157 mp->_vl_msg_id = ntohs (REPLY_MSG_ID_BASE + VL_API_IPSEC_SA_V4_DETAILS);
1158 mp->context = ctx->context;
1159
1160 mp->entry.sad_id = htonl (sa->id);
1161 mp->entry.spi = htonl (sa->spi);
1162 mp->entry.protocol = ipsec_proto_encode (sa->protocol);
1163
1164 mp->entry.crypto_algorithm = ipsec_crypto_algo_encode (sa->crypto_alg);
1165 ipsec_key_encode (&sa->crypto_key, &mp->entry.crypto_key);
1166
1167 mp->entry.integrity_algorithm = ipsec_integ_algo_encode (sa->integ_alg);
1168 ipsec_key_encode (&sa->integ_key, &mp->entry.integrity_key);
1169
1170 mp->entry.flags = ipsec_sad_flags_encode (sa);
1171 mp->entry.salt = clib_host_to_net_u32 (sa->salt);
1172
1173 if (ipsec_sa_is_set_IS_PROTECT (sa))
1174 {
1175 ipsec_sa_dump_match_ctx_t ctx = {
1176 .sai = sa - ipsec_sa_pool,
1177 .sw_if_index = ~0,
1178 };
1179 ipsec_tun_protect_walk (ipsec_sa_dump_match_sa, &ctx);
1180
1181 mp->sw_if_index = htonl (ctx.sw_if_index);
1182 }
1183 else
1184 mp->sw_if_index = ~0;
1185
1186 if (ipsec_sa_is_set_IS_TUNNEL (sa))
1187 tunnel_encode (&sa->tunnel, &mp->entry.tunnel);
1188
1189 if (ipsec_sa_is_set_UDP_ENCAP (sa))
1190 {
1191 mp->entry.udp_src_port = sa->udp_hdr.src_port;
1192 mp->entry.udp_dst_port = sa->udp_hdr.dst_port;
1193 }
1194
1195 mp->seq_outbound = clib_host_to_net_u64 (((u64) sa->seq));
1196 mp->last_seq_inbound = clib_host_to_net_u64 (((u64) sa->seq));
1197 if (ipsec_sa_is_set_USE_ESN (sa))
1198 {
1199 mp->seq_outbound |= (u64) (clib_host_to_net_u32 (sa->seq_hi));
1200 mp->last_seq_inbound |= (u64) (clib_host_to_net_u32 (sa->seq_hi));
1201 }
1202 if (ipsec_sa_is_set_USE_ANTI_REPLAY (sa))
1203 mp->replay_window = clib_host_to_net_u64 (sa->replay_window);
1204
1205 mp->thread_index = clib_host_to_net_u32 (sa->thread_index);
1206 mp->stat_index = clib_host_to_net_u32 (sa->stat_index);
1207
1208 vl_api_send_msg (ctx->reg, (u8 *) mp);
1209
1210 return (WALK_CONTINUE);
1211}
1212
1213static void
1214vl_api_ipsec_sa_v4_dump_t_handler (vl_api_ipsec_sa_v4_dump_t *mp)
1215{
1216 vl_api_registration_t *reg;
1217
1218 reg = vl_api_client_index_to_registration (mp->client_index);
1219 if (!reg)
1220 return;
1221
1222 ipsec_dump_walk_ctx_t ctx = {
1223 .reg = reg,
1224 .context = mp->context,
1225 };
1226
1227 ipsec_sa_walk (send_ipsec_sa_v4_details, &ctx);
1228}
1229
Matthew Smith75d85602017-10-05 19:03:05 -05001230static void
Klement Sekerab4d30532018-11-08 13:00:02 +01001231vl_api_ipsec_backend_dump_t_handler (vl_api_ipsec_backend_dump_t * mp)
1232{
1233 vl_api_registration_t *rp;
1234 ipsec_main_t *im = &ipsec_main;
1235 u32 context = mp->context;
1236
1237 rp = vl_api_client_index_to_registration (mp->client_index);
1238
1239 if (rp == 0)
1240 {
1241 clib_warning ("Client %d AWOL", mp->client_index);
1242 return;
1243 }
1244
1245 ipsec_ah_backend_t *ab;
1246 ipsec_esp_backend_t *eb;
1247 /* *INDENT-OFF* */
Damjan Marionb2c31b62020-12-13 21:47:40 +01001248 pool_foreach (ab, im->ah_backends) {
Klement Sekerab4d30532018-11-08 13:00:02 +01001249 vl_api_ipsec_backend_details_t *mp = vl_msg_api_alloc (sizeof (*mp));
1250 clib_memset (mp, 0, sizeof (*mp));
Filip Tehlarc73f3292021-06-22 08:21:31 +00001251 mp->_vl_msg_id = ntohs (REPLY_MSG_ID_BASE + VL_API_IPSEC_BACKEND_DETAILS);
Klement Sekerab4d30532018-11-08 13:00:02 +01001252 mp->context = context;
1253 snprintf ((char *)mp->name, sizeof (mp->name), "%.*s", vec_len (ab->name),
1254 ab->name);
Neale Ranns17dcec02019-01-09 21:22:20 -08001255 mp->protocol = ntohl (IPSEC_API_PROTO_AH);
Klement Sekerab4d30532018-11-08 13:00:02 +01001256 mp->index = ab - im->ah_backends;
1257 mp->active = mp->index == im->ah_current_backend ? 1 : 0;
1258 vl_api_send_msg (rp, (u8 *)mp);
Damjan Marionb2c31b62020-12-13 21:47:40 +01001259 }
1260 pool_foreach (eb, im->esp_backends) {
Klement Sekerab4d30532018-11-08 13:00:02 +01001261 vl_api_ipsec_backend_details_t *mp = vl_msg_api_alloc (sizeof (*mp));
1262 clib_memset (mp, 0, sizeof (*mp));
Filip Tehlarc73f3292021-06-22 08:21:31 +00001263 mp->_vl_msg_id = ntohs (REPLY_MSG_ID_BASE + VL_API_IPSEC_BACKEND_DETAILS);
Klement Sekerab4d30532018-11-08 13:00:02 +01001264 mp->context = context;
1265 snprintf ((char *)mp->name, sizeof (mp->name), "%.*s", vec_len (eb->name),
1266 eb->name);
Neale Ranns17dcec02019-01-09 21:22:20 -08001267 mp->protocol = ntohl (IPSEC_API_PROTO_ESP);
Klement Sekerab4d30532018-11-08 13:00:02 +01001268 mp->index = eb - im->esp_backends;
1269 mp->active = mp->index == im->esp_current_backend ? 1 : 0;
1270 vl_api_send_msg (rp, (u8 *)mp);
Damjan Marionb2c31b62020-12-13 21:47:40 +01001271 }
Klement Sekerab4d30532018-11-08 13:00:02 +01001272 /* *INDENT-ON* */
1273}
1274
1275static void
1276vl_api_ipsec_select_backend_t_handler (vl_api_ipsec_select_backend_t * mp)
1277{
1278 ipsec_main_t *im = &ipsec_main;
1279 vl_api_ipsec_select_backend_reply_t *rmp;
Neale Ranns17dcec02019-01-09 21:22:20 -08001280 ipsec_protocol_t protocol;
Klement Sekerab4d30532018-11-08 13:00:02 +01001281 int rv = 0;
Neale Rannsc5fe57d2021-02-25 16:01:28 +00001282 if (pool_elts (ipsec_sa_pool) > 0)
Klement Sekerab4d30532018-11-08 13:00:02 +01001283 {
1284 rv = VNET_API_ERROR_INSTANCE_IN_USE;
1285 goto done;
1286 }
Neale Ranns17dcec02019-01-09 21:22:20 -08001287
1288 rv = ipsec_proto_decode (mp->protocol, &protocol);
1289
1290 if (rv)
1291 goto done;
1292
Neale Ranns17dcec02019-01-09 21:22:20 -08001293 switch (protocol)
Klement Sekerab4d30532018-11-08 13:00:02 +01001294 {
1295 case IPSEC_PROTOCOL_ESP:
Neale Rannse8915fc2019-04-23 20:57:55 -04001296 rv = ipsec_select_esp_backend (im, mp->index);
Klement Sekerab4d30532018-11-08 13:00:02 +01001297 break;
1298 case IPSEC_PROTOCOL_AH:
Neale Rannse8915fc2019-04-23 20:57:55 -04001299 rv = ipsec_select_ah_backend (im, mp->index);
Klement Sekerab4d30532018-11-08 13:00:02 +01001300 break;
1301 default:
Neale Rannse8915fc2019-04-23 20:57:55 -04001302 rv = VNET_API_ERROR_INVALID_PROTOCOL;
Klement Sekerab4d30532018-11-08 13:00:02 +01001303 break;
1304 }
Klement Sekerab4d30532018-11-08 13:00:02 +01001305done:
1306 REPLY_MACRO (VL_API_IPSEC_SELECT_BACKEND_REPLY);
1307}
1308
Yulong Pei2e84d662020-08-14 18:21:08 +08001309static void
1310vl_api_ipsec_set_async_mode_t_handler (vl_api_ipsec_set_async_mode_t * mp)
1311{
1312 vl_api_ipsec_set_async_mode_reply_t *rmp;
1313 int rv = 0;
1314
Yulong Pei2e84d662020-08-14 18:21:08 +08001315 ipsec_set_async_mode (mp->async_enable);
1316
1317 REPLY_MACRO (VL_API_IPSEC_SET_ASYNC_MODE_REPLY);
1318}
1319
Filip Tehlarc73f3292021-06-22 08:21:31 +00001320#include <vnet/ipsec/ipsec.api.c>
Pavel Kotucek9c7ef032016-12-21 07:46:45 +01001321static clib_error_t *
1322ipsec_api_hookup (vlib_main_t * vm)
1323{
Pavel Kotucek9c7ef032016-12-21 07:46:45 +01001324 /*
Pavel Kotucek9c7ef032016-12-21 07:46:45 +01001325 * Set up the (msg_name, crc, message-id) table
1326 */
Filip Tehlarc73f3292021-06-22 08:21:31 +00001327 REPLY_MSG_ID_BASE = setup_message_id_table ();
Pavel Kotucek9c7ef032016-12-21 07:46:45 +01001328
1329 return 0;
1330}
1331
1332VLIB_API_INIT_FUNCTION (ipsec_api_hookup);
1333
1334/*
1335 * fd.io coding-style-patch-verification: ON
1336 *
1337 * Local Variables:
1338 * eval: (c-set-style "gnu")
1339 * End:
1340 */