@@ -871,14 +871,9 @@ fn test_packet_len(#[case] medium: Medium) {
871871 }
872872}
873873
874- #[ rstest]
875- #[ case( Medium :: Ip ) ]
876- #[ cfg( all( feature = "socket-raw" , feature = "medium-ip" ) ) ]
877- #[ case( Medium :: Ethernet ) ]
878- #[ cfg( all( feature = "socket-raw" , feature = "medium-ethernet" ) ) ]
879- fn test_raw_socket_no_reply ( #[ case] medium : Medium ) {
880- use crate :: wire:: { IpVersion , UdpPacket , UdpRepr } ;
881-
874+ /// Check no reply is emitted when using a raw socket
875+ #[ cfg( feature = "socket-raw" ) ]
876+ fn check_no_reply_raw_socket ( medium : Medium , frame : & crate :: wire:: ipv4:: Packet < & [ u8 ] > ) {
882877 let ( mut iface, mut sockets, _) = setup ( medium) ;
883878
884879 let packets = 1 ;
@@ -888,14 +883,30 @@ fn test_raw_socket_no_reply(#[case] medium: Medium) {
888883 vec ! [ raw:: PacketMetadata :: EMPTY ; packets] ,
889884 vec ! [ 0 ; 48 * packets] ,
890885 ) ;
891- let raw_socket = raw:: Socket :: new (
892- Some ( IpVersion :: Ipv4 ) ,
893- Some ( IpProtocol :: Udp ) ,
894- rx_buffer,
895- tx_buffer,
896- ) ;
886+ let raw_socket = raw:: Socket :: new ( Some ( IpVersion :: Ipv4 ) , None , rx_buffer, tx_buffer) ;
897887 sockets. add ( raw_socket) ;
898888
889+ assert_eq ! (
890+ iface. inner. process_ipv4(
891+ & mut sockets,
892+ PacketMeta :: default ( ) ,
893+ HardwareAddress :: default ( ) ,
894+ frame,
895+ & mut iface. fragments
896+ ) ,
897+ None
898+ ) ;
899+ }
900+
901+ #[ rstest]
902+ #[ case( Medium :: Ip ) ]
903+ #[ cfg( all( feature = "socket-raw" , feature = "medium-ip" ) ) ]
904+ #[ case( Medium :: Ethernet ) ]
905+ #[ cfg( all( feature = "socket-raw" , feature = "medium-ethernet" ) ) ]
906+ /// Test no reply to received UDP when using raw socket which accepts all protocols
907+ fn test_raw_socket_no_reply_udp ( #[ case] medium : Medium ) {
908+ use crate :: wire:: { UdpPacket , UdpRepr } ;
909+
899910 let src_addr = Ipv4Address :: new ( 127 , 0 , 0 , 2 ) ;
900911 let dst_addr = Ipv4Address :: new ( 127 , 0 , 0 , 1 ) ;
901912
@@ -905,16 +916,6 @@ fn test_raw_socket_no_reply(#[case] medium: Medium) {
905916 src_port : 67 ,
906917 dst_port : 68 ,
907918 } ;
908- let mut bytes = vec ! [ 0xff ; udp_repr. header_len( ) + PAYLOAD_LEN ] ;
909- let mut packet = UdpPacket :: new_unchecked ( & mut bytes[ ..] ) ;
910- udp_repr. emit (
911- & mut packet,
912- & src_addr. into ( ) ,
913- & dst_addr. into ( ) ,
914- PAYLOAD_LEN ,
915- |buf| fill_slice ( buf, 0x2a ) ,
916- & ChecksumCapabilities :: default ( ) ,
917- ) ;
918919 let ipv4_repr = Ipv4Repr {
919920 src_addr,
920921 dst_addr,
@@ -941,16 +942,63 @@ fn test_raw_socket_no_reply(#[case] medium: Medium) {
941942 Ipv4Packet :: new_unchecked ( & bytes[ ..] )
942943 } ;
943944
944- assert_eq ! (
945- iface. inner. process_ipv4(
946- & mut sockets,
947- PacketMeta :: default ( ) ,
948- HardwareAddress :: default ( ) ,
949- & frame,
950- & mut iface. fragments
951- ) ,
952- None
953- ) ;
945+ check_no_reply_raw_socket ( medium, & frame) ;
946+ }
947+
948+ #[ rstest]
949+ #[ case( Medium :: Ip ) ]
950+ #[ cfg( all( feature = "socket-raw" , feature = "medium-ip" ) ) ]
951+ #[ case( Medium :: Ethernet ) ]
952+ #[ cfg( all( feature = "socket-raw" , feature = "medium-ethernet" ) ) ]
953+ /// Test no reply to received TCP when using raw socket which accepts all protocols
954+ fn test_raw_socket_no_reply_tcp ( #[ case] medium : Medium ) {
955+ use crate :: wire:: { TcpPacket , TcpRepr } ;
956+
957+ let src_addr = Ipv4Address :: new ( 127 , 0 , 0 , 2 ) ;
958+ let dst_addr = Ipv4Address :: new ( 127 , 0 , 0 , 1 ) ;
959+
960+ const PAYLOAD_LEN : usize = 10 ;
961+ const PAYLOAD : [ u8 ; PAYLOAD_LEN ] = [ 0x2a ; PAYLOAD_LEN ] ;
962+
963+ let tcp_repr = TcpRepr {
964+ src_port : 67 ,
965+ dst_port : 68 ,
966+ control : TcpControl :: Syn ,
967+ seq_number : TcpSeqNumber ( 1 ) ,
968+ ack_number : None ,
969+ window_len : 10 ,
970+ window_scale : None ,
971+ max_seg_size : None ,
972+ sack_permitted : false ,
973+ sack_ranges : [ None , None , None ] ,
974+ timestamp : None ,
975+ payload : & PAYLOAD ,
976+ } ;
977+ let ipv4_repr = Ipv4Repr {
978+ src_addr,
979+ dst_addr,
980+ next_header : IpProtocol :: Tcp ,
981+ hop_limit : 64 ,
982+ payload_len : tcp_repr. header_len ( ) + PAYLOAD_LEN ,
983+ } ;
984+
985+ // Emit to frame
986+ let mut bytes = vec ! [ 0u8 ; ipv4_repr. buffer_len( ) + tcp_repr. header_len( ) + PAYLOAD_LEN ] ;
987+ let frame = {
988+ ipv4_repr. emit (
989+ & mut Ipv4Packet :: new_unchecked ( & mut bytes) ,
990+ & ChecksumCapabilities :: default ( ) ,
991+ ) ;
992+ tcp_repr. emit (
993+ & mut TcpPacket :: new_unchecked ( & mut bytes[ ipv4_repr. buffer_len ( ) ..] ) ,
994+ & src_addr. into ( ) ,
995+ & dst_addr. into ( ) ,
996+ & ChecksumCapabilities :: default ( ) ,
997+ ) ;
998+ Ipv4Packet :: new_unchecked ( & bytes[ ..] )
999+ } ;
1000+
1001+ check_no_reply_raw_socket ( medium, & frame) ;
9541002}
9551003
9561004#[ rstest]
0 commit comments