@@ -759,6 +759,82 @@ fn test_handle_igmp(#[case] medium: Medium) {
759
759
}
760
760
}
761
761
762
+ #[ rstest]
763
+ #[ case( Medium :: Ip ) ]
764
+ #[ cfg( all( feature = "proto-ipv4-fragmentation" , feature = "medium-ip" ) ) ]
765
+ #[ case( Medium :: Ethernet ) ]
766
+ #[ cfg( all( feature = "proto-ipv4-fragmentation" , feature = "medium-ethernet" ) ) ]
767
+ fn test_packet_len ( #[ case] medium : Medium ) {
768
+ use crate :: config:: FRAGMENTATION_BUFFER_SIZE ;
769
+
770
+ let ( mut iface, _, _) = setup ( medium) ;
771
+
772
+ struct TestTxToken {
773
+ max_transmission_unit : usize ,
774
+ }
775
+
776
+ impl TxToken for TestTxToken {
777
+ fn consume < R , F > ( self , len : usize , f : F ) -> R
778
+ where
779
+ F : FnOnce ( & mut [ u8 ] ) -> R ,
780
+ {
781
+ net_debug ! ( "TxToken get len: {}" , len) ;
782
+ assert ! ( len <= self . max_transmission_unit) ;
783
+ let mut junk = [ 0 ; 1536 ] ;
784
+ f ( & mut junk[ ..len] )
785
+ }
786
+ }
787
+
788
+ iface. inner . neighbor_cache . fill (
789
+ IpAddress :: Ipv4 ( Ipv4Address :: new ( 127 , 0 , 0 , 1 ) ) ,
790
+ HardwareAddress :: Ethernet ( EthernetAddress :: from_bytes ( & [
791
+ 0x02 , 0x02 , 0x02 , 0x02 , 0x02 , 0x02 ,
792
+ ] ) ) ,
793
+ Instant :: ZERO ,
794
+ ) ;
795
+
796
+ for ip_packet_len in [
797
+ 100 ,
798
+ iface. inner . ip_mtu ( ) ,
799
+ iface. inner . ip_mtu ( ) + 1 ,
800
+ FRAGMENTATION_BUFFER_SIZE ,
801
+ ] {
802
+ net_debug ! ( "ip_packet_len: {}" , ip_packet_len) ;
803
+
804
+ let mut ip_repr = Ipv4Repr {
805
+ src_addr : Ipv4Address :: new ( 127 , 0 , 0 , 1 ) ,
806
+ dst_addr : Ipv4Address :: new ( 127 , 0 , 0 , 1 ) ,
807
+ next_header : IpProtocol :: Udp ,
808
+ payload_len : 0 ,
809
+ hop_limit : 64 ,
810
+ } ;
811
+ let udp_repr = UdpRepr {
812
+ src_port : 12345 ,
813
+ dst_port : 54321 ,
814
+ } ;
815
+
816
+ let ip_packet_payload_len = ip_packet_len - ip_repr. buffer_len ( ) ;
817
+ let udp_packet_payload_len = ip_packet_payload_len - udp_repr. header_len ( ) ;
818
+ ip_repr. payload_len = ip_packet_payload_len;
819
+
820
+ let udp_packet_payload = vec ! [ 1 ; udp_packet_payload_len] ;
821
+ let ip_payload = IpPayload :: Udp ( udp_repr, & udp_packet_payload) ;
822
+ let ip_packet = Packet :: new_ipv4 ( ip_repr, ip_payload) ;
823
+
824
+ assert_eq ! (
825
+ iface. inner. dispatch_ip(
826
+ TestTxToken {
827
+ max_transmission_unit: iface. inner. caps. max_transmission_unit
828
+ } ,
829
+ PacketMeta :: default ( ) ,
830
+ ip_packet,
831
+ & mut iface. fragmenter,
832
+ ) ,
833
+ Ok ( ( ) )
834
+ ) ;
835
+ }
836
+ }
837
+
762
838
#[ rstest]
763
839
#[ case( Medium :: Ip ) ]
764
840
#[ cfg( all( feature = "socket-raw" , feature = "medium-ip" ) ) ]
0 commit comments