diff options
author | Martin Klozik <martinx.klozik@intel.com> | 2015-12-11 14:29:18 +0000 |
---|---|---|
committer | Maryam Tahhan <maryam.tahhan@intel.com> | 2016-01-21 09:40:34 +0000 |
commit | 7caf7a6be0fae6b341181b3e6286372e2e93b4b8 (patch) | |
tree | 2a8284cc39b85eb095a0c5a4763fd2e558d166c2 /core | |
parent | 2a3ff071bd08ff02610286a5ad4ba46690b6bc6b (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')
-rw-r--r-- | core/vswitch_controller_p2p.py | 49 |
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) |