tools/virtio/vhost_net_test.c

Source file repositories/reference/linux-study-clean/tools/virtio/vhost_net_test.c

File Facts

System
Linux kernel
Corpus path
tools/virtio/vhost_net_test.c
Extension
.c
Size
11699 bytes
Lines
533
Domain
Support Tooling And Documentation
Bucket
tools
Inferred role
Support Tooling And Documentation: implementation source
Status
source implementation candidate

Why This File Exists

Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.

Dependency Surface

Detected Declarations

Annotated Snippet

struct vq_info {
	int kick;
	int call;
	int idx;
	long started;
	long completed;
	struct pollfd fds;
	void *ring;
	/* copy used for control */
	struct vring vring;
	struct virtqueue *vq;
};

struct vdev_info {
	struct virtio_device vdev;
	int control;
	struct vq_info vqs[2];
	int nvqs;
	void *buf;
	size_t buf_size;
	char *test_buf;
	char *res_buf;
	struct vhost_memory *mem;
	int sock;
	int ifindex;
	unsigned char mac[ETHER_ADDR_LEN];
};

static int tun_alloc(struct vdev_info *dev, char *tun_name)
{
	struct ifreq ifr;
	int len = HDR_LEN;
	int fd, e;

	fd = open("/dev/net/tun", O_RDWR);
	if (fd < 0) {
		perror("Cannot open /dev/net/tun");
		return fd;
	}

	memset(&ifr, 0, sizeof(ifr));

	ifr.ifr_flags = IFF_TAP | IFF_NO_PI | IFF_VNET_HDR;
	strncpy(ifr.ifr_name, tun_name, IFNAMSIZ);

	e = ioctl(fd, TUNSETIFF, &ifr);
	if (e < 0) {
		perror("ioctl[TUNSETIFF]");
		close(fd);
		return e;
	}

	e = ioctl(fd, TUNSETVNETHDRSZ, &len);
	if (e < 0) {
		perror("ioctl[TUNSETVNETHDRSZ]");
		close(fd);
		return e;
	}

	e = ioctl(fd, SIOCGIFHWADDR, &ifr);
	if (e < 0) {
		perror("ioctl[SIOCGIFHWADDR]");
		close(fd);
		return e;
	}

	memcpy(dev->mac, &ifr.ifr_hwaddr.sa_data, ETHER_ADDR_LEN);
	return fd;
}

static void vdev_create_socket(struct vdev_info *dev, char *tun_name)
{
	struct ifreq ifr;

	dev->sock = socket(AF_PACKET, SOCK_RAW, htons(TEST_PTYPE));
	assert(dev->sock != -1);

	strncpy(ifr.ifr_name, tun_name, IFNAMSIZ);
	assert(ioctl(dev->sock, SIOCGIFINDEX, &ifr) >= 0);

	dev->ifindex = ifr.ifr_ifindex;

	/* Set the flags that bring the device up */
	assert(ioctl(dev->sock, SIOCGIFFLAGS, &ifr) >= 0);
	ifr.ifr_flags |= (IFF_UP | IFF_RUNNING);
	assert(ioctl(dev->sock, SIOCSIFFLAGS, &ifr) >= 0);
}

static void vdev_send_packet(struct vdev_info *dev)
{

Annotation

Implementation Notes