Skip to content

Commit c590a6a

Browse files
committed
Add test for no TCP reset when using TCP accepting raw socket
1 parent e000f15 commit c590a6a

File tree

1 file changed

+82
-34
lines changed

1 file changed

+82
-34
lines changed

src/iface/interface/tests/ipv4.rs

Lines changed: 82 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -835,14 +835,9 @@ fn test_packet_len(#[case] medium: Medium) {
835835
}
836836
}
837837

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]>) {
846841
let (mut iface, mut sockets, _) = setup(medium);
847842

848843
let packets = 1;
@@ -852,14 +847,30 @@ fn test_raw_socket_no_reply(#[case] medium: Medium) {
852847
vec![raw::PacketMetadata::EMPTY; packets],
853848
vec![0; 48 * packets],
854849
);
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);
861851
sockets.add(raw_socket);
862852

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+
863874
let src_addr = Ipv4Address::new(127, 0, 0, 2);
864875
let dst_addr = Ipv4Address::new(127, 0, 0, 1);
865876

@@ -869,16 +880,6 @@ fn test_raw_socket_no_reply(#[case] medium: Medium) {
869880
src_port: 67,
870881
dst_port: 68,
871882
};
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-
);
882883
let ipv4_repr = Ipv4Repr {
883884
src_addr,
884885
dst_addr,
@@ -905,16 +906,63 @@ fn test_raw_socket_no_reply(#[case] medium: Medium) {
905906
Ipv4Packet::new_unchecked(&bytes[..])
906907
};
907908

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);
918966
}
919967

920968
#[rstest]

0 commit comments

Comments
 (0)