1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright(c) 2010-2018 Intel Corporation 3 */ 4 5 #ifndef _VHOST_NET_USER_H 6 #define _VHOST_NET_USER_H 7 8 #include <stdint.h> 9 #include <linux/vhost.h> 10 11 #include "rte_vhost.h" 12 13 /* refer to hw/virtio/vhost-user.c */ 14 15 #define VHOST_MEMORY_MAX_NREGIONS 8 16 17 #define VHOST_USER_PROTOCOL_FEATURES ((1ULL << VHOST_USER_PROTOCOL_F_MQ) | \ 18 (1ULL << VHOST_USER_PROTOCOL_F_LOG_SHMFD) |\ 19 (1ULL << VHOST_USER_PROTOCOL_F_RARP) | \ 20 (1ULL << VHOST_USER_PROTOCOL_F_REPLY_ACK) | \ 21 (1ULL << VHOST_USER_PROTOCOL_F_NET_MTU) | \ 22 (1ULL << VHOST_USER_PROTOCOL_F_SLAVE_REQ) | \ 23 (1ULL << VHOST_USER_PROTOCOL_F_CRYPTO_SESSION) | \ 24 (1ULL << VHOST_USER_PROTOCOL_F_SLAVE_SEND_FD) | \ 25 (1ULL << VHOST_USER_PROTOCOL_F_HOST_NOTIFIER) | \ 26 (1ULL << VHOST_USER_PROTOCOL_F_PAGEFAULT) | \ 27 (1ULL << VHOST_USER_PROTOCOL_F_STATUS)) 28 29 typedef enum VhostUserRequest { 30 VHOST_USER_NONE = 0, 31 VHOST_USER_GET_FEATURES = 1, 32 VHOST_USER_SET_FEATURES = 2, 33 VHOST_USER_SET_OWNER = 3, 34 VHOST_USER_RESET_OWNER = 4, 35 VHOST_USER_SET_MEM_TABLE = 5, 36 VHOST_USER_SET_LOG_BASE = 6, 37 VHOST_USER_SET_LOG_FD = 7, 38 VHOST_USER_SET_VRING_NUM = 8, 39 VHOST_USER_SET_VRING_ADDR = 9, 40 VHOST_USER_SET_VRING_BASE = 10, 41 VHOST_USER_GET_VRING_BASE = 11, 42 VHOST_USER_SET_VRING_KICK = 12, 43 VHOST_USER_SET_VRING_CALL = 13, 44 VHOST_USER_SET_VRING_ERR = 14, 45 VHOST_USER_GET_PROTOCOL_FEATURES = 15, 46 VHOST_USER_SET_PROTOCOL_FEATURES = 16, 47 VHOST_USER_GET_QUEUE_NUM = 17, 48 VHOST_USER_SET_VRING_ENABLE = 18, 49 VHOST_USER_SEND_RARP = 19, 50 VHOST_USER_NET_SET_MTU = 20, 51 VHOST_USER_SET_SLAVE_REQ_FD = 21, 52 VHOST_USER_IOTLB_MSG = 22, 53 VHOST_USER_CRYPTO_CREATE_SESS = 26, 54 VHOST_USER_CRYPTO_CLOSE_SESS = 27, 55 VHOST_USER_POSTCOPY_ADVISE = 28, 56 VHOST_USER_POSTCOPY_LISTEN = 29, 57 VHOST_USER_POSTCOPY_END = 30, 58 VHOST_USER_GET_INFLIGHT_FD = 31, 59 VHOST_USER_SET_INFLIGHT_FD = 32, 60 VHOST_USER_SET_STATUS = 39, 61 VHOST_USER_GET_STATUS = 40, 62 } VhostUserRequest; 63 64 typedef enum VhostUserSlaveRequest { 65 VHOST_USER_SLAVE_NONE = 0, 66 VHOST_USER_SLAVE_IOTLB_MSG = 1, 67 VHOST_USER_SLAVE_CONFIG_CHANGE_MSG = 2, 68 VHOST_USER_SLAVE_VRING_HOST_NOTIFIER_MSG = 3, 69 } VhostUserSlaveRequest; 70 71 typedef struct VhostUserMemoryRegion { 72 uint64_t guest_phys_addr; 73 uint64_t memory_size; 74 uint64_t userspace_addr; 75 uint64_t mmap_offset; 76 } VhostUserMemoryRegion; 77 78 typedef struct VhostUserMemory { 79 uint32_t nregions; 80 uint32_t padding; 81 VhostUserMemoryRegion regions[VHOST_MEMORY_MAX_NREGIONS]; 82 } VhostUserMemory; 83 84 typedef struct VhostUserLog { 85 uint64_t mmap_size; 86 uint64_t mmap_offset; 87 } VhostUserLog; 88 89 /* Comply with Cryptodev-Linux */ 90 #define VHOST_USER_CRYPTO_MAX_HMAC_KEY_LENGTH 512 91 #define VHOST_USER_CRYPTO_MAX_CIPHER_KEY_LENGTH 64 92 93 /* Same structure as vhost-user backend session info */ 94 typedef struct VhostUserCryptoSessionParam { 95 int64_t session_id; 96 uint32_t op_code; 97 uint32_t cipher_algo; 98 uint32_t cipher_key_len; 99 uint32_t hash_algo; 100 uint32_t digest_len; 101 uint32_t auth_key_len; 102 uint32_t aad_len; 103 uint8_t op_type; 104 uint8_t dir; 105 uint8_t hash_mode; 106 uint8_t chaining_dir; 107 uint8_t *ciphe_key; 108 uint8_t *auth_key; 109 uint8_t cipher_key_buf[VHOST_USER_CRYPTO_MAX_CIPHER_KEY_LENGTH]; 110 uint8_t auth_key_buf[VHOST_USER_CRYPTO_MAX_HMAC_KEY_LENGTH]; 111 } VhostUserCryptoSessionParam; 112 113 typedef struct VhostUserVringArea { 114 uint64_t u64; 115 uint64_t size; 116 uint64_t offset; 117 } VhostUserVringArea; 118 119 typedef struct VhostUserInflight { 120 uint64_t mmap_size; 121 uint64_t mmap_offset; 122 uint16_t num_queues; 123 uint16_t queue_size; 124 } VhostUserInflight; 125 126 typedef struct VhostUserMsg { 127 union { 128 uint32_t master; /* a VhostUserRequest value */ 129 uint32_t slave; /* a VhostUserSlaveRequest value*/ 130 } request; 131 132 #define VHOST_USER_VERSION_MASK 0x3 133 #define VHOST_USER_REPLY_MASK (0x1 << 2) 134 #define VHOST_USER_NEED_REPLY (0x1 << 3) 135 uint32_t flags; 136 uint32_t size; /* the following payload size */ 137 union { 138 #define VHOST_USER_VRING_IDX_MASK 0xff 139 #define VHOST_USER_VRING_NOFD_MASK (0x1<<8) 140 uint64_t u64; 141 struct vhost_vring_state state; 142 struct vhost_vring_addr addr; 143 VhostUserMemory memory; 144 VhostUserLog log; 145 struct vhost_iotlb_msg iotlb; 146 VhostUserCryptoSessionParam crypto_session; 147 VhostUserVringArea area; 148 VhostUserInflight inflight; 149 } payload; 150 /* Nothing should be added after the payload */ 151 } __rte_packed VhostUserMsg; 152 153 /* Note: this structure and VhostUserMsg can't be changed carelessly as 154 * external message handlers rely on them. 155 */ 156 struct __rte_packed vhu_msg_context { 157 VhostUserMsg msg; 158 int fds[VHOST_MEMORY_MAX_NREGIONS]; 159 int fd_num; 160 }; 161 162 #define VHOST_USER_HDR_SIZE offsetof(VhostUserMsg, payload.u64) 163 164 /* The version of the protocol we support */ 165 #define VHOST_USER_VERSION 0x1 166 167 168 /* vhost_user.c */ 169 int vhost_user_msg_handler(int vid, int fd); 170 int vhost_user_iotlb_miss(struct virtio_net *dev, uint64_t iova, uint8_t perm); 171 172 /* socket.c */ 173 int read_fd_message(char *ifname, int sockfd, char *buf, int buflen, int *fds, int max_fds, 174 int *fd_num); 175 int send_fd_message(char *ifname, int sockfd, char *buf, int buflen, int *fds, int fd_num); 176 177 #endif 178