<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Tenant Networking on Deevnet IoTaaS</title><link>https://deevnet.github.io/deevnet-docs/docs/architecture/decisions/tenant-networking/</link><description>Recent content in Tenant Networking on Deevnet IoTaaS</description><generator>Hugo</generator><language>en-us</language><atom:link href="https://deevnet.github.io/deevnet-docs/docs/architecture/decisions/tenant-networking/index.xml" rel="self" type="application/rss+xml"/><item><title>ADR-0029: Tenant Developer Network Keys</title><link>https://deevnet.github.io/deevnet-docs/docs/architecture/decisions/tenant-networking/0029-tenant-developer-network-keys/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/architecture/decisions/tenant-networking/0029-tenant-developer-network-keys/</guid><description>&lt;h1 id="adr-0029-one-key-per-tenant-on-the-tenant-developer-network-issued-at-admission">
 ADR-0029: One Key per Tenant on the Tenant Developer Network, Issued at Admission
 &lt;a class="anchor" href="#adr-0029-one-key-per-tenant-on-the-tenant-developer-network-issued-at-admission">#&lt;/a>
&lt;/h1>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>&lt;/th>
 &lt;th>&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;strong>Status&lt;/strong>&lt;/td>
 &lt;td>Accepted (2026-09-27): built and proven by 
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/changes/2026/0029-tenant-developer-network-keys/">CHG-0029&lt;/a>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Date&lt;/strong>&lt;/td>
 &lt;td>2026-09-27&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Scope&lt;/strong>&lt;/td>
 &lt;td>How a tenant developer&amp;rsquo;s laptop gets onto &lt;code>DVNTM-TD&lt;/code>, how one tenant is kept from another there, and how that access ends. Not what the segment may reach (CHG-0022, CHG-0024, ADR-0028 §5).&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Amends&lt;/strong>&lt;/td>
 &lt;td>
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/changes/2026/0022-tenant-dev-network/">CHG-0022&lt;/a>&amp;rsquo;s design note &lt;em>&amp;ldquo;A shared key, not PPSK&amp;rdquo;&lt;/em>; 
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/architecture/decisions/tenant-model/0015-tenant-onboarding-through-api/">ADR-0015&lt;/a> §10 (what an admission hands over)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Related&lt;/strong>&lt;/td>
 &lt;td>
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/architecture/decisions/tenant-model/0012-iot-platform-api/">ADR-0012&lt;/a> §3 (per-tenant PPSK keys), 
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/architecture/decisions/tenant-model/0028-tenant-workload-login/">ADR-0028&lt;/a>, 
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/changes/2026/0029-tenant-developer-network-keys/">CHG-0029&lt;/a>&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="context">
 Context
 &lt;a class="anchor" href="#context">#&lt;/a>
&lt;/h2>
&lt;p>&lt;code>DVNTM-TD&lt;/code> is where a tenant developer&amp;rsquo;s laptop sits to apply Terraform, reach the broker, read logs
and, after ADR-0028, log in to its workloads. Today every tenant shares one WPA2-Personal key on it,
with PMF off, and laptops on it can reach each other. Together that lets tenant A take tenant B&amp;rsquo;s
tenant:&lt;/p></description></item><item><title>ADR-0019: Tenant Layer 2 at the Access Edge</title><link>https://deevnet.github.io/deevnet-docs/docs/architecture/decisions/tenant-networking/0019-tenant-l2-at-the-access-edge/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/architecture/decisions/tenant-networking/0019-tenant-l2-at-the-access-edge/</guid><description>&lt;h1 id="adr-0019-tenant-layer-2-at-the-access-edge">
 ADR-0019: Tenant Layer 2 at the Access Edge
 &lt;a class="anchor" href="#adr-0019-tenant-layer-2-at-the-access-edge">#&lt;/a>
&lt;/h1>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>&lt;/th>
 &lt;th>&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;strong>Status&lt;/strong>&lt;/td>
 &lt;td>Accepted&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Accepted&lt;/strong>&lt;/td>
 &lt;td>2026-09-19. It decides &lt;em>not&lt;/em> to build something, so there is no implementation to wait for. Its one open question was closed by reasoning rather than by experiment — see 
 &lt;a href="#the-open-question-closed">The open question, closed&lt;/a> — and its reconsideration trigger was corrected, because the protocols it first named do not in fact require Layer 2 adjacency.&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Date&lt;/strong>&lt;/td>
 &lt;td>2026-09-18&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Scope&lt;/strong>&lt;/td>
 &lt;td>Whether a tenant&amp;rsquo;s EVPN/VXLAN overlay may be extended to the wireless access network as an 802.1Q VLAN, so that a physical device becomes a Layer 2 member of its tenant&amp;rsquo;s subnet&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Re-opens&lt;/strong>&lt;/td>
 &lt;td>
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/architecture/decisions/edge-devices/0011-edge-devices-application-owned/">ADR-0011&lt;/a> Option B, rejected 2026-09-15, in the light of a variation it did not consider: a VLAN range reserved once, so tenant creation needs no switch change&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Depends on&lt;/strong>&lt;/td>
 &lt;td>
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/architecture/decisions/tenant-networking/0001-tenant-network-fabric/">ADR-0001: Tenant Network Fabric&lt;/a>, 
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/architecture/decisions/edge-devices/0011-edge-devices-application-owned/">ADR-0011: Edge Devices Are Application-Owned and Platform-Attached&lt;/a>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Related&lt;/strong>&lt;/td>
 &lt;td>
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/architecture/decisions/tenant-networking/0002-tenant-fabric-numbering/">ADR-0002: Tenant Fabric Numbering&lt;/a>, 
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/architecture/decisions/substrate/0009-network-device-config-ownership/">ADR-0009: Network Device Configuration Is Inventory-Owned&lt;/a>, 
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/architecture/decisions/tenant-model/0012-iot-platform-api/">ADR-0012: IoT Platform Services Through a Deevnet API&lt;/a>, 
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/architecture/decisions/tenant-networking/0018-operator-access-to-tenants/">ADR-0018: Operator Access to Tenant Workloads&lt;/a>, 
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/standards/network-segmentation/">Network Segmentation&lt;/a> §4&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="context">
 Context
 &lt;a class="anchor" href="#context">#&lt;/a>
