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