ip_frag: add IPv4 options fragment
[dpdk.git] / lib / eal / include / rte_epoll.h
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(C) 2021 Marvell International Ltd.
3  */
4
5 #ifndef __RTE_EPOLL_H__
6 #define __RTE_EPOLL_H__
7
8 /**
9  * @file
10  * The rte_epoll provides interfaces functions to add delete events,
11  * wait poll for an event.
12  */
13
14 #include <stdint.h>
15
16 #include <rte_compat.h>
17
18 #ifdef __cplusplus
19 extern "C" {
20 #endif
21
22 #define RTE_INTR_EVENT_ADD            1UL
23 #define RTE_INTR_EVENT_DEL            2UL
24
25 typedef void (*rte_intr_event_cb_t)(int fd, void *arg);
26
27 struct rte_epoll_data {
28         uint32_t event;               /**< event type */
29         void *data;                   /**< User data */
30         rte_intr_event_cb_t cb_fun;   /**< IN: callback fun */
31         void *cb_arg;                 /**< IN: callback arg */
32 };
33
34 enum {
35         RTE_EPOLL_INVALID = 0,
36         RTE_EPOLL_VALID,
37         RTE_EPOLL_EXEC,
38 };
39
40 /** interrupt epoll event obj, taken by epoll_event.ptr */
41 struct rte_epoll_event {
42         uint32_t status;           /**< OUT: event status */
43         int fd;                    /**< OUT: event fd */
44         int epfd;       /**< OUT: epoll instance the ev associated with */
45         struct rte_epoll_data epdata;
46 };
47
48 #define RTE_EPOLL_PER_THREAD        -1  /**< to hint using per thread epfd */
49
50 /**
51  * It waits for events on the epoll instance.
52  * Retries if signal received.
53  *
54  * @param epfd
55  *   Epoll instance fd on which the caller wait for events.
56  * @param events
57  *   Memory area contains the events that will be available for the caller.
58  * @param maxevents
59  *   Up to maxevents are returned, must greater than zero.
60  * @param timeout
61  *   Specifying a timeout of -1 causes a block indefinitely.
62  *   Specifying a timeout equal to zero cause to return immediately.
63  * @return
64  *   - On success, returns the number of available event.
65  *   - On failure, a negative value.
66  */
67 int
68 rte_epoll_wait(int epfd, struct rte_epoll_event *events,
69                int maxevents, int timeout);
70
71 /**
72  * It waits for events on the epoll instance.
73  * Does not retry if signal received.
74  *
75  * @param epfd
76  *   Epoll instance fd on which the caller wait for events.
77  * @param events
78  *   Memory area contains the events that will be available for the caller.
79  * @param maxevents
80  *   Up to maxevents are returned, must greater than zero.
81  * @param timeout
82  *   Specifying a timeout of -1 causes a block indefinitely.
83  *   Specifying a timeout equal to zero cause to return immediately.
84  * @return
85  *   - On success, returns the number of available event.
86  *   - On failure, a negative value.
87  */
88 __rte_experimental
89 int
90 rte_epoll_wait_interruptible(int epfd, struct rte_epoll_event *events,
91                int maxevents, int timeout);
92
93 /**
94  * It performs control operations on epoll instance referred by the epfd.
95  * It requests that the operation op be performed for the target fd.
96  *
97  * @param epfd
98  *   Epoll instance fd on which the caller perform control operations.
99  * @param op
100  *   The operation be performed for the target fd.
101  * @param fd
102  *   The target fd on which the control ops perform.
103  * @param event
104  *   Describes the object linked to the fd.
105  *   Note: The caller must take care the object deletion after CTL_DEL.
106  * @return
107  *   - On success, zero.
108  *   - On failure, a negative value.
109  */
110 int
111 rte_epoll_ctl(int epfd, int op, int fd,
112               struct rte_epoll_event *event);
113
114 #ifdef __cplusplus
115 }
116 #endif
117
118 #endif /* __RTE_EPOLL_H__ */