Re: [PATCH v2 4/4] vhost_net: Add self test with tun device
From: Jason Wang <hidden>
Date: 2021-06-24 06:13:53
在 2021/6/24 上午12:12, David Woodhouse 写道:
On Wed, 2021-06-23 at 12:02 +0800, Jason Wang wrote:quoted
在 2021/6/23 上午12:15, David Woodhouse 写道:quoted
From: David Woodhouse <redacted> This creates a tun device and brings it up, then finds out the link-local address the kernel automatically assigns to it. It sends a ping to that address, from a fake LL address of its own, and then waits for a response. If the virtio_net_hdr stuff is all working correctly, it gets a response and manages to understand it.I wonder whether it worth to bother the dependency like ipv6 or kernel networking stack. How about simply use packet socket that is bound to tun to receive and send packets?I pondered that but figured that using the kernel's network stack wasn't too much of an additional dependency. We *could* use an AF_PACKET socket on the tun device and then drive both ends, but given that the kernel *automatically* assigns a link-local address when we bring the device up anyway, it seemed simple enough just to use ICMP. I also happened to have the ICMP generation/checking code lying around anyway in the same emacs instance, so it was reduced to a previously solved problem.
Ok.
We *should* eventually expand this test case to attach an AF_PACKET device to the vhost-net, instead of using a tun device as the back end. (Although I don't really see *why* vhost is limited to AF_PACKET. Why *can't* I attach anything else, like an AF_UNIX socket, to vhost-net?)
It's just because nobody wrote the code. And we're lacking the real use case. Vhost_net is bascially used for accepting packet from userspace to the kernel networking stack. Using AF_UNIX makes it looks more like a case of inter process communication (without vnet header it won't be used efficiently by VM). In this case, using io_uring is much more suitable. Or thinking in another way, instead of depending on the vhost_net, we can expose TUN/TAP socket to userspace then io_uring could be used for the OpenConnect case as well?
quoted
quoted
+ /* + * I just want to map the *whole* of userspace address space. But + * from userspace I don't know what that is. On x86_64 it would be: + * + * vmem->regions[0].guest_phys_addr = 4096; + * vmem->regions[0].memory_size = 0x7fffffffe000; + * vmem->regions[0].userspace_addr = 4096; + * + * For now, just ensure we put everything inside a single BSS region. + */ + vmem->regions[0].guest_phys_addr = (uint64_t)&rings; + vmem->regions[0].userspace_addr = (uint64_t)&rings; + vmem->regions[0].memory_size = sizeof(rings);Instead of doing tricks like this, we can do it in another way: 1) enable device IOTLB 2) wait for the IOTLB miss request (iova, len) and update identity mapping accordingly This should work for all the archs (with some performance hit).Ick. For my actual application (OpenConnect) I'm either going to suck it up and put in the arch-specific limits like in the comment above, or I'll fix things to do the VHOST_F_IDENTITY_MAPPING thing we're talking about elsewhere.
The feature could be useful for the case of vhost-vDPA as well.
(Probably the former, since if I'm requiring kernel changes then I have grander plans around extending AF_TLS to do DTLS, then hooking that directly up to the tun socket via BPF and a sockmap without the data frames ever going to userspace at all.)
Ok, I guess we need to make sockmap works for tun socket.
For this test case, a hard-coded single address range in BSS is fine. I've now added !IFF_NO_PI support to the test case, but as noted it fails just like the other ones I'd already marked with #if 0, which is because vhost-net pulls some value for 'sock_hlen' out of its posterior based on some assumption around the vhost features. And then expects sock_recvmsg() to return precisely that number of bytes more than the value it peeks in the skb at the head of the sock's queue. I think I can fix *all* those test cases by making tun_get_socket() take an extra 'int *' argument, and use that to return the *actual* value of sock_hlen. Here's the updated test case in the meantime:
It would be better if you can post a new version of the whole series to ease the reviewing. Thanks