129 lines
3.4 KiB
C
129 lines
3.4 KiB
C
#ifndef __VIRTIO_H__
|
|
#define __VIRTIO_H__
|
|
|
|
#include "pci.h"
|
|
#define VIRTIO_CSUM 0
|
|
#define VIRTIO_GUEST_CSUM 1
|
|
#define VIRTIO_CTRL_GUEST_OFFLOADS 2
|
|
#define VIRTIO_MAC 5
|
|
#define VIRTIO_GUEST_TSO4 7
|
|
#define VIRTIO_GUEST_TSO6 8
|
|
#define VIRTIO_GUEST_ECN 9
|
|
#define VIRTIO_GUEST_UFO 10
|
|
#define VIRTIO_HOST_TSO4 11
|
|
#define VIRTIO_HOST_TSO6 12
|
|
#define VIRTIO_HOST_ECN 13
|
|
#define VIRTIO_HOST_UFO 14
|
|
#define VIRTIO_MRG_RXBUF 15
|
|
#define VIRTIO_STATUS 16
|
|
#define VIRTIO_CTRL_VQ 17
|
|
#define VIRTIO_CTRL_RX 18
|
|
#define VIRTIO_CTRL_VLAN 19
|
|
#define VIRTIO_CTRL_RX_EXTRA 20
|
|
#define VIRTIO_GUEST_ANNOUNCE 21
|
|
#define VIRTIO_MQ 22
|
|
#define VIRTIO_CTRL_MAC_ADDR 23
|
|
#define VIRTIO_RING_F_INDIRECT_DESC 28
|
|
#define VIRTIO_EVENT_IDX 29
|
|
|
|
#define VIRTIO_ACKNOWLEDGE 1
|
|
#define VIRTIO_DRIVER 2
|
|
#define VIRTIO_FAILED 128
|
|
#define VIRTIO_FEATURES_OK 8
|
|
#define VIRTIO_DRIVER_OK 4
|
|
#define VIRTIO_DEVICE_NEEDS_RESET 64
|
|
|
|
#define VIRTIO_DESC_FLAG_NEXT 1
|
|
#define VIRTIO_DESC_FLAG_WRITE_ONLY 2
|
|
#define VIRTIO_DESC_FLAG_INDIRECT 4
|
|
|
|
#define VIRTIO_NET_HDR_F_NEEDS_CSUM 1
|
|
#define VIRTIO_NET_HDR_GSO_NONE 0
|
|
#define VIRTIO_NET_HDR_GSO_TCPV4 1
|
|
#define VIRTIO_NET_HDR_GSO_UDP 3
|
|
#define VIRTIO_NET_HDR_GSO_TCPV6 4
|
|
#define VIRTIO_NET_HDR_GSO_ECN 0x80
|
|
|
|
#define DISABLE_FEATURE(v, feature) v &= ~(1 << feature)
|
|
#define ENABLE_FEATURE(v, feature) v |= (1 << feature)
|
|
#define HAS_FEATURE(v, feature) (v & (1 << feature))
|
|
|
|
struct virtio_net_header {
|
|
unsigned char flags;
|
|
unsigned char gso_type;
|
|
unsigned short header_length;
|
|
unsigned short gso_size;
|
|
unsigned short checksum_start;
|
|
unsigned short checksum_offset;
|
|
unsigned short num_buffers;
|
|
} __attribute__((packed));
|
|
|
|
struct virtio_queue_buffer {
|
|
unsigned long long address;
|
|
unsigned long length;
|
|
unsigned short flags;
|
|
unsigned short next;
|
|
} __attribute__((packed));
|
|
|
|
struct virtio_available {
|
|
unsigned short flags;
|
|
unsigned short index;
|
|
unsigned short rings[];
|
|
} __attribute__((packed));
|
|
|
|
struct virtio_used_item {
|
|
unsigned long index;
|
|
unsigned long length;
|
|
} __attribute__((packed));
|
|
|
|
struct virtio_used {
|
|
unsigned short flags;
|
|
unsigned short index;
|
|
struct virtio_used_item rings[];
|
|
} __attribute__((packed));
|
|
|
|
struct virtio_queue {
|
|
unsigned long num;
|
|
union {
|
|
struct virtio_queue_buffer *qbuffers;
|
|
unsigned long qbuffers_base;
|
|
};
|
|
struct virtio_available *available;
|
|
struct virtio_used *used;
|
|
unsigned short last_used_index;
|
|
unsigned short last_available_index;
|
|
unsigned char *buffer;
|
|
unsigned long chunk_size;
|
|
unsigned short next_buffer;
|
|
unsigned short queue_size;
|
|
unsigned long lock;
|
|
};
|
|
|
|
struct virtio_device_info {
|
|
struct pci_device *pci_dev;
|
|
void *data;
|
|
unsigned short iobase;
|
|
unsigned long memoryAddress;
|
|
unsigned short irq;
|
|
struct virtio_queue queues[16];
|
|
unsigned long vbuffer[16];
|
|
unsigned long vbuffer_len[16];
|
|
};
|
|
|
|
struct virtio_buffer_info {
|
|
unsigned char *ibuffer;
|
|
unsigned long long size;
|
|
unsigned char flags;
|
|
};
|
|
|
|
extern unsigned char virtio_queue_setup(struct virtio_device_info *dev, unsigned char index);
|
|
extern void virtio_enable_interrupts(struct virtio_queue *vq);
|
|
extern void virtio_disable_interrupts(struct virtio_queue *vq);
|
|
|
|
extern struct ether_t *init_virtnet(int count);
|
|
extern void virtnet_enable(struct ether_t *ether);
|
|
extern void virtnet_disable(struct ether_t *ether);
|
|
extern int virtnet_send(struct virtio_device_info *dev, char *packet, int len);
|
|
extern void virtio_send_buffer(struct virtio_device_info *dev, unsigned short queue_index, struct virtio_buffer_info *b, unsigned long count);
|
|
|
|
#endif |