From 71275e3d1ed4b7a536b7ec8d13995743beccde6b Mon Sep 17 00:00:00 2001 From: Neale Ranns Date: Thu, 25 May 2017 12:38:58 -0700 Subject: MPLS hash function improvements Change-Id: I28e98f445c01493562b6196a4f5b532a51f178af Signed-off-by: Neale Ranns --- test/test_ip4.py | 61 +++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 43 insertions(+), 18 deletions(-) (limited to 'test/test_ip4.py') diff --git a/test/test_ip4.py b/test/test_ip4.py index 3fe61e26..ddfd2187 100644 --- a/test/test_ip4.py +++ b/test/test_ip4.py @@ -6,12 +6,13 @@ import unittest from framework import VppTestCase, VppTestRunner from vpp_sub_interface import VppSubInterface, VppDot1QSubint, VppDot1ADSubint from vpp_ip_route import VppIpRoute, VppRoutePath, VppIpMRoute, \ - VppMRoutePath, MRouteItfFlags, MRouteEntryFlags + VppMRoutePath, MRouteItfFlags, MRouteEntryFlags, VppMplsIpBind from scapy.packet import Raw from scapy.layers.l2 import Ether, Dot1Q, ARP from scapy.layers.inet import IP, UDP, ICMP, icmptypes, icmpcodes from util import ppp +from scapy.contrib.mpls import MPLS class TestIPv4(VppTestCase): @@ -778,10 +779,12 @@ class TestIPLoadBalance(VppTestCase): i.admin_up() i.config_ip4() i.resolve_arp() + i.enable_mpls() def tearDown(self): super(TestIPLoadBalance, self).tearDown() for i in self.pg_interfaces: + i.disable_mpls() i.unconfig_ip4() i.admin_down() @@ -799,24 +802,37 @@ class TestIPLoadBalance(VppTestCase): # # An array of packets that differ only in the destination port # - port_pkts = [] + port_ip_pkts = [] + port_mpls_pkts = [] # # An array of packets that differ only in the source address # - src_pkts = [] + src_ip_pkts = [] + src_mpls_pkts = [] for ii in range(65): - port_pkts.append((Ether(src=self.pg0.remote_mac, - dst=self.pg0.local_mac) / - IP(dst="10.0.0.1", src="20.0.0.1") / - UDP(sport=1234, dport=1234 + ii) / - Raw('\xa5' * 100))) - src_pkts.append((Ether(src=self.pg0.remote_mac, - dst=self.pg0.local_mac) / - IP(dst="10.0.0.1", src="20.0.0.%d" % ii) / - UDP(sport=1234, dport=1234) / - Raw('\xa5' * 100))) + port_ip_hdr = (IP(dst="10.0.0.1", src="20.0.0.1") / + UDP(sport=1234, dport=1234 + ii) / + Raw('\xa5' * 100)) + port_ip_pkts.append((Ether(src=self.pg0.remote_mac, + dst=self.pg0.local_mac) / + port_ip_hdr)) + port_mpls_pkts.append((Ether(src=self.pg0.remote_mac, + dst=self.pg0.local_mac) / + MPLS(label=66, ttl=2) / + port_ip_hdr)) + + src_ip_hdr = (IP(dst="10.0.0.1", src="20.0.0.%d" % ii) / + UDP(sport=1234, dport=1234) / + Raw('\xa5' * 100)) + src_ip_pkts.append((Ether(src=self.pg0.remote_mac, + dst=self.pg0.local_mac) / + src_ip_hdr)) + src_mpls_pkts.append((Ether(src=self.pg0.remote_mac, + dst=self.pg0.local_mac) / + MPLS(label=66, ttl=2) / + src_ip_hdr)) route_10_0_0_1 = VppIpRoute(self, "10.0.0.1", 32, [VppRoutePath(self.pg1.remote_ip4, @@ -825,6 +841,9 @@ class TestIPLoadBalance(VppTestCase): self.pg2.sw_if_index)]) route_10_0_0_1.add_vpp_config() + binding = VppMplsIpBind(self, 66, "10.0.0.1", 32) + binding.add_vpp_config() + # # inject the packet on pg0 - expect load-balancing across the 2 paths # - since the default hash config is to use IP src,dst and port @@ -834,9 +853,13 @@ class TestIPLoadBalance(VppTestCase): # be guaranteed. But wuth 64 different packets we do expect some # balancing. So instead just ensure there is traffic on each link. # - self.send_and_expect_load_balancing(self.pg0, port_pkts, + self.send_and_expect_load_balancing(self.pg0, port_ip_pkts, [self.pg1, self.pg2]) - self.send_and_expect_load_balancing(self.pg0, src_pkts, + self.send_and_expect_load_balancing(self.pg0, src_ip_pkts, + [self.pg1, self.pg2]) + self.send_and_expect_load_balancing(self.pg0, port_mpls_pkts, + [self.pg1, self.pg2]) + self.send_and_expect_load_balancing(self.pg0, src_mpls_pkts, [self.pg1, self.pg2]) # @@ -846,14 +869,16 @@ class TestIPLoadBalance(VppTestCase): # self.vapi.set_ip_flow_hash(0, src=1, dst=1, sport=0, dport=0) - self.send_and_expect_load_balancing(self.pg0, src_pkts, + self.send_and_expect_load_balancing(self.pg0, src_ip_pkts, + [self.pg1, self.pg2]) + self.send_and_expect_load_balancing(self.pg0, src_mpls_pkts, [self.pg1, self.pg2]) - self.pg0.add_stream(port_pkts) + self.pg0.add_stream(port_ip_pkts) self.pg_enable_capture(self.pg_interfaces) self.pg_start() - rx = self.pg2.get_capture(len(port_pkts)) + rx = self.pg2.get_capture(len(port_ip_pkts)) # # change the flow hash config back to defaults -- cgit 1.2.3-korg