mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-15 18:56:40 +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);
|
stream_putc(s, api_nh->bh_type);
|
||||||
break;
|
break;
|
||||||
case NEXTHOP_TYPE_IPV4:
|
case NEXTHOP_TYPE_IPV4:
|
||||||
stream_put_in_addr(s, &api_nh->gate.ipv4);
|
|
||||||
break;
|
|
||||||
case NEXTHOP_TYPE_IPV4_IFINDEX:
|
case NEXTHOP_TYPE_IPV4_IFINDEX:
|
||||||
stream_put_in_addr(s, &api_nh->gate.ipv4);
|
stream_put_in_addr(s, &api_nh->gate.ipv4);
|
||||||
stream_putl(s, api_nh->ifindex);
|
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);
|
stream_putl(s, api_nh->ifindex);
|
||||||
break;
|
break;
|
||||||
case NEXTHOP_TYPE_IPV6:
|
case NEXTHOP_TYPE_IPV6:
|
||||||
stream_write(s, (uint8_t *)&api_nh->gate.ipv6,
|
|
||||||
16);
|
|
||||||
break;
|
|
||||||
case NEXTHOP_TYPE_IPV6_IFINDEX:
|
case NEXTHOP_TYPE_IPV6_IFINDEX:
|
||||||
stream_write(s, (uint8_t *)&api_nh->gate.ipv6,
|
stream_write(s, (uint8_t *)&api_nh->gate.ipv6,
|
||||||
16);
|
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);
|
STREAM_GETC(s, api_nh->bh_type);
|
||||||
break;
|
break;
|
||||||
case NEXTHOP_TYPE_IPV4:
|
case NEXTHOP_TYPE_IPV4:
|
||||||
STREAM_GET(&api_nh->gate.ipv4.s_addr, s,
|
|
||||||
IPV4_MAX_BYTELEN);
|
|
||||||
break;
|
|
||||||
case NEXTHOP_TYPE_IPV4_IFINDEX:
|
case NEXTHOP_TYPE_IPV4_IFINDEX:
|
||||||
STREAM_GET(&api_nh->gate.ipv4.s_addr, s,
|
STREAM_GET(&api_nh->gate.ipv4.s_addr, s,
|
||||||
IPV4_MAX_BYTELEN);
|
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);
|
STREAM_GETL(s, api_nh->ifindex);
|
||||||
break;
|
break;
|
||||||
case NEXTHOP_TYPE_IPV6:
|
case NEXTHOP_TYPE_IPV6:
|
||||||
STREAM_GET(&api_nh->gate.ipv6, s, 16);
|
|
||||||
break;
|
|
||||||
case NEXTHOP_TYPE_IPV6_IFINDEX:
|
case NEXTHOP_TYPE_IPV6_IFINDEX:
|
||||||
STREAM_GET(&api_nh->gate.ipv6, s, 16);
|
STREAM_GET(&api_nh->gate.ipv6, s, 16);
|
||||||
STREAM_GETL(s, api_nh->ifindex);
|
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
|
interface r1-eth0
|
||||||
ip igmp
|
ip igmp
|
||||||
ip pim sm
|
ip pim
|
||||||
|
!
|
||||||
|
interface r1-eth1
|
||||||
|
ip pim
|
||||||
!
|
!
|
||||||
interface lo
|
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
|
interface r1-eth0
|
||||||
ip address 10.0.20.1/24
|
ip address 10.0.20.1/24
|
||||||
!
|
!
|
||||||
|
interface r1-eth1
|
||||||
|
ip address 10.0.30.1/24
|
||||||
|
!
|
||||||
interface lo
|
interface lo
|
||||||
ip address 10.254.0.1/32
|
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 os
|
||||||
import sys
|
import sys
|
||||||
import pytest
|
import pytest
|
||||||
|
import json
|
||||||
|
from functools import partial
|
||||||
|
|
||||||
CWD = os.path.dirname(os.path.realpath(__file__))
|
CWD = os.path.dirname(os.path.realpath(__file__))
|
||||||
sys.path.append(os.path.join(CWD, '../'))
|
sys.path.append(os.path.join(CWD, '../'))
|
||||||
@ -47,11 +49,27 @@ class PIMTopo(Topo):
|
|||||||
for routern in range(1, 3):
|
for routern in range(1, 3):
|
||||||
tgen.add_router('r{}'.format(routern))
|
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 <- sw1 -> r2
|
||||||
|
# r1-eth0 <-> r2-eth0
|
||||||
|
# 10.0.20.0/24
|
||||||
sw = tgen.add_switch('sw1')
|
sw = tgen.add_switch('sw1')
|
||||||
sw.add_link(tgen.gears['r1'])
|
sw.add_link(tgen.gears['r1'])
|
||||||
sw.add_link(tgen.gears['r2'])
|
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):
|
def setup_module(mod):
|
||||||
"Sets up the pytest environment"
|
"Sets up the pytest environment"
|
||||||
@ -68,9 +86,14 @@ def setup_module(mod):
|
|||||||
TopoRouter.RD_PIM,
|
TopoRouter.RD_PIM,
|
||||||
os.path.join(CWD, '{}/pimd.conf'.format(rname))
|
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.
|
# After loading the configurations, this function loads configured daemons.
|
||||||
tgen.start_router()
|
tgen.start_router()
|
||||||
|
#tgen.mininet_cli()
|
||||||
|
|
||||||
|
|
||||||
def teardown_module(mod):
|
def teardown_module(mod):
|
||||||
@ -80,6 +103,22 @@ def teardown_module(mod):
|
|||||||
# This function tears down the whole topology.
|
# This function tears down the whole topology.
|
||||||
tgen.stop_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():
|
def test_pim_send_mcast_stream():
|
||||||
"Establish a Multicast stream from r2 -> r1 and then ensure S,G is created as appropriate"
|
"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():
|
if tgen.routers_have_failure():
|
||||||
pytest.skip(tgen.errors)
|
pytest.skip(tgen.errors)
|
||||||
|
|
||||||
|
rp = tgen.gears['rp']
|
||||||
r2 = tgen.gears['r2']
|
r2 = tgen.gears['r2']
|
||||||
r1 = tgen.gears['r1']
|
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'
|
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():
|
def test_pim_igmp_report():
|
||||||
"Send a igmp report from r2->r1 and ensure that the *,G state is created on r1"
|
"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