diff --git a/quinn-udp/src/unix.rs b/quinn-udp/src/unix.rs index 55bd21059..d5c779ed3 100644 --- a/quinn-udp/src/unix.rs +++ b/quinn-udp/src/unix.rs @@ -332,8 +332,20 @@ fn send( if e.raw_os_error() == Some(libc::EINVAL) { // Some arguments to `sendmsg` are not supported. - // Switch to fallback mode. - state.set_sendmsg_einval(); + if !state.sendmsg_einval() { + // Switch to fallback mode. + state.set_sendmsg_einval(); + prepare_msg( + transmit, + &dst_addr, + &mut msg_hdr, + &mut iovec, + &mut cmsgs, + encode_src_ip, + state.sendmsg_einval(), + ); + continue; + } } // - EMSGSIZE is expected for MTU probes. Future work might be able to avoid diff --git a/quinn-udp/tests/tests.rs b/quinn-udp/tests/tests.rs index e56d92fa2..7b0b48bda 100644 --- a/quinn-udp/tests/tests.rs +++ b/quinn-udp/tests/tests.rs @@ -241,7 +241,10 @@ fn test_send_recv(send: &Socket, recv: &Socket, transmit: Transmit) { } } - if cfg!(target_os = "android") + if match transmit.destination.ip() { + IpAddr::V4(_) => true, + IpAddr::V6(a) => a.to_ipv4_mapped().is_some(), + } && cfg!(target_os = "android") && std::env::var("API_LEVEL") .ok() .and_then(|v| v.parse::().ok())