@@ -565,6 +565,9 @@ mod recvfrom {
565
565
None ,
566
566
)
567
567
. expect ( "send socket failed" ) ;
568
+ setsockopt ( rsock, sockopt:: ReceiveTimestampns , & true ) . unwrap ( ) ;
569
+ let mut cmsgspace1 = nix:: cmsg_space!( nix:: sys:: time:: TimeSpec ) ;
570
+ let mut cmsgspace2 = nix:: cmsg_space!( nix:: sys:: time:: TimeSpec ) ;
568
571
569
572
let send_thread = thread:: spawn ( move || {
570
573
for _ in 0 ..NUM_MESSAGES_SENT {
@@ -582,19 +585,31 @@ mod recvfrom {
582
585
. map ( |buf| [ IoSliceMut :: new ( & mut buf[ ..] ) ] )
583
586
. collect ( ) ;
584
587
585
- for iov in & iovs {
586
- msgs. push_back ( RecvMmsgData {
587
- iov,
588
- cmsg_buffer : None ,
589
- } )
590
- }
588
+ msgs. push_back ( RecvMmsgData {
589
+ iov : & iovs[ 0 ] ,
590
+ cmsg_buffer : Some ( & mut cmsgspace1) ,
591
+ } ) ;
592
+ msgs. push_back ( RecvMmsgData {
593
+ iov : & iovs[ 1 ] ,
594
+ cmsg_buffer : Some ( & mut cmsgspace2) ,
595
+ } ) ;
591
596
592
597
let res: Vec < RecvMsg < SockaddrIn > > =
593
598
recvmmsg ( rsock, & mut msgs, MsgFlags :: empty ( ) , None )
594
599
. expect ( "recvmmsg" ) ;
595
600
assert_eq ! ( res. len( ) , DATA . len( ) ) ;
596
601
597
- for RecvMsg { address, bytes, .. } in res. into_iter ( ) {
602
+ // one
603
+ for r in res. into_iter ( ) {
604
+ let rtime = match r. cmsgs ( ) . next ( ) {
605
+ Some ( ControlMessageOwned :: ScmTimestampns ( rtime) ) => rtime,
606
+ Some ( _) => panic ! ( "Unexpected control message" ) ,
607
+ None => panic ! ( "No control message" ) ,
608
+ } ;
609
+ assert ! ( rtime. tv_sec( ) > 10000 ) ;
610
+
611
+ let RecvMsg { address, bytes, .. } = r;
612
+
598
613
assert_eq ! ( AddressFamily :: Inet , address. unwrap( ) . family( ) . unwrap( ) ) ;
599
614
assert_eq ! ( DATA . len( ) , bytes) ;
600
615
}
0 commit comments