Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
54 commits
Select commit Hold shift + click to select a range
d7644c8
Modify root prefix strategy in nfd-init.sh.j2
a-thieme Oct 24, 2026
3aee90d
Merge pull request #44 from named-data/increase-max-suppression
a-thieme Oct 24, 2026
c65654e
Modify multicast strategy settings in nfd-init.sh.j2
a-thieme Oct 24, 2026
49ea653
Merge pull request #45 from named-data/multicast-suppression-limit
a-thieme Oct 24, 2026
9b64afa
update operator emails and names
a-thieme Oct 24, 2026
b65d36e
fix arizona host and operator email mistake
a-thieme Oct 24, 2026
37021ca
update WASEDA host_vars operator name
a-thieme Oct 24, 2026
d316f9c
Add opt-in NDNd with Caddy WebSocket routes
markverick Oct 17, 2026
2ff9b0b
Serve NDNd status via its management socket
markverick Oct 17, 2026
9044db5
Enable NDNd canary at Arizona and Memphis
markverick Oct 17, 2026
3f44ca2
Use NDNd XML status server
markverick Oct 17, 2026
e75c0ad
Pin NDNd status service to TLV dataset version
markverick Oct 17, 2026
1710320
Pin testbed to updated NDNd status build
markverick Oct 17, 2026
a60fbbd
Pin testbed to latest NDNd status build
markverick Oct 18, 2026
d68345d
Run isolated NDNd DV routers
markverick Oct 18, 2026
86d1227
Secure root-issued DV credentials
markverick Oct 18, 2026
01285f0
Allow isolated DV keychain persistence
markverick Oct 18, 2026
53f0ef3
Pin NDNd DV sync fix
markverick Oct 18, 2026
732b446
Set NDNd router identity for DV forwarding
markverick Oct 18, 2026
a6fc0e9
Deploy combined NDNd XML and CA image
markverick Oct 20, 2026
fa97596
Deploy email-capable NDNd CA image
markverick Oct 20, 2026
8ddecc7
Run Go CA for NDNd alongside C++ CA
markverick Oct 20, 2026
7a09dd2
Isolate NDNd identities and renewal signer
markverick Oct 20, 2026
5d3dd42
Run NDNd Go CA with deployed root and site policy
markverick Oct 20, 2026
4847af6
Mount Go CA rendered config directories
markverick Oct 20, 2026
d993440
Mount CA certificate cache outside config
markverick Oct 20, 2026
f260ac3
Run site CA renewal from rendered config
markverick Oct 20, 2026
f185101
Cap site CA validity at signer limit
markverick Oct 20, 2026
4b20417
Use NDNd image with SMTP trust roots
markverick Oct 20, 2026
a31b5b0
Use NDNd testbed-staging image
markverick Oct 20, 2026
0d33d96
Deploy staging NDNd across testbed services
markverick Oct 20, 2026
b8ca702
Remove unsupported NDNd router_name setting
markverick Oct 20, 2026
0f41317
Remove unsupported NDNd DV trust_schema setting
markverick Oct 20, 2026
ca7019c
Resolve Compose profiles before certificate restarts
markverick Oct 20, 2026
69683e4
Add dedicated repository for the NDNd network
markverick Oct 21, 2026
06fd9a4
Avoid missing repo bind files and authorize NDNd user identities
markverick Oct 21, 2026
e055bc1
Add separate Merkle log for the NDNd network
markverick Oct 21, 2026
2d099d7
Enable the NDNd Merkle log on every NDNd node
markverick Oct 21, 2026
e7a44ca
Keep NDNd Merkle deployment UCLA-only like the NFD service
markverick Oct 21, 2026
6948238
Enable local-hop management for NDNd client registration
markverick Oct 21, 2026
26f45c4
Pin all NDNd services and provisioning to workflow run 39708255483
markverick Oct 22, 2026
23d5c99
Update Python repo to PR 119 image from run 39997406675
markverick Oct 23, 2026
3615d1c
Deploy DV2 image with explicit status trust and HTTP reports
markverick Oct 27, 2026
ff3bdd8
Stop deployment when repository updates fail
markverick Oct 27, 2026
bbf6666
Retain compatible repository and Merkle images
markverick Oct 27, 2026
8048627
Deploy DV2 repository schema image from run 40489426886
markverick Oct 27, 2026
f8ed175
Enable NDNd at HK, Singapore, and Frankfurt
markverick Oct 27, 2026
664f269
Reload the HTTP signer when host authorization changes
markverick Oct 30, 2026
51a2356
Allow preserving an existing NFD repository image
markverick Oct 27, 2026
77c6665
Deploy NDNd staging image from run 40631720501
markverick Oct 28, 2026
934906c
Deploy NDNd staging image from run 40977341660
markverick Oct 30, 2026
55e071b
Use NLSR neighbor topology for NDNd routing
markverick Oct 30, 2026
e40fc34
Bridge NFD and NDNd networks with symmetric gateway routes
markverick Oct 30, 2026
f4fe35a
Limit the testbed patch to NDNd integration
markverick Oct 30, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,5 @@ __pycache__/
dist/
secrets.yml
.env
root-ca-home/
root-ca-home/
ndnd-root-ca-home/
71 changes: 71 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,10 @@ docker compose exec -e HOME=/testbed/root-ca-home master ndnsec list -c

