mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-15 15:17:15 +00:00
Merge pull request #5707 from donaldsharp/nexthop_encoding
Nexthop encoding
This commit is contained in:
commit
9e1ecdbaa4
@ -911,8 +911,6 @@ int zapi_nexthop_encode(struct stream *s, const struct zapi_nexthop *api_nh,
|
||||
stream_putc(s, api_nh->bh_type);
|
||||
break;
|
||||
case NEXTHOP_TYPE_IPV4:
|
||||
stream_put_in_addr(s, &api_nh->gate.ipv4);
|
||||
break;
|
||||
case NEXTHOP_TYPE_IPV4_IFINDEX:
|
||||
stream_put_in_addr(s, &api_nh->gate.ipv4);
|
||||
stream_putl(s, api_nh->ifindex);
|
||||
@ -921,9 +919,6 @@ int zapi_nexthop_encode(struct stream *s, const struct zapi_nexthop *api_nh,
|
||||
stream_putl(s, api_nh->ifindex);
|
||||
break;
|
||||
case NEXTHOP_TYPE_IPV6:
|
||||
stream_write(s, (uint8_t *)&api_nh->gate.ipv6,
|
||||
16);
|
||||
break;
|
||||
case NEXTHOP_TYPE_IPV6_IFINDEX:
|
||||
stream_write(s, (uint8_t *)&api_nh->gate.ipv6,
|
||||
16);
|
||||
@ -1071,9 +1066,6 @@ static int zapi_nexthop_decode(struct stream *s, struct zapi_nexthop *api_nh,
|
||||
STREAM_GETC(s, api_nh->bh_type);
|
||||
break;
|
||||
case NEXTHOP_TYPE_IPV4:
|
||||
STREAM_GET(&api_nh->gate.ipv4.s_addr, s,
|
||||
IPV4_MAX_BYTELEN);
|
||||
break;
|
||||
case NEXTHOP_TYPE_IPV4_IFINDEX:
|
||||
STREAM_GET(&api_nh->gate.ipv4.s_addr, s,
|
||||
IPV4_MAX_BYTELEN);
|
||||
@ -1083,8 +1075,6 @@ static int zapi_nexthop_decode(struct stream *s, struct zapi_nexthop *api_nh,
|
||||
STREAM_GETL(s, api_nh->ifindex);
|
||||
break;
|
||||
case NEXTHOP_TYPE_IPV6:
|
||||
STREAM_GET(&api_nh->gate.ipv6, s, 16);
|
||||
break;
|
||||
case NEXTHOP_TYPE_IPV6_IFINDEX:
|
||||
STREAM_GET(&api_nh->gate.ipv6, s, 16);
|
||||
STREAM_GETL(s, api_nh->ifindex);
|
||||
|
3
tests/topotests/pim-basic/r1/bgpd.conf
Normal file
3
tests/topotests/pim-basic/r1/bgpd.conf
Normal file
@ -0,0 +1,3 @@
|
||||
router bgp 65001
|
||||
neighbor 10.0.30.3 remote-as external
|
||||
redistribute connected
|
@ -2,9 +2,12 @@ hostname r1
|
||||
!
|
||||
interface r1-eth0
|
||||
ip igmp
|
||||
ip pim sm
|
||||
ip pim
|
||||
!
|
||||
interface r1-eth1
|
||||
ip pim
|
||||
!
|
||||
interface lo
|
||||
ip pim sm
|
||||
ip pim
|
||||
!
|
||||
ip pim rp 10.254.0.1
|
||||
ip pim rp 10.254.0.3
|
||||
|
9
tests/topotests/pim-basic/r1/rp-info.json
Normal file
9
tests/topotests/pim-basic/r1/rp-info.json
Normal file
@ -0,0 +1,9 @@
|
||||
{
|
||||
"10.254.0.3":[
|
||||
{
|
||||
"outboundInterface":"r1-eth1",
|
||||
"group":"224.0.0.0\/4",
|
||||
"source":"Static"
|
||||
}
|
||||
]
|
||||
}
|
@ -3,6 +3,9 @@ hostname r1
|
||||
interface r1-eth0
|
||||
ip address 10.0.20.1/24
|
||||
!
|
||||
interface r1-eth1
|
||||
ip address 10.0.30.1/24
|
||||
!
|
||||
interface lo
|
||||
ip address 10.254.0.1/32
|
||||
!
|
||||
|
3
tests/topotests/pim-basic/rp/bgpd.conf
Normal file
3
tests/topotests/pim-basic/rp/bgpd.conf
Normal file
@ -0,0 +1,3 @@
|
||||
router bgp 65003
|
||||
neighbor 10.0.30.1 remote-as external
|
||||
redistribute connected
|
9
tests/topotests/pim-basic/rp/pimd.conf
Normal file
9
tests/topotests/pim-basic/rp/pimd.conf
Normal file
@ -0,0 +1,9 @@
|
||||
hostname rp
|
||||
!
|
||||
interface rp-eth0
|
||||
ip pim
|
||||
!
|
||||
interface lo
|
||||
ip pim
|
||||
!
|
||||
ip pim rp 10.254.0.3
|
17
tests/topotests/pim-basic/rp/upstream.json
Normal file
17
tests/topotests/pim-basic/rp/upstream.json
Normal file
@ -0,0 +1,17 @@
|
||||
{
|
||||
"229.1.1.1":{
|
||||
"10.0.20.2":{
|
||||
"sourceStream":true,
|
||||
"inboundInterface":"rp-eth0",
|
||||
"rpfAddress":"10.0.20.2",
|
||||
"source":"10.0.20.2",
|
||||
"group":"229.1.1.1",
|
||||
"state":"NotJ",
|
||||
"joinState":"NotJoined",
|
||||
"regState":"RegNoInfo",
|
||||
"resetTimer":"--:--:--",
|
||||
"refCount":1,
|
||||
"sptBit":0
|
||||
}
|
||||
}
|
||||
}
|
8
tests/topotests/pim-basic/rp/zebra.conf
Normal file
8
tests/topotests/pim-basic/rp/zebra.conf
Normal file
@ -0,0 +1,8 @@
|
||||
hostname rp
|
||||
!
|
||||
interface rp-eth0
|
||||
ip address 10.0.30.3/24
|
||||
!
|
||||
interface lo
|
||||
ip address 10.254.0.3/32
|
||||
!
|
@ -28,6 +28,8 @@ test_pim.py: Test pim
|
||||
import os
|
||||
import sys
|
||||
import pytest
|
||||
import json
|
||||
from functools import partial
|
||||
|
||||
CWD = os.path.dirname(os.path.realpath(__file__))
|
||||
sys.path.append(os.path.join(CWD, '../'))
|
||||
@ -47,11 +49,27 @@ class PIMTopo(Topo):
|
||||
for routern in range(1, 3):
|
||||
tgen.add_router('r{}'.format(routern))
|
||||
|
||||
tgen.add_router('rp')
|
||||
|
||||
# r1 -> .1
|
||||
# r2 -> .2
|
||||
# rp -> .3
|
||||
# loopback network is 10.254.0.X/32
|
||||
#
|
||||
# r1 <- sw1 -> r2
|
||||
# r1-eth0 <-> r2-eth0
|
||||
# 10.0.20.0/24
|
||||
sw = tgen.add_switch('sw1')
|
||||
sw.add_link(tgen.gears['r1'])
|
||||
sw.add_link(tgen.gears['r2'])
|
||||
|
||||
# r1 <- sw2 -> rp
|
||||
# r1-eth1 <-> rp-eth0
|
||||
# 10.0.30.0/24
|
||||
sw = tgen.add_switch('sw2')
|
||||
sw.add_link(tgen.gears['r1'])
|
||||
sw.add_link(tgen.gears['rp'])
|
||||
|
||||
|
||||
def setup_module(mod):
|
||||
"Sets up the pytest environment"
|
||||
@ -68,9 +86,14 @@ def setup_module(mod):
|
||||
TopoRouter.RD_PIM,
|
||||
os.path.join(CWD, '{}/pimd.conf'.format(rname))
|
||||
)
|
||||
router.load_config(
|
||||
TopoRouter.RD_BGP,
|
||||
os.path.join(CWD, '{}/bgpd.conf'.format(rname))
|
||||
)
|
||||
|
||||
# After loading the configurations, this function loads configured daemons.
|
||||
tgen.start_router()
|
||||
#tgen.mininet_cli()
|
||||
|
||||
|
||||
def teardown_module(mod):
|
||||
@ -80,6 +103,22 @@ def teardown_module(mod):
|
||||
# This function tears down the whole topology.
|
||||
tgen.stop_topology()
|
||||
|
||||
def test_pim_rp_setup():
|
||||
"Ensure basic routing has come up and the rp has an outgoing interface"
|
||||
#Ensure rp and r1 establish pim neighbor ship and bgp has come up
|
||||
#Finally ensure that the rp has an outgoing interface on r1
|
||||
tgen = get_topogen()
|
||||
|
||||
r1 = tgen.gears['r1']
|
||||
json_file = '{}/{}/rp-info.json'.format(CWD, r1.name)
|
||||
expected = json.loads(open(json_file).read())
|
||||
|
||||
test_func = partial(topotest.router_json_cmp,
|
||||
r1, 'show ip pim rp-info json', expected)
|
||||
_, result = topotest.run_and_expect(test_func, None, count=15, wait=5)
|
||||
assertmsg = '"{}" JSON output mismatches'.format(r1.name)
|
||||
assert result is None, assertmsg
|
||||
#tgen.mininet_cli()
|
||||
|
||||
def test_pim_send_mcast_stream():
|
||||
"Establish a Multicast stream from r2 -> r1 and then ensure S,G is created as appropriate"
|
||||
@ -90,6 +129,7 @@ def test_pim_send_mcast_stream():
|
||||
if tgen.routers_have_failure():
|
||||
pytest.skip(tgen.errors)
|
||||
|
||||
rp = tgen.gears['rp']
|
||||
r2 = tgen.gears['r2']
|
||||
r1 = tgen.gears['r1']
|
||||
|
||||
@ -111,7 +151,21 @@ def test_pim_send_mcast_stream():
|
||||
}
|
||||
|
||||
assert topotest.json_cmp(out, expected) is None, 'failed to converge pim'
|
||||
#tgen.mininet_cli()
|
||||
|
||||
def test_pim_rp_sees_stream():
|
||||
"Ensure that the RP sees the stream and has acted accordingly"
|
||||
tgen = get_topogen()
|
||||
|
||||
rp = tgen.gears['rp']
|
||||
json_file = '{}/{}/upstream.json'.format(CWD, rp.name)
|
||||
expected = json.loads(open(json_file).read())
|
||||
|
||||
test_func = partial(topotest.router_json_cmp,
|
||||
rp, 'show ip pim upstream json', expected)
|
||||
_, result = topotest.run_and_expect(test_func, None, count=20, wait=.5)
|
||||
assertmsg = '"{}" JSON output mismatches'.format(rp.name)
|
||||
assert result is None, assertmsg
|
||||
|
||||
def test_pim_igmp_report():
|
||||
"Send a igmp report from r2->r1 and ensure that the *,G state is created on r1"
|
||||
|
Loading…
Reference in New Issue
Block a user