@@ -142,15 +142,17 @@ async fn runtime<A: ToSocketAddrs>(
142
142
receive_addr : A ,
143
143
send_addr : Option < A > ,
144
144
) -> 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 ) ?;
146
148
rx_socket. set_nonblocking ( true ) ?;
147
149
let rx_socket: std:: net:: UdpSocket = rx_socket. into ( ) ;
148
150
let rx_addr = rx_socket. local_addr ( ) ?;
149
151
150
- let mut io_builder = Io :: builder ( ) . with_rx_socket ( rx_socket) ?;
152
+ io_builder = io_builder . with_rx_socket ( rx_socket) ?;
151
153
152
154
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 ) ?;
154
156
tx_socket. set_nonblocking ( true ) ?;
155
157
let tx_socket: std:: net:: UdpSocket = tx_socket. into ( ) ;
156
158
io_builder = io_builder. with_tx_socket ( tx_socket) ?
@@ -260,3 +262,23 @@ async fn ipv6_two_socket_test() -> io::Result<()> {
260
262
other => other,
261
263
}
262
264
}
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