Merge pull request #5707 from donaldsharp/nexthop_encoding

Nexthop encoding
This commit is contained in:
Donatas Abraitis 2020-01-18 23:25:56 +02:00 committed by GitHub
commit 9e1ecdbaa4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 112 additions and 13 deletions

View File

@ -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);

View File

@ -0,0 +1,3 @@
router bgp 65001
neighbor 10.0.30.3 remote-as external
redistribute connected

View File

@ -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

View File

@ -0,0 +1,9 @@
{
"10.254.0.3":[
{
"outboundInterface":"r1-eth1",
"group":"224.0.0.0\/4",
"source":"Static"
}
]
}

View File

@ -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
!

View File

@ -0,0 +1,3 @@
router bgp 65003
neighbor 10.0.30.1 remote-as external
redistribute connected

View File

@ -0,0 +1,9 @@
hostname rp
!
interface rp-eth0
ip pim
!
interface lo
ip pim
!
ip pim rp 10.254.0.3

View 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
}
}
}

View 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
!

View File

@ -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"