Message ID | 20220804071041.540073-1-leobras@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [v1,1/1] QIOChannelSocket: Add support for MSG_ZEROCOPY + IPV6 | expand |
On Thu, Aug 04, 2022 at 04:10:43AM -0300, Leonardo Bras wrote: > For using MSG_ZEROCOPY, there are two steps: > 1 - io_writev() the packet, which enqueues the packet for sending, and > 2 - io_flush(), which gets confirmation that all packets got correctly sent > > Currently, if MSG_ZEROCOPY is used to send packets over IPV6, no error will > be reported in (1), but it will fail in the first time (2) happens. > > This happens because (2) currently checks for cmsg_level & cmsg_type > associated with IPV4 only, before reporting any error. > > Add checks for cmsg_level & cmsg_type associated with IPV6, and thus enable > support for MSG_ZEROCOPY + IPV6 Oh, subtle. > > Fixes: 2bc58ffc29 ("QIOChannelSocket: Implement io_writev zero copy flag & io_flush for CONFIG_LINUX") > Signed-off-by: Leonardo Bras <leobras@redhat.com> > --- > io/channel-socket.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) Reviewed-by: Daniel P. Berrangé <berrange@redhat.com> With regards, Daniel
On Thu, Aug 04, 2022 at 04:10:43AM -0300, Leonardo Bras wrote: > For using MSG_ZEROCOPY, there are two steps: > 1 - io_writev() the packet, which enqueues the packet for sending, and > 2 - io_flush(), which gets confirmation that all packets got correctly sent > > Currently, if MSG_ZEROCOPY is used to send packets over IPV6, no error will > be reported in (1), but it will fail in the first time (2) happens. > > This happens because (2) currently checks for cmsg_level & cmsg_type > associated with IPV4 only, before reporting any error. > > Add checks for cmsg_level & cmsg_type associated with IPV6, and thus enable > support for MSG_ZEROCOPY + IPV6 > > Fixes: 2bc58ffc29 ("QIOChannelSocket: Implement io_writev zero copy flag & io_flush for CONFIG_LINUX") > Signed-off-by: Leonardo Bras <leobras@redhat.com> Reviewed-by: Peter Xu <peterx@redhat.com>
diff --git a/io/channel-socket.c b/io/channel-socket.c index e6e7a12ae1..4f6bb6fe37 100644 --- a/io/channel-socket.c +++ b/io/channel-socket.c @@ -815,8 +815,8 @@ static int qio_channel_socket_flush(QIOChannel *ioc, } cm = CMSG_FIRSTHDR(&msg); - if (cm->cmsg_level != SOL_IP && - cm->cmsg_type != IP_RECVERR) { + if (cm->cmsg_level != SOL_IP && cm->cmsg_type != IP_RECVERR && + cm->cmsg_level != SOL_IPV6 && cm->cmsg_type != IPV6_RECVERR) { error_setg_errno(errp, EPROTOTYPE, "Wrong cmsg in errqueue"); return -1;
For using MSG_ZEROCOPY, there are two steps: 1 - io_writev() the packet, which enqueues the packet for sending, and 2 - io_flush(), which gets confirmation that all packets got correctly sent Currently, if MSG_ZEROCOPY is used to send packets over IPV6, no error will be reported in (1), but it will fail in the first time (2) happens. This happens because (2) currently checks for cmsg_level & cmsg_type associated with IPV4 only, before reporting any error. Add checks for cmsg_level & cmsg_type associated with IPV6, and thus enable support for MSG_ZEROCOPY + IPV6 Fixes: 2bc58ffc29 ("QIOChannelSocket: Implement io_writev zero copy flag & io_flush for CONFIG_LINUX") Signed-off-by: Leonardo Bras <leobras@redhat.com> --- io/channel-socket.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)