fib tests: IP multicast over GRE

Type: feature

Change-Id: I1632ff23b1bf6d91aa3406c95ebd6ef0aa595f35
Signed-off-by: Neale Ranns <nranns@cisco.com>
This commit is contained in:
Neale Ranns
2019-08-04 02:41:57 -07:00
committed by Andrew Yourtchenko
parent 8511687d59
commit adb17a813c
3 changed files with 77 additions and 1 deletions

View File

@ -515,6 +515,7 @@ adj_nbr_midchain_update_rewrite (adj_index_t adj_index,
*/ */
ASSERT((adj->lookup_next_index == IP_LOOKUP_NEXT_ARP) || ASSERT((adj->lookup_next_index == IP_LOOKUP_NEXT_ARP) ||
(adj->lookup_next_index == IP_LOOKUP_NEXT_GLEAN) || (adj->lookup_next_index == IP_LOOKUP_NEXT_GLEAN) ||
(adj->lookup_next_index == IP_LOOKUP_NEXT_MCAST) ||
(adj->lookup_next_index == IP_LOOKUP_NEXT_BCAST)); (adj->lookup_next_index == IP_LOOKUP_NEXT_BCAST));
adj_midchain_setup(adj_index, fixup, fixup_data, flags); adj_midchain_setup(adj_index, fixup, fixup_data, flags);

View File

@ -6,9 +6,10 @@ from framework import VppTestCase, VppTestRunner
from vpp_ip import DpoProto from vpp_ip import DpoProto
from vpp_ip_route import VppIpMRoute, VppMRoutePath, VppMFibSignal, \ from vpp_ip_route import VppIpMRoute, VppMRoutePath, VppMFibSignal, \
MRouteItfFlags, MRouteEntryFlags, VppIpTable, FibPathProto MRouteItfFlags, MRouteEntryFlags, VppIpTable, FibPathProto
from vpp_gre_interface import VppGreInterface
from scapy.packet import Raw from scapy.packet import Raw
from scapy.layers.l2 import Ether from scapy.layers.l2 import Ether, GRE
from scapy.layers.inet import IP, UDP, getmacbyip from scapy.layers.inet import IP, UDP, getmacbyip
from scapy.layers.inet6 import IPv6, getmacbyip6 from scapy.layers.inet6 import IPv6, getmacbyip6
@ -795,6 +796,79 @@ class TestIPMcast(VppTestCase):
self.verify_capture_ip4(self.pg1, tx) self.verify_capture_ip4(self.pg1, tx)
self.verify_capture_ip4(self.pg2, tx) self.verify_capture_ip4(self.pg2, tx)
def test_ip_mcast_gre(self):
""" IP Multicast Replication over GRE"""
gre_if_1 = VppGreInterface(
self,
self.pg1.local_ip4,
self.pg1.remote_ip4).add_vpp_config()
gre_if_2 = VppGreInterface(
self,
self.pg2.local_ip4,
self.pg2.remote_ip4).add_vpp_config()
gre_if_3 = VppGreInterface(
self,
self.pg3.local_ip4,
self.pg3.remote_ip4).add_vpp_config()
gre_if_1.admin_up()
gre_if_1.config_ip4()
gre_if_2.admin_up()
gre_if_2.config_ip4()
gre_if_3.admin_up()
gre_if_3.config_ip4()
#
# An (S,G).
# one accepting interface, pg0, 2 forwarding interfaces
#
route_1_1_1_1_232_1_1_1 = VppIpMRoute(
self,
"1.1.1.1",
"232.2.2.2", 64,
MRouteEntryFlags.MFIB_ENTRY_FLAG_NONE,
[VppMRoutePath(gre_if_1.sw_if_index,
MRouteItfFlags.MFIB_ITF_FLAG_ACCEPT),
VppMRoutePath(gre_if_2.sw_if_index,
MRouteItfFlags.MFIB_ITF_FLAG_FORWARD),
VppMRoutePath(gre_if_3.sw_if_index,
MRouteItfFlags.MFIB_ITF_FLAG_FORWARD)])
route_1_1_1_1_232_1_1_1.add_vpp_config()
#
# a stream that matches the route for (1.1.1.1,232.2.2.2)
# small packets
#
tx = (Ether(dst=self.pg1.local_mac,
src=self.pg1.remote_mac) /
IP(src=self.pg1.remote_ip4,
dst=self.pg1.local_ip4) /
GRE() /
IP(src="1.1.1.1", dst="232.2.2.2") /
UDP(sport=1234, dport=1234) /
Raw('\a5' * 64)) * 63
self.vapi.cli("clear trace")
self.pg1.add_stream(tx)
self.pg_enable_capture(self.pg_interfaces)
self.pg_start()
# We expect replications on Pg2 & 3
# check the encap headers are as expected based on the egress tunnel
rxs = self.pg2.get_capture(len(tx))
for rx in rxs:
self.assertEqual(rx[IP].src, gre_if_2.t_src)
self.assertEqual(rx[IP].dst, gre_if_2.t_dst)
self.assert_packet_checksums_valid(rx)
rxs = self.pg3.get_capture(len(tx))
for rx in rxs:
self.assertEqual(rx[IP].src, gre_if_3.t_src)
self.assertEqual(rx[IP].dst, gre_if_3.t_dst)
self.assert_packet_checksums_valid(rx)
def test_ip6_mcast_vrf(self): def test_ip6_mcast_vrf(self):
""" IPv6 Multicast Replication in non-default table""" """ IPv6 Multicast Replication in non-default table"""

View File

@ -31,6 +31,7 @@ class VppGreInterface(VppInterface):
self.set_sw_if_index(r.sw_if_index) self.set_sw_if_index(r.sw_if_index)
self.generate_remote_hosts() self.generate_remote_hosts()
self.test.registry.register(self, self.test.logger) self.test.registry.register(self, self.test.logger)
return self
def remove_vpp_config(self): def remove_vpp_config(self):
self.unconfig() self.unconfig()