xref: /dpdk/drivers/net/memif/rte_eth_memif.h (revision 089e5ed727a15da2729cfee9b63533dd120bd04c)
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 #ifndef _GNU_SOURCE
9 #define _GNU_SOURCE
10 #endif				/* GNU_SOURCE */
11 
12 #include <sys/queue.h>
13 
14 #include <rte_ethdev_driver.h>
15 #include <rte_ether.h>
16 #include <rte_interrupts.h>
17 
18 #include "memif.h"
19 
20 #define ETH_MEMIF_DEFAULT_SOCKET_FILENAME	"/run/memif.sock"
21 #define ETH_MEMIF_DEFAULT_RING_SIZE		10
22 #define ETH_MEMIF_DEFAULT_PKT_BUFFER_SIZE	2048
23 
24 #define ETH_MEMIF_MAX_NUM_Q_PAIRS		255
25 #define ETH_MEMIF_MAX_LOG2_RING_SIZE		14
26 #define ETH_MEMIF_MAX_REGION_NUM		256
27 
28 #define ETH_MEMIF_SHM_NAME_SIZE			32
29 #define ETH_MEMIF_DISC_STRING_SIZE		96
30 #define ETH_MEMIF_SECRET_SIZE			24
31 
32 extern int memif_logtype;
33 
34 #define MIF_LOG(level, fmt, args...) \
35 	rte_log(RTE_LOG_ ## level, memif_logtype, \
36 		"%s(): " fmt "\n", __func__, ##args)
37 
38 enum memif_role_t {
39 	MEMIF_ROLE_MASTER,
40 	MEMIF_ROLE_SLAVE,
41 };
42 
43 struct memif_region {
44 	void *addr;				/**< shared memory address */
45 	memif_region_size_t region_size;	/**< shared memory size */
46 	int fd;					/**< shared memory file descriptor */
47 	uint32_t pkt_buffer_offset;
48 	/**< offset from 'addr' to first packet buffer */
49 };
50 
51 struct memif_queue {
52 	struct rte_mempool *mempool;		/**< mempool for RX packets */
53 	struct pmd_internals *pmd;		/**< device internals */
54 
55 	memif_ring_type_t type;			/**< ring type */
56 	memif_region_index_t region;		/**< shared memory region index */
57 
58 	uint16_t in_port;			/**< port id */
59 
60 	memif_region_offset_t ring_offset;
61 	/**< ring offset from start of shm region (ring - memif_region.addr) */
62 
63 	uint16_t last_head;			/**< last ring head */
64 	uint16_t last_tail;			/**< last ring tail */
65 
66 	/* rx/tx info */
67 	uint64_t n_pkts;			/**< number of rx/tx packets */
68 	uint64_t n_bytes;			/**< number of rx/tx bytes */
69 
70 	memif_ring_t *ring;			/**< pointer to ring */
71 
72 	struct rte_intr_handle intr_handle;	/**< interrupt handle */
73 
74 	memif_log2_ring_size_t log2_ring_size;	/**< log2 of ring size */
75 };
76 
77 struct pmd_internals {
78 	memif_interface_id_t id;		/**< unique id */
79 	enum memif_role_t role;			/**< device role */
80 	uint32_t flags;				/**< device status flags */
81 #define ETH_MEMIF_FLAG_CONNECTING	(1 << 0)
82 /**< device is connecting */
83 #define ETH_MEMIF_FLAG_CONNECTED	(1 << 1)
84 /**< device is connected */
85 #define ETH_MEMIF_FLAG_ZERO_COPY	(1 << 2)
86 /**< device is zero-copy enabled */
87 #define ETH_MEMIF_FLAG_DISABLED		(1 << 3)
88 /**< device has not been configured and can not accept connection requests */
89 
90 	char *socket_filename;			/**< pointer to socket filename */
91 	char secret[ETH_MEMIF_SECRET_SIZE]; /**< secret (optional security parameter) */
92 
93 	struct memif_control_channel *cc;	/**< control channel */
94 
95 	/* remote info */
96 	char remote_name[RTE_DEV_NAME_MAX_LEN];		/**< remote app name */
97 	char remote_if_name[RTE_DEV_NAME_MAX_LEN];	/**< remote peer name */
98 
99 	struct {
100 		memif_log2_ring_size_t log2_ring_size; /**< log2 of ring size */
101 		uint8_t num_s2m_rings;		/**< number of slave to master rings */
102 		uint8_t num_m2s_rings;		/**< number of master to slave rings */
103 		uint16_t pkt_buffer_size;	/**< buffer size */
104 	} cfg;					/**< Configured parameters (max values) */
105 
106 	struct {
107 		memif_log2_ring_size_t log2_ring_size; /**< log2 of ring size */
108 		uint8_t num_s2m_rings;		/**< number of slave to master rings */
109 		uint8_t num_m2s_rings;		/**< number of master to slave rings */
110 		uint16_t pkt_buffer_size;	/**< buffer size */
111 	} run;
112 	/**< Parameters used in active connection */
113 
114 	char local_disc_string[ETH_MEMIF_DISC_STRING_SIZE];
115 	/**< local disconnect reason */
116 	char remote_disc_string[ETH_MEMIF_DISC_STRING_SIZE];
117 	/**< remote disconnect reason */
118 
119 	struct rte_vdev_device *vdev;		/**< vdev handle */
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 pmd_process_private *proc_private);
135 
136 /**
137  * Finalize connection establishment process. Map shared memory file
138  * (master 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 slave 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 */
214