xref: /f-stack/dpdk/examples/vhost/main.h (revision 2d9fd380)
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