Skip to content

Commit

Permalink
Merge branch 'sixlowpan-dispatch-rewrite' into rpl
Browse files Browse the repository at this point in the history
  • Loading branch information
thvdveld committed Jan 23, 2024
2 parents 7e65f98 + b45979b commit 14b1c67
Show file tree
Hide file tree
Showing 11 changed files with 595 additions and 606 deletions.
2 changes: 1 addition & 1 deletion src/iface/interface/ieee802154.rs
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ impl InterfaceInner {
ll_dst_a: Ieee802154Address,
tx_token: Tx,
meta: PacketMeta,
packet: Packet,
packet: PacketV6,
frag: &mut Fragmenter,
) {
let ll_src_a = self.hardware_addr.ieee802154_or_panic();
Expand Down
84 changes: 41 additions & 43 deletions src/iface/interface/ipv6.rs
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,7 @@ impl InterfaceInner {
meta: PacketMeta,
ipv6_packet: &Ipv6Packet<&'frame [u8]>,
) -> Option<Packet<'frame>> {
let ipv6_repr = check!(Ipv6Repr::parse(ipv6_packet));
let mut ipv6_repr = check!(Ipv6Repr::parse(ipv6_packet));

if !ipv6_repr.src_addr.is_unicast() {
// Discard packets with non-unicast source addresses.
Expand Down Expand Up @@ -238,7 +238,11 @@ impl InterfaceInner {

#[cfg(feature = "proto-rpl")]
{
return self.forward(ipv6_repr, hbh, ip_payload);
ipv6_repr.next_header = next_header;
if let Some(hbh) = &hbh {
ipv6_repr.payload_len -= 2 + hbh.buffer_len();
}
return self.forward(ipv6_repr, hbh, None, ip_payload);
}
}

Expand Down Expand Up @@ -596,17 +600,16 @@ impl InterfaceInner {
// specify if we SHOULD or MUST transmit an ICMPv6 message.
return None;
} else {
ipv6_repr.hop_limit -= 1;
ipv6_repr.next_header = ext_hdr.next_header();
let payload = &ip_payload[ext_hdr.payload().len() + 2..];

ipv6_repr.next_header = ext_hdr.next_header();
ipv6_repr.hop_limit -= 1;
ipv6_repr.payload_len = payload.len();

return Some(Packet::Ipv6(PacketV6 {
header: ipv6_repr,
hop_by_hop: None,
routing: Some(routing_repr),
payload: IpPayload::Raw(payload),
}));
let mut p = PacketV6::new(ipv6_repr, IpPayload::Raw(payload));
p.add_routing(routing_repr);

return Some(Packet::Ipv6(p));
}
}
}
Expand Down Expand Up @@ -654,6 +657,7 @@ impl InterfaceInner {
&self,
mut ipv6_repr: Ipv6Repr,
mut _hop_by_hop: Option<Ipv6HopByHopRepr<'frame>>,
mut _routing: Option<Ipv6RoutingRepr>,
payload: &'frame [u8],
) -> Option<Packet<'frame>> {
net_trace!("forwarding packet");
Expand All @@ -675,42 +679,36 @@ impl InterfaceInner {

ipv6_repr.hop_limit -= 1;

#[allow(unused)]
let routing: Option<Ipv6RoutingRepr> = None;
let mut p = PacketV6::new(ipv6_repr, IpPayload::Raw(payload));

#[cfg(feature = "rpl-mop-1")]
let routing = if matches!(
self.rpl.mode_of_operation,
crate::iface::RplModeOfOperation::NonStoringMode
) && self.rpl.is_root
{
// Clear the Hop-by-Hop in MOP1 when the root is is adding a source routing header.
// Only the HBH or the source routing header needs to be present in MOP1.
_hop_by_hop = None;
net_trace!("creating source routing header to {}", ipv6_repr.dst_addr);
if let Some((source_route, new_dst_addr)) = super::rpl::create_source_routing_header(
self,
self.ipv6_addr().unwrap(),
ipv6_repr.dst_addr,
) {
ipv6_repr.dst_addr = new_dst_addr;
ipv6_repr.payload_len += source_route.buffer_len();
Some(source_route)
} else {
None
}
if let Some(hbh) = _hop_by_hop {
p.add_hop_by_hop(hbh);
} else {
None
};
#[cfg(feature = "proto-rpl")]
if p.header().dst_addr.is_unicast() && self.rpl.dodag.is_some() {
let mut options = heapless::Vec::new();
options
.push(Ipv6OptionRepr::Rpl(RplHopByHopRepr {
down: self.rpl.is_root,
rank_error: false,
forwarding_error: false,
instance_id: self.rpl.dodag.as_ref().unwrap().instance_id,
sender_rank: self.rpl.dodag.as_ref().unwrap().rank.raw_value(),
}))
.unwrap();

let hbh = Ipv6HopByHopRepr { options };
p.add_hop_by_hop(hbh);
}
}

Some(Packet::Ipv6(PacketV6 {
header: ipv6_repr,
#[cfg(feature = "proto-ipv6-hbh")]
hop_by_hop: _hop_by_hop,
#[cfg(feature = "proto-ipv6-routing")]
routing,
payload: IpPayload::Raw(payload),
}))
if let Some(routing) = _routing {
p.add_routing(routing);
}

println!("packet {:?}", p);

Some(Packet::Ipv6(p))
}

