@@ -414,6 +414,12 @@ impl<'a> Iterator for CmsgIterator<'a> {
414
414
Some ( ControlMessage :: ScmTimestamp (
415
415
& * ( cmsg_data. as_ptr ( ) as * const _ ) ) )
416
416
} ,
417
+ ( libc:: IPPROTO_IPV6 , libc:: IPV6_PKTINFO ) => unsafe {
418
+ Some ( ControlMessage :: Ipv6PacketInfo ( & * ( cmsg_data. as_ptr ( ) as * const _ ) ) )
419
+ } ,
420
+ ( libc:: IPPROTO_IP , libc:: IP_PKTINFO ) => unsafe {
421
+ Some ( ControlMessage :: Ipv4PacketInfo ( & * ( cmsg_data. as_ptr ( ) as * const _ ) ) )
422
+ } ,
417
423
( _, _) => unsafe {
418
424
Some ( ControlMessage :: Unknown ( UnknownCmsg (
419
425
cmsg,
@@ -504,6 +510,8 @@ pub enum ControlMessage<'a> {
504
510
/// nix::unistd::close(in_socket).unwrap();
505
511
/// ```
506
512
ScmTimestamp ( & ' a TimeVal ) ,
513
+ Ipv4PacketInfo ( & ' a libc:: in_pktinfo ) ,
514
+ Ipv6PacketInfo ( & ' a libc:: in6_pktinfo ) ,
507
515
#[ doc( hidden) ]
508
516
Unknown ( UnknownCmsg < ' a > ) ,
509
517
}
@@ -538,6 +546,12 @@ impl<'a> ControlMessage<'a> {
538
546
ControlMessage :: ScmTimestamp ( t) => {
539
547
mem:: size_of_val ( t)
540
548
} ,
549
+ ControlMessage :: Ipv4PacketInfo ( pktinfo) => {
550
+ mem:: size_of_val ( pktinfo)
551
+ } ,
552
+ ControlMessage :: Ipv6PacketInfo ( pktinfo) => {
553
+ mem:: size_of_val ( pktinfo)
554
+ } ,
541
555
ControlMessage :: Unknown ( UnknownCmsg ( _, bytes) ) => {
542
556
mem:: size_of_val ( bytes)
543
557
}
@@ -586,6 +600,44 @@ impl<'a> ControlMessage<'a> {
586
600
587
601
copy_bytes ( t, buf) ;
588
602
} ,
603
+ ControlMessage :: Ipv4PacketInfo ( pktinfo) => {
604
+ let cmsg = cmsghdr {
605
+ cmsg_len : self . len ( ) as _ ,
606
+ cmsg_level : libc:: IPPROTO_IP ,
607
+ cmsg_type : libc:: IP_PKTINFO ,
608
+ ..mem:: uninitialized ( )
609
+ } ;
610
+ copy_bytes ( & cmsg, buf) ;
611
+
612
+ let padlen = cmsg_align ( mem:: size_of_val ( & cmsg) ) -
613
+ mem:: size_of_val ( & cmsg) ;
614
+
615
+ let mut tmpbuf = & mut [ ] [ ..] ;
616
+ mem:: swap ( & mut tmpbuf, buf) ;
617
+ let ( _padding, mut remainder) = tmpbuf. split_at_mut ( padlen) ;
618
+ mem:: swap ( buf, & mut remainder) ;
619
+
620
+ copy_bytes ( pktinfo, buf) ;
621
+ } ,
622
+ ControlMessage :: Ipv6PacketInfo ( pktinfo) => {
623
+ let cmsg = cmsghdr {
624
+ cmsg_len : self . len ( ) as _ ,
625
+ cmsg_level : libc:: IPPROTO_IPV6 ,
626
+ cmsg_type : libc:: IPV6_PKTINFO ,
627
+ ..mem:: uninitialized ( )
628
+ } ;
629
+ copy_bytes ( & cmsg, buf) ;
630
+
631
+ let padlen = cmsg_align ( mem:: size_of_val ( & cmsg) ) -
632
+ mem:: size_of_val ( & cmsg) ;
633
+
634
+ let mut tmpbuf = & mut [ ] [ ..] ;
635
+ mem:: swap ( & mut tmpbuf, buf) ;
636
+ let ( _padding, mut remainder) = tmpbuf. split_at_mut ( padlen) ;
637
+ mem:: swap ( buf, & mut remainder) ;
638
+
639
+ copy_bytes ( pktinfo, buf) ;
640
+ } ,
589
641
ControlMessage :: Unknown ( UnknownCmsg ( orig_cmsg, bytes) ) => {
590
642
copy_bytes ( orig_cmsg, buf) ;
591
643
copy_bytes ( bytes, buf) ;
0 commit comments