A 6LoWPAN Fragment Forwarding technique makes the routing decision on the first fragment, which is always the one with the IPv6 address of the destination. Upon receiving a first fragment, a forwarding node (e.g., node B in an A->B->C sequence) that does fragment forwarding
MUST attempt to create a state and forward the fragment. This is an atomic operation, and if the first fragment cannot be forwarded, then the state
MUST be removed.
Since the Datagram_Tag is uniquely associated with the source link-layer address of the fragment, the forwarding node
MUST assign a new Datagram_Tag from its own namespace for the next hop and rewrite the fragment header of each fragment with that Datagram_Tag.
When a forwarding node receives a fragment other than a first fragment, it
MUST look up state based on the source link-layer address and the Datagram_Tag in the received fragment. If no such state is found, the fragment
MUST be dropped; otherwise, the fragment
MUST be forwarded using the information in the state found.
Compared to
Section 3, the conceptual reassembly buffer in node B now contains the following, assuming that node B is neither the source nor the final destination:
-
a Datagram_Tag as received in the incoming fragments, associated with the interface and the link-layer address of node A for which the received Datagram_Tag is unique.
-
the link-layer address that node B uses as the source to forward the fragments.
-
the interface and the link-layer address of the next-hop C that is resolved on the first fragment.
-
a Datagram_Tag that node B uniquely allocated for this datagram and that is used when forwarding the fragments of the datagram.
-
a buffer for the remainder of a previous fragment left to be sent.
-
a timer that allows discarding the stale 6LFF state after some timeout. The duration of the timer should be longer than that which covers the reassembly at the receiving endpoint.
A node that has not received the first fragment cannot forward the next fragments. This means that if node B receives a fragment, node A was in possession of the first fragment at some point. To keep the operation simple and consistent with [
RFC 4944], the first fragment
MUST always be sent first. When that is done, if node B receives a fragment that is not the first and for which it has no state, then node B treats it as an error and refrains from creating a state or attempting to forward. This also means that node A should perform all its possible retries on the first fragment before it attempts to send the next fragments, and that it should abort the datagram and release its state if it fails to send the first fragment.
Fragment forwarding obviates some of the benefits of the 6LoWPAN header compression [
RFC 6282] in intermediate hops. In return, the memory used to store the packet is distributed along the path, which limits the buffer-bloat effect. Multiple fragments may progress simultaneously along the network as long as they do not interfere. An associated caveat is that on a half-duplex radio, if node A sends the next fragment at the same time as node B forwards the previous fragment to node C down the path, then node B will miss it. If node C forwards the previous fragment to node D at the same time and on the same frequency as node A sends the next fragment to node B, this may result in a hidden terminal problem. In that case, the transmission from node C interferes at node B with that from node A, unbeknownst to node A. Consecutive fragments of a same datagram
MUST be separated with an inter-frame gap that allows one fragment to progress beyond the next hop and beyond the interference domain before the next shows up. This can be achieved by interleaving packets or fragments sent via different next-hop routers.