public inbox for pve-devel@lists.proxmox.com
 help / color / mirror / Atom feed
From: Hannes Laimer <h.laimer@proxmox.com>
To: pve-devel@lists.proxmox.com
Subject: [PATCH docs/manager/network/proxmox{-ve-rs,-perl-rs} v2 0/7] sdn: add BGP fabric
Date: Wed, 15 Apr 2026 13:11:27 +0200	[thread overview]
Message-ID: <20260415111134.124720-1-h.laimer@proxmox.com> (raw)

This patch series adds BGP as a third fabric protocol alongside OpenFabric
and OSPF. It targets eBGP unnumbered underlays where each node has a unique
ASN and peers over physical interfaces without IP assignment on fabric links.

## Dependencies

This series depends on the evpn-rework and route-maps series.

## eBGP underlay

Each node gets its own ASN (e.g. 65001, 65002, 65003) and peers with its
neighbors using 'remote-as external' on unnumbered interfaces. The fabric
peer-group is named after the fabric ID and uses BFD when enabled.

## EVPN overlay

When the EVPN controller references a BGP fabric, VTEP sessions are iBGP,
consistent with how EVPN operates on OSPF and OpenFabric fabrics. The
per-node ASN is applied via 'local-as' on the underlay neighbor group.

## Single BGP process

Unlike OSPF and OpenFabric which have their own FRR protocol blocks, BGP
fabric config must coexist with the EVPN BGP config in one 'router bgp'
instance. The fabric generates its own BgpRouter and merges it into the
existing one via merge_fabric(), appending neighbor groups and address
families without overwriting the EVPN settings.

## IPv6-only support

For nodes with only an IPv6 address, the BGP router-id (which must be a
32-bit value) is derived from the IPv6 address using FNV-1a hashing.

### Testing results for hash collisions
Scattered /64           n=1000       unique=1000       collisions=0      worst=1
Scattered /64           n=10000      unique=10000      collisions=0      worst=1
Scattered /64           n=100000     unique=99997      collisions=3      worst=2
Sequential /64          n=1000       unique=1000       collisions=0      worst=1
Sequential /64          n=10000      unique=10000      collisions=0      worst=1
Sequential /64          n=100000     unique=100000     collisions=0      worst=1
Spaced /64 (step 256)   n=1000       unique=1000       collisions=0      worst=1
Spaced /64 (step 256)   n=10000      unique=10000      collisions=0      worst=1
Spaced /64 (step 256)   n=100000     unique=100000     collisions=0      worst=1
Sparse multi-/48        n=1000       unique=1000       collisions=0      worst=1
Sparse multi-/48        n=10000      unique=10000      collisions=0      worst=1
Sparse multi-/48        n=100000     unique=100000     collisions=0      worst=1

Only the random assignment in a /64 prefix caused a tiny amount of collisions,
and having 100k routers with randomly assigned IPs is not really typical. So
FNV-1a does seem like a good choice here. (generally I'm open to alternative
approaches for getting router-ids on nodes with no ipv4 ips)


Thanks a lot @Stefan for the base of this series!


v2, thanks @Gabriel and @Stefan for the (off-list) feedback on v1!:
 - switched EVPN overlay from eBGP to iBGP
 - rebased onto Stefan's evpn[1]/route-maps[2] series
 - made LocalAsSettings fields pub (needed for Rust-side construction)
 - added router-id collision validation for IPv6-only nodes
 - added docs section

[1] https://lore.proxmox.com/pve-devel/20260414163315.419384-1-s.hanreich@proxmox.com/
[2] https://lore.proxmox.com/pve-devel/20260401143957.386809-1-s.hanreich@proxmox.com/


proxmox-ve-rs:

Stefan Hanreich (1):
  sdn: fabric: add BGP protocol support

 proxmox-frr/src/ser/bgp.rs                    |  85 +++++-
 proxmox-ve-config/src/sdn/fabric/frr.rs       | 254 +++++++++++++++-
 proxmox-ve-config/src/sdn/fabric/mod.rs       | 111 +++++++
 .../src/sdn/fabric/section_config/fabric.rs   |  22 ++
 .../src/sdn/fabric/section_config/mod.rs      |  19 ++
 .../src/sdn/fabric/section_config/node.rs     |  21 ++
 .../sdn/fabric/section_config/protocol/bgp.rs | 286 ++++++++++++++++++
 .../sdn/fabric/section_config/protocol/mod.rs |   1 +
 .../tests/fabric/cfg/bgp_default/fabrics.cfg  |  17 ++
 .../fabric/cfg/bgp_ipv6_only/fabrics.cfg      |  17 ++
 proxmox-ve-config/tests/fabric/main.rs        | 119 +++++++-
 .../snapshots/fabric__bgp_default_pve.snap    |  28 ++
 .../snapshots/fabric__bgp_default_pve1.snap   |  27 ++
 .../snapshots/fabric__bgp_ipv6_only_pve.snap  |  29 ++
 .../snapshots/fabric__bgp_ipv6_only_pve1.snap |  28 ++
 .../fabric__bgp_merge_with_evpn_pve.snap      |  34 +++
 16 files changed, 1089 insertions(+), 9 deletions(-)
 create mode 100644 proxmox-ve-config/src/sdn/fabric/section_config/protocol/bgp.rs
 create mode 100644 proxmox-ve-config/tests/fabric/cfg/bgp_default/fabrics.cfg
 create mode 100644 proxmox-ve-config/tests/fabric/cfg/bgp_ipv6_only/fabrics.cfg
 create mode 100644 proxmox-ve-config/tests/fabric/snapshots/fabric__bgp_default_pve.snap
 create mode 100644 proxmox-ve-config/tests/fabric/snapshots/fabric__bgp_default_pve1.snap
 create mode 100644 proxmox-ve-config/tests/fabric/snapshots/fabric__bgp_ipv6_only_pve.snap
 create mode 100644 proxmox-ve-config/tests/fabric/snapshots/fabric__bgp_ipv6_only_pve1.snap
 create mode 100644 proxmox-ve-config/tests/fabric/snapshots/fabric__bgp_merge_with_evpn_pve.snap


proxmox-perl-rs:

Hannes Laimer (1):
  sdn: fabrics: add BGP status endpoints

Stefan Hanreich (1):
  sdn: fabrics: add BGP config generation

 pve-rs/src/bindings/sdn/fabrics.rs | 114 +++++++++++++++++++++++++++++
 pve-rs/src/sdn/status.rs           | 105 +++++++++++++++++++++++++-
 2 files changed, 217 insertions(+), 2 deletions(-)


pve-network:

Hannes Laimer (2):
  sdn: fabrics: register bgp as a fabric protocol type
  test: evpn: add integration test for EVPN over BGP fabric

 src/PVE/Network/SDN/Fabrics.pm                | 18 +++-
 .../bgp_fabric/expected_controller_config     | 65 ++++++++++++++
 .../evpn/bgp_fabric/expected_sdn_interfaces   | 56 ++++++++++++
 src/test/zones/evpn/bgp_fabric/interfaces     |  6 ++
 src/test/zones/evpn/bgp_fabric/sdn_config     | 85 +++++++++++++++++++
 5 files changed, 229 insertions(+), 1 deletion(-)
 create mode 100644 src/test/zones/evpn/bgp_fabric/expected_controller_config
 create mode 100644 src/test/zones/evpn/bgp_fabric/expected_sdn_interfaces
 create mode 100644 src/test/zones/evpn/bgp_fabric/interfaces
 create mode 100644 src/test/zones/evpn/bgp_fabric/sdn_config


pve-manager:

Hannes Laimer (1):
  ui: sdn: add BGP fabric support

 www/manager6/Makefile                         |  3 ++
 www/manager6/sdn/FabricsView.js               | 12 +++++
 www/manager6/sdn/fabrics/NodeEdit.js          |  1 +
 www/manager6/sdn/fabrics/bgp/FabricEdit.js    | 53 +++++++++++++++++++
 .../sdn/fabrics/bgp/InterfacePanel.js         | 13 +++++
 www/manager6/sdn/fabrics/bgp/NodeEdit.js      | 32 +++++++++++
 6 files changed, 114 insertions(+)
 create mode 100644 www/manager6/sdn/fabrics/bgp/FabricEdit.js
 create mode 100644 www/manager6/sdn/fabrics/bgp/InterfacePanel.js
 create mode 100644 www/manager6/sdn/fabrics/bgp/NodeEdit.js


pve-docs:

Hannes Laimer (1):
  sdn: add bgp fabric section

 pvesdn.adoc | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 66 insertions(+)


Summary over all repositories:
  30 files changed, 1715 insertions(+), 12 deletions(-)

-- 
Generated by murpp 0.11.0




             reply	other threads:[~2026-04-15 11:11 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-04-15 11:11 Hannes Laimer [this message]
2026-04-15 11:11 ` [PATCH proxmox-ve-rs v2 1/7] sdn: fabric: add BGP protocol support Hannes Laimer
2026-04-15 11:11 ` [PATCH proxmox-perl-rs v2 2/7] sdn: fabrics: add BGP config generation Hannes Laimer
2026-04-15 11:11 ` [PATCH proxmox-perl-rs v2 3/7] sdn: fabrics: add BGP status endpoints Hannes Laimer
2026-04-15 11:11 ` [PATCH pve-network v2 4/7] sdn: fabrics: register bgp as a fabric protocol type Hannes Laimer
2026-04-15 11:11 ` [PATCH pve-network v2 5/7] test: evpn: add integration test for EVPN over BGP fabric Hannes Laimer
2026-04-15 11:11 ` [PATCH pve-manager v2 6/7] ui: sdn: add BGP fabric support Hannes Laimer
2026-04-15 11:11 ` [PATCH pve-docs v2 7/7] sdn: add bgp fabric section Hannes Laimer

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260415111134.124720-1-h.laimer@proxmox.com \
    --to=h.laimer@proxmox.com \
    --cc=pve-devel@lists.proxmox.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal