Browse Source

cleaning up implementation

Ryan Summers 3 years ago
parent
commit
f4d4ba0f38
1 changed files with 14 additions and 37 deletions
  1. 14 37
      src/iface/interface.rs

+ 14 - 37
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<bool> {
         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)
         }
     }
 }