Procházet zdrojové kódy

iface: make socket_egress infallible.

Dario Nieuwenhuis před 2 roky
rodič
revize
2841d5ef4a
1 změnil soubory, kde provedl 23 přidání a 29 odebrání
  1. 23 29
      src/iface/interface.rs

+ 23 - 29
src/iface/interface.rs

@@ -773,7 +773,7 @@ where
         let mut readiness_may_have_changed = false;
         loop {
             let processed_any = self.socket_ingress();
-            let emitted_any = self.socket_egress()?;
+            let emitted_any = self.socket_egress();
 
             #[cfg(feature = "proto-igmp")]
             self.igmp_egress()?;
@@ -880,7 +880,7 @@ where
         processed_any
     }
 
-    fn socket_egress(&mut self) -> Result<bool> {
+    fn socket_egress(&mut self) -> bool {
         let Self {
             device,
             inner,
@@ -899,58 +899,53 @@ where
             }
 
             let mut neighbor_addr = None;
-            let mut device_result = Ok(());
-
-            macro_rules! respond {
-                ($inner:expr, $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, response);
-                    device_result
-                }};
-            }
+            let mut respond = |inner: &mut InterfaceInner, response: IpPacket| {
+                neighbor_addr = Some(response.ip_repr().dst_addr());
+                let tx_token = device.transmit().ok_or(Error::Exhausted)?;
+                inner.dispatch_ip(tx_token, response)?;
+                emitted_any = true;
+                Ok(())
+            };
 
-            let socket_result = match &mut item.socket {
+            let result = match &mut item.socket {
                 #[cfg(feature = "socket-raw")]
                 Socket::Raw(socket) => socket.dispatch(inner, |inner, response| {
-                    respond!(inner, IpPacket::Raw(response))
+                    respond(inner, IpPacket::Raw(response))
                 }),
                 #[cfg(feature = "socket-icmp")]
                 Socket::Icmp(socket) => socket.dispatch(inner, |inner, response| match response {
                     #[cfg(feature = "proto-ipv4")]
                     (IpRepr::Ipv4(ipv4_repr), IcmpRepr::Ipv4(icmpv4_repr)) => {
-                        respond!(inner, IpPacket::Icmpv4((ipv4_repr, icmpv4_repr)))
+                        respond(inner, IpPacket::Icmpv4((ipv4_repr, icmpv4_repr)))
                     }
                     #[cfg(feature = "proto-ipv6")]
                     (IpRepr::Ipv6(ipv6_repr), IcmpRepr::Ipv6(icmpv6_repr)) => {
-                        respond!(inner, IpPacket::Icmpv6((ipv6_repr, icmpv6_repr)))
+                        respond(inner, IpPacket::Icmpv6((ipv6_repr, icmpv6_repr)))
                     }
                     #[allow(unreachable_patterns)]
                     _ => unreachable!(),
                 }),
                 #[cfg(feature = "socket-udp")]
                 Socket::Udp(socket) => socket.dispatch(inner, |inner, response| {
-                    respond!(inner, IpPacket::Udp(response))
+                    respond(inner, IpPacket::Udp(response))
                 }),
                 #[cfg(feature = "socket-tcp")]
                 Socket::Tcp(socket) => socket.dispatch(inner, |inner, response| {
-                    respond!(inner, IpPacket::Tcp(response))
+                    respond(inner, IpPacket::Tcp(response))
                 }),
                 #[cfg(feature = "socket-dhcpv4")]
                 Socket::Dhcpv4(socket) => socket.dispatch(inner, |inner, response| {
-                    respond!(inner, IpPacket::Dhcpv4(response))
+                    respond(inner, IpPacket::Dhcpv4(response))
                 }),
                 #[cfg(feature = "socket-dns")]
                 Socket::Dns(ref mut socket) => socket.dispatch(inner, |inner, response| {
-                    respond!(inner, IpPacket::Udp(response))
+                    respond(inner, IpPacket::Udp(response))
                 }),
             };
 
-            match (device_result, socket_result) {
-                (Err(Error::Exhausted), _) => break,   // nowhere to transmit
-                (Ok(()), Err(Error::Exhausted)) => (), // nothing to transmit
-                (Err(Error::Unaddressable), _) => {
+            match result {
+                Err(Error::Exhausted) => break, // Device buffer full.
+                Err(Error::Unaddressable) => {
                     // `NeighborCache` already takes care of rate limiting the neighbor discovery
                     // requests from the socket. However, without an additional rate limiting
                     // mechanism, we would spin on every socket that has yet to discover its
@@ -961,18 +956,17 @@ where
                     );
                     break;
                 }
-                (Err(err), _) | (_, Err(err)) => {
+                Err(err) => {
                     net_debug!(
                         "{}: cannot dispatch egress packet: {}",
                         item.meta.handle,
                         err
                     );
-                    return Err(err);
                 }
-                (Ok(()), Ok(())) => emitted_any = true,
+                Ok(()) => {}
             }
         }
-        Ok(emitted_any)
+        emitted_any
     }
 
     /// Depending on `igmp_report_state` and the therein contained