vxlan unit test - minor fixes

moved ip4_range and ip4n_range to util
added n_ucast_tunnels

Change-Id: I9140c4e54a0636d90a97db03da842f5183319af5
Signed-off-by: Eyal Bari <ebari@cisco.com>
This commit is contained in:
Eyal Bari
2017-01-11 13:39:54 +02:00
committed by John Lo
parent 724f64ccf6
commit d81da8c0b5
3 changed files with 35 additions and 29 deletions

View File

@ -5,6 +5,8 @@ from abc import abstractmethod, ABCMeta
from scapy.layers.l2 import Ether, Raw from scapy.layers.l2 import Ether, Raw
from scapy.layers.inet import IP, UDP from scapy.layers.inet import IP, UDP
from util import ip4_range
class BridgeDomain(object): class BridgeDomain(object):
""" Bridge domain abstraction """ """ Bridge domain abstraction """
@ -110,7 +112,7 @@ class BridgeDomain(object):
self.pg_start() self.pg_start()
# Get packet from each tunnel and assert it's corectly encapsulated. # Get packet from each tunnel and assert it's corectly encapsulated.
out = self.pg0.get_capture(10) out = self.pg0.get_capture(self.n_ucast_tunnels)
for pkt in out: for pkt in out:
self.check_encapsulation(pkt, self.ucast_flood_bd, True) self.check_encapsulation(pkt, self.ucast_flood_bd, True)
payload = self.decapsulate(pkt) payload = self.decapsulate(pkt)
@ -135,10 +137,6 @@ class BridgeDomain(object):
payload = self.decapsulate(pkt) payload = self.decapsulate(pkt)
self.assert_eq_pkts(payload, self.frame_reply) self.assert_eq_pkts(payload, self.frame_reply)
@staticmethod
def ipn_to_ip(ipn):
return '.'.join(str(i) for i in bytearray(ipn))
def test_mcast_rcv(self): def test_mcast_rcv(self):
""" Multicast receive test """ Multicast receive test
Send 20 encapsulated frames from pg0 only 10 match unicast tunnels Send 20 encapsulated frames from pg0 only 10 match unicast tunnels
@ -148,10 +146,9 @@ class BridgeDomain(object):
ip_range_start = 10 ip_range_start = 10
ip_range_end = 30 ip_range_end = 30
mcast_stream = [ mcast_stream = [
self.encap_mcast(self.frame_request, self.ipn_to_ip(ip), mac, self.encap_mcast(self.frame_request, ip, mac, self.mcast_flood_bd)
self.mcast_flood_bd) for ip in ip4_range(self.pg0.remote_ip4,
for ip in self.ip4_range(self.pg0.remote_ip4n, ip_range_start, ip_range_end)]
ip_range_start, ip_range_end)]
self.pg0.add_stream(mcast_stream) self.pg0.add_stream(mcast_stream)
self.pg2.enable_capture() self.pg2.enable_capture()
self.pg_start() self.pg_start()

View File

@ -1,6 +1,7 @@
#!/usr/bin/env python #!/usr/bin/env python
import socket import socket
from util import ip4n_range
import unittest import unittest
from framework import VppTestCase, VppTestRunner from framework import VppTestCase, VppTestRunner
from template_bd import BridgeDomain from template_bd import BridgeDomain
@ -34,7 +35,7 @@ class TestVxlan(BridgeDomain, VppTestCase):
Encapsulate the original payload frame by adding VXLAN header with its Encapsulate the original payload frame by adding VXLAN header with its
UDP, IP and Ethernet fields UDP, IP and Ethernet fields
""" """
return (Ether(src=src_mac, dst=self.mcast_mac4) / return (Ether(src=src_mac, dst=self.mcast_mac) /
IP(src=src_ip, dst=self.mcast_ip4) / IP(src=src_ip, dst=self.mcast_ip4) /
UDP(sport=self.dport, dport=self.dport, chksum=0) / UDP(sport=self.dport, dport=self.dport, chksum=0) /
VXLAN(vni=vni, flags=self.flags) / VXLAN(vni=vni, flags=self.flags) /
@ -68,24 +69,19 @@ class TestVxlan(BridgeDomain, VppTestCase):
# Verify VNI # Verify VNI
self.assertEqual(pkt[VXLAN].vni, vni) self.assertEqual(pkt[VXLAN].vni, vni)
@staticmethod
def ip4_range(ip4n, s=10, e=20):
base = str(bytearray(ip4n)[:3])
return ((base + ip) for ip in str(bytearray(range(s, e))))
@classmethod @classmethod
def create_vxlan_flood_test_bd(cls, vni): def create_vxlan_flood_test_bd(cls, vni, n_ucast_tunnels):
# Create 10 ucast vxlan tunnels under bd # Create 10 ucast vxlan tunnels under bd
ip_range_start = 10 ip_range_start = 10
ip_range_end = 20 ip_range_end = ip_range_start + n_ucast_tunnels
next_hop_address = cls.pg0.remote_ip4n next_hop_address = cls.pg0.remote_ip4n
for dest_addr in cls.ip4_range(next_hop_address, ip_range_start, for dest_ip4n in ip4n_range(next_hop_address, ip_range_start,
ip_range_end): ip_range_end):
# add host route so dest_addr will not be resolved # add host route so dest_ip4n will not be resolved
cls.vapi.ip_add_del_route(dest_addr, 32, next_hop_address) cls.vapi.ip_add_del_route(dest_ip4n, 32, next_hop_address)
r = cls.vapi.vxlan_add_del_tunnel( r = cls.vapi.vxlan_add_del_tunnel(
src_addr=cls.pg0.local_ip4n, src_addr=cls.pg0.local_ip4n,
dst_addr=dest_addr, dst_addr=dest_ip4n,
vni=vni) vni=vni)
cls.vapi.sw_interface_set_l2_bridge(r.sw_if_index, bd_id=vni) cls.vapi.sw_interface_set_l2_bridge(r.sw_if_index, bd_id=vni)
@ -93,12 +89,12 @@ class TestVxlan(BridgeDomain, VppTestCase):
def add_del_mcast_load(cls, is_add): def add_del_mcast_load(cls, is_add):
ip_range_start = 10 ip_range_start = 10
ip_range_end = 210 ip_range_end = 210
for dest_addr in cls.ip4_range(cls.mcast_ip4n, ip_range_start, for dest_ip4n in ip4n_range(cls.mcast_ip4n, ip_range_start,
ip_range_end): ip_range_end):
vni = bytearray(dest_addr)[3] vni = bytearray(dest_ip4n)[3]
cls.vapi.vxlan_add_del_tunnel( cls.vapi.vxlan_add_del_tunnel(
src_addr=cls.pg0.local_ip4n, src_addr=cls.pg0.local_ip4n,
dst_addr=dest_addr, dst_addr=dest_ip4n,
mcast_sw_if_index=1, mcast_sw_if_index=1,
vni=vni, vni=vni,
is_add=is_add) is_add=is_add)
@ -139,7 +135,7 @@ class TestVxlan(BridgeDomain, VppTestCase):
cls.mcast_ip4 = '239.1.1.1' cls.mcast_ip4 = '239.1.1.1'
cls.mcast_ip4n = socket.inet_pton(socket.AF_INET, cls.mcast_ip4) cls.mcast_ip4n = socket.inet_pton(socket.AF_INET, cls.mcast_ip4)
iplong = atol(cls.mcast_ip4) iplong = atol(cls.mcast_ip4)
cls.mcast_mac4 = "01:00:5e:%02x:%02x:%02x" % ( cls.mcast_mac = "01:00:5e:%02x:%02x:%02x" % (
(iplong >> 16) & 0x7F, (iplong >> 8) & 0xFF, iplong & 0xFF) (iplong >> 16) & 0x7F, (iplong >> 8) & 0xFF, iplong & 0xFF)
# Create VXLAN VTEP on VPP pg0, and put vxlan_tunnel0 and pg1 # Create VXLAN VTEP on VPP pg0, and put vxlan_tunnel0 and pg1
@ -155,8 +151,10 @@ class TestVxlan(BridgeDomain, VppTestCase):
bd_id=cls.single_tunnel_bd) bd_id=cls.single_tunnel_bd)
# Setup vni 2 to test multicast flooding # Setup vni 2 to test multicast flooding
cls.n_ucast_tunnels = 10
cls.mcast_flood_bd = 2 cls.mcast_flood_bd = 2
cls.create_vxlan_flood_test_bd(cls.mcast_flood_bd) cls.create_vxlan_flood_test_bd(cls.mcast_flood_bd,
cls.n_ucast_tunnels)
r = cls.vapi.vxlan_add_del_tunnel( r = cls.vapi.vxlan_add_del_tunnel(
src_addr=cls.pg0.local_ip4n, src_addr=cls.pg0.local_ip4n,
dst_addr=cls.mcast_ip4n, dst_addr=cls.mcast_ip4n,
@ -173,7 +171,8 @@ class TestVxlan(BridgeDomain, VppTestCase):
# Setup vni 3 to test unicast flooding # Setup vni 3 to test unicast flooding
cls.ucast_flood_bd = 3 cls.ucast_flood_bd = 3
cls.create_vxlan_flood_test_bd(cls.ucast_flood_bd) cls.create_vxlan_flood_test_bd(cls.ucast_flood_bd,
cls.n_ucast_tunnels)
cls.vapi.sw_interface_set_l2_bridge(cls.pg3.sw_if_index, cls.vapi.sw_interface_set_l2_bridge(cls.pg3.sw_if_index,
bd_id=cls.ucast_flood_bd) bd_id=cls.ucast_flood_bd)
except Exception: except Exception:

View File

@ -34,6 +34,16 @@ def ppc(headline, capture, limit=10):
return "%s\n%s%s" % (headline, body, tail) return "%s\n%s%s" % (headline, body, tail)
def ip4_range(ip4, s, e):
tmp = ip4.rsplit('.', 1)[0]
return ("%s.%d" % (tmp, i) for i in range(s, e))
def ip4n_range(ip4n, s, e):
ip4 = socket.inet_ntop(socket.AF_INET, ip4n)
return (socket.inet_pton(socket.AF_INET, ip) for ip in ip4_range(ip4, s, e))
class NumericConstant(object): class NumericConstant(object):
__metaclass__ = ABCMeta __metaclass__ = ABCMeta