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