|
1 |
| -use compio_net::UdpSocket; |
| 1 | +use compio_net::{CMsgBuilder, CMsgIter, UdpSocket}; |
2 | 2 |
|
3 | 3 | #[compio_macros::test]
|
4 | 4 | async fn connect() {
|
@@ -64,3 +64,53 @@ async fn send_to() {
|
64 | 64 | active_addr
|
65 | 65 | );
|
66 | 66 | }
|
| 67 | + |
| 68 | +#[compio_macros::test] |
| 69 | +async fn send_msg_with_ipv6_ecn() { |
| 70 | + #[cfg(unix)] |
| 71 | + use libc::{IPPROTO_IPV6, IPV6_RECVTCLASS, IPV6_TCLASS}; |
| 72 | + #[cfg(windows)] |
| 73 | + use windows_sys::Win32::Networking::WinSock::{ |
| 74 | + IPPROTO_IPV6, IPV6_ECN, IPV6_RECVTCLASS, IPV6_TCLASS, |
| 75 | + }; |
| 76 | + |
| 77 | + const MSG: &str = "foo bar baz"; |
| 78 | + |
| 79 | + let passive = UdpSocket::bind("[::1]:0").await.unwrap(); |
| 80 | + let passive_addr = passive.local_addr().unwrap(); |
| 81 | + |
| 82 | + passive |
| 83 | + .set_socket_option(IPPROTO_IPV6, IPV6_RECVTCLASS, &1) |
| 84 | + .unwrap(); |
| 85 | + |
| 86 | + let active = UdpSocket::bind("[::1]:0").await.unwrap(); |
| 87 | + let active_addr = active.local_addr().unwrap(); |
| 88 | + |
| 89 | + let mut control = vec![0u8; 32]; |
| 90 | + let mut builder = CMsgBuilder::new(&mut control); |
| 91 | + |
| 92 | + const ECN_BITS: i32 = 0b11; |
| 93 | + |
| 94 | + #[cfg(unix)] |
| 95 | + builder |
| 96 | + .try_push(IPPROTO_IPV6, IPV6_TCLASS, ECN_BITS) |
| 97 | + .unwrap(); |
| 98 | + #[cfg(windows)] |
| 99 | + builder.try_push(IPPROTO_IPV6, IPV6_ECN, ECN_BITS).unwrap(); |
| 100 | + |
| 101 | + let len = builder.finish(); |
| 102 | + control.truncate(len); |
| 103 | + |
| 104 | + active.send_msg(MSG, control, passive_addr).await.unwrap(); |
| 105 | + |
| 106 | + let res = passive.recv_msg(Vec::with_capacity(20), [0u8; 32]).await; |
| 107 | + assert_eq!(res.0.unwrap().1, active_addr); |
| 108 | + assert_eq!(res.1.0, MSG.as_bytes()); |
| 109 | + unsafe { |
| 110 | + let mut iter = CMsgIter::new(&res.1.1); |
| 111 | + let cmsg = iter.next().unwrap(); |
| 112 | + assert_eq!(cmsg.level(), IPPROTO_IPV6); |
| 113 | + assert_eq!(cmsg.ty(), IPV6_TCLASS); |
| 114 | + assert_eq!(cmsg.data::<i32>(), &ECN_BITS); |
| 115 | + } |
| 116 | +} |
0 commit comments