fn param_problem<'frame>(
Expand Down
6 changes: 6 additions & 0 deletions src/iface/interface/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1143,6 +1143,12 @@ impl InterfaceInner {
)?;
let addr = addr.ieee802154_or_panic();

let packet = match packet {
Packet::Ipv6(packet) => packet,
#[allow(unreachable_patterns)]
_ => unreachable!(),
};

self.dispatch_ieee802154(addr, tx_token, meta, packet, frag);
return Ok(());
}
Expand Down
89 changes: 39 additions & 50 deletions src/iface/interface/rpl.rs
Original file line number Diff line number Diff line change
Expand Up @@ -143,56 +143,46 @@ impl Interface {
},
}));

let mut options = heapless::Vec::new();
options
.push(Ipv6OptionRepr::Rpl(RplHopByHopRepr {
down: true,
rank_error: false,
forwarding_error: false,
instance_id: ctx.rpl.dodag.as_ref().unwrap().instance_id,
sender_rank: ctx.rpl.dodag.as_ref().unwrap().rank.raw_value(),
}))
.unwrap();
#[allow(unused_mut)]
let mut hop_by_hop = Some(Ipv6HopByHopRepr { options });
let mut p = PacketV6::new(
Ipv6Repr {
src_addr: ctx.ipv6_addr().unwrap(),
dst_addr,
next_header: IpProtocol::Icmpv6,
payload_len: icmp.buffer_len(),
hop_limit: 64,
},
IpPayload::Icmpv6(icmp),
);

// A DAO-ACK always goes down. In MOP1, both Hop-by-Hop option and source
// routing header MAY be included. However, a source routing header must always
// be included when it is going down.
#[cfg(feature = "rpl-mop-1")]
let routing = if matches!(ctx.rpl.mode_of_operation, ModeOfOperation::NonStoringMode)
if matches!(ctx.rpl.mode_of_operation, ModeOfOperation::NonStoringMode)
&& ctx.rpl.is_root
{
net_trace!("creating source routing header to {}", dst_addr);
if let Some((source_route, new_dst_addr)) =
create_source_routing_header(ctx, our_addr, dst_addr)
{
hop_by_hop = None;
dst_addr = new_dst_addr;
Some(source_route)
} else {
None
p.header_mut().dst_addr = new_dst_addr;
p.add_routing(source_route);
return transmit(ctx, device, Packet::Ipv6(p), fragmenter);
}
} else {
None
};

#[cfg(not(feature = "rpl-mop-1"))]
let routing = None;

let ip_packet = PacketV6 {
header: Ipv6Repr {
src_addr: ctx.ipv6_addr().unwrap(),
dst_addr,
next_header: IpProtocol::Icmpv6,
payload_len: icmp.buffer_len(),
hop_limit: 64,
},
hop_by_hop,
routing,
payload: IpPayload::Icmpv6(icmp),
};
return transmit(ctx, device, Packet::Ipv6(ip_packet), fragmenter);
let mut options = heapless::Vec::new();
options
.push(Ipv6OptionRepr::Rpl(RplHopByHopRepr {
down: true,
rank_error: false,
forwarding_error: false,
instance_id: ctx.rpl.dodag.as_ref().unwrap().instance_id,
sender_rank: ctx.rpl.dodag.as_ref().unwrap().rank.raw_value(),
}))
.unwrap();
p.add_hop_by_hop(Ipv6HopByHopRepr { options });
return transmit(ctx, device, Packet::Ipv6(p), fragmenter);
}

// Transmit any DAO that are queued.
Expand Down Expand Up @@ -240,20 +230,20 @@ impl Interface {

let hbh = Ipv6HopByHopRepr { options };

let ip_packet = PacketV6 {
header: Ipv6Repr {
let mut p = PacketV6::new(
Ipv6Repr {
src_addr: our_addr,
dst_addr,
next_header: IpProtocol::Icmpv6,
payload_len: icmp.buffer_len(),
hop_limit: 64,
},
hop_by_hop: Some(hbh),
routing: None,
payload: IpPayload::Icmpv6(icmp),
};
IpPayload::Icmpv6(icmp),
);
p.add_hop_by_hop(hbh);

net_trace!("transmitting DAO");
return transmit(ctx, device, Packet::Ipv6(ip_packet), fragmenter);
return transmit(ctx, device, Packet::Ipv6(p), fragmenter);
}
}

Expand Down Expand Up @@ -878,20 +868,19 @@ impl InterfaceInner {

let hbh = Ipv6HopByHopRepr { options };

let packet = PacketV6 {
header: Ipv6Repr {
let mut p = PacketV6::new(
Ipv6Repr {
src_addr: our_addr,
dst_addr: dodag.parent.unwrap(),
next_header: IpProtocol::Icmpv6,
payload_len: icmp.buffer_len(),
hop_limit: 64,
},
hop_by_hop: Some(hbh),
routing: None,
payload: IpPayload::Icmpv6(Icmpv6Repr::Rpl(icmp)),
};
IpPayload::Icmpv6(Icmpv6Repr::Rpl(icmp)),
);
p.add_hop_by_hop(hbh);

return Some(Packet::Ipv6(packet));
return Some(Packet::Ipv6(p));
}

None
Expand Down

0 comments on commit 14b1c67

Please sign in to comment.