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