New upstream version 18.02
[deb_dpdk.git] / lib / librte_reorder / rte_reorder.h
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2010-2014 Intel Corporation
3  */
4
5 #ifndef _RTE_REORDER_H_
6 #define _RTE_REORDER_H_
7
8 /**
9  * @file
10  * RTE reorder
11  *
12  * Reorder library is a component which is designed to
13  * provide ordering of out of ordered packets based on
14  * sequence number present in mbuf.
15  *
16  */
17
18 #include <rte_mbuf.h>
19
20 #ifdef __cplusplus
21 extern "C" {
22 #endif
23
24 struct rte_reorder_buffer;
25
26 /**
27  * Create a new reorder buffer instance
28  *
29  * Allocate memory and initialize a new reorder buffer in that
30  * memory, returning the reorder buffer pointer to the user
31  *
32  * @param name
33  *   The name to be given to the reorder buffer instance.
34  * @param socket_id
35  *   The NUMA node on which the memory for the reorder buffer
36  *   instance is to be reserved.
37  * @param size
38  *   Max number of elements that can be stored in the reorder buffer
39  * @return
40  *   The initialized reorder buffer instance, or NULL on error
41  *   On error case, rte_errno will be set appropriately:
42  *    - ENOMEM - no appropriate memory area found in which to create memzone
43  *    - EINVAL - invalid parameters
44  */
45 struct rte_reorder_buffer *
46 rte_reorder_create(const char *name, unsigned socket_id, unsigned int size);
47
48 /**
49  * Initializes given reorder buffer instance
50  *
51  * @param b
52  *   Reorder buffer instance to initialize
53  * @param bufsize
54  *   Size of the reorder buffer
55  * @param name
56  *   The name to be given to the reorder buffer
57  * @param size
58  *   Number of elements that can be stored in reorder buffer
59  * @return
60  *   The initialized reorder buffer instance, or NULL on error
61  *   On error case, rte_errno will be set appropriately:
62  *    - EINVAL - invalid parameters
63  */
64 struct rte_reorder_buffer *
65 rte_reorder_init(struct rte_reorder_buffer *b, unsigned int bufsize,
66                 const char *name, unsigned int size);
67
68 /**
69  * Find an existing reorder buffer instance
70  * and return a pointer to it.
71  *
72  * @param name
73  *   Name of the reorder buffer instacne as passed to rte_reorder_create()
74  * @return
75  *   Pointer to reorder buffer instance or NULL if object not found with rte_errno
76  *   set appropriately. Possible rte_errno values include:
77  *    - ENOENT - required entry not available to return.
78  *    reorder instance list
79  */
80 struct rte_reorder_buffer *
81 rte_reorder_find_existing(const char *name);
82
83 /**
84  * Reset the given reorder buffer instance with initial values.
85  *
86  * @param b
87  *   Reorder buffer instance which has to be reset
88  */
89 void
90 rte_reorder_reset(struct rte_reorder_buffer *b);
91
92 /**
93  * Free reorder buffer instance.
94  *
95  * @param b
96  *   reorder buffer instance
97  * @return
98  *   None
99  */
100 void
101 rte_reorder_free(struct rte_reorder_buffer *b);
102
103 /**
104  * Insert given mbuf in reorder buffer in its correct position
105  *
106  * The given mbuf is to be reordered relative to other mbufs in the system.
107  * The mbuf must contain a sequence number which is then used to place
108  * the buffer in the correct position in the reorder buffer. Reordered
109  * packets can later be taken from the buffer using the rte_reorder_drain()
110  * API.
111  *
112  * @param b
113  *   Reorder buffer where the mbuf has to be inserted.
114  * @param mbuf
115  *   mbuf of packet that needs to be inserted in reorder buffer.
116  * @return
117  *   0 on success
118  *   -1 on error
119  *   On error case, rte_errno will be set appropriately:
120  *    - ENOSPC - Cannot move existing mbufs from reorder buffer to accommodate
121  *      early mbuf, but it can be accommodated by performing drain and then insert.
122  *    - ERANGE - Too early or late mbuf which is vastly out of range of expected
123  *      window should be ignored without any handling.
124  */
125 int
126 rte_reorder_insert(struct rte_reorder_buffer *b, struct rte_mbuf *mbuf);
127
128 /**
129  * Fetch reordered buffers
130  *
131  * Returns a set of in-order buffers from the reorder buffer structure. Gaps
132  * may be present in the sequence numbers of the mbuf if packets have been
133  * delayed too long before reaching the reorder window, or have been previously
134  * dropped by the system.
135  *
136  * @param b
137  *   Reorder buffer instance from which packets are to be drained
138  * @param mbufs
139  *   array of mbufs where reordered packets will be inserted from reorder buffer
140  * @param max_mbufs
141  *   the number of elements in the mbufs array.
142  * @return
143  *   number of mbuf pointers written to mbufs. 0 <= N < max_mbufs.
144  */
145 unsigned int
146 rte_reorder_drain(struct rte_reorder_buffer *b, struct rte_mbuf **mbufs,
147                 unsigned max_mbufs);
148
149 #ifdef __cplusplus
150 }
151 #endif
152
153 #endif /* _RTE_REORDER_H_ */