&lt;/h2>
&lt;p>
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/architecture/decisions/edge-devices/0011-edge-devices-application-owned/">ADR-0011&lt;/a> settled where a
physical device attaches: the access network of its &lt;strong>trust class&lt;/strong>, not its owner&amp;rsquo;s tenant fabric.
Its Option B — a per-tenant edge VLAN carried over the AP trunk and bridged into the tenant&amp;rsquo;s VRF —
was rejected on 2026-09-15, and 
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/changes/2026/0013-tenant-wifi-ppsk-keys/">CHG-0013&lt;/a> then
built the accepted model: one PPSK key per tenant per trust class, bound by the Deevnet API to that
class&amp;rsquo;s VLAN.&lt;/p></description></item><item><title>ADR-0018: Operator Access to Tenant Workloads</title><link>https://deevnet.github.io/deevnet-docs/docs/architecture/decisions/tenant-networking/0018-operator-access-to-tenants/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/architecture/decisions/tenant-networking/0018-operator-access-to-tenants/</guid><description>&lt;h1 id="adr-0018-operator-access-to-tenant-workloads">
 ADR-0018: Operator Access to Tenant Workloads
 &lt;a class="anchor" href="#adr-0018-operator-access-to-tenant-workloads">#&lt;/a>
&lt;/h1>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>&lt;/th>
 &lt;th>&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;strong>Status&lt;/strong>&lt;/td>
 &lt;td>Accepted&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Accepted&lt;/strong>&lt;/td>
 &lt;td>2026-09-19, recording what 
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/changes/2026/0012-operator-access-to-tenants/">CHG-0012&lt;/a> applied on 2026-09-18. The route is in place and verified from both operator zones; what waits on CHG-0007 is enforcement of the surrounding policy, not this decision.&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Date&lt;/strong>&lt;/td>
 &lt;td>2026-09-18&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Scope&lt;/strong>&lt;/td>
 &lt;td>Whether the substrate&amp;rsquo;s operator networks may reach tenant workloads, and what that does to the &amp;ldquo;no inbound path&amp;rdquo; property other records rely on&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Supersedes, in part&lt;/strong>&lt;/td>
 &lt;td>
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/architecture/decisions/tenant-networking/0001-tenant-network-fabric/">ADR-0001: Tenant Network Fabric&lt;/a> and 
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/architecture/decisions/tenant-networking/0002-tenant-fabric-numbering/">ADR-0002: Tenant Fabric Numbering&lt;/a>, where each says the core router &lt;strong>never learns tenant address space&lt;/strong>. It now learns one aggregate route. Everything else in both records stands, including SNAT at the exit node and per-tenant isolation inside the fabric.&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Related&lt;/strong>&lt;/td>
 &lt;td>
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/architecture/decisions/tenant-networking/0003-tenant-egress-single-member-fabric/">ADR-0003: Tenant Egress on a Single-Member Fabric&lt;/a>, 
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/architecture/decisions/tenant-model/0010-tenants-consume-platform-services/">ADR-0010: Tenants Consume Platform Services&lt;/a>, 
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/architecture/decisions/edge-devices/0011-edge-devices-application-owned/">ADR-0011: Edge Devices Are Application-Owned&lt;/a>, 
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/architecture/decisions/tenant-model/0012-iot-platform-api/">ADR-0012: IoT Platform Services Through a Deevnet API and Terraform Provider&lt;/a>, 
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/architecture/decisions/tenant-model/0017-tenant-code-delivery/">ADR-0017: How Tenant Code Reaches a Tenant Workload&lt;/a>&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="context">
 Context
 &lt;a class="anchor" href="#context">#&lt;/a>
&lt;/h2>
&lt;h3 id="the-property-and-who-relies-on-it">
 The property, and who relies on it
 &lt;a class="anchor" href="#the-property-and-who-relies-on-it">#&lt;/a>
