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