1be5c7
From a6c4aed18a027ce8e107fdf9184e9ea43a86f843 Mon Sep 17 00:00:00 2001
1be5c7
From: Leonardo Bras <leobras@redhat.com>
1be5c7
Date: Thu, 4 Aug 2022 04:10:43 -0300
1be5c7
Subject: [PATCH 8/9] QIOChannelSocket: Add support for MSG_ZEROCOPY + IPV6
1be5c7
MIME-Version: 1.0
1be5c7
Content-Type: text/plain; charset=UTF-8
1be5c7
Content-Transfer-Encoding: 8bit
1be5c7
1be5c7
RH-Author: Leonardo Brás <leobras@redhat.com>
1be5c7
RH-MergeRequest: 201: Zero-copy-send fixes + improvements
1be5c7
RH-Commit: [8/8] 6e26ee7c9ebaedb07623313cb0678816867751dd
1be5c7
RH-Bugzilla: 2110203
1be5c7
RH-Acked-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
1be5c7
RH-Acked-by: Peter Xu <peterx@redhat.com>
1be5c7
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
1be5c7
1be5c7
For using MSG_ZEROCOPY, there are two steps:
1be5c7
1 - io_writev() the packet, which enqueues the packet for sending, and
1be5c7
2 - io_flush(), which gets confirmation that all packets got correctly sent
1be5c7
1be5c7
Currently, if MSG_ZEROCOPY is used to send packets over IPV6, no error will
1be5c7
be reported in (1), but it will fail in the first time (2) happens.
1be5c7
1be5c7
This happens because (2) currently checks for cmsg_level & cmsg_type
1be5c7
associated with IPV4 only, before reporting any error.
1be5c7
1be5c7
Add checks for cmsg_level & cmsg_type associated with IPV6, and thus enable
1be5c7
support for MSG_ZEROCOPY + IPV6
1be5c7
1be5c7
Fixes: 2bc58ffc29 ("QIOChannelSocket: Implement io_writev zero copy flag & io_flush for CONFIG_LINUX")
1be5c7
Signed-off-by: Leonardo Bras <leobras@redhat.com>
1be5c7
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
1be5c7
(cherry picked from commit 5258a7e2c0677d16e9e1d06845f60171adf0b290)
1be5c7
Signed-off-by: Leonardo Bras <leobras@redhat.com>
1be5c7
---
1be5c7
 io/channel-socket.c | 4 ++--
1be5c7
 1 file changed, 2 insertions(+), 2 deletions(-)
1be5c7
1be5c7
diff --git a/io/channel-socket.c b/io/channel-socket.c
1be5c7
index cf0d67c51b..6010ad7017 100644
1be5c7
--- a/io/channel-socket.c
1be5c7
+++ b/io/channel-socket.c
1be5c7
@@ -747,8 +747,8 @@ static int qio_channel_socket_flush(QIOChannel *ioc,
1be5c7
         }
1be5c7
 
1be5c7
         cm = CMSG_FIRSTHDR(&msg;;
1be5c7
-        if (cm->cmsg_level != SOL_IP &&
1be5c7
-            cm->cmsg_type != IP_RECVERR) {
1be5c7
+        if (cm->cmsg_level != SOL_IP   && cm->cmsg_type != IP_RECVERR &&
1be5c7
+            cm->cmsg_level != SOL_IPV6 && cm->cmsg_type != IPV6_RECVERR) {
1be5c7
             error_setg_errno(errp, EPROTOTYPE,
1be5c7
                              "Wrong cmsg in errqueue");
1be5c7
             return -1;
1be5c7
-- 
1be5c7
2.31.1
1be5c7