irf/dnac: inter-regional forwarding as a flat region mesh - #111
irf/dnac: inter-regional forwarding as a flat region mesh#111zebastian wants to merge 10 commits into
Conversation
|
@scburleigh to review changes done: Data model (ici/include/ion.h)
Routing (bpv7/irf/libirf.c, bpv7/ipn/ipnfw.c)
Region management (ici/library/rfx.c)
Opt-in bridge flag
Admin / DNAC
|
|
Note that there's an internal branch with IONe's IRF all cleaned up; it hasn't been merged into A flat mesh does differ from how I-D.burleigh-regions-00 treats region numbers with topographical significance, though my first impression is that a flat mesh is more flexible. Interested to hear Scott's thoughts as well. |
|
Sure. https://datatracker.ietf.org/doc/draft-burleigh-regions/ is the best approach I've been able to come up with so far, provided that two additional notions are included:
|
|
@zebastian, commenting a little further: I think the approach I described in my earlier comment has many of the same advantages as the approach you've taken here. The region topology itself is flat - any two regions can be directly connected by a shortcut passageway region - but the names of the regions are hierarchical. This naming convention imposes a default structure on the topology that a bundle can navigate successfully, from any region in the network to any other, without knowing anything other than the name of one region in which the destination node resides. It's advantageous in a way that is similar to Internet routing while remaining delay-tolerant. True, the default path from the source region to the destination region might be lengthy. But since regions pre-exist their residents, an operator of a space enterprise can assure short IRF paths among her own nodes by simply choosing to occupy some set of regions whose numbers are numerically adjacent, anywhere in the topology: 11817, 118171, 118172, 118173, 118174 for example. Short paths to nodes in the regions of other enterprises can be assured by choosing to occupy regions whose numbers are similarly numerically near, like 11821, 118211, 118212. Forwarding among nodes in regions that are closely related in this way is not only trivial but also quick. Forwarding among nodes in regions connected by shortcut passageways is also quick but is not trivial - management is needed that goes beyond simply editing contact plans. Just as in your approach, a node can belong to (that is, be cited in the contact plans of) any number of regions. But each node resides in at most one non-passageway region; the only precedence is that a bundle that is issued by a bundle must traverse the node's local region before traversing any other, no surprise there. No special mechanisms are needed for passageway regions, private contact plans, or shortcut regions; it's all just a matter of editing contact plans and letting contact plan synchronization propagate the edits to all region members. On the limitations you mention:
|
Integrate Scott Burleigh's IONe inter-regional forwarding (irf) and DTN node auto-configuration (dnac) code into ION-DTN mainline. This is the single compatibility layer on top of the imported upstream commits: it adapts the irf/dnac sources to ION-DTN's diverged ICI/BP internals and wires them into shared files (rfx.c, ion.h/ionsec.h/rfx.h, ion.c, ionsec.c, ipnfw.c, bpextensions.c, libbpP.c, bp.h, bpP.h, Makefile.am), and drops IONe-only build products and development Makefiles. No functional change relative to the previous squashed import; this commit plus the seven preceding Burleigh commits reproduce that tree exactly while preserving the original authorship and history.
Replace the hierarchical (home/outer region tree) IRF model with a flat
mesh in which a node may belong to any number of regions (bounded by
ION_MAX_REGIONS = 16) with no precedence among them, and may opt in to
serving as a passageway via a per-node "bridge" flag (default off).
Data model (ici/include/ion.h):
- RegionMember is now {fqnn, regionNbrs[16], regionCount, bridgeAllowed}
instead of {fqnn, homeRegionNbr, outerRegionNbr}.
- IonDB.regions becomes a 16-slot array plus a node-level bridgeAllowed.
ici/library/ion.c: ionMemberInRegion/Add/Remove set helpers,
ionSetBridgeAllowed/ionBridgeAllowed; ionRegionOf is a set intersection;
ionPickRegion scans all slots.
ici/library/rfx.c: registerInRegion/registerSelf/vacateRegion and
unregistration rewritten as additive membership with no hierarchy or
cascade (purgePassageways removed); vacateRegion compacts the regions
array (so regions[0] is never a hole) and retains other nodes' membership
for mesh routing; a registration contact's xmit-rate field and a CPS
notice's magnitude carry the opt-in bridge flag; rfx_brief_contacts
replays each passageway's full membership; re-registration reconciles
self membership (fixes region rejoin-after-leave).
bpv7/irf/libirf.c: irf_identify_passageways selects passageways by
shared region + IPT-trace loop-prevention, keyed on membership
(regionCount >= 2) rather than the racily-propagated remote bridge flag;
candidate eligibility uses one binary-searched rolodex snapshot instead
of a per-candidate scan-and-lock.
bpv7/ipn/ipnfw.c: tryIRF enforces opt-in locally (a non-bridge node
declines to relay) and fixes a multi-nominee clone crash via an explicit
first-nominee flag.
bpv7/imc/*: adapt IMC to the new region fields; fix an out-of-bounds
"other region" index in petition propagation.
ici/utils/ionadmin.c + doc: add the "m bridge { 0 | 1 }" command.
dnac/dnac/dnacp.c: place a new node in the sponsor's most recently
joined region.
Opt the passageway nodes in to bridging ("m bridge 1" in the seed
scripts for nodes 21, 22 and 25, and on node 24 before it rejoins
region 1). After node 24 becomes a passageway again, re-brief region 12
(new brief12.ionrc on node 24, replayed to node 26) so region-12 members
learn node 24's updated membership: in a flat mesh a per-region CPS
announcement cannot convey a cross-region membership change.
With these changes tests/irf passes 10/10 (all file deliveries) on the
flat-mesh implementation.
Adds inter-regional forwarding (IRF) and DTN node auto-configuration (DNAC) to ION-DTN as implemented by Scott Burleight in the IONe code.
Then reworks IRF from the original hierarchical region tree into a flat region mesh.
The branch is structured so the upstream provenance is preserved:
Makefile.am).
The original IRF organized regions as a tree: every node belonged to at most two regions (a home/inner and an outer/super region), and routing direction (inward/outward) plus loop-freedom derived from that hierarchy. This PR removes the hierarchy: a node can belong to any number of peer regions with no precedence, which lets passageway
regions, private contact plans, and "shortcut" links fall out naturally without special mechanisms.
Known limitations
mid-life needs an out-of-band re-brief (documented at the announcement site; tests/irf does this explicitly in one step).