xref: /dpdk/lib/pdcp/pdcp_entity.h (revision aaacd440a40a186e021c53a292998cacec0dcfe8)
1a702bd09SAnoob Joseph /* SPDX-License-Identifier: BSD-3-Clause
2a702bd09SAnoob Joseph  * Copyright(C) 2023 Marvell.
3a702bd09SAnoob Joseph  */
4a702bd09SAnoob Joseph 
5a702bd09SAnoob Joseph #ifndef PDCP_ENTITY_H
6a702bd09SAnoob Joseph #define PDCP_ENTITY_H
7a702bd09SAnoob Joseph 
8a702bd09SAnoob Joseph #include <rte_common.h>
9a702bd09SAnoob Joseph #include <rte_crypto_sym.h>
10a702bd09SAnoob Joseph #include <rte_mempool.h>
11a702bd09SAnoob Joseph #include <rte_pdcp.h>
12a702bd09SAnoob Joseph #include <rte_security.h>
13a702bd09SAnoob Joseph 
14c12cfe62SVolodymyr Fialko #include "pdcp_reorder.h"
15c12cfe62SVolodymyr Fialko 
16a702bd09SAnoob Joseph struct entity_priv;
17a702bd09SAnoob Joseph 
187741560dSAnoob Joseph #define PDCP_HFN_MIN 0
197741560dSAnoob Joseph 
20a702bd09SAnoob Joseph /* IV generation function based on the entity configuration */
21a702bd09SAnoob Joseph typedef void (*iv_gen_t)(struct rte_crypto_op *cop, const struct entity_priv *en_priv,
22a702bd09SAnoob Joseph 			 uint32_t count);
23a702bd09SAnoob Joseph 
24a702bd09SAnoob Joseph struct entity_state {
25a702bd09SAnoob Joseph 	uint32_t rx_next;
26a702bd09SAnoob Joseph 	uint32_t tx_next;
27a702bd09SAnoob Joseph 	uint32_t rx_deliv;
28a702bd09SAnoob Joseph 	uint32_t rx_reord;
29a702bd09SAnoob Joseph };
30a702bd09SAnoob Joseph 
31a378c4ebSAnoob Joseph union auth_iv_partial {
32a378c4ebSAnoob Joseph 	/* For AES-CMAC, there is no IV, but message gets prepended */
33a378c4ebSAnoob Joseph 	struct {
34a378c4ebSAnoob Joseph #if RTE_BYTE_ORDER == RTE_LITTLE_ENDIAN
35a378c4ebSAnoob Joseph 		uint64_t count : 32;
36a378c4ebSAnoob Joseph 		uint64_t zero_38_39 : 2;
37a378c4ebSAnoob Joseph 		uint64_t direction : 1;
38a378c4ebSAnoob Joseph 		uint64_t bearer : 5;
39a378c4ebSAnoob Joseph 		uint64_t zero_40_63 : 24;
40a378c4ebSAnoob Joseph #else
41a378c4ebSAnoob Joseph 		uint64_t count : 32;
42a378c4ebSAnoob Joseph 		uint64_t bearer : 5;
43a378c4ebSAnoob Joseph 		uint64_t direction : 1;
44a378c4ebSAnoob Joseph 		uint64_t zero_38_39 : 2;
45a378c4ebSAnoob Joseph 		uint64_t zero_40_63 : 24;
46a378c4ebSAnoob Joseph #endif
47a378c4ebSAnoob Joseph 	} aes_cmac;
48a378c4ebSAnoob Joseph 	struct {
49a378c4ebSAnoob Joseph #if RTE_BYTE_ORDER == RTE_LITTLE_ENDIAN
50a378c4ebSAnoob Joseph 		uint64_t count : 32;
51a378c4ebSAnoob Joseph 		uint64_t zero_37_39 : 3;
52a378c4ebSAnoob Joseph 		uint64_t bearer : 5;
53a378c4ebSAnoob Joseph 		uint64_t zero_40_63 : 24;
54a378c4ebSAnoob Joseph 
55a378c4ebSAnoob Joseph 		uint64_t rsvd_65_71 : 7;
56a378c4ebSAnoob Joseph 		uint64_t direction_64 : 1;
57a378c4ebSAnoob Joseph 		uint64_t rsvd_72_111 : 40;
58a378c4ebSAnoob Joseph 		uint64_t rsvd_113_119 : 7;
59a378c4ebSAnoob Joseph 		uint64_t direction_112 : 1;
60a378c4ebSAnoob Joseph 		uint64_t rsvd_120_127 : 8;
61a378c4ebSAnoob Joseph #else
62a378c4ebSAnoob Joseph 		uint64_t count : 32;
63a378c4ebSAnoob Joseph 		uint64_t bearer : 5;
64a378c4ebSAnoob Joseph 		uint64_t zero_37_39 : 3;
65a378c4ebSAnoob Joseph 		uint64_t zero_40_63 : 24;
66a378c4ebSAnoob Joseph 
67a378c4ebSAnoob Joseph 		uint64_t direction_64 : 1;
68a378c4ebSAnoob Joseph 		uint64_t rsvd_65_71 : 7;
69a378c4ebSAnoob Joseph 		uint64_t rsvd_72_111 : 40;
70a378c4ebSAnoob Joseph 		uint64_t direction_112 : 1;
71a378c4ebSAnoob Joseph 		uint64_t rsvd_113_119 : 7;
72a378c4ebSAnoob Joseph 		uint64_t rsvd_120_127 : 8;
73a378c4ebSAnoob Joseph #endif
74a378c4ebSAnoob Joseph 	} zs;
75a378c4ebSAnoob Joseph 	uint64_t u64[2];
76a378c4ebSAnoob Joseph };
77a378c4ebSAnoob Joseph 
78a378c4ebSAnoob Joseph union cipher_iv_partial {
79a378c4ebSAnoob Joseph 	struct {
80a378c4ebSAnoob Joseph #if RTE_BYTE_ORDER == RTE_LITTLE_ENDIAN
81a378c4ebSAnoob Joseph 		uint64_t count : 32;
82a378c4ebSAnoob Joseph 		uint64_t zero_38_39 : 2;
83a378c4ebSAnoob Joseph 		uint64_t direction : 1;
84a378c4ebSAnoob Joseph 		uint64_t bearer : 5;
85a378c4ebSAnoob Joseph 		uint64_t zero_40_63 : 24;
86a378c4ebSAnoob Joseph #else
87a378c4ebSAnoob Joseph 		uint64_t count : 32;
88a378c4ebSAnoob Joseph 		uint64_t bearer : 5;
89a378c4ebSAnoob Joseph 		uint64_t direction : 1;
90a378c4ebSAnoob Joseph 		uint64_t zero_38_39 : 2;
91a378c4ebSAnoob Joseph 		uint64_t zero_40_63 : 24;
92a378c4ebSAnoob Joseph #endif
93a378c4ebSAnoob Joseph 		uint64_t zero_64_127;
94a378c4ebSAnoob Joseph 	} aes_ctr;
95a378c4ebSAnoob Joseph 	struct {
96a378c4ebSAnoob Joseph #if RTE_BYTE_ORDER == RTE_LITTLE_ENDIAN
97a378c4ebSAnoob Joseph 		uint64_t count : 32;
98a378c4ebSAnoob Joseph 		uint64_t zero_38_39 : 2;
99a378c4ebSAnoob Joseph 		uint64_t direction : 1;
100a378c4ebSAnoob Joseph 		uint64_t bearer : 5;
101a378c4ebSAnoob Joseph 		uint64_t zero_40_63 : 24;
102a378c4ebSAnoob Joseph #else
103a378c4ebSAnoob Joseph 		uint64_t count : 32;
104a378c4ebSAnoob Joseph 		uint64_t bearer : 5;
105a378c4ebSAnoob Joseph 		uint64_t direction : 1;
106a378c4ebSAnoob Joseph 		uint64_t zero_38_39 : 2;
107a378c4ebSAnoob Joseph 		uint64_t zero_40_63 : 24;
108a378c4ebSAnoob Joseph #endif
109a378c4ebSAnoob Joseph 		uint64_t rsvd_64_127;
110a378c4ebSAnoob Joseph 	} zs;
111a378c4ebSAnoob Joseph 	uint64_t u64[2];
112a378c4ebSAnoob Joseph };
113a378c4ebSAnoob Joseph 
114c12cfe62SVolodymyr Fialko enum timer_state {
115c12cfe62SVolodymyr Fialko 	TIMER_STOP,
116c12cfe62SVolodymyr Fialko 	TIMER_RUNNING,
117c12cfe62SVolodymyr Fialko 	TIMER_EXPIRED,
118c12cfe62SVolodymyr Fialko };
119c12cfe62SVolodymyr Fialko 
120c12cfe62SVolodymyr Fialko struct pdcp_t_reordering {
121c12cfe62SVolodymyr Fialko 	/** Represent timer state */
122c12cfe62SVolodymyr Fialko 	enum timer_state state;
12379576518SVolodymyr Fialko 	/** User defined callback handles */
12479576518SVolodymyr Fialko 	struct rte_pdcp_t_reordering handle;
125c12cfe62SVolodymyr Fialko };
126c12cfe62SVolodymyr Fialko 
1273a3e8931SAnoob Joseph struct pdcp_cnt_bitmap {
1283a3e8931SAnoob Joseph 	/** Number of entries that can be stored. */
1293a3e8931SAnoob Joseph 	uint32_t size;
1303a3e8931SAnoob Joseph 	/** Bitmap of the count values already received.*/
1313a3e8931SAnoob Joseph 	struct rte_bitmap *bmp;
1323a3e8931SAnoob Joseph };
1333a3e8931SAnoob Joseph 
134a702bd09SAnoob Joseph /*
135af42b2d1SVolodymyr Fialko  * Layout of PDCP entity: [rte_pdcp_entity] [entity_priv] [entity_dl/ul] [reorder/bitmap]
136a702bd09SAnoob Joseph  */
137a702bd09SAnoob Joseph 
138a702bd09SAnoob Joseph struct entity_priv {
139a702bd09SAnoob Joseph 	/** Crypto sym session. */
140a702bd09SAnoob Joseph 	struct rte_cryptodev_sym_session *crypto_sess;
141a702bd09SAnoob Joseph 	/** Entity specific IV generation function. */
142a702bd09SAnoob Joseph 	iv_gen_t iv_gen;
143a378c4ebSAnoob Joseph 	/** Pre-prepared auth IV. */
144a378c4ebSAnoob Joseph 	union auth_iv_partial auth_iv_part;
145a378c4ebSAnoob Joseph 	/** Pre-prepared cipher IV. */
146a378c4ebSAnoob Joseph 	union cipher_iv_partial cipher_iv_part;
147a702bd09SAnoob Joseph 	/** Entity state variables. */
148a702bd09SAnoob Joseph 	struct entity_state state;
149a702bd09SAnoob Joseph 	/** Flags. */
150a702bd09SAnoob Joseph 	struct {
151a702bd09SAnoob Joseph 		/** PDCP PDU has 4 byte MAC-I. */
152a702bd09SAnoob Joseph 		uint64_t is_authenticated : 1;
153a702bd09SAnoob Joseph 		/** Cipher offset & length in bits. */
154a702bd09SAnoob Joseph 		uint64_t is_cipher_in_bits : 1;
155a702bd09SAnoob Joseph 		/** Auth offset & length in bits. */
156a702bd09SAnoob Joseph 		uint64_t is_auth_in_bits : 1;
157a702bd09SAnoob Joseph 		/** Is UL/transmitting PDCP entity. */
158a702bd09SAnoob Joseph 		uint64_t is_ul_entity : 1;
159a702bd09SAnoob Joseph 		/** Is NULL auth. */
160a702bd09SAnoob Joseph 		uint64_t is_null_auth : 1;
1613a3e8931SAnoob Joseph 		/** Is status report required.*/
1623a3e8931SAnoob Joseph 		uint64_t is_status_report_required : 1;
163c12cfe62SVolodymyr Fialko 		/** Is out-of-order delivery enabled */
164c12cfe62SVolodymyr Fialko 		uint64_t is_out_of_order_delivery : 1;
165a702bd09SAnoob Joseph 	} flags;
166a702bd09SAnoob Joseph 	/** Crypto op pool. */
167a702bd09SAnoob Joseph 	struct rte_mempool *cop_pool;
1683a3e8931SAnoob Joseph 	/** Control PDU pool. */
1693a3e8931SAnoob Joseph 	struct rte_mempool *ctrl_pdu_pool;
170a702bd09SAnoob Joseph 	/** PDCP header size. */
171a702bd09SAnoob Joseph 	uint8_t hdr_sz;
172a702bd09SAnoob Joseph 	/** PDCP AAD size. For AES-CMAC, additional message is prepended for the operation. */
173a702bd09SAnoob Joseph 	uint8_t aad_sz;
17464b12db3SAakash Sasidharan 	/** PDCP cipher skip size. When enabled, SDAP header needs to be skipped from ciphering */
17564b12db3SAakash Sasidharan 	uint8_t cipher_skip_sz;
176a702bd09SAnoob Joseph 	/** Device ID of the device to be used for offload. */
177a702bd09SAnoob Joseph 	uint8_t dev_id;
178a702bd09SAnoob Joseph };
179a702bd09SAnoob Joseph 
180a702bd09SAnoob Joseph struct entity_priv_dl_part {
1813a3e8931SAnoob Joseph 	/** PDCP would need to track the count values that are already received.*/
1823a3e8931SAnoob Joseph 	struct pdcp_cnt_bitmap bitmap;
183c12cfe62SVolodymyr Fialko 	/** t-Reordering handles */
184c12cfe62SVolodymyr Fialko 	struct pdcp_t_reordering t_reorder;
185c12cfe62SVolodymyr Fialko 	/** Reorder packet buffer */
186c12cfe62SVolodymyr Fialko 	struct pdcp_reorder reorder;
18737d39531SVolodymyr Fialko 	/** Bitmap memory region */
188*aaacd440SStephen Hemminger 	uint8_t bitmap_mem[];
189a702bd09SAnoob Joseph };
190a702bd09SAnoob Joseph 
191a702bd09SAnoob Joseph struct entity_priv_ul_part {
192a702bd09SAnoob Joseph 	/*
193a702bd09SAnoob Joseph 	 * NOTE: when re-establish is supported, plain PDCP packets & COUNT values need to be
194a702bd09SAnoob Joseph 	 * cached.
195a702bd09SAnoob Joseph 	 */
196a702bd09SAnoob Joseph 	uint8_t dummy;
197a702bd09SAnoob Joseph };
198a702bd09SAnoob Joseph 
199a702bd09SAnoob Joseph static inline struct entity_priv *
entity_priv_get(const struct rte_pdcp_entity * entity)200a702bd09SAnoob Joseph entity_priv_get(const struct rte_pdcp_entity *entity) {
201a702bd09SAnoob Joseph 	return RTE_PTR_ADD(entity, sizeof(struct rte_pdcp_entity));
202a702bd09SAnoob Joseph }
203a702bd09SAnoob Joseph 
204a702bd09SAnoob Joseph static inline struct entity_priv_dl_part *
entity_dl_part_get(const struct rte_pdcp_entity * entity)205a702bd09SAnoob Joseph entity_dl_part_get(const struct rte_pdcp_entity *entity) {
206a702bd09SAnoob Joseph 	return RTE_PTR_ADD(entity, sizeof(struct rte_pdcp_entity) + sizeof(struct entity_priv));
207a702bd09SAnoob Joseph }
208a702bd09SAnoob Joseph 
209a702bd09SAnoob Joseph static inline struct entity_priv_ul_part *
entity_ul_part_get(const struct rte_pdcp_entity * entity)210a702bd09SAnoob Joseph entity_ul_part_get(const struct rte_pdcp_entity *entity) {
211a702bd09SAnoob Joseph 	return RTE_PTR_ADD(entity, sizeof(struct rte_pdcp_entity) + sizeof(struct entity_priv));
212a702bd09SAnoob Joseph }
213a702bd09SAnoob Joseph 
214a702bd09SAnoob Joseph static inline int
pdcp_hdr_size_get(enum rte_security_pdcp_sn_size sn_size)215a702bd09SAnoob Joseph pdcp_hdr_size_get(enum rte_security_pdcp_sn_size sn_size)
216a702bd09SAnoob Joseph {
217a702bd09SAnoob Joseph 	return RTE_ALIGN_MUL_CEIL(sn_size, 8) / 8;
218a702bd09SAnoob Joseph }
219a702bd09SAnoob Joseph 
220a702bd09SAnoob Joseph static inline uint32_t
pdcp_window_size_get(enum rte_security_pdcp_sn_size sn_size)221a785af14SAnoob Joseph pdcp_window_size_get(enum rte_security_pdcp_sn_size sn_size)
222a785af14SAnoob Joseph {
223a785af14SAnoob Joseph 	return 1 << (sn_size - 1);
224a785af14SAnoob Joseph }
225a785af14SAnoob Joseph 
226a785af14SAnoob Joseph static inline uint32_t
pdcp_sn_mask_get(enum rte_security_pdcp_sn_size sn_size)227a702bd09SAnoob Joseph pdcp_sn_mask_get(enum rte_security_pdcp_sn_size sn_size)
228a702bd09SAnoob Joseph {
229a702bd09SAnoob Joseph 	return (1 << sn_size) - 1;
230a702bd09SAnoob Joseph }
231a702bd09SAnoob Joseph 
232a702bd09SAnoob Joseph static inline uint32_t
pdcp_sn_from_count_get(uint32_t count,enum rte_security_pdcp_sn_size sn_size)233a785af14SAnoob Joseph pdcp_sn_from_count_get(uint32_t count, enum rte_security_pdcp_sn_size sn_size)
234a785af14SAnoob Joseph {
235a785af14SAnoob Joseph 	return (count & pdcp_sn_mask_get(sn_size));
236a785af14SAnoob Joseph }
237a785af14SAnoob Joseph 
238a785af14SAnoob Joseph static inline uint32_t
pdcp_hfn_mask_get(enum rte_security_pdcp_sn_size sn_size)239a702bd09SAnoob Joseph pdcp_hfn_mask_get(enum rte_security_pdcp_sn_size sn_size)
240a702bd09SAnoob Joseph {
241a702bd09SAnoob Joseph 	return ~pdcp_sn_mask_get(sn_size);
242a702bd09SAnoob Joseph }
243a702bd09SAnoob Joseph 
244a702bd09SAnoob Joseph static inline uint32_t
pdcp_hfn_from_count_get(uint32_t count,enum rte_security_pdcp_sn_size sn_size)245a785af14SAnoob Joseph pdcp_hfn_from_count_get(uint32_t count, enum rte_security_pdcp_sn_size sn_size)
246a785af14SAnoob Joseph {
247a785af14SAnoob Joseph 	return (count & pdcp_hfn_mask_get(sn_size)) >> sn_size;
248a785af14SAnoob Joseph }
249a785af14SAnoob Joseph 
250a785af14SAnoob Joseph static inline uint32_t
pdcp_count_from_hfn_sn_get(uint32_t hfn,uint32_t sn,enum rte_security_pdcp_sn_size sn_size)251a702bd09SAnoob Joseph pdcp_count_from_hfn_sn_get(uint32_t hfn, uint32_t sn, enum rte_security_pdcp_sn_size sn_size)
252a702bd09SAnoob Joseph {
253a702bd09SAnoob Joseph 	return (((hfn << sn_size) & pdcp_hfn_mask_get(sn_size)) | (sn & pdcp_sn_mask_get(sn_size)));
254a702bd09SAnoob Joseph }
255a702bd09SAnoob Joseph 
256a785af14SAnoob Joseph static inline uint32_t
pdcp_hfn_max(enum rte_security_pdcp_sn_size sn_size)257a785af14SAnoob Joseph pdcp_hfn_max(enum rte_security_pdcp_sn_size sn_size)
258a785af14SAnoob Joseph {
259a785af14SAnoob Joseph 	return (1 << (32 - sn_size)) - 1;
260a785af14SAnoob Joseph }
261a785af14SAnoob Joseph 
262a702bd09SAnoob Joseph #endif /* PDCP_ENTITY_H */
263