diff --git a/examples/sixlowpan.rs b/examples/sixlowpan.rs index 2b3439b..138c22c 100644 --- a/examples/sixlowpan.rs +++ b/examples/sixlowpan.rs @@ -83,8 +83,7 @@ fn main() { let mut builder = InterfaceBuilder::new(device) .ip_addrs(ip_addrs) - .dst_pan_id(Ieee802154Pan(0xbeef)) - .src_pan_id(Ieee802154Pan(0xbeef)); + .pan_id(Ieee802154Pan(0xbeef)); builder = builder .hardware_addr(ieee802154_addr.into()) .neighbor_cache(neighbor_cache); diff --git a/src/iface/interface.rs b/src/iface/interface.rs index 5f7a05c..83c16f8 100644 --- a/src/iface/interface.rs +++ b/src/iface/interface.rs @@ -39,9 +39,7 @@ struct InterfaceInner<'a> { #[cfg(feature = "medium-ieee802154")] sequence_no: u8, #[cfg(feature = "medium-ieee802154")] - src_pan_id: Option, - #[cfg(feature = "medium-ieee802154")] - dst_pan_id: Option, + pan_id: Option, ip_addrs: ManagedSlice<'a, IpCidr>, #[cfg(feature = "proto-ipv4")] any_ip: bool, @@ -63,9 +61,7 @@ pub struct InterfaceBuilder<'a, DeviceT: for<'d> Device<'d>> { #[cfg(feature = "medium-ieee802154")] sequence_no: u8, #[cfg(feature = "medium-ieee802154")] - src_pan_id: Option, - #[cfg(feature = "medium-ieee802154")] - dst_pan_id: Option, + pan_id: Option, ip_addrs: ManagedSlice<'a, IpCidr>, #[cfg(feature = "proto-ipv4")] any_ip: bool, @@ -119,9 +115,7 @@ let iface = InterfaceBuilder::new(device) #[cfg(feature = "medium-ieee802154")] sequence_no: 1, #[cfg(feature = "medium-ieee802154")] - src_pan_id: None, - #[cfg(feature = "medium-ieee802154")] - dst_pan_id: None, + pan_id: None, ip_addrs: ManagedSlice::Borrowed(&mut []), #[cfg(feature = "proto-ipv4")] @@ -155,17 +149,12 @@ let iface = InterfaceBuilder::new(device) self } - /// Set the IEEE802.15.4 source PAN ID the interface will use. + /// Set the IEEE802.15.4 PAN ID the interface will use. + /// + /// **NOTE**: we use the same PAN ID for destination and source. #[cfg(feature = "medium-ieee802154")] - pub fn src_pan_id(mut self, pan_id: Ieee802154Pan) -> Self { - self.src_pan_id = Some(pan_id); - self - } - - /// Set the IEEE802.15.4 destination PAN ID the interface will use. - #[cfg(feature = "medium-ieee802154")] - pub fn dst_pan_id(mut self, pan_id: Ieee802154Pan) -> Self { - self.dst_pan_id = Some(pan_id); + pub fn pan_id(mut self, pan_id: Ieee802154Pan) -> Self { + self.pan_id = Some(pan_id); self } @@ -312,9 +301,7 @@ let iface = InterfaceBuilder::new(device) #[cfg(feature = "medium-ieee802154")] sequence_no: self.sequence_no, #[cfg(feature = "medium-ieee802154")] - src_pan_id: self.src_pan_id, - #[cfg(feature = "medium-ieee802154")] - dst_pan_id: self.dst_pan_id, + pan_id: self.pan_id, }, } } @@ -958,9 +945,7 @@ where ))] hardware_addr: self.inner.hardware_addr, #[cfg(feature = "medium-ieee802154")] - src_pan_id: self.inner.src_pan_id, - #[cfg(feature = "medium-ieee802154")] - dst_pan_id: self.inner.dst_pan_id, + pan_id: self.inner.pan_id, } } } @@ -1111,6 +1096,12 @@ 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. + return Ok(None); + } + match ieee802154_frame.payload() { Some(payload) => self.process_sixlowpan(cx, sockets, &ieee802154_repr, payload), None => Ok(None), @@ -2373,9 +2364,9 @@ impl<'a> InterfaceInner<'a> { sequence_number: Some(self.get_sequence_number()), pan_id_compression: true, frame_version: Ieee802154FrameVersion::Ieee802154_2003, - dst_pan_id: cx.dst_pan_id, + dst_pan_id: cx.pan_id, dst_addr: Some(dst_hardware_addr), - src_pan_id: cx.src_pan_id, + src_pan_id: cx.pan_id, src_addr: ll_src_addr, }; diff --git a/src/socket/mod.rs b/src/socket/mod.rs index 5f29026..9836c4b 100644 --- a/src/socket/mod.rs +++ b/src/socket/mod.rs @@ -193,9 +193,7 @@ pub(crate) struct Context { ))] pub hardware_addr: Option, #[cfg(feature = "medium-ieee802154")] - pub src_pan_id: Option, - #[cfg(feature = "medium-ieee802154")] - pub dst_pan_id: Option, + pub pan_id: Option, pub caps: DeviceCapabilities, } @@ -232,8 +230,6 @@ impl Context { now: Instant::from_millis_const(0), #[cfg(feature = "medium-ieee802154")] - src_pan_id: Some(crate::wire::Ieee802154Pan(0xabcd)), - #[cfg(feature = "medium-ieee802154")] - dst_pan_id: Some(crate::wire::Ieee802154Pan(0xabcd)), + pan_id: Some(crate::wire::Ieee802154Pan(0xabcd)), }; }