Skip to content

[ddm, mg-lower, pt6] underlay membership sweep, admin v5, & mrib origination - #999

Open
zeeshanlakhani wants to merge 3 commits into
zl/mcast-ddm-exchangefrom
zl/mcast-lower
Open

zeeshanlakhani wants to merge 3 commits into
zl/mcast-ddm-exchangefrom
zl/mcast-lower

Conversation

@zeeshanlakhani

Copy link
Copy Markdown
Contributor

This is the sixth (and last, maybe) part in a series of recut PRs split from #675. After pt5, we had ddm peers exchanging multicast subscriptions, but the imports never made their way to the switch, and mgd couldn't originate groups into ddm yet. This work handles both.

Includes:

  • A multicast member sweep in ddmd (ddm/src/mcast.rs), which is tasked with programming imported routes into the DPD underlay group members (rear ports for now, geared toward mcast v1).
    • This sweep runs every 10s and can get woken up early by the db whenever an (origin, nexthop, interface) 3-tuple import is added or removed (via watch notify).
    • A read-modify-write per group per pass. The write passes back the group tag from the read. Nexus still owns group create/delete, and External members are not updated.
    • Only members programmed by this ddmd process (since startup) get removed (same as unicast + tunnel routes).
    • QSFP "Underlay" members are skipped for now (TODO), as replicas would cycle between racks without RPF or a designated forwarder.
  • Multicast imports are structured and keyed per (nexthop, ifname) link, and remove_nexthop_{mcast_}routes take the interface. Before, the same link-local nexthop on two interfaces collapsed into one entry, where losing either link caused a drop.
  • A new ddm admin API version (MULTICAST_INTERFACES), where get_multicast_groups returns ImportedMulticastRoute with the interface name.
  • Transits only redistribute imports that are new or changed (including over path/metric modifications).
  • mg-common::tfport kills a TODO and introduces a parser for tfport<kind><port>_<link>[.vlan] names, replacing the prefix/suffix string handling we dealt with previously.
  • mg-lower MRIB origination uses a separate thread (from unicast/tunnels) that diffs loc_mrib against ddm's originated groups and advertises/withdraws accordingly.
    • This is a watcher-driven task with a 1s fallback resync, like unicast.
  • testing:
    • We introduce a dual-sidecar topology, with a server with one link to each sidecar (e.g., sl0 -> sidecar a, sl1 -> sidecar b), importing from both, dropping and restoring sl1, and performing a ddmd restart.
    • Multicast phases have been added to the trio, quartet (failover), and sextet integrations.
  • deps

…ination

This is the sixth (and last) part in a series of recut PRs split from
#675. After pt5, we had
ddm peers exchanging multicast subscriptions, but the imports never made
their way to the switch, and mgd couldn't originate groups into ddm yet. This
work handles both.

Includes:

- A multicast member sweep in ddmd (`ddm/src/mcast.rs`), which is tasked
  with programming imported routes into the DPD underlay group members
  (rear ports for now, geared toward mcast v1).
  - This sweep runs every 10s and can get woken up early by the db
  whenever an `(origin, nexthop, interface)` 3-tuple import is added or
  removed (via watch notify)
  - A read-modify-write per group per pass. The write passes back the
    group tag from the read. Nexus still owns group
    create/delete, and `External` members are not updated.
  - Only members programmed by this ddmd process (since startup) get removed
    (same as unicast + tunnel routes).
  - QSFP "Underlay" members are skipped for now (TODO), as replicas would
    cycle between racks without RPF or a designated forwarder.
- Multicast imports are structured and keyed per `(nexthop, ifname)` link,
  and `remove_nexthop_{mcast_}routes` take the interface. Before, the same
  link-local nexthop on two interfaces collapsed into one entry, where
  losing either link caused a drop.
- A new ddm admin API version (`MULTICAST_INTERFACES`), where
  `get_multicast_groups` returns `ImportedMulticastRoute` with the
  interface name.
- Transits only redistribute imports that are new or changed (including
  over path/metric modifications).
- `mg-common::tfport` kills a TODO and introduces a parser for
  `tfport<kind><port>_<link>[.vlan]` names, replacing the prefix/suffix
  string handling we dealt with previously.
- mg-lower MRIB origination uses a separate thread (from unicast/tunnels)
  that diffs `loc_mrib` against ddm's originated groups and
  advertises/withdraws accordingly.
  - This is a watcher-driven task with a 1s fallback resync, like unicast.
- *testing*:
  - We introduce a dual-sidecar topology, with a server with one link to each
    sidecar (e.g., `sl0` -> sidecar a, `sl1` -> sidecar b), importing from
    both, dropping and restoring `sl1`, and performing a ddmd restart.
  - Multicast phases have been added to the trio, quartet (failover), and
    sextet integrations.
- *deps*
  - For `dual-sidecar testing` ~ SoftNPU purposes, we are pinned against
    oxidecomputer/dendrite#405 for dendrite.
@zeeshanlakhani
zeeshanlakhani added this pull request to stack #958 November 7, 2026 07:25
@zeeshanlakhani zeeshanlakhani self-assigned this Nov 9, 2026
@zeeshanlakhani zeeshanlakhani added the multicast Multicast-related feature/impl label Nov 9, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

multicast Multicast-related feature/impl

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant