2019-10-31 13:31:07 -05:00
|
|
|
#!/usr/bin/env python3
|
2016-11-15 09:46:51 +00:00
|
|
|
|
|
|
|
|
import unittest
|
|
|
|
|
|
2019-03-10 10:04:23 -07:00
|
|
|
import scapy.compat
|
2016-11-15 09:46:51 +00:00
|
|
|
from scapy.packet import Raw
|
2016-12-12 08:36:58 +01:00
|
|
|
from scapy.layers.l2 import Ether, Dot1Q, GRE
|
2016-11-15 09:46:51 +00:00
|
|
|
from scapy.layers.inet import IP, UDP
|
2016-12-18 15:49:54 +01:00
|
|
|
from scapy.layers.inet6 import IPv6
|
2016-11-15 09:46:51 +00:00
|
|
|
from scapy.volatile import RandMAC, RandIP
|
|
|
|
|
|
2021-01-29 13:17:19 +00:00
|
|
|
from framework import tag_fixme_vpp_workers
|
2019-02-28 09:00:09 -08:00
|
|
|
from framework import VppTestCase, VppTestRunner
|
2019-03-28 13:07:00 -07:00
|
|
|
from vpp_sub_interface import L2_VTR_OP, VppDot1QSubint
|
2019-04-16 07:15:35 +00:00
|
|
|
from vpp_gre_interface import VppGreInterface
|
2019-12-16 00:53:11 +00:00
|
|
|
from vpp_teib import VppTeib
|
2019-02-28 09:00:09 -08:00
|
|
|
from vpp_ip import DpoProto
|
2022-04-26 19:02:15 +02:00
|
|
|
from vpp_ip_route import (
|
|
|
|
|
VppIpRoute,
|
|
|
|
|
VppRoutePath,
|
|
|
|
|
VppIpTable,
|
|
|
|
|
FibPathProto,
|
|
|
|
|
VppMplsLabel,
|
|
|
|
|
)
|
2020-10-08 08:10:34 +00:00
|
|
|
from vpp_mpls_tunnel_interface import VppMPLSTunnelInterface
|
2016-12-12 08:36:58 +01:00
|
|
|
from util import ppp, ppc
|
2019-04-16 07:15:35 +00:00
|
|
|
from vpp_papi import VppEnum
|
2018-02-13 17:15:23 -05:00
|
|
|
|
|
|
|
|
|
2021-01-29 13:17:19 +00:00
|
|
|
@tag_fixme_vpp_workers
|
2019-05-24 08:25:03 +02:00
|
|
|
class TestGREInputNodes(VppTestCase):
|
2022-04-26 19:02:15 +02:00
|
|
|
"""GRE Input Nodes Test Case"""
|
2019-05-24 08:25:03 +02:00
|
|
|
|
|
|
|
|
def setUp(self):
|
|
|
|
|
super(TestGREInputNodes, self).setUp()
|
|
|
|
|
|
|
|
|
|
# create 3 pg interfaces - set one in a non-default table.
|
|
|
|
|
self.create_pg_interfaces(range(1))
|
|
|
|
|
|
|
|
|
|
for i in self.pg_interfaces:
|
|
|
|
|
i.admin_up()
|
|
|
|
|
i.config_ip4()
|
|
|
|
|
|
|
|
|
|
def tearDown(self):
|
|
|
|
|
for i in self.pg_interfaces:
|
|
|
|
|
i.unconfig_ip4()
|
|
|
|
|
i.admin_down()
|
|
|
|
|
super(TestGREInputNodes, self).tearDown()
|
|
|
|
|
|
|
|
|
|
def test_gre_input_node(self):
|
2022-04-26 19:02:15 +02:00
|
|
|
"""GRE gre input nodes not registerd unless configured"""
|
|
|
|
|
pkt = (
|
|
|
|
|
Ether(dst=self.pg0.local_mac, src=self.pg0.remote_mac)
|
|
|
|
|
/ IP(src=self.pg0.remote_ip4, dst=self.pg0.local_ip4)
|
|
|
|
|
/ GRE()
|
|
|
|
|
)
|
2019-05-24 08:25:03 +02:00
|
|
|
|
|
|
|
|
self.pg0.add_stream(pkt)
|
|
|
|
|
self.pg_start()
|
|
|
|
|
# no tunnel created, gre-input not registered
|
2022-08-09 03:03:29 +00:00
|
|
|
err = self.statistics.get_counter("/err/ip4-local/unknown_protocol")[0]
|
2019-05-24 08:25:03 +02:00
|
|
|
self.assertEqual(err, 1)
|
|
|
|
|
err_count = err
|
|
|
|
|
|
|
|
|
|
# create gre tunnel
|
|
|
|
|
gre_if = VppGreInterface(self, self.pg0.local_ip4, "1.1.1.2")
|
|
|
|
|
gre_if.add_vpp_config()
|
|
|
|
|
|
|
|
|
|
self.pg0.add_stream(pkt)
|
|
|
|
|
self.pg_start()
|
|
|
|
|
# tunnel created, gre-input registered
|
2022-08-09 03:03:29 +00:00
|
|
|
err = self.statistics.get_counter("/err/ip4-local/unknown_protocol")[0]
|
2019-05-24 08:25:03 +02:00
|
|
|
# expect no new errors
|
|
|
|
|
self.assertEqual(err, err_count)
|
|
|
|
|
|
|
|
|
|
|
2016-11-15 09:46:51 +00:00
|
|
|
class TestGRE(VppTestCase):
|
2022-04-26 19:02:15 +02:00
|
|
|
"""GRE Test Case"""
|
2016-11-15 09:46:51 +00:00
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
def setUpClass(cls):
|
|
|
|
|
super(TestGRE, cls).setUpClass()
|
|
|
|
|
|
2019-03-12 19:23:27 -07:00
|
|
|
@classmethod
|
|
|
|
|
def tearDownClass(cls):
|
|
|
|
|
super(TestGRE, cls).tearDownClass()
|
|
|
|
|
|
2016-11-15 09:46:51 +00:00
|
|
|
def setUp(self):
|
|
|
|
|
super(TestGRE, self).setUp()
|
|
|
|
|
|
2016-09-30 15:47:03 +01:00
|
|
|
# create 3 pg interfaces - set one in a non-default table.
|
2019-04-18 10:23:56 +00:00
|
|
|
self.create_pg_interfaces(range(5))
|
2017-09-10 04:39:11 -07:00
|
|
|
|
|
|
|
|
self.tbl = VppIpTable(self, 1)
|
|
|
|
|
self.tbl.add_vpp_config()
|
2016-11-15 09:46:51 +00:00
|
|
|
self.pg1.set_table_ip4(1)
|
2016-09-30 15:47:03 +01:00
|
|
|
|
2016-11-15 09:46:51 +00:00
|
|
|
for i in self.pg_interfaces:
|
|
|
|
|
i.admin_up()
|
2016-09-30 15:47:03 +01:00
|
|
|
|
|
|
|
|
self.pg0.config_ip4()
|
|
|
|
|
self.pg0.resolve_arp()
|
|
|
|
|
self.pg1.config_ip4()
|
|
|
|
|
self.pg1.resolve_arp()
|
|
|
|
|
self.pg2.config_ip6()
|
|
|
|
|
self.pg2.resolve_ndp()
|
2019-04-18 10:23:56 +00:00
|
|
|
self.pg3.config_ip4()
|
|
|
|
|
self.pg3.resolve_arp()
|
|
|
|
|
self.pg4.config_ip4()
|
|
|
|
|
self.pg4.resolve_arp()
|
2016-11-15 09:46:51 +00:00
|
|
|
|
|
|
|
|
def tearDown(self):
|
2017-02-13 23:20:04 -08:00
|
|
|
for i in self.pg_interfaces:
|
|
|
|
|
i.unconfig_ip4()
|
|
|
|
|
i.unconfig_ip6()
|
|
|
|
|
i.admin_down()
|
2017-09-10 04:39:11 -07:00
|
|
|
self.pg1.set_table_ip4(0)
|
|
|
|
|
super(TestGRE, self).tearDown()
|
2016-11-15 09:46:51 +00:00
|
|
|
|
2019-12-31 05:13:14 +00:00
|
|
|
def create_stream_ip4(self, src_if, src_ip, dst_ip, dscp=0, ecn=0):
|
2016-11-15 09:46:51 +00:00
|
|
|
pkts = []
|
2019-12-31 05:13:14 +00:00
|
|
|
tos = (dscp << 2) | ecn
|
2016-11-15 09:46:51 +00:00
|
|
|
for i in range(0, 257):
|
2016-12-21 08:50:14 +01:00
|
|
|
info = self.create_packet_info(src_if, src_if)
|
2016-11-15 09:46:51 +00:00
|
|
|
payload = self.info_to_payload(info)
|
2022-04-26 19:02:15 +02:00
|
|
|
p = (
|
|
|
|
|
Ether(dst=src_if.local_mac, src=src_if.remote_mac)
|
|
|
|
|
/ IP(src=src_ip, dst=dst_ip, tos=tos)
|
|
|
|
|
/ UDP(sport=1234, dport=1234)
|
|
|
|
|
/ Raw(payload)
|
|
|
|
|
)
|
2016-11-15 09:46:51 +00:00
|
|
|
info.data = p.copy()
|
|
|
|
|
pkts.append(p)
|
|
|
|
|
return pkts
|
|
|
|
|
|
2019-12-31 05:13:14 +00:00
|
|
|
def create_stream_ip6(self, src_if, src_ip, dst_ip, dscp=0, ecn=0):
|
2016-09-30 15:47:03 +01:00
|
|
|
pkts = []
|
2019-12-31 05:13:14 +00:00
|
|
|
tc = (dscp << 2) | ecn
|
2016-09-30 15:47:03 +01:00
|
|
|
for i in range(0, 257):
|
|
|
|
|
info = self.create_packet_info(src_if, src_if)
|
|
|
|
|
payload = self.info_to_payload(info)
|
2022-04-26 19:02:15 +02:00
|
|
|
p = (
|
|
|
|
|
Ether(dst=src_if.local_mac, src=src_if.remote_mac)
|
|
|
|
|
/ IPv6(src=src_ip, dst=dst_ip, tc=tc)
|
|
|
|
|
/ UDP(sport=1234, dport=1234)
|
|
|
|
|
/ Raw(payload)
|
|
|
|
|
)
|
2016-09-30 15:47:03 +01:00
|
|
|
info.data = p.copy()
|
|
|
|
|
pkts.append(p)
|
|
|
|
|
return pkts
|
|
|
|
|
|
2022-04-26 19:02:15 +02:00
|
|
|
def create_tunnel_stream_4o4(self, src_if, tunnel_src, tunnel_dst, src_ip, dst_ip):
|
2016-11-15 09:46:51 +00:00
|
|
|
pkts = []
|
|
|
|
|
for i in range(0, 257):
|
2016-12-21 08:50:14 +01:00
|
|
|
info = self.create_packet_info(src_if, src_if)
|
2016-11-15 09:46:51 +00:00
|
|
|
payload = self.info_to_payload(info)
|
2022-04-26 19:02:15 +02:00
|
|
|
p = (
|
|
|
|
|
Ether(dst=src_if.local_mac, src=src_if.remote_mac)
|
|
|
|
|
/ IP(src=tunnel_src, dst=tunnel_dst)
|
|
|
|
|
/ GRE()
|
|
|
|
|
/ IP(src=src_ip, dst=dst_ip)
|
|
|
|
|
/ UDP(sport=1234, dport=1234)
|
|
|
|
|
/ Raw(payload)
|
|
|
|
|
)
|
2016-11-15 09:46:51 +00:00
|
|
|
info.data = p.copy()
|
|
|
|
|
pkts.append(p)
|
|
|
|
|
return pkts
|
|
|
|
|
|
2022-04-26 19:02:15 +02:00
|
|
|
def create_tunnel_stream_6o4(self, src_if, tunnel_src, tunnel_dst, src_ip, dst_ip):
|
2016-11-15 09:46:51 +00:00
|
|
|
pkts = []
|
|
|
|
|
for i in range(0, 257):
|
2016-12-21 08:50:14 +01:00
|
|
|
info = self.create_packet_info(src_if, src_if)
|
2016-11-15 09:46:51 +00:00
|
|
|
payload = self.info_to_payload(info)
|
2022-04-26 19:02:15 +02:00
|
|
|
p = (
|
|
|
|
|
Ether(dst=src_if.local_mac, src=src_if.remote_mac)
|
|
|
|
|
/ IP(src=tunnel_src, dst=tunnel_dst)
|
|
|
|
|
/ GRE()
|
|
|
|
|
/ IPv6(src=src_ip, dst=dst_ip)
|
|
|
|
|
/ UDP(sport=1234, dport=1234)
|
|
|
|
|
/ Raw(payload)
|
|
|
|
|
)
|
2016-11-15 09:46:51 +00:00
|
|
|
info.data = p.copy()
|
|
|
|
|
pkts.append(p)
|
|
|
|
|
return pkts
|
|
|
|
|
|
2022-04-26 19:02:15 +02:00
|
|
|
def create_tunnel_stream_6o6(self, src_if, tunnel_src, tunnel_dst, src_ip, dst_ip):
|
2016-09-30 15:47:03 +01:00
|
|
|
pkts = []
|
|
|
|
|
for i in range(0, 257):
|
|
|
|
|
info = self.create_packet_info(src_if, src_if)
|
|
|
|
|
payload = self.info_to_payload(info)
|
2022-04-26 19:02:15 +02:00
|
|
|
p = (
|
|
|
|
|
Ether(dst=src_if.local_mac, src=src_if.remote_mac)
|
|
|
|
|
/ IPv6(src=tunnel_src, dst=tunnel_dst)
|
|
|
|
|
/ GRE()
|
|
|
|
|
/ IPv6(src=src_ip, dst=dst_ip)
|
|
|
|
|
/ UDP(sport=1234, dport=1234)
|
|
|
|
|
/ Raw(payload)
|
|
|
|
|
)
|
2016-09-30 15:47:03 +01:00
|
|
|
info.data = p.copy()
|
|
|
|
|
pkts.append(p)
|
|
|
|
|
return pkts
|
|
|
|
|
|
2022-04-26 19:02:15 +02:00
|
|
|
def create_tunnel_stream_l2o4(self, src_if, tunnel_src, tunnel_dst):
|
2016-11-15 09:46:51 +00:00
|
|
|
pkts = []
|
|
|
|
|
for i in range(0, 257):
|
2016-12-21 08:50:14 +01:00
|
|
|
info = self.create_packet_info(src_if, src_if)
|
2016-11-15 09:46:51 +00:00
|
|
|
payload = self.info_to_payload(info)
|
2022-04-26 19:02:15 +02:00
|
|
|
p = (
|
|
|
|
|
Ether(dst=src_if.local_mac, src=src_if.remote_mac)
|
|
|
|
|
/ IP(src=tunnel_src, dst=tunnel_dst)
|
|
|
|
|
/ GRE()
|
|
|
|
|
/ Ether(dst=RandMAC("*:*:*:*:*:*"), src=RandMAC("*:*:*:*:*:*"))
|
|
|
|
|
/ IP(src=scapy.compat.raw(RandIP()), dst=scapy.compat.raw(RandIP()))
|
|
|
|
|
/ UDP(sport=1234, dport=1234)
|
|
|
|
|
/ Raw(payload)
|
|
|
|
|
)
|
2016-11-15 09:46:51 +00:00
|
|
|
info.data = p.copy()
|
|
|
|
|
pkts.append(p)
|
|
|
|
|
return pkts
|
|
|
|
|
|
2022-04-26 19:02:15 +02:00
|
|
|
def create_tunnel_stream_vlano4(self, src_if, tunnel_src, tunnel_dst, vlan):
|
2016-11-15 09:46:51 +00:00
|
|
|
pkts = []
|
|
|
|
|
for i in range(0, 257):
|
2016-12-21 08:50:14 +01:00
|
|
|
info = self.create_packet_info(src_if, src_if)
|
2016-11-15 09:46:51 +00:00
|
|
|
payload = self.info_to_payload(info)
|
2022-04-26 19:02:15 +02:00
|
|
|
p = (
|
|
|
|
|
Ether(dst=src_if.local_mac, src=src_if.remote_mac)
|
|
|
|
|
/ IP(src=tunnel_src, dst=tunnel_dst)
|
|
|
|
|
/ GRE()
|
|
|
|
|
/ Ether(dst=RandMAC("*:*:*:*:*:*"), src=RandMAC("*:*:*:*:*:*"))
|
|
|
|
|
/ Dot1Q(vlan=vlan)
|
|
|
|
|
/ IP(src=scapy.compat.raw(RandIP()), dst=scapy.compat.raw(RandIP()))
|
|
|
|
|
/ UDP(sport=1234, dport=1234)
|
|
|
|
|
/ Raw(payload)
|
|
|
|
|
)
|
2016-11-15 09:46:51 +00:00
|
|
|
info.data = p.copy()
|
|
|
|
|
pkts.append(p)
|
|
|
|
|
return pkts
|
|
|
|
|
|
2022-04-26 19:02:15 +02:00
|
|
|
def verify_tunneled_4o4(
|
|
|
|
|
self, src_if, capture, sent, tunnel_src, tunnel_dst, dscp=0, ecn=0
|
|
|
|
|
):
|
2016-11-15 09:46:51 +00:00
|
|
|
self.assertEqual(len(capture), len(sent))
|
2019-12-31 05:13:14 +00:00
|
|
|
tos = (dscp << 2) | ecn
|
2016-11-15 09:46:51 +00:00
|
|
|
|
|
|
|
|
for i in range(len(capture)):
|
|
|
|
|
try:
|
|
|
|
|
tx = sent[i]
|
|
|
|
|
rx = capture[i]
|
|
|
|
|
|
|
|
|
|
tx_ip = tx[IP]
|
|
|
|
|
rx_ip = rx[IP]
|
|
|
|
|
|
|
|
|
|
self.assertEqual(rx_ip.src, tunnel_src)
|
|
|
|
|
self.assertEqual(rx_ip.dst, tunnel_dst)
|
2019-12-31 05:13:14 +00:00
|
|
|
self.assertEqual(rx_ip.tos, tos)
|
2020-07-16 11:01:01 +02:00
|
|
|
self.assertEqual(rx_ip.len, len(rx_ip))
|
2016-11-15 09:46:51 +00:00
|
|
|
|
|
|
|
|
rx_gre = rx[GRE]
|
|
|
|
|
rx_ip = rx_gre[IP]
|
|
|
|
|
|
|
|
|
|
self.assertEqual(rx_ip.src, tx_ip.src)
|
|
|
|
|
self.assertEqual(rx_ip.dst, tx_ip.dst)
|
|
|
|
|
# IP processing post pop has decremented the TTL
|
|
|
|
|
self.assertEqual(rx_ip.ttl + 1, tx_ip.ttl)
|
|
|
|
|
|
|
|
|
|
except:
|
2016-12-12 08:36:58 +01:00
|
|
|
self.logger.error(ppp("Rx:", rx))
|
|
|
|
|
self.logger.error(ppp("Tx:", tx))
|
2016-11-15 09:46:51 +00:00
|
|
|
raise
|
|
|
|
|
|
2022-04-26 19:02:15 +02:00
|
|
|
def verify_tunneled_6o6(
|
|
|
|
|
self, src_if, capture, sent, tunnel_src, tunnel_dst, dscp=0, ecn=0
|
|
|
|
|
):
|
2016-09-30 15:47:03 +01:00
|
|
|
self.assertEqual(len(capture), len(sent))
|
2019-12-31 05:13:14 +00:00
|
|
|
tc = (dscp << 2) | ecn
|
2016-09-30 15:47:03 +01:00
|
|
|
|
|
|
|
|
for i in range(len(capture)):
|
|
|
|
|
try:
|
|
|
|
|
tx = sent[i]
|
|
|
|
|
rx = capture[i]
|
|
|
|
|
|
|
|
|
|
tx_ip = tx[IPv6]
|
|
|
|
|
rx_ip = rx[IPv6]
|
|
|
|
|
|
|
|
|
|
self.assertEqual(rx_ip.src, tunnel_src)
|
|
|
|
|
self.assertEqual(rx_ip.dst, tunnel_dst)
|
2019-12-31 05:13:14 +00:00
|
|
|
self.assertEqual(rx_ip.tc, tc)
|
2016-09-30 15:47:03 +01:00
|
|
|
|
2019-03-10 10:04:23 -07:00
|
|
|
rx_gre = GRE(scapy.compat.raw(rx_ip[IPv6].payload))
|
2020-07-16 11:01:01 +02:00
|
|
|
|
|
|
|
|
self.assertEqual(rx_ip.plen, len(rx_gre))
|
|
|
|
|
|
2016-09-30 15:47:03 +01:00
|
|
|
rx_ip = rx_gre[IPv6]
|
|
|
|
|
|
|
|
|
|
self.assertEqual(rx_ip.src, tx_ip.src)
|
|
|
|
|
self.assertEqual(rx_ip.dst, tx_ip.dst)
|
|
|
|
|
|
|
|
|
|
except:
|
|
|
|
|
self.logger.error(ppp("Rx:", rx))
|
|
|
|
|
self.logger.error(ppp("Tx:", tx))
|
|
|
|
|
raise
|
|
|
|
|
|
2022-04-26 19:02:15 +02:00
|
|
|
def verify_tunneled_4o6(self, src_if, capture, sent, tunnel_src, tunnel_dst):
|
2018-09-19 04:55:32 -07:00
|
|
|
self.assertEqual(len(capture), len(sent))
|
|
|
|
|
|
|
|
|
|
for i in range(len(capture)):
|
|
|
|
|
try:
|
|
|
|
|
tx = sent[i]
|
|
|
|
|
rx = capture[i]
|
|
|
|
|
|
|
|
|
|
rx_ip = rx[IPv6]
|
|
|
|
|
|
|
|
|
|
self.assertEqual(rx_ip.src, tunnel_src)
|
|
|
|
|
self.assertEqual(rx_ip.dst, tunnel_dst)
|
|
|
|
|
|
2019-03-10 10:04:23 -07:00
|
|
|
rx_gre = GRE(scapy.compat.raw(rx_ip[IPv6].payload))
|
2020-07-16 11:01:01 +02:00
|
|
|
|
|
|
|
|
self.assertEqual(rx_ip.plen, len(rx_gre))
|
|
|
|
|
|
2018-09-19 04:55:32 -07:00
|
|
|
tx_ip = tx[IP]
|
|
|
|
|
rx_ip = rx_gre[IP]
|
|
|
|
|
|
|
|
|
|
self.assertEqual(rx_ip.src, tx_ip.src)
|
|
|
|
|
self.assertEqual(rx_ip.dst, tx_ip.dst)
|
|
|
|
|
|
|
|
|
|
except:
|
|
|
|
|
self.logger.error(ppp("Rx:", rx))
|
|
|
|
|
self.logger.error(ppp("Tx:", tx))
|
|
|
|
|
raise
|
|
|
|
|
|
2022-04-26 19:02:15 +02:00
|
|
|
def verify_tunneled_6o4(self, src_if, capture, sent, tunnel_src, tunnel_dst):
|
2018-09-19 04:55:32 -07:00
|
|
|
self.assertEqual(len(capture), len(sent))
|
|
|
|
|
|
|
|
|
|
for i in range(len(capture)):
|
|
|
|
|
try:
|
|
|
|
|
tx = sent[i]
|
|
|
|
|
rx = capture[i]
|
|
|
|
|
|
|
|
|
|
rx_ip = rx[IP]
|
|
|
|
|
|
|
|
|
|
self.assertEqual(rx_ip.src, tunnel_src)
|
|
|
|
|
self.assertEqual(rx_ip.dst, tunnel_dst)
|
2020-07-16 11:01:01 +02:00
|
|
|
self.assertEqual(rx_ip.len, len(rx_ip))
|
2018-09-19 04:55:32 -07:00
|
|
|
|
2019-03-10 10:04:23 -07:00
|
|
|
rx_gre = GRE(scapy.compat.raw(rx_ip[IP].payload))
|
2018-09-19 04:55:32 -07:00
|
|
|
rx_ip = rx_gre[IPv6]
|
|
|
|
|
tx_ip = tx[IPv6]
|
|
|
|
|
|
|
|
|
|
self.assertEqual(rx_ip.src, tx_ip.src)
|
|
|
|
|
self.assertEqual(rx_ip.dst, tx_ip.dst)
|
|
|
|
|
|
|
|
|
|
except:
|
|
|
|
|
self.logger.error(ppp("Rx:", rx))
|
|
|
|
|
self.logger.error(ppp("Tx:", tx))
|
|
|
|
|
raise
|
|
|
|
|
|
2022-04-26 19:02:15 +02:00
|
|
|
def verify_tunneled_l2o4(self, src_if, capture, sent, tunnel_src, tunnel_dst):
|
2016-11-15 09:46:51 +00:00
|
|
|
self.assertEqual(len(capture), len(sent))
|
|
|
|
|
|
|
|
|
|
for i in range(len(capture)):
|
|
|
|
|
try:
|
|
|
|
|
tx = sent[i]
|
|
|
|
|
rx = capture[i]
|
|
|
|
|
|
|
|
|
|
tx_ip = tx[IP]
|
|
|
|
|
rx_ip = rx[IP]
|
|
|
|
|
|
|
|
|
|
self.assertEqual(rx_ip.src, tunnel_src)
|
|
|
|
|
self.assertEqual(rx_ip.dst, tunnel_dst)
|
2020-07-16 11:01:01 +02:00
|
|
|
self.assertEqual(rx_ip.len, len(rx_ip))
|
2016-11-15 09:46:51 +00:00
|
|
|
|
|
|
|
|
rx_gre = rx[GRE]
|
|
|
|
|
rx_l2 = rx_gre[Ether]
|
|
|
|
|
rx_ip = rx_l2[IP]
|
|
|
|
|
tx_gre = tx[GRE]
|
|
|
|
|
tx_l2 = tx_gre[Ether]
|
|
|
|
|
tx_ip = tx_l2[IP]
|
|
|
|
|
|
|
|
|
|
self.assertEqual(rx_ip.src, tx_ip.src)
|
|
|
|
|
self.assertEqual(rx_ip.dst, tx_ip.dst)
|
|
|
|
|
# bridged, not L3 forwarded, so no TTL decrement
|
|
|
|
|
self.assertEqual(rx_ip.ttl, tx_ip.ttl)
|
|
|
|
|
|
|
|
|
|
except:
|
2016-12-12 08:36:58 +01:00
|
|
|
self.logger.error(ppp("Rx:", rx))
|
|
|
|
|
self.logger.error(ppp("Tx:", tx))
|
2016-11-15 09:46:51 +00:00
|
|
|
raise
|
|
|
|
|
|
2022-04-26 19:02:15 +02:00
|
|
|
def verify_tunneled_vlano4(
|
|
|
|
|
self, src_if, capture, sent, tunnel_src, tunnel_dst, vlan
|
|
|
|
|
):
|
2016-11-15 09:46:51 +00:00
|
|
|
try:
|
|
|
|
|
self.assertEqual(len(capture), len(sent))
|
|
|
|
|
except:
|
2016-12-12 08:36:58 +01:00
|
|
|
ppc("Unexpected packets captured:", capture)
|
2016-11-15 09:46:51 +00:00
|
|
|
raise
|
|
|
|
|
|
|
|
|
|
for i in range(len(capture)):
|
|
|
|
|
try:
|
|
|
|
|
tx = sent[i]
|
|
|
|
|
rx = capture[i]
|
|
|
|
|
|
|
|
|
|
tx_ip = tx[IP]
|
|
|
|
|
rx_ip = rx[IP]
|
|
|
|
|
|
|
|
|
|
self.assertEqual(rx_ip.src, tunnel_src)
|
|
|
|
|
self.assertEqual(rx_ip.dst, tunnel_dst)
|
|
|
|
|
|
|
|
|
|
rx_gre = rx[GRE]
|
|
|
|
|
rx_l2 = rx_gre[Ether]
|
|
|
|
|
rx_vlan = rx_l2[Dot1Q]
|
|
|
|
|
rx_ip = rx_l2[IP]
|
|
|
|
|
|
|
|
|
|
self.assertEqual(rx_vlan.vlan, vlan)
|
|
|
|
|
|
|
|
|
|
tx_gre = tx[GRE]
|
|
|
|
|
tx_l2 = tx_gre[Ether]
|
|
|
|
|
tx_ip = tx_l2[IP]
|
|
|
|
|
|
|
|
|
|
self.assertEqual(rx_ip.src, tx_ip.src)
|
|
|
|
|
self.assertEqual(rx_ip.dst, tx_ip.dst)
|
|
|
|
|
# bridged, not L3 forwarded, so no TTL decrement
|
|
|
|
|
self.assertEqual(rx_ip.ttl, tx_ip.ttl)
|
|
|
|
|
|
|
|
|
|
except:
|
2016-12-12 08:36:58 +01:00
|
|
|
self.logger.error(ppp("Rx:", rx))
|
|
|
|
|
self.logger.error(ppp("Tx:", tx))
|
2016-11-15 09:46:51 +00:00
|
|
|
raise
|
|
|
|
|
|
|
|
|
|
def verify_decapped_4o4(self, src_if, capture, sent):
|
|
|
|
|
self.assertEqual(len(capture), len(sent))
|
|
|
|
|
|
|
|
|
|
for i in range(len(capture)):
|
|
|
|
|
try:
|
|
|
|
|
tx = sent[i]
|
|
|
|
|
rx = capture[i]
|
|
|
|
|
|
|
|
|
|
tx_ip = tx[IP]
|
|
|
|
|
rx_ip = rx[IP]
|
|
|
|
|
tx_gre = tx[GRE]
|
|
|
|
|
tx_ip = tx_gre[IP]
|
|
|
|
|
|
|
|
|
|
self.assertEqual(rx_ip.src, tx_ip.src)
|
|
|
|
|
self.assertEqual(rx_ip.dst, tx_ip.dst)
|
|
|
|
|
# IP processing post pop has decremented the TTL
|
|
|
|
|
self.assertEqual(rx_ip.ttl + 1, tx_ip.ttl)
|
|
|
|
|
|
|
|
|
|
except:
|
2016-12-12 08:36:58 +01:00
|
|
|
self.logger.error(ppp("Rx:", rx))
|
|
|
|
|
self.logger.error(ppp("Tx:", tx))
|
2016-11-15 09:46:51 +00:00
|
|
|
raise
|
|
|
|
|
|
|
|
|
|
def verify_decapped_6o4(self, src_if, capture, sent):
|
|
|
|
|
self.assertEqual(len(capture), len(sent))
|
|
|
|
|
|
|
|
|
|
for i in range(len(capture)):
|
|
|
|
|
try:
|
|
|
|
|
tx = sent[i]
|
|
|
|
|
rx = capture[i]
|
|
|
|
|
|
|
|
|
|
tx_ip = tx[IP]
|
|
|
|
|
rx_ip = rx[IPv6]
|
|
|
|
|
tx_gre = tx[GRE]
|
|
|
|
|
tx_ip = tx_gre[IPv6]
|
|
|
|
|
|
|
|
|
|
self.assertEqual(rx_ip.src, tx_ip.src)
|
|
|
|
|
self.assertEqual(rx_ip.dst, tx_ip.dst)
|
|
|
|
|
self.assertEqual(rx_ip.hlim + 1, tx_ip.hlim)
|
|
|
|
|
|
|
|
|
|
except:
|
2016-12-12 08:36:58 +01:00
|
|
|
self.logger.error(ppp("Rx:", rx))
|
|
|
|
|
self.logger.error(ppp("Tx:", tx))
|
2016-11-15 09:46:51 +00:00
|
|
|
raise
|
|
|
|
|
|
2019-12-17 20:15:03 +00:00
|
|
|
def verify_decapped_6o6(self, src_if, capture, sent):
|
|
|
|
|
self.assertEqual(len(capture), len(sent))
|
|
|
|
|
|
|
|
|
|
for i in range(len(capture)):
|
|
|
|
|
try:
|
|
|
|
|
tx = sent[i]
|
|
|
|
|
rx = capture[i]
|
|
|
|
|
|
|
|
|
|
tx_ip = tx[IPv6]
|
|
|
|
|
rx_ip = rx[IPv6]
|
|
|
|
|
tx_gre = tx[GRE]
|
|
|
|
|
tx_ip = tx_gre[IPv6]
|
|
|
|
|
|
|
|
|
|
self.assertEqual(rx_ip.src, tx_ip.src)
|
|
|
|
|
self.assertEqual(rx_ip.dst, tx_ip.dst)
|
|
|
|
|
self.assertEqual(rx_ip.hlim + 1, tx_ip.hlim)
|
|
|
|
|
|
|
|
|
|
except:
|
|
|
|
|
self.logger.error(ppp("Rx:", rx))
|
|
|
|
|
self.logger.error(ppp("Tx:", tx))
|
|
|
|
|
raise
|
|
|
|
|
|
2016-11-15 09:46:51 +00:00
|
|
|
def test_gre(self):
|
2022-04-26 19:02:15 +02:00
|
|
|
"""GRE IPv4 tunnel Tests"""
|
2016-11-15 09:46:51 +00:00
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# Create an L3 GRE tunnel.
|
|
|
|
|
# - set it admin up
|
|
|
|
|
# - assign an IP Addres
|
|
|
|
|
# - Add a route via the tunnel
|
|
|
|
|
#
|
2022-04-26 19:02:15 +02:00
|
|
|
gre_if = VppGreInterface(self, self.pg0.local_ip4, "1.1.1.2")
|
2016-11-15 09:46:51 +00:00
|
|
|
gre_if.add_vpp_config()
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# The double create (create the same tunnel twice) should fail,
|
|
|
|
|
# and we should still be able to use the original
|
|
|
|
|
#
|
|
|
|
|
try:
|
|
|
|
|
gre_if.add_vpp_config()
|
|
|
|
|
except Exception:
|
|
|
|
|
pass
|
|
|
|
|
else:
|
|
|
|
|
self.fail("Double GRE tunnel add does not fail")
|
|
|
|
|
|
|
|
|
|
gre_if.admin_up()
|
|
|
|
|
gre_if.config_ip4()
|
|
|
|
|
|
2022-04-26 19:02:15 +02:00
|
|
|
route_via_tun = VppIpRoute(
|
|
|
|
|
self, "4.4.4.4", 32, [VppRoutePath("0.0.0.0", gre_if.sw_if_index)]
|
|
|
|
|
)
|
2016-11-15 09:46:51 +00:00
|
|
|
|
|
|
|
|
route_via_tun.add_vpp_config()
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# Send a packet stream that is routed into the tunnel
|
2019-04-08 03:22:21 -05:00
|
|
|
# - they are all dropped since the tunnel's destintation IP
|
2016-11-15 09:46:51 +00:00
|
|
|
# is unresolved - or resolves via the default route - which
|
|
|
|
|
# which is a drop.
|
|
|
|
|
#
|
|
|
|
|
tx = self.create_stream_ip4(self.pg0, "5.5.5.5", "4.4.4.4")
|
|
|
|
|
|
2018-11-29 08:48:37 +00:00
|
|
|
self.send_and_assert_no_replies(self.pg0, tx)
|
2016-11-15 09:46:51 +00:00
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# Add a route that resolves the tunnel's destination
|
|
|
|
|
#
|
2022-04-26 19:02:15 +02:00
|
|
|
route_tun_dst = VppIpRoute(
|
|
|
|
|
self,
|
|
|
|
|
"1.1.1.2",
|
|
|
|
|
32,
|
|
|
|
|
[VppRoutePath(self.pg0.remote_ip4, self.pg0.sw_if_index)],
|
|
|
|
|
)
|
2016-11-15 09:46:51 +00:00
|
|
|
route_tun_dst.add_vpp_config()
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# Send a packet stream that is routed into the tunnel
|
|
|
|
|
# - packets are GRE encapped
|
|
|
|
|
#
|
|
|
|
|
tx = self.create_stream_ip4(self.pg0, "5.5.5.5", "4.4.4.4")
|
2018-11-29 08:48:37 +00:00
|
|
|
rx = self.send_and_expect(self.pg0, tx, self.pg0)
|
2022-04-26 19:02:15 +02:00
|
|
|
self.verify_tunneled_4o4(self.pg0, rx, tx, self.pg0.local_ip4, "1.1.1.2")
|
2016-11-15 09:46:51 +00:00
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# Send tunneled packets that match the created tunnel and
|
|
|
|
|
# are decapped and forwarded
|
|
|
|
|
#
|
2022-04-26 19:02:15 +02:00
|
|
|
tx = self.create_tunnel_stream_4o4(
|
|
|
|
|
self.pg0,
|
|
|
|
|
"1.1.1.2",
|
|
|
|
|
self.pg0.local_ip4,
|
|
|
|
|
self.pg0.local_ip4,
|
|
|
|
|
self.pg0.remote_ip4,
|
|
|
|
|
)
|
2018-11-29 08:48:37 +00:00
|
|
|
rx = self.send_and_expect(self.pg0, tx, self.pg0)
|
2016-11-15 09:46:51 +00:00
|
|
|
self.verify_decapped_4o4(self.pg0, rx, tx)
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# Send tunneled packets that do not match the tunnel's src
|
|
|
|
|
#
|
|
|
|
|
self.vapi.cli("clear trace")
|
2022-04-26 19:02:15 +02:00
|
|
|
tx = self.create_tunnel_stream_4o4(
|
|
|
|
|
self.pg0,
|
|
|
|
|
"1.1.1.3",
|
|
|
|
|
self.pg0.local_ip4,
|
|
|
|
|
self.pg0.local_ip4,
|
|
|
|
|
self.pg0.remote_ip4,
|
|
|
|
|
)
|
2018-11-29 08:48:37 +00:00
|
|
|
self.send_and_assert_no_replies(
|
2022-04-26 19:02:15 +02:00
|
|
|
self.pg0, tx, remark="GRE packets forwarded despite no SRC address match"
|
|
|
|
|
)
|
2016-11-15 09:46:51 +00:00
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# Configure IPv6 on the PG interface so we can route IPv6
|
|
|
|
|
# packets
|
|
|
|
|
#
|
|
|
|
|
self.pg0.config_ip6()
|
|
|
|
|
self.pg0.resolve_ndp()
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# Send IPv6 tunnel encapslated packets
|
|
|
|
|
# - dropped since IPv6 is not enabled on the tunnel
|
|
|
|
|
#
|
2022-04-26 19:02:15 +02:00
|
|
|
tx = self.create_tunnel_stream_6o4(
|
|
|
|
|
self.pg0,
|
|
|
|
|
"1.1.1.2",
|
|
|
|
|
self.pg0.local_ip4,
|
|
|
|
|
self.pg0.local_ip6,
|
|
|
|
|
self.pg0.remote_ip6,
|
|
|
|
|
)
|
|
|
|
|
self.send_and_assert_no_replies(
|
|
|
|
|
self.pg0,
|
|
|
|
|
tx,
|
|
|
|
|
"IPv6 GRE packets forwarded despite IPv6 not enabled on tunnel",
|
|
|
|
|
)
|
2016-11-15 09:46:51 +00:00
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# Enable IPv6 on the tunnel
|
|
|
|
|
#
|
|
|
|
|
gre_if.config_ip6()
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# Send IPv6 tunnel encapslated packets
|
|
|
|
|
# - forwarded since IPv6 is enabled on the tunnel
|
|
|
|
|
#
|
2022-04-26 19:02:15 +02:00
|
|
|
tx = self.create_tunnel_stream_6o4(
|
|
|
|
|
self.pg0,
|
|
|
|
|
"1.1.1.2",
|
|
|
|
|
self.pg0.local_ip4,
|
|
|
|
|
self.pg0.local_ip6,
|
|
|
|
|
self.pg0.remote_ip6,
|
|
|
|
|
)
|
2018-11-29 08:48:37 +00:00
|
|
|
rx = self.send_and_expect(self.pg0, tx, self.pg0)
|
2016-11-15 09:46:51 +00:00
|
|
|
self.verify_decapped_6o4(self.pg0, rx, tx)
|
|
|
|
|
|
2018-09-19 04:55:32 -07:00
|
|
|
#
|
|
|
|
|
# Send v6 packets for v4 encap
|
|
|
|
|
#
|
|
|
|
|
route6_via_tun = VppIpRoute(
|
2022-04-26 19:02:15 +02:00
|
|
|
self,
|
|
|
|
|
"2001::1",
|
|
|
|
|
128,
|
|
|
|
|
[VppRoutePath("::", gre_if.sw_if_index, proto=DpoProto.DPO_PROTO_IP6)],
|
|
|
|
|
)
|
2018-09-19 04:55:32 -07:00
|
|
|
route6_via_tun.add_vpp_config()
|
|
|
|
|
|
|
|
|
|
tx = self.create_stream_ip6(self.pg0, "2001::2", "2001::1")
|
|
|
|
|
rx = self.send_and_expect(self.pg0, tx, self.pg0)
|
|
|
|
|
|
2022-04-26 19:02:15 +02:00
|
|
|
self.verify_tunneled_6o4(self.pg0, rx, tx, self.pg0.local_ip4, "1.1.1.2")
|
2018-09-19 04:55:32 -07:00
|
|
|
|
2020-10-08 08:10:34 +00:00
|
|
|
#
|
|
|
|
|
# add a labelled route through the tunnel
|
|
|
|
|
#
|
2022-04-26 19:02:15 +02:00
|
|
|
label_via_tun = VppIpRoute(
|
|
|
|
|
self,
|
|
|
|
|
"5.4.3.2",
|
|
|
|
|
32,
|
|
|
|
|
[VppRoutePath("0.0.0.0", gre_if.sw_if_index, labels=[VppMplsLabel(33)])],
|
|
|
|
|
)
|
2020-10-08 08:10:34 +00:00
|
|
|
label_via_tun.add_vpp_config()
|
|
|
|
|
|
|
|
|
|
tx = self.create_stream_ip4(self.pg0, "5.5.5.5", "5.4.3.2")
|
|
|
|
|
rx = self.send_and_expect(self.pg0, tx, self.pg0)
|
2022-04-26 19:02:15 +02:00
|
|
|
self.verify_tunneled_4o4(self.pg0, rx, tx, self.pg0.local_ip4, "1.1.1.2")
|
2020-10-08 08:10:34 +00:00
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# an MPLS tunnel over the GRE tunnel add a route through
|
|
|
|
|
# the mpls tunnel
|
|
|
|
|
#
|
|
|
|
|
mpls_tun = VppMPLSTunnelInterface(
|
|
|
|
|
self,
|
2022-04-26 19:02:15 +02:00
|
|
|
[
|
|
|
|
|
VppRoutePath(
|
|
|
|
|
"0.0.0.0",
|
|
|
|
|
gre_if.sw_if_index,
|
|
|
|
|
labels=[VppMplsLabel(44), VppMplsLabel(46)],
|
|
|
|
|
)
|
|
|
|
|
],
|
|
|
|
|
)
|
2020-10-08 08:10:34 +00:00
|
|
|
mpls_tun.add_vpp_config()
|
|
|
|
|
mpls_tun.admin_up()
|
|
|
|
|
|
2022-04-26 19:02:15 +02:00
|
|
|
label_via_mpls = VppIpRoute(
|
|
|
|
|
self,
|
|
|
|
|
"5.4.3.1",
|
|
|
|
|
32,
|
|
|
|
|
[VppRoutePath("0.0.0.0", mpls_tun.sw_if_index, labels=[VppMplsLabel(33)])],
|
|
|
|
|
)
|
2020-10-08 08:10:34 +00:00
|
|
|
label_via_mpls.add_vpp_config()
|
|
|
|
|
|
|
|
|
|
tx = self.create_stream_ip4(self.pg0, "5.5.5.5", "5.4.3.1")
|
|
|
|
|
rx = self.send_and_expect(self.pg0, tx, self.pg0)
|
2022-04-26 19:02:15 +02:00
|
|
|
self.verify_tunneled_4o4(self.pg0, rx, tx, self.pg0.local_ip4, "1.1.1.2")
|
2020-10-08 08:10:34 +00:00
|
|
|
|
|
|
|
|
mpls_tun_l2 = VppMPLSTunnelInterface(
|
|
|
|
|
self,
|
2022-04-26 19:02:15 +02:00
|
|
|
[
|
|
|
|
|
VppRoutePath(
|
|
|
|
|
"0.0.0.0",
|
|
|
|
|
gre_if.sw_if_index,
|
|
|
|
|
labels=[VppMplsLabel(44), VppMplsLabel(46)],
|
|
|
|
|
)
|
|
|
|
|
],
|
|
|
|
|
is_l2=1,
|
|
|
|
|
)
|
2020-10-08 08:10:34 +00:00
|
|
|
mpls_tun_l2.add_vpp_config()
|
|
|
|
|
mpls_tun_l2.admin_up()
|
|
|
|
|
|
2016-11-15 09:46:51 +00:00
|
|
|
#
|
|
|
|
|
# test case cleanup
|
|
|
|
|
#
|
|
|
|
|
route_tun_dst.remove_vpp_config()
|
|
|
|
|
route_via_tun.remove_vpp_config()
|
2018-09-19 04:55:32 -07:00
|
|
|
route6_via_tun.remove_vpp_config()
|
2020-10-08 08:10:34 +00:00
|
|
|
label_via_mpls.remove_vpp_config()
|
|
|
|
|
label_via_tun.remove_vpp_config()
|
|
|
|
|
mpls_tun.remove_vpp_config()
|
|
|
|
|
mpls_tun_l2.remove_vpp_config()
|
2016-11-15 09:46:51 +00:00
|
|
|
gre_if.remove_vpp_config()
|
|
|
|
|
|
|
|
|
|
self.pg0.unconfig_ip6()
|
|
|
|
|
|
2016-09-30 15:47:03 +01:00
|
|
|
def test_gre6(self):
|
2022-04-26 19:02:15 +02:00
|
|
|
"""GRE IPv6 tunnel Tests"""
|
2016-09-30 15:47:03 +01:00
|
|
|
|
2017-12-13 02:47:27 -08:00
|
|
|
self.pg1.config_ip6()
|
|
|
|
|
self.pg1.resolve_ndp()
|
|
|
|
|
|
2016-09-30 15:47:03 +01:00
|
|
|
#
|
|
|
|
|
# Create an L3 GRE tunnel.
|
|
|
|
|
# - set it admin up
|
|
|
|
|
# - assign an IP Address
|
|
|
|
|
# - Add a route via the tunnel
|
|
|
|
|
#
|
2022-04-26 19:02:15 +02:00
|
|
|
gre_if = VppGreInterface(self, self.pg2.local_ip6, "1002::1")
|
2016-09-30 15:47:03 +01:00
|
|
|
gre_if.add_vpp_config()
|
|
|
|
|
gre_if.admin_up()
|
|
|
|
|
gre_if.config_ip6()
|
|
|
|
|
|
2022-04-26 19:02:15 +02:00
|
|
|
route_via_tun = VppIpRoute(
|
|
|
|
|
self, "4004::1", 128, [VppRoutePath("0::0", gre_if.sw_if_index)]
|
|
|
|
|
)
|
2016-09-30 15:47:03 +01:00
|
|
|
|
|
|
|
|
route_via_tun.add_vpp_config()
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# Send a packet stream that is routed into the tunnel
|
2019-04-08 03:22:21 -05:00
|
|
|
# - they are all dropped since the tunnel's destintation IP
|
2016-09-30 15:47:03 +01:00
|
|
|
# is unresolved - or resolves via the default route - which
|
|
|
|
|
# which is a drop.
|
|
|
|
|
#
|
|
|
|
|
tx = self.create_stream_ip6(self.pg2, "5005::1", "4004::1")
|
2018-11-29 08:48:37 +00:00
|
|
|
self.send_and_assert_no_replies(
|
2022-04-26 19:02:15 +02:00
|
|
|
self.pg2, tx, "GRE packets forwarded without DIP resolved"
|
|
|
|
|
)
|
2016-09-30 15:47:03 +01:00
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# Add a route that resolves the tunnel's destination
|
|
|
|
|
#
|
2022-04-26 19:02:15 +02:00
|
|
|
route_tun_dst = VppIpRoute(
|
|
|
|
|
self,
|
|
|
|
|
"1002::1",
|
|
|
|
|
128,
|
|
|
|
|
[VppRoutePath(self.pg2.remote_ip6, self.pg2.sw_if_index)],
|
|
|
|
|
)
|
2016-09-30 15:47:03 +01:00
|
|
|
route_tun_dst.add_vpp_config()
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# Send a packet stream that is routed into the tunnel
|
|
|
|
|
# - packets are GRE encapped
|
|
|
|
|
#
|
|
|
|
|
tx = self.create_stream_ip6(self.pg2, "5005::1", "4004::1")
|
2018-11-29 08:48:37 +00:00
|
|
|
rx = self.send_and_expect(self.pg2, tx, self.pg2)
|
2022-04-26 19:02:15 +02:00
|
|
|
self.verify_tunneled_6o6(self.pg2, rx, tx, self.pg2.local_ip6, "1002::1")
|
2016-09-30 15:47:03 +01:00
|
|
|
|
2017-12-13 02:47:27 -08:00
|
|
|
#
|
|
|
|
|
# Test decap. decapped packets go out pg1
|
|
|
|
|
#
|
2022-04-26 19:02:15 +02:00
|
|
|
tx = self.create_tunnel_stream_6o6(
|
|
|
|
|
self.pg2, "1002::1", self.pg2.local_ip6, "2001::1", self.pg1.remote_ip6
|
|
|
|
|
)
|
2018-11-29 08:48:37 +00:00
|
|
|
rx = self.send_and_expect(self.pg2, tx, self.pg1)
|
2017-12-13 02:47:27 -08:00
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# RX'd packet is UDP over IPv6, test the GRE header is gone.
|
|
|
|
|
#
|
|
|
|
|
self.assertFalse(rx[0].haslayer(GRE))
|
|
|
|
|
self.assertEqual(rx[0][IPv6].dst, self.pg1.remote_ip6)
|
|
|
|
|
|
2018-09-19 04:55:32 -07:00
|
|
|
#
|
|
|
|
|
# Send v4 over v6
|
|
|
|
|
#
|
2022-04-26 19:02:15 +02:00
|
|
|
route4_via_tun = VppIpRoute(
|
|
|
|
|
self, "1.1.1.1", 32, [VppRoutePath("0.0.0.0", gre_if.sw_if_index)]
|
|
|
|
|
)
|
2018-09-19 04:55:32 -07:00
|
|
|
route4_via_tun.add_vpp_config()
|
|
|
|
|
|
|
|
|
|
tx = self.create_stream_ip4(self.pg0, "1.1.1.2", "1.1.1.1")
|
|
|
|
|
rx = self.send_and_expect(self.pg0, tx, self.pg2)
|
|
|
|
|
|
2022-04-26 19:02:15 +02:00
|
|
|
self.verify_tunneled_4o6(self.pg0, rx, tx, self.pg2.local_ip6, "1002::1")
|
2018-09-19 04:55:32 -07:00
|
|
|
|
2016-09-30 15:47:03 +01:00
|
|
|
#
|
|
|
|
|
# test case cleanup
|
|
|
|
|
#
|
|
|
|
|
route_tun_dst.remove_vpp_config()
|
|
|
|
|
route_via_tun.remove_vpp_config()
|
2018-09-19 04:55:32 -07:00
|
|
|
route4_via_tun.remove_vpp_config()
|
2016-09-30 15:47:03 +01:00
|
|
|
gre_if.remove_vpp_config()
|
|
|
|
|
|
|
|
|
|
self.pg2.unconfig_ip6()
|
2017-12-13 02:47:27 -08:00
|
|
|
self.pg1.unconfig_ip6()
|
2016-09-30 15:47:03 +01:00
|
|
|
|
2016-11-15 09:46:51 +00:00
|
|
|
def test_gre_vrf(self):
|
2022-04-26 19:02:15 +02:00
|
|
|
"""GRE tunnel VRF Tests"""
|
2016-11-15 09:46:51 +00:00
|
|
|
|
2019-12-31 05:13:14 +00:00
|
|
|
e = VppEnum.vl_api_tunnel_encap_decap_flags_t
|
|
|
|
|
|
2016-11-15 09:46:51 +00:00
|
|
|
#
|
|
|
|
|
# Create an L3 GRE tunnel whose destination is in the non-default
|
|
|
|
|
# table. The underlay is thus non-default - the overlay is still
|
|
|
|
|
# the default.
|
|
|
|
|
# - set it admin up
|
|
|
|
|
# - assign an IP Addres
|
|
|
|
|
#
|
2019-12-31 05:13:14 +00:00
|
|
|
gre_if = VppGreInterface(
|
2022-04-26 19:02:15 +02:00
|
|
|
self,
|
|
|
|
|
self.pg1.local_ip4,
|
2019-12-31 05:13:14 +00:00
|
|
|
"2.2.2.2",
|
|
|
|
|
outer_table_id=1,
|
2022-04-26 19:02:15 +02:00
|
|
|
flags=(
|
|
|
|
|
e.TUNNEL_API_ENCAP_DECAP_FLAG_ENCAP_COPY_DSCP
|
|
|
|
|
| e.TUNNEL_API_ENCAP_DECAP_FLAG_ENCAP_COPY_ECN
|
|
|
|
|
),
|
|
|
|
|
)
|
2019-12-31 05:13:14 +00:00
|
|
|
|
2016-11-15 09:46:51 +00:00
|
|
|
gre_if.add_vpp_config()
|
|
|
|
|
gre_if.admin_up()
|
|
|
|
|
gre_if.config_ip4()
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# Add a route via the tunnel - in the overlay
|
|
|
|
|
#
|
2022-04-26 19:02:15 +02:00
|
|
|
route_via_tun = VppIpRoute(
|
|
|
|
|
self, "9.9.9.9", 32, [VppRoutePath("0.0.0.0", gre_if.sw_if_index)]
|
|
|
|
|
)
|
2016-11-15 09:46:51 +00:00
|
|
|
route_via_tun.add_vpp_config()
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# Add a route that resolves the tunnel's destination - in the
|
|
|
|
|
# underlay table
|
|
|
|
|
#
|
2022-04-26 19:02:15 +02:00
|
|
|
route_tun_dst = VppIpRoute(
|
|
|
|
|
self,
|
|
|
|
|
"2.2.2.2",
|
|
|
|
|
32,
|
|
|
|
|
table_id=1,
|
|
|
|
|
paths=[VppRoutePath(self.pg1.remote_ip4, self.pg1.sw_if_index)],
|
|
|
|
|
)
|
2016-11-15 09:46:51 +00:00
|
|
|
route_tun_dst.add_vpp_config()
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# Send a packet stream that is routed into the tunnel
|
|
|
|
|
# packets are sent in on pg0 which is in the default table
|
|
|
|
|
# - packets are GRE encapped
|
|
|
|
|
#
|
|
|
|
|
self.vapi.cli("clear trace")
|
2022-04-26 19:02:15 +02:00
|
|
|
tx = self.create_stream_ip4(self.pg0, "5.5.5.5", "9.9.9.9", dscp=5, ecn=3)
|
2018-11-29 08:48:37 +00:00
|
|
|
rx = self.send_and_expect(self.pg0, tx, self.pg1)
|
2022-04-26 19:02:15 +02:00
|
|
|
self.verify_tunneled_4o4(
|
|
|
|
|
self.pg1, rx, tx, self.pg1.local_ip4, "2.2.2.2", dscp=5, ecn=3
|
|
|
|
|
)
|
2016-11-15 09:46:51 +00:00
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# Send tunneled packets that match the created tunnel and
|
|
|
|
|
# are decapped and forwarded. This tests the decap lookup
|
|
|
|
|
# does not happen in the encap table
|
|
|
|
|
#
|
|
|
|
|
self.vapi.cli("clear trace")
|
2022-04-26 19:02:15 +02:00
|
|
|
tx = self.create_tunnel_stream_4o4(
|
|
|
|
|
self.pg1,
|
|
|
|
|
"2.2.2.2",
|
|
|
|
|
self.pg1.local_ip4,
|
|
|
|
|
self.pg0.local_ip4,
|
|
|
|
|
self.pg0.remote_ip4,
|
|
|
|
|
)
|
2018-11-29 08:48:37 +00:00
|
|
|
rx = self.send_and_expect(self.pg1, tx, self.pg0)
|
2016-11-15 09:46:51 +00:00
|
|
|
self.verify_decapped_4o4(self.pg0, rx, tx)
|
|
|
|
|
|
2017-12-14 08:51:32 -08:00
|
|
|
#
|
2018-11-29 08:24:38 +00:00
|
|
|
# Send tunneled packets that match the created tunnel
|
2017-12-14 08:51:32 -08:00
|
|
|
# but arrive on an interface that is not in the tunnel's
|
2018-11-29 08:24:38 +00:00
|
|
|
# encap VRF, these are dropped.
|
|
|
|
|
# IP enable the interface so they aren't dropped due to
|
|
|
|
|
# IP not being enabled.
|
2017-12-14 08:51:32 -08:00
|
|
|
#
|
2018-11-29 08:24:38 +00:00
|
|
|
self.pg2.config_ip4()
|
2017-12-14 08:51:32 -08:00
|
|
|
self.vapi.cli("clear trace")
|
2022-04-26 19:02:15 +02:00
|
|
|
tx = self.create_tunnel_stream_4o4(
|
|
|
|
|
self.pg2,
|
|
|
|
|
"2.2.2.2",
|
|
|
|
|
self.pg1.local_ip4,
|
|
|
|
|
self.pg0.local_ip4,
|
|
|
|
|
self.pg0.remote_ip4,
|
|
|
|
|
)
|
2018-11-29 08:48:37 +00:00
|
|
|
rx = self.send_and_assert_no_replies(
|
2022-04-26 19:02:15 +02:00
|
|
|
self.pg2, tx, "GRE decap packets in wrong VRF"
|
|
|
|
|
)
|
2017-12-14 08:51:32 -08:00
|
|
|
|
2018-11-29 08:24:38 +00:00
|
|
|
self.pg2.unconfig_ip4()
|
|
|
|
|
|
2016-11-15 09:46:51 +00:00
|
|
|
#
|
|
|
|
|
# test case cleanup
|
|
|
|
|
#
|
|
|
|
|
route_tun_dst.remove_vpp_config()
|
|
|
|
|
route_via_tun.remove_vpp_config()
|
|
|
|
|
gre_if.remove_vpp_config()
|
|
|
|
|
|
|
|
|
|
def test_gre_l2(self):
|
2022-04-26 19:02:15 +02:00
|
|
|
"""GRE tunnel L2 Tests"""
|
2016-11-15 09:46:51 +00:00
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# Add routes to resolve the tunnel destinations
|
|
|
|
|
#
|
2022-04-26 19:02:15 +02:00
|
|
|
route_tun1_dst = VppIpRoute(
|
|
|
|
|
self,
|
|
|
|
|
"2.2.2.2",
|
|
|
|
|
32,
|
|
|
|
|
[VppRoutePath(self.pg0.remote_ip4, self.pg0.sw_if_index)],
|
|
|
|
|
)
|
|
|
|
|
route_tun2_dst = VppIpRoute(
|
|
|
|
|
self,
|
|
|
|
|
"2.2.2.3",
|
|
|
|
|
32,
|
|
|
|
|
[VppRoutePath(self.pg0.remote_ip4, self.pg0.sw_if_index)],
|
|
|
|
|
)
|
2016-11-15 09:46:51 +00:00
|
|
|
|
|
|
|
|
route_tun1_dst.add_vpp_config()
|
|
|
|
|
route_tun2_dst.add_vpp_config()
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# Create 2 L2 GRE tunnels and x-connect them
|
|
|
|
|
#
|
2022-04-26 19:02:15 +02:00
|
|
|
gre_if1 = VppGreInterface(
|
|
|
|
|
self,
|
|
|
|
|
self.pg0.local_ip4,
|
|
|
|
|
"2.2.2.2",
|
|
|
|
|
type=(VppEnum.vl_api_gre_tunnel_type_t.GRE_API_TUNNEL_TYPE_TEB),
|
|
|
|
|
)
|
|
|
|
|
gre_if2 = VppGreInterface(
|
|
|
|
|
self,
|
|
|
|
|
self.pg0.local_ip4,
|
|
|
|
|
"2.2.2.3",
|
|
|
|
|
type=(VppEnum.vl_api_gre_tunnel_type_t.GRE_API_TUNNEL_TYPE_TEB),
|
|
|
|
|
)
|
2016-11-15 09:46:51 +00:00
|
|
|
gre_if1.add_vpp_config()
|
|
|
|
|
gre_if2.add_vpp_config()
|
|
|
|
|
|
|
|
|
|
gre_if1.admin_up()
|
|
|
|
|
gre_if2.admin_up()
|
|
|
|
|
|
2022-04-26 19:02:15 +02:00
|
|
|
self.vapi.sw_interface_set_l2_xconnect(
|
|
|
|
|
gre_if1.sw_if_index, gre_if2.sw_if_index, enable=1
|
|
|
|
|
)
|
|
|
|
|
self.vapi.sw_interface_set_l2_xconnect(
|
|
|
|
|
gre_if2.sw_if_index, gre_if1.sw_if_index, enable=1
|
|
|
|
|
)
|
2016-11-15 09:46:51 +00:00
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# Send in tunnel encapped L2. expect out tunnel encapped L2
|
|
|
|
|
# in both directions
|
|
|
|
|
#
|
2022-04-26 19:02:15 +02:00
|
|
|
tx = self.create_tunnel_stream_l2o4(self.pg0, "2.2.2.2", self.pg0.local_ip4)
|
2018-11-29 08:48:37 +00:00
|
|
|
rx = self.send_and_expect(self.pg0, tx, self.pg0)
|
2022-04-26 19:02:15 +02:00
|
|
|
self.verify_tunneled_l2o4(self.pg0, rx, tx, self.pg0.local_ip4, "2.2.2.3")
|
2016-11-15 09:46:51 +00:00
|
|
|
|
2022-04-26 19:02:15 +02:00
|
|
|
tx = self.create_tunnel_stream_l2o4(self.pg0, "2.2.2.3", self.pg0.local_ip4)
|
2018-11-29 08:48:37 +00:00
|
|
|
rx = self.send_and_expect(self.pg0, tx, self.pg0)
|
2022-04-26 19:02:15 +02:00
|
|
|
self.verify_tunneled_l2o4(self.pg0, rx, tx, self.pg0.local_ip4, "2.2.2.2")
|
2016-11-15 09:46:51 +00:00
|
|
|
|
2022-04-26 19:02:15 +02:00
|
|
|
self.vapi.sw_interface_set_l2_xconnect(
|
|
|
|
|
gre_if1.sw_if_index, gre_if2.sw_if_index, enable=0
|
|
|
|
|
)
|
|
|
|
|
self.vapi.sw_interface_set_l2_xconnect(
|
|
|
|
|
gre_if2.sw_if_index, gre_if1.sw_if_index, enable=0
|
|
|
|
|
)
|
2016-11-15 09:46:51 +00:00
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# Create a VLAN sub-interfaces on the GRE TEB interfaces
|
|
|
|
|
# then x-connect them
|
|
|
|
|
#
|
|
|
|
|
gre_if_11 = VppDot1QSubint(self, gre_if1, 11)
|
|
|
|
|
gre_if_12 = VppDot1QSubint(self, gre_if2, 12)
|
|
|
|
|
|
|
|
|
|
# gre_if_11.add_vpp_config()
|
|
|
|
|
# gre_if_12.add_vpp_config()
|
|
|
|
|
|
|
|
|
|
gre_if_11.admin_up()
|
|
|
|
|
gre_if_12.admin_up()
|
|
|
|
|
|
2022-04-26 19:02:15 +02:00
|
|
|
self.vapi.sw_interface_set_l2_xconnect(
|
|
|
|
|
gre_if_11.sw_if_index, gre_if_12.sw_if_index, enable=1
|
|
|
|
|
)
|
|
|
|
|
self.vapi.sw_interface_set_l2_xconnect(
|
|
|
|
|
gre_if_12.sw_if_index, gre_if_11.sw_if_index, enable=1
|
|
|
|
|
)
|
2016-11-15 09:46:51 +00:00
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# Configure both to pop thier respective VLAN tags,
|
|
|
|
|
# so that during the x-coonect they will subsequently push
|
|
|
|
|
#
|
2019-03-11 19:23:25 +01:00
|
|
|
self.vapi.l2_interface_vlan_tag_rewrite(
|
2022-04-26 19:02:15 +02:00
|
|
|
sw_if_index=gre_if_12.sw_if_index, vtr_op=L2_VTR_OP.L2_POP_1, push_dot1q=12
|
|
|
|
|
)
|
2019-03-11 19:23:25 +01:00
|
|
|
self.vapi.l2_interface_vlan_tag_rewrite(
|
2022-04-26 19:02:15 +02:00
|
|
|
sw_if_index=gre_if_11.sw_if_index, vtr_op=L2_VTR_OP.L2_POP_1, push_dot1q=11
|
|
|
|
|
)
|
2016-11-15 09:46:51 +00:00
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# Send traffic in both directiond - expect the VLAN tags to
|
|
|
|
|
# be swapped.
|
|
|
|
|
#
|
2022-04-26 19:02:15 +02:00
|
|
|
tx = self.create_tunnel_stream_vlano4(
|
|
|
|
|
self.pg0, "2.2.2.2", self.pg0.local_ip4, 11
|
|
|
|
|
)
|
2018-11-29 08:48:37 +00:00
|
|
|
rx = self.send_and_expect(self.pg0, tx, self.pg0)
|
2022-04-26 19:02:15 +02:00
|
|
|
self.verify_tunneled_vlano4(self.pg0, rx, tx, self.pg0.local_ip4, "2.2.2.3", 12)
|
|
|
|
|
|
|
|
|
|
tx = self.create_tunnel_stream_vlano4(
|
|
|
|
|
self.pg0, "2.2.2.3", self.pg0.local_ip4, 12
|
|
|
|
|
)
|
2018-11-29 08:48:37 +00:00
|
|
|
rx = self.send_and_expect(self.pg0, tx, self.pg0)
|
2022-04-26 19:02:15 +02:00
|
|
|
self.verify_tunneled_vlano4(self.pg0, rx, tx, self.pg0.local_ip4, "2.2.2.2", 11)
|
2016-11-15 09:46:51 +00:00
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# Cleanup Test resources
|
|
|
|
|
#
|
|
|
|
|
gre_if_11.remove_vpp_config()
|
|
|
|
|
gre_if_12.remove_vpp_config()
|
|
|
|
|
gre_if1.remove_vpp_config()
|
|
|
|
|
gre_if2.remove_vpp_config()
|
|
|
|
|
route_tun1_dst.add_vpp_config()
|
|
|
|
|
route_tun2_dst.add_vpp_config()
|
|
|
|
|
|
FIB recusrion loop checks traverse midchain adjacencies
if a tunnel's destination address is reachable through the tunnel
(see example config belwo) then search for and detect a recursion
loop and don't stack the adjacency. Otherwise this results in a
nasty surprise.
DBGvpp# loop cre
DBGvpp# set int state loop0 up
DBGvpp# set int ip addr loop0 10.0.0.1/24
DBGvpp# create gre tunnel src 10.0.0.1 dst 1.1.1.1
DBGvpp# set int state gre0 up
DBGvpp# set int unnum gre0 use loop0
DBGvpp# ip route 1.1.1.1/32 via gre0
DBGvpp# sh ip fib 1.1.1.1
ipv4-VRF:0, fib_index:0, flow hash:[src dst sport dport proto ] locks:[src:plugin-hi:2, src:default-route:1, ]
1.1.1.1/32 fib:0 index:11 locks:4 <<< this is entry #11
src:CLI refs:1 entry-flags:attached, src-flags:added,contributing,active,
path-list:[14] locks:2 flags:shared,looped, uPRF-list:12 len:1 itfs:[2, ]
path:[14] pl-index:14 ip4 weight=1 pref=0 attached-nexthop: oper-flags:recursive-loop,resolved, cfg-flags:attached,
1.1.1.1 gre0 (p2p)
[@0]: ipv4 via 0.0.0.0 gre0: mtu:9000 4500000000000000fe2fb0cc0a0000010101010100000800
stacked-on entry:11: <<<< and the midchain forwards via entry #11
[@2]: dpo-drop ip4
src:recursive-resolution refs:1 src-flags:added, cover:-1
forwarding: unicast-ip4-chain
[@0]: dpo-load-balance: [proto:ip4 index:13 buckets:1 uRPF:12 to:[0:0]]
[0] [@6]: ipv4 via 0.0.0.0 gre0: mtu:9000 4500000000000000fe2fb0cc0a0000010101010100000800
stacked-on entry:11:
[@2]: dpo-drop ip4
DBGvpp# sh adj 1
[@1] ipv4 via 0.0.0.0 gre0: mtu:9000 4500000000000000fe2fb0cc0a0000010101010100000800
stacked-on entry:11:
[@2]: dpo-drop ip4
flags:midchain-ip-stack midchain-looped <<<<< this is a loop
counts:[0:0]
locks:4
delegates:
children:
{path:14}
Change-Id: I39b82bd1ea439be4611c88b130d40289fa0c1b59
Signed-off-by: Neale Ranns <nranns@cisco.com>
2018-12-06 13:46:49 +00:00
|
|
|
def test_gre_loop(self):
|
2022-04-26 19:02:15 +02:00
|
|
|
"""GRE tunnel loop Tests"""
|
FIB recusrion loop checks traverse midchain adjacencies
if a tunnel's destination address is reachable through the tunnel
(see example config belwo) then search for and detect a recursion
loop and don't stack the adjacency. Otherwise this results in a
nasty surprise.
DBGvpp# loop cre
DBGvpp# set int state loop0 up
DBGvpp# set int ip addr loop0 10.0.0.1/24
DBGvpp# create gre tunnel src 10.0.0.1 dst 1.1.1.1
DBGvpp# set int state gre0 up
DBGvpp# set int unnum gre0 use loop0
DBGvpp# ip route 1.1.1.1/32 via gre0
DBGvpp# sh ip fib 1.1.1.1
ipv4-VRF:0, fib_index:0, flow hash:[src dst sport dport proto ] locks:[src:plugin-hi:2, src:default-route:1, ]
1.1.1.1/32 fib:0 index:11 locks:4 <<< this is entry #11
src:CLI refs:1 entry-flags:attached, src-flags:added,contributing,active,
path-list:[14] locks:2 flags:shared,looped, uPRF-list:12 len:1 itfs:[2, ]
path:[14] pl-index:14 ip4 weight=1 pref=0 attached-nexthop: oper-flags:recursive-loop,resolved, cfg-flags:attached,
1.1.1.1 gre0 (p2p)
[@0]: ipv4 via 0.0.0.0 gre0: mtu:9000 4500000000000000fe2fb0cc0a0000010101010100000800
stacked-on entry:11: <<<< and the midchain forwards via entry #11
[@2]: dpo-drop ip4
src:recursive-resolution refs:1 src-flags:added, cover:-1
forwarding: unicast-ip4-chain
[@0]: dpo-load-balance: [proto:ip4 index:13 buckets:1 uRPF:12 to:[0:0]]
[0] [@6]: ipv4 via 0.0.0.0 gre0: mtu:9000 4500000000000000fe2fb0cc0a0000010101010100000800
stacked-on entry:11:
[@2]: dpo-drop ip4
DBGvpp# sh adj 1
[@1] ipv4 via 0.0.0.0 gre0: mtu:9000 4500000000000000fe2fb0cc0a0000010101010100000800
stacked-on entry:11:
[@2]: dpo-drop ip4
flags:midchain-ip-stack midchain-looped <<<<< this is a loop
counts:[0:0]
locks:4
delegates:
children:
{path:14}
Change-Id: I39b82bd1ea439be4611c88b130d40289fa0c1b59
Signed-off-by: Neale Ranns <nranns@cisco.com>
2018-12-06 13:46:49 +00:00
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# Create an L3 GRE tunnel.
|
|
|
|
|
# - set it admin up
|
|
|
|
|
# - assign an IP Addres
|
|
|
|
|
#
|
2022-04-26 19:02:15 +02:00
|
|
|
gre_if = VppGreInterface(self, self.pg0.local_ip4, "1.1.1.2")
|
FIB recusrion loop checks traverse midchain adjacencies
if a tunnel's destination address is reachable through the tunnel
(see example config belwo) then search for and detect a recursion
loop and don't stack the adjacency. Otherwise this results in a
nasty surprise.
DBGvpp# loop cre
DBGvpp# set int state loop0 up
DBGvpp# set int ip addr loop0 10.0.0.1/24
DBGvpp# create gre tunnel src 10.0.0.1 dst 1.1.1.1
DBGvpp# set int state gre0 up
DBGvpp# set int unnum gre0 use loop0
DBGvpp# ip route 1.1.1.1/32 via gre0
DBGvpp# sh ip fib 1.1.1.1
ipv4-VRF:0, fib_index:0, flow hash:[src dst sport dport proto ] locks:[src:plugin-hi:2, src:default-route:1, ]
1.1.1.1/32 fib:0 index:11 locks:4 <<< this is entry #11
src:CLI refs:1 entry-flags:attached, src-flags:added,contributing,active,
path-list:[14] locks:2 flags:shared,looped, uPRF-list:12 len:1 itfs:[2, ]
path:[14] pl-index:14 ip4 weight=1 pref=0 attached-nexthop: oper-flags:recursive-loop,resolved, cfg-flags:attached,
1.1.1.1 gre0 (p2p)
[@0]: ipv4 via 0.0.0.0 gre0: mtu:9000 4500000000000000fe2fb0cc0a0000010101010100000800
stacked-on entry:11: <<<< and the midchain forwards via entry #11
[@2]: dpo-drop ip4
src:recursive-resolution refs:1 src-flags:added, cover:-1
forwarding: unicast-ip4-chain
[@0]: dpo-load-balance: [proto:ip4 index:13 buckets:1 uRPF:12 to:[0:0]]
[0] [@6]: ipv4 via 0.0.0.0 gre0: mtu:9000 4500000000000000fe2fb0cc0a0000010101010100000800
stacked-on entry:11:
[@2]: dpo-drop ip4
DBGvpp# sh adj 1
[@1] ipv4 via 0.0.0.0 gre0: mtu:9000 4500000000000000fe2fb0cc0a0000010101010100000800
stacked-on entry:11:
[@2]: dpo-drop ip4
flags:midchain-ip-stack midchain-looped <<<<< this is a loop
counts:[0:0]
locks:4
delegates:
children:
{path:14}
Change-Id: I39b82bd1ea439be4611c88b130d40289fa0c1b59
Signed-off-by: Neale Ranns <nranns@cisco.com>
2018-12-06 13:46:49 +00:00
|
|
|
gre_if.add_vpp_config()
|
|
|
|
|
gre_if.admin_up()
|
|
|
|
|
gre_if.config_ip4()
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# add a route to the tunnel's destination that points
|
|
|
|
|
# through the tunnel, hence forming a loop in the forwarding
|
|
|
|
|
# graph
|
|
|
|
|
#
|
2022-04-26 19:02:15 +02:00
|
|
|
route_dst = VppIpRoute(
|
|
|
|
|
self, "1.1.1.2", 32, [VppRoutePath("0.0.0.0", gre_if.sw_if_index)]
|
|
|
|
|
)
|
FIB recusrion loop checks traverse midchain adjacencies
if a tunnel's destination address is reachable through the tunnel
(see example config belwo) then search for and detect a recursion
loop and don't stack the adjacency. Otherwise this results in a
nasty surprise.
DBGvpp# loop cre
DBGvpp# set int state loop0 up
DBGvpp# set int ip addr loop0 10.0.0.1/24
DBGvpp# create gre tunnel src 10.0.0.1 dst 1.1.1.1
DBGvpp# set int state gre0 up
DBGvpp# set int unnum gre0 use loop0
DBGvpp# ip route 1.1.1.1/32 via gre0
DBGvpp# sh ip fib 1.1.1.1
ipv4-VRF:0, fib_index:0, flow hash:[src dst sport dport proto ] locks:[src:plugin-hi:2, src:default-route:1, ]
1.1.1.1/32 fib:0 index:11 locks:4 <<< this is entry #11
src:CLI refs:1 entry-flags:attached, src-flags:added,contributing,active,
path-list:[14] locks:2 flags:shared,looped, uPRF-list:12 len:1 itfs:[2, ]
path:[14] pl-index:14 ip4 weight=1 pref=0 attached-nexthop: oper-flags:recursive-loop,resolved, cfg-flags:attached,
1.1.1.1 gre0 (p2p)
[@0]: ipv4 via 0.0.0.0 gre0: mtu:9000 4500000000000000fe2fb0cc0a0000010101010100000800
stacked-on entry:11: <<<< and the midchain forwards via entry #11
[@2]: dpo-drop ip4
src:recursive-resolution refs:1 src-flags:added, cover:-1
forwarding: unicast-ip4-chain
[@0]: dpo-load-balance: [proto:ip4 index:13 buckets:1 uRPF:12 to:[0:0]]
[0] [@6]: ipv4 via 0.0.0.0 gre0: mtu:9000 4500000000000000fe2fb0cc0a0000010101010100000800
stacked-on entry:11:
[@2]: dpo-drop ip4
DBGvpp# sh adj 1
[@1] ipv4 via 0.0.0.0 gre0: mtu:9000 4500000000000000fe2fb0cc0a0000010101010100000800
stacked-on entry:11:
[@2]: dpo-drop ip4
flags:midchain-ip-stack midchain-looped <<<<< this is a loop
counts:[0:0]
locks:4
delegates:
children:
{path:14}
Change-Id: I39b82bd1ea439be4611c88b130d40289fa0c1b59
Signed-off-by: Neale Ranns <nranns@cisco.com>
2018-12-06 13:46:49 +00:00
|
|
|
route_dst.add_vpp_config()
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# packets to the tunnels destination should be dropped
|
|
|
|
|
#
|
|
|
|
|
tx = self.create_stream_ip4(self.pg0, "1.1.1.1", "1.1.1.2")
|
|
|
|
|
self.send_and_assert_no_replies(self.pg2, tx)
|
|
|
|
|
|
|
|
|
|
self.logger.info(self.vapi.ppcli("sh adj 7"))
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# break the loop
|
|
|
|
|
#
|
2022-04-26 19:02:15 +02:00
|
|
|
route_dst.modify([VppRoutePath(self.pg1.remote_ip4, self.pg1.sw_if_index)])
|
FIB recusrion loop checks traverse midchain adjacencies
if a tunnel's destination address is reachable through the tunnel
(see example config belwo) then search for and detect a recursion
loop and don't stack the adjacency. Otherwise this results in a
nasty surprise.
DBGvpp# loop cre
DBGvpp# set int state loop0 up
DBGvpp# set int ip addr loop0 10.0.0.1/24
DBGvpp# create gre tunnel src 10.0.0.1 dst 1.1.1.1
DBGvpp# set int state gre0 up
DBGvpp# set int unnum gre0 use loop0
DBGvpp# ip route 1.1.1.1/32 via gre0
DBGvpp# sh ip fib 1.1.1.1
ipv4-VRF:0, fib_index:0, flow hash:[src dst sport dport proto ] locks:[src:plugin-hi:2, src:default-route:1, ]
1.1.1.1/32 fib:0 index:11 locks:4 <<< this is entry #11
src:CLI refs:1 entry-flags:attached, src-flags:added,contributing,active,
path-list:[14] locks:2 flags:shared,looped, uPRF-list:12 len:1 itfs:[2, ]
path:[14] pl-index:14 ip4 weight=1 pref=0 attached-nexthop: oper-flags:recursive-loop,resolved, cfg-flags:attached,
1.1.1.1 gre0 (p2p)
[@0]: ipv4 via 0.0.0.0 gre0: mtu:9000 4500000000000000fe2fb0cc0a0000010101010100000800
stacked-on entry:11: <<<< and the midchain forwards via entry #11
[@2]: dpo-drop ip4
src:recursive-resolution refs:1 src-flags:added, cover:-1
forwarding: unicast-ip4-chain
[@0]: dpo-load-balance: [proto:ip4 index:13 buckets:1 uRPF:12 to:[0:0]]
[0] [@6]: ipv4 via 0.0.0.0 gre0: mtu:9000 4500000000000000fe2fb0cc0a0000010101010100000800
stacked-on entry:11:
[@2]: dpo-drop ip4
DBGvpp# sh adj 1
[@1] ipv4 via 0.0.0.0 gre0: mtu:9000 4500000000000000fe2fb0cc0a0000010101010100000800
stacked-on entry:11:
[@2]: dpo-drop ip4
flags:midchain-ip-stack midchain-looped <<<<< this is a loop
counts:[0:0]
locks:4
delegates:
children:
{path:14}
Change-Id: I39b82bd1ea439be4611c88b130d40289fa0c1b59
Signed-off-by: Neale Ranns <nranns@cisco.com>
2018-12-06 13:46:49 +00:00
|
|
|
route_dst.add_vpp_config()
|
|
|
|
|
|
|
|
|
|
rx = self.send_and_expect(self.pg0, tx, self.pg1)
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# a good route throught the tunnel to check it restacked
|
|
|
|
|
#
|
2022-04-26 19:02:15 +02:00
|
|
|
route_via_tun_2 = VppIpRoute(
|
|
|
|
|
self, "2.2.2.2", 32, [VppRoutePath("0.0.0.0", gre_if.sw_if_index)]
|
|
|
|
|
)
|
FIB recusrion loop checks traverse midchain adjacencies
if a tunnel's destination address is reachable through the tunnel
(see example config belwo) then search for and detect a recursion
loop and don't stack the adjacency. Otherwise this results in a
nasty surprise.
DBGvpp# loop cre
DBGvpp# set int state loop0 up
DBGvpp# set int ip addr loop0 10.0.0.1/24
DBGvpp# create gre tunnel src 10.0.0.1 dst 1.1.1.1
DBGvpp# set int state gre0 up
DBGvpp# set int unnum gre0 use loop0
DBGvpp# ip route 1.1.1.1/32 via gre0
DBGvpp# sh ip fib 1.1.1.1
ipv4-VRF:0, fib_index:0, flow hash:[src dst sport dport proto ] locks:[src:plugin-hi:2, src:default-route:1, ]
1.1.1.1/32 fib:0 index:11 locks:4 <<< this is entry #11
src:CLI refs:1 entry-flags:attached, src-flags:added,contributing,active,
path-list:[14] locks:2 flags:shared,looped, uPRF-list:12 len:1 itfs:[2, ]
path:[14] pl-index:14 ip4 weight=1 pref=0 attached-nexthop: oper-flags:recursive-loop,resolved, cfg-flags:attached,
1.1.1.1 gre0 (p2p)
[@0]: ipv4 via 0.0.0.0 gre0: mtu:9000 4500000000000000fe2fb0cc0a0000010101010100000800
stacked-on entry:11: <<<< and the midchain forwards via entry #11
[@2]: dpo-drop ip4
src:recursive-resolution refs:1 src-flags:added, cover:-1
forwarding: unicast-ip4-chain
[@0]: dpo-load-balance: [proto:ip4 index:13 buckets:1 uRPF:12 to:[0:0]]
[0] [@6]: ipv4 via 0.0.0.0 gre0: mtu:9000 4500000000000000fe2fb0cc0a0000010101010100000800
stacked-on entry:11:
[@2]: dpo-drop ip4
DBGvpp# sh adj 1
[@1] ipv4 via 0.0.0.0 gre0: mtu:9000 4500000000000000fe2fb0cc0a0000010101010100000800
stacked-on entry:11:
[@2]: dpo-drop ip4
flags:midchain-ip-stack midchain-looped <<<<< this is a loop
counts:[0:0]
locks:4
delegates:
children:
{path:14}
Change-Id: I39b82bd1ea439be4611c88b130d40289fa0c1b59
Signed-off-by: Neale Ranns <nranns@cisco.com>
2018-12-06 13:46:49 +00:00
|
|
|
route_via_tun_2.add_vpp_config()
|
|
|
|
|
|
|
|
|
|
tx = self.create_stream_ip4(self.pg0, "2.2.2.3", "2.2.2.2")
|
|
|
|
|
rx = self.send_and_expect(self.pg0, tx, self.pg1)
|
2022-04-26 19:02:15 +02:00
|
|
|
self.verify_tunneled_4o4(self.pg1, rx, tx, self.pg0.local_ip4, "1.1.1.2")
|
FIB recusrion loop checks traverse midchain adjacencies
if a tunnel's destination address is reachable through the tunnel
(see example config belwo) then search for and detect a recursion
loop and don't stack the adjacency. Otherwise this results in a
nasty surprise.
DBGvpp# loop cre
DBGvpp# set int state loop0 up
DBGvpp# set int ip addr loop0 10.0.0.1/24
DBGvpp# create gre tunnel src 10.0.0.1 dst 1.1.1.1
DBGvpp# set int state gre0 up
DBGvpp# set int unnum gre0 use loop0
DBGvpp# ip route 1.1.1.1/32 via gre0
DBGvpp# sh ip fib 1.1.1.1
ipv4-VRF:0, fib_index:0, flow hash:[src dst sport dport proto ] locks:[src:plugin-hi:2, src:default-route:1, ]
1.1.1.1/32 fib:0 index:11 locks:4 <<< this is entry #11
src:CLI refs:1 entry-flags:attached, src-flags:added,contributing,active,
path-list:[14] locks:2 flags:shared,looped, uPRF-list:12 len:1 itfs:[2, ]
path:[14] pl-index:14 ip4 weight=1 pref=0 attached-nexthop: oper-flags:recursive-loop,resolved, cfg-flags:attached,
1.1.1.1 gre0 (p2p)
[@0]: ipv4 via 0.0.0.0 gre0: mtu:9000 4500000000000000fe2fb0cc0a0000010101010100000800
stacked-on entry:11: <<<< and the midchain forwards via entry #11
[@2]: dpo-drop ip4
src:recursive-resolution refs:1 src-flags:added, cover:-1
forwarding: unicast-ip4-chain
[@0]: dpo-load-balance: [proto:ip4 index:13 buckets:1 uRPF:12 to:[0:0]]
[0] [@6]: ipv4 via 0.0.0.0 gre0: mtu:9000 4500000000000000fe2fb0cc0a0000010101010100000800
stacked-on entry:11:
[@2]: dpo-drop ip4
DBGvpp# sh adj 1
[@1] ipv4 via 0.0.0.0 gre0: mtu:9000 4500000000000000fe2fb0cc0a0000010101010100000800
stacked-on entry:11:
[@2]: dpo-drop ip4
flags:midchain-ip-stack midchain-looped <<<<< this is a loop
counts:[0:0]
locks:4
delegates:
children:
{path:14}
Change-Id: I39b82bd1ea439be4611c88b130d40289fa0c1b59
Signed-off-by: Neale Ranns <nranns@cisco.com>
2018-12-06 13:46:49 +00:00
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# cleanup
|
|
|
|
|
#
|
|
|
|
|
route_via_tun_2.remove_vpp_config()
|
|
|
|
|
gre_if.remove_vpp_config()
|
|
|
|
|
|
2019-04-18 10:23:56 +00:00
|
|
|
def test_mgre(self):
|
2022-04-26 19:02:15 +02:00
|
|
|
"""mGRE IPv4 tunnel Tests"""
|
2019-04-18 10:23:56 +00:00
|
|
|
|
|
|
|
|
for itf in self.pg_interfaces[3:]:
|
|
|
|
|
#
|
|
|
|
|
# one underlay nh for each overlay/tunnel peer
|
|
|
|
|
#
|
|
|
|
|
itf.generate_remote_hosts(4)
|
|
|
|
|
itf.configure_ipv4_neighbors()
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# Create an L3 GRE tunnel.
|
|
|
|
|
# - set it admin up
|
|
|
|
|
# - assign an IP Addres
|
|
|
|
|
# - Add a route via the tunnel
|
|
|
|
|
#
|
2022-04-26 19:02:15 +02:00
|
|
|
gre_if = VppGreInterface(
|
|
|
|
|
self,
|
|
|
|
|
itf.local_ip4,
|
|
|
|
|
"0.0.0.0",
|
|
|
|
|
mode=(VppEnum.vl_api_tunnel_mode_t.TUNNEL_API_MODE_MP),
|
|
|
|
|
)
|
2019-04-18 10:23:56 +00:00
|
|
|
gre_if.add_vpp_config()
|
|
|
|
|
gre_if.admin_up()
|
|
|
|
|
gre_if.config_ip4()
|
|
|
|
|
gre_if.generate_remote_hosts(4)
|
|
|
|
|
|
2019-12-16 00:53:11 +00:00
|
|
|
self.logger.info(self.vapi.cli("sh adj"))
|
|
|
|
|
self.logger.info(self.vapi.cli("sh ip fib"))
|
|
|
|
|
|
2019-12-17 20:15:03 +00:00
|
|
|
#
|
|
|
|
|
# ensure we don't match to the tunnel if the source address
|
|
|
|
|
# is all zeros
|
|
|
|
|
#
|
2022-04-26 19:02:15 +02:00
|
|
|
tx = self.create_tunnel_stream_4o4(
|
|
|
|
|
self.pg0,
|
|
|
|
|
"0.0.0.0",
|
|
|
|
|
itf.local_ip4,
|
|
|
|
|
self.pg0.local_ip4,
|
|
|
|
|
self.pg0.remote_ip4,
|
|
|
|
|
)
|
2019-12-17 20:15:03 +00:00
|
|
|
self.send_and_assert_no_replies(self.pg0, tx)
|
|
|
|
|
|
2019-04-18 10:23:56 +00:00
|
|
|
#
|
|
|
|
|
# for-each peer
|
|
|
|
|
#
|
|
|
|
|
for ii in range(1, 4):
|
|
|
|
|
route_addr = "4.4.4.%d" % ii
|
2021-03-15 14:42:30 +00:00
|
|
|
tx_e = self.create_stream_ip4(self.pg0, "5.5.5.5", route_addr)
|
2019-04-18 10:23:56 +00:00
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# route traffic via the peer
|
|
|
|
|
#
|
|
|
|
|
route_via_tun = VppIpRoute(
|
2022-04-26 19:02:15 +02:00
|
|
|
self,
|
|
|
|
|
route_addr,
|
|
|
|
|
32,
|
|
|
|
|
[VppRoutePath(gre_if._remote_hosts[ii].ip4, gre_if.sw_if_index)],
|
|
|
|
|
)
|
2019-04-18 10:23:56 +00:00
|
|
|
route_via_tun.add_vpp_config()
|
|
|
|
|
|
2021-03-15 14:42:30 +00:00
|
|
|
# all packets dropped at this point
|
|
|
|
|
rx = self.send_and_assert_no_replies(self.pg0, tx_e)
|
|
|
|
|
|
|
|
|
|
gre_if.admin_down()
|
|
|
|
|
gre_if.admin_up()
|
|
|
|
|
rx = self.send_and_assert_no_replies(self.pg0, tx_e)
|
|
|
|
|
|
2019-04-18 10:23:56 +00:00
|
|
|
#
|
2019-12-16 00:53:11 +00:00
|
|
|
# Add a TEIB entry resolves the peer
|
2019-04-18 10:23:56 +00:00
|
|
|
#
|
2022-04-26 19:02:15 +02:00
|
|
|
teib = VppTeib(
|
|
|
|
|
self,
|
|
|
|
|
gre_if,
|
|
|
|
|
gre_if._remote_hosts[ii].ip4,
|
|
|
|
|
itf._remote_hosts[ii].ip4,
|
|
|
|
|
)
|
2020-02-03 10:55:09 +00:00
|
|
|
teib.add_vpp_config()
|
2019-04-18 10:23:56 +00:00
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# Send a packet stream that is routed into the tunnel
|
|
|
|
|
# - packets are GRE encapped
|
|
|
|
|
#
|
2021-04-27 13:54:46 +00:00
|
|
|
rx = self.send_and_expect(self.pg0, tx_e, itf)
|
2022-04-26 19:02:15 +02:00
|
|
|
self.verify_tunneled_4o4(
|
|
|
|
|
self.pg0, rx, tx_e, itf.local_ip4, itf._remote_hosts[ii].ip4
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
tx_i = self.create_tunnel_stream_4o4(
|
|
|
|
|
self.pg0,
|
|
|
|
|
itf._remote_hosts[ii].ip4,
|
|
|
|
|
itf.local_ip4,
|
|
|
|
|
self.pg0.local_ip4,
|
|
|
|
|
self.pg0.remote_ip4,
|
|
|
|
|
)
|
2019-12-17 20:15:03 +00:00
|
|
|
rx = self.send_and_expect(self.pg0, tx_i, self.pg0)
|
|
|
|
|
self.verify_decapped_4o4(self.pg0, rx, tx_i)
|
|
|
|
|
|
2019-04-18 10:23:56 +00:00
|
|
|
#
|
2019-12-16 00:53:11 +00:00
|
|
|
# delete and re-add the TEIB
|
2019-04-18 10:23:56 +00:00
|
|
|
#
|
2020-02-03 10:55:09 +00:00
|
|
|
teib.remove_vpp_config()
|
2019-12-17 20:15:03 +00:00
|
|
|
self.send_and_assert_no_replies(self.pg0, tx_e)
|
|
|
|
|
self.send_and_assert_no_replies(self.pg0, tx_i)
|
2019-04-18 10:23:56 +00:00
|
|
|
|
2020-02-03 10:55:09 +00:00
|
|
|
teib.add_vpp_config()
|
2019-12-17 20:15:03 +00:00
|
|
|
rx = self.send_and_expect(self.pg0, tx_e, itf)
|
2022-04-26 19:02:15 +02:00
|
|
|
self.verify_tunneled_4o4(
|
|
|
|
|
self.pg0, rx, tx_e, itf.local_ip4, itf._remote_hosts[ii].ip4
|
|
|
|
|
)
|
2021-03-15 14:42:30 +00:00
|
|
|
rx = self.send_and_expect(self.pg0, tx_i, self.pg0)
|
|
|
|
|
self.verify_decapped_4o4(self.pg0, rx, tx_i)
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# bounce the interface state and try packets again
|
|
|
|
|
#
|
|
|
|
|
gre_if.admin_down()
|
|
|
|
|
gre_if.admin_up()
|
|
|
|
|
rx = self.send_and_expect(self.pg0, tx_e, itf)
|
2022-04-26 19:02:15 +02:00
|
|
|
self.verify_tunneled_4o4(
|
|
|
|
|
self.pg0, rx, tx_e, itf.local_ip4, itf._remote_hosts[ii].ip4
|
|
|
|
|
)
|
2019-12-17 20:15:03 +00:00
|
|
|
rx = self.send_and_expect(self.pg0, tx_i, self.pg0)
|
|
|
|
|
self.verify_decapped_4o4(self.pg0, rx, tx_i)
|
2019-04-18 10:23:56 +00:00
|
|
|
|
2019-12-16 00:53:11 +00:00
|
|
|
gre_if.admin_down()
|
|
|
|
|
gre_if.unconfig_ip4()
|
|
|
|
|
|
2019-12-17 00:14:26 +00:00
|
|
|
def test_mgre6(self):
|
2022-04-26 19:02:15 +02:00
|
|
|
"""mGRE IPv6 tunnel Tests"""
|
2019-12-17 00:14:26 +00:00
|
|
|
|
2019-12-17 20:15:03 +00:00
|
|
|
self.pg0.config_ip6()
|
|
|
|
|
self.pg0.resolve_ndp()
|
2019-12-17 00:14:26 +00:00
|
|
|
|
2019-12-31 05:13:14 +00:00
|
|
|
e = VppEnum.vl_api_tunnel_encap_decap_flags_t
|
|
|
|
|
|
2019-12-17 00:14:26 +00:00
|
|
|
for itf in self.pg_interfaces[3:]:
|
|
|
|
|
#
|
|
|
|
|
# one underlay nh for each overlay/tunnel peer
|
|
|
|
|
#
|
|
|
|
|
itf.config_ip6()
|
|
|
|
|
itf.generate_remote_hosts(4)
|
|
|
|
|
itf.configure_ipv6_neighbors()
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# Create an L3 GRE tunnel.
|
|
|
|
|
# - set it admin up
|
|
|
|
|
# - assign an IP Addres
|
|
|
|
|
# - Add a route via the tunnel
|
|
|
|
|
#
|
2019-12-31 05:13:14 +00:00
|
|
|
gre_if = VppGreInterface(
|
|
|
|
|
self,
|
|
|
|
|
itf.local_ip6,
|
|
|
|
|
"::",
|
2022-04-26 19:02:15 +02:00
|
|
|
mode=(VppEnum.vl_api_tunnel_mode_t.TUNNEL_API_MODE_MP),
|
|
|
|
|
flags=e.TUNNEL_API_ENCAP_DECAP_FLAG_ENCAP_COPY_DSCP,
|
|
|
|
|
)
|
2019-12-31 05:13:14 +00:00
|
|
|
|
2019-12-17 00:14:26 +00:00
|
|
|
gre_if.add_vpp_config()
|
|
|
|
|
gre_if.admin_up()
|
|
|
|
|
gre_if.config_ip6()
|
|
|
|
|
gre_if.generate_remote_hosts(4)
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# for-each peer
|
|
|
|
|
#
|
|
|
|
|
for ii in range(1, 4):
|
|
|
|
|
route_addr = "4::%d" % ii
|
|
|
|
|
|
2019-12-29 23:55:18 +00:00
|
|
|
#
|
2019-12-16 00:53:11 +00:00
|
|
|
# Add a TEIB entry resolves the peer
|
2019-12-29 23:55:18 +00:00
|
|
|
#
|
2022-04-26 19:02:15 +02:00
|
|
|
teib = VppTeib(
|
|
|
|
|
self,
|
|
|
|
|
gre_if,
|
|
|
|
|
gre_if._remote_hosts[ii].ip6,
|
|
|
|
|
itf._remote_hosts[ii].ip6,
|
|
|
|
|
)
|
2020-02-03 10:55:09 +00:00
|
|
|
teib.add_vpp_config()
|
2019-12-29 23:55:18 +00:00
|
|
|
|
2019-12-17 00:14:26 +00:00
|
|
|
#
|
|
|
|
|
# route traffic via the peer
|
|
|
|
|
#
|
|
|
|
|
route_via_tun = VppIpRoute(
|
2022-04-26 19:02:15 +02:00
|
|
|
self,
|
|
|
|
|
route_addr,
|
|
|
|
|
128,
|
|
|
|
|
[VppRoutePath(gre_if._remote_hosts[ii].ip6, gre_if.sw_if_index)],
|
|
|
|
|
)
|
2019-12-17 00:14:26 +00:00
|
|
|
route_via_tun.add_vpp_config()
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# Send a packet stream that is routed into the tunnel
|
|
|
|
|
# - packets are GRE encapped
|
|
|
|
|
#
|
2022-04-26 19:02:15 +02:00
|
|
|
tx_e = self.create_stream_ip6(
|
|
|
|
|
self.pg0, "5::5", route_addr, dscp=2, ecn=1
|
|
|
|
|
)
|
2019-12-17 20:15:03 +00:00
|
|
|
rx = self.send_and_expect(self.pg0, tx_e, itf)
|
2022-04-26 19:02:15 +02:00
|
|
|
self.verify_tunneled_6o6(
|
|
|
|
|
self.pg0, rx, tx_e, itf.local_ip6, itf._remote_hosts[ii].ip6, dscp=2
|
|
|
|
|
)
|
|
|
|
|
tx_i = self.create_tunnel_stream_6o6(
|
|
|
|
|
self.pg0,
|
|
|
|
|
itf._remote_hosts[ii].ip6,
|
|
|
|
|
itf.local_ip6,
|
|
|
|
|
self.pg0.local_ip6,
|
|
|
|
|
self.pg0.remote_ip6,
|
|
|
|
|
)
|
2019-12-17 20:15:03 +00:00
|
|
|
rx = self.send_and_expect(self.pg0, tx_i, self.pg0)
|
|
|
|
|
self.verify_decapped_6o6(self.pg0, rx, tx_i)
|
2019-12-17 00:14:26 +00:00
|
|
|
|
|
|
|
|
#
|
2019-12-16 00:53:11 +00:00
|
|
|
# delete and re-add the TEIB
|
2019-12-17 00:14:26 +00:00
|
|
|
#
|
2020-02-03 10:55:09 +00:00
|
|
|
teib.remove_vpp_config()
|
2019-12-17 20:15:03 +00:00
|
|
|
self.send_and_assert_no_replies(self.pg0, tx_e)
|
2019-12-17 00:14:26 +00:00
|
|
|
|
2020-02-03 10:55:09 +00:00
|
|
|
teib.add_vpp_config()
|
2019-12-17 20:15:03 +00:00
|
|
|
rx = self.send_and_expect(self.pg0, tx_e, itf)
|
2022-04-26 19:02:15 +02:00
|
|
|
self.verify_tunneled_6o6(
|
|
|
|
|
self.pg0, rx, tx_e, itf.local_ip6, itf._remote_hosts[ii].ip6, dscp=2
|
|
|
|
|
)
|
2019-12-17 20:15:03 +00:00
|
|
|
rx = self.send_and_expect(self.pg0, tx_i, self.pg0)
|
|
|
|
|
self.verify_decapped_6o6(self.pg0, rx, tx_i)
|
|
|
|
|
|
2019-12-17 00:14:26 +00:00
|
|
|
gre_if.admin_down()
|
|
|
|
|
gre_if.unconfig_ip4()
|
|
|
|
|
itf.unconfig_ip6()
|
2019-12-17 20:15:03 +00:00
|
|
|
self.pg0.unconfig_ip6()
|
2019-12-17 00:14:26 +00:00
|
|
|
|
2016-11-15 09:46:51 +00:00
|
|
|
|
2022-04-26 19:02:15 +02:00
|
|
|
if __name__ == "__main__":
|
2016-11-15 09:46:51 +00:00
|
|
|
unittest.main(testRunner=VppTestRunner)
|