@@ -6,17 +6,13 @@ use std::collections::{HashMap, HashSet};
66use std:: net:: { Ipv4Addr , Ipv6Addr } ;
77use std:: str:: FromStr ;
88
9- use translator:: pnet_packet:: icmp:: { IcmpCode , IcmpPacket , IcmpType , IcmpTypes , MutableIcmpPacket } ;
10- use translator:: pnet_packet:: icmpv6:: {
11- Icmpv6Code , Icmpv6Packet , Icmpv6Type , Icmpv6Types , MutableIcmpv6Packet ,
12- } ;
13- use translator:: pnet_packet:: ip:: IpNextHeaderProtocol ;
9+ use translator:: pnet_packet:: icmp:: { IcmpPacket , IcmpTypes , MutableIcmpPacket } ;
10+ use translator:: pnet_packet:: icmpv6:: { Icmpv6Packet , Icmpv6Types , MutableIcmpv6Packet } ;
11+ use translator:: pnet_packet:: ip:: IpNextHeaderProtocols ;
1412use translator:: pnet_packet:: ipv4:: { Ipv4Packet , MutableIpv4Packet } ;
1513use translator:: pnet_packet:: ipv6:: { Ipv6Packet , MutableIpv6Packet } ;
1614use translator:: pnet_packet:: { MutablePacket , PacketSize } ;
17- use translator:: pnet_packet:: tcp:: { MutableTcpPacket } ;
18- use translator:: pnet_packet:: udp:: MutableUdpPacket ;
19- use translator:: pnet_packet:: { icmp, icmpv6, ip, ipv4, tcp, udp, Packet } ;
15+ use translator:: pnet_packet:: { icmp, icmpv6, ipv4, tcp, udp, Packet } ;
2016
2117#[ derive( Debug ) ]
2218pub enum Xlat6to4Error {
@@ -121,8 +117,8 @@ impl HMNat64 {
121117 let inpt_len: usize = ( pkt. get_total_length ( ) - 20 ) as usize ;
122118
123119 match pkt. get_next_level_protocol ( ) {
124- ip :: IpNextHeaderProtocols :: Icmp => {
125- response. set_next_header ( ip :: IpNextHeaderProtocols :: Icmpv6 ) ;
120+ IpNextHeaderProtocols :: Icmp => {
121+ response. set_next_header ( IpNextHeaderProtocols :: Icmpv6 ) ;
126122 let old_payload = IcmpPacket :: new ( pkt. payload ( ) ) . unwrap ( ) ;
127123 let size = HMNat64 :: icmp4_to_icmp6 (
128124 & v6src,
@@ -131,8 +127,8 @@ impl HMNat64 {
131127 & mut response. packet_mut ( ) [ data_offset as usize .. ( data_offset + inpt_len) ] ) ?;
132128 response. set_payload_length ( size) ;
133129 }
134- ip :: IpNextHeaderProtocols :: Tcp => {
135- response. set_next_header ( ip :: IpNextHeaderProtocols :: Tcp ) ;
130+ IpNextHeaderProtocols :: Tcp => {
131+ response. set_next_header ( IpNextHeaderProtocols :: Tcp ) ;
136132 let mut tcp_pkt = tcp:: MutableTcpPacket :: new ( pkt. payload_mut ( ) ) . unwrap ( ) ;
137133 let sum = pnet_packet:: tcp:: ipv6_checksum_adv (
138134 & tcp_pkt. to_immutable ( ) ,
@@ -143,8 +139,8 @@ impl HMNat64 {
143139 response. set_payload_length ( tcp_pkt. packet ( ) . len ( ) as u16 ) ;
144140 response. set_payload ( tcp_pkt. packet ( ) ) ;
145141 }
146- ip :: IpNextHeaderProtocols :: Udp => {
147- response. set_next_header ( ip :: IpNextHeaderProtocols :: Udp ) ;
142+ IpNextHeaderProtocols :: Udp => {
143+ response. set_next_header ( IpNextHeaderProtocols :: Udp ) ;
148144 let mut udp_pkt = udp:: MutableUdpPacket :: new ( pkt. payload_mut ( ) ) . unwrap ( ) ;
149145 let sum = pnet_packet:: udp:: ipv6_checksum_adv (
150146 & udp_pkt. to_immutable ( ) ,
@@ -195,13 +191,13 @@ impl HMNat64 {
195191 let ihl_v4: u16 = 20 ; // Offset to write data to in the output v4 packet.
196192
197193 match pkt. get_next_header ( ) {
198- ip :: IpNextHeaderProtocols :: Icmpv6 => {
199- response. set_next_level_protocol ( ip :: IpNextHeaderProtocols :: Icmp ) ;
194+ IpNextHeaderProtocols :: Icmpv6 => {
195+ response. set_next_level_protocol ( IpNextHeaderProtocols :: Icmp ) ;
200196 let old_payload = Icmpv6Packet :: new ( pkt. payload ( ) ) . unwrap ( ) ;
201197 let size = HMNat64 :: icmp6_to_icmp4 ( & old_payload, & mut response. packet_mut ( ) [ ihl_v4 as usize ..] ) ?;
202198 response. set_total_length ( ( ihl_v4 as u16 ) + size) ;
203199 }
204- ip :: IpNextHeaderProtocols :: Tcp => {
200+ IpNextHeaderProtocols :: Tcp => {
205201 let mut tcp_pkt = tcp:: MutableTcpPacket :: new ( pkt. payload_mut ( ) ) . unwrap ( ) ;
206202 let sum = pnet_packet:: tcp:: ipv4_checksum_adv (
207203 & tcp_pkt. to_immutable ( ) ,
@@ -212,9 +208,9 @@ impl HMNat64 {
212208 tcp_pkt. set_checksum ( sum) ;
213209 response. set_total_length ( ihl_v4 + tcp_pkt. packet ( ) . len ( ) as u16 ) ;
214210 response. set_payload ( tcp_pkt. packet ( ) ) ;
215- response. set_next_level_protocol ( ip :: IpNextHeaderProtocols :: Tcp ) ;
211+ response. set_next_level_protocol ( IpNextHeaderProtocols :: Tcp ) ;
216212 }
217- ip :: IpNextHeaderProtocols :: Udp => {
213+ IpNextHeaderProtocols :: Udp => {
218214 let mut udp_pkt = udp:: MutableUdpPacket :: new ( pkt. payload_mut ( ) ) . unwrap ( ) ;
219215 let sum = pnet_packet:: udp:: ipv4_checksum_adv (
220216 & udp_pkt. to_immutable ( ) ,
@@ -225,7 +221,7 @@ impl HMNat64 {
225221 udp_pkt. set_checksum ( sum) ;
226222 response. set_total_length ( ihl_v4 + udp_pkt. packet ( ) . len ( ) as u16 ) ;
227223 response. set_payload ( udp_pkt. packet ( ) ) ;
228- response. set_next_level_protocol ( ip :: IpNextHeaderProtocols :: Udp )
224+ response. set_next_level_protocol ( IpNextHeaderProtocols :: Udp )
229225 }
230226 _ => {
231227 // If the protocol is unknown leave the inner payload alone and forward.
@@ -260,12 +256,7 @@ impl HMNat64 {
260256 Icmpv6Types :: DestinationUnreachable => {
261257 HMNat64 :: handle_icmp_dest_unreach_6to4 ( pkt, & mut result)
262258 }
263- t => {
264- return Err ( Xlat6to4Error :: Other ( format ! (
265- "unsupported ICMP type: {:?}" ,
266- t
267- ) ) ) ;
268- }
259+ t => return Err ( Xlat6to4Error :: Other ( format ! ( "unsupported ICMP type: {:?}" , t) ) ) ;
269260 } ;
270261
271262 let sum = icmp:: checksum ( & result. to_immutable ( ) ) ;
@@ -289,7 +280,6 @@ impl HMNat64 {
289280 }
290281 }
291282 let size = ( result. packet_size ( ) + pkt. payload ( ) . len ( ) ) as u16 ;
292- println ! ( "Size is: {:?}, {}" , size, result. packet( ) . len( ) ) ;
293283 let sum = icmpv6:: checksum ( & result. to_immutable ( ) , src, dst) ;
294284 result. set_checksum ( sum) ;
295285 Ok ( ( result. packet_size ( ) + pkt. payload ( ) . len ( ) ) as u16 )
@@ -483,6 +473,10 @@ impl HMNat64 {
483473mod tests {
484474 use super :: * ;
485475
476+ use translator:: pnet_packet:: icmpv6:: { Icmpv6Type , Icmpv6Code } ;
477+ use translator:: pnet_packet:: icmp:: { IcmpCode , IcmpType } ;
478+ use translator:: pnet_packet:: ip:: IpNextHeaderProtocol ;
479+
486480 struct TranslateTestCase < ' a > {
487481 ipv4 : Ipv4Addr ,
488482 ipv6 : Ipv6Addr ,
@@ -607,13 +601,13 @@ mod tests {
607601 fn tmpl_icmp4 ( typ : IcmpType , code : IcmpCode , payload : & [ u8 ] ) -> Box < Vec < u8 > > {
608602 // Size of ICMP v4 packet is 4 bytes + payload.
609603 let buf = vec ! [ 0u8 ; 4 + payload. len( ) ] ;
610- let mut icmp4Pkt = MutableIcmpPacket :: owned ( buf) . unwrap ( ) ;
611- icmp4Pkt . set_icmp_type ( typ) ;
612- icmp4Pkt . set_icmp_code ( code) ;
613- icmp4Pkt . set_payload ( payload) ;
614- let checksum: u16 = icmp:: checksum ( & icmp4Pkt . to_immutable ( ) ) ;
615- icmp4Pkt . set_checksum ( checksum) ;
616- Box :: new ( icmp4Pkt . packet ( ) . to_vec ( ) )
604+ let mut icmp4_pkt = MutableIcmpPacket :: owned ( buf) . unwrap ( ) ;
605+ icmp4_pkt . set_icmp_type ( typ) ;
606+ icmp4_pkt . set_icmp_code ( code) ;
607+ icmp4_pkt . set_payload ( payload) ;
608+ let checksum: u16 = icmp:: checksum ( & icmp4_pkt . to_immutable ( ) ) ;
609+ icmp4_pkt . set_checksum ( checksum) ;
610+ Box :: new ( icmp4_pkt . packet ( ) . to_vec ( ) )
617611 }
618612
619613 // Create an ICMPv6 packet with given type, code and payload.
@@ -647,7 +641,7 @@ mod tests {
647641 payload : & [ u8 ]
648642 ) -> Box < Vec < u8 > > {
649643 let buf = vec ! [ 0u8 ; 24 + payload. len( ) ] ;
650- let mut tcp_pkt = MutableTcpPacket :: owned ( buf) . unwrap ( ) ;
644+ let mut tcp_pkt = tcp :: MutableTcpPacket :: owned ( buf) . unwrap ( ) ;
651645 tcp_pkt. set_source ( src_port) ;
652646 tcp_pkt. set_destination ( dst_port) ;
653647 tcp_pkt. set_payload ( payload) ;
@@ -671,7 +665,7 @@ mod tests {
671665 payload : & [ u8 ] ,
672666 ) -> Box < Vec < u8 > > {
673667 let buf = vec ! [ 0u8 ; 8 + payload. len( ) ] ;
674- let mut udp_pkt = MutableUdpPacket :: owned ( buf) . unwrap ( ) ;
668+ let mut udp_pkt = udp :: MutableUdpPacket :: owned ( buf) . unwrap ( ) ;
675669 udp_pkt. set_source ( src_port) ;
676670 udp_pkt. set_destination ( dst_port) ;
677671 udp_pkt. set_payload ( payload) ;
@@ -736,26 +730,26 @@ mod tests {
736730 let client_v6 = Ipv6Addr :: new ( 0x2001 , 0xdb8 , 0 , 0 , 0 , 0 , 0 , 0xcafe ) ;
737731 let target_v4 = Ipv4Addr :: new ( 8 , 8 , 8 , 8 ) ;
738732 let target_v6 = Ipv6Addr :: new ( 0x64 , 0xff9b , 0 , 0 , 0 , 0 , 0x808 , 0x808 ) ;
739- let cafebeef = vec ! [ 0x4 , 0x3 , 0x2 , 0x1 ] ;
733+ let cafebeef = vec ! [ 0xca , 0xfe , 0xbe , 0xef ] ;
740734 let tests: Vec < PacketTestCase > = vec ! [
741735 PacketTestCase {
742- ipv6: wrap_ip6hdr( target_v6, client_v6, 254 , ip :: IpNextHeaderProtocols :: Icmpv6 ,
736+ ipv6: wrap_ip6hdr( target_v6, client_v6, 254 , IpNextHeaderProtocols :: Icmpv6 ,
743737 & * tmpl_icmpv6( target_v6, client_v6, icmpv6:: Icmpv6Types :: EchoRequest ,
744738 icmpv6:: ndp:: Icmpv6Codes :: NoCode , & cafebeef) ) ,
745- ipv4: wrap_iphdr( target_v4, client_v4, 255 , ip :: IpNextHeaderProtocols :: Icmp ,
739+ ipv4: wrap_iphdr( target_v4, client_v4, 255 , IpNextHeaderProtocols :: Icmp ,
746740 & * tmpl_icmp4( icmp:: IcmpTypes :: EchoRequest ,
747741 icmp:: echo_request:: IcmpCodes :: NoCode , & cafebeef) ) ,
748742 } ,
749743 PacketTestCase {
750- ipv6: wrap_ip6hdr( target_v6, client_v6, 254 , ip :: IpNextHeaderProtocols :: Tcp ,
744+ ipv6: wrap_ip6hdr( target_v6, client_v6, 254 , IpNextHeaderProtocols :: Tcp ,
751745 & * tmpl_tcp( AddrPair :: Ipv6 ( target_v6, client_v6) , 42869 , 443 , & cafebeef) ) ,
752- ipv4: wrap_iphdr( target_v4, client_v4, 255 , ip :: IpNextHeaderProtocols :: Tcp ,
746+ ipv4: wrap_iphdr( target_v4, client_v4, 255 , IpNextHeaderProtocols :: Tcp ,
753747 & * tmpl_tcp( AddrPair :: Ipv4 ( target_v4, client_v4) , 42869 , 443 , & cafebeef) )
754748 } ,
755749 PacketTestCase {
756- ipv6: wrap_ip6hdr( target_v6, client_v6, 254 , ip :: IpNextHeaderProtocols :: Udp ,
750+ ipv6: wrap_ip6hdr( target_v6, client_v6, 254 , IpNextHeaderProtocols :: Udp ,
757751 & * tmpl_udp( AddrPair :: Ipv6 ( target_v6, client_v6) , 3186 , 443 , & cafebeef) ) ,
758- ipv4: wrap_iphdr( target_v4, client_v4, 255 , ip :: IpNextHeaderProtocols :: Udp ,
752+ ipv4: wrap_iphdr( target_v4, client_v4, 255 , IpNextHeaderProtocols :: Udp ,
759753 & * tmpl_udp( AddrPair :: Ipv4 ( target_v4, client_v4) , 3186 , 443 , & cafebeef) )
760754 } ,
761755 ] ;
@@ -764,12 +758,12 @@ mod tests {
764758 let mut rbuf = Box :: new ( vec ! [ 0u8 ; 1500 ] ) ;
765759 let mut translator = HMNat64 :: new ( "64:ff9b::/96" , client_subnet) . unwrap ( ) ;
766760 translator. register_mapping ( client_v6, client_v4) ;
767- let fourToSix : Ipv6Packet = translator
761+ let four_to_six : Ipv6Packet = translator
768762 . process_v4 (
769763 & mut MutableIpv4Packet :: new ( & mut * test. ipv4 ) . unwrap ( ) ,
770764 rbuf,
771765 ) . unwrap ( ) ;
772- assert_eq ! ( * test. ipv6, fourToSix . packet( ) [ ..40 + fourToSix . get_payload_length( ) as usize ] . to_vec( ) ) ;
766+ assert_eq ! ( * test. ipv6, four_to_six . packet( ) [ ..40 + four_to_six . get_payload_length( ) as usize ] . to_vec( ) ) ;
773767 }
774768 }
775769
@@ -782,37 +776,37 @@ mod tests {
782776 let cafebeef = vec ! [ 0xca , 0xfe , 0xbe , 0xef ] ;
783777 let tests: Vec < PacketTestCase > = vec ! [
784778 PacketTestCase {
785- ipv6: wrap_ip6hdr( client_v6, target_v6, 255 , ip :: IpNextHeaderProtocols :: Icmpv6 ,
779+ ipv6: wrap_ip6hdr( client_v6, target_v6, 255 , IpNextHeaderProtocols :: Icmpv6 ,
786780 & * tmpl_icmpv6( client_v6, target_v6, icmpv6:: Icmpv6Types :: EchoRequest ,
787781 icmpv6:: ndp:: Icmpv6Codes :: NoCode , & cafebeef) ) ,
788- ipv4: wrap_iphdr( client_v4, target_v4, 254 , ip :: IpNextHeaderProtocols :: Icmp ,
782+ ipv4: wrap_iphdr( client_v4, target_v4, 254 , IpNextHeaderProtocols :: Icmp ,
789783 & * tmpl_icmp4( icmp:: IcmpTypes :: EchoRequest ,
790784 icmp:: echo_request:: IcmpCodes :: NoCode , & cafebeef) ) ,
791785 } ,
792786 PacketTestCase {
793- ipv6: wrap_ip6hdr( client_v6, target_v6, 255 , ip :: IpNextHeaderProtocols :: Tcp ,
787+ ipv6: wrap_ip6hdr( client_v6, target_v6, 255 , IpNextHeaderProtocols :: Tcp ,
794788 & * tmpl_tcp( AddrPair :: Ipv6 ( client_v6, target_v6) , 42869 , 443 , & cafebeef) ) ,
795- ipv4: wrap_iphdr( client_v4, target_v4, 254 , ip :: IpNextHeaderProtocols :: Tcp ,
789+ ipv4: wrap_iphdr( client_v4, target_v4, 254 , IpNextHeaderProtocols :: Tcp ,
796790 & * tmpl_tcp( AddrPair :: Ipv4 ( client_v4, target_v4) , 42869 , 443 , & cafebeef) )
797791 } ,
798792 PacketTestCase {
799- ipv6: wrap_ip6hdr( client_v6, target_v6, 255 , ip :: IpNextHeaderProtocols :: Udp ,
793+ ipv6: wrap_ip6hdr( client_v6, target_v6, 255 , IpNextHeaderProtocols :: Udp ,
800794 & * tmpl_udp( AddrPair :: Ipv6 ( client_v6, target_v6) , 3186 , 443 , & cafebeef) ) ,
801- ipv4: wrap_iphdr( client_v4, target_v4, 254 , ip :: IpNextHeaderProtocols :: Udp ,
795+ ipv4: wrap_iphdr( client_v4, target_v4, 254 , IpNextHeaderProtocols :: Udp ,
802796 & * tmpl_udp( AddrPair :: Ipv4 ( client_v4, target_v4) , 3186 , 443 , & cafebeef) )
803797 }
804798 ] ;
805799 let client_subnet = "10.0.0.0/24" ;
806800 for mut test in tests {
807801 let mut rbuf = Box :: new ( vec ! [ 0u8 ; 1500 ] ) ;
808802 let mut translator = HMNat64 :: new ( "64:ff9b::/96" , client_subnet) . unwrap ( ) ;
809- let sixToFour : Ipv4Packet = translator
803+ let six_to_four : Ipv4Packet = translator
810804 . process_v6 (
811805 & mut MutableIpv6Packet :: new ( & mut * test. ipv6 ) . unwrap ( ) ,
812806 rbuf,
813807 )
814808 . unwrap ( ) ;
815- assert_eq ! ( * test. ipv4, sixToFour . packet( ) [ ..sixToFour . get_total_length( ) as usize ] . to_vec( ) ) ;
809+ assert_eq ! ( * test. ipv4, six_to_four . packet( ) [ ..six_to_four . get_total_length( ) as usize ] . to_vec( ) ) ;
816810 }
817811 }
818812}
0 commit comments