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
pdcp_reorder_memory_footprint_get(size_t nb_elem)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
pdcp_reorder_get_sequential(struct pdcp_reorder * reorder,struct rte_mbuf ** mbufs,uint32_t max_mbufs)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
pdcp_reorder_up_to_get(struct pdcp_reorder * reorder,struct rte_mbuf ** mbufs,uint32_t max_mbufs,uint32_t seqn)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
pdcp_reorder_start(struct pdcp_reorder * reorder,uint32_t min_seqn)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
pdcp_reorder_stop(struct pdcp_reorder * reorder)51 pdcp_reorder_stop(struct pdcp_reorder *reorder)
52 {
53 reorder->is_active = false;
54 }
55
56 static inline void
pdcp_reorder_insert(struct pdcp_reorder * reorder,struct rte_mbuf * mbuf,rte_reorder_seqn_t pkt_count)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