mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-07-27 10:04:18 +00:00
topotests: add bgp_nexthop_ipv6
Add bgp_nexthop_ipv6 to check the ipv6 link-local nexthop conformity in
several situations.
Signed-off-by: Louis Scalbert <louis.scalbert@6wind.com>
(cherry picked from commit 6dc4d95061
)
This commit is contained in:
parent
74d91dea4b
commit
ead451f633
53
tests/topotests/bgp_nexthop_ipv6/exabgp.env
Normal file
53
tests/topotests/bgp_nexthop_ipv6/exabgp.env
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
[exabgp.api]
|
||||||
|
encoder = text
|
||||||
|
highres = false
|
||||||
|
respawn = false
|
||||||
|
socket = ''
|
||||||
|
|
||||||
|
[exabgp.bgp]
|
||||||
|
openwait = 60
|
||||||
|
|
||||||
|
[exabgp.cache]
|
||||||
|
attributes = true
|
||||||
|
nexthops = true
|
||||||
|
|
||||||
|
[exabgp.daemon]
|
||||||
|
daemonize = true
|
||||||
|
pid = '/var/run/exabgp/exabgp.pid'
|
||||||
|
user = 'exabgp'
|
||||||
|
##daemonize = false
|
||||||
|
|
||||||
|
[exabgp.log]
|
||||||
|
all = false
|
||||||
|
configuration = true
|
||||||
|
daemon = true
|
||||||
|
destination = '/var/log/exabgp.log'
|
||||||
|
enable = true
|
||||||
|
level = INFO
|
||||||
|
message = false
|
||||||
|
network = true
|
||||||
|
packets = false
|
||||||
|
parser = false
|
||||||
|
processes = true
|
||||||
|
reactor = true
|
||||||
|
rib = false
|
||||||
|
routes = false
|
||||||
|
short = false
|
||||||
|
timers = false
|
||||||
|
|
||||||
|
[exabgp.pdb]
|
||||||
|
enable = false
|
||||||
|
|
||||||
|
[exabgp.profile]
|
||||||
|
enable = false
|
||||||
|
file = ''
|
||||||
|
|
||||||
|
[exabgp.reactor]
|
||||||
|
speed = 1.0
|
||||||
|
|
||||||
|
[exabgp.tcp]
|
||||||
|
acl = false
|
||||||
|
bind = ''
|
||||||
|
delay = 0
|
||||||
|
once = false
|
||||||
|
port = 179
|
22
tests/topotests/bgp_nexthop_ipv6/r1/bgpd.conf
Normal file
22
tests/topotests/bgp_nexthop_ipv6/r1/bgpd.conf
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
router bgp 65000
|
||||||
|
no bgp ebgp-requires-policy
|
||||||
|
neighbor fd00:0:2::9 remote-as internal
|
||||||
|
neighbor fd00:0:2::9 timers 3 10
|
||||||
|
address-family ipv4 unicast
|
||||||
|
redistribute connected route-map RMAP4
|
||||||
|
!
|
||||||
|
address-family ipv6 unicast
|
||||||
|
redistribute connected route-map RMAP6
|
||||||
|
neighbor fd00:0:2::9 activate
|
||||||
|
|
||||||
|
ip prefix-list RANGE4 seq 10 permit 172.16.0.0/16 le 24
|
||||||
|
ip prefix-list RANGE4 seq 20 permit 10.0.0.0/8 ge 32
|
||||||
|
|
||||||
|
ipv6 prefix-list RANGE6 seq 10 permit fd00:100::0/64
|
||||||
|
ipv6 prefix-list RANGE6 seq 20 permit 2001:db8::0/64 ge 128
|
||||||
|
|
||||||
|
route-map RMAP4 permit 10
|
||||||
|
match ip address prefix-list RANGE4
|
||||||
|
!
|
||||||
|
route-map RMAP6 permit 10
|
||||||
|
match ipv6 address prefix-list RANGE6
|
162
tests/topotests/bgp_nexthop_ipv6/r1/show_bgp_ipv6_step1.json
Normal file
162
tests/topotests/bgp_nexthop_ipv6/r1/show_bgp_ipv6_step1.json
Normal file
@ -0,0 +1,162 @@
|
|||||||
|
{
|
||||||
|
"routerId": "10.1.1.1",
|
||||||
|
"localAS": 65000,
|
||||||
|
"routes": {
|
||||||
|
"2001:db8::1/128": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "::",
|
||||||
|
"hostname": "r1",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"2001:db8::2/128": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::2",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"2001:db8::3/128": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::3",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"2001:db8::4/128": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::4",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"2001:db8::5/128": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:3::5",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"2001:db8::6/128": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:4::6",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fd00:100::/64": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "::",
|
||||||
|
"hostname": "r1",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fd00:200::/64": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::2",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fd00:300::/64": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::3",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fd00:400::/64": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::4",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fd00:500::/64": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:3::5",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fd00:600::/64": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:4::6",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
162
tests/topotests/bgp_nexthop_ipv6/r1/show_bgp_ipv6_step2.json
Normal file
162
tests/topotests/bgp_nexthop_ipv6/r1/show_bgp_ipv6_step2.json
Normal file
@ -0,0 +1,162 @@
|
|||||||
|
{
|
||||||
|
"routerId": "10.1.1.1",
|
||||||
|
"localAS": 65000,
|
||||||
|
"routes": {
|
||||||
|
"2001:db8::1/128": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "::",
|
||||||
|
"hostname": "r1",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"2001:db8::2/128": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::2",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"2001:db8::3/128": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::3",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"2001:db8::4/128": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::4",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"2001:db8::5/128": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:3::5",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"2001:db8::6/128": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:4::6",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fd00:100::/64": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "::",
|
||||||
|
"hostname": "r1",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fd00:200::/64": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::2",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fd00:300::/64": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::3",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fd00:400::/64": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::4",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fd00:500::/64": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:3::5",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fd00:600::/64": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:4::6",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
14
tests/topotests/bgp_nexthop_ipv6/r1/zebra.conf
Normal file
14
tests/topotests/bgp_nexthop_ipv6/r1/zebra.conf
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
ip forwarding
|
||||||
|
ipv6 forwarding
|
||||||
|
|
||||||
|
int eth-dummy
|
||||||
|
ip addr 172.16.1.1/24
|
||||||
|
ip addr fd00:100::1/64
|
||||||
|
|
||||||
|
int eth-sw
|
||||||
|
ip addr 192.168.2.1/24
|
||||||
|
ipv6 address fd00:0:2::1/64
|
||||||
|
|
||||||
|
int lo
|
||||||
|
ip addr 10.1.1.1/32
|
||||||
|
ipv6 address 2001:db8::1/128
|
22
tests/topotests/bgp_nexthop_ipv6/r2/bgpd.conf
Normal file
22
tests/topotests/bgp_nexthop_ipv6/r2/bgpd.conf
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
router bgp 65000
|
||||||
|
no bgp ebgp-requires-policy
|
||||||
|
neighbor fd00:0:2::9 remote-as internal
|
||||||
|
neighbor fd00:0:2::9 timers 3 10
|
||||||
|
address-family ipv4 unicast
|
||||||
|
redistribute connected route-map RMAP4
|
||||||
|
!
|
||||||
|
address-family ipv6 unicast
|
||||||
|
redistribute connected route-map RMAP6
|
||||||
|
neighbor fd00:0:2::9 activate
|
||||||
|
|
||||||
|
ip prefix-list RANGE4 seq 10 permit 172.16.0.0/16 le 24
|
||||||
|
ip prefix-list RANGE4 seq 20 permit 10.0.0.0/8 ge 32
|
||||||
|
|
||||||
|
ipv6 prefix-list RANGE6 seq 10 permit fd00:200::0/64
|
||||||
|
ipv6 prefix-list RANGE6 seq 20 permit 2001:db8::0/64 ge 128
|
||||||
|
|
||||||
|
route-map RMAP4 permit 10
|
||||||
|
match ip address prefix-list RANGE4
|
||||||
|
!
|
||||||
|
route-map RMAP6 permit 10
|
||||||
|
match ipv6 address prefix-list RANGE6
|
162
tests/topotests/bgp_nexthop_ipv6/r2/show_bgp_ipv6_step1.json
Normal file
162
tests/topotests/bgp_nexthop_ipv6/r2/show_bgp_ipv6_step1.json
Normal file
@ -0,0 +1,162 @@
|
|||||||
|
{
|
||||||
|
"routerId": "10.2.2.2",
|
||||||
|
"localAS": 65000,
|
||||||
|
"routes": {
|
||||||
|
"2001:db8::1/128": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::1",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"2001:db8::2/128": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "::",
|
||||||
|
"hostname": "r2",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"2001:db8::3/128": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::3",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"2001:db8::4/128": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::4",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"2001:db8::5/128": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:3::5",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"2001:db8::6/128": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:4::6",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fd00:100::/64": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::1",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fd00:200::/64": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "::",
|
||||||
|
"hostname": "r2",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fd00:300::/64": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::3",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fd00:400::/64": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::4",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fd00:500::/64": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:3::5",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fd00:600::/64": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:4::6",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
162
tests/topotests/bgp_nexthop_ipv6/r2/show_bgp_ipv6_step2.json
Normal file
162
tests/topotests/bgp_nexthop_ipv6/r2/show_bgp_ipv6_step2.json
Normal file
@ -0,0 +1,162 @@
|
|||||||
|
{
|
||||||
|
"routerId": "10.2.2.2",
|
||||||
|
"localAS": 65000,
|
||||||
|
"routes": {
|
||||||
|
"2001:db8::1/128": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::1",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"2001:db8::2/128": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "::",
|
||||||
|
"hostname": "r2",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"2001:db8::3/128": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::3",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"2001:db8::4/128": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::4",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"2001:db8::5/128": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:3::5",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"2001:db8::6/128": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:4::6",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fd00:100::/64": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::1",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fd00:200::/64": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "::",
|
||||||
|
"hostname": "r2",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fd00:300::/64": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::3",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fd00:400::/64": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::4",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fd00:500::/64": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:3::5",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fd00:600::/64": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:4::6",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
14
tests/topotests/bgp_nexthop_ipv6/r2/zebra.conf
Normal file
14
tests/topotests/bgp_nexthop_ipv6/r2/zebra.conf
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
ip forwarding
|
||||||
|
ipv6 forwarding
|
||||||
|
|
||||||
|
int eth-dummy
|
||||||
|
ip addr 172.16.2.2/24
|
||||||
|
ip addr fd00:200::1/64
|
||||||
|
|
||||||
|
int eth-sw
|
||||||
|
ip addr 192.168.2.2/24
|
||||||
|
ipv6 address fd00:0:2::2/64
|
||||||
|
|
||||||
|
int lo
|
||||||
|
ip addr 10.2.2.2/32
|
||||||
|
ipv6 address 2001:db8::2/128
|
16
tests/topotests/bgp_nexthop_ipv6/r3/exabgp.cfg
Normal file
16
tests/topotests/bgp_nexthop_ipv6/r3/exabgp.cfg
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
neighbor fd00:0:2::9 {
|
||||||
|
router-id 10.3.3.3;
|
||||||
|
local-address fd00:0:2::3;
|
||||||
|
local-as 65000;
|
||||||
|
peer-as 65000;
|
||||||
|
|
||||||
|
family {
|
||||||
|
ipv6 unicast;
|
||||||
|
}
|
||||||
|
|
||||||
|
static {
|
||||||
|
route fd00:300::0/64 next-hop fd00:0:2::3;
|
||||||
|
route 2001:db8::3/128 next-hop fd00:0:2::3;
|
||||||
|
}
|
||||||
|
hold-time 10;
|
||||||
|
}
|
22
tests/topotests/bgp_nexthop_ipv6/r4/bgpd.conf
Normal file
22
tests/topotests/bgp_nexthop_ipv6/r4/bgpd.conf
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
router bgp 65001
|
||||||
|
no bgp ebgp-requires-policy
|
||||||
|
neighbor fd00:0:2::9 remote-as external
|
||||||
|
neighbor fd00:0:2::9 timers 3 10
|
||||||
|
address-family ipv4 unicast
|
||||||
|
redistribute connected route-map RMAP4
|
||||||
|
!
|
||||||
|
address-family ipv6 unicast
|
||||||
|
redistribute connected route-map RMAP6
|
||||||
|
neighbor fd00:0:2::9 activate
|
||||||
|
|
||||||
|
ip prefix-list RANGE4 seq 10 permit 172.16.0.0/16 le 24
|
||||||
|
ip prefix-list RANGE4 seq 20 permit 10.0.0.0/8 ge 32
|
||||||
|
|
||||||
|
ipv6 prefix-list RANGE6 seq 10 permit fd00:400::0/64
|
||||||
|
ipv6 prefix-list RANGE6 seq 20 permit 2001:db8::0/64 ge 128
|
||||||
|
|
||||||
|
route-map RMAP4 permit 10
|
||||||
|
match ip address prefix-list RANGE4
|
||||||
|
!
|
||||||
|
route-map RMAP6 permit 10
|
||||||
|
match ipv6 address prefix-list RANGE6
|
210
tests/topotests/bgp_nexthop_ipv6/r4/show_bgp_ipv6_step1.json
Normal file
210
tests/topotests/bgp_nexthop_ipv6/r4/show_bgp_ipv6_step1.json
Normal file
@ -0,0 +1,210 @@
|
|||||||
|
{
|
||||||
|
"routerId": "10.4.4.4",
|
||||||
|
"localAS": 65001,
|
||||||
|
"routes": {
|
||||||
|
"2001:db8::1/128": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::1",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ip": "link-local:r1:eth-sw",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "link-local",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"2001:db8::2/128": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::2",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ip": "link-local:r2:eth-sw",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "link-local",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"2001:db8::3/128": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::3",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"2001:db8::4/128": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "::",
|
||||||
|
"hostname": "r4",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"2001:db8::5/128": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::9",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ip": "link-local:rr:eth-sw",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "link-local",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"2001:db8::6/128": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::9",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ip": "link-local:rr:eth-sw",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "link-local",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fd00:100::/64": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::1",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ip": "link-local:r1:eth-sw",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "link-local",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fd00:200::/64": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::2",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ip": "link-local:r2:eth-sw",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "link-local",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fd00:300::/64": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::3",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fd00:400::/64": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "::",
|
||||||
|
"hostname": "r4",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fd00:500::/64": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::9",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ip": "link-local:rr:eth-sw",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "link-local",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fd00:600::/64": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::9",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ip": "link-local:rr:eth-sw",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "link-local",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
222
tests/topotests/bgp_nexthop_ipv6/r4/show_bgp_ipv6_step2.json
Normal file
222
tests/topotests/bgp_nexthop_ipv6/r4/show_bgp_ipv6_step2.json
Normal file
@ -0,0 +1,222 @@
|
|||||||
|
{
|
||||||
|
"routerId": "10.4.4.4",
|
||||||
|
"localAS": 65001,
|
||||||
|
"routes": {
|
||||||
|
"2001:db8::1/128": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::1",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ip": "link-local:rr:eth-sw",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "link-local",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"2001:db8::2/128": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::2",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ip": "link-local:rr:eth-sw",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "link-local",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"2001:db8::3/128": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::3",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ip": "link-local:rr:eth-sw",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "link-local",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"2001:db8::4/128": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "::",
|
||||||
|
"hostname": "r4",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"2001:db8::5/128": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::9",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ip": "link-local:rr:eth-sw",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "link-local",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"2001:db8::6/128": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::9",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ip": "link-local:rr:eth-sw",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "link-local",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fd00:100::/64": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::1",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ip": "link-local:rr:eth-sw",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "link-local",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fd00:200::/64": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::2",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ip": "link-local:rr:eth-sw",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "link-local",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fd00:300::/64": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::3",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ip": "link-local:rr:eth-sw",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "link-local",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fd00:400::/64": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "::",
|
||||||
|
"hostname": "r4",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fd00:500::/64": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::9",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ip": "link-local:rr:eth-sw",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "link-local",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fd00:600::/64": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::9",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ip": "link-local:rr:eth-sw",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "link-local",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
14
tests/topotests/bgp_nexthop_ipv6/r4/zebra.conf
Normal file
14
tests/topotests/bgp_nexthop_ipv6/r4/zebra.conf
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
ip forwarding
|
||||||
|
ipv6 forwarding
|
||||||
|
|
||||||
|
int eth-dummy
|
||||||
|
ip addr 172.16.4.4/24
|
||||||
|
ip addr fd00:400::4/64
|
||||||
|
|
||||||
|
int eth-sw
|
||||||
|
ip addr 192.168.2.4/24
|
||||||
|
ipv6 address fd00:0:2::4/64
|
||||||
|
|
||||||
|
int lo
|
||||||
|
ip addr 10.4.4.4/32
|
||||||
|
ipv6 address 2001:db8::4/128
|
22
tests/topotests/bgp_nexthop_ipv6/r5/bgpd.conf
Normal file
22
tests/topotests/bgp_nexthop_ipv6/r5/bgpd.conf
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
router bgp 65002
|
||||||
|
no bgp ebgp-requires-policy
|
||||||
|
neighbor fd00:0:3::9 remote-as external
|
||||||
|
neighbor fd00:0:3::9 timers 3 10
|
||||||
|
address-family ipv4 unicast
|
||||||
|
redistribute connected route-map RMAP4
|
||||||
|
!
|
||||||
|
address-family ipv6 unicast
|
||||||
|
redistribute connected route-map RMAP6
|
||||||
|
neighbor fd00:0:3::9 activate
|
||||||
|
|
||||||
|
ip prefix-list RANGE4 seq 10 permit 172.16.0.0/16 le 24
|
||||||
|
ip prefix-list RANGE4 seq 20 permit 10.0.0.0/8 ge 32
|
||||||
|
|
||||||
|
ipv6 prefix-list RANGE6 seq 10 permit fd00:500::0/64
|
||||||
|
ipv6 prefix-list RANGE6 seq 20 permit 2001:db8::0/64 ge 128
|
||||||
|
|
||||||
|
route-map RMAP4 permit 10
|
||||||
|
match ip address prefix-list RANGE4
|
||||||
|
!
|
||||||
|
route-map RMAP6 permit 10
|
||||||
|
match ipv6 address prefix-list RANGE6
|
222
tests/topotests/bgp_nexthop_ipv6/r5/show_bgp_ipv6_step1.json
Normal file
222
tests/topotests/bgp_nexthop_ipv6/r5/show_bgp_ipv6_step1.json
Normal file
@ -0,0 +1,222 @@
|
|||||||
|
{
|
||||||
|
"routerId": "10.5.5.5",
|
||||||
|
"localAS": 65002,
|
||||||
|
"routes": {
|
||||||
|
"2001:db8::1/128": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:3::9",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ip": "link-local:rr:eth-r5",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "link-local",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"2001:db8::2/128": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:3::9",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ip": "link-local:rr:eth-r5",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "link-local",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"2001:db8::3/128": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:3::9",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ip": "link-local:rr:eth-r5",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "link-local",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"2001:db8::4/128": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:3::9",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ip": "link-local:rr:eth-r5",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "link-local",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"2001:db8::5/128": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "::",
|
||||||
|
"hostname": "r5",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"2001:db8::6/128": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:3::9",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ip": "link-local:rr:eth-r5",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "link-local",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fd00:100::/64": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:3::9",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ip": "link-local:rr:eth-r5",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "link-local",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fd00:200::/64": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:3::9",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ip": "link-local:rr:eth-r5",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "link-local",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fd00:300::/64": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:3::9",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ip": "link-local:rr:eth-r5",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "link-local",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fd00:400::/64": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:3::9",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ip": "link-local:rr:eth-r5",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "link-local",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fd00:500::/64": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "::",
|
||||||
|
"hostname": "r5",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fd00:600::/64": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:3::9",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ip": "link-local:rr:eth-r5",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "link-local",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
222
tests/topotests/bgp_nexthop_ipv6/r5/show_bgp_ipv6_step2.json
Normal file
222
tests/topotests/bgp_nexthop_ipv6/r5/show_bgp_ipv6_step2.json
Normal file
@ -0,0 +1,222 @@
|
|||||||
|
{
|
||||||
|
"routerId": "10.5.5.5",
|
||||||
|
"localAS": 65002,
|
||||||
|
"routes": {
|
||||||
|
"2001:db8::1/128": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:3::9",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ip": "link-local:rr:eth-r5",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "link-local",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"2001:db8::2/128": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:3::9",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ip": "link-local:rr:eth-r5",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "link-local",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"2001:db8::3/128": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:3::9",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ip": "link-local:rr:eth-r5",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "link-local",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"2001:db8::4/128": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:3::9",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ip": "link-local:rr:eth-r5",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "link-local",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"2001:db8::5/128": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "::",
|
||||||
|
"hostname": "r5",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"2001:db8::6/128": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:3::9",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ip": "link-local:rr:eth-r5",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "link-local",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fd00:100::/64": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:3::9",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ip": "link-local:rr:eth-r5",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "link-local",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fd00:200::/64": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:3::9",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ip": "link-local:rr:eth-r5",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "link-local",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fd00:300::/64": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:3::9",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ip": "link-local:rr:eth-r5",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "link-local",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fd00:400::/64": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:3::9",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ip": "link-local:rr:eth-r5",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "link-local",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fd00:500::/64": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "::",
|
||||||
|
"hostname": "r5",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fd00:600::/64": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:3::9",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ip": "link-local:rr:eth-r5",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "link-local",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
14
tests/topotests/bgp_nexthop_ipv6/r5/zebra.conf
Normal file
14
tests/topotests/bgp_nexthop_ipv6/r5/zebra.conf
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
ip forwarding
|
||||||
|
ipv6 forwarding
|
||||||
|
|
||||||
|
int eth-dummy
|
||||||
|
ip addr 172.16.5.5/24
|
||||||
|
ip addr fd00:500::5/64
|
||||||
|
|
||||||
|
int eth-rr
|
||||||
|
ip addr 192.168.3.5/24
|
||||||
|
ipv6 address fd00:0:3::5/64
|
||||||
|
|
||||||
|
int lo
|
||||||
|
ip addr 10.5.5.5/32
|
||||||
|
ipv6 address 2001:db8::5/128
|
22
tests/topotests/bgp_nexthop_ipv6/r6/bgpd.conf
Normal file
22
tests/topotests/bgp_nexthop_ipv6/r6/bgpd.conf
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
router bgp 65000
|
||||||
|
no bgp ebgp-requires-policy
|
||||||
|
neighbor fd00:0:4::9 remote-as internal
|
||||||
|
neighbor fd00:0:4::9 timers 3 10
|
||||||
|
address-family ipv4 unicast
|
||||||
|
redistribute connected route-map RMAP4
|
||||||
|
!
|
||||||
|
address-family ipv6 unicast
|
||||||
|
redistribute connected route-map RMAP6
|
||||||
|
neighbor fd00:0:4::9 activate
|
||||||
|
|
||||||
|
ip prefix-list RANGE4 seq 10 permit 172.16.0.0/16 le 24
|
||||||
|
ip prefix-list RANGE4 seq 20 permit 10.0.0.0/8 ge 32
|
||||||
|
|
||||||
|
ipv6 prefix-list RANGE6 seq 10 permit fd00:600::0/64
|
||||||
|
ipv6 prefix-list RANGE6 seq 20 permit 2001:db8::0/64 ge 128
|
||||||
|
|
||||||
|
route-map RMAP4 permit 10
|
||||||
|
match ip address prefix-list RANGE4
|
||||||
|
!
|
||||||
|
route-map RMAP6 permit 10
|
||||||
|
match ipv6 address prefix-list RANGE6
|
162
tests/topotests/bgp_nexthop_ipv6/r6/show_bgp_ipv6_step1.json
Normal file
162
tests/topotests/bgp_nexthop_ipv6/r6/show_bgp_ipv6_step1.json
Normal file
@ -0,0 +1,162 @@
|
|||||||
|
{
|
||||||
|
"routerId": "10.6.6.6",
|
||||||
|
"localAS": 65000,
|
||||||
|
"routes": {
|
||||||
|
"2001:db8::1/128": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::1",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"2001:db8::2/128": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::2",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"2001:db8::3/128": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::3",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"2001:db8::4/128": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::4",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"2001:db8::5/128": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:3::5",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"2001:db8::6/128": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "::",
|
||||||
|
"hostname": "r6",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fd00:100::/64": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::1",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fd00:200::/64": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::2",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fd00:300::/64": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::3",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fd00:400::/64": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::4",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fd00:500::/64": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:3::5",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fd00:600::/64": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "::",
|
||||||
|
"hostname": "r6",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
162
tests/topotests/bgp_nexthop_ipv6/r6/show_bgp_ipv6_step2.json
Normal file
162
tests/topotests/bgp_nexthop_ipv6/r6/show_bgp_ipv6_step2.json
Normal file
@ -0,0 +1,162 @@
|
|||||||
|
{
|
||||||
|
"routerId": "10.6.6.6",
|
||||||
|
"localAS": 65000,
|
||||||
|
"routes": {
|
||||||
|
"2001:db8::1/128": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::1",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"2001:db8::2/128": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::2",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"2001:db8::3/128": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::3",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"2001:db8::4/128": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::4",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"2001:db8::5/128": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:3::5",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"2001:db8::6/128": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "::",
|
||||||
|
"hostname": "r6",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fd00:100::/64": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::1",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fd00:200::/64": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::2",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fd00:300::/64": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::3",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fd00:400::/64": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::4",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fd00:500::/64": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:3::5",
|
||||||
|
"hostname": "rr",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fd00:600::/64": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "::",
|
||||||
|
"hostname": "r6",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
14
tests/topotests/bgp_nexthop_ipv6/r6/zebra.conf
Normal file
14
tests/topotests/bgp_nexthop_ipv6/r6/zebra.conf
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
ip forwarding
|
||||||
|
ipv6 forwarding
|
||||||
|
|
||||||
|
int eth-dummy
|
||||||
|
ip addr 172.16.6.6/24
|
||||||
|
ip addr fd00:600::6/64
|
||||||
|
|
||||||
|
int eth-rr
|
||||||
|
ip addr 192.168.4.6/24
|
||||||
|
ipv6 address fd00:0:4::6/64
|
||||||
|
|
||||||
|
int lo
|
||||||
|
ip addr 10.6.6.6/32
|
||||||
|
ipv6 address 2001:db8::6/128
|
30
tests/topotests/bgp_nexthop_ipv6/rr/bgpd.conf
Normal file
30
tests/topotests/bgp_nexthop_ipv6/rr/bgpd.conf
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
router bgp 65000
|
||||||
|
no bgp ebgp-requires-policy
|
||||||
|
neighbor fd00:0:2::1 remote-as internal
|
||||||
|
neighbor fd00:0:2::1 timers 3 10
|
||||||
|
neighbor fd00:0:2::2 remote-as internal
|
||||||
|
neighbor fd00:0:2::2 timers 3 10
|
||||||
|
neighbor fd00:0:2::3 remote-as internal
|
||||||
|
neighbor fd00:0:2::3 timers 3 10
|
||||||
|
neighbor fd00:0:2::4 remote-as external
|
||||||
|
neighbor fd00:0:2::4 timers 3 10
|
||||||
|
neighbor fd00:0:3::5 remote-as external
|
||||||
|
neighbor fd00:0:3::5 timers 3 10
|
||||||
|
neighbor fd00:0:4::6 remote-as internal
|
||||||
|
neighbor fd00:0:4::6 timers 3 10
|
||||||
|
address-family ipv4 unicast
|
||||||
|
neighbor fd00:0:2::1 route-reflector-client
|
||||||
|
neighbor fd00:0:2::2 route-reflector-client
|
||||||
|
neighbor fd00:0:2::3 route-reflector-client
|
||||||
|
neighbor fd00:0:4::6 route-reflector-client
|
||||||
|
address-family ipv6 unicast
|
||||||
|
neighbor fd00:0:2::1 route-reflector-client
|
||||||
|
neighbor fd00:0:2::1 activate
|
||||||
|
neighbor fd00:0:2::2 route-reflector-client
|
||||||
|
neighbor fd00:0:2::2 activate
|
||||||
|
neighbor fd00:0:2::3 route-reflector-client
|
||||||
|
neighbor fd00:0:2::3 activate
|
||||||
|
neighbor fd00:0:2::4 nexthop-local unchanged
|
||||||
|
neighbor fd00:0:2::4 activate
|
||||||
|
neighbor fd00:0:3::5 activate
|
||||||
|
neighbor fd00:0:4::6 activate
|
220
tests/topotests/bgp_nexthop_ipv6/rr/show_bgp_ipv6_step1.json
Normal file
220
tests/topotests/bgp_nexthop_ipv6/rr/show_bgp_ipv6_step1.json
Normal file
@ -0,0 +1,220 @@
|
|||||||
|
{
|
||||||
|
"routerId": "10.9.9.9",
|
||||||
|
"localAS": 65000,
|
||||||
|
"routes": {
|
||||||
|
"2001:db8::1/128": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::1",
|
||||||
|
"hostname": "r1",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ip": "link-local:r1:eth-sw",
|
||||||
|
"hostname": "r1",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "link-local",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"2001:db8::2/128": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::2",
|
||||||
|
"hostname": "r2",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ip": "link-local:r2:eth-sw",
|
||||||
|
"hostname": "r2",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "link-local",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"2001:db8::3/128": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::3",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"2001:db8::4/128": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::4",
|
||||||
|
"hostname": "r4",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ip": "link-local:r4:eth-sw",
|
||||||
|
"hostname": "r4",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "link-local",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"2001:db8::5/128": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:3::5",
|
||||||
|
"hostname": "r5",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ip": "link-local:r5:eth-rr",
|
||||||
|
"hostname": "r5",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "link-local",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"2001:db8::6/128": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:4::6",
|
||||||
|
"hostname": "r6",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ip": "link-local:r6:eth-rr",
|
||||||
|
"hostname": "r6",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "link-local",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fd00:100::/64": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::1",
|
||||||
|
"hostname": "r1",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ip": "link-local:r1:eth-sw",
|
||||||
|
"hostname": "r1",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "link-local",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fd00:200::/64": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::2",
|
||||||
|
"hostname": "r2",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ip": "link-local:r2:eth-sw",
|
||||||
|
"hostname": "r2",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "link-local",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fd00:300::/64": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::3",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fd00:400::/64": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::4",
|
||||||
|
"hostname": "r4",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ip": "link-local:r4:eth-sw",
|
||||||
|
"hostname": "r4",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "link-local",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fd00:500::/64": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:3::5",
|
||||||
|
"hostname": "r5",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ip": "link-local:r5:eth-rr",
|
||||||
|
"hostname": "r5",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "link-local",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fd00:600::/64": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:4::6",
|
||||||
|
"hostname": "r6",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ip": "link-local:r6:eth-rr",
|
||||||
|
"hostname": "r6",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "link-local",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
220
tests/topotests/bgp_nexthop_ipv6/rr/show_bgp_ipv6_step2.json
Normal file
220
tests/topotests/bgp_nexthop_ipv6/rr/show_bgp_ipv6_step2.json
Normal file
@ -0,0 +1,220 @@
|
|||||||
|
{
|
||||||
|
"routerId": "10.9.9.9",
|
||||||
|
"localAS": 65000,
|
||||||
|
"routes": {
|
||||||
|
"2001:db8::1/128": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::1",
|
||||||
|
"hostname": "r1",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ip": "link-local:r1:eth-sw",
|
||||||
|
"hostname": "r1",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "link-local",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"2001:db8::2/128": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::2",
|
||||||
|
"hostname": "r2",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ip": "link-local:r2:eth-sw",
|
||||||
|
"hostname": "r2",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "link-local",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"2001:db8::3/128": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::3",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"2001:db8::4/128": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::4",
|
||||||
|
"hostname": "r4",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ip": "link-local:r4:eth-sw",
|
||||||
|
"hostname": "r4",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "link-local",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"2001:db8::5/128": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:3::5",
|
||||||
|
"hostname": "r5",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ip": "link-local:r5:eth-rr",
|
||||||
|
"hostname": "r5",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "link-local",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"2001:db8::6/128": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:4::6",
|
||||||
|
"hostname": "r6",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ip": "link-local:r6:eth-rr",
|
||||||
|
"hostname": "r6",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "link-local",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fd00:100::/64": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::1",
|
||||||
|
"hostname": "r1",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ip": "link-local:r1:eth-sw",
|
||||||
|
"hostname": "r1",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "link-local",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fd00:200::/64": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::2",
|
||||||
|
"hostname": "r2",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ip": "link-local:r2:eth-sw",
|
||||||
|
"hostname": "r2",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "link-local",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fd00:300::/64": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::3",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fd00:400::/64": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:2::4",
|
||||||
|
"hostname": "r4",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ip": "link-local:r4:eth-sw",
|
||||||
|
"hostname": "r4",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "link-local",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fd00:500::/64": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:3::5",
|
||||||
|
"hostname": "r5",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ip": "link-local:r5:eth-rr",
|
||||||
|
"hostname": "r5",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "link-local",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fd00:600::/64": [
|
||||||
|
{
|
||||||
|
"nexthops": [
|
||||||
|
{
|
||||||
|
"ip": "fd00:0:4::6",
|
||||||
|
"hostname": "r6",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "global"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ip": "link-local:r6:eth-rr",
|
||||||
|
"hostname": "r6",
|
||||||
|
"afi": "ipv6",
|
||||||
|
"scope": "link-local",
|
||||||
|
"used": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"ipv6Unicast": {
|
||||||
|
"failedPeers": 0,
|
||||||
|
"totalPeers": 6
|
||||||
|
}
|
||||||
|
}
|
18
tests/topotests/bgp_nexthop_ipv6/rr/zebra.conf
Normal file
18
tests/topotests/bgp_nexthop_ipv6/rr/zebra.conf
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
ip forwarding
|
||||||
|
ipv6 forwarding
|
||||||
|
|
||||||
|
int eth-sw
|
||||||
|
ip addr 192.168.2.9/24
|
||||||
|
ipv6 address fd00:0:2::9/64
|
||||||
|
|
||||||
|
int eth-r5
|
||||||
|
ip addr 192.168.3.9/24
|
||||||
|
ipv6 address fd00:0:3::9/64
|
||||||
|
|
||||||
|
int eth-r6
|
||||||
|
ip addr 192.168.4.9/24
|
||||||
|
ipv6 address fd00:0:4::9/64
|
||||||
|
|
||||||
|
int lo
|
||||||
|
ip addr 10.9.9.9/32
|
||||||
|
ipv6 address 2001:db8::9/128
|
263
tests/topotests/bgp_nexthop_ipv6/test_bgp_nexthop_ipv6_topo1.py
Normal file
263
tests/topotests/bgp_nexthop_ipv6/test_bgp_nexthop_ipv6_topo1.py
Normal file
@ -0,0 +1,263 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
# SPDX-License-Identifier: ISC
|
||||||
|
|
||||||
|
#
|
||||||
|
# test_bgp_nexthop_ipv6_topo1.py
|
||||||
|
#
|
||||||
|
# Copyright (c) 2024 by
|
||||||
|
# Cumulus Networks, Inc.
|
||||||
|
# 6WIND S.A.
|
||||||
|
#
|
||||||
|
|
||||||
|
"""
|
||||||
|
Ensure that BGP ipv6 nexthops are correct
|
||||||
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import pytest
|
||||||
|
from functools import partial
|
||||||
|
import json
|
||||||
|
|
||||||
|
# Save the Current Working Directory to find configuration files.
|
||||||
|
CWD = os.path.dirname(os.path.realpath(__file__))
|
||||||
|
sys.path.append(os.path.join(CWD, "../"))
|
||||||
|
|
||||||
|
# pylint: disable=C0413
|
||||||
|
# Import topogen and topotest helpers
|
||||||
|
from lib import topotest
|
||||||
|
from lib.topogen import Topogen, TopoRouter, get_topogen
|
||||||
|
from lib.topolog import logger
|
||||||
|
|
||||||
|
# Required to instantiate the topology builder class.
|
||||||
|
|
||||||
|
|
||||||
|
pytestmark = [pytest.mark.bgpd]
|
||||||
|
|
||||||
|
|
||||||
|
def build_topo(tgen):
|
||||||
|
"""
|
||||||
|
All peers are FRR BGP peers except r3 that is a exabgp peer.
|
||||||
|
rr is a route-reflector for AS 65000 iBGP peers.
|
||||||
|
Exabgp does not send any IPv6 Link-Local nexthop
|
||||||
|
|
||||||
|
iBGP peers | eBGP peers
|
||||||
|
|
|
||||||
|
AS 65000 |
|
||||||
|
|
|
||||||
|
+---+ |
|
||||||
|
| r6| |
|
||||||
|
+---+ |
|
||||||
|
| |
|
||||||
|
fd00:0:3::0/64 |
|
||||||
|
| | AS 65002
|
||||||
|
+---+ | +---+
|
||||||
|
|rr |----fd00:0:4::0/64---| r5|
|
||||||
|
+---+ |_________+---+
|
||||||
|
| | +---+
|
||||||
|
fd00:0:2::0/64----------------| r4|
|
||||||
|
/ | \ | +---+
|
||||||
|
+---+ +---+ +---+ | AS 65001
|
||||||
|
| r1| | r2| |r3 | |
|
||||||
|
+---+ +---+ +---+
|
||||||
|
"""
|
||||||
|
|
||||||
|
def connect_routers(tgen, left, right):
|
||||||
|
for rname in [left, right]:
|
||||||
|
if rname not in tgen.routers().keys():
|
||||||
|
tgen.add_router(rname)
|
||||||
|
|
||||||
|
switch = tgen.add_switch("s-{}-{}".format(left, right))
|
||||||
|
switch.add_link(tgen.gears[left], nodeif="eth-{}".format(right))
|
||||||
|
switch.add_link(tgen.gears[right], nodeif="eth-{}".format(left))
|
||||||
|
|
||||||
|
def connect_switchs(tgen, rname, switch):
|
||||||
|
if rname not in tgen.routers().keys():
|
||||||
|
tgen.add_router(rname)
|
||||||
|
|
||||||
|
switch.add_link(tgen.gears[rname], nodeif="eth-{}".format(switch.name))
|
||||||
|
|
||||||
|
def connect_dummy(tgen, rname, switch):
|
||||||
|
if rname not in tgen.routers().keys():
|
||||||
|
tgen.add_router(rname)
|
||||||
|
|
||||||
|
switch.add_link(tgen.gears[rname], nodeif="eth-dummy")
|
||||||
|
|
||||||
|
# sw_du switch is for a dummy interface (for local network)
|
||||||
|
for i in range(1, 7):
|
||||||
|
if i == 3:
|
||||||
|
# r3 is an exabgp peer
|
||||||
|
continue
|
||||||
|
sw_du = tgen.add_switch("sw%s" % i)
|
||||||
|
connect_dummy(tgen, "r%s" % i, sw_du)
|
||||||
|
|
||||||
|
# sw switch is for interconnecting peers on the same subnet
|
||||||
|
sw = tgen.add_switch("sw")
|
||||||
|
connect_switchs(tgen, "rr", sw)
|
||||||
|
connect_switchs(tgen, "r1", sw)
|
||||||
|
connect_switchs(tgen, "r2", sw)
|
||||||
|
connect_switchs(tgen, "r4", sw)
|
||||||
|
|
||||||
|
# directly connected without switch routers
|
||||||
|
connect_routers(tgen, "rr", "r5")
|
||||||
|
connect_routers(tgen, "rr", "r6")
|
||||||
|
|
||||||
|
## Add iBGP ExaBGP neighbor
|
||||||
|
peer_ip = "fd00:0:2::3" ## peer
|
||||||
|
peer_route = "via fd00:0:2::9" ## router
|
||||||
|
r3 = tgen.add_exabgp_peer("r3", ip=peer_ip, defaultRoute=peer_route)
|
||||||
|
sw.add_link(r3)
|
||||||
|
|
||||||
|
|
||||||
|
#####################################################
|
||||||
|
##
|
||||||
|
## Tests starting
|
||||||
|
##
|
||||||
|
#####################################################
|
||||||
|
|
||||||
|
|
||||||
|
def setup_module(module):
|
||||||
|
"Setup topology"
|
||||||
|
tgen = Topogen(build_topo, module.__name__)
|
||||||
|
tgen.start_topology()
|
||||||
|
|
||||||
|
# This is a sample of configuration loading.
|
||||||
|
router_list = tgen.routers()
|
||||||
|
for rname, router in router_list.items():
|
||||||
|
router.load_config(
|
||||||
|
TopoRouter.RD_ZEBRA, os.path.join(CWD, "{}/zebra.conf".format(rname))
|
||||||
|
)
|
||||||
|
router.load_config(
|
||||||
|
TopoRouter.RD_BGP, os.path.join(CWD, "{}/bgpd.conf".format(rname))
|
||||||
|
)
|
||||||
|
|
||||||
|
tgen.start_router()
|
||||||
|
|
||||||
|
# Start r3 exabgp peer
|
||||||
|
r3 = tgen.gears["r3"]
|
||||||
|
r3.start(os.path.join(CWD, "r3"), os.path.join(CWD, "exabgp.env"))
|
||||||
|
|
||||||
|
|
||||||
|
def get_link_local(rname, ifname, cache):
|
||||||
|
ip = cache.get(rname, {}).get(ifname)
|
||||||
|
if ip:
|
||||||
|
return ip
|
||||||
|
|
||||||
|
tgen = get_topogen()
|
||||||
|
out = tgen.gears[rname].vtysh_cmd("show interface %s json" % ifname, isjson=True)
|
||||||
|
for address in out[ifname]["ipAddresses"]:
|
||||||
|
if not address["address"].startswith("fe80::"):
|
||||||
|
continue
|
||||||
|
ip = address["address"].split("/")[0]
|
||||||
|
cache.setdefault(rname, {})[ifname] = ip
|
||||||
|
return ip
|
||||||
|
|
||||||
|
|
||||||
|
def replace_link_local(expected, cache):
|
||||||
|
for prefix, prefix_info in expected.get("routes", {}).items():
|
||||||
|
for nexthop in prefix_info[0].get("nexthops", []):
|
||||||
|
ip = nexthop.get("ip", "")
|
||||||
|
if not ip.startswith("link-local:"):
|
||||||
|
continue
|
||||||
|
rname = ip.split(":")[1]
|
||||||
|
ifname = ip.split(":")[2]
|
||||||
|
ip = get_link_local(rname, ifname, cache)
|
||||||
|
nexthop["ip"] = ip
|
||||||
|
|
||||||
|
|
||||||
|
def teardown_module(_mod):
|
||||||
|
"Teardown the pytest environment"
|
||||||
|
tgen = get_topogen()
|
||||||
|
|
||||||
|
# This function tears down the whole topology.
|
||||||
|
tgen.stop_topology()
|
||||||
|
|
||||||
|
|
||||||
|
def test_converge_protocols():
|
||||||
|
"Wait for protocol convergence"
|
||||||
|
|
||||||
|
tgen = get_topogen()
|
||||||
|
# Don't run this test if we have any failure.
|
||||||
|
if tgen.routers_have_failure():
|
||||||
|
pytest.skip(tgen.errors)
|
||||||
|
|
||||||
|
rr = tgen.gears["rr"]
|
||||||
|
ref_file = "{}/{}/show_bgp_ipv6_summary.json".format(CWD, rr.name)
|
||||||
|
expected = json.loads(open(ref_file).read())
|
||||||
|
|
||||||
|
test_func = partial(
|
||||||
|
topotest.router_json_cmp,
|
||||||
|
rr,
|
||||||
|
"show bgp ipv6 summary json",
|
||||||
|
expected,
|
||||||
|
)
|
||||||
|
_, res = topotest.run_and_expect(test_func, None, count=30, wait=1)
|
||||||
|
assertmsg = "{}: BGP convergence".format(rr.name)
|
||||||
|
assert res is None, assertmsg
|
||||||
|
|
||||||
|
|
||||||
|
def test_bgp_ipv6_table_step1():
|
||||||
|
tgen = get_topogen()
|
||||||
|
|
||||||
|
# Don't run this test if we have any failure.
|
||||||
|
if tgen.routers_have_failure():
|
||||||
|
pytest.skip(tgen.errors)
|
||||||
|
|
||||||
|
global link_local_cache
|
||||||
|
link_local_cache = {}
|
||||||
|
router_list = tgen.routers().values()
|
||||||
|
for router in router_list:
|
||||||
|
# router.cmd("vtysh -c 'sh bgp ipv6 json' >/tmp/show_bgp_ipv6_%s.json" % router.name)
|
||||||
|
ref_file = "{}/{}/show_bgp_ipv6_step1.json".format(CWD, router.name)
|
||||||
|
expected = json.loads(open(ref_file).read())
|
||||||
|
replace_link_local(expected, link_local_cache)
|
||||||
|
|
||||||
|
test_func = partial(
|
||||||
|
topotest.router_json_cmp,
|
||||||
|
router,
|
||||||
|
"show bgp ipv6 unicast json",
|
||||||
|
expected,
|
||||||
|
)
|
||||||
|
_, res = topotest.run_and_expect(test_func, None, count=30, wait=1)
|
||||||
|
assertmsg = "{}: BGP IPv6 Nexthop failure".format(router.name)
|
||||||
|
assert res is None, assertmsg
|
||||||
|
|
||||||
|
|
||||||
|
def test_bgp_ipv6_table_step2():
|
||||||
|
tgen = get_topogen()
|
||||||
|
|
||||||
|
# Don't run this test if we have any failure.
|
||||||
|
if tgen.routers_have_failure():
|
||||||
|
pytest.skip(tgen.errors)
|
||||||
|
|
||||||
|
rr = tgen.gears["rr"]
|
||||||
|
rr.vtysh_cmd(
|
||||||
|
"""
|
||||||
|
configure terminal
|
||||||
|
router bgp 65000
|
||||||
|
address-family ipv6 unicast
|
||||||
|
no neighbor fd00:0:2::4 nexthop-local unchanged
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
|
||||||
|
router_list = tgen.routers().values()
|
||||||
|
for router in router_list:
|
||||||
|
# router.cmd("vtysh -c 'sh bgp ipv6 json' >/tmp/show_bgp_ipv6_%s.json" % router.name)
|
||||||
|
ref_file = "{}/{}/show_bgp_ipv6_step2.json".format(CWD, router.name)
|
||||||
|
expected = json.loads(open(ref_file).read())
|
||||||
|
replace_link_local(expected, link_local_cache)
|
||||||
|
|
||||||
|
test_func = partial(
|
||||||
|
topotest.router_json_cmp,
|
||||||
|
router,
|
||||||
|
"show bgp ipv6 unicast json",
|
||||||
|
expected,
|
||||||
|
)
|
||||||
|
_, res = topotest.run_and_expect(test_func, None, count=30, wait=1)
|
||||||
|
assertmsg = "{}: BGP IPv6 Nexthop failure".format(router.name)
|
||||||
|
assert res is None, assertmsg
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
args = ["-s"] + sys.argv[1:]
|
||||||
|
sys.exit(pytest.main(args))
|
Loading…
Reference in New Issue
Block a user