Browse Source

Fix autoselection of source address.

whitequark 8 years ago
parent
commit
7aac50db22
1 changed files with 7 additions and 9 deletions
  1. 7 9
      src/iface/ethernet.rs

+ 7 - 9
src/iface/ethernet.rs

@@ -6,7 +6,7 @@ use phy::Device;
 use wire::{EthernetAddress, EthernetProtocol, EthernetFrame};
 use wire::{ArpPacket, ArpRepr, ArpOperation};
 use wire::{IpAddress, IpProtocol};
-use wire::{Ipv4Packet, Ipv4Repr};
+use wire::{Ipv4Address, Ipv4Packet, Ipv4Repr};
 use wire::{Icmpv4Packet, Icmpv4Repr, Icmpv4DstUnreachable};
 use wire::{TcpPacket, TcpRepr, TcpControl};
 use socket::Socket;
@@ -353,8 +353,9 @@ impl<'a, 'b: 'a,
         for socket in self.sockets.borrow_mut() {
             let result = socket.dispatch(&mut |src_addr, dst_addr, protocol, payload| {
                 let src_addr =
-                    match src_addr {
-                        &IpAddress::Ipv4(_) if src_addr.is_unspecified() => {
+                    try!(match src_addr {
+                        &IpAddress::Unspecified |
+                        &IpAddress::Ipv4(Ipv4Address([0, _, _, _])) => {
                             let mut assigned_addr = None;
                             for addr in src_protocol_addrs {
                                 match addr {
@@ -365,13 +366,10 @@ impl<'a, 'b: 'a,
                                     _ => ()
                                 }
                             }
-                            assigned_addr.expect(
-                                "to respond to an UDP packet without a source address,\
-                                 the interface must have an assigned address from \
-                                 the same family")
+                            assigned_addr.ok_or(Error::Unaddressable)
                         },
-                        addr => addr
-                    };
+                        addr => Ok(addr)
+                    });
 
                 let ip_repr =
                     match (src_addr, dst_addr) {