22/// CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_RUNNER='sudo -E' cargo test af_packet -- --ignored --nocapture
33use libc:: { c_void, size_t, sockaddr, sockaddr_ll, socklen_t} ;
44use nix:: errno:: Errno ;
5- use nix:: sys:: epoll:: { epoll_create , epoll_ctl , epoll_wait , EpollEvent , EpollFlags } ;
5+ use nix:: sys:: epoll:: { Epoll , EpollCreateFlags , EpollEvent , EpollFlags , EpollTimeout } ;
66use nix:: sys:: socket:: { AddressFamily , SockType } ;
77use rattan_core:: env:: { get_std_env, StdNetEnvConfig } ;
88use rattan_core:: metal:: veth:: { MacAddr , VethCell } ;
9+ use std:: os:: fd:: { FromRawFd , OwnedFd } ;
910use std:: sync:: atomic:: { AtomicBool , Ordering } ;
1011use std:: sync:: Arc ;
1112use std:: { mem, ptr} ;
@@ -166,34 +167,27 @@ fn af_packet_test() -> anyhow::Result<()> {
166167 )
167168 } ;
168169
169- let epoll_fd = epoll_create ( ) . unwrap ( ) ;
170-
171- epoll_ctl (
172- epoll_fd,
173- nix:: sys:: epoll:: EpollOp :: EpollCtlAdd ,
174- left_sniffer,
175- Some ( & mut EpollEvent :: new (
176- EpollFlags :: EPOLLIN ,
177- left_sniffer as u64 ,
178- ) ) ,
179- )
180- . unwrap ( ) ;
181-
182- epoll_ctl (
183- epoll_fd,
184- nix:: sys:: epoll:: EpollOp :: EpollCtlAdd ,
185- right_sniffer,
186- Some ( & mut EpollEvent :: new (
187- EpollFlags :: EPOLLIN ,
188- right_sniffer as u64 ,
189- ) ) ,
190- )
191- . unwrap ( ) ;
170+ let left_sniffer_fd = unsafe { OwnedFd :: from_raw_fd ( left_sniffer) } ;
171+ let epoll_instance = Epoll :: new ( EpollCreateFlags :: empty ( ) ) . unwrap ( ) ;
172+ epoll_instance
173+ . add (
174+ left_sniffer_fd,
175+ EpollEvent :: new ( EpollFlags :: EPOLLIN , left_sniffer as u64 ) ,
176+ )
177+ . unwrap ( ) ;
178+ let right_sniffer_fd = unsafe { OwnedFd :: from_raw_fd ( right_sniffer) } ;
179+ epoll_instance
180+ . add (
181+ right_sniffer_fd,
182+ EpollEvent :: new ( EpollFlags :: EPOLLIN , right_sniffer as u64 ) ,
183+ )
184+ . unwrap ( ) ;
192185
193186 // Large enough to receive frame of localhost.
194187 let mut buf = [ 0u8 ; 65537 ] ;
195188 let mut events = [ EpollEvent :: empty ( ) ; 100 ] ;
196189 let timeout_ms = 1000 ;
190+ let epoll_timeout = EpollTimeout :: try_from ( timeout_ms) . unwrap ( ) ;
197191
198192 let running = Arc :: new ( AtomicBool :: new ( true ) ) ;
199193 let rclone = running. clone ( ) ;
@@ -203,7 +197,7 @@ fn af_packet_test() -> anyhow::Result<()> {
203197 . expect ( "unable to install ctrl+c handler" ) ;
204198
205199 while running. load ( Ordering :: Acquire ) {
206- let _num_events = epoll_wait ( epoll_fd , & mut events, timeout_ms ) . unwrap ( ) ;
200+ let _num_events = epoll_instance . wait ( & mut events, epoll_timeout ) . unwrap ( ) ;
207201
208202 for event in events {
209203 let fd = event. data ( ) as i32 ;
0 commit comments