[PATCH] Netlab: cf-bgp-unnumbered-autopeering
Matteo Perin
matteo.perin at canonical.com
Thu Dec 11 10:16:40 CET 2025
Add testcase for BGP unnumbered automatic peering and related data.
Signed-off-by: Matteo Perin <matteo.perin at canonical.com>
---
.../cf-bgp-unnumbered-autopeering/README.md | 132 ++++++++++++++++++
.../bird_m1.conf | 43 ++++++
.../bird_m2.conf | 43 ++++++
.../cf-bgp-unnumbered-autopeering | 1 +
netlab/cf-bgp-unnumbered-autopeering/config | 10 ++
.../data-v2/nd_peers-m1 | 7 +
.../data-v2/nd_peers-m1-down-m2 | 7 +
.../data-v2/nd_peers-m1-up-m1 | 7 +
.../data-v2/nd_peers-m1-up-m2 | 7 +
.../data-v2/nd_peers-m2 | 7 +
.../data-v2/nd_peers-m2-down-m1 | 7 +
.../data-v2/nd_peers-m2-up-m1 | 7 +
.../data-v2/nd_peers-m2-up-m2 | 7 +
.../data-v2/proto-m1 | 121 ++++++++++++++++
.../data-v2/proto-m1-down-m2 | 121 ++++++++++++++++
.../data-v2/proto-m1-up-m1 | 121 ++++++++++++++++
.../data-v2/proto-m1-up-m2 | 121 ++++++++++++++++
.../data-v2/proto-m2 | 121 ++++++++++++++++
.../data-v2/proto-m2-down-m1 | 121 ++++++++++++++++
.../data-v2/proto-m2-up-m1 | 121 ++++++++++++++++
.../data-v2/proto-m2-up-m2 | 121 ++++++++++++++++
.../test-cf-bgp-unnumbered-autopeering.py | 101 ++++++++++++++
netlab/tests/get_stdout_bird | 1 +
netlab/tests/get_stdout_protocols | 3 +-
netlab/tests/strip_output | 10 ++
25 files changed, 1367 insertions(+), 1 deletion(-)
create mode 100644 netlab/cf-bgp-unnumbered-autopeering/README.md
create mode 100644 netlab/cf-bgp-unnumbered-autopeering/bird_m1.conf
create mode 100644 netlab/cf-bgp-unnumbered-autopeering/bird_m2.conf
create mode 120000 netlab/cf-bgp-unnumbered-autopeering/cf-bgp-unnumbered-autopeering
create mode 100644 netlab/cf-bgp-unnumbered-autopeering/config
create mode 100644 netlab/cf-bgp-unnumbered-autopeering/data-v2/nd_peers-m1
create mode 100644 netlab/cf-bgp-unnumbered-autopeering/data-v2/nd_peers-m1-down-m2
create mode 100644 netlab/cf-bgp-unnumbered-autopeering/data-v2/nd_peers-m1-up-m1
create mode 100644 netlab/cf-bgp-unnumbered-autopeering/data-v2/nd_peers-m1-up-m2
create mode 100644 netlab/cf-bgp-unnumbered-autopeering/data-v2/nd_peers-m2
create mode 100644 netlab/cf-bgp-unnumbered-autopeering/data-v2/nd_peers-m2-down-m1
create mode 100644 netlab/cf-bgp-unnumbered-autopeering/data-v2/nd_peers-m2-up-m1
create mode 100644 netlab/cf-bgp-unnumbered-autopeering/data-v2/nd_peers-m2-up-m2
create mode 100644 netlab/cf-bgp-unnumbered-autopeering/data-v2/proto-m1
create mode 100644 netlab/cf-bgp-unnumbered-autopeering/data-v2/proto-m1-down-m2
create mode 100644 netlab/cf-bgp-unnumbered-autopeering/data-v2/proto-m1-up-m1
create mode 100644 netlab/cf-bgp-unnumbered-autopeering/data-v2/proto-m1-up-m2
create mode 100644 netlab/cf-bgp-unnumbered-autopeering/data-v2/proto-m2
create mode 100644 netlab/cf-bgp-unnumbered-autopeering/data-v2/proto-m2-down-m1
create mode 100644 netlab/cf-bgp-unnumbered-autopeering/data-v2/proto-m2-up-m1
create mode 100644 netlab/cf-bgp-unnumbered-autopeering/data-v2/proto-m2-up-m2
create mode 100644 netlab/cf-bgp-unnumbered-autopeering/test-cf-bgp-unnumbered-autopeering.py
diff --git a/netlab/cf-bgp-unnumbered-autopeering/README.md b/netlab/cf-bgp-unnumbered-autopeering/README.md
new file mode 100644
index 00000000..c43c282e
--- /dev/null
+++ b/netlab/cf-bgp-unnumbered-autopeering/README.md
@@ -0,0 +1,132 @@
+<!--cf-bgp-unnumbered-autopeering-->
+##### Introduction
+This test case verifies the BGP unnumbered auto peering feature where BGP peer
+processes are dynamically spawned based on router discovery via the RADV protocol.
+
+The test case uses a simple two-node topology where both nodes run:
+- RADV protocol for neighbor discovery
+- BGP protocol with dynamic peer instantiation
+
+When neighbors are discovered through router advertisement, BGP sessions should
+be automatically established using link-local IPv6 addresses (fe80::/12).
+
+<br>
+
+##### Topology
+
+---
+
+```
+ AS1 AS2
+ m1 -------------- m2
+ (ve1) (ve2)
+```
+
+The nodes are connected via a virtual ethernet pair (`ve1` on m1, `ve2` on m2).
+
+<br>
+
+##### Configuration
+
+---
+
+Both nodes have similar configurations with the following key features:
+
+1. **Device Protocol**: Tracks interface states
+2. **Peer Table** (`nd_peers`): Stores discovered neighbors
+3. **RADV Protocol** (`radv1`):
+ - Performs router discovery on the interconnecting interface
+ - Populates the peer table with discovered neighbors
+ - Configured with max RA interval of 20s
+4. **BGP Protocol** (`bgp1`):
+ - Dynamically creates BGP peer instances with name pattern `bgp_peer_XXX`
+ - Accepts neighbors from the fe80::/12 range (link-local addresses)
+ - **m1**: `peers persist no` - Dynamic BGP protocols are removed when peers disappear
+ - **m2**: `peers persist yes` - Dynamic BGP protocols remain even when peers go down
+ - Imports peer information from the `nd_peers` table
+ - AS1 (m1): AS 65001
+ - AS2 (m2): AS 65002
+
+<br>
+
+##### Test suite
+
+---
+
+The test suite verifies the following in multiple phases:
+
+**Phase 1: Initial Setup and Convergence**
+1. **Peer table**: Checks that the `nd_peers` table contains discovered neighbors
+2. **BGP protocols**: Verifies that dynamic BGP peer processes are spawned and established
+
+**Phase 2: m2 Down Testing (m1 has peers persist no)**
+3. **Stop m2**: Node m2 is stopped to simulate a peer failure
+4. **BGP protocols after m2 down**: Verifies that dynamic BGP protocols are **removed** from m1
+ (due to `peers persist no` configuration)
+5. **Peer table after m2 down**: Checks that the peer is removed from m1's `nd_peers` table
+
+**Phase 3: m2 Recovery Testing**
+6. **Continue m2**: Node m2 is brought back up
+7. **BGP protocols after m2 up**: Verifies that dynamic BGP protocols are re-spawned on both nodes
+8. **Peer table after m2 up**: Checks that peers are rediscovered and added back to the `nd_peers` table
+
+**Phase 4: m1 Down Testing (m2 has peers persist yes)**
+9. **Stop m1**: Node m1 is stopped to test `peers persist yes` on m2
+10. **BGP protocols after m1 down**: Verifies that dynamic BGP protocols **remain** on m2
+ (albeit in a down state, due to `peers persist yes` configuration)
+11. **Peer table after m1 down**: Checks the peer table state on m2
+
+**Phase 5: m1 Recovery Testing**
+12. **Continue m1**: Node m1 is brought back up
+13. **BGP protocols after m1 up**: Verifies that BGP sessions re-establish on both nodes
+14. **Peer table after m1 up**: Checks that peer table is updated after m1 recovery
+
+In save mode, the test suite captures:
+- `nd_peers_m1`, `nd_peers_m2` - peer tables with discovered neighbors (initial)
+- `proto_m1`, `proto_m2` - protocol states (initial)
+- `proto-m2-down_m1` - protocol states on m1 after m2 is stopped
+- `nd_peers-m2-down_m1` - peer table on m1 after m2 is stopped
+- `proto-m2-up_m1`, `proto-m2-up_m2` - protocol states after m2 recovers
+- `nd_peers-m2-up_m1`, `nd_peers-m2-up_m2` - peer tables after m2 recovers
+- `proto-m1-down_m2` - protocol states on m2 after m1 is stopped (should show protocols in down state)
+- `nd_peers-m1-down_m2` - peer table on m2 after m1 is stopped
+- `proto-m1-up_m1`, `proto-m1-up_m2` - protocol states after m1 recovers
+- `nd_peers-m1-up_m1`, `nd_peers-m1-up_m2` - peer tables after m1 recovers
+
+<br>
+
+##### Expected Behavior
+
+---
+
+**Normal Operation:**
+1. Both nodes start with RADV enabled on their respective interfaces
+2. Router advertisements are exchanged between m1 and m2
+3. Neighbors are discovered and added to the `nd_peers` table
+4. BGP dynamically spawns peer instances (e.g., `bgp_peer_001`) based on discovered peers
+5. BGP sessions establish using link-local IPv6 addresses
+
+**m2 Down Scenario (m1 has peers persist no):**
+1. When m2 is stopped, router advertisements stop
+2. The peer entry for m2 is removed from m1's `nd_peers` table
+3. Due to `peers persist no`, the dynamic BGP protocol on m1 is **removed**
+4. No stale BGP sessions remain on m1
+
+**m2 Recovery Scenario:**
+1. When m2 is brought back up, router advertisements resume
+2. Neighbors are rediscovered through RADV
+3. Peers are added back to the `nd_peers` table
+4. Dynamic BGP protocols are re-spawned automatically
+5. BGP sessions re-establish
+
+**m1 Down Scenario (m2 has peers persist yes):**
+1. When m1 is stopped, router advertisements stop
+2. The peer entry may be removed from m2's `nd_peers` table
+3. Due to `peers persist yes`, the dynamic BGP protocol on m2 **remains** (in down state)
+4. The BGP session persists, ready to reconnect when m1 returns
+
+**m1 Recovery Scenario:**
+1. When m1 is brought back up, router advertisements resume
+2. Neighbors are rediscovered through RADV
+3. The existing dynamic BGP protocol on m2 detects the peer is back
+4. BGP sessions re-establish automatically without needing to spawn new protocols
diff --git a/netlab/cf-bgp-unnumbered-autopeering/bird_m1.conf b/netlab/cf-bgp-unnumbered-autopeering/bird_m1.conf
new file mode 100644
index 00000000..2443228b
--- /dev/null
+++ b/netlab/cf-bgp-unnumbered-autopeering/bird_m1.conf
@@ -0,0 +1,43 @@
+log syslog all;
+log "bird.log" all;
+debug protocols all;
+
+router id 1;
+
+protocol device {
+}
+
+peer table nd_peers;
+
+protocol radv radv1 {
+ peer {
+ table nd_peers;
+ };
+
+ interface "ve1" {
+ max ra interval 20;
+ min ra interval 10;
+
+ router discovery yes;
+ };
+}
+
+protocol bgp bgp1 {
+ dynamic name "bgp_peer";
+ dynamic name digits 3;
+ local as 65001;
+ neighbor range fe80::/12 external;
+
+ peers persist no;
+
+ peers {
+ table nd_peers;
+ import all;
+ export all;
+ };
+
+ ipv6 {
+ import all;
+ export all;
+ };
+}
diff --git a/netlab/cf-bgp-unnumbered-autopeering/bird_m2.conf b/netlab/cf-bgp-unnumbered-autopeering/bird_m2.conf
new file mode 100644
index 00000000..25e4104c
--- /dev/null
+++ b/netlab/cf-bgp-unnumbered-autopeering/bird_m2.conf
@@ -0,0 +1,43 @@
+log syslog all;
+log "bird.log" all;
+debug protocols all;
+
+router id 2;
+
+protocol device {
+}
+
+peer table nd_peers;
+
+protocol radv radv1 {
+ peer {
+ table nd_peers;
+ };
+
+ interface "ve2" {
+ max ra interval 20;
+ min ra interval 10;
+
+ router discovery yes;
+ };
+}
+
+protocol bgp bgp1 {
+ dynamic name "bgp_peer";
+ dynamic name digits 3;
+ local as 65002;
+ neighbor range fe80::/12 external;
+
+ peers persist yes;
+
+ peers {
+ table nd_peers;
+ import all;
+ export all;
+ };
+
+ ipv6 {
+ import all;
+ export all;
+ };
+}
diff --git a/netlab/cf-bgp-unnumbered-autopeering/cf-bgp-unnumbered-autopeering b/netlab/cf-bgp-unnumbered-autopeering/cf-bgp-unnumbered-autopeering
new file mode 120000
index 00000000..2233a804
--- /dev/null
+++ b/netlab/cf-bgp-unnumbered-autopeering/cf-bgp-unnumbered-autopeering
@@ -0,0 +1 @@
+cf-bgp-unnumbered-autopeering
\ No newline at end of file
diff --git a/netlab/cf-bgp-unnumbered-autopeering/config b/netlab/cf-bgp-unnumbered-autopeering/config
new file mode 100644
index 00000000..d8d4dff0
--- /dev/null
+++ b/netlab/cf-bgp-unnumbered-autopeering/config
@@ -0,0 +1,10 @@
+NETLAB_NODES="m1 m2"
+
+netlab_init
+
+if_dummy m1 ve0 10.1.1 2001:db8:1:1
+if_dummy m2 ve0 10.2.1 2001:db8:2:1
+
+if_veth m1 ve1 m2 ve2 10.1.10 2001:db8:1:10
+
+netlab_start
diff --git a/netlab/cf-bgp-unnumbered-autopeering/data-v2/nd_peers-m1 b/netlab/cf-bgp-unnumbered-autopeering/data-v2/nd_peers-m1
new file mode 100644
index 00000000..346a1f3b
--- /dev/null
+++ b/netlab/cf-bgp-unnumbered-autopeering/data-v2/nd_peers-m1
@@ -0,0 +1,7 @@
+BIRD <removed> ready.
+Table nd_peers:
+fe80::88c6:96ff:feb5:9492 from iface 3 [radv1 <removed>] * (0)
+ preference: 0
+ source: device
+ radv_expires_at: <removed>
+ Internal route handling values: <removed>
diff --git a/netlab/cf-bgp-unnumbered-autopeering/data-v2/nd_peers-m1-down-m2 b/netlab/cf-bgp-unnumbered-autopeering/data-v2/nd_peers-m1-down-m2
new file mode 100644
index 00000000..ecba0af3
--- /dev/null
+++ b/netlab/cf-bgp-unnumbered-autopeering/data-v2/nd_peers-m1-down-m2
@@ -0,0 +1,7 @@
+BIRD <removed> ready.
+Table nd_peers:
+fe80::c8f0:65ff:febc:62b4 from iface 3 [radv1 <removed>] * (0)
+ preference: 0
+ source: device
+ radv_expires_at: <removed>
+ Internal route handling values: <removed>
diff --git a/netlab/cf-bgp-unnumbered-autopeering/data-v2/nd_peers-m1-up-m1 b/netlab/cf-bgp-unnumbered-autopeering/data-v2/nd_peers-m1-up-m1
new file mode 100644
index 00000000..346a1f3b
--- /dev/null
+++ b/netlab/cf-bgp-unnumbered-autopeering/data-v2/nd_peers-m1-up-m1
@@ -0,0 +1,7 @@
+BIRD <removed> ready.
+Table nd_peers:
+fe80::88c6:96ff:feb5:9492 from iface 3 [radv1 <removed>] * (0)
+ preference: 0
+ source: device
+ radv_expires_at: <removed>
+ Internal route handling values: <removed>
diff --git a/netlab/cf-bgp-unnumbered-autopeering/data-v2/nd_peers-m1-up-m2 b/netlab/cf-bgp-unnumbered-autopeering/data-v2/nd_peers-m1-up-m2
new file mode 100644
index 00000000..ecba0af3
--- /dev/null
+++ b/netlab/cf-bgp-unnumbered-autopeering/data-v2/nd_peers-m1-up-m2
@@ -0,0 +1,7 @@
+BIRD <removed> ready.
+Table nd_peers:
+fe80::c8f0:65ff:febc:62b4 from iface 3 [radv1 <removed>] * (0)
+ preference: 0
+ source: device
+ radv_expires_at: <removed>
+ Internal route handling values: <removed>
diff --git a/netlab/cf-bgp-unnumbered-autopeering/data-v2/nd_peers-m2 b/netlab/cf-bgp-unnumbered-autopeering/data-v2/nd_peers-m2
new file mode 100644
index 00000000..ecba0af3
--- /dev/null
+++ b/netlab/cf-bgp-unnumbered-autopeering/data-v2/nd_peers-m2
@@ -0,0 +1,7 @@
+BIRD <removed> ready.
+Table nd_peers:
+fe80::c8f0:65ff:febc:62b4 from iface 3 [radv1 <removed>] * (0)
+ preference: 0
+ source: device
+ radv_expires_at: <removed>
+ Internal route handling values: <removed>
diff --git a/netlab/cf-bgp-unnumbered-autopeering/data-v2/nd_peers-m2-down-m1 b/netlab/cf-bgp-unnumbered-autopeering/data-v2/nd_peers-m2-down-m1
new file mode 100644
index 00000000..346a1f3b
--- /dev/null
+++ b/netlab/cf-bgp-unnumbered-autopeering/data-v2/nd_peers-m2-down-m1
@@ -0,0 +1,7 @@
+BIRD <removed> ready.
+Table nd_peers:
+fe80::88c6:96ff:feb5:9492 from iface 3 [radv1 <removed>] * (0)
+ preference: 0
+ source: device
+ radv_expires_at: <removed>
+ Internal route handling values: <removed>
diff --git a/netlab/cf-bgp-unnumbered-autopeering/data-v2/nd_peers-m2-up-m1 b/netlab/cf-bgp-unnumbered-autopeering/data-v2/nd_peers-m2-up-m1
new file mode 100644
index 00000000..346a1f3b
--- /dev/null
+++ b/netlab/cf-bgp-unnumbered-autopeering/data-v2/nd_peers-m2-up-m1
@@ -0,0 +1,7 @@
+BIRD <removed> ready.
+Table nd_peers:
+fe80::88c6:96ff:feb5:9492 from iface 3 [radv1 <removed>] * (0)
+ preference: 0
+ source: device
+ radv_expires_at: <removed>
+ Internal route handling values: <removed>
diff --git a/netlab/cf-bgp-unnumbered-autopeering/data-v2/nd_peers-m2-up-m2 b/netlab/cf-bgp-unnumbered-autopeering/data-v2/nd_peers-m2-up-m2
new file mode 100644
index 00000000..ecba0af3
--- /dev/null
+++ b/netlab/cf-bgp-unnumbered-autopeering/data-v2/nd_peers-m2-up-m2
@@ -0,0 +1,7 @@
+BIRD <removed> ready.
+Table nd_peers:
+fe80::c8f0:65ff:febc:62b4 from iface 3 [radv1 <removed>] * (0)
+ preference: 0
+ source: device
+ radv_expires_at: <removed>
+ Internal route handling values: <removed>
diff --git a/netlab/cf-bgp-unnumbered-autopeering/data-v2/proto-m1 b/netlab/cf-bgp-unnumbered-autopeering/data-v2/proto-m1
new file mode 100644
index 00000000..d018ee0f
--- /dev/null
+++ b/netlab/cf-bgp-unnumbered-autopeering/data-v2/proto-m1
@@ -0,0 +1,121 @@
+BIRD <removed> ready.
+Name Proto Table State Since Info
+device1 Device --- up <removed>
+ Created: <removed>
+
+radv1 RAdv master6 up <removed>
+ Created: <removed>
+ Channel ipv6
+ State: UP
+ Import state: UP
+ Export state: READY
+ Table: master6
+ Preference: 0
+ Input filter: ACCEPT
+ Output filter: REJECT
+ Routes: 0 imported, 0 exported, 0 preferred
+ Route change stats: received rejected filtered ignored RX limit limit accepted
+ Import updates: <removed>
+ Import withdraws: <removed>
+ Export updates: <removed>
+ Export withdraws: <removed>
+ Channel peer
+ State: UP
+ Import state: UP
+ Export state: READY
+ Table: nd_peers
+ Preference: 0
+ Input filter: ACCEPT
+ Output filter: REJECT
+ Routes: 1 imported, 0 exported, 1 preferred
+ Route change stats: received rejected filtered ignored RX limit limit accepted
+ Import updates: <removed>
+ Import withdraws: <removed>
+ Export updates: <removed>
+ Export withdraws: <removed>
+
+bgp1 BGP --- start <removed> Passive
+ Created: <removed>
+ BGP state: Passive
+ Neighbor range: fe80::/12
+ Neighbor AS: 0
+ Local AS: 65001
+ Channel peers
+ State: DOWN
+ Import state: DOWN
+ Export state: DOWN
+ Table: nd_peers
+ Preference: 100
+ Input filter: ACCEPT
+ Output filter: ACCEPT
+ Channel ipv6
+ State: DOWN
+ Import state: DOWN
+ Export state: DOWN
+ Table: master6
+ Preference: 100
+ Input filter: ACCEPT
+ Output filter: ACCEPT
+ Channel peers
+ State: UP
+ Import state: UP
+ Export state: READY
+ Table: nd_peers
+ Preference: 100
+ Input filter: ACCEPT
+ Output filter: ACCEPT
+ Routes: 0 imported, 1 exported, 0 preferred
+ Route change stats: received rejected filtered ignored RX limit limit accepted
+ Import updates: <removed>
+ Import withdraws: <removed>
+ Export updates: <removed>
+ Export withdraws: <removed>
+ BGP Next hop: ::
+ Pending 0 attribute sets with total 0 prefixes to send
+
+bgp_peer<XXX> BGP --- up <removed> Established
+ Created: <removed>
+ BGP state: Established
+ Neighbor address: fe80::88c6:96ff:feb5:9492%ve1
+ Neighbor AS: 65002
+ Local AS: 65001
+ Neighbor ID: 0.0.0.2
+ Local capabilities
+ Multiprotocol
+ AF announced: ipv6
+ Route refresh
+ Graceful restart
+ 4-octet AS numbers
+ Enhanced refresh
+ Long-lived graceful restart
+ Neighbor capabilities
+ Multiprotocol
+ AF announced: ipv6
+ Route refresh
+ Graceful restart
+ 4-octet AS numbers
+ Enhanced refresh
+ Long-lived graceful restart
+ Session: external AS4
+ Source address: fe80::c8f0:65ff:febc:62b4
+ Hold timer: <removed>/240
+ Keepalive timer: <removed>/80
+ TX pending: 0 bytes
+ Send hold timer: <removed>/480
+ Channel ipv6
+ State: UP
+ Import state: UP
+ Export state: READY
+ Table: master6
+ Preference: 100
+ Input filter: ACCEPT
+ Output filter: ACCEPT
+ Routes: 0 imported, 0 exported, 0 preferred
+ Route change stats: received rejected filtered ignored RX limit limit accepted
+ Import updates: <removed>
+ Import withdraws: <removed>
+ Export updates: <removed>
+ Export withdraws: <removed>
+ BGP Next hop: :: fe80::c8f0:65ff:febc:62b4
+ Pending 0 attribute sets with total 0 prefixes to send
+
diff --git a/netlab/cf-bgp-unnumbered-autopeering/data-v2/proto-m1-down-m2 b/netlab/cf-bgp-unnumbered-autopeering/data-v2/proto-m1-down-m2
new file mode 100644
index 00000000..b7c7f675
--- /dev/null
+++ b/netlab/cf-bgp-unnumbered-autopeering/data-v2/proto-m1-down-m2
@@ -0,0 +1,121 @@
+BIRD <removed> ready.
+Name Proto Table State Since Info
+device1 Device --- up <removed>
+ Created: <removed>
+
+radv1 RAdv master6 up <removed>
+ Created: <removed>
+ Channel ipv6
+ State: UP
+ Import state: UP
+ Export state: READY
+ Table: master6
+ Preference: 0
+ Input filter: ACCEPT
+ Output filter: REJECT
+ Routes: 0 imported, 0 exported, 0 preferred
+ Route change stats: received rejected filtered ignored RX limit limit accepted
+ Import updates: <removed>
+ Import withdraws: <removed>
+ Export updates: <removed>
+ Export withdraws: <removed>
+ Channel peer
+ State: UP
+ Import state: UP
+ Export state: READY
+ Table: nd_peers
+ Preference: 0
+ Input filter: ACCEPT
+ Output filter: REJECT
+ Routes: 1 imported, 0 exported, 1 preferred
+ Route change stats: received rejected filtered ignored RX limit limit accepted
+ Import updates: <removed>
+ Import withdraws: <removed>
+ Export updates: <removed>
+ Export withdraws: <removed>
+
+bgp1 BGP --- start <removed> Passive
+ Created: <removed>
+ BGP state: Passive
+ Neighbor range: fe80::/12
+ Neighbor AS: 0
+ Local AS: 65002
+ Channel peers
+ State: DOWN
+ Import state: DOWN
+ Export state: DOWN
+ Table: nd_peers
+ Preference: 100
+ Input filter: ACCEPT
+ Output filter: ACCEPT
+ Channel ipv6
+ State: DOWN
+ Import state: DOWN
+ Export state: DOWN
+ Table: master6
+ Preference: 100
+ Input filter: ACCEPT
+ Output filter: ACCEPT
+ Channel peers
+ State: UP
+ Import state: UP
+ Export state: READY
+ Table: nd_peers
+ Preference: 100
+ Input filter: ACCEPT
+ Output filter: ACCEPT
+ Routes: 0 imported, 1 exported, 0 preferred
+ Route change stats: received rejected filtered ignored RX limit limit accepted
+ Import updates: <removed>
+ Import withdraws: <removed>
+ Export updates: <removed>
+ Export withdraws: <removed>
+ BGP Next hop: ::
+ Pending 0 attribute sets with total 0 prefixes to send
+
+bgp_peer<XXX> BGP --- up <removed> Established
+ Created: <removed>
+ BGP state: Established
+ Neighbor address: fe80::c8f0:65ff:febc:62b4%ve2
+ Neighbor AS: 65001
+ Local AS: 65002
+ Neighbor ID: 0.0.0.1
+ Local capabilities
+ Multiprotocol
+ AF announced: ipv6
+ Route refresh
+ Graceful restart
+ 4-octet AS numbers
+ Enhanced refresh
+ Long-lived graceful restart
+ Neighbor capabilities
+ Multiprotocol
+ AF announced: ipv6
+ Route refresh
+ Graceful restart
+ 4-octet AS numbers
+ Enhanced refresh
+ Long-lived graceful restart
+ Session: external AS4
+ Source address: fe80::88c6:96ff:feb5:9492
+ Hold timer: <removed>/240
+ Keepalive timer: <removed>/80
+ TX pending: 0 bytes
+ Send hold timer: <removed>/480
+ Channel ipv6
+ State: UP
+ Import state: UP
+ Export state: READY
+ Table: master6
+ Preference: 100
+ Input filter: ACCEPT
+ Output filter: ACCEPT
+ Routes: 0 imported, 0 exported, 0 preferred
+ Route change stats: received rejected filtered ignored RX limit limit accepted
+ Import updates: <removed>
+ Import withdraws: <removed>
+ Export updates: <removed>
+ Export withdraws: <removed>
+ BGP Next hop: :: fe80::88c6:96ff:feb5:9492
+ Pending 0 attribute sets with total 0 prefixes to send
+
diff --git a/netlab/cf-bgp-unnumbered-autopeering/data-v2/proto-m1-up-m1 b/netlab/cf-bgp-unnumbered-autopeering/data-v2/proto-m1-up-m1
new file mode 100644
index 00000000..d018ee0f
--- /dev/null
+++ b/netlab/cf-bgp-unnumbered-autopeering/data-v2/proto-m1-up-m1
@@ -0,0 +1,121 @@
+BIRD <removed> ready.
+Name Proto Table State Since Info
+device1 Device --- up <removed>
+ Created: <removed>
+
+radv1 RAdv master6 up <removed>
+ Created: <removed>
+ Channel ipv6
+ State: UP
+ Import state: UP
+ Export state: READY
+ Table: master6
+ Preference: 0
+ Input filter: ACCEPT
+ Output filter: REJECT
+ Routes: 0 imported, 0 exported, 0 preferred
+ Route change stats: received rejected filtered ignored RX limit limit accepted
+ Import updates: <removed>
+ Import withdraws: <removed>
+ Export updates: <removed>
+ Export withdraws: <removed>
+ Channel peer
+ State: UP
+ Import state: UP
+ Export state: READY
+ Table: nd_peers
+ Preference: 0
+ Input filter: ACCEPT
+ Output filter: REJECT
+ Routes: 1 imported, 0 exported, 1 preferred
+ Route change stats: received rejected filtered ignored RX limit limit accepted
+ Import updates: <removed>
+ Import withdraws: <removed>
+ Export updates: <removed>
+ Export withdraws: <removed>
+
+bgp1 BGP --- start <removed> Passive
+ Created: <removed>
+ BGP state: Passive
+ Neighbor range: fe80::/12
+ Neighbor AS: 0
+ Local AS: 65001
+ Channel peers
+ State: DOWN
+ Import state: DOWN
+ Export state: DOWN
+ Table: nd_peers
+ Preference: 100
+ Input filter: ACCEPT
+ Output filter: ACCEPT
+ Channel ipv6
+ State: DOWN
+ Import state: DOWN
+ Export state: DOWN
+ Table: master6
+ Preference: 100
+ Input filter: ACCEPT
+ Output filter: ACCEPT
+ Channel peers
+ State: UP
+ Import state: UP
+ Export state: READY
+ Table: nd_peers
+ Preference: 100
+ Input filter: ACCEPT
+ Output filter: ACCEPT
+ Routes: 0 imported, 1 exported, 0 preferred
+ Route change stats: received rejected filtered ignored RX limit limit accepted
+ Import updates: <removed>
+ Import withdraws: <removed>
+ Export updates: <removed>
+ Export withdraws: <removed>
+ BGP Next hop: ::
+ Pending 0 attribute sets with total 0 prefixes to send
+
+bgp_peer<XXX> BGP --- up <removed> Established
+ Created: <removed>
+ BGP state: Established
+ Neighbor address: fe80::88c6:96ff:feb5:9492%ve1
+ Neighbor AS: 65002
+ Local AS: 65001
+ Neighbor ID: 0.0.0.2
+ Local capabilities
+ Multiprotocol
+ AF announced: ipv6
+ Route refresh
+ Graceful restart
+ 4-octet AS numbers
+ Enhanced refresh
+ Long-lived graceful restart
+ Neighbor capabilities
+ Multiprotocol
+ AF announced: ipv6
+ Route refresh
+ Graceful restart
+ 4-octet AS numbers
+ Enhanced refresh
+ Long-lived graceful restart
+ Session: external AS4
+ Source address: fe80::c8f0:65ff:febc:62b4
+ Hold timer: <removed>/240
+ Keepalive timer: <removed>/80
+ TX pending: 0 bytes
+ Send hold timer: <removed>/480
+ Channel ipv6
+ State: UP
+ Import state: UP
+ Export state: READY
+ Table: master6
+ Preference: 100
+ Input filter: ACCEPT
+ Output filter: ACCEPT
+ Routes: 0 imported, 0 exported, 0 preferred
+ Route change stats: received rejected filtered ignored RX limit limit accepted
+ Import updates: <removed>
+ Import withdraws: <removed>
+ Export updates: <removed>
+ Export withdraws: <removed>
+ BGP Next hop: :: fe80::c8f0:65ff:febc:62b4
+ Pending 0 attribute sets with total 0 prefixes to send
+
diff --git a/netlab/cf-bgp-unnumbered-autopeering/data-v2/proto-m1-up-m2 b/netlab/cf-bgp-unnumbered-autopeering/data-v2/proto-m1-up-m2
new file mode 100644
index 00000000..b7c7f675
--- /dev/null
+++ b/netlab/cf-bgp-unnumbered-autopeering/data-v2/proto-m1-up-m2
@@ -0,0 +1,121 @@
+BIRD <removed> ready.
+Name Proto Table State Since Info
+device1 Device --- up <removed>
+ Created: <removed>
+
+radv1 RAdv master6 up <removed>
+ Created: <removed>
+ Channel ipv6
+ State: UP
+ Import state: UP
+ Export state: READY
+ Table: master6
+ Preference: 0
+ Input filter: ACCEPT
+ Output filter: REJECT
+ Routes: 0 imported, 0 exported, 0 preferred
+ Route change stats: received rejected filtered ignored RX limit limit accepted
+ Import updates: <removed>
+ Import withdraws: <removed>
+ Export updates: <removed>
+ Export withdraws: <removed>
+ Channel peer
+ State: UP
+ Import state: UP
+ Export state: READY
+ Table: nd_peers
+ Preference: 0
+ Input filter: ACCEPT
+ Output filter: REJECT
+ Routes: 1 imported, 0 exported, 1 preferred
+ Route change stats: received rejected filtered ignored RX limit limit accepted
+ Import updates: <removed>
+ Import withdraws: <removed>
+ Export updates: <removed>
+ Export withdraws: <removed>
+
+bgp1 BGP --- start <removed> Passive
+ Created: <removed>
+ BGP state: Passive
+ Neighbor range: fe80::/12
+ Neighbor AS: 0
+ Local AS: 65002
+ Channel peers
+ State: DOWN
+ Import state: DOWN
+ Export state: DOWN
+ Table: nd_peers
+ Preference: 100
+ Input filter: ACCEPT
+ Output filter: ACCEPT
+ Channel ipv6
+ State: DOWN
+ Import state: DOWN
+ Export state: DOWN
+ Table: master6
+ Preference: 100
+ Input filter: ACCEPT
+ Output filter: ACCEPT
+ Channel peers
+ State: UP
+ Import state: UP
+ Export state: READY
+ Table: nd_peers
+ Preference: 100
+ Input filter: ACCEPT
+ Output filter: ACCEPT
+ Routes: 0 imported, 1 exported, 0 preferred
+ Route change stats: received rejected filtered ignored RX limit limit accepted
+ Import updates: <removed>
+ Import withdraws: <removed>
+ Export updates: <removed>
+ Export withdraws: <removed>
+ BGP Next hop: ::
+ Pending 0 attribute sets with total 0 prefixes to send
+
+bgp_peer<XXX> BGP --- up <removed> Established
+ Created: <removed>
+ BGP state: Established
+ Neighbor address: fe80::c8f0:65ff:febc:62b4%ve2
+ Neighbor AS: 65001
+ Local AS: 65002
+ Neighbor ID: 0.0.0.1
+ Local capabilities
+ Multiprotocol
+ AF announced: ipv6
+ Route refresh
+ Graceful restart
+ 4-octet AS numbers
+ Enhanced refresh
+ Long-lived graceful restart
+ Neighbor capabilities
+ Multiprotocol
+ AF announced: ipv6
+ Route refresh
+ Graceful restart
+ 4-octet AS numbers
+ Enhanced refresh
+ Long-lived graceful restart
+ Session: external AS4
+ Source address: fe80::88c6:96ff:feb5:9492
+ Hold timer: <removed>/240
+ Keepalive timer: <removed>/80
+ TX pending: 0 bytes
+ Send hold timer: <removed>/480
+ Channel ipv6
+ State: UP
+ Import state: UP
+ Export state: READY
+ Table: master6
+ Preference: 100
+ Input filter: ACCEPT
+ Output filter: ACCEPT
+ Routes: 0 imported, 0 exported, 0 preferred
+ Route change stats: received rejected filtered ignored RX limit limit accepted
+ Import updates: <removed>
+ Import withdraws: <removed>
+ Export updates: <removed>
+ Export withdraws: <removed>
+ BGP Next hop: :: fe80::88c6:96ff:feb5:9492
+ Pending 0 attribute sets with total 0 prefixes to send
+
diff --git a/netlab/cf-bgp-unnumbered-autopeering/data-v2/proto-m2 b/netlab/cf-bgp-unnumbered-autopeering/data-v2/proto-m2
new file mode 100644
index 00000000..b7c7f675
--- /dev/null
+++ b/netlab/cf-bgp-unnumbered-autopeering/data-v2/proto-m2
@@ -0,0 +1,121 @@
+BIRD <removed> ready.
+Name Proto Table State Since Info
+device1 Device --- up <removed>
+ Created: <removed>
+
+radv1 RAdv master6 up <removed>
+ Created: <removed>
+ Channel ipv6
+ State: UP
+ Import state: UP
+ Export state: READY
+ Table: master6
+ Preference: 0
+ Input filter: ACCEPT
+ Output filter: REJECT
+ Routes: 0 imported, 0 exported, 0 preferred
+ Route change stats: received rejected filtered ignored RX limit limit accepted
+ Import updates: <removed>
+ Import withdraws: <removed>
+ Export updates: <removed>
+ Export withdraws: <removed>
+ Channel peer
+ State: UP
+ Import state: UP
+ Export state: READY
+ Table: nd_peers
+ Preference: 0
+ Input filter: ACCEPT
+ Output filter: REJECT
+ Routes: 1 imported, 0 exported, 1 preferred
+ Route change stats: received rejected filtered ignored RX limit limit accepted
+ Import updates: <removed>
+ Import withdraws: <removed>
+ Export updates: <removed>
+ Export withdraws: <removed>
+
+bgp1 BGP --- start <removed> Passive
+ Created: <removed>
+ BGP state: Passive
+ Neighbor range: fe80::/12
+ Neighbor AS: 0
+ Local AS: 65002
+ Channel peers
+ State: DOWN
+ Import state: DOWN
+ Export state: DOWN
+ Table: nd_peers
+ Preference: 100
+ Input filter: ACCEPT
+ Output filter: ACCEPT
+ Channel ipv6
+ State: DOWN
+ Import state: DOWN
+ Export state: DOWN
+ Table: master6
+ Preference: 100
+ Input filter: ACCEPT
+ Output filter: ACCEPT
+ Channel peers
+ State: UP
+ Import state: UP
+ Export state: READY
+ Table: nd_peers
+ Preference: 100
+ Input filter: ACCEPT
+ Output filter: ACCEPT
+ Routes: 0 imported, 1 exported, 0 preferred
+ Route change stats: received rejected filtered ignored RX limit limit accepted
+ Import updates: <removed>
+ Import withdraws: <removed>
+ Export updates: <removed>
+ Export withdraws: <removed>
+ BGP Next hop: ::
+ Pending 0 attribute sets with total 0 prefixes to send
+
+bgp_peer<XXX> BGP --- up <removed> Established
+ Created: <removed>
+ BGP state: Established
+ Neighbor address: fe80::c8f0:65ff:febc:62b4%ve2
+ Neighbor AS: 65001
+ Local AS: 65002
+ Neighbor ID: 0.0.0.1
+ Local capabilities
+ Multiprotocol
+ AF announced: ipv6
+ Route refresh
+ Graceful restart
+ 4-octet AS numbers
+ Enhanced refresh
+ Long-lived graceful restart
+ Neighbor capabilities
+ Multiprotocol
+ AF announced: ipv6
+ Route refresh
+ Graceful restart
+ 4-octet AS numbers
+ Enhanced refresh
+ Long-lived graceful restart
+ Session: external AS4
+ Source address: fe80::88c6:96ff:feb5:9492
+ Hold timer: <removed>/240
+ Keepalive timer: <removed>/80
+ TX pending: 0 bytes
+ Send hold timer: <removed>/480
+ Channel ipv6
+ State: UP
+ Import state: UP
+ Export state: READY
+ Table: master6
+ Preference: 100
+ Input filter: ACCEPT
+ Output filter: ACCEPT
+ Routes: 0 imported, 0 exported, 0 preferred
+ Route change stats: received rejected filtered ignored RX limit limit accepted
+ Import updates: <removed>
+ Import withdraws: <removed>
+ Export updates: <removed>
+ Export withdraws: <removed>
+ BGP Next hop: :: fe80::88c6:96ff:feb5:9492
+ Pending 0 attribute sets with total 0 prefixes to send
+
diff --git a/netlab/cf-bgp-unnumbered-autopeering/data-v2/proto-m2-down-m1 b/netlab/cf-bgp-unnumbered-autopeering/data-v2/proto-m2-down-m1
new file mode 100644
index 00000000..d018ee0f
--- /dev/null
+++ b/netlab/cf-bgp-unnumbered-autopeering/data-v2/proto-m2-down-m1
@@ -0,0 +1,121 @@
+BIRD <removed> ready.
+Name Proto Table State Since Info
+device1 Device --- up <removed>
+ Created: <removed>
+
+radv1 RAdv master6 up <removed>
+ Created: <removed>
+ Channel ipv6
+ State: UP
+ Import state: UP
+ Export state: READY
+ Table: master6
+ Preference: 0
+ Input filter: ACCEPT
+ Output filter: REJECT
+ Routes: 0 imported, 0 exported, 0 preferred
+ Route change stats: received rejected filtered ignored RX limit limit accepted
+ Import updates: <removed>
+ Import withdraws: <removed>
+ Export updates: <removed>
+ Export withdraws: <removed>
+ Channel peer
+ State: UP
+ Import state: UP
+ Export state: READY
+ Table: nd_peers
+ Preference: 0
+ Input filter: ACCEPT
+ Output filter: REJECT
+ Routes: 1 imported, 0 exported, 1 preferred
+ Route change stats: received rejected filtered ignored RX limit limit accepted
+ Import updates: <removed>
+ Import withdraws: <removed>
+ Export updates: <removed>
+ Export withdraws: <removed>
+
+bgp1 BGP --- start <removed> Passive
+ Created: <removed>
+ BGP state: Passive
+ Neighbor range: fe80::/12
+ Neighbor AS: 0
+ Local AS: 65001
+ Channel peers
+ State: DOWN
+ Import state: DOWN
+ Export state: DOWN
+ Table: nd_peers
+ Preference: 100
+ Input filter: ACCEPT
+ Output filter: ACCEPT
+ Channel ipv6
+ State: DOWN
+ Import state: DOWN
+ Export state: DOWN
+ Table: master6
+ Preference: 100
+ Input filter: ACCEPT
+ Output filter: ACCEPT
+ Channel peers
+ State: UP
+ Import state: UP
+ Export state: READY
+ Table: nd_peers
+ Preference: 100
+ Input filter: ACCEPT
+ Output filter: ACCEPT
+ Routes: 0 imported, 1 exported, 0 preferred
+ Route change stats: received rejected filtered ignored RX limit limit accepted
+ Import updates: <removed>
+ Import withdraws: <removed>
+ Export updates: <removed>
+ Export withdraws: <removed>
+ BGP Next hop: ::
+ Pending 0 attribute sets with total 0 prefixes to send
+
+bgp_peer<XXX> BGP --- up <removed> Established
+ Created: <removed>
+ BGP state: Established
+ Neighbor address: fe80::88c6:96ff:feb5:9492%ve1
+ Neighbor AS: 65002
+ Local AS: 65001
+ Neighbor ID: 0.0.0.2
+ Local capabilities
+ Multiprotocol
+ AF announced: ipv6
+ Route refresh
+ Graceful restart
+ 4-octet AS numbers
+ Enhanced refresh
+ Long-lived graceful restart
+ Neighbor capabilities
+ Multiprotocol
+ AF announced: ipv6
+ Route refresh
+ Graceful restart
+ 4-octet AS numbers
+ Enhanced refresh
+ Long-lived graceful restart
+ Session: external AS4
+ Source address: fe80::c8f0:65ff:febc:62b4
+ Hold timer: <removed>/240
+ Keepalive timer: <removed>/80
+ TX pending: 0 bytes
+ Send hold timer: <removed>/480
+ Channel ipv6
+ State: UP
+ Import state: UP
+ Export state: READY
+ Table: master6
+ Preference: 100
+ Input filter: ACCEPT
+ Output filter: ACCEPT
+ Routes: 0 imported, 0 exported, 0 preferred
+ Route change stats: received rejected filtered ignored RX limit limit accepted
+ Import updates: <removed>
+ Import withdraws: <removed>
+ Export updates: <removed>
+ Export withdraws: <removed>
+ BGP Next hop: :: fe80::c8f0:65ff:febc:62b4
+ Pending 0 attribute sets with total 0 prefixes to send
+
diff --git a/netlab/cf-bgp-unnumbered-autopeering/data-v2/proto-m2-up-m1 b/netlab/cf-bgp-unnumbered-autopeering/data-v2/proto-m2-up-m1
new file mode 100644
index 00000000..d018ee0f
--- /dev/null
+++ b/netlab/cf-bgp-unnumbered-autopeering/data-v2/proto-m2-up-m1
@@ -0,0 +1,121 @@
+BIRD <removed> ready.
+Name Proto Table State Since Info
+device1 Device --- up <removed>
+ Created: <removed>
+
+radv1 RAdv master6 up <removed>
+ Created: <removed>
+ Channel ipv6
+ State: UP
+ Import state: UP
+ Export state: READY
+ Table: master6
+ Preference: 0
+ Input filter: ACCEPT
+ Output filter: REJECT
+ Routes: 0 imported, 0 exported, 0 preferred
+ Route change stats: received rejected filtered ignored RX limit limit accepted
+ Import updates: <removed>
+ Import withdraws: <removed>
+ Export updates: <removed>
+ Export withdraws: <removed>
+ Channel peer
+ State: UP
+ Import state: UP
+ Export state: READY
+ Table: nd_peers
+ Preference: 0
+ Input filter: ACCEPT
+ Output filter: REJECT
+ Routes: 1 imported, 0 exported, 1 preferred
+ Route change stats: received rejected filtered ignored RX limit limit accepted
+ Import updates: <removed>
+ Import withdraws: <removed>
+ Export updates: <removed>
+ Export withdraws: <removed>
+
+bgp1 BGP --- start <removed> Passive
+ Created: <removed>
+ BGP state: Passive
+ Neighbor range: fe80::/12
+ Neighbor AS: 0
+ Local AS: 65001
+ Channel peers
+ State: DOWN
+ Import state: DOWN
+ Export state: DOWN
+ Table: nd_peers
+ Preference: 100
+ Input filter: ACCEPT
+ Output filter: ACCEPT
+ Channel ipv6
+ State: DOWN
+ Import state: DOWN
+ Export state: DOWN
+ Table: master6
+ Preference: 100
+ Input filter: ACCEPT
+ Output filter: ACCEPT
+ Channel peers
+ State: UP
+ Import state: UP
+ Export state: READY
+ Table: nd_peers
+ Preference: 100
+ Input filter: ACCEPT
+ Output filter: ACCEPT
+ Routes: 0 imported, 1 exported, 0 preferred
+ Route change stats: received rejected filtered ignored RX limit limit accepted
+ Import updates: <removed>
+ Import withdraws: <removed>
+ Export updates: <removed>
+ Export withdraws: <removed>
+ BGP Next hop: ::
+ Pending 0 attribute sets with total 0 prefixes to send
+
+bgp_peer<XXX> BGP --- up <removed> Established
+ Created: <removed>
+ BGP state: Established
+ Neighbor address: fe80::88c6:96ff:feb5:9492%ve1
+ Neighbor AS: 65002
+ Local AS: 65001
+ Neighbor ID: 0.0.0.2
+ Local capabilities
+ Multiprotocol
+ AF announced: ipv6
+ Route refresh
+ Graceful restart
+ 4-octet AS numbers
+ Enhanced refresh
+ Long-lived graceful restart
+ Neighbor capabilities
+ Multiprotocol
+ AF announced: ipv6
+ Route refresh
+ Graceful restart
+ 4-octet AS numbers
+ Enhanced refresh
+ Long-lived graceful restart
+ Session: external AS4
+ Source address: fe80::c8f0:65ff:febc:62b4
+ Hold timer: <removed>/240
+ Keepalive timer: <removed>/80
+ TX pending: 0 bytes
+ Send hold timer: <removed>/480
+ Channel ipv6
+ State: UP
+ Import state: UP
+ Export state: READY
+ Table: master6
+ Preference: 100
+ Input filter: ACCEPT
+ Output filter: ACCEPT
+ Routes: 0 imported, 0 exported, 0 preferred
+ Route change stats: received rejected filtered ignored RX limit limit accepted
+ Import updates: <removed>
+ Import withdraws: <removed>
+ Export updates: <removed>
+ Export withdraws: <removed>
+ BGP Next hop: :: fe80::c8f0:65ff:febc:62b4
+ Pending 0 attribute sets with total 0 prefixes to send
+
diff --git a/netlab/cf-bgp-unnumbered-autopeering/data-v2/proto-m2-up-m2 b/netlab/cf-bgp-unnumbered-autopeering/data-v2/proto-m2-up-m2
new file mode 100644
index 00000000..b7c7f675
--- /dev/null
+++ b/netlab/cf-bgp-unnumbered-autopeering/data-v2/proto-m2-up-m2
@@ -0,0 +1,121 @@
+BIRD <removed> ready.
+Name Proto Table State Since Info
+device1 Device --- up <removed>
+ Created: <removed>
+
+radv1 RAdv master6 up <removed>
+ Created: <removed>
+ Channel ipv6
+ State: UP
+ Import state: UP
+ Export state: READY
+ Table: master6
+ Preference: 0
+ Input filter: ACCEPT
+ Output filter: REJECT
+ Routes: 0 imported, 0 exported, 0 preferred
+ Route change stats: received rejected filtered ignored RX limit limit accepted
+ Import updates: <removed>
+ Import withdraws: <removed>
+ Export updates: <removed>
+ Export withdraws: <removed>
+ Channel peer
+ State: UP
+ Import state: UP
+ Export state: READY
+ Table: nd_peers
+ Preference: 0
+ Input filter: ACCEPT
+ Output filter: REJECT
+ Routes: 1 imported, 0 exported, 1 preferred
+ Route change stats: received rejected filtered ignored RX limit limit accepted
+ Import updates: <removed>
+ Import withdraws: <removed>
+ Export updates: <removed>
+ Export withdraws: <removed>
+
+bgp1 BGP --- start <removed> Passive
+ Created: <removed>
+ BGP state: Passive
+ Neighbor range: fe80::/12
+ Neighbor AS: 0
+ Local AS: 65002
+ Channel peers
+ State: DOWN
+ Import state: DOWN
+ Export state: DOWN
+ Table: nd_peers
+ Preference: 100
+ Input filter: ACCEPT
+ Output filter: ACCEPT
+ Channel ipv6
+ State: DOWN
+ Import state: DOWN
+ Export state: DOWN
+ Table: master6
+ Preference: 100
+ Input filter: ACCEPT
+ Output filter: ACCEPT
+ Channel peers
+ State: UP
+ Import state: UP
+ Export state: READY
+ Table: nd_peers
+ Preference: 100
+ Input filter: ACCEPT
+ Output filter: ACCEPT
+ Routes: 0 imported, 1 exported, 0 preferred
+ Route change stats: received rejected filtered ignored RX limit limit accepted
+ Import updates: <removed>
+ Import withdraws: <removed>
+ Export updates: <removed>
+ Export withdraws: <removed>
+ BGP Next hop: ::
+ Pending 0 attribute sets with total 0 prefixes to send
+
+bgp_peer<XXX> BGP --- up <removed> Established
+ Created: <removed>
+ BGP state: Established
+ Neighbor address: fe80::c8f0:65ff:febc:62b4%ve2
+ Neighbor AS: 65001
+ Local AS: 65002
+ Neighbor ID: 0.0.0.1
+ Local capabilities
+ Multiprotocol
+ AF announced: ipv6
+ Route refresh
+ Graceful restart
+ 4-octet AS numbers
+ Enhanced refresh
+ Long-lived graceful restart
+ Neighbor capabilities
+ Multiprotocol
+ AF announced: ipv6
+ Route refresh
+ Graceful restart
+ 4-octet AS numbers
+ Enhanced refresh
+ Long-lived graceful restart
+ Session: external AS4
+ Source address: fe80::88c6:96ff:feb5:9492
+ Hold timer: <removed>/240
+ Keepalive timer: <removed>/80
+ TX pending: 0 bytes
+ Send hold timer: <removed>/480
+ Channel ipv6
+ State: UP
+ Import state: UP
+ Export state: READY
+ Table: master6
+ Preference: 100
+ Input filter: ACCEPT
+ Output filter: ACCEPT
+ Routes: 0 imported, 0 exported, 0 preferred
+ Route change stats: received rejected filtered ignored RX limit limit accepted
+ Import updates: <removed>
+ Import withdraws: <removed>
+ Export updates: <removed>
+ Export withdraws: <removed>
+ BGP Next hop: :: fe80::88c6:96ff:feb5:9492
+ Pending 0 attribute sets with total 0 prefixes to send
+
diff --git a/netlab/cf-bgp-unnumbered-autopeering/test-cf-bgp-unnumbered-autopeering.py b/netlab/cf-bgp-unnumbered-autopeering/test-cf-bgp-unnumbered-autopeering.py
new file mode 100644
index 00000000..278308a0
--- /dev/null
+++ b/netlab/cf-bgp-unnumbered-autopeering/test-cf-bgp-unnumbered-autopeering.py
@@ -0,0 +1,101 @@
+import pytest
+
+import tests.kernel as tk
+import tests.config as cf
+
+LIMIT = 100
+EXPECTED_DEVICES = (
+ "m1",
+ "m2",
+)
+
+
+def test_wait():
+ """Wait until the time (limit) runs out"""
+ tk.wait(LIMIT)
+
+ at pytest.mark.parametrize("exp_devs", EXPECTED_DEVICES)
+def test_nd_peers_table(exp_devs: str):
+ """Check the peer table nd_peers for discovered neighbors"""
+ tk.test_bird_routes("nd_peers", exp_devs, "nd_peers")
+
+ at pytest.mark.parametrize("exp_devs", EXPECTED_DEVICES)
+def test_bgp_protocols(exp_devs: str):
+ """Check that dynamic BGP protocols are spawned and established"""
+ tk.test_protocols(key="proto", dev=exp_devs, opts="all")
+
+ at pytest.mark.skipif(False, reason="")
+def test_stop_m2():
+ """Stop the m2 node to test peers persist behavior"""
+ tk.kill_node("m2", "STOP")
+
+def test_wait_after_stop():
+ """Wait for BGP sessions to detect peer is down"""
+ tk.wait(10)
+
+ at pytest.mark.parametrize("exp_devs", ("m1",))
+def test_bgp_protocols_after_m2_down(exp_devs: str):
+ """Check that dynamic BGP protocols are removed when peer is down (peers persist no)"""
+ tk.test_protocols(key="proto-m2-down", dev=exp_devs, opts="all")
+
+ at pytest.mark.parametrize("exp_devs", ("m1",))
+def test_nd_peers_table_after_m2_down(exp_devs: str):
+ """Check the peer table after m2 is down"""
+ tk.test_bird_routes("nd_peers-m2-down", exp_devs, "nd_peers")
+
+ at pytest.mark.skipif(False, reason="")
+def test_cont_m2():
+ """Continue the m2 node"""
+ tk.kill_node("m2", "CONT")
+
+def test_wait_after_cont():
+ """Wait for BGP sessions to re-establish"""
+ tk.wait(LIMIT)
+
+ at pytest.mark.parametrize("exp_devs", EXPECTED_DEVICES)
+def test_bgp_protocols_after_m2_up(exp_devs: str):
+ """Check that dynamic BGP protocols are re-spawned after m2 comes back"""
+ tk.test_protocols(key="proto-m2-up", dev=exp_devs, opts="all")
+
+ at pytest.mark.parametrize("exp_devs", EXPECTED_DEVICES)
+def test_nd_peers_table_after_m2_up(exp_devs: str):
+ """Check the peer table after m2 comes back up"""
+ tk.test_bird_routes("nd_peers-m2-up", exp_devs, "nd_peers")
+
+ at pytest.mark.skipif(False, reason="")
+def test_stop_m1():
+ """Stop the m1 node to test peers persist yes on m2"""
+ tk.kill_node("m1", "STOP")
+
+def test_wait_after_m1_stop():
+ """Wait for BGP sessions to detect m1 is down"""
+ tk.wait(10)
+
+ at pytest.mark.parametrize("exp_devs", ("m2",))
+def test_bgp_protocols_after_m1_down(exp_devs: str):
+ """Check that dynamic BGP protocols remain (in down state) on m2 (peers persist yes)"""
+ tk.test_protocols(key="proto-m1-down", dev=exp_devs, opts="all")
+
+ at pytest.mark.parametrize("exp_devs", ("m2",))
+def test_nd_peers_table_after_m1_down(exp_devs: str):
+ """Check the peer table on m2 after m1 is down"""
+ tk.test_bird_routes("nd_peers-m1-down", exp_devs, "nd_peers")
+
+ at pytest.mark.skipif(False, reason="")
+def test_cont_m1():
+ """Continue the m1 node"""
+ tk.kill_node("m1", "CONT")
+
+def test_wait_after_m1_cont():
+ """Wait for BGP sessions to re-establish"""
+ tk.wait(LIMIT)
+
+ at pytest.mark.parametrize("exp_devs", EXPECTED_DEVICES)
+def test_bgp_protocols_after_m1_up(exp_devs: str):
+ """Check that BGP sessions are re-established after m1 comes back"""
+ tk.test_protocols(key="proto-m1-up", dev=exp_devs, opts="all")
+
+ at pytest.mark.parametrize("exp_devs", EXPECTED_DEVICES)
+def test_nd_peers_table_after_m1_up(exp_devs: str):
+ """Check the peer table after m1 comes back up"""
+ tk.test_bird_routes("nd_peers-m1-up", exp_devs, "nd_peers")
diff --git a/netlab/tests/get_stdout_bird b/netlab/tests/get_stdout_bird
index c9f8bbc3..3d5d5bf7 100755
--- a/netlab/tests/get_stdout_bird
+++ b/netlab/tests/get_stdout_bird
@@ -6,4 +6,5 @@ cd $1 && ./birdc -l show route $2 $3 \
| strip_timestamp \
| strip_internal_route_handling_values \
| strip_mpls \
+ | strip_radv_expires \
| ../tests/sort_show_route
diff --git a/netlab/tests/get_stdout_protocols b/netlab/tests/get_stdout_protocols
index 17cbce1e..d778de4e 100755
--- a/netlab/tests/get_stdout_protocols
+++ b/netlab/tests/get_stdout_protocols
@@ -6,4 +6,5 @@ cd $1 && ./birdc -l show proto "$2" \
| strip_imexport_stats \
| strip_version \
| strip_timestamp \
- | strip_timer
+ | strip_timer \
+ | strip_dynamic_bgp_names
diff --git a/netlab/tests/strip_output b/netlab/tests/strip_output
index 195dc9f2..9dae4ef9 100755
--- a/netlab/tests/strip_output
+++ b/netlab/tests/strip_output
@@ -75,3 +75,13 @@ strip_ecmp_pref() {
# workaround for change in Linux kernel behavior
sed -E 's/(::\/?[0-9]* proto.*) pref medium/\1/'
}
+
+strip_radv_expires() {
+ # remove the radv_expires_at timestamp value
+ sed -E 's/(radv_expires_at: )[0-9]+/\1<removed>/'
+}
+
+strip_dynamic_bgp_names() {
+ # normalize dynamic BGP protocol names (bgp_peer001, bgp_peer002, etc. -> bgp_peer_XXX)
+ sed -E 's/(bgp_peer)[0-9]{3}/\1<XXX>/g'
+}
--
2.43.0
More information about the Bird-users
mailing list