&lt;/h3>
&lt;p>Six records state some form of &amp;ldquo;a tenant has no inbound path&amp;rdquo;. They do not all mean the same thing,
and the difference matters:&lt;/p></description></item><item><title>ADR-0003: Tenant Egress on a Single-Member Fabric</title><link>https://deevnet.github.io/deevnet-docs/docs/architecture/decisions/tenant-networking/0003-tenant-egress-single-member-fabric/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/architecture/decisions/tenant-networking/0003-tenant-egress-single-member-fabric/</guid><description>&lt;h1 id="adr-0003-tenant-egress-on-a-single-member-fabric">
 ADR-0003: Tenant Egress on a Single-Member Fabric
 &lt;a class="anchor" href="#adr-0003-tenant-egress-on-a-single-member-fabric">#&lt;/a>
&lt;/h1>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>&lt;/th>
 &lt;th>&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;strong>Status&lt;/strong>&lt;/td>
 &lt;td>&lt;strong>Accepted&lt;/strong>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Date&lt;/strong>&lt;/td>
 &lt;td>2026-09-01&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Scope&lt;/strong>&lt;/td>
 &lt;td>How tenant workloads reach the perimeter, and why they must reach it rather than route around it&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Depends on&lt;/strong>&lt;/td>
 &lt;td>
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/architecture/decisions/tenant-networking/0001-tenant-network-fabric/">ADR-0001: Tenant Network Fabric&lt;/a>&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="context">
 Context
 &lt;a class="anchor" href="#context">#&lt;/a>
&lt;/h2>
&lt;p>
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/architecture/decisions/tenant-networking/0001-tenant-network-fabric/">ADR-0001&lt;/a> chose a self-contained
EVPN/VXLAN fabric per tenant hypervisor, realized today as a &lt;strong>single-member fabric&lt;/strong> on hv02 and
designed to expand by adding members. Seam 1 of that record defines north-south egress: aggregate
tenant traffic leaves the fabric on a transit VLAN, and the core router is a perimeter that never
learns tenant address space.&lt;/p></description></item><item><title>ADR-0002: Tenant Fabric Numbering</title><link>https://deevnet.github.io/deevnet-docs/docs/architecture/decisions/tenant-networking/0002-tenant-fabric-numbering/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/architecture/decisions/tenant-networking/0002-tenant-fabric-numbering/</guid><description>&lt;h1 id="adr-0002-tenant-fabric-numbering">
 ADR-0002: Tenant Fabric Numbering
 &lt;a class="anchor" href="#adr-0002-tenant-fabric-numbering">#&lt;/a>
&lt;/h1>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>&lt;/th>
 &lt;th>&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;strong>Status&lt;/strong>&lt;/td>
 &lt;td>Accepted&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Date&lt;/strong>&lt;/td>
 &lt;td>2026-08-30&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Scope&lt;/strong>&lt;/td>
 &lt;td>Address and identifier allocation for the tenant fabric and the tenants on it&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Depends on&lt;/strong>&lt;/td>
 &lt;td>
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/architecture/decisions/tenant-networking/0001-tenant-network-fabric/">ADR-0001: Tenant Network Fabric&lt;/a>&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="context">
 Context
 &lt;a class="anchor" href="#context">#&lt;/a>
&lt;/h2>
&lt;p>ADR-0001 made &lt;strong>globally-unique numbering&lt;/strong> its first build requirement: allocate VNIs, VRF
identifiers, and tenant subnets &lt;em>as if they already share one fabric&lt;/em>, so that gaining a member
is additive rather than a renumbering. It did not say what that scheme is. The Tenant Platform
roadmap carried it as an open thread.&lt;/p></description></item><item><title>ADR-0001: Tenant Network Fabric</title><link>https://deevnet.github.io/deevnet-docs/docs/architecture/decisions/tenant-networking/0001-tenant-network-fabric/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/architecture/decisions/tenant-networking/0001-tenant-network-fabric/</guid><description>&lt;h1 id="adr-0001-tenant-network-fabric">
 ADR-0001: Tenant Network Fabric
 &lt;a class="anchor" href="#adr-0001-tenant-network-fabric">#&lt;/a>
&lt;/h1>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>&lt;/th>
 &lt;th>&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;strong>Status&lt;/strong>&lt;/td>
 &lt;td>Accepted&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Date&lt;/strong>&lt;/td>
 &lt;td>2026-08-30&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Scope&lt;/strong>&lt;/td>
 &lt;td>Tenant networking on the tenant hypervisor; relationship to the core router and management hypervisor&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Supersedes&lt;/strong>&lt;/td>
 &lt;td>The Option A tenant-networking model previously described in &lt;code>architecture/tenant/networking.md&lt;/code> (core-router-owned per-tenant VLANs)&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="context">
 Context
 &lt;a class="anchor" href="#context">#&lt;/a>
&lt;/h2>
&lt;p>We are ready to begin hosting &lt;strong>tenants&lt;/strong> — isolated application workloads — on the tenant
hypervisor. A tenant needs a network: an address space, a gateway, routing, isolation from
other tenants, and a controlled path to the outside world.&lt;/p></description></item></channel></rss>