Skip to content

Commit

Permalink
fix(qudp): windows unspecified ip send error (#304)
Browse files Browse the repository at this point in the history
  • Loading branch information
metah3m authored Nov 11, 2024
1 parent bff2994 commit 519706b
Show file tree
Hide file tree
Showing 4 changed files with 28 additions and 24 deletions.
1 change: 1 addition & 0 deletions h3-shim/examples/h3-client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,7 @@ async fn run() -> Result<(), Box<dyn core::error::Error>> {
.without_cert()
.with_keylog(opt.key_log_file)
.with_alpns([ALPN.into()])
.bind(&opt.bind[..])?
.build();
let conn = quic_client.connect(auth.host(), addr)?;

Expand Down
2 changes: 1 addition & 1 deletion qudp/examples/receive.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ use qudp::UdpSocketController;
#[derive(Parser, Debug)]
#[command(version, about, long_about = None)]
struct Args {
#[arg(short,long, default_value_t = String::from("127.0.0.1:12345"))]
#[arg(short,long, default_value_t = String::from("[::1]:12345"))]
bind: String,
}

Expand Down
4 changes: 2 additions & 2 deletions qudp/examples/send.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,10 @@ use qudp::{PacketHeader, UdpSocketController};
#[derive(Parser, Debug)]
#[command(version, about, long_about = None)]
struct Args {
#[arg(long, default_value_t = String::from("127.0.0.1:0"))]
#[arg(long, default_value_t = String::from("[::]:0"))]
src: String,

#[arg(long, default_value_t = String::from("127.0.0.1:12345"))]
#[arg(long, default_value_t = String::from("[::1]:12345"))]
dst: String,

#[arg(long, default_value_t = 1200)]
Expand Down
45 changes: 24 additions & 21 deletions qudp/src/windows.rs
Original file line number Diff line number Diff line change
Expand Up @@ -138,27 +138,30 @@ impl Io for UdpSocketController {

let mut cmsghdr = unsafe { cmsghdr::CmsgHdr::new(&mut wsa_msg) };

let src = socket2::SockAddr::from(hdr.src);

match src.family() {
WinSock::AF_INET => {
let src_ip = unsafe { ptr::read(src.as_ptr() as *const WinSock::SOCKADDR_IN) };
let pktinfo = WinSock::IN_PKTINFO {
ipi_addr: src_ip.sin_addr,
ipi_ifindex: 0,
};
cmsghdr.append(WinSock::IPPROTO_IP, WinSock::IP_PKTINFO, pktinfo);
}
WinSock::AF_INET6 => {
let src_ip = unsafe { ptr::read(src.as_ptr() as *const WinSock::SOCKADDR_IN6) };
let pktinfo = WinSock::IN6_PKTINFO {
ipi6_addr: src_ip.sin6_addr,
ipi6_ifindex: unsafe { src_ip.Anonymous.sin6_scope_id },
};
cmsghdr.append(WinSock::IPPROTO_IPV6, WinSock::IPV6_PKTINFO, pktinfo);
}
_ => {
return Err(io::Error::from(io::ErrorKind::InvalidInput));
if !hdr.src.ip().is_unspecified() {
let src = socket2::SockAddr::from(hdr.src);
match src.family() {
WinSock::AF_INET => {
let src_ip =
unsafe { ptr::read(src.as_ptr() as *const WinSock::SOCKADDR_IN) };
let pktinfo = WinSock::IN_PKTINFO {
ipi_addr: src_ip.sin_addr,
ipi_ifindex: 0,
};
cmsghdr.append(WinSock::IPPROTO_IP, WinSock::IP_PKTINFO, pktinfo);
}
WinSock::AF_INET6 => {
let src_ip =
unsafe { ptr::read(src.as_ptr() as *const WinSock::SOCKADDR_IN6) };
let pktinfo = WinSock::IN6_PKTINFO {
ipi6_addr: src_ip.sin6_addr,
ipi6_ifindex: unsafe { src_ip.Anonymous.sin6_scope_id },
};
cmsghdr.append(WinSock::IPPROTO_IPV6, WinSock::IPV6_PKTINFO, pktinfo);
}
_ => {
return Err(io::Error::from(io::ErrorKind::InvalidInput));
}
}
}

Expand Down

0 comments on commit 519706b

Please sign in to comment.