From b8094f32703fe9a12585d6b122235b63110e7386 Mon Sep 17 00:00:00 2001 From: Maxim Ivanov Date: Sun, 5 Feb 2023 16:06:45 +0000 Subject: [PATCH] Make msghdr.msg_name optional sendmsg can be used on connected sockets without msg_name. --- src/io/send_to.rs | 22 ++++++++++++++++------ src/io/sendmsg_zc.rs | 20 ++++++++++++++++---- 2 files changed, 32 insertions(+), 10 deletions(-) diff --git a/src/io/send_to.rs b/src/io/send_to.rs index d9a61762..57049fc6 100644 --- a/src/io/send_to.rs +++ b/src/io/send_to.rs @@ -14,7 +14,7 @@ pub(crate) struct SendTo { #[allow(dead_code)] io_slices: Vec>, #[allow(dead_code)] - socket_addr: Box, + socket_addr: Option>, pub(crate) msghdr: Box, } @@ -22,7 +22,7 @@ impl Op> { pub(crate) fn send_to( fd: &SharedFd, buf: T, - socket_addr: SocketAddr, + socket_addr: Option, ) -> io::Result>> { use io_uring::{opcode, types}; @@ -30,13 +30,23 @@ impl Op> { std::slice::from_raw_parts(buf.stable_ptr(), buf.bytes_init()) })]; - let socket_addr = Box::new(SockAddr::from(socket_addr)); - let mut msghdr: Box = Box::new(unsafe { std::mem::zeroed() }); msghdr.msg_iov = io_slices.as_ptr() as *mut _; msghdr.msg_iovlen = io_slices.len() as _; - msghdr.msg_name = socket_addr.as_ptr() as *mut libc::c_void; - msghdr.msg_namelen = socket_addr.len(); + + let socket_addr = match socket_addr { + Some(ref _socket_addr) => { + let socket_addr = Some(Box::new(SockAddr::from(_socket_addr))); + msghdr.msg_name = socket_addr.as_ptr() as *mut libc::c_void; + msghdr.msg_namelen = socket_addr.len(); + socket_addr + } + None => { + msghdr.msg_name = std::ptr::null_mut(); + msghdr.msg_namelen = 0; + None + } + }; CONTEXT.with(|x| { x.handle().expect("Not in a runtime context").submit_op( diff --git a/src/io/sendmsg_zc.rs b/src/io/sendmsg_zc.rs index 2c266339..0863e483 100644 --- a/src/io/sendmsg_zc.rs +++ b/src/io/sendmsg_zc.rs @@ -13,7 +13,7 @@ pub(crate) struct SendMsgZc { #[allow(dead_code)] io_bufs: Vec, #[allow(dead_code)] - socket_addr: Box, + socket_addr: Option>, msg_control: Option, msghdr: libc::msghdr, @@ -25,13 +25,11 @@ impl Op, MultiCQEFuture> { pub(crate) fn sendmsg_zc( fd: &SharedFd, io_bufs: Vec, - socket_addr: SocketAddr, + socket_addr: Option, msg_control: Option, ) -> io::Result { use io_uring::{opcode, types}; - let socket_addr = Box::new(SockAddr::from(socket_addr)); - let mut msghdr: libc::msghdr = unsafe { std::mem::zeroed() }; let mut io_slices: Vec = Vec::with_capacity(io_bufs.len()); @@ -47,6 +45,20 @@ impl Op, MultiCQEFuture> { msghdr.msg_name = socket_addr.as_ptr() as *mut libc::c_void; msghdr.msg_namelen = socket_addr.len(); + let socket_addr = match socket_addr { + Some(ref _socket_addr) => { + let socket_addr = Some(Box::new(SockAddr::from(_socket_addr))); + msghdr.msg_name = socket_addr.as_ptr() as *mut libc::c_void; + msghdr.msg_namelen = socket_addr.len(); + socket_addr + } + None => { + msghdr.msg_name = std::ptr::null_mut(); + msghdr.msg_namelen = 0; + None + } + }; + match msg_control { Some(ref _msg_control) => { msghdr.msg_control = _msg_control.stable_ptr() as *mut _;