From 1b5ca985dc51bea730ce5ee799641c75f73a0f26 Mon Sep 17 00:00:00 2001 From: Neale Ranns Date: Wed, 16 Dec 2020 13:06:58 +0000 Subject: vxlan: Protect against tunnel config where source is not local Type: fix If a tunnel's source is not local then post encap VPP will attempt to receive (via ip4-local) that packet, things go wrong from there. The fix is when stacking the encap forwarding don't accept a receive DPO. This approach is taken, rather than rejecting bad tunnels, because the 'local-ness' of the tunnel's source can change and we can't reject tunnels that were once correctly configured but are no longer. the user will quickly discover their mistake as traffic won't pass. Signed-off-by: Neale Ranns Change-Id: I46198422e321606e8baba003112e978a526b4c2f --- test/test_vxlan.py | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) (limited to 'test') diff --git a/test/test_vxlan.py b/test/test_vxlan.py index 54d0c2d4a59..dc48f539f6e 100644 --- a/test/test_vxlan.py +++ b/test/test_vxlan.py @@ -282,5 +282,53 @@ class TestVxlan(BridgeDomain, VppTestCase): 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) -- cgit 1.2.3-korg