xref: /dpdk/examples/vhost/main.h (revision 3998e2a07220844d3f3c17f76a781ced3efe0de0)
1*3998e2a0SBruce Richardson /* SPDX-License-Identifier: BSD-3-Clause
2*3998e2a0SBruce Richardson  * Copyright(c) 2010-2017 Intel Corporation
3d19533e8SHuawei Xie  */
4d19533e8SHuawei Xie 
5d19533e8SHuawei Xie #ifndef _MAIN_H_
6d19533e8SHuawei Xie #define _MAIN_H_
7d19533e8SHuawei Xie 
845657a5cSYuanhan Liu #include <sys/queue.h>
945657a5cSYuanhan Liu 
10aca49772SYuanhan Liu #include <rte_ether.h>
11aca49772SYuanhan Liu 
12d19533e8SHuawei Xie /* Macros for printing using RTE_LOG */
13d19533e8SHuawei Xie #define RTE_LOGTYPE_VHOST_CONFIG RTE_LOGTYPE_USER1
14d19533e8SHuawei Xie #define RTE_LOGTYPE_VHOST_DATA   RTE_LOGTYPE_USER2
15d19533e8SHuawei Xie #define RTE_LOGTYPE_VHOST_PORT   RTE_LOGTYPE_USER3
16d19533e8SHuawei Xie 
17f53cf839SYuanhan Liu enum {VIRTIO_RXQ, VIRTIO_TXQ, VIRTIO_QNUM};
18f53cf839SYuanhan Liu 
19ca059fa5SYuanhan Liu #define MAX_PKT_BURST 32		/* Max burst size for RX/TX */
20ca059fa5SYuanhan Liu 
2156fe86f8SYuanhan Liu struct device_statistics {
2256fe86f8SYuanhan Liu 	uint64_t	tx;
2356fe86f8SYuanhan Liu 	uint64_t	tx_total;
2456fe86f8SYuanhan Liu 	rte_atomic64_t	rx_atomic;
2556fe86f8SYuanhan Liu 	rte_atomic64_t	rx_total_atomic;
2656fe86f8SYuanhan Liu };
2756fe86f8SYuanhan Liu 
28ca059fa5SYuanhan Liu struct vhost_queue {
29ca059fa5SYuanhan Liu 	struct rte_vhost_vring	vr;
30ca059fa5SYuanhan Liu 	uint16_t		last_avail_idx;
31ca059fa5SYuanhan Liu 	uint16_t		last_used_idx;
32ca059fa5SYuanhan Liu };
33ca059fa5SYuanhan Liu 
34e571e6b4SHuawei Xie struct vhost_dev {
35e571e6b4SHuawei Xie 	/**< Number of memory regions for gpa to hpa translation. */
36e571e6b4SHuawei Xie 	uint32_t nregions_hpa;
37e571e6b4SHuawei Xie 	/**< Device MAC address (Obtained on first TX packet). */
38e571e6b4SHuawei Xie 	struct ether_addr mac_address;
39e571e6b4SHuawei Xie 	/**< RX VMDQ queue number. */
40e571e6b4SHuawei Xie 	uint16_t vmdq_rx_q;
41e571e6b4SHuawei Xie 	/**< Vlan tag assigned to the pool */
42e571e6b4SHuawei Xie 	uint32_t vlan_tag;
43e571e6b4SHuawei Xie 	/**< Data core that the device is added to. */
44e571e6b4SHuawei Xie 	uint16_t coreid;
45e571e6b4SHuawei Xie 	/**< A device is set as ready if the MAC address has been set. */
46e571e6b4SHuawei Xie 	volatile uint8_t ready;
47e571e6b4SHuawei Xie 	/**< Device is marked for removal from the data core. */
48e571e6b4SHuawei Xie 	volatile uint8_t remove;
4945657a5cSYuanhan Liu 
50e2a1dd12SYuanhan Liu 	int vid;
51ca059fa5SYuanhan Liu 	uint64_t features;
52ca059fa5SYuanhan Liu 	size_t hdr_len;
53ca059fa5SYuanhan Liu 	uint16_t nr_vrings;
54ca059fa5SYuanhan Liu 	struct rte_vhost_memory *mem;
5556fe86f8SYuanhan Liu 	struct device_statistics stats;
5697daf19eSYuanhan Liu 	TAILQ_ENTRY(vhost_dev) global_vdev_entry;
5797daf19eSYuanhan Liu 	TAILQ_ENTRY(vhost_dev) lcore_vdev_entry;
58ca059fa5SYuanhan Liu 
59ca059fa5SYuanhan Liu #define MAX_QUEUE_PAIRS	4
60ca059fa5SYuanhan Liu 	struct vhost_queue queues[MAX_QUEUE_PAIRS * 2];
61e571e6b4SHuawei Xie } __rte_cache_aligned;
62e571e6b4SHuawei Xie 
6345657a5cSYuanhan Liu TAILQ_HEAD(vhost_dev_tailq_list, vhost_dev);
6445657a5cSYuanhan Liu 
6545657a5cSYuanhan Liu 
6645657a5cSYuanhan Liu #define REQUEST_DEV_REMOVAL	1
6745657a5cSYuanhan Liu #define ACK_DEV_REMOVAL		0
68d19533e8SHuawei Xie 
69d19533e8SHuawei Xie /*
70d19533e8SHuawei Xie  * Structure containing data core specific information.
71d19533e8SHuawei Xie  */
7245657a5cSYuanhan Liu struct lcore_info {
7345657a5cSYuanhan Liu 	uint32_t		device_num;
74d19533e8SHuawei Xie 
7545657a5cSYuanhan Liu 	/* Flag to synchronize device removal. */
7645657a5cSYuanhan Liu 	volatile uint8_t	dev_removal_flag;
7745657a5cSYuanhan Liu 
7845657a5cSYuanhan Liu 	struct vhost_dev_tailq_list vdev_list;
79d19533e8SHuawei Xie };
80d19533e8SHuawei Xie 
81ca059fa5SYuanhan Liu /* we implement non-extra virtio net features */
82ca059fa5SYuanhan Liu #define VIRTIO_NET_FEATURES	0
83ca059fa5SYuanhan Liu 
84ca059fa5SYuanhan Liu void vs_vhost_net_setup(struct vhost_dev *dev);
85ca059fa5SYuanhan Liu void vs_vhost_net_remove(struct vhost_dev *dev);
86ca059fa5SYuanhan Liu uint16_t vs_enqueue_pkts(struct vhost_dev *dev, uint16_t queue_id,
87ca059fa5SYuanhan Liu 			 struct rte_mbuf **pkts, uint32_t count);
88ca059fa5SYuanhan Liu 
89ca059fa5SYuanhan Liu uint16_t vs_dequeue_pkts(struct vhost_dev *dev, uint16_t queue_id,
90ca059fa5SYuanhan Liu 			 struct rte_mempool *mbuf_pool,
91ca059fa5SYuanhan Liu 			 struct rte_mbuf **pkts, uint16_t count);
92d19533e8SHuawei Xie #endif /* _MAIN_H_ */
93