xref: /dpdk/lib/pdcp/rte_pdcp_group.h (revision b4f0a9bb5807a4f0a4904595bb85a9a386696311)
1*482f6b23SAnoob Joseph /* SPDX-License-Identifier: BSD-3-Clause
2*482f6b23SAnoob Joseph  * Copyright(C) 2023 Marvell.
3*482f6b23SAnoob Joseph  */
4*482f6b23SAnoob Joseph 
5*482f6b23SAnoob Joseph #ifndef RTE_PDCP_GROUP_H
6*482f6b23SAnoob Joseph #define RTE_PDCP_GROUP_H
7*482f6b23SAnoob Joseph 
8*482f6b23SAnoob Joseph /**
9*482f6b23SAnoob Joseph  * @file rte_pdcp_group.h
10*482f6b23SAnoob Joseph  *
11*482f6b23SAnoob Joseph  * RTE PDCP grouping support.
12*482f6b23SAnoob Joseph  * It is not recommended to include this file directly, include <rte_pdcp.h>
13*482f6b23SAnoob Joseph  * instead.
14*482f6b23SAnoob Joseph  * Provides helper functions to process completed crypto-ops and group related
15*482f6b23SAnoob Joseph  * packets by sessions they belong to.
16*482f6b23SAnoob Joseph  */
17*482f6b23SAnoob Joseph 
18*482f6b23SAnoob Joseph #include <rte_common.h>
19*482f6b23SAnoob Joseph #include <rte_crypto.h>
20*482f6b23SAnoob Joseph #include <rte_cryptodev.h>
21*482f6b23SAnoob Joseph 
22*482f6b23SAnoob Joseph #ifdef __cplusplus
23*482f6b23SAnoob Joseph extern "C" {
24*482f6b23SAnoob Joseph #endif
25*482f6b23SAnoob Joseph 
26*482f6b23SAnoob Joseph /**
27*482f6b23SAnoob Joseph  * Group packets belonging to same PDCP entity.
28*482f6b23SAnoob Joseph  */
29*482f6b23SAnoob Joseph struct rte_pdcp_group {
30*482f6b23SAnoob Joseph 	union {
31*482f6b23SAnoob Joseph 		uint64_t val;
32*482f6b23SAnoob Joseph 		void *ptr;
33*482f6b23SAnoob Joseph 	} id; /**< Grouped by value */
34*482f6b23SAnoob Joseph 	struct rte_mbuf **m;  /**< Start of the group */
35*482f6b23SAnoob Joseph 	uint32_t cnt;         /**< Number of entries in the group */
36*482f6b23SAnoob Joseph 	int32_t rc;           /**< Status code associated with the group */
37*482f6b23SAnoob Joseph };
38*482f6b23SAnoob Joseph 
39*482f6b23SAnoob Joseph /**
40*482f6b23SAnoob Joseph  * @warning
41*482f6b23SAnoob Joseph  * @b EXPERIMENTAL: this API may change without prior notice.
42*482f6b23SAnoob Joseph  *
43*482f6b23SAnoob Joseph  * Take crypto-op as an input and extract pointer to related PDCP entity.
44*482f6b23SAnoob Joseph  * @param cop
45*482f6b23SAnoob Joseph  *   The address of an input *rte_crypto_op* structure.
46*482f6b23SAnoob Joseph  * @return
47*482f6b23SAnoob Joseph  *   The pointer to the related *rte_pdcp_entity* structure.
48*482f6b23SAnoob Joseph  */
49*482f6b23SAnoob Joseph static inline struct rte_pdcp_entity *
rte_pdcp_en_from_cop(const struct rte_crypto_op * cop)50*482f6b23SAnoob Joseph rte_pdcp_en_from_cop(const struct rte_crypto_op *cop)
51*482f6b23SAnoob Joseph {
52*482f6b23SAnoob Joseph 	void *sess = cop->sym[0].session;
53*482f6b23SAnoob Joseph 
54*482f6b23SAnoob Joseph 	return (struct rte_pdcp_entity *)(uintptr_t)
55*482f6b23SAnoob Joseph 		rte_cryptodev_sym_session_opaque_data_get(sess);
56*482f6b23SAnoob Joseph }
57*482f6b23SAnoob Joseph 
58*482f6b23SAnoob Joseph /**
59*482f6b23SAnoob Joseph  * @warning
60*482f6b23SAnoob Joseph  * @b EXPERIMENTAL: this API may change without prior notice.
61*482f6b23SAnoob Joseph  *
62*482f6b23SAnoob Joseph  * Take as input completed crypto ops, extract related mbufs and group them by
63*482f6b23SAnoob Joseph  * *rte_pdcp_entity* they belong to. Mbuf for which the crypto operation has
64*482f6b23SAnoob Joseph  * failed would be flagged using *RTE_MBUF_F_RX_SEC_OFFLOAD_FAILED* flag
65*482f6b23SAnoob Joseph  * in rte_mbuf.ol_flags. The crypto_ops would be freed after the grouping.
66*482f6b23SAnoob Joseph  *
67*482f6b23SAnoob Joseph  * Note that application must ensure only crypto-ops prepared by lib_pdcp is
68*482f6b23SAnoob Joseph  * provided back to @see rte_pdcp_pkt_crypto_group().
69*482f6b23SAnoob Joseph  *
70*482f6b23SAnoob Joseph  * @param cop
71*482f6b23SAnoob Joseph  *   The address of an array of *num* pointers to the input *rte_crypto_op*
72*482f6b23SAnoob Joseph  *   structures.
73*482f6b23SAnoob Joseph  * @param[out] mb
74*482f6b23SAnoob Joseph  *   The address of an array of *num* pointers to output *rte_mbuf* structures.
75*482f6b23SAnoob Joseph  * @param[out] grp
76*482f6b23SAnoob Joseph  *   The address of an array of *num* to output *rte_pdcp_group* structures.
77*482f6b23SAnoob Joseph  * @param num
78*482f6b23SAnoob Joseph  *   The maximum number of crypto-ops to process.
79*482f6b23SAnoob Joseph  * @return
80*482f6b23SAnoob Joseph  *   Number of filled elements in *grp* array.
81*482f6b23SAnoob Joseph  */
82*482f6b23SAnoob Joseph static inline uint16_t
rte_pdcp_pkt_crypto_group(struct rte_crypto_op * cop[],struct rte_mbuf * mb[],struct rte_pdcp_group grp[],uint16_t num)83*482f6b23SAnoob Joseph rte_pdcp_pkt_crypto_group(struct rte_crypto_op *cop[], struct rte_mbuf *mb[],
84*482f6b23SAnoob Joseph 			  struct rte_pdcp_group grp[], uint16_t num)
85*482f6b23SAnoob Joseph {
86*482f6b23SAnoob Joseph 	uint32_t i, j = 0, n = 0;
87*482f6b23SAnoob Joseph 	void *ns, *ps = NULL;
88*482f6b23SAnoob Joseph 	struct rte_mbuf *m;
89*482f6b23SAnoob Joseph 
90*482f6b23SAnoob Joseph 	for (i = 0; i != num; i++) {
91*482f6b23SAnoob Joseph 		m = cop[i]->sym[0].m_src;
92*482f6b23SAnoob Joseph 		ns = cop[i]->sym[0].session;
93*482f6b23SAnoob Joseph 
94*482f6b23SAnoob Joseph 		m->ol_flags |= RTE_MBUF_F_RX_SEC_OFFLOAD;
95*482f6b23SAnoob Joseph 		if (cop[i]->status != RTE_CRYPTO_OP_STATUS_SUCCESS)
96*482f6b23SAnoob Joseph 			m->ol_flags |= RTE_MBUF_F_RX_SEC_OFFLOAD_FAILED;
97*482f6b23SAnoob Joseph 
98*482f6b23SAnoob Joseph 		/* Different entity */
99*482f6b23SAnoob Joseph 		if (ps != ns) {
100*482f6b23SAnoob Joseph 
101*482f6b23SAnoob Joseph 			/* Finalize open group and start a new one */
102*482f6b23SAnoob Joseph 			if (ps != NULL) {
103*482f6b23SAnoob Joseph 				grp[n].cnt = mb + j - grp[n].m;
104*482f6b23SAnoob Joseph 				n++;
105*482f6b23SAnoob Joseph 			}
106*482f6b23SAnoob Joseph 
107*482f6b23SAnoob Joseph 			/* Start new group */
108*482f6b23SAnoob Joseph 			grp[n].m = mb + j;
109*482f6b23SAnoob Joseph 			ps = ns;
110*482f6b23SAnoob Joseph 			grp[n].id.ptr =	rte_pdcp_en_from_cop(cop[i]);
111*482f6b23SAnoob Joseph 		}
112*482f6b23SAnoob Joseph 
113*482f6b23SAnoob Joseph 		mb[j++] = m;
114*482f6b23SAnoob Joseph 		rte_crypto_op_free(cop[i]);
115*482f6b23SAnoob Joseph 	}
116*482f6b23SAnoob Joseph 
117*482f6b23SAnoob Joseph 	/* Finalize last group */
118*482f6b23SAnoob Joseph 	if (ps != NULL) {
119*482f6b23SAnoob Joseph 		grp[n].cnt = mb + j - grp[n].m;
120*482f6b23SAnoob Joseph 		n++;
121*482f6b23SAnoob Joseph 	}
122*482f6b23SAnoob Joseph 
123*482f6b23SAnoob Joseph 	return n;
124*482f6b23SAnoob Joseph }
125*482f6b23SAnoob Joseph 
126*482f6b23SAnoob Joseph #ifdef __cplusplus
127*482f6b23SAnoob Joseph }
128*482f6b23SAnoob Joseph #endif
129*482f6b23SAnoob Joseph 
130*482f6b23SAnoob Joseph #endif /* RTE_PDCP_GROUP_H */
131