As part of a testing framework I am creating, I am trying to convert a list of (IP) packets into a tcp stream, enabling easy mocking.
I have been trying to modify the loopback
example in smoltcp
like so, to get an initial POC:
fn main() {
env_logger::init();
let mut device = Loopback::new(Medium::Ip);
let mut iface = Interface::new(
Config::new(smoltcp::wire::HardwareAddress::Ip),
&mut device,
Instant::now(),
);
iface.update_ip_addrs(|ip_addrs| {
ip_addrs
.push(IpCidr::new(IpAddress::v4(127, 0, 0, 1), 8))
.unwrap();
});
let server_socket = tcp::Socket::new(
tcp::SocketBuffer::new(ManagedSlice::Owned(vec![0; 1024])),
tcp::SocketBuffer::new(ManagedSlice::Owned(vec![0; 1024])),
);
let client_packets = vec![
hex::decode("450000340000400040063cc27f0000017f000001fde804d277368c50000000008002040070af00000204ffd70303000402000000").unwrap(), // syn
];
let client_socket = raw::Socket::new(
smoltcp::wire::IpVersion::Ipv4,
smoltcp::wire::IpProtocol::Tcp,
raw::PacketBuffer::new(
ManagedSlice::Owned(vec![raw::PacketMetadata::EMPTY; 1024]),
ManagedSlice::Owned(vec![0; 1024]),
),
raw::PacketBuffer::new(
ManagedSlice::Owned(vec![raw::PacketMetadata::EMPTY; 1024]),
ManagedSlice::Owned(vec![0; 1024]),
),
);
let mut sockets: [_; 2] = Default::default();
let mut sockets = SocketSet::new(&mut sockets[..]);
let server_handle = sockets.add(server_socket);
let client_handle = sockets.add(client_socket);
iface.poll(Instant::now(), &mut device, &mut sockets);
let server_socket = sockets.get_mut::<tcp::Socket>(server_handle);
debug!("server listening");
server_socket.listen(1234).unwrap();
let client_socket = sockets.get_mut::<raw::Socket>(client_handle);
debug!("client connecting");
client_socket
.send_slice(client_packets[0].as_slice())
.unwrap(); // syn, for connect
iface.poll(Instant::now(), &mut device, &mut sockets);
}
The problem is that the logs show that a RST packet from the client to the server is sent after the synack (after adding logs for the packets transmitted):
server listening
client connecting
127.0.0.1:65000 => 127.0.0.1:1234 (SYN)
127.0.0.1:1234 => 127.0.0.1:65000 (SYN ACK)
127.0.0.1:65000 => 127.0.0.1:1234 (RST)
So – is this something I’m missing?
New contributor
dottoml is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.