1d30ea906Sjfb8856606 /* SPDX-License-Identifier: BSD-3-Clause 2d30ea906Sjfb8856606 * Copyright(c) 2010-2017 Intel Corporation 3a9643ea8Slogwang */ 4a9643ea8Slogwang 5a9643ea8Slogwang #ifndef _MAIN_H_ 6a9643ea8Slogwang #define _MAIN_H_ 7a9643ea8Slogwang 8a9643ea8Slogwang #include <sys/queue.h> 9a9643ea8Slogwang 102bfe3f2eSlogwang #include <rte_ether.h> 112bfe3f2eSlogwang 12a9643ea8Slogwang /* Macros for printing using RTE_LOG */ 13a9643ea8Slogwang #define RTE_LOGTYPE_VHOST_CONFIG RTE_LOGTYPE_USER1 14a9643ea8Slogwang #define RTE_LOGTYPE_VHOST_DATA RTE_LOGTYPE_USER2 15a9643ea8Slogwang #define RTE_LOGTYPE_VHOST_PORT RTE_LOGTYPE_USER3 16a9643ea8Slogwang 172bfe3f2eSlogwang enum {VIRTIO_RXQ, VIRTIO_TXQ, VIRTIO_QNUM}; 182bfe3f2eSlogwang 192bfe3f2eSlogwang #define MAX_PKT_BURST 32 /* Max burst size for RX/TX */ 202bfe3f2eSlogwang 21a9643ea8Slogwang struct device_statistics { 22a9643ea8Slogwang uint64_t tx; 23a9643ea8Slogwang uint64_t tx_total; 24a9643ea8Slogwang rte_atomic64_t rx_atomic; 25a9643ea8Slogwang rte_atomic64_t rx_total_atomic; 26a9643ea8Slogwang }; 27a9643ea8Slogwang 282bfe3f2eSlogwang struct vhost_queue { 292bfe3f2eSlogwang struct rte_vhost_vring vr; 302bfe3f2eSlogwang uint16_t last_avail_idx; 312bfe3f2eSlogwang uint16_t last_used_idx; 322bfe3f2eSlogwang }; 332bfe3f2eSlogwang 34a9643ea8Slogwang struct vhost_dev { 35a9643ea8Slogwang /**< Number of memory regions for gpa to hpa translation. */ 36a9643ea8Slogwang uint32_t nregions_hpa; 37a9643ea8Slogwang /**< Device MAC address (Obtained on first TX packet). */ 384418919fSjohnjiang struct rte_ether_addr mac_address; 39a9643ea8Slogwang /**< RX VMDQ queue number. */ 40a9643ea8Slogwang uint16_t vmdq_rx_q; 41a9643ea8Slogwang /**< Vlan tag assigned to the pool */ 42a9643ea8Slogwang uint32_t vlan_tag; 43a9643ea8Slogwang /**< Data core that the device is added to. */ 44a9643ea8Slogwang uint16_t coreid; 45a9643ea8Slogwang /**< A device is set as ready if the MAC address has been set. */ 46a9643ea8Slogwang volatile uint8_t ready; 47a9643ea8Slogwang /**< Device is marked for removal from the data core. */ 48a9643ea8Slogwang volatile uint8_t remove; 49a9643ea8Slogwang 50a9643ea8Slogwang int vid; 512bfe3f2eSlogwang uint64_t features; 522bfe3f2eSlogwang size_t hdr_len; 532bfe3f2eSlogwang uint16_t nr_vrings; 54*2d9fd380Sjfb8856606 uint16_t nr_async_pkts; 552bfe3f2eSlogwang struct rte_vhost_memory *mem; 56a9643ea8Slogwang struct device_statistics stats; 57a9643ea8Slogwang TAILQ_ENTRY(vhost_dev) global_vdev_entry; 58a9643ea8Slogwang TAILQ_ENTRY(vhost_dev) lcore_vdev_entry; 592bfe3f2eSlogwang 602bfe3f2eSlogwang #define MAX_QUEUE_PAIRS 4 612bfe3f2eSlogwang struct vhost_queue queues[MAX_QUEUE_PAIRS * 2]; 62a9643ea8Slogwang } __rte_cache_aligned; 63a9643ea8Slogwang 64a9643ea8Slogwang TAILQ_HEAD(vhost_dev_tailq_list, vhost_dev); 65a9643ea8Slogwang 66a9643ea8Slogwang 67a9643ea8Slogwang #define REQUEST_DEV_REMOVAL 1 68a9643ea8Slogwang #define ACK_DEV_REMOVAL 0 69a9643ea8Slogwang 70a9643ea8Slogwang /* 71a9643ea8Slogwang * Structure containing data core specific information. 72a9643ea8Slogwang */ 73a9643ea8Slogwang struct lcore_info { 74a9643ea8Slogwang uint32_t device_num; 75a9643ea8Slogwang 76a9643ea8Slogwang /* Flag to synchronize device removal. */ 77a9643ea8Slogwang volatile uint8_t dev_removal_flag; 78a9643ea8Slogwang 79a9643ea8Slogwang struct vhost_dev_tailq_list vdev_list; 80a9643ea8Slogwang }; 81a9643ea8Slogwang 822bfe3f2eSlogwang /* we implement non-extra virtio net features */ 832bfe3f2eSlogwang #define VIRTIO_NET_FEATURES 0 842bfe3f2eSlogwang 852bfe3f2eSlogwang void vs_vhost_net_setup(struct vhost_dev *dev); 862bfe3f2eSlogwang void vs_vhost_net_remove(struct vhost_dev *dev); 872bfe3f2eSlogwang uint16_t vs_enqueue_pkts(struct vhost_dev *dev, uint16_t queue_id, 882bfe3f2eSlogwang struct rte_mbuf **pkts, uint32_t count); 892bfe3f2eSlogwang 902bfe3f2eSlogwang uint16_t vs_dequeue_pkts(struct vhost_dev *dev, uint16_t queue_id, 912bfe3f2eSlogwang struct rte_mempool *mbuf_pool, 922bfe3f2eSlogwang struct rte_mbuf **pkts, uint16_t count); 93a9643ea8Slogwang #endif /* _MAIN_H_ */ 94