@@ -142,15 +142,17 @@ async fn runtime<A: ToSocketAddrs>(
142142 receive_addr : A ,
143143 send_addr : Option < A > ,
144144) -> io:: Result < ( super :: Io , SocketAddress ) > {
145- let rx_socket = syscall:: bind_udp ( receive_addr, false , false ) ?;
145+ let mut io_builder = Io :: builder ( ) ;
146+
147+ let rx_socket = syscall:: bind_udp ( receive_addr, false , false , false ) ?;
146148 rx_socket. set_nonblocking ( true ) ?;
147149 let rx_socket: std:: net:: UdpSocket = rx_socket. into ( ) ;
148150 let rx_addr = rx_socket. local_addr ( ) ?;
149151
150- let mut io_builder = Io :: builder ( ) . with_rx_socket ( rx_socket) ?;
152+ io_builder = io_builder . with_rx_socket ( rx_socket) ?;
151153
152154 if let Some ( tx_addr) = send_addr {
153- let tx_socket = syscall:: bind_udp ( tx_addr, false , false ) ?;
155+ let tx_socket = syscall:: bind_udp ( tx_addr, false , false , false ) ?;
154156 tx_socket. set_nonblocking ( true ) ?;
155157 let tx_socket: std:: net:: UdpSocket = tx_socket. into ( ) ;
156158 io_builder = io_builder. with_tx_socket ( tx_socket) ?
@@ -260,3 +262,23 @@ async fn ipv6_two_socket_test() -> io::Result<()> {
260262 other => other,
261263 }
262264}
265+
266+ #[ cfg( unix) ]
267+ #[ tokio:: test]
268+ #[ cfg_attr( miri, ignore) ]
269+ async fn only_v6_test ( ) -> io:: Result < ( ) > {
270+ // Socket always set only_v6 to true if it binds
271+ // to a specific IPV6 address. We use ANY address
272+ // to test for only_v6.
273+ static IPV6_ANY_ADDRESS : & str = "[::]:0" ;
274+
275+ let mut only_v6 = false ;
276+ let socket = syscall:: bind_udp ( IPV6_ANY_ADDRESS , false , false , only_v6) ?;
277+ assert ! ( !socket. only_v6( ) ?) ;
278+
279+ only_v6 = true ;
280+ let socket = syscall:: bind_udp ( IPV6_ANY_ADDRESS , false , false , only_v6) ?;
281+ assert ! ( socket. only_v6( ) ?) ;
282+
283+ Ok ( ( ) )
284+ }
0 commit comments