build: remove redundant _GNU_SOURCE definitions
[dpdk.git] / drivers / net / memif / rte_eth_memif.h
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright 2018-2019 Cisco Systems, Inc.  All rights reserved.
3  */
4
5 #ifndef _RTE_ETH_MEMIF_H_
6 #define _RTE_ETH_MEMIF_H_
7
8 #include <sys/queue.h>
9
10 #include <ethdev_driver.h>
11 #include <rte_ether.h>
12 #include <rte_interrupts.h>
13
14 #include "memif.h"
15
16 #define ETH_MEMIF_DEFAULT_SOCKET_FILENAME       "/run/memif.sock"
17 #define ETH_MEMIF_DEFAULT_RING_SIZE             10
18 #define ETH_MEMIF_DEFAULT_PKT_BUFFER_SIZE       2048
19
20 #define ETH_MEMIF_MAX_NUM_Q_PAIRS               255
21 #define ETH_MEMIF_MAX_LOG2_RING_SIZE            14
22 #define ETH_MEMIF_MAX_REGION_NUM                256
23
24 #define ETH_MEMIF_SHM_NAME_SIZE                 32
25 #define ETH_MEMIF_DISC_STRING_SIZE              96
26 #define ETH_MEMIF_SECRET_SIZE                   24
27
28 extern int memif_logtype;
29
30 #define MIF_LOG(level, fmt, args...) \
31         rte_log(RTE_LOG_ ## level, memif_logtype, \
32                 "%s(): " fmt "\n", __func__, ##args)
33
34 enum memif_role_t {
35         MEMIF_ROLE_SERVER,
36         MEMIF_ROLE_CLIENT,
37 };
38
39 struct memif_region {
40         void *addr;                             /**< shared memory address */
41         memif_region_size_t region_size;        /**< shared memory size */
42         int fd;                                 /**< shared memory file descriptor */
43         uint32_t pkt_buffer_offset;
44         /**< offset from 'addr' to first packet buffer */
45 };
46
47 struct memif_queue {
48         struct rte_mempool *mempool;            /**< mempool for RX packets */
49         struct pmd_internals *pmd;              /**< device internals */
50
51         memif_ring_type_t type;                 /**< ring type */
52         memif_region_index_t region;            /**< shared memory region index */
53
54         uint16_t in_port;                       /**< port id */
55
56         memif_region_offset_t ring_offset;
57         /**< ring offset from start of shm region (ring - memif_region.addr) */
58
59         uint16_t last_head;                     /**< last ring head */
60         uint16_t last_tail;                     /**< last ring tail */
61
62         struct rte_mbuf **buffers;
63         /**< Stored mbufs. Used in zero-copy tx. Client stores transmitted
64          * mbufs to free them once server has received them.
65          */
66
67         /* rx/tx info */
68         uint64_t n_pkts;                        /**< number of rx/tx packets */
69         uint64_t n_bytes;                       /**< number of rx/tx bytes */
70
71         struct rte_intr_handle intr_handle;     /**< interrupt handle */
72
73         memif_log2_ring_size_t log2_ring_size;  /**< log2 of ring size */
74 };
75
76 struct pmd_internals {
77         memif_interface_id_t id;                /**< unique id */
78         enum memif_role_t role;                 /**< device role */
79         uint32_t flags;                         /**< device status flags */
80 #define ETH_MEMIF_FLAG_CONNECTING               (1 << 0)
81 /**< device is connecting */
82 #define ETH_MEMIF_FLAG_CONNECTED                (1 << 1)
83 /**< device is connected */
84 #define ETH_MEMIF_FLAG_ZERO_COPY                (1 << 2)
85 /**< device is zero-copy enabled */
86 #define ETH_MEMIF_FLAG_DISABLED                 (1 << 3)
87 /**< device has not been configured and can not accept connection requests */
88 #define ETH_MEMIF_FLAG_SOCKET_ABSTRACT  (1 << 4)
89 /**< use abstract socket address */
90
91         char *socket_filename;                  /**< pointer to socket filename */
92         char secret[ETH_MEMIF_SECRET_SIZE]; /**< secret (optional security parameter) */
93
94         struct memif_control_channel *cc;       /**< control channel */
95         rte_spinlock_t cc_lock;                 /**< control channel lock */
96
97         /* remote info */
98         char remote_name[RTE_DEV_NAME_MAX_LEN];         /**< remote app name */
99         char remote_if_name[RTE_DEV_NAME_MAX_LEN];      /**< remote peer name */
100
101         struct {
102                 memif_log2_ring_size_t log2_ring_size; /**< log2 of ring size */
103                 uint8_t num_c2s_rings;          /**< number of client to server rings */
104                 uint8_t num_s2c_rings;          /**< number of server to client rings */
105                 uint16_t pkt_buffer_size;       /**< buffer size */
106         } cfg;                                  /**< Configured parameters (max values) */
107
108         struct {
109                 memif_log2_ring_size_t log2_ring_size; /**< log2 of ring size */
110                 uint8_t num_c2s_rings;          /**< number of client to server rings */
111                 uint8_t num_s2c_rings;          /**< number of server to client rings */
112                 uint16_t pkt_buffer_size;       /**< buffer size */
113         } run;
114         /**< Parameters used in active connection */
115
116         char local_disc_string[ETH_MEMIF_DISC_STRING_SIZE];
117         /**< local disconnect reason */
118         char remote_disc_string[ETH_MEMIF_DISC_STRING_SIZE];
119         /**< remote disconnect reason */
120 };
121
122 struct pmd_process_private {
123         struct memif_region *regions[ETH_MEMIF_MAX_REGION_NUM];
124         /**< shared memory regions */
125         memif_region_index_t regions_num;       /**< number of regions */
126 };
127
128 /**
129  * Unmap shared memory and free regions from memory.
130  *
131  * @param proc_private
132  *   device process private data
133  */
134 void memif_free_regions(struct rte_eth_dev *dev);
135
136 /**
137  * Finalize connection establishment process. Map shared memory file
138  * (server role), initialize ring queue, set link status up.
139  *
140  * @param dev
141  *   memif device
142  * @return
143  *   - On success, zero.
144  *   - On failure, a negative value.
145  */
146 int memif_connect(struct rte_eth_dev *dev);
147
148 /**
149  * Create shared memory file and initialize ring queue.
150  * Only called by client when establishing connection
151  *
152  * @param dev
153  *   memif device
154  * @return
155  *   - On success, zero.
156  *   - On failure, a negative value.
157  */
158 int memif_init_regions_and_queues(struct rte_eth_dev *dev);
159
160 /**
161  * Get memif version string.
162  *
163  * @return
164  *   - memif version string
165  */
166 const char *memif_version(void);
167
168 #ifndef MFD_HUGETLB
169 #ifndef __NR_memfd_create
170
171 #if defined __x86_64__
172 #define __NR_memfd_create 319
173 #elif defined __x86_32__
174 #define __NR_memfd_create 1073742143
175 #elif defined __arm__
176 #define __NR_memfd_create 385
177 #elif defined __aarch64__
178 #define __NR_memfd_create 279
179 #elif defined __powerpc__
180 #define __NR_memfd_create 360
181 #elif defined __i386__
182 #define __NR_memfd_create 356
183 #else
184 #error "__NR_memfd_create unknown for this architecture"
185 #endif
186
187 #endif                          /* __NR_memfd_create */
188
189 static inline int memfd_create(const char *name, unsigned int flags)
190 {
191         return syscall(__NR_memfd_create, name, flags);
192 }
193 #endif                          /* MFD_HUGETLB */
194
195 #ifndef F_LINUX_SPECIFIC_BASE
196 #define F_LINUX_SPECIFIC_BASE 1024
197 #endif
198
199 #ifndef MFD_ALLOW_SEALING
200 #define MFD_ALLOW_SEALING       0x0002U
201 #endif
202
203 #ifndef F_ADD_SEALS
204 #define F_ADD_SEALS (F_LINUX_SPECIFIC_BASE + 9)
205 #define F_GET_SEALS (F_LINUX_SPECIFIC_BASE + 10)
206
207 #define F_SEAL_SEAL     0x0001  /* prevent further seals from being set */
208 #define F_SEAL_SHRINK   0x0002  /* prevent file from shrinking */
209 #define F_SEAL_GROW     0x0004  /* prevent file from growing */
210 #define F_SEAL_WRITE    0x0008  /* prevent writes */
211 #endif
212
213 #endif                          /* RTE_ETH_MEMIF_H */