Each node runs the pinned `ndnd-repo` container with identity `<default_prefix>/ndnd/repo` (e.g. `/ndn/edu/ucla/ndnd/repo`). Master generates a dedicated key, obtains a certificate from the local site CA, and installs the public chain selected by `globals.ndnd_repo_anchors`. The repo can write only its keychain and storage; it has no access to CA private keys or master renewal scripts.

## NDNd Distance Vector

Nodes with `ndnd_enabled: true` run the NDNd forwarder and a separate `ndnd dv` router. The router connects only to the forwarder's `/run/ndnd/ndnd.sock` and exchanges DV traffic over the forwarder's UDP listener on port 6364; it does not use NFD's socket or NLSR. Router identities are root-signed as `<default_prefix>/32=DV`, and each router has permanent UDP neighbor links to the other NDNd-enabled nodes.

## NDNd Merkle

Only UCLA runs the `ndnd-merkle` container, selected by `services.ndnd-merkle.hosts: [UCLA]` in `config.yml`, with identity `/ndn/edu/ucla/ndnd/merkle`. Master automatically provisions and renews its dedicated site-issued certificate using the same testbed anchors as the repo. Its trust schema permits testbed-certified users to append under their own identities and only the log key to sign responses. History persists in `dist/ndnd-merkle/storage`.
Expand Down Expand Up @@ -144,3 +148,70 @@ sudo systemctl enable unattended-upgrades
sudo systemctl start unattended-upgrades
sudo unattended-upgrades --debug
```

## NDNd status

The NDNd forwarder, DV router, status server, CA services, and `/ndnd` Merkle log
use the digest-pinned DV2 staging image configured in Compose. The `/ndnd`
repository retains its separately pinned DV2 image.
Upgrade the forwarder, DV router, and status server together; the DV2 BIFT
management dataset uses TLV encoding. Both repository configurations explicitly
supply their management trust schema.

The NFD-connected `ndnd-repo` retains the October 22 image because DV2's local
prefix advertising uses the DV management API instead of NFD RIB registration.
The NFD-connected Merkle log also retains the October 22 image.

On hosts with `ndnd_enabled: true`, Caddy exposes:

- `/ndnd-status/`: HTML status page.
- `/ndnd-status/status.xml`: XML status report.
- `/ndnd-status/status.json`: JSON status report.

For example: `https://suns.cs.ucla.edu/ndnd-status/status.json`.

The renderer compiles `templates/ndnd-dv/dv-schema.lvs.j2` for both DV and the
status server. It permits only inventoried NDNd router certificates, issued
directly by the `/ndnd` root, to sign their routing and status datasets. DV
explicitly loads this schema; the status server receives the same schema and
the public root certificate in PEM format through a separate read-only mount.
It has no access to router private keys. Changes to either status trust file
cause the existing renderer to restart the status server.
The same compiled schema is published at `/file-server/ndnd/dv-schema.tlv`,
matching the schema URL in the NDNd CA profile.

The status server validates `/<router>/32=DV/32=STATUS` before including the
routing dataset. It does not fall back to an unrestricted schema. The local
DV summary remains available if the signed dataset cannot be validated; check
the status server logs and the report's routing state in that case.


## NDNd network bridge

NDNd-enabled sites bridge the two forwarders locally over UDP. NFD sends `/ndnd`
Interests to NDNd through a capture route, excluding inherited root routes, and
advertises `/ndnd` through NLSR. NDNd installs a `/ndn` PET
next hop toward NFD and advertises it through DV. Producers still register on
the network matching their top-level prefix; the bridge does not redistribute
producer registrations or change application trust policies.

Each enabled host needs a unique, stable `ndnd_bier_index`. The forwarder loads
that index at startup, and `framework/ndnd-network-init.py` registers the same
router-to-index inventory on every node and rebuilds the BIFT. Both cron scripts
run this initializer after service updates. It binds announcements to permanent
UDP faces, restores entries after restarts, and reloads NDNd-connected producers
when their forwarder's startup time changes. The NFD-connected repository and
Merkle service are outside that restart group.

NDNd uses the NLSR neighbor connections between enabled sites. DV2 currently
uses a fixed cost of 1 per link; it does not use NLSR's configured link costs.

To reconcile a running node manually from its checkout:

```bash
docker compose exec -T -e PWD="$PWD" master python3 framework/ndnd-network-init.py
```

The bridge has static routes. An abrupt peer failure does not automatically
withdraw its gateway advertisement; alternative gateway advertisements alone do
not guarantee immediate failover. Gateway health tracking is not implemented here.
1 change: 1 addition & 0 deletions anchors/ndnd-go-root.base64
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
BugHIwgEbmRuZAgDS0VZCAiErVznAwK56QgCTkE2CAAAAaFYpS5aFAkYAQIZBAA27oAVLDAqMAUGAytlcAMhAOi1L42QxRzGB/yMvduMM19dM3ukSmyubURXLZG9RvY1FkYbAQUcFwcVCARuZG5kCANLRVkICIStXOcDArnp/QD9Jv0A/g8yMDI2MTAyMFQwOTI5NDL9AP8PMjAyNzEwMjBUMDkyOTQyF0Aj+qOlJSdFN9wGXmnobfYLUmjqNikwnydWB6qUAmp1EGZN5d3q8kcQ5By/6B44uzeVau5TksFdwRZKoB7HtxwE
68 changes: 68 additions & 0 deletions config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,42 @@ host_vars_path: host_vars

# This must match exactly with the docker-compose.yml file
services:
ndnd:
enabled_by: ndnd_enabled
profile: ndnd
template_path: templates/ndnd
render_path: dist/ndnd

ndnd-dv:
enabled_by: ndnd_enabled
profile: ndnd
template_path: templates/ndnd-dv
render_path: dist/ndnd-dv-independent

ndnd-http-status-server:
enabled_by: ndnd_enabled
profile: ndnd
template_path: templates/ndnd-http-status-server
render_path: dist/ndnd-http-status-server

ndnd-go-ca:
enabled_by: ndnd_enabled
profile: ndnd-go-ca
template_path: templates/ndnd-site-ca
render_path: dist/ndnd-site-ca-config

ndnd-go-root-ca:
hosts: [UCLA]
profile: ndnd-go-root-ca
template_path: templates/ndnd-go-ca
render_path: dist/ndnd-go-root-config

ndnd-root-http-ca:
hosts: [UCLA]
profile: ndnd-go-root-ca
template_path: templates/ndnd-root-http-ca
render_path: dist/ndnd-go-root-config

caddy:
template_path: templates/caddy
render_path: dist/caddy
Expand Down Expand Up @@ -39,12 +75,25 @@ services:
template_path: templates/ndnd-repo
render_path: dist/ndnd-repo

ndnd-network-repo:
enabled_by: ndnd_enabled
profile: ndnd
template_path: templates/ndnd-network-repo
render_path: dist/ndnd-network-repo

ndnd-merkle:
hosts: [UCLA]
profile: merkle-log
template_path: templates/ndnd-merkle
render_path: dist/ndnd-merkle

ndnd-network-merkle:
hosts: [UCLA]
enabled_by: ndnd_enabled
profile: ndnd-merkle-log
template_path: templates/ndnd-network-merkle
render_path: dist/ndnd-network-merkle

ndncert:
template_path: templates/ndncert
render_path: dist/ndncert
Expand Down Expand Up @@ -74,6 +123,21 @@ globals:
# Explicitly select the active root; retain additional roots here during rollover.
ndnd_repo_anchors:
- anchors/ndn-testbed-root.ndncert.2204.base64
ndnd_udp_port: 6364
ndnd_dv_network: /ndnd
ndnd_ca_host: UCLA
ndnd_ca_image: ghcr.io/named-data/ndnd:dv2-staging@sha256:aba4d409d0f3ed2a7b134bd5d0ade0e0c9c37ad55e69254951c306f961b36d5b
ndnd_ca_info: "NDNd Testbed Go CA"
ndnd_ca_max_validity_period: "7776000"
ndnd_ca_max_suffix_length: "5"
ndnd_ca_supported_challenges: [email, dns]
ndnd_site_ca_supported_challenges: [email]
ndnd_root_certificate_url: https://suns.cs.ucla.edu/file-server/ndnd/ndnd-root.ndncert
ndnd_root_certificate_sha256: c020b0ddf2c82dcbdbb8339bc63d8a63d8fece4be41d3f69097cd3185dd47889
ndnd_root_http_ca_url: https://suns.cs.ucla.edu/ndnd-ca
ndnd_root_anchor_path: anchors/ndnd-go-root.base64
ndnd_trust_schema_url: https://suns.cs.ucla.edu/file-server/ndnd/dv-schema.tlv
ndnd_root_http_ca_internal_url: http://ndnd-root-http-ca:8777

# Declare variables available for each host
# You can use lint.py to check variables, their types and
Expand All @@ -97,8 +161,12 @@ variables:
memsize: number
neighbors: dict
position: list
ndnd_ca_prefix: "?string"
hr_angle: number
hr_radius: number
ethernet_device: string
is_root_ca: "?boolean"
is_status_page: "?boolean"
ndnd_enabled: "?boolean"
ndnd_router_prefix: "?string"
ndnd_bier_index: "?number"
Loading