from scapy.layers.inet6 import IPv6
from scapy.volatile import RandMAC, RandIP
+from framework import tag_fixme_vpp_workers
from framework import VppTestCase, VppTestRunner
from vpp_sub_interface import L2_VTR_OP, VppDot1QSubint
from vpp_gre_interface import VppGreInterface
-from vpp_nhrp import VppNhrp
+from vpp_teib import VppTeib
from vpp_ip import DpoProto
-from vpp_ip_route import VppIpRoute, VppRoutePath, VppIpTable, FibPathProto
+from vpp_ip_route import VppIpRoute, VppRoutePath, VppIpTable, FibPathProto, \
+ VppMplsLabel
+from vpp_mpls_tunnel_interface import VppMPLSTunnelInterface
from util import ppp, ppc
from vpp_papi import VppEnum
+@tag_fixme_vpp_workers
class TestGREInputNodes(VppTestCase):
""" GRE Input Nodes Test Case """
self.pg_start()
# no tunnel created, gre-input not registered
err = self.statistics.get_counter(
- '/err/ip4-input/unknown ip protocol')[0]
+ '/err/ip4-local/unknown ip protocol')[0]
self.assertEqual(err, 1)
err_count = err
self.pg_start()
# tunnel created, gre-input registered
err = self.statistics.get_counter(
- '/err/ip4-input/unknown ip protocol')[0]
+ '/err/ip4-local/unknown ip protocol')[0]
# expect no new errors
self.assertEqual(err, err_count)
self.assertEqual(rx_ip.src, tunnel_src)
self.assertEqual(rx_ip.dst, tunnel_dst)
self.assertEqual(rx_ip.tos, tos)
+ self.assertEqual(rx_ip.len, len(rx_ip))
rx_gre = rx[GRE]
rx_ip = rx_gre[IP]
self.assertEqual(rx_ip.tc, tc)
rx_gre = GRE(scapy.compat.raw(rx_ip[IPv6].payload))
+
+ self.assertEqual(rx_ip.plen, len(rx_gre))
+
rx_ip = rx_gre[IPv6]
self.assertEqual(rx_ip.src, tx_ip.src)
self.assertEqual(rx_ip.dst, tunnel_dst)
rx_gre = GRE(scapy.compat.raw(rx_ip[IPv6].payload))
+
+ self.assertEqual(rx_ip.plen, len(rx_gre))
+
tx_ip = tx[IP]
rx_ip = rx_gre[IP]
self.assertEqual(rx_ip.src, tunnel_src)
self.assertEqual(rx_ip.dst, tunnel_dst)
+ self.assertEqual(rx_ip.len, len(rx_ip))
rx_gre = GRE(scapy.compat.raw(rx_ip[IP].payload))
rx_ip = rx_gre[IPv6]
self.assertEqual(rx_ip.src, tunnel_src)
self.assertEqual(rx_ip.dst, tunnel_dst)
+ self.assertEqual(rx_ip.len, len(rx_ip))
rx_gre = rx[GRE]
rx_l2 = rx_gre[Ether]
self.verify_tunneled_6o4(self.pg0, rx, tx,
self.pg0.local_ip4, "1.1.1.2")
+ #
+ # add a labelled route through the tunnel
+ #
+ label_via_tun = VppIpRoute(self, "5.4.3.2", 32,
+ [VppRoutePath("0.0.0.0",
+ gre_if.sw_if_index,
+ labels=[VppMplsLabel(33)])])
+ 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)
+ self.verify_tunneled_4o4(self.pg0, rx, tx,
+ self.pg0.local_ip4, "1.1.1.2")
+
+ #
+ # an MPLS tunnel over the GRE tunnel add a route through
+ # the mpls tunnel
+ #
+ mpls_tun = VppMPLSTunnelInterface(
+ self,
+ [VppRoutePath("0.0.0.0",
+ gre_if.sw_if_index,
+ labels=[VppMplsLabel(44),
+ VppMplsLabel(46)])])
+ mpls_tun.add_vpp_config()
+ mpls_tun.admin_up()
+
+ label_via_mpls = VppIpRoute(self, "5.4.3.1", 32,
+ [VppRoutePath("0.0.0.0",
+ mpls_tun.sw_if_index,
+ labels=[VppMplsLabel(33)])])
+ 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)
+ self.verify_tunneled_4o4(self.pg0, rx, tx,
+ self.pg0.local_ip4, "1.1.1.2")
+
+ mpls_tun_l2 = VppMPLSTunnelInterface(
+ self,
+ [VppRoutePath("0.0.0.0",
+ gre_if.sw_if_index,
+ labels=[VppMplsLabel(44),
+ VppMplsLabel(46)])],
+ is_l2=1)
+ mpls_tun_l2.add_vpp_config()
+ mpls_tun_l2.admin_up()
+
#
# test case cleanup
#
route_tun_dst.remove_vpp_config()
route_via_tun.remove_vpp_config()
route6_via_tun.remove_vpp_config()
+ label_via_mpls.remove_vpp_config()
+ label_via_tun.remove_vpp_config()
+ mpls_tun.remove_vpp_config()
+ mpls_tun_l2.remove_vpp_config()
gre_if.remove_vpp_config()
self.pg0.unconfig_ip6()
#
for ii in range(1, 4):
route_addr = "4.4.4.%d" % ii
+ tx_e = self.create_stream_ip4(self.pg0, "5.5.5.5", route_addr)
#
# route traffic via the peer
gre_if.sw_if_index)])
route_via_tun.add_vpp_config()
+ # 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)
+
#
- # Add a NHRP entry resolves the peer
+ # Add a TEIB entry resolves the peer
#
- nhrp = VppNhrp(self, gre_if,
+ teib = VppTeib(self, gre_if,
gre_if._remote_hosts[ii].ip4,
itf._remote_hosts[ii].ip4)
- nhrp.add_vpp_config()
+ teib.add_vpp_config()
#
# Send a packet stream that is routed into the tunnel
# - packets are GRE encapped
#
- tx_e = self.create_stream_ip4(self.pg0, "5.5.5.5", route_addr)
rx = self.send_and_expect(self.pg0, tx_e, itf)
self.verify_tunneled_4o4(self.pg0, rx, tx_e,
itf.local_ip4,
self.verify_decapped_4o4(self.pg0, rx, tx_i)
#
- # delete and re-add the NHRP
+ # delete and re-add the TEIB
#
- nhrp.remove_vpp_config()
+ teib.remove_vpp_config()
self.send_and_assert_no_replies(self.pg0, tx_e)
self.send_and_assert_no_replies(self.pg0, tx_i)
- nhrp.add_vpp_config()
+ teib.add_vpp_config()
+ rx = self.send_and_expect(self.pg0, tx_e, itf)
+ self.verify_tunneled_4o4(self.pg0, rx, tx_e,
+ itf.local_ip4,
+ itf._remote_hosts[ii].ip4)
+ 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)
self.verify_tunneled_4o4(self.pg0, rx, tx_e,
itf.local_ip4,
route_addr = "4::%d" % ii
#
- # Add a NHRP entry resolves the peer
+ # Add a TEIB entry resolves the peer
#
- nhrp = VppNhrp(self, gre_if,
+ teib = VppTeib(self, gre_if,
gre_if._remote_hosts[ii].ip6,
itf._remote_hosts[ii].ip6)
- nhrp.add_vpp_config()
+ teib.add_vpp_config()
#
# route traffic via the peer
self.verify_decapped_6o6(self.pg0, rx, tx_i)
#
- # delete and re-add the NHRP
+ # delete and re-add the TEIB
#
- nhrp.remove_vpp_config()
+ teib.remove_vpp_config()
self.send_and_assert_no_replies(self.pg0, tx_e)
- nhrp.add_vpp_config()
+ teib.add_vpp_config()
rx = self.send_and_expect(self.pg0, tx_e, itf)
self.verify_tunneled_6o6(self.pg0, rx, tx_e,
itf.local_ip6,