mirror of
https://github.com/n0-computer/noq.git
synced 2026-09-16 16:25:08 +00:00
refactor(quinn-udp): extract decode_socket_addr helper
This commit is contained in:
committed by
Dirkjan Ochtman
parent
e51c2d609e
commit
42de9dd2be
+30
-29
@@ -767,44 +767,45 @@ fn decode_recv<M: cmsg::MsgHdr<ControlMessage = libc::cmsghdr>>(
|
||||
}
|
||||
}
|
||||
|
||||
let addr = match libc::c_int::from(name.ss_family) {
|
||||
libc::AF_INET => {
|
||||
// Safety: if the ss_family field is AF_INET then storage must be a sockaddr_in.
|
||||
let addr: &libc::sockaddr_in =
|
||||
unsafe { &*(&name as *const _ as *const libc::sockaddr_in) };
|
||||
SocketAddr::V4(SocketAddrV4::new(
|
||||
Ipv4Addr::from(addr.sin_addr.s_addr.to_ne_bytes()),
|
||||
u16::from_be(addr.sin_port),
|
||||
))
|
||||
}
|
||||
libc::AF_INET6 => {
|
||||
// Safety: if the ss_family field is AF_INET6 then storage must be a sockaddr_in6.
|
||||
let addr: &libc::sockaddr_in6 =
|
||||
unsafe { &*(&name as *const _ as *const libc::sockaddr_in6) };
|
||||
SocketAddr::V6(SocketAddrV6::new(
|
||||
Ipv6Addr::from(addr.sin6_addr.s6_addr),
|
||||
u16::from_be(addr.sin6_port),
|
||||
addr.sin6_flowinfo,
|
||||
addr.sin6_scope_id,
|
||||
))
|
||||
}
|
||||
f => {
|
||||
return Err(io::Error::other(format!(
|
||||
"expected AF_INET or AF_INET6, got {f} in decode_recv"
|
||||
)));
|
||||
}
|
||||
};
|
||||
|
||||
Ok(RecvMeta {
|
||||
len,
|
||||
stride,
|
||||
addr,
|
||||
addr: decode_socket_addr(&name)?,
|
||||
ecn: EcnCodepoint::from_bits(ecn_bits),
|
||||
dst_ip,
|
||||
interface_index,
|
||||
})
|
||||
}
|
||||
|
||||
/// Decodes a `sockaddr_storage` into a `SocketAddr`
|
||||
fn decode_socket_addr(name: &libc::sockaddr_storage) -> io::Result<SocketAddr> {
|
||||
match libc::c_int::from(name.ss_family) {
|
||||
libc::AF_INET => {
|
||||
// Safety: if the ss_family field is AF_INET then storage must be a sockaddr_in.
|
||||
let addr: &libc::sockaddr_in =
|
||||
unsafe { &*(name as *const _ as *const libc::sockaddr_in) };
|
||||
Ok(SocketAddr::V4(SocketAddrV4::new(
|
||||
Ipv4Addr::from(addr.sin_addr.s_addr.to_ne_bytes()),
|
||||
u16::from_be(addr.sin_port),
|
||||
)))
|
||||
}
|
||||
libc::AF_INET6 => {
|
||||
// Safety: if the ss_family field is AF_INET6 then storage must be a sockaddr_in6.
|
||||
let addr: &libc::sockaddr_in6 =
|
||||
unsafe { &*(name as *const _ as *const libc::sockaddr_in6) };
|
||||
Ok(SocketAddr::V6(SocketAddrV6::new(
|
||||
Ipv6Addr::from(addr.sin6_addr.s6_addr),
|
||||
u16::from_be(addr.sin6_port),
|
||||
addr.sin6_flowinfo,
|
||||
addr.sin6_scope_id,
|
||||
)))
|
||||
}
|
||||
f => Err(io::Error::other(format!(
|
||||
"expected AF_INET or AF_INET6, got {f}"
|
||||
))),
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(not(apple_slow))]
|
||||
// Chosen somewhat arbitrarily; might benefit from additional tuning.
|
||||
pub(crate) const BATCH_SIZE: usize = 32;
|
||||
|
||||
Reference in New Issue
Block a user