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