Skip to content

Commit 1108dd5

Browse files
committed
Add test for no TCP reset when using TCP accepting raw socket
1 parent 1510360 commit 1108dd5

File tree

1 file changed

+81
-34
lines changed

1 file changed

+81
-34
lines changed

src/iface/interface/tests/ipv4.rs

Lines changed: 81 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -835,14 +835,8 @@ 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+
fn check_no_reply_raw_socket(medium: Medium, frame: &crate::wire::ipv4::Packet<&[u8]>) {
846840
let (mut iface, mut sockets, _) = setup(medium);
847841

848842
let packets = 1;
@@ -852,14 +846,30 @@ fn test_raw_socket_no_reply(#[case] medium: Medium) {
852846
vec![raw::PacketMetadata::EMPTY; packets],
853847
vec![0; 48 * packets],
854848
);
855-
let raw_socket = raw::Socket::new(
856-
Some(IpVersion::Ipv4),
857-
Some(IpProtocol::Udp),
858-
rx_buffer,
859-
tx_buffer,
860-
);
849+
let raw_socket = raw::Socket::new(Some(IpVersion::Ipv4), None, rx_buffer, tx_buffer);
861850
sockets.add(raw_socket);
862851

852+
assert_eq!(
853+
iface.inner.process_ipv4(
854+
&mut sockets,
855+
PacketMeta::default(),
856+
HardwareAddress::default(),
857+
frame,
858+
&mut iface.fragments
859+
),
860+
None
861+
);
862+
}
863+
864+
#[rstest]
865+
#[case(Medium::Ip)]
866+
#[cfg(all(feature = "socket-raw", feature = "medium-ip"))]
867+
#[case(Medium::Ethernet)]
868+
#[cfg(all(feature = "socket-raw", feature = "medium-ethernet"))]
869+
/// Test no reply to received UDP when using raw socket which accepts all protocols
870+
fn test_raw_socket_no_reply_udp(#[case] medium: Medium) {
871+
use crate::wire::{UdpPacket, UdpRepr};
872+
863873
let src_addr = Ipv4Address::new(127, 0, 0, 2);
864874
let dst_addr = Ipv4Address::new(127, 0, 0, 1);
865875

@@ -869,16 +879,6 @@ fn test_raw_socket_no_reply(#[case] medium: Medium) {
869879
src_port: 67,
870880
dst_port: 68,
871881
};
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-
);
882882
let ipv4_repr = Ipv4Repr {
883883
src_addr,
884884
dst_addr,
@@ -905,16 +905,63 @@ fn test_raw_socket_no_reply(#[case] medium: Medium) {
905905
Ipv4Packet::new_unchecked(&bytes[..])
906906
};
907907

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-
);
908+
check_no_reply_raw_socket(medium, &frame);
909+
}
910+
911+
#[rstest]
912+
#[case(Medium::Ip)]
913+
#[cfg(all(feature = "socket-raw", feature = "medium-ip"))]
914+
#[case(Medium::Ethernet)]
915+
#[cfg(all(feature = "socket-raw", feature = "medium-ethernet"))]
916+
/// Test no reply to received TCP when using raw socket which accepts all protocols
917+
fn test_raw_socket_no_reply_tcp(#[case] medium: Medium) {
918+
use crate::wire::{TcpPacket, TcpRepr};
919+
920+
let src_addr = Ipv4Address::new(127, 0, 0, 2);
921+
let dst_addr = Ipv4Address::new(127, 0, 0, 1);
922+
923+
const PAYLOAD_LEN: usize = 10;
924+
const PAYLOAD: [u8; PAYLOAD_LEN] = [0x2a; PAYLOAD_LEN];
925+
926+
let tcp_repr = TcpRepr {
927+
src_port: 67,
928+
dst_port: 68,
929+
control: TcpControl::Syn,
930+
seq_number: TcpSeqNumber(1),
931+
ack_number: None,
932+
window_len: 10,
933+
window_scale: None,
934+
max_seg_size: None,
935+
sack_permitted: false,
936+
sack_ranges: [None, None, None],
937+
timestamp: None,
938+
payload: &PAYLOAD,
939+
};
940+
let ipv4_repr = Ipv4Repr {
941+
src_addr,
942+
dst_addr,
943+
next_header: IpProtocol::Tcp,
944+
hop_limit: 64,
945+
payload_len: tcp_repr.header_len() + PAYLOAD_LEN,
946+
};
947+
948+
// Emit to frame
949+
let mut bytes = vec![0u8; ipv4_repr.buffer_len() + tcp_repr.header_len() + PAYLOAD_LEN];
950+
let frame = {
951+
ipv4_repr.emit(
952+
&mut Ipv4Packet::new_unchecked(&mut bytes),
953+
&ChecksumCapabilities::default(),
954+
);
955+
tcp_repr.emit(
956+
&mut TcpPacket::new_unchecked(&mut bytes[ipv4_repr.buffer_len()..]),
957+
&src_addr.into(),
958+
&dst_addr.into(),
959+
&ChecksumCapabilities::default(),
960+
);
961+
Ipv4Packet::new_unchecked(&bytes[..])
962+
};
963+
964+
check_no_reply_raw_socket(medium, &frame);
918965
}
919966

920967
#[rstest]

0 commit comments

Comments
 (0)