1 /* 2 * Copyright (c) 2006-2023, RT-Thread Development Team 3 * 4 * SPDX-License-Identifier: Apache-2.0 5 * 6 * Change Logs: 7 * Date Author Notes 8 * 2021-11-11 GuEe-GUI the first version 9 */ 10 11 #ifndef __VIRTIO_NET_H__ 12 #define __VIRTIO_NET_H__ 13 14 #ifdef RT_USING_VIRTIO_NET 15 16 #include <rtdef.h> 17 #include <netif/ethernetif.h> 18 19 #include <virtio.h> 20 21 #define VIRTIO_NET_QUEUE_RX 0 22 #define VIRTIO_NET_QUEUE_TX 1 23 #define VIRTIO_NET_RTX_QUEUE_SIZE 16 24 #define VIRTIO_NET_RTX_BUF_SIZE 2048 25 26 #define VIRTIO_NET_F_CSUM 0 /* Host handles pkts w/ partial csum */ 27 #define VIRTIO_NET_F_GUEST_CSUM 1 /* Guest handles pkts w/ partial csum */ 28 #define VIRTIO_NET_F_CTRL_GUEST_OFFLOADS 2 /* Dynamic offload configuration */ 29 #define VIRTIO_NET_F_MTU 3 /* Initial MTU advice */ 30 #define VIRTIO_NET_F_MAC 5 /* Host has given MAC address */ 31 #define VIRTIO_NET_F_GUEST_TSO4 7 /* Guest can handle TSOv4 in */ 32 #define VIRTIO_NET_F_GUEST_TSO6 8 /* Guest can handle TSOv6 in */ 33 #define VIRTIO_NET_F_GUEST_ECN 9 /* Guest can handle TSO[6] w/ ECN in */ 34 #define VIRTIO_NET_F_GUEST_UFO 10 /* Guest can handle UFO in */ 35 #define VIRTIO_NET_F_HOST_TSO4 11 /* Host can handle TSOv4 in */ 36 #define VIRTIO_NET_F_HOST_TSO6 12 /* Host can handle TSOv6 in */ 37 #define VIRTIO_NET_F_HOST_ECN 13 /* Host can handle TSO[6] w/ ECN in */ 38 #define VIRTIO_NET_F_HOST_UFO 14 /* Host can handle UFO in */ 39 #define VIRTIO_NET_F_MRG_RXBUF 15 /* Host can merge receive buffers. */ 40 #define VIRTIO_NET_F_STATUS 16 /* virtio_net_config.status available */ 41 #define VIRTIO_NET_F_CTRL_VQ 17 /* Control channel available */ 42 #define VIRTIO_NET_F_CTRL_RX 18 /* Control channel RX mode support */ 43 #define VIRTIO_NET_F_CTRL_VLAN 19 /* Control channel VLAN filtering */ 44 #define VIRTIO_NET_F_CTRL_RX_EXTRA 20 /* Extra RX mode control support */ 45 #define VIRTIO_NET_F_GUEST_ANNOUNCE 21 /* Guest can announce device on the network */ 46 #define VIRTIO_NET_F_MQ 22 /* Device supports Receive Flow Steering */ 47 #define VIRTIO_NET_F_CTRL_MAC_ADDR 23 /* Set MAC address */ 48 49 #define VIRTIO_NET_F_HASH_REPORT 57 /* Supports hash report */ 50 #define VIRTIO_NET_F_RSS 60 /* Supports RSS RX steering */ 51 #define VIRTIO_NET_F_RSC_EXT 61 /* Extended coalescing info */ 52 #define VIRTIO_NET_F_STANDBY 62 /* Act as standby for another device with the same MAC */ 53 #define VIRTIO_NET_F_SPEED_DUPLEX 63 /* Device set linkspeed and duplex */ 54 55 #define VIRTIO_NET_S_LINK_UP (1 << 0) 56 #define VIRTIO_NET_S_ANNOUNCE (1 << 1) 57 58 #define VIRTIO_NET_HDR_F_NEEDS_CSUM 1 59 #define VIRTIO_NET_HDR_F_DATA_VALID 2 60 #define VIRTIO_NET_HDR_F_RSC_INFO 4 61 62 #define VIRTIO_NET_HDR_GSO_NONE 0 63 #define VIRTIO_NET_HDR_GSO_TCPV4 1 64 #define VIRTIO_NET_HDR_GSO_UDP 3 65 #define VIRTIO_NET_HDR_GSO_TCPV6 4 66 #define VIRTIO_NET_HDR_GSO_ECN 0x80 67 68 struct virtio_net_hdr 69 { 70 rt_uint8_t flags; 71 rt_uint8_t gso_type; 72 rt_uint16_t hdr_len; 73 rt_uint16_t gso_size; 74 rt_uint16_t csum_start; 75 rt_uint16_t csum_offset; 76 rt_uint16_t num_buffers; 77 } __attribute__ ((packed)); 78 79 #define VIRTIO_NET_MSS 1514 80 #define VIRTIO_NET_HDR_SIZE (sizeof(struct virtio_net_hdr)) 81 #define VIRTIO_NET_PAYLOAD_MAX_SIZE (VIRTIO_NET_HDR_SIZE + VIRTIO_NET_MSS) 82 83 struct virtio_net_config 84 { 85 rt_uint8_t mac[6]; 86 rt_uint16_t status; 87 rt_uint16_t max_virtqueue_pairs; 88 rt_uint16_t mtu; 89 rt_uint32_t speed; 90 rt_uint8_t duplex; 91 rt_uint8_t rss_max_key_size; 92 rt_uint16_t rss_max_indirection_table_length; 93 rt_uint32_t supported_hash_types; 94 } __attribute__((packed)); 95 96 struct virtio_net_device 97 { 98 struct eth_device parent; 99 100 struct virtio_device virtio_dev; 101 102 struct virtio_net_config *config; 103 104 struct 105 { 106 /* Transmit hdr */ 107 struct virtio_net_hdr hdr; 108 /* Transmit buffer */ 109 rt_uint8_t tx_buffer[VIRTIO_NET_PAYLOAD_MAX_SIZE]; 110 /* Receive buffer */ 111 rt_uint8_t rx_buffer[VIRTIO_NET_PAYLOAD_MAX_SIZE]; 112 } info[VIRTIO_NET_RTX_QUEUE_SIZE]; 113 }; 114 115 rt_err_t rt_virtio_net_init(rt_ubase_t *mmio_base, rt_uint32_t irq); 116 117 #endif /* RT_USING_VIRTIO_NET */ 118 119 #endif /* __VIRTIO_NET_H__ */ 120