/
githubmirror
/
ipxe
Обзор
Документация
Войти
/
githubmirror
/
ipxe
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
src/drivers/net/virtio-net.h
137 строк
3 KB
Michael Brown
[virtio] Allow for long delays in processing transmit queue submissions
02 июл 2026, 15:09
02 июл 2026, 15:09
a392b4f
Код
Авторство
О чём код?
#ifndef _VIRTIO_NET_H #define _VIRTIO_NET_H /** @file * * Virtual I/O network device * */ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); FILE_SECBOOT ( PERMITTED ); #include <ipxe/virtio.h> /** Device has a reported MTU */ #define VIRTIO_FEAT0_NET_MTU 0x00000008 /** Device has a MAC address */ #define VIRTIO_FEAT0_NET_MAC 0x00000020 /** MAC address register offset */ #define VIRTIO_NET_MAC 0x00 /** MTU register offset */ #define VIRTIO_NET_MTU 0x0a /** A virtio network packet header */ union virtio_net_header { /** Legacy interface */ uint8_t legacy[10]; /** Modern (version 1.0) interface */ uint8_t modern[12]; } __attribute__ (( packed )); /** Receive queue index */ #define VIRTIO_NET_RX_INDEX 0 /** Receive queue requested queue size */ #define VIRTIO_NET_RX_COUNT 128 /** Receive queue maximum fill level */ #define VIRTIO_NET_RX_MAX 16 /** Transmit queue index */ #define VIRTIO_NET_TX_INDEX 1 /** Transmit queue requested queue size */ #define VIRTIO_NET_TX_COUNT 128 /** Transmit queue maximum fill level */ #define VIRTIO_NET_TX_MAX 128 /** Number of descriptors per packet */ #define VIRTIO_NET_DESCS 2 /** A virtio network queue */ struct virtio_net_queue { /** Underlying virtio queue */ struct virtio_queue queue; /** I/O buffer list */ struct io_buffer **iobufs; /** Descriptor slot ring */ uint8_t *slots; /** Effective fill level */ unsigned int fill; /** Descriptor index ring mask */ unsigned int mask; /** Shared packet header */ union virtio_net_header hdr; /** DMA mapping for packet header */ struct dma_mapping map; /** DMA direction for packet header */ uint8_t dma; /** Buffer writability flag for packet header */ uint8_t write; /** Requested queue size */ uint8_t count; /** Maximum fill level */ uint8_t max; }; /** * Initialise virtio network queue * * @v queue Virtio network queue * @v index Queue index * @v iobufs I/O buffer list * @v slots Descriptor slot ring * @v dma DMA direction for packet header * @v write Writability flag for packet header * @v count Requested queue size * @v max Maximum fill level */ static inline __attribute__ (( always_inline )) void virtio_net_queue_init ( struct virtio_net_queue *queue, struct io_buffer **iobufs, uint8_t *slots, unsigned int index, unsigned int count, unsigned int max, unsigned int dma, unsigned int write ) { queue->queue.index = index; queue->iobufs = iobufs; queue->slots = slots; queue->dma = dma; queue->write = write; queue->count = count; queue->max = max; } /** A virtio network device */ struct virtio_net { /** Underlying virtio device */ struct virtio_device virtio; /** Receive queue */ struct virtio_net_queue rx; /** Transmit queue */ struct virtio_net_queue tx; /** Virtio network header length */ size_t hlen; /** Maximum frame size */ size_t mfs; /** Receive descriptor slot ring */ uint8_t rx_slots[VIRTIO_NET_RX_MAX]; /** Receive I/O buffers */ struct io_buffer *rx_iobufs[VIRTIO_NET_RX_MAX]; /** Transmit descriptor slot ring */ uint8_t tx_slots[VIRTIO_NET_TX_MAX]; /** Transmit I/O buffers */ struct io_buffer *tx_iobufs[VIRTIO_NET_TX_MAX]; }; #endif /* _VIRTIO_NET_H */