@@ -835,14 +835,9 @@ fn test_packet_len(#[case] medium: Medium) {
835
835
}
836
836
}
837
837
838
- #[ rstest]
839
- #[ case( Medium :: Ip ) ]
840
- #[ cfg( all( feature = "socket-raw" , feature = "medium-ip" ) ) ]
841
- #[ case( Medium :: Ethernet ) ]
842
- #[ cfg( all( feature = "socket-raw" , feature = "medium-ethernet" ) ) ]
843
- fn test_raw_socket_no_reply ( #[ case] medium : Medium ) {
844
- use crate :: wire:: { IpVersion , UdpPacket , UdpRepr } ;
845
-
838
+ /// Check no reply is emitted when using a raw socket
839
+ #[ cfg( feature = "socket-raw" ) ]
840
+ fn check_no_reply_raw_socket ( medium : Medium , frame : & crate :: wire:: ipv4:: Packet < & [ u8 ] > ) {
846
841
let ( mut iface, mut sockets, _) = setup ( medium) ;
847
842
848
843
let packets = 1 ;
@@ -852,14 +847,30 @@ fn test_raw_socket_no_reply(#[case] medium: Medium) {
852
847
vec ! [ raw:: PacketMetadata :: EMPTY ; packets] ,
853
848
vec ! [ 0 ; 48 * packets] ,
854
849
) ;
855
- let raw_socket = raw:: Socket :: new (
856
- Some ( IpVersion :: Ipv4 ) ,
857
- Some ( IpProtocol :: Udp ) ,
858
- rx_buffer,
859
- tx_buffer,
860
- ) ;
850
+ let raw_socket = raw:: Socket :: new ( Some ( IpVersion :: Ipv4 ) , None , rx_buffer, tx_buffer) ;
861
851
sockets. add ( raw_socket) ;
862
852
853
+ assert_eq ! (
854
+ iface. inner. process_ipv4(
855
+ & mut sockets,
856
+ PacketMeta :: default ( ) ,
857
+ HardwareAddress :: default ( ) ,
858
+ frame,
859
+ & mut iface. fragments
860
+ ) ,
861
+ None
862
+ ) ;
863
+ }
864
+
865
+ #[ rstest]
866
+ #[ case( Medium :: Ip ) ]
867
+ #[ cfg( all( feature = "socket-raw" , feature = "medium-ip" ) ) ]
868
+ #[ case( Medium :: Ethernet ) ]
869
+ #[ cfg( all( feature = "socket-raw" , feature = "medium-ethernet" ) ) ]
870
+ /// Test no reply to received UDP when using raw socket which accepts all protocols
871
+ fn test_raw_socket_no_reply_udp ( #[ case] medium : Medium ) {
872
+ use crate :: wire:: { UdpPacket , UdpRepr } ;
873
+
863
874
let src_addr = Ipv4Address :: new ( 127 , 0 , 0 , 2 ) ;
864
875
let dst_addr = Ipv4Address :: new ( 127 , 0 , 0 , 1 ) ;
865
876
@@ -869,16 +880,6 @@ fn test_raw_socket_no_reply(#[case] medium: Medium) {
869
880
src_port : 67 ,
870
881
dst_port : 68 ,
871
882
} ;
872
- let mut bytes = vec ! [ 0xff ; udp_repr. header_len( ) + PAYLOAD_LEN ] ;
873
- let mut packet = UdpPacket :: new_unchecked ( & mut bytes[ ..] ) ;
874
- udp_repr. emit (
875
- & mut packet,
876
- & src_addr. into ( ) ,
877
- & dst_addr. into ( ) ,
878
- PAYLOAD_LEN ,
879
- |buf| fill_slice ( buf, 0x2a ) ,
880
- & ChecksumCapabilities :: default ( ) ,
881
- ) ;
882
883
let ipv4_repr = Ipv4Repr {
883
884
src_addr,
884
885
dst_addr,
@@ -905,16 +906,63 @@ fn test_raw_socket_no_reply(#[case] medium: Medium) {
905
906
Ipv4Packet :: new_unchecked ( & bytes[ ..] )
906
907
} ;
907
908
908
- assert_eq ! (
909
- iface. inner. process_ipv4(
910
- & mut sockets,
911
- PacketMeta :: default ( ) ,
912
- HardwareAddress :: default ( ) ,
913
- & frame,
914
- & mut iface. fragments
915
- ) ,
916
- None
917
- ) ;
909
+ check_no_reply_raw_socket ( medium, & frame) ;
910
+ }
911
+
912
+ #[ rstest]
913
+ #[ case( Medium :: Ip ) ]
914
+ #[ cfg( all( feature = "socket-raw" , feature = "medium-ip" ) ) ]
915
+ #[ case( Medium :: Ethernet ) ]
916
+ #[ cfg( all( feature = "socket-raw" , feature = "medium-ethernet" ) ) ]
917
+ /// Test no reply to received TCP when using raw socket which accepts all protocols
918
+ fn test_raw_socket_no_reply_tcp ( #[ case] medium : Medium ) {
919
+ use crate :: wire:: { TcpPacket , TcpRepr } ;
920
+
921
+ let src_addr = Ipv4Address :: new ( 127 , 0 , 0 , 2 ) ;
922
+ let dst_addr = Ipv4Address :: new ( 127 , 0 , 0 , 1 ) ;
923
+
924
+ const PAYLOAD_LEN : usize = 10 ;
925
+ const PAYLOAD : [ u8 ; PAYLOAD_LEN ] = [ 0x2a ; PAYLOAD_LEN ] ;
926
+
927
+ let tcp_repr = TcpRepr {
928
+ src_port : 67 ,
929
+ dst_port : 68 ,
930
+ control : TcpControl :: Syn ,
931
+ seq_number : TcpSeqNumber ( 1 ) ,
932
+ ack_number : None ,
933
+ window_len : 10 ,
934
+ window_scale : None ,
935
+ max_seg_size : None ,
936
+ sack_permitted : false ,
937
+ sack_ranges : [ None , None , None ] ,
938
+ timestamp : None ,
939
+ payload : & PAYLOAD ,
940
+ } ;
941
+ let ipv4_repr = Ipv4Repr {
942
+ src_addr,
943
+ dst_addr,
944
+ next_header : IpProtocol :: Tcp ,
945
+ hop_limit : 64 ,
946
+ payload_len : tcp_repr. header_len ( ) + PAYLOAD_LEN ,
947
+ } ;
948
+
949
+ // Emit to frame
950
+ let mut bytes = vec ! [ 0u8 ; ipv4_repr. buffer_len( ) + tcp_repr. header_len( ) + PAYLOAD_LEN ] ;
951
+ let frame = {
952
+ ipv4_repr. emit (
953
+ & mut Ipv4Packet :: new_unchecked ( & mut bytes) ,
954
+ & ChecksumCapabilities :: default ( ) ,
955
+ ) ;
956
+ tcp_repr. emit (
957
+ & mut TcpPacket :: new_unchecked ( & mut bytes[ ipv4_repr. buffer_len ( ) ..] ) ,
958
+ & src_addr. into ( ) ,
959
+ & dst_addr. into ( ) ,
960
+ & ChecksumCapabilities :: default ( ) ,
961
+ ) ;
962
+ Ipv4Packet :: new_unchecked ( & bytes[ ..] )
963
+ } ;
964
+
965
+ check_no_reply_raw_socket ( medium, & frame) ;
918
966
}
919
967
920
968
#[ rstest]
0 commit comments