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