#!/usr/bin/env python3
import socket
-from util import ip4n_range, ip4_range, reassemble4
+from util import ip4_range, reassemble4
import unittest
from framework import VppTestCase, VppTestRunner
from template_bd import BridgeDomain
from scapy.packet import Raw
from scapy.layers.inet import IP, UDP
from scapy.layers.vxlan import VXLAN
-from scapy.utils import atol
+
+import util
from vpp_ip_route import VppIpRoute, VppRoutePath
from vpp_vxlan_tunnel import VppVxlanTunnel
from vpp_ip import INVALID_INDEX
# Verify UDP destination port is VXLAN 4789, source UDP port could be
# arbitrary.
self.assertEqual(pkt[UDP].dport, type(self).dport)
- # TODO: checksum check
+ # Verify UDP checksum
+ self.assert_udp_checksum_valid(pkt)
# Verify VNI
self.assertEqual(pkt[VXLAN].vni, vni)
next_hop_address = cls.pg0.remote_ip4
for dest_ip4 in ip4_range(next_hop_address, ip_range_start,
ip_range_end):
- # add host route so dest_ip4n will not be resolved
+ # add host route so dest_ip4 will not be resolved
rip = VppIpRoute(cls, dest_ip4, 32,
[VppRoutePath(next_hop_address,
INVALID_INDEX)],
register=False)
rip.add_vpp_config()
- dest_ip4n = socket.inet_pton(socket.AF_INET, dest_ip4)
r = VppVxlanTunnel(cls, src=cls.pg0.local_ip4,
dst=dest_ip4, vni=vni)
# Our Multicast address
cls.mcast_ip4 = '239.1.1.1'
- cls.mcast_ip4n = socket.inet_pton(socket.AF_INET, cls.mcast_ip4)
- iplong = atol(cls.mcast_ip4)
- cls.mcast_mac = "01:00:5e:%02x:%02x:%02x" % (
- (iplong >> 16) & 0x7F, (iplong >> 8) & 0xFF, iplong & 0xFF)
-
+ cls.mcast_mac = util.mcast_ip_to_mac(cls.mcast_ip4)
except Exception:
- super(TestVxlan, cls).tearDownClass()
+ cls.tearDownClass()
raise
@classmethod
super(TestVxlan, self).setUp()
# Create VXLAN VTEP on VPP pg0, and put vxlan_tunnel0 and pg1
# into BD.
+ self.single_tunnel_vni = 0x12345
self.single_tunnel_bd = 1
r = VppVxlanTunnel(self, src=self.pg0.local_ip4,
- dst=self.pg0.remote_ip4, vni=self.single_tunnel_bd)
+ dst=self.pg0.remote_ip4,
+ vni=self.single_tunnel_vni)
r.add_vpp_config()
self.vapi.sw_interface_set_l2_bridge(rx_sw_if_index=r.sw_if_index,
bd_id=self.single_tunnel_bd)
ether = out[0]
pkt = reassemble4(out)
pkt = ether / pkt
- self.check_encapsulation(pkt, self.single_tunnel_bd)
+ self.check_encapsulation(pkt, self.single_tunnel_vni)
payload = self.decapsulate(pkt)
# TODO: Scapy bug?
self.logger.info(self.vapi.cli("show vxlan tunnel"))
+class TestVxlan2(VppTestCase):
+ """ VXLAN Test Case """
+ def setUp(self):
+ super(TestVxlan2, self).setUp()
+
+ # Create 2 pg interfaces.
+ self.create_pg_interfaces(range(4))
+ for pg in self.pg_interfaces:
+ pg.admin_up()
+
+ # Configure IPv4 addresses on VPP pg0.
+ self.pg0.config_ip4()
+ self.pg0.resolve_arp()
+
+ def tearDown(self):
+ super(TestVxlan2, self).tearDown()
+
+ def test_xconnect(self):
+ """ VXLAN source address not local """
+
+ #
+ # test the broken configuration of a VXLAN tunnel whose
+ # source address is not local ot the box. packets sent
+ # through the tunnel should be dropped
+ #
+ t = VppVxlanTunnel(self,
+ src="10.0.0.5",
+ dst=self.pg0.local_ip4,
+ vni=1000)
+ t.add_vpp_config()
+ t.admin_up()
+
+ self.vapi.sw_interface_set_l2_xconnect(t.sw_if_index,
+ self.pg1.sw_if_index,
+ enable=1)
+ self.vapi.sw_interface_set_l2_xconnect(self.pg1.sw_if_index,
+ t.sw_if_index,
+ enable=1)
+
+ p = (Ether(src="00:11:22:33:44:55",
+ dst="00:00:00:11:22:33") /
+ IP(src="4.3.2.1", dst="1.2.3.4") /
+ UDP(sport=20000, dport=10000) /
+ Raw(b'\xa5' * 1450))
+
+ rx = self.send_and_assert_no_replies(self.pg1, [p])
+
+
if __name__ == '__main__':
unittest.main(testRunner=VppTestRunner)