aboutgitcodebugslistschat
path: root/passt.h
diff options
context:
space:
mode:
authorDavid Gibson <david@gibson.dropbear.id.au>2024-07-26 17:20:31 +1000
committerStefano Brivio <sbrivio@redhat.com>2024-07-26 14:07:42 +0200
commit57a21d2df1467302dee71ee9d5683a8b96e6ce7f (patch)
treefa0904c3966dce139a0be6422d3cfebc2e583886 /passt.h
parent37e3b24d90278288b6b6216da249b5d45fc4c411 (diff)
downloadpasst-57a21d2df1467302dee71ee9d5683a8b96e6ce7f.tar
passt-57a21d2df1467302dee71ee9d5683a8b96e6ce7f.tar.gz
passt-57a21d2df1467302dee71ee9d5683a8b96e6ce7f.tar.bz2
passt-57a21d2df1467302dee71ee9d5683a8b96e6ce7f.tar.lz
passt-57a21d2df1467302dee71ee9d5683a8b96e6ce7f.tar.xz
passt-57a21d2df1467302dee71ee9d5683a8b96e6ce7f.tar.zst
passt-57a21d2df1467302dee71ee9d5683a8b96e6ce7f.zip
tap: Improve handling of partially received frames on qemu socket2024_07_26.57a21d2
Because the Unix socket to qemu is a stream socket, we have no guarantee of where the boundaries between recv() calls will lie. Typically they will lie on frame boundaries, because that's how qemu will send then, but we can't rely on it. Currently we handle this case by detecting when we have received a partial frame and performing a blocking recv() to get the remainder, and only then processing the frames. Change it so instead we save the partial frame persistently and include it as the first thing processed next time we receive data from the socket. This handles a number of (unlikely) cases which previously would not be dealt with correctly: * If qemu sent a partial frame then waited some time before sending the remainder, previously we could block here for an unacceptably long time * If qemu sent a tiny partial frame (< 4 bytes) we'd leave the loop without doing the partial frame handling, which would put us out of sync with the stream from qemu * If a the blocking recv() only received some of the remainder of the frame, not all of it, we'd return leaving us out of sync with the stream again Caveat: This could memmove() a moderate amount of data (ETH_MAX_MTU). This is probably acceptable because it's an unlikely case in practice. If necessary we could mitigate this by using a true ring buffer. Signed-off-by: David Gibson <david@gibson.dropbear.id.au> Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
Diffstat (limited to 'passt.h')
-rw-r--r--passt.h1
1 files changed, 0 insertions, 1 deletions
diff --git a/passt.h b/passt.h
index 4cc2b6f..d0f31a2 100644
--- a/passt.h
+++ b/passt.h
@@ -60,7 +60,6 @@ static_assert(sizeof(union epoll_ref) <= sizeof(union epoll_data),
#define TAP_BUF_BYTES \
ROUND_DOWN(((ETH_MAX_MTU + sizeof(uint32_t)) * 128), PAGE_SIZE)
-#define TAP_BUF_FILL (TAP_BUF_BYTES - ETH_MAX_MTU - sizeof(uint32_t))
#define TAP_MSGS \
DIV_ROUND_UP(TAP_BUF_BYTES, ETH_ZLEN - 2 * ETH_ALEN + sizeof(uint32_t))