xref: /dpdk/lib/pdcp/pdcp_reorder.h (revision 7917b0d38e92e8b9ec5a870415b791420e10f11a)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(C) 2023 Marvell.
3  */
4 
5 #ifndef PDCP_REORDER_H
6 #define PDCP_REORDER_H
7 
8 #include <rte_reorder.h>
9 
10 struct pdcp_reorder {
11 	struct rte_reorder_buffer *buf;
12 	bool is_active;
13 };
14 
15 int pdcp_reorder_create(struct pdcp_reorder *reorder, size_t nb_elem, void *mem, size_t mem_size);
16 
17 /* NOTE: replace with `rte_reorder_memory_footprint_get` after DPDK 23.07 */
18 #define SIZE_OF_REORDER_BUFFER (4 * RTE_CACHE_LINE_SIZE)
19 static inline size_t
20 pdcp_reorder_memory_footprint_get(size_t nb_elem)
21 {
22 	return SIZE_OF_REORDER_BUFFER + (2 * nb_elem * sizeof(struct rte_mbuf *));
23 }
24 
25 static inline uint32_t
26 pdcp_reorder_get_sequential(struct pdcp_reorder *reorder, struct rte_mbuf **mbufs,
27 		uint32_t max_mbufs)
28 {
29 	return rte_reorder_drain(reorder->buf, mbufs, max_mbufs);
30 }
31 
32 static inline uint32_t
33 pdcp_reorder_up_to_get(struct pdcp_reorder *reorder, struct rte_mbuf **mbufs,
34 		       uint32_t max_mbufs, uint32_t seqn)
35 {
36 	return rte_reorder_drain_up_to_seqn(reorder->buf, mbufs, max_mbufs, seqn);
37 }
38 
39 static inline void
40 pdcp_reorder_start(struct pdcp_reorder *reorder, uint32_t min_seqn)
41 {
42 	int ret;
43 
44 	reorder->is_active = true;
45 
46 	ret = rte_reorder_min_seqn_set(reorder->buf, min_seqn);
47 	RTE_VERIFY(ret == 0);
48 }
49 
50 static inline void
51 pdcp_reorder_stop(struct pdcp_reorder *reorder)
52 {
53 	reorder->is_active = false;
54 }
55 
56 static inline void
57 pdcp_reorder_insert(struct pdcp_reorder *reorder, struct rte_mbuf *mbuf,
58 		    rte_reorder_seqn_t pkt_count)
59 {
60 	int ret;
61 
62 	*rte_reorder_seqn(mbuf) = pkt_count;
63 
64 	ret = rte_reorder_insert(reorder->buf, mbuf);
65 	RTE_VERIFY(ret == 0);
66 }
67 
68 #endif /* PDCP_REORDER_H */
69