diff --git a/src/iface/interface/ipv6.rs b/src/iface/interface/ipv6.rs index 5be16304a..0ee15a98d 100644 --- a/src/iface/interface/ipv6.rs +++ b/src/iface/interface/ipv6.rs @@ -315,16 +315,20 @@ impl InterfaceInner { return HopByHopResponse::Discard(None); } Ipv6OptionFailureType::DiscardSendAll => { - return HopByHopResponse::Discard( - self.param_problem(ipv6_repr, ip_payload), - ); + return HopByHopResponse::Discard(self.icmpv6_problem( + ipv6_repr, + ip_payload, + Icmpv6ParamProblem::UnrecognizedOption, + )); } Ipv6OptionFailureType::DiscardSendUnicast if !ipv6_repr.dst_addr.is_multicast() => { - return HopByHopResponse::Discard( - self.param_problem(ipv6_repr, ip_payload), - ); + return HopByHopResponse::Discard(self.icmpv6_problem( + ipv6_repr, + ip_payload, + Icmpv6ParamProblem::UnrecognizedOption, + )); } _ => unreachable!(), } @@ -373,7 +377,11 @@ impl InterfaceInner { #[cfg(feature = "socket-raw")] _ if handled_by_raw_socket => None, - _ => self.param_problem(ipv6_repr, ip_payload), + _ => self.icmpv6_problem( + ipv6_repr, + ip_payload, + Icmpv6ParamProblem::UnrecognizedNxtHdr, + ), } } @@ -711,17 +719,18 @@ impl InterfaceInner { Some(Packet::Ipv6(p)) } - fn param_problem<'frame>( + fn icmpv6_problem<'frame>( &self, ipv6_repr: Ipv6Repr, ip_payload: &'frame [u8], + reason: Icmpv6ParamProblem, ) -> Option> { let payload_len = icmp_reply_payload_len(ip_payload.len(), IPV6_MIN_MTU, ipv6_repr.buffer_len()); self.icmpv6_reply( ipv6_repr, Icmpv6Repr::ParamProblem { - reason: Icmpv6ParamProblem::UnrecognizedOption, + reason, pointer: ipv6_repr.buffer_len() as u32, header: ipv6_repr, data: &ip_payload[0..payload_len], diff --git a/src/iface/interface/mod.rs b/src/iface/interface/mod.rs index 7f9f92c2a..08a3d8f2d 100644 --- a/src/iface/interface/mod.rs +++ b/src/iface/interface/mod.rs @@ -1030,7 +1030,7 @@ impl InterfaceInner { return Err(DispatchError::NeighborPending); } NeighborAnswer::NotFound => match (src_addr, dst_addr) { - #[cfg(feature = "proto-ipv4")] + #[cfg(all(feature = "medium-ethernet", feature = "proto-ipv4"))] (&IpAddress::Ipv4(src_addr), IpAddress::Ipv4(dst_addr)) => { net_debug!( "address {} not in neighbor cache, sending ARP request", diff --git a/src/iface/interface/sixlowpan.rs b/src/iface/interface/sixlowpan.rs index 7d619fc1a..585b139fc 100644 --- a/src/iface/interface/sixlowpan.rs +++ b/src/iface/interface/sixlowpan.rs @@ -567,6 +567,7 @@ pub enum SixlowpanPayload<'p> { Icmpv6(&'p Icmpv6Repr<'p>), #[cfg(any(feature = "socket-udp", feature = "socket-dns"))] Udp(UdpRepr, &'p [u8], Option), + #[cfg(feature = "proto-rpl")] Raw(&'p [u8]), } @@ -635,6 +636,7 @@ impl<'p> PacketSixlowpan<'p> { SixlowpanPayload::Udp(*udp_repr, payload, None) } + #[cfg(feature = "proto-rpl")] IpPayload::Raw(raw) => { match last_header { IpProtocol::Udp => { @@ -699,6 +701,7 @@ impl<'p> PacketSixlowpan<'p> { SixlowpanPayload::Udp(udp_repr, payload, _) => { len + SixlowpanUdpNhcRepr(udp_repr).header_len() + payload.len() } + #[cfg(feature = "proto-rpl")] SixlowpanPayload::Raw(payload) => len + payload.len(), } } @@ -776,6 +779,7 @@ impl<'p> PacketSixlowpan<'p> { udp_packet.set_checksum(checksum); } } + #[cfg(feature = "proto-rpl")] SixlowpanPayload::Raw(payload) => buffer[..payload.len()].copy_from_slice(payload), } } diff --git a/src/iface/packet.rs b/src/iface/packet.rs index 21cf1f813..df9c941c8 100644 --- a/src/iface/packet.rs +++ b/src/iface/packet.rs @@ -98,7 +98,7 @@ impl<'p> Packet<'p> { &caps.checksum, ) } - #[cfg(feature = "socket-raw")] + #[cfg(any(feature = "socket-raw", feature = "proto-rpl"))] IpPayload::Raw(raw_packet) => payload.copy_from_slice(raw_packet), #[cfg(any(feature = "socket-udp", feature = "socket-dns"))] IpPayload::Udp(udp_repr, inner_payload) => udp_repr.emit( @@ -171,6 +171,7 @@ pub(crate) struct PacketV6<'p> { payload: IpPayload<'p>, } +#[cfg(feature = "proto-ipv6")] impl<'p> PacketV6<'p> { pub(crate) fn new(header: Ipv6Repr, payload: IpPayload<'p>) -> Self { Self { @@ -193,6 +194,7 @@ impl<'p> PacketV6<'p> { &mut self.header } + #[cfg(feature = "proto-ipv6-hbh")] pub(crate) fn hop_by_hop(&self) -> Option<(IpProtocol, &Ipv6HopByHopRepr<'p>)> { #[cfg(feature = "proto-ipv6-hbh")] { @@ -206,6 +208,7 @@ impl<'p> PacketV6<'p> { } } + #[cfg(feature = "proto-ipv6-hbh")] pub(crate) fn add_hop_by_hop(&mut self, repr: Ipv6HopByHopRepr<'p>) { self.header.payload_len += 2 + repr.buffer_len(); let next_header = self.header.next_header; @@ -213,6 +216,7 @@ impl<'p> PacketV6<'p> { self.hop_by_hop = Some((next_header, repr)); } + #[cfg(feature = "proto-ipv6-routing")] pub(crate) fn routing(&self) -> Option<(IpProtocol, &Ipv6RoutingRepr)> { #[cfg(feature = "proto-ipv6-routing")] { @@ -226,6 +230,7 @@ impl<'p> PacketV6<'p> { } } + #[cfg(feature = "proto-ipv6-routing")] pub(crate) fn add_routing(&mut self, repr: Ipv6RoutingRepr) { self.header.payload_len += 2 + repr.buffer_len(); let mut next_header = self.header.next_header; @@ -254,7 +259,7 @@ pub(crate) enum IpPayload<'p> { Igmp(IgmpRepr), #[cfg(feature = "proto-ipv6")] Icmpv6(Icmpv6Repr<'p>), - #[cfg(feature = "socket-raw")] + #[cfg(any(feature = "socket-raw", feature = "proto-rpl"))] Raw(&'p [u8]), #[cfg(any(feature = "socket-udp", feature = "socket-dns"))] Udp(UdpRepr, &'p [u8]),