virtio_net.h 4.4 KB

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