diff --git a/src/iface/interface.rs b/src/iface/interface.rs index 20e99d7..093bd61 100644 --- a/src/iface/interface.rs +++ b/src/iface/interface.rs @@ -1096,13 +1096,17 @@ impl<'a> InterfaceInner<'a> { let ieee802154_frame = Ieee802154Frame::new_checked(sixlowpan_payload)?; let ieee802154_repr = Ieee802154Repr::parse(&ieee802154_frame)?; - if ieee802154_repr.dst_pan_id != cx.pan_id { - // We sillently drop frames that have the wrong PAN id. - // NOTE: this is most of the time already implememted in hardware. + if ieee802154_repr.frame_type != Ieee802154FrameType::Data { return Ok(None); } - if ieee802154_repr.frame_type != Ieee802154FrameType::Data { + // Drop frames when the user has set a PAN id and the PAN id from frame is not equal to this + // When the user didn't set a PAN id (so it is None), then we accept all PAN id's. + // We always accept the broadcast PAN id. + if cx.pan_id.is_some() + && ieee802154_repr.dst_pan_id != cx.pan_id + && ieee802154_repr.dst_pan_id != Some(Ieee802154Pan::BROADCAST) + { return Ok(None); } @@ -3684,6 +3688,7 @@ mod test { |buf| fill_slice(buf, 0x2a), &ChecksumCapabilities::default(), ); + let ipv4_repr = Ipv4Repr { src_addr: src_addr, dst_addr: dst_addr, diff --git a/src/wire/ieee802154.rs b/src/wire/ieee802154.rs index 90b58db..b52a2d9 100644 --- a/src/wire/ieee802154.rs +++ b/src/wire/ieee802154.rs @@ -109,6 +109,8 @@ impl fmt::Display for AddressingMode { pub struct Pan(pub u16); impl Pan { + pub const BROADCAST: Self = Self(0xffff); + /// Return the PAN ID as bytes. pub fn as_bytes(&self) -> [u8; 2] { let mut pan = [0u8; 2];