VPP-1392: VXLAN fails with IP fragmentation

Not only is it wasteful to send all fragments back through ip4-lookup, but
it doesn't work with tunnel mechanisms that don't have IP enabled on their
payload side.

Change-Id: Ic92d95982dddaa70969a2a6ea2f98edec7614425
Signed-off-by: Ole Troan <ot@cisco.com>
This commit is contained in:
Ole Troan
2018-08-16 22:08:49 +02:00
committed by John Lo
parent ee4efa7c39
commit b3655e5592
5 changed files with 52 additions and 3 deletions

View File

@ -6,11 +6,27 @@ import unittest
from framework import VppTestCase, VppTestRunner
from template_bd import BridgeDomain
from scapy.layers.l2 import Ether
from scapy.layers.l2 import Ether, Raw
from scapy.layers.inet import IP, UDP
from scapy.layers.vxlan import VXLAN
from scapy.utils import atol
import StringIO
def reassemble(listoffragments):
buffer = StringIO.StringIO()
first = listoffragments[0]
buffer.seek(20)
for pkt in listoffragments:
buffer.seek(pkt[IP].frag*8)
buffer.write(pkt[IP].payload)
first.len = len(buffer.getvalue()) + 20
first.flags = 0
del(first.chksum)
header = str(first[IP])[:20]
return first[IP].__class__(header + buffer.getvalue())
class TestVxlan(BridgeDomain, VppTestCase):
""" VXLAN Test Case """
@ -222,6 +238,35 @@ class TestVxlan(BridgeDomain, VppTestCase):
super(TestVxlan, cls).tearDownClass()
raise
def test_encap_big_packet(self):
""" Encapsulation test send big frame from pg1
Verify receipt of encapsulated frames on pg0
"""
self.vapi.sw_interface_set_mtu(self.pg0.sw_if_index, [1500, 0, 0, 0])
frame = (Ether(src='00:00:00:00:00:02', dst='00:00:00:00:00:01') /
IP(src='4.3.2.1', dst='1.2.3.4') /
UDP(sport=20000, dport=10000) /
Raw('\xa5' * 1450))
self.pg1.add_stream([frame])
self.pg0.enable_capture()
self.pg_start()
# Pick first received frame and check if it's correctly encapsulated.
out = self.pg0.get_capture(2)
ether = out[0]
pkt = reassemble(out)
pkt = ether / pkt
self.check_encapsulation(pkt, self.single_tunnel_bd)
payload = self.decapsulate(pkt)
# TODO: Scapy bug?
# self.assert_eq_pkts(payload, frame)
# Method to define VPP actions before tear down of the test case.
# Overrides tearDown method in VppTestCase class.
# @param self The object pointer.