[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