diff options
author | Dino Simeon Madarang <dino.simeonx.madarang@intel.com> | 2015-10-19 14:55:06 +0100 |
---|---|---|
committer | Maryam Tahhan <maryam.tahhan@intel.com> | 2016-02-03 10:17:04 +0000 |
commit | f463c563912abb806fe0d2fe85a4cf6825f416cc (patch) | |
tree | 0c588b1390b3333ecf262b4e39460ca2fc9d1d21 /vswitches | |
parent | 9685088224d2fe542026a6ecbc31a212e3dca3e9 (diff) |
Add OVS tunnel encapsulation performance test
Measure OVS DPDK and native VXLAN/GRE/GENEVE encapsulation performance.
This patch creates a new deployment scenario, Overlay_P2P.
The DUT is configured as a TEP (Tunnel Endpoint)
which performs encapsulation of frames and sends traffic to
the 2nd traffic generator port. The traffic generator in this
case receives an encapsulated frame. No decapsulation is performed
in this testcase.
Introduce a vsperf param, --run-integration, to filter tests to
integration tests. When running integration tests, variables defined
in the directory conf/integration/*conf as well as the conf/*.conf
are available.
This test case requires DPDK 2.1.0 and OVS master - 6bb4a18 or newer.
Change-Id: Ide2f418909d647119388df9b30d0d0a3656b4e53
JIRA: VSPERF-180
Signed-off-by: Dino Simeon Madarang <dino.simeonx.madarang@intel.com>
Reviewed-by: Maryam Tahhan <maryam.tahhan@intel.com>
Reviewed-by: Al Morton <acmorton@att.com>
Diffstat (limited to 'vswitches')
-rw-r--r-- | vswitches/ovs_dpdk_vhost.py | 50 | ||||
-rw-r--r-- | vswitches/ovs_vanilla.py | 49 | ||||
-rw-r--r-- | vswitches/vswitch.py | 28 |
3 files changed, 114 insertions, 13 deletions
diff --git a/vswitches/ovs_dpdk_vhost.py b/vswitches/ovs_dpdk_vhost.py index 2c7b81ff..074e15f8 100644 --- a/vswitches/ovs_dpdk_vhost.py +++ b/vswitches/ovs_dpdk_vhost.py @@ -1,4 +1,4 @@ -# Copyright 2015 Intel Corporation. +# Copyright 2015-2016 Intel Corporation. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -21,7 +21,7 @@ from vswitches.vswitch import IVSwitch from src.ovs import VSwitchd, OFBridge from src.dpdk import dpdk -_VSWITCHD_CONST_ARGS = ['--', '--log-file'] +_VSWITCHD_CONST_ARGS = ['--', '--pidfile', '--log-file'] class OvsDpdkVhost(IVSwitch): """VSwitch implementation using DPDK and vhost ports @@ -77,7 +77,7 @@ class OvsDpdkVhost(IVSwitch): 'datapath_type=netdev']) else: bridge.create(['--', 'set', 'bridge', switch_name, - 'datapath_type=netdev'] + params) + 'datapath_type=netdev'] + params) bridge.set_db_attribute('Open_vSwitch', '.', 'other_config:max-idle', @@ -106,7 +106,7 @@ class OvsDpdkVhost(IVSwitch): The new port is named dpdk<n> where n is an integer starting from 0. """ bridge = self._bridges[switch_name] - dpdk_count = self._get_port_count(bridge, 'type=dpdk') + dpdk_count = self._get_port_count('type=dpdk') port_name = 'dpdk' + str(dpdk_count) params = ['--', 'set', 'Interface', port_name, 'type=dpdk'] of_port = bridge.add_port(port_name, params) @@ -123,11 +123,11 @@ class OvsDpdkVhost(IVSwitch): bridge = self._bridges[switch_name] # Changed dpdkvhost to dpdkvhostuser to be able to run in Qemu 2.2 if settings.getValue('VNF').endswith('Cuse'): - vhost_count = self._get_port_count(bridge, 'type=dpdkvhostcuse') + vhost_count = self._get_port_count('type=dpdkvhostcuse') port_name = 'dpdkvhostcuse' + str(vhost_count) params = ['--', 'set', 'Interface', port_name, 'type=dpdkvhostcuse'] else: - vhost_count = self._get_port_count(bridge, 'type=dpdkvhostuser') + vhost_count = self._get_port_count('type=dpdkvhostuser') port_name = 'dpdkvhostuser' + str(vhost_count) params = ['--', 'set', 'Interface', port_name, 'type=dpdkvhostuser'] @@ -135,6 +135,17 @@ class OvsDpdkVhost(IVSwitch): return (port_name, of_port) + def add_tunnel_port(self, switch_name, remote_ip, tunnel_type='vxlan'): + """Creates tunneling port + """ + bridge = self._bridges[switch_name] + pcount = str(self._get_port_count('type=' + tunnel_type)) + port_name = tunnel_type + pcount + params = ['--', 'set', 'Interface', port_name, 'type=' + tunnel_type, + 'options:remote_ip=' + remote_ip] + of_port = bridge.add_port(port_name, params) + return (port_name, of_port) + def get_ports(self, switch_name): """See IVswitch for general description """ @@ -167,14 +178,31 @@ class OvsDpdkVhost(IVSwitch): bridge = self._bridges[switch_name] bridge.dump_flows() - @staticmethod - def _get_port_count(bridge, param): + def add_route(self, switch_name, network, destination): + """See IVswitch for general description + """ + bridge = self._bridges[switch_name] + bridge.add_route(network, destination) + + def set_tunnel_arp(self, ip_addr, mac_addr, switch_name): + """See IVswitch for general description + """ + bridge = self._bridges[switch_name] + bridge.set_tunnel_arp(ip_addr, mac_addr, switch_name) + + def _get_port_count(self, param): """Returns the number of ports having a certain parameter :param bridge: The src.ovs.ofctl.OFBridge on which to operate :param param: The parameter to search for :returns: Count of matches """ - port_params = [c for (_, (_, c)) in list(bridge.get_ports().items())] - param_hits = [i for i in port_params if param in i] - return len(param_hits) + cnt = 0 + for k in self._bridges: + pparams = [c for (_, (_, c)) in list(self._bridges[k].get_ports().items())] + phits = [i for i in pparams if param in i] + cnt += len(phits) + + if cnt is None: + cnt = 0 + return cnt diff --git a/vswitches/ovs_vanilla.py b/vswitches/ovs_vanilla.py index 3078de02..77d3deaf 100644 --- a/vswitches/ovs_vanilla.py +++ b/vswitches/ovs_vanilla.py @@ -1,4 +1,4 @@ -# Copyright 2015 Intel Corporation. +# Copyright 2015-2016 Intel Corporation. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -150,6 +150,22 @@ class OvsVanilla(IVSwitch): of_port = bridge.add_port(tap_name, []) return (tap_name, of_port) + def add_tunnel_port(self, switch_name, remote_ip, tunnel_type='vxlan', + params=None): + """Creates tunneling port + """ + bridge = self._bridges[switch_name] + pcount = str(self._get_port_count('type=' + tunnel_type)) + port_name = tunnel_type + pcount + local_params = ['--', 'set', 'Interface', port_name, + 'type=' + tunnel_type, + 'options:remote_ip=' + remote_ip] + + if params is not None: + local_params = local_params + params + + of_port = bridge.add_port(port_name, local_params) + return (port_name, of_port) def get_ports(self, switch_name): """See IVswitch for general description @@ -182,3 +198,34 @@ class OvsVanilla(IVSwitch): """ bridge = self._bridges[switch_name] bridge.dump_flows() + + def add_route(self, switch_name, network, destination): + """See IVswitch for general description + """ + bridge = self._bridges[switch_name] + bridge.add_route(network, destination) + + def set_tunnel_arp(self, ip_addr, mac_addr, switch_name): + """See IVswitch for general description + """ + bridge = self._bridges[switch_name] + bridge.set_tunnel_arp(ip_addr, mac_addr, switch_name) + + def _get_port_count(self, param): + """Returns the number of ports having a certain parameter + + :param bridge: The src.ovs.ofctl.OFBridge on which to operate + :param param: The parameter to search for + :returns: Count of matches + """ + cnt = 0 + for k in self._bridges: + pparams = [c for (_, (_, c)) in list(self._bridges[k].get_ports().items())] + phits = [i for i in pparams if param in i] + cnt += len(phits) + + if cnt is None: + cnt = 0 + return cnt + + diff --git a/vswitches/vswitch.py b/vswitches/vswitch.py index a28c0f6b..73e0a0c3 100644 --- a/vswitches/vswitch.py +++ b/vswitches/vswitch.py @@ -1,4 +1,4 @@ -# Copyright 2015 Intel Corporation. +# Copyright 2015-2016 Intel Corporation. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -71,6 +71,14 @@ class IVSwitch(object): """ raise NotImplementedError() + def add_tunnel_port(self, switch_name, remote_ip, tunnel_type, params=None): + """Create a new port to the logical switch for tunneling + + :param switch_name: The switch where the port is attached to + :returns: (port name, OpenFlow port number) + """ + raise NotImplementedError() + def get_ports(self, switch_name): """Return a list of tuples describing the ports of the logical switch @@ -128,3 +136,21 @@ class IVSwitch(object): :param switch_name: The switch on which to operate """ raise NotImplementedError() + + def add_route(self, switch_name, network, destination): + """Add a route for tunneling routing table + + :param switch_name: The switch on which to operate + :param network: Target destination network + :param destination: Gateway IP + """ + raise NotImplementedError() + + def set_tunnel_arp(self, ip_addr, mac_addr, switch_name): + """Add arp entry for tunneling + + :param ip_addr: IP of bridge + :param mac_addr: MAC address of the bridge + :param switch_name: Name of the bridge + """ + raise NotImplementedError() |