summaryrefslogtreecommitdiffstats
path: root/core/vswitch_controller_p2p.py
diff options
context:
space:
mode:
authorMartin Klozik <martinx.klozik@intel.com>2015-12-11 14:29:18 +0000
committerMaryam Tahhan <maryam.tahhan@intel.com>2016-01-21 09:40:34 +0000
commit7caf7a6be0fae6b341181b3e6286372e2e93b4b8 (patch)
tree2a8284cc39b85eb095a0c5a4763fd2e558d166c2 /core/vswitch_controller_p2p.py
parent2a3ff071bd08ff02610286a5ad4ba46690b6bc6b (diff)
testcase: scalability - configurable installation of flows to the vswitch
Stream specific flows can be pre-installed into the vswitch based on the value of testcase specific configuration option "Pre-installed Flows". In case, it is set to 'Yes', then specific flow for each stream will be inserted into the switch. Otherwise only generic flows will be installed. Default value of "Pre-installed Flows" is set to 'No'. Its value can be overridden by CLI parameter pre-installed_flows. This configuration parameter is an enhancement of "MultiSream" feature and it is ignored if "MultiStream" is disabled. Python module 'netaddr' is required by this implementation and it has been added to requirements.txt file. Change-Id: I8a17577a702bf2be2753134eb203b936a87fc2e5 JIRA: VSPERF-83 Signed-off-by: Martin Klozik <martinx.klozik@intel.com> Reviewed-by: Maryam Tahhan <maryam.tahhan@intel.com> Reviewed-by: Brian Castelli <brian.castelli@spirent.com>
Diffstat (limited to 'core/vswitch_controller_p2p.py')
-rw-r--r--core/vswitch_controller_p2p.py49
1 files changed, 47 insertions, 2 deletions
diff --git a/core/vswitch_controller_p2p.py b/core/vswitch_controller_p2p.py
index 236a443a..91c4e8a0 100644
--- a/core/vswitch_controller_p2p.py
+++ b/core/vswitch_controller_p2p.py
@@ -16,6 +16,7 @@
"""
import logging
+import netaddr
from core.vswitch_controller import IVswitchController
from conf import settings
@@ -24,6 +25,9 @@ _FLOW_TEMPLATE = {
'idle_timeout': '0'
}
+_PROTO_TCP = 6
+_PROTO_UDP = 17
+
class VswitchControllerP2P(IVswitchController):
"""VSwitch controller for P2P deployment scenario.
@@ -79,12 +83,12 @@ class VswitchControllerP2P(IVswitchController):
flow.update({'table':'1', 'priority':'1', 'in_port':'1',
'actions': ['write_actions(output:2)', 'write_metadata:2',
'goto_table:2']})
- self._vswitch.add_flow(bridge, flow)
+ self.process_flow_template(bridge, flow)
flow = flow_template.copy()
flow.update({'table':'1', 'priority':'1', 'in_port':'2',
'actions': ['write_actions(output:1)', 'write_metadata:1',
'goto_table:2']})
- self._vswitch.add_flow(bridge, flow)
+ self.process_flow_template(bridge, flow)
# Frame modification table. Frame modification flow rules are
# isolated in this table so that they can be turned on or off
@@ -129,3 +133,44 @@ class VswitchControllerP2P(IVswitchController):
"""See IVswitchController for description
"""
self._vswitch.dump_flows(settings.getValue('VSWITCH_BRIDGE_NAME'))
+
+ def process_flow_template(self, bridge, flow_template):
+ """Method adds flows into the vswitch based on given flow template
+ and configuration of multistream feature.
+ """
+ if ('pre_installed_flows' in self._traffic and
+ self._traffic['pre_installed_flows'].lower() == 'yes' and
+ 'multistream' in self._traffic and self._traffic['multistream'] > 0 and
+ 'stream_type' in self._traffic):
+ # multistream feature is enabled and flows should be inserted into OVS
+ # so generate flows based on template and multistream configuration
+ if self._traffic['stream_type'] == 'L2':
+ # iterate through destimation MAC address
+ dst_mac_value = netaddr.EUI(self._traffic['l2']['dstmac']).value
+ for i in range(int(self._traffic['multistream'])):
+ tmp_mac = netaddr.EUI(dst_mac_value + i)
+ tmp_mac.dialect = netaddr.mac_unix_expanded
+ flow_template.update({'dl_dst':tmp_mac})
+ # optimize flow insertion by usage of cache
+ self._vswitch.add_flow(bridge, flow_template, cache='on')
+ elif self._traffic['stream_type'] == 'L3':
+ # iterate through destimation IP address
+ dst_ip_value = netaddr.IPAddress(self._traffic['l3']['dstip']).value
+ for i in range(int(self._traffic['multistream'])):
+ tmp_ip = netaddr.IPAddress(dst_ip_value + i)
+ flow_template.update({'dl_type':'0x800', 'nw_dst':tmp_ip})
+ # optimize flow insertion by usage of cache
+ self._vswitch.add_flow(bridge, flow_template, cache='on')
+ elif self._traffic['stream_type'] == 'L4':
+ # read transport protocol from configuration and iterate through its destination port
+ proto = _PROTO_TCP if self._traffic['l3']['proto'].lower() == 'tcp' else _PROTO_UDP
+ for i in range(int(self._traffic['multistream'])):
+ flow_template.update({'dl_type':'0x800', 'nw_proto':proto, 'tp_dst':i})
+ # optimize flow insertion by usage of cache
+ self._vswitch.add_flow(bridge, flow_template, cache='on')
+ else:
+ self._logger.error('Stream type is set to uknown value %s', self._traffic['stream_type'])
+ # insert cached flows into the OVS
+ self._vswitch.add_flow(bridge, [], cache='flush')
+ else:
+ self._vswitch.add_flow(bridge, flow_template)