Get rid of unused arguments in Socket::{process,dispatch}.

I've left those "for consistency" but it just implies data
dependencies where there are none, and bloats signatures.
This commit is contained in:
whitequark 2017-08-28 04:09:17 +00:00
parent 760174048d
commit 379bc60924
5 changed files with 30 additions and 45 deletions

View File

@ -203,8 +203,7 @@ impl<'a, 'b, 'c, DeviceT: Device + 'a> Interface<'a, 'b, 'c, DeviceT> {
let mut handled_by_raw_socket = false; let mut handled_by_raw_socket = false;
for raw_socket in sockets.iter_mut().filter_map( for raw_socket in sockets.iter_mut().filter_map(
<Socket as AsSocket<RawSocket>>::try_as_socket) { <Socket as AsSocket<RawSocket>>::try_as_socket) {
match raw_socket.process(timestamp, &IpRepr::Ipv4(ipv4_repr), match raw_socket.process(&ipv4_repr.into(), ipv4_packet.payload()) {
ipv4_packet.payload()) {
// The packet is valid and handled by socket. // The packet is valid and handled by socket.
Ok(()) => handled_by_raw_socket = true, Ok(()) => handled_by_raw_socket = true,
// The packet isn't addressed to the socket, or cannot be accepted by it. // The packet isn't addressed to the socket, or cannot be accepted by it.
@ -223,7 +222,7 @@ impl<'a, 'b, 'c, DeviceT: Device + 'a> Interface<'a, 'b, 'c, DeviceT> {
IpProtocol::Icmp => IpProtocol::Icmp =>
Self::process_icmpv4(ipv4_repr, ipv4_packet.payload()), Self::process_icmpv4(ipv4_repr, ipv4_packet.payload()),
IpProtocol::Udp => IpProtocol::Udp =>
Self::process_udpv4(sockets, timestamp, ipv4_repr, ipv4_packet.payload()), Self::process_udpv4(sockets, ipv4_repr, ipv4_packet.payload()),
IpProtocol::Tcp => IpProtocol::Tcp =>
Self::process_tcp(sockets, timestamp, ipv4_repr.into(), ipv4_packet.payload()), Self::process_tcp(sockets, timestamp, ipv4_repr.into(), ipv4_packet.payload()),
_ if handled_by_raw_socket => _ if handled_by_raw_socket =>
@ -277,14 +276,14 @@ impl<'a, 'b, 'c, DeviceT: Device + 'a> Interface<'a, 'b, 'c, DeviceT> {
} }
} }
fn process_udpv4<'frame>(sockets: &mut SocketSet, timestamp: u64, fn process_udpv4<'frame>(sockets: &mut SocketSet,
ipv4_repr: Ipv4Repr, ip_payload: &'frame [u8]) -> ipv4_repr: Ipv4Repr, ip_payload: &'frame [u8]) ->
Result<Response<'frame>> { Result<Response<'frame>> {
let ip_repr = IpRepr::Ipv4(ipv4_repr); let ip_repr = IpRepr::Ipv4(ipv4_repr);
for udp_socket in sockets.iter_mut().filter_map( for udp_socket in sockets.iter_mut().filter_map(
<Socket as AsSocket<UdpSocket>>::try_as_socket) { <Socket as AsSocket<UdpSocket>>::try_as_socket) {
match udp_socket.process(timestamp, &ip_repr, ip_payload) { match udp_socket.process(&ip_repr, ip_payload) {
// The packet is valid and handled by socket. // The packet is valid and handled by socket.
Ok(()) => return Ok(Response::Nop), Ok(()) => return Ok(Response::Nop),
// The packet isn't addressed to the socket. // The packet isn't addressed to the socket.
@ -344,10 +343,10 @@ impl<'a, 'b, 'c, DeviceT: Device + 'a> Interface<'a, 'b, 'c, DeviceT> {
for socket in sockets.iter_mut() { for socket in sockets.iter_mut() {
let result = match socket { let result = match socket {
&mut Socket::Raw(ref mut socket) => &mut Socket::Raw(ref mut socket) =>
socket.dispatch(timestamp, &limits, |response| socket.dispatch(|response|
self.dispatch_response(timestamp, Response::Raw(response))), self.dispatch_response(timestamp, Response::Raw(response))),
&mut Socket::Udp(ref mut socket) => &mut Socket::Udp(ref mut socket) =>
socket.dispatch(timestamp, &limits, |response| socket.dispatch(|response|
self.dispatch_response(timestamp, Response::Udp(response))), self.dispatch_response(timestamp, Response::Udp(response))),
&mut Socket::Tcp(ref mut socket) => &mut Socket::Tcp(ref mut socket) =>
socket.dispatch(timestamp, &limits, |response| socket.dispatch(timestamp, &limits, |response|

View File

@ -10,8 +10,6 @@
//! The interface implemented by this module uses explicit buffering: you decide on the good //! The interface implemented by this module uses explicit buffering: you decide on the good
//! size for a buffer, allocate it, and let the networking stack use it. //! size for a buffer, allocate it, and let the networking stack use it.
use Result;
use phy::DeviceLimits;
use wire::IpRepr; use wire::IpRepr;
mod raw; mod raw;

View File

@ -2,7 +2,6 @@ use core::cmp::min;
use managed::Managed; use managed::Managed;
use {Error, Result}; use {Error, Result};
use phy::DeviceLimits;
use wire::{IpVersion, IpProtocol, Ipv4Repr, Ipv4Packet}; use wire::{IpVersion, IpProtocol, Ipv4Repr, Ipv4Packet};
use socket::{IpRepr, Socket}; use socket::{IpRepr, Socket};
use storage::{Resettable, RingBuffer}; use storage::{Resettable, RingBuffer};
@ -167,8 +166,7 @@ impl<'a, 'b> RawSocket<'a, 'b> {
Ok(length) Ok(length)
} }
pub(crate) fn process(&mut self, _timestamp: u64, ip_repr: &IpRepr, pub(crate) fn process(&mut self, ip_repr: &IpRepr, payload: &[u8]) -> Result<()> {
payload: &[u8]) -> Result<()> {
if ip_repr.version() != self.ip_version { return Err(Error::Rejected) } if ip_repr.version() != self.ip_version { return Err(Error::Rejected) }
if ip_repr.protocol() != self.ip_protocol { return Err(Error::Rejected) } if ip_repr.protocol() != self.ip_protocol { return Err(Error::Rejected) }
@ -183,8 +181,7 @@ impl<'a, 'b> RawSocket<'a, 'b> {
Ok(()) Ok(())
} }
pub(crate) fn dispatch<F>(&mut self, _timestamp: u64, _limits: &DeviceLimits, pub(crate) fn dispatch<F>(&mut self, emit: F) -> Result<()>
emit: F) -> Result<()>
where F: FnOnce((IpRepr, &[u8])) -> Result<()> { where F: FnOnce((IpRepr, &[u8])) -> Result<()> {
fn prepare(protocol: IpProtocol, buffer: &mut [u8]) -> Result<(IpRepr, &[u8])> { fn prepare(protocol: IpProtocol, buffer: &mut [u8]) -> Result<(IpRepr, &[u8])> {
match IpVersion::of_packet(buffer.as_ref())? { match IpVersion::of_packet(buffer.as_ref())? {
@ -273,26 +270,24 @@ mod test {
#[test] #[test]
fn test_send_dispatch() { fn test_send_dispatch() {
let limits = DeviceLimits::default();
let mut socket = socket(buffer(0), buffer(1)); let mut socket = socket(buffer(0), buffer(1));
assert!(socket.can_send()); assert!(socket.can_send());
assert_eq!(socket.dispatch(0, &limits, |_| unreachable!()), assert_eq!(socket.dispatch(|_| unreachable!()),
Err(Error::Exhausted)); Err(Error::Exhausted));
assert_eq!(socket.send_slice(&PACKET_BYTES[..]), Ok(())); assert_eq!(socket.send_slice(&PACKET_BYTES[..]), Ok(()));
assert_eq!(socket.send_slice(b""), Err(Error::Exhausted)); assert_eq!(socket.send_slice(b""), Err(Error::Exhausted));
assert!(!socket.can_send()); assert!(!socket.can_send());
assert_eq!(socket.dispatch(0, &limits, |(ip_repr, ip_payload)| { assert_eq!(socket.dispatch(|(ip_repr, ip_payload)| {
assert_eq!(ip_repr, HEADER_REPR); assert_eq!(ip_repr, HEADER_REPR);
assert_eq!(ip_payload, &PACKET_PAYLOAD); assert_eq!(ip_payload, &PACKET_PAYLOAD);
Err(Error::Unaddressable) Err(Error::Unaddressable)
}), Err(Error::Unaddressable)); }), Err(Error::Unaddressable));
/*assert!(!socket.can_send());*/ /*assert!(!socket.can_send());*/
assert_eq!(socket.dispatch(0, &limits, |(ip_repr, ip_payload)| { assert_eq!(socket.dispatch(|(ip_repr, ip_payload)| {
assert_eq!(ip_repr, HEADER_REPR); assert_eq!(ip_repr, HEADER_REPR);
assert_eq!(ip_payload, &PACKET_PAYLOAD); assert_eq!(ip_payload, &PACKET_PAYLOAD);
Ok(()) Ok(())
@ -302,22 +297,20 @@ mod test {
#[test] #[test]
fn test_send_illegal() { fn test_send_illegal() {
let limits = DeviceLimits::default();
let mut socket = socket(buffer(0), buffer(1)); let mut socket = socket(buffer(0), buffer(1));
let mut wrong_version = PACKET_BYTES.clone(); let mut wrong_version = PACKET_BYTES.clone();
Ipv4Packet::new(&mut wrong_version).set_version(5); Ipv4Packet::new(&mut wrong_version).set_version(5);
assert_eq!(socket.send_slice(&wrong_version[..]), Ok(())); assert_eq!(socket.send_slice(&wrong_version[..]), Ok(()));
assert_eq!(socket.dispatch(0, &limits, |_| unreachable!()), assert_eq!(socket.dispatch(|_| unreachable!()),
Err(Error::Rejected)); Err(Error::Rejected));
let mut wrong_protocol = PACKET_BYTES.clone(); let mut wrong_protocol = PACKET_BYTES.clone();
Ipv4Packet::new(&mut wrong_protocol).set_protocol(IpProtocol::Tcp); Ipv4Packet::new(&mut wrong_protocol).set_protocol(IpProtocol::Tcp);
assert_eq!(socket.send_slice(&wrong_protocol[..]), Ok(())); assert_eq!(socket.send_slice(&wrong_protocol[..]), Ok(()));
assert_eq!(socket.dispatch(0, &limits, |_| unreachable!()), assert_eq!(socket.dispatch(|_| unreachable!()),
Err(Error::Rejected)); Err(Error::Rejected));
} }
@ -330,11 +323,11 @@ mod test {
Ipv4Packet::new(&mut cksumd_packet).fill_checksum(); Ipv4Packet::new(&mut cksumd_packet).fill_checksum();
assert_eq!(socket.recv(), Err(Error::Exhausted)); assert_eq!(socket.recv(), Err(Error::Exhausted));
assert_eq!(socket.process(0, &HEADER_REPR, &PACKET_PAYLOAD), assert_eq!(socket.process(&HEADER_REPR, &PACKET_PAYLOAD),
Ok(())); Ok(()));
assert!(socket.can_recv()); assert!(socket.can_recv());
assert_eq!(socket.process(0, &HEADER_REPR, &PACKET_PAYLOAD), assert_eq!(socket.process(&HEADER_REPR, &PACKET_PAYLOAD),
Err(Error::Exhausted)); Err(Error::Exhausted));
assert_eq!(socket.recv(), Ok(&cksumd_packet[..])); assert_eq!(socket.recv(), Ok(&cksumd_packet[..]));
assert!(!socket.can_recv()); assert!(!socket.can_recv());
@ -344,7 +337,7 @@ mod test {
fn test_recv_truncated_slice() { fn test_recv_truncated_slice() {
let mut socket = socket(buffer(1), buffer(0)); let mut socket = socket(buffer(1), buffer(0));
assert_eq!(socket.process(0, &HEADER_REPR, &PACKET_PAYLOAD), assert_eq!(socket.process(&HEADER_REPR, &PACKET_PAYLOAD),
Ok(())); Ok(()));
let mut slice = [0; 4]; let mut slice = [0; 4];
@ -359,7 +352,7 @@ mod test {
let mut buffer = vec![0; 128]; let mut buffer = vec![0; 128];
buffer[..PACKET_BYTES.len()].copy_from_slice(&PACKET_BYTES[..]); buffer[..PACKET_BYTES.len()].copy_from_slice(&PACKET_BYTES[..]);
assert_eq!(socket.process(0, &HEADER_REPR, &buffer), assert_eq!(socket.process(&HEADER_REPR, &buffer),
Err(Error::Truncated)); Err(Error::Truncated));
} }
} }

View File

@ -729,7 +729,7 @@ impl<'a> TcpSocket<'a> {
} }
pub(crate) fn ack_reply(&self, ip_repr: &IpRepr, repr: &TcpRepr) -> pub(crate) fn ack_reply(&self, ip_repr: &IpRepr, repr: &TcpRepr) ->
(IpRepr, TcpRepr<'static>) { (IpRepr, TcpRepr<'static>) {
let (ip_reply_repr, mut reply_repr) = Self::reply(ip_repr, repr); let (ip_reply_repr, mut reply_repr) = Self::reply(ip_repr, repr);
// From RFC793: // From RFC793:
@ -743,8 +743,8 @@ impl<'a> TcpSocket<'a> {
(ip_reply_repr, reply_repr) (ip_reply_repr, reply_repr)
} }
pub(crate) fn process(&mut self, timestamp: u64, ip_repr: &IpRepr, pub(crate) fn process(&mut self, timestamp: u64, ip_repr: &IpRepr, payload: &[u8]) ->
payload: &[u8]) -> Result<Option<(IpRepr, TcpRepr<'static>)>> { Result<Option<(IpRepr, TcpRepr<'static>)>> {
debug_assert!(ip_repr.protocol() == IpProtocol::Tcp); debug_assert!(ip_repr.protocol() == IpProtocol::Tcp);
if self.state == State::Closed { return Err(Error::Rejected) } if self.state == State::Closed { return Err(Error::Rejected) }
@ -1355,7 +1355,7 @@ mod test {
}; };
fn send(socket: &mut TcpSocket, timestamp: u64, repr: &TcpRepr) -> fn send(socket: &mut TcpSocket, timestamp: u64, repr: &TcpRepr) ->
Result<Option<TcpRepr<'static>>> { Result<Option<TcpRepr<'static>>> {
trace!("send: {}", repr); trace!("send: {}", repr);
let mut buffer = vec![0; repr.buffer_len()]; let mut buffer = vec![0; repr.buffer_len()];
let mut packet = TcpPacket::new(&mut buffer); let mut packet = TcpPacket::new(&mut buffer);

View File

@ -2,7 +2,6 @@ use core::cmp::min;
use managed::Managed; use managed::Managed;
use {Error, Result}; use {Error, Result};
use phy::DeviceLimits;
use wire::{IpProtocol, IpEndpoint}; use wire::{IpProtocol, IpEndpoint};
use wire::{UdpPacket, UdpRepr}; use wire::{UdpPacket, UdpRepr};
use socket::{Socket, IpRepr}; use socket::{Socket, IpRepr};
@ -181,8 +180,7 @@ impl<'a, 'b> UdpSocket<'a, 'b> {
Ok((length, endpoint)) Ok((length, endpoint))
} }
pub(crate) fn process(&mut self, _timestamp: u64, ip_repr: &IpRepr, pub(crate) fn process(&mut self, ip_repr: &IpRepr, payload: &[u8]) -> Result<()> {
payload: &[u8]) -> Result<()> {
debug_assert!(ip_repr.protocol() == IpProtocol::Udp); debug_assert!(ip_repr.protocol() == IpProtocol::Udp);
let packet = UdpPacket::new_checked(&payload[..ip_repr.payload_len()])?; let packet = UdpPacket::new_checked(&payload[..ip_repr.payload_len()])?;
@ -202,8 +200,7 @@ impl<'a, 'b> UdpSocket<'a, 'b> {
Ok(()) Ok(())
} }
pub(crate) fn dispatch<F>(&mut self, _timestamp: u64, _limits: &DeviceLimits, pub(crate) fn dispatch<F>(&mut self, emit: F) -> Result<()>
emit: F) -> Result<()>
where F: FnOnce((IpRepr, UdpRepr)) -> Result<()> { where F: FnOnce((IpRepr, UdpRepr)) -> Result<()> {
let packet_buf = self.tx_buffer.dequeue()?; let packet_buf = self.tx_buffer.dequeue()?;
net_trace!("[{}]{}:{}: sending {} octets", net_trace!("[{}]{}:{}: sending {} octets",
@ -303,27 +300,25 @@ mod test {
#[test] #[test]
fn test_send_dispatch() { fn test_send_dispatch() {
let limits = DeviceLimits::default();
let mut socket = socket(buffer(0), buffer(1)); let mut socket = socket(buffer(0), buffer(1));
assert_eq!(socket.bind(LOCAL_END), Ok(())); assert_eq!(socket.bind(LOCAL_END), Ok(()));
assert!(socket.can_send()); assert!(socket.can_send());
assert_eq!(socket.dispatch(0, &limits, |_| unreachable!()), assert_eq!(socket.dispatch(|_| unreachable!()),
Err(Error::Exhausted)); Err(Error::Exhausted));
assert_eq!(socket.send_slice(b"abcdef", REMOTE_END), Ok(())); assert_eq!(socket.send_slice(b"abcdef", REMOTE_END), Ok(()));
assert_eq!(socket.send_slice(b"123456", REMOTE_END), Err(Error::Exhausted)); assert_eq!(socket.send_slice(b"123456", REMOTE_END), Err(Error::Exhausted));
assert!(!socket.can_send()); assert!(!socket.can_send());
assert_eq!(socket.dispatch(0, &limits, |(ip_repr, udp_repr)| { assert_eq!(socket.dispatch(|(ip_repr, udp_repr)| {
assert_eq!(ip_repr, LOCAL_IP_REPR); assert_eq!(ip_repr, LOCAL_IP_REPR);
assert_eq!(udp_repr, LOCAL_UDP_REPR); assert_eq!(udp_repr, LOCAL_UDP_REPR);
Err(Error::Unaddressable) Err(Error::Unaddressable)
}), Err(Error::Unaddressable)); }), Err(Error::Unaddressable));
/*assert!(!socket.can_send());*/ /*assert!(!socket.can_send());*/
assert_eq!(socket.dispatch(0, &limits, |(ip_repr, udp_repr)| { assert_eq!(socket.dispatch(|(ip_repr, udp_repr)| {
assert_eq!(ip_repr, LOCAL_IP_REPR); assert_eq!(ip_repr, LOCAL_IP_REPR);
assert_eq!(udp_repr, LOCAL_UDP_REPR); assert_eq!(udp_repr, LOCAL_UDP_REPR);
Ok(()) Ok(())
@ -354,11 +349,11 @@ mod test {
assert!(!socket.can_recv()); assert!(!socket.can_recv());
assert_eq!(socket.recv(), Err(Error::Exhausted)); assert_eq!(socket.recv(), Err(Error::Exhausted));
assert_eq!(socket.process(0, &REMOTE_IP_REPR, &buffer), assert_eq!(socket.process(&REMOTE_IP_REPR, &buffer),
Ok(())); Ok(()));
assert!(socket.can_recv()); assert!(socket.can_recv());
assert_eq!(socket.process(0, &REMOTE_IP_REPR, &buffer), assert_eq!(socket.process(&REMOTE_IP_REPR, &buffer),
Err(Error::Exhausted)); Err(Error::Exhausted));
assert_eq!(socket.recv(), Ok((&b"abcdef"[..], REMOTE_END))); assert_eq!(socket.recv(), Ok((&b"abcdef"[..], REMOTE_END)));
assert!(!socket.can_recv()); assert!(!socket.can_recv());
@ -371,7 +366,7 @@ mod test {
let mut buffer = vec![0; REMOTE_UDP_REPR.buffer_len()]; let mut buffer = vec![0; REMOTE_UDP_REPR.buffer_len()];
REMOTE_UDP_REPR.emit(&mut UdpPacket::new(&mut buffer), &LOCAL_IP, &REMOTE_IP); REMOTE_UDP_REPR.emit(&mut UdpPacket::new(&mut buffer), &LOCAL_IP, &REMOTE_IP);
assert_eq!(socket.process(0, &REMOTE_IP_REPR, &buffer), Ok(())); assert_eq!(socket.process(&REMOTE_IP_REPR, &buffer), Ok(()));
let mut slice = [0; 4]; let mut slice = [0; 4];
assert_eq!(socket.recv_slice(&mut slice[..]), Ok((4, REMOTE_END))); assert_eq!(socket.recv_slice(&mut slice[..]), Ok((4, REMOTE_END)));
@ -386,7 +381,7 @@ mod test {
let udp_repr = UdpRepr { payload: &[0; 100][..], ..REMOTE_UDP_REPR }; let udp_repr = UdpRepr { payload: &[0; 100][..], ..REMOTE_UDP_REPR };
let mut buffer = vec![0; udp_repr.buffer_len()]; let mut buffer = vec![0; udp_repr.buffer_len()];
udp_repr.emit(&mut UdpPacket::new(&mut buffer), &LOCAL_IP, &REMOTE_IP); udp_repr.emit(&mut UdpPacket::new(&mut buffer), &LOCAL_IP, &REMOTE_IP);
assert_eq!(socket.process(0, &REMOTE_IP_REPR, &buffer), assert_eq!(socket.process(&REMOTE_IP_REPR, &buffer),
Err(Error::Truncated)); Err(Error::Truncated));
} }
} }