iface: check for ipv4 subnet broadcast addrs everywhere
This commit is contained in:
parent
3dea658b5e
commit
c7861455e1
|
@ -989,7 +989,7 @@ impl<'a> InterfaceInner<'a> {
|
||||||
let checksum_caps = self.device_capabilities.checksum.clone();
|
let checksum_caps = self.device_capabilities.checksum.clone();
|
||||||
let ipv4_repr = Ipv4Repr::parse(&ipv4_packet, &checksum_caps)?;
|
let ipv4_repr = Ipv4Repr::parse(&ipv4_packet, &checksum_caps)?;
|
||||||
|
|
||||||
if !ipv4_repr.src_addr.is_unicast() {
|
if !self.is_unicast_v4(ipv4_repr.src_addr) {
|
||||||
// Discard packets with non-unicast source addresses.
|
// Discard packets with non-unicast source addresses.
|
||||||
net_debug!("non-unicast source address");
|
net_debug!("non-unicast source address");
|
||||||
return Err(Error::Malformed)
|
return Err(Error::Malformed)
|
||||||
|
@ -1012,9 +1012,8 @@ impl<'a> InterfaceInner<'a> {
|
||||||
let handled_by_raw_socket = false;
|
let handled_by_raw_socket = false;
|
||||||
|
|
||||||
if !self.has_ip_addr(ipv4_repr.dst_addr) &&
|
if !self.has_ip_addr(ipv4_repr.dst_addr) &&
|
||||||
!ipv4_repr.dst_addr.is_broadcast() &&
|
|
||||||
!self.has_multicast_group(ipv4_repr.dst_addr) &&
|
!self.has_multicast_group(ipv4_repr.dst_addr) &&
|
||||||
!self.is_subnet_broadcast(ipv4_repr.dst_addr) {
|
!self.is_broadcast_v4(ipv4_repr.dst_addr) {
|
||||||
|
|
||||||
// Ignore IP packets not directed at us, or broadcast, or any of the multicast groups.
|
// Ignore IP packets not directed at us, or broadcast, or any of the multicast groups.
|
||||||
// If AnyIP is enabled, also check if the packet is routed locally.
|
// If AnyIP is enabled, also check if the packet is routed locally.
|
||||||
|
@ -1070,6 +1069,18 @@ impl<'a> InterfaceInner<'a> {
|
||||||
})
|
})
|
||||||
.any(|broadcast_address| address == broadcast_address)
|
.any(|broadcast_address| address == broadcast_address)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Checks if an ipv4 address is broadcast, taking into account subnet broadcast addresses
|
||||||
|
#[cfg(feature = "proto-ipv4")]
|
||||||
|
fn is_broadcast_v4(&self, address: Ipv4Address) -> bool {
|
||||||
|
address.is_broadcast() || self.is_subnet_broadcast(address)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Checks if an ipv4 address is unicast, taking into account subnet broadcast addresses
|
||||||
|
#[cfg(feature = "proto-ipv4")]
|
||||||
|
fn is_unicast_v4(&self, address: Ipv4Address) -> bool {
|
||||||
|
address.is_unicast() && !self.is_subnet_broadcast(address)
|
||||||
|
}
|
||||||
|
|
||||||
/// Host duties of the **IGMPv2** protocol.
|
/// Host duties of the **IGMPv2** protocol.
|
||||||
///
|
///
|
||||||
|
@ -1312,10 +1323,10 @@ impl<'a> InterfaceInner<'a> {
|
||||||
(&self, ipv4_repr: Ipv4Repr, icmp_repr: Icmpv4Repr<'icmp>) ->
|
(&self, ipv4_repr: Ipv4Repr, icmp_repr: Icmpv4Repr<'icmp>) ->
|
||||||
Option<IpPacket<'frame>>
|
Option<IpPacket<'frame>>
|
||||||
{
|
{
|
||||||
if !ipv4_repr.src_addr.is_unicast() {
|
if !self.is_unicast_v4(ipv4_repr.src_addr) {
|
||||||
// Do not send ICMP replies to non-unicast sources
|
// Do not send ICMP replies to non-unicast sources
|
||||||
None
|
None
|
||||||
} else if ipv4_repr.dst_addr.is_unicast() {
|
} else if self.is_unicast_v4(ipv4_repr.dst_addr) {
|
||||||
// Reply as normal when src_addr and dst_addr are both unicast
|
// Reply as normal when src_addr and dst_addr are both unicast
|
||||||
let ipv4_reply_repr = Ipv4Repr {
|
let ipv4_reply_repr = Ipv4Repr {
|
||||||
src_addr: ipv4_repr.dst_addr,
|
src_addr: ipv4_repr.dst_addr,
|
||||||
|
@ -1325,7 +1336,7 @@ impl<'a> InterfaceInner<'a> {
|
||||||
hop_limit: 64
|
hop_limit: 64
|
||||||
};
|
};
|
||||||
Some(IpPacket::Icmpv4((ipv4_reply_repr, icmp_repr)))
|
Some(IpPacket::Icmpv4((ipv4_reply_repr, icmp_repr)))
|
||||||
} else if ipv4_repr.dst_addr.is_broadcast() {
|
} else if self.is_broadcast_v4(ipv4_repr.dst_addr) {
|
||||||
// Only reply to broadcasts for echo replies and not other ICMP messages
|
// Only reply to broadcasts for echo replies and not other ICMP messages
|
||||||
match icmp_repr {
|
match icmp_repr {
|
||||||
Icmpv4Repr::EchoReply {..} => match self.ipv4_address() {
|
Icmpv4Repr::EchoReply {..} => match self.ipv4_address() {
|
||||||
|
|
Loading…
Reference in New Issue