Re: [RFC PATCH] virtio-vsock: add description for datagram type
From: Stefan Hajnoczi <stefanha@redhat.com>
Date: 2021-05-13 16:04:52
On Thu, May 06, 2021 at 04:56:48PM -0700, Cong Wang . wrote:
On Mon, Apr 26, 2021 at 9:07 AM Stefan Hajnoczi [off-list ref] wrote:quoted
On Wed, Apr 14, 2021 at 05:43:52PM -0700, Cong Wang . wrote:quoted
On Wed, Mar 17, 2021 at 8:45 AM Stefan Hajnoczi [off-list ref] wrote:quoted
Please stick to UDP semantics as much as possible so that applications can be ported easily and developers aren't surprised by unexpected behavior. UDP packets sent to a destination that has no listen socket result in a Connection Refused error. vsock dgrams should behave in the same way.There is no connection refused error for UDP, as it is clearly connectionless. What you suggested might be an ICMP unreachable error, however, vsock does not have anything equivalent. So, I think there is no error returned in this scenario for vsock datagram.Yes, exactly. UDP uses ICMP unreachable: 16:55:40.380292 IP 127.0.0.1.41519 > 127.0.0.1.1234: UDP, length 5 16:55:40.380308 IP 127.0.0.1 > 127.0.0.1: ICMP 127.0.0.1 udp port 1234 unreachable, length 41 This is mentioned a bit here: https://tools.ietf.org/html/rfc8085#section-5.2 Here is how Python's socket module produces an ConnectionRefused exception: socket(AF_INET, SOCK_DGRAM|SOCK_CLOEXEC, IPPROTO_IP) = 3 sendto(3, "hello", 5, 0, {sa_family=AF_INET, sin_port=htons(1234), sin_addr=inet_addr("127.0.0.1")}, 16) = 5 getsockname(3, {sa_family=AF_INET, sin_port=htons(41519), sin_addr=inet_addr("0.0.0.0")}, [16]) = 0 getpeername(3, 0x7ffc43c99a20, [16]) = -1 ENOTCONN (Transport endpoint is not connected)Yes, we are all aware of these UDP behaviors.quoted
UDP itself may not carry this information but applications do rely on the ICMP information as shown above. The Linux network stack implementation is here: net/ipv4/udp.c:__udp4_lib_err().Sure, but applications using UDP when porting to vsock dgram, they must be aware AF_VSOCK has totally different protocols from AF_INET, hence behaves differently from AF_INET. Therefore, it is not necessary to do everything UDP does here, particularly not necessary to mimic ICMP in vsock. In short, I don't think there is any standard to enforce what dgram sockets must behave, each address family should have its right to behave reasonably differently.
They can behave differently but at the cost of making it harder to port applications. Sending a RST packet in vsock is easy and allows applications to get the same behavior as with UDP/ICMP. I don't see a reason to avoid it. Stefan