xref: /dpdk/lib/security/rte_security.c (revision 30a1de10)
199a2dd95SBruce Richardson /* SPDX-License-Identifier: BSD-3-Clause
299a2dd95SBruce Richardson  * Copyright 2017 NXP.
399a2dd95SBruce Richardson  * Copyright(c) 2017 Intel Corporation.
499a2dd95SBruce Richardson  * Copyright (c) 2020 Samsung Electronics Co., Ltd All Rights Reserved
599a2dd95SBruce Richardson  */
699a2dd95SBruce Richardson 
7*259ca6d1SGowrishankar Muthukrishnan #include <rte_cryptodev.h>
899a2dd95SBruce Richardson #include <rte_dev.h>
9*259ca6d1SGowrishankar Muthukrishnan #include <rte_telemetry.h>
1099a2dd95SBruce Richardson #include "rte_security.h"
1199a2dd95SBruce Richardson #include "rte_security_driver.h"
1299a2dd95SBruce Richardson 
1399a2dd95SBruce Richardson /* Macro to check for invalid pointers */
1499a2dd95SBruce Richardson #define RTE_PTR_OR_ERR_RET(ptr, retval) do {	\
1599a2dd95SBruce Richardson 	if ((ptr) == NULL)			\
1699a2dd95SBruce Richardson 		return retval;			\
1799a2dd95SBruce Richardson } while (0)
1899a2dd95SBruce Richardson 
1999a2dd95SBruce Richardson /* Macro to check for invalid pointers chains */
2099a2dd95SBruce Richardson #define RTE_PTR_CHAIN3_OR_ERR_RET(p1, p2, p3, retval, last_retval) do {	\
2199a2dd95SBruce Richardson 	RTE_PTR_OR_ERR_RET(p1, retval);					\
2299a2dd95SBruce Richardson 	RTE_PTR_OR_ERR_RET(p1->p2, retval);				\
2399a2dd95SBruce Richardson 	RTE_PTR_OR_ERR_RET(p1->p2->p3, last_retval);			\
2499a2dd95SBruce Richardson } while (0)
2599a2dd95SBruce Richardson 
2699a2dd95SBruce Richardson #define RTE_SECURITY_DYNFIELD_NAME "rte_security_dynfield_metadata"
2799a2dd95SBruce Richardson int rte_security_dynfield_offset = -1;
2899a2dd95SBruce Richardson 
2999a2dd95SBruce Richardson int
rte_security_dynfield_register(void)3099a2dd95SBruce Richardson rte_security_dynfield_register(void)
3199a2dd95SBruce Richardson {
3299a2dd95SBruce Richardson 	static const struct rte_mbuf_dynfield dynfield_desc = {
3399a2dd95SBruce Richardson 		.name = RTE_SECURITY_DYNFIELD_NAME,
3499a2dd95SBruce Richardson 		.size = sizeof(rte_security_dynfield_t),
3599a2dd95SBruce Richardson 		.align = __alignof__(rte_security_dynfield_t),
3699a2dd95SBruce Richardson 	};
3799a2dd95SBruce Richardson 	rte_security_dynfield_offset =
3899a2dd95SBruce Richardson 		rte_mbuf_dynfield_register(&dynfield_desc);
3999a2dd95SBruce Richardson 	return rte_security_dynfield_offset;
4099a2dd95SBruce Richardson }
4199a2dd95SBruce Richardson 
4299a2dd95SBruce Richardson struct rte_security_session *
rte_security_session_create(struct rte_security_ctx * instance,struct rte_security_session_conf * conf,struct rte_mempool * mp,struct rte_mempool * priv_mp)4399a2dd95SBruce Richardson rte_security_session_create(struct rte_security_ctx *instance,
4499a2dd95SBruce Richardson 			    struct rte_security_session_conf *conf,
4599a2dd95SBruce Richardson 			    struct rte_mempool *mp,
4699a2dd95SBruce Richardson 			    struct rte_mempool *priv_mp)
4799a2dd95SBruce Richardson {
4899a2dd95SBruce Richardson 	struct rte_security_session *sess = NULL;
4999a2dd95SBruce Richardson 
5099a2dd95SBruce Richardson 	RTE_PTR_CHAIN3_OR_ERR_RET(instance, ops, session_create, NULL, NULL);
5199a2dd95SBruce Richardson 	RTE_PTR_OR_ERR_RET(conf, NULL);
5299a2dd95SBruce Richardson 	RTE_PTR_OR_ERR_RET(mp, NULL);
5399a2dd95SBruce Richardson 	RTE_PTR_OR_ERR_RET(priv_mp, NULL);
5499a2dd95SBruce Richardson 
5599a2dd95SBruce Richardson 	if (rte_mempool_get(mp, (void **)&sess))
5699a2dd95SBruce Richardson 		return NULL;
5799a2dd95SBruce Richardson 
5899a2dd95SBruce Richardson 	if (instance->ops->session_create(instance->device, conf,
5999a2dd95SBruce Richardson 				sess, priv_mp)) {
6099a2dd95SBruce Richardson 		rte_mempool_put(mp, (void *)sess);
6199a2dd95SBruce Richardson 		return NULL;
6299a2dd95SBruce Richardson 	}
6399a2dd95SBruce Richardson 	instance->sess_cnt++;
6499a2dd95SBruce Richardson 
6599a2dd95SBruce Richardson 	return sess;
6699a2dd95SBruce Richardson }
6799a2dd95SBruce Richardson 
6899a2dd95SBruce Richardson int
rte_security_session_update(struct rte_security_ctx * instance,struct rte_security_session * sess,struct rte_security_session_conf * conf)6999a2dd95SBruce Richardson rte_security_session_update(struct rte_security_ctx *instance,
7099a2dd95SBruce Richardson 			    struct rte_security_session *sess,
7199a2dd95SBruce Richardson 			    struct rte_security_session_conf *conf)
7299a2dd95SBruce Richardson {
7399a2dd95SBruce Richardson 	RTE_PTR_CHAIN3_OR_ERR_RET(instance, ops, session_update, -EINVAL,
7499a2dd95SBruce Richardson 			-ENOTSUP);
7599a2dd95SBruce Richardson 	RTE_PTR_OR_ERR_RET(sess, -EINVAL);
7699a2dd95SBruce Richardson 	RTE_PTR_OR_ERR_RET(conf, -EINVAL);
7799a2dd95SBruce Richardson 
7899a2dd95SBruce Richardson 	return instance->ops->session_update(instance->device, sess, conf);
7999a2dd95SBruce Richardson }
8099a2dd95SBruce Richardson 
8199a2dd95SBruce Richardson unsigned int
rte_security_session_get_size(struct rte_security_ctx * instance)8299a2dd95SBruce Richardson rte_security_session_get_size(struct rte_security_ctx *instance)
8399a2dd95SBruce Richardson {
8499a2dd95SBruce Richardson 	RTE_PTR_CHAIN3_OR_ERR_RET(instance, ops, session_get_size, 0, 0);
8599a2dd95SBruce Richardson 
8699a2dd95SBruce Richardson 	return instance->ops->session_get_size(instance->device);
8799a2dd95SBruce Richardson }
8899a2dd95SBruce Richardson 
8999a2dd95SBruce Richardson int
rte_security_session_stats_get(struct rte_security_ctx * instance,struct rte_security_session * sess,struct rte_security_stats * stats)9099a2dd95SBruce Richardson rte_security_session_stats_get(struct rte_security_ctx *instance,
9199a2dd95SBruce Richardson 			       struct rte_security_session *sess,
9299a2dd95SBruce Richardson 			       struct rte_security_stats *stats)
9399a2dd95SBruce Richardson {
9499a2dd95SBruce Richardson 	RTE_PTR_CHAIN3_OR_ERR_RET(instance, ops, session_stats_get, -EINVAL,
9599a2dd95SBruce Richardson 			-ENOTSUP);
9699a2dd95SBruce Richardson 	/* Parameter sess can be NULL in case of getting global statistics. */
9799a2dd95SBruce Richardson 	RTE_PTR_OR_ERR_RET(stats, -EINVAL);
9899a2dd95SBruce Richardson 
9999a2dd95SBruce Richardson 	return instance->ops->session_stats_get(instance->device, sess, stats);
10099a2dd95SBruce Richardson }
10199a2dd95SBruce Richardson 
10299a2dd95SBruce Richardson int
rte_security_session_destroy(struct rte_security_ctx * instance,struct rte_security_session * sess)10399a2dd95SBruce Richardson rte_security_session_destroy(struct rte_security_ctx *instance,
10499a2dd95SBruce Richardson 			     struct rte_security_session *sess)
10599a2dd95SBruce Richardson {
10699a2dd95SBruce Richardson 	int ret;
10799a2dd95SBruce Richardson 
10899a2dd95SBruce Richardson 	RTE_PTR_CHAIN3_OR_ERR_RET(instance, ops, session_destroy, -EINVAL,
10999a2dd95SBruce Richardson 			-ENOTSUP);
11099a2dd95SBruce Richardson 	RTE_PTR_OR_ERR_RET(sess, -EINVAL);
11199a2dd95SBruce Richardson 
11299a2dd95SBruce Richardson 	ret = instance->ops->session_destroy(instance->device, sess);
11399a2dd95SBruce Richardson 	if (ret != 0)
11499a2dd95SBruce Richardson 		return ret;
11599a2dd95SBruce Richardson 
11699a2dd95SBruce Richardson 	rte_mempool_put(rte_mempool_from_obj(sess), (void *)sess);
11799a2dd95SBruce Richardson 
11899a2dd95SBruce Richardson 	if (instance->sess_cnt)
11999a2dd95SBruce Richardson 		instance->sess_cnt--;
12099a2dd95SBruce Richardson 
12199a2dd95SBruce Richardson 	return 0;
12299a2dd95SBruce Richardson }
12399a2dd95SBruce Richardson 
12499a2dd95SBruce Richardson int
__rte_security_set_pkt_metadata(struct rte_security_ctx * instance,struct rte_security_session * sess,struct rte_mbuf * m,void * params)125d08dcd28SNithin Dabilpuram __rte_security_set_pkt_metadata(struct rte_security_ctx *instance,
12699a2dd95SBruce Richardson 				struct rte_security_session *sess,
12799a2dd95SBruce Richardson 				struct rte_mbuf *m, void *params)
12899a2dd95SBruce Richardson {
12999a2dd95SBruce Richardson #ifdef RTE_DEBUG
13099a2dd95SBruce Richardson 	RTE_PTR_OR_ERR_RET(sess, -EINVAL);
13199a2dd95SBruce Richardson 	RTE_PTR_OR_ERR_RET(instance, -EINVAL);
13299a2dd95SBruce Richardson 	RTE_PTR_OR_ERR_RET(instance->ops, -EINVAL);
13399a2dd95SBruce Richardson #endif
13499a2dd95SBruce Richardson 	RTE_FUNC_PTR_OR_ERR_RET(*instance->ops->set_pkt_metadata, -ENOTSUP);
13599a2dd95SBruce Richardson 	return instance->ops->set_pkt_metadata(instance->device,
13699a2dd95SBruce Richardson 					       sess, m, params);
13799a2dd95SBruce Richardson }
13899a2dd95SBruce Richardson 
13999a2dd95SBruce Richardson void *
__rte_security_get_userdata(struct rte_security_ctx * instance,uint64_t md)140d08dcd28SNithin Dabilpuram __rte_security_get_userdata(struct rte_security_ctx *instance, uint64_t md)
14199a2dd95SBruce Richardson {
14299a2dd95SBruce Richardson 	void *userdata = NULL;
14399a2dd95SBruce Richardson 
14499a2dd95SBruce Richardson #ifdef RTE_DEBUG
14599a2dd95SBruce Richardson 	RTE_PTR_OR_ERR_RET(instance, NULL);
14699a2dd95SBruce Richardson 	RTE_PTR_OR_ERR_RET(instance->ops, NULL);
14799a2dd95SBruce Richardson #endif
14899a2dd95SBruce Richardson 	RTE_FUNC_PTR_OR_ERR_RET(*instance->ops->get_userdata, NULL);
14999a2dd95SBruce Richardson 	if (instance->ops->get_userdata(instance->device, md, &userdata))
15099a2dd95SBruce Richardson 		return NULL;
15199a2dd95SBruce Richardson 
15299a2dd95SBruce Richardson 	return userdata;
15399a2dd95SBruce Richardson }
15499a2dd95SBruce Richardson 
15599a2dd95SBruce Richardson const struct rte_security_capability *
rte_security_capabilities_get(struct rte_security_ctx * instance)15699a2dd95SBruce Richardson rte_security_capabilities_get(struct rte_security_ctx *instance)
15799a2dd95SBruce Richardson {
15899a2dd95SBruce Richardson 	RTE_PTR_CHAIN3_OR_ERR_RET(instance, ops, capabilities_get, NULL, NULL);
15999a2dd95SBruce Richardson 
16099a2dd95SBruce Richardson 	return instance->ops->capabilities_get(instance->device);
16199a2dd95SBruce Richardson }
16299a2dd95SBruce Richardson 
16399a2dd95SBruce Richardson const struct rte_security_capability *
rte_security_capability_get(struct rte_security_ctx * instance,struct rte_security_capability_idx * idx)16499a2dd95SBruce Richardson rte_security_capability_get(struct rte_security_ctx *instance,
16599a2dd95SBruce Richardson 			    struct rte_security_capability_idx *idx)
16699a2dd95SBruce Richardson {
16799a2dd95SBruce Richardson 	const struct rte_security_capability *capabilities;
16899a2dd95SBruce Richardson 	const struct rte_security_capability *capability;
16999a2dd95SBruce Richardson 	uint16_t i = 0;
17099a2dd95SBruce Richardson 
17199a2dd95SBruce Richardson 	RTE_PTR_CHAIN3_OR_ERR_RET(instance, ops, capabilities_get, NULL, NULL);
17299a2dd95SBruce Richardson 	RTE_PTR_OR_ERR_RET(idx, NULL);
17399a2dd95SBruce Richardson 
17499a2dd95SBruce Richardson 	capabilities = instance->ops->capabilities_get(instance->device);
17599a2dd95SBruce Richardson 
17699a2dd95SBruce Richardson 	if (capabilities == NULL)
17799a2dd95SBruce Richardson 		return NULL;
17899a2dd95SBruce Richardson 
17999a2dd95SBruce Richardson 	while ((capability = &capabilities[i++])->action
18099a2dd95SBruce Richardson 			!= RTE_SECURITY_ACTION_TYPE_NONE) {
18199a2dd95SBruce Richardson 		if (capability->action == idx->action &&
18299a2dd95SBruce Richardson 				capability->protocol == idx->protocol) {
18399a2dd95SBruce Richardson 			if (idx->protocol == RTE_SECURITY_PROTOCOL_IPSEC) {
18499a2dd95SBruce Richardson 				if (capability->ipsec.proto ==
18599a2dd95SBruce Richardson 						idx->ipsec.proto &&
18699a2dd95SBruce Richardson 					capability->ipsec.mode ==
18799a2dd95SBruce Richardson 							idx->ipsec.mode &&
18899a2dd95SBruce Richardson 					capability->ipsec.direction ==
18999a2dd95SBruce Richardson 							idx->ipsec.direction)
19099a2dd95SBruce Richardson 					return capability;
19199a2dd95SBruce Richardson 			} else if (idx->protocol == RTE_SECURITY_PROTOCOL_PDCP) {
19299a2dd95SBruce Richardson 				if (capability->pdcp.domain ==
19399a2dd95SBruce Richardson 							idx->pdcp.domain)
19499a2dd95SBruce Richardson 					return capability;
19599a2dd95SBruce Richardson 			} else if (idx->protocol ==
19699a2dd95SBruce Richardson 						RTE_SECURITY_PROTOCOL_DOCSIS) {
19799a2dd95SBruce Richardson 				if (capability->docsis.direction ==
19899a2dd95SBruce Richardson 							idx->docsis.direction)
19999a2dd95SBruce Richardson 					return capability;
20099a2dd95SBruce Richardson 			}
20199a2dd95SBruce Richardson 		}
20299a2dd95SBruce Richardson 	}
20399a2dd95SBruce Richardson 
20499a2dd95SBruce Richardson 	return NULL;
20599a2dd95SBruce Richardson }
206*259ca6d1SGowrishankar Muthukrishnan 
207*259ca6d1SGowrishankar Muthukrishnan static int
security_handle_cryptodev_list(const char * cmd __rte_unused,const char * params __rte_unused,struct rte_tel_data * d)208*259ca6d1SGowrishankar Muthukrishnan security_handle_cryptodev_list(const char *cmd __rte_unused,
209*259ca6d1SGowrishankar Muthukrishnan 			       const char *params __rte_unused,
210*259ca6d1SGowrishankar Muthukrishnan 			       struct rte_tel_data *d)
211*259ca6d1SGowrishankar Muthukrishnan {
212*259ca6d1SGowrishankar Muthukrishnan 	int dev_id;
213*259ca6d1SGowrishankar Muthukrishnan 
214*259ca6d1SGowrishankar Muthukrishnan 	if (rte_cryptodev_count() < 1)
215*259ca6d1SGowrishankar Muthukrishnan 		return -1;
216*259ca6d1SGowrishankar Muthukrishnan 
217*259ca6d1SGowrishankar Muthukrishnan 	rte_tel_data_start_array(d, RTE_TEL_INT_VAL);
218*259ca6d1SGowrishankar Muthukrishnan 	for (dev_id = 0; dev_id < RTE_CRYPTO_MAX_DEVS; dev_id++)
219*259ca6d1SGowrishankar Muthukrishnan 		if (rte_cryptodev_is_valid_dev(dev_id) &&
220*259ca6d1SGowrishankar Muthukrishnan 		    rte_cryptodev_get_sec_ctx(dev_id))
221*259ca6d1SGowrishankar Muthukrishnan 			rte_tel_data_add_array_int(d, dev_id);
222*259ca6d1SGowrishankar Muthukrishnan 
223*259ca6d1SGowrishankar Muthukrishnan 	return 0;
224*259ca6d1SGowrishankar Muthukrishnan }
225*259ca6d1SGowrishankar Muthukrishnan 
226*259ca6d1SGowrishankar Muthukrishnan #define CRYPTO_CAPS_SZ                                             \
227*259ca6d1SGowrishankar Muthukrishnan 	(RTE_ALIGN_CEIL(sizeof(struct rte_cryptodev_capabilities), \
228*259ca6d1SGowrishankar Muthukrishnan 			sizeof(uint64_t)) /	sizeof(uint64_t))
229*259ca6d1SGowrishankar Muthukrishnan 
230*259ca6d1SGowrishankar Muthukrishnan static int
crypto_caps_array(struct rte_tel_data * d,const struct rte_cryptodev_capabilities * capabilities)231*259ca6d1SGowrishankar Muthukrishnan crypto_caps_array(struct rte_tel_data *d,
232*259ca6d1SGowrishankar Muthukrishnan 		  const struct rte_cryptodev_capabilities *capabilities)
233*259ca6d1SGowrishankar Muthukrishnan {
234*259ca6d1SGowrishankar Muthukrishnan 	const struct rte_cryptodev_capabilities *dev_caps;
235*259ca6d1SGowrishankar Muthukrishnan 	uint64_t caps_val[CRYPTO_CAPS_SZ];
236*259ca6d1SGowrishankar Muthukrishnan 	unsigned int i = 0, j;
237*259ca6d1SGowrishankar Muthukrishnan 
238*259ca6d1SGowrishankar Muthukrishnan 	rte_tel_data_start_array(d, RTE_TEL_U64_VAL);
239*259ca6d1SGowrishankar Muthukrishnan 
240*259ca6d1SGowrishankar Muthukrishnan 	while ((dev_caps = &capabilities[i++])->op !=
241*259ca6d1SGowrishankar Muthukrishnan 	   RTE_CRYPTO_OP_TYPE_UNDEFINED) {
242*259ca6d1SGowrishankar Muthukrishnan 		memset(&caps_val, 0, CRYPTO_CAPS_SZ * sizeof(caps_val[0]));
243*259ca6d1SGowrishankar Muthukrishnan 		rte_memcpy(caps_val, dev_caps, sizeof(capabilities[0]));
244*259ca6d1SGowrishankar Muthukrishnan 		for (j = 0; j < CRYPTO_CAPS_SZ; j++)
245*259ca6d1SGowrishankar Muthukrishnan 			rte_tel_data_add_array_u64(d, caps_val[j]);
246*259ca6d1SGowrishankar Muthukrishnan 	}
247*259ca6d1SGowrishankar Muthukrishnan 
248*259ca6d1SGowrishankar Muthukrishnan 	return (i - 1);
249*259ca6d1SGowrishankar Muthukrishnan }
250*259ca6d1SGowrishankar Muthukrishnan 
251*259ca6d1SGowrishankar Muthukrishnan #define SEC_CAPS_SZ						\
252*259ca6d1SGowrishankar Muthukrishnan 	(RTE_ALIGN_CEIL(sizeof(struct rte_security_capability), \
253*259ca6d1SGowrishankar Muthukrishnan 			sizeof(uint64_t)) /	sizeof(uint64_t))
254*259ca6d1SGowrishankar Muthukrishnan 
255*259ca6d1SGowrishankar Muthukrishnan static int
sec_caps_array(struct rte_tel_data * d,const struct rte_security_capability * capabilities)256*259ca6d1SGowrishankar Muthukrishnan sec_caps_array(struct rte_tel_data *d,
257*259ca6d1SGowrishankar Muthukrishnan 	       const struct rte_security_capability *capabilities)
258*259ca6d1SGowrishankar Muthukrishnan {
259*259ca6d1SGowrishankar Muthukrishnan 	const struct rte_security_capability *dev_caps;
260*259ca6d1SGowrishankar Muthukrishnan 	uint64_t caps_val[SEC_CAPS_SZ];
261*259ca6d1SGowrishankar Muthukrishnan 	unsigned int i = 0, j;
262*259ca6d1SGowrishankar Muthukrishnan 
263*259ca6d1SGowrishankar Muthukrishnan 	rte_tel_data_start_array(d, RTE_TEL_U64_VAL);
264*259ca6d1SGowrishankar Muthukrishnan 
265*259ca6d1SGowrishankar Muthukrishnan 	while ((dev_caps = &capabilities[i++])->action !=
266*259ca6d1SGowrishankar Muthukrishnan 	   RTE_SECURITY_ACTION_TYPE_NONE) {
267*259ca6d1SGowrishankar Muthukrishnan 		memset(&caps_val, 0, SEC_CAPS_SZ * sizeof(caps_val[0]));
268*259ca6d1SGowrishankar Muthukrishnan 		rte_memcpy(caps_val, dev_caps, sizeof(capabilities[0]));
269*259ca6d1SGowrishankar Muthukrishnan 		for (j = 0; j < SEC_CAPS_SZ; j++)
270*259ca6d1SGowrishankar Muthukrishnan 			rte_tel_data_add_array_u64(d, caps_val[j]);
271*259ca6d1SGowrishankar Muthukrishnan 	}
272*259ca6d1SGowrishankar Muthukrishnan 
273*259ca6d1SGowrishankar Muthukrishnan 	return i - 1;
274*259ca6d1SGowrishankar Muthukrishnan }
275*259ca6d1SGowrishankar Muthukrishnan 
276*259ca6d1SGowrishankar Muthukrishnan static const struct rte_security_capability *
security_capability_by_index(const struct rte_security_capability * capabilities,int index)277*259ca6d1SGowrishankar Muthukrishnan security_capability_by_index(const struct rte_security_capability *capabilities,
278*259ca6d1SGowrishankar Muthukrishnan 			     int index)
279*259ca6d1SGowrishankar Muthukrishnan {
280*259ca6d1SGowrishankar Muthukrishnan 	const struct rte_security_capability *dev_caps = NULL;
281*259ca6d1SGowrishankar Muthukrishnan 	int i = 0;
282*259ca6d1SGowrishankar Muthukrishnan 
283*259ca6d1SGowrishankar Muthukrishnan 	while ((dev_caps = &capabilities[i])->action !=
284*259ca6d1SGowrishankar Muthukrishnan 	   RTE_SECURITY_ACTION_TYPE_NONE) {
285*259ca6d1SGowrishankar Muthukrishnan 		if (i == index)
286*259ca6d1SGowrishankar Muthukrishnan 			return dev_caps;
287*259ca6d1SGowrishankar Muthukrishnan 
288*259ca6d1SGowrishankar Muthukrishnan 		++i;
289*259ca6d1SGowrishankar Muthukrishnan 	}
290*259ca6d1SGowrishankar Muthukrishnan 
291*259ca6d1SGowrishankar Muthukrishnan 	return NULL;
292*259ca6d1SGowrishankar Muthukrishnan }
293*259ca6d1SGowrishankar Muthukrishnan 
294*259ca6d1SGowrishankar Muthukrishnan static int
security_capabilities_from_dev_id(int dev_id,const void ** caps)295*259ca6d1SGowrishankar Muthukrishnan security_capabilities_from_dev_id(int dev_id, const void **caps)
296*259ca6d1SGowrishankar Muthukrishnan {
297*259ca6d1SGowrishankar Muthukrishnan 	const struct rte_security_capability *capabilities;
298*259ca6d1SGowrishankar Muthukrishnan 	struct rte_security_ctx *sec_ctx;
299*259ca6d1SGowrishankar Muthukrishnan 
300*259ca6d1SGowrishankar Muthukrishnan 	if (rte_cryptodev_is_valid_dev(dev_id) == 0)
301*259ca6d1SGowrishankar Muthukrishnan 		return -EINVAL;
302*259ca6d1SGowrishankar Muthukrishnan 
303*259ca6d1SGowrishankar Muthukrishnan 	sec_ctx = (struct rte_security_ctx *)rte_cryptodev_get_sec_ctx(dev_id);
304*259ca6d1SGowrishankar Muthukrishnan 	RTE_PTR_OR_ERR_RET(sec_ctx, -EINVAL);
305*259ca6d1SGowrishankar Muthukrishnan 
306*259ca6d1SGowrishankar Muthukrishnan 	capabilities = rte_security_capabilities_get(sec_ctx);
307*259ca6d1SGowrishankar Muthukrishnan 	RTE_PTR_OR_ERR_RET(capabilities, -EINVAL);
308*259ca6d1SGowrishankar Muthukrishnan 
309*259ca6d1SGowrishankar Muthukrishnan 	*caps = capabilities;
310*259ca6d1SGowrishankar Muthukrishnan 	return 0;
311*259ca6d1SGowrishankar Muthukrishnan }
312*259ca6d1SGowrishankar Muthukrishnan 
313*259ca6d1SGowrishankar Muthukrishnan static int
security_handle_cryptodev_sec_caps(const char * cmd __rte_unused,const char * params,struct rte_tel_data * d)314*259ca6d1SGowrishankar Muthukrishnan security_handle_cryptodev_sec_caps(const char *cmd __rte_unused, const char *params,
315*259ca6d1SGowrishankar Muthukrishnan 				   struct rte_tel_data *d)
316*259ca6d1SGowrishankar Muthukrishnan {
317*259ca6d1SGowrishankar Muthukrishnan 	const struct rte_security_capability *capabilities;
318*259ca6d1SGowrishankar Muthukrishnan 	struct rte_tel_data *sec_caps;
319*259ca6d1SGowrishankar Muthukrishnan 	char *end_param;
320*259ca6d1SGowrishankar Muthukrishnan 	int sec_caps_n;
321*259ca6d1SGowrishankar Muthukrishnan 	int dev_id;
322*259ca6d1SGowrishankar Muthukrishnan 	int rc;
323*259ca6d1SGowrishankar Muthukrishnan 
324*259ca6d1SGowrishankar Muthukrishnan 	if (!params || strlen(params) == 0 || !isdigit(*params))
325*259ca6d1SGowrishankar Muthukrishnan 		return -EINVAL;
326*259ca6d1SGowrishankar Muthukrishnan 
327*259ca6d1SGowrishankar Muthukrishnan 	dev_id = strtoul(params, &end_param, 0);
328*259ca6d1SGowrishankar Muthukrishnan 	if (*end_param != '\0')
329*259ca6d1SGowrishankar Muthukrishnan 		CDEV_LOG_ERR("Extra parameters passed to command, ignoring");
330*259ca6d1SGowrishankar Muthukrishnan 
331*259ca6d1SGowrishankar Muthukrishnan 	rc = security_capabilities_from_dev_id(dev_id, (void *)&capabilities);
332*259ca6d1SGowrishankar Muthukrishnan 	if (rc < 0)
333*259ca6d1SGowrishankar Muthukrishnan 		return rc;
334*259ca6d1SGowrishankar Muthukrishnan 
335*259ca6d1SGowrishankar Muthukrishnan 	sec_caps = rte_tel_data_alloc();
336*259ca6d1SGowrishankar Muthukrishnan 	RTE_PTR_OR_ERR_RET(sec_caps, -ENOMEM);
337*259ca6d1SGowrishankar Muthukrishnan 
338*259ca6d1SGowrishankar Muthukrishnan 	rte_tel_data_start_dict(d);
339*259ca6d1SGowrishankar Muthukrishnan 	sec_caps_n = sec_caps_array(sec_caps, capabilities);
340*259ca6d1SGowrishankar Muthukrishnan 	rte_tel_data_add_dict_container(d, "sec_caps", sec_caps, 0);
341*259ca6d1SGowrishankar Muthukrishnan 	rte_tel_data_add_dict_int(d, "sec_caps_n", sec_caps_n);
342*259ca6d1SGowrishankar Muthukrishnan 
343*259ca6d1SGowrishankar Muthukrishnan 	return 0;
344*259ca6d1SGowrishankar Muthukrishnan }
345*259ca6d1SGowrishankar Muthukrishnan 
346*259ca6d1SGowrishankar Muthukrishnan static int
security_handle_cryptodev_crypto_caps(const char * cmd __rte_unused,const char * params,struct rte_tel_data * d)347*259ca6d1SGowrishankar Muthukrishnan security_handle_cryptodev_crypto_caps(const char *cmd __rte_unused, const char *params,
348*259ca6d1SGowrishankar Muthukrishnan 				      struct rte_tel_data *d)
349*259ca6d1SGowrishankar Muthukrishnan {
350*259ca6d1SGowrishankar Muthukrishnan 	const struct rte_security_capability *capabilities;
351*259ca6d1SGowrishankar Muthukrishnan 	struct rte_tel_data *crypto_caps;
352*259ca6d1SGowrishankar Muthukrishnan 	const char *capa_param;
353*259ca6d1SGowrishankar Muthukrishnan 	int dev_id, capa_id;
354*259ca6d1SGowrishankar Muthukrishnan 	int crypto_caps_n;
355*259ca6d1SGowrishankar Muthukrishnan 	char *end_param;
356*259ca6d1SGowrishankar Muthukrishnan 	int rc;
357*259ca6d1SGowrishankar Muthukrishnan 
358*259ca6d1SGowrishankar Muthukrishnan 	if (!params || strlen(params) == 0 || !isdigit(*params))
359*259ca6d1SGowrishankar Muthukrishnan 		return -EINVAL;
360*259ca6d1SGowrishankar Muthukrishnan 
361*259ca6d1SGowrishankar Muthukrishnan 	dev_id = strtoul(params, &end_param, 0);
362*259ca6d1SGowrishankar Muthukrishnan 	capa_param = strtok(end_param, ",");
363*259ca6d1SGowrishankar Muthukrishnan 	if (!capa_param || strlen(capa_param) == 0 || !isdigit(*capa_param))
364*259ca6d1SGowrishankar Muthukrishnan 		return -EINVAL;
365*259ca6d1SGowrishankar Muthukrishnan 
366*259ca6d1SGowrishankar Muthukrishnan 	capa_id = strtoul(capa_param, &end_param, 0);
367*259ca6d1SGowrishankar Muthukrishnan 	if (*end_param != '\0')
368*259ca6d1SGowrishankar Muthukrishnan 		CDEV_LOG_ERR("Extra parameters passed to command, ignoring");
369*259ca6d1SGowrishankar Muthukrishnan 
370*259ca6d1SGowrishankar Muthukrishnan 	rc = security_capabilities_from_dev_id(dev_id, (void *)&capabilities);
371*259ca6d1SGowrishankar Muthukrishnan 	if (rc < 0)
372*259ca6d1SGowrishankar Muthukrishnan 		return rc;
373*259ca6d1SGowrishankar Muthukrishnan 
374*259ca6d1SGowrishankar Muthukrishnan 	capabilities = security_capability_by_index(capabilities, capa_id);
375*259ca6d1SGowrishankar Muthukrishnan 	RTE_PTR_OR_ERR_RET(capabilities, -EINVAL);
376*259ca6d1SGowrishankar Muthukrishnan 
377*259ca6d1SGowrishankar Muthukrishnan 	crypto_caps = rte_tel_data_alloc();
378*259ca6d1SGowrishankar Muthukrishnan 	RTE_PTR_OR_ERR_RET(crypto_caps, -ENOMEM);
379*259ca6d1SGowrishankar Muthukrishnan 
380*259ca6d1SGowrishankar Muthukrishnan 	rte_tel_data_start_dict(d);
381*259ca6d1SGowrishankar Muthukrishnan 	crypto_caps_n = crypto_caps_array(crypto_caps, capabilities->crypto_capabilities);
382*259ca6d1SGowrishankar Muthukrishnan 
383*259ca6d1SGowrishankar Muthukrishnan 	rte_tel_data_add_dict_container(d, "crypto_caps", crypto_caps, 0);
384*259ca6d1SGowrishankar Muthukrishnan 	rte_tel_data_add_dict_int(d, "crypto_caps_n", crypto_caps_n);
385*259ca6d1SGowrishankar Muthukrishnan 
386*259ca6d1SGowrishankar Muthukrishnan 	return 0;
387*259ca6d1SGowrishankar Muthukrishnan }
388*259ca6d1SGowrishankar Muthukrishnan 
RTE_INIT(security_init_telemetry)389*259ca6d1SGowrishankar Muthukrishnan RTE_INIT(security_init_telemetry)
390*259ca6d1SGowrishankar Muthukrishnan {
391*259ca6d1SGowrishankar Muthukrishnan 	rte_telemetry_register_cmd("/security/cryptodev/list",
392*259ca6d1SGowrishankar Muthukrishnan 		security_handle_cryptodev_list,
393*259ca6d1SGowrishankar Muthukrishnan 		"Returns list of available crypto devices by IDs. No parameters.");
394*259ca6d1SGowrishankar Muthukrishnan 
395*259ca6d1SGowrishankar Muthukrishnan 	rte_telemetry_register_cmd("/security/cryptodev/sec_caps",
396*259ca6d1SGowrishankar Muthukrishnan 		security_handle_cryptodev_sec_caps,
397*259ca6d1SGowrishankar Muthukrishnan 		"Returns security capabilities for a cryptodev. Parameters: int dev_id");
398*259ca6d1SGowrishankar Muthukrishnan 
399*259ca6d1SGowrishankar Muthukrishnan 	rte_telemetry_register_cmd("/security/cryptodev/crypto_caps",
400*259ca6d1SGowrishankar Muthukrishnan 		security_handle_cryptodev_crypto_caps,
401*259ca6d1SGowrishankar Muthukrishnan 		"Returns crypto capabilities for a security capability. Parameters: int dev_id, sec_cap_id");
402*259ca6d1SGowrishankar Muthukrishnan }
403