diff --git a/src/iface/interface.rs b/src/iface/interface.rs index 1b3ef3e..b8c73d1 100644 --- a/src/iface/interface.rs +++ b/src/iface/interface.rs @@ -538,12 +538,12 @@ impl<'a, DeviceT> Interface<'a, DeviceT> let mut readiness_may_have_changed = false; loop { let processed_any = self.socket_ingress(sockets, timestamp); - let emitted_any = self.socket_egress(sockets, timestamp); + let emitted_any = self.socket_egress(sockets, timestamp)?; #[cfg(feature = "proto-igmp")] - self.igmp_egress(timestamp); + self.igmp_egress(timestamp)?; - if processed_any || emitted_any? { + if processed_any || emitted_any { readiness_may_have_changed = true; } else { break @@ -657,15 +657,11 @@ impl<'a, DeviceT> Interface<'a, DeviceT> let mut device_result = Ok(()); let &mut Self { ref mut device, ref mut inner } = self; - let tx_token = match device.transmit() { - Some(token) => token, - None => break, - }; - macro_rules! respond { ($response:expr) => ({ let response = $response; neighbor_addr = Some(response.ip_repr().dst_addr()); + let tx_token = device.transmit().ok_or(Error::Exhausted)?; device_result = inner.dispatch_ip(tx_token, timestamp, response); device_result }) @@ -695,7 +691,7 @@ impl<'a, DeviceT> Interface<'a, DeviceT> #[cfg(feature = "proto-ipv6")] (IpRepr::Ipv6(ipv6_repr), IcmpRepr::Ipv6(icmpv6_repr)) => respond!(IpPacket::Icmpv6((ipv6_repr, icmpv6_repr))), - _ => Err(Error::Unaddressable), + _ => Err(Error::Unaddressable) } }), #[cfg(feature = "socket-udp")] @@ -740,27 +736,18 @@ impl<'a, DeviceT> Interface<'a, DeviceT> /// Depending on `igmp_report_state` and the therein contained /// timeouts, send IGMP membership reports. #[cfg(feature = "proto-igmp")] - fn igmp_egress(&mut self, timestamp: Instant) -> bool { + fn igmp_egress(&mut self, timestamp: Instant) -> Result { match self.inner.igmp_report_state { IgmpReportState::ToSpecificQuery { version, timeout, group } if timestamp >= timeout => { if let Some(pkt) = self.inner.igmp_report_packet(version, group) { // Send initial membership report - let tx_token = match self.device.transmit() { - Some(token) => token, - None => { - net_debug!("IGMP egress failure: Exhausted"); - return false - } - }; - match self.inner.dispatch_ip(tx_token, timestamp, pkt) { - Err(err) => net_debug!("Failed to egress IGMP: {}", err), - _ => {}, - }; + let tx_token = self.device.transmit().ok_or(Error::Exhausted)?; + self.inner.dispatch_ip(tx_token, timestamp, pkt)?; } self.inner.igmp_report_state = IgmpReportState::Inactive; - true + Ok(true) } IgmpReportState::ToGeneralQuery { version, timeout, interval, next_index } if timestamp >= timeout => { @@ -773,34 +760,24 @@ impl<'a, DeviceT> Interface<'a, DeviceT> Some(addr) => { if let Some(pkt) = self.inner.igmp_report_packet(version, addr) { // Send initial membership report - let tx_token = match self.device.transmit() { - Some(token) => token, - None => { - net_debug!("IGMP egress failure: Exhausted"); - return false - } - }; - - match self.inner.dispatch_ip(tx_token, timestamp, pkt) { - Err(err) => net_debug!("Failed to egress IGMP: {}", err), - _ => {}, - }; + let tx_token = self.device.transmit().ok_or(Error::Exhausted)?; + self.inner.dispatch_ip(tx_token, timestamp, pkt)?; } let next_timeout = (timeout + interval).max(timestamp); self.inner.igmp_report_state = IgmpReportState::ToGeneralQuery { version, timeout: next_timeout, interval, next_index: next_index + 1 }; - true + Ok(true) } None => { self.inner.igmp_report_state = IgmpReportState::Inactive; - false + Ok(false) } } } - _ => false + _ => Ok(false) } } }