From f8739e7feb9973550ef2fc69e6768b331e0ef28e Mon Sep 17 00:00:00 2001 From: Billy O'Mahony Date: Tue, 25 Aug 2015 11:35:28 +0100 Subject: Frame Modification: support remaining frame modification types. Only works for P2P. Other deployment scenarios will need to implement the same kind of multi-table flow as P2P to enable frame modification. Signed-off-by: Billy O'Mahony Reviewed-by: Maryam Tahhan Reviewed-by: Martin Klozik Reviewed-by: Radek Zetik Reviewed-by: Dino Madarang Change-Id: I2fa35972b90b165c00f0d0a7515fa275d0f17aa4 --- conf/01_testcases.conf | 3 ++ core/vswitch_controller_p2p.py | 4 --- testcases/testcase.py | 69 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 72 insertions(+), 4 deletions(-) diff --git a/conf/01_testcases.conf b/conf/01_testcases.conf index a95a4b54..cb4f9481 100755 --- a/conf/01_testcases.conf +++ b/conf/01_testcases.conf @@ -25,6 +25,9 @@ # "Deployment": "p2p", # One of the supported deployment scenarios. # "Description": "Lorem ipsum..." # Optional. A human-readable string # # describing the test. +# "Frame Modification": "vlan" # One of the supported frame modifications: +# # vlan, mpls, mac, dscp, ttl, ip_addr, +# # ip_port. # "biDirectional": [true|false], # Specifies if genearted traffic will be # # full-duplex (true) or half-duplex (false) # "MultiStream": 0-65535 # Optional. Defines number of flows simulated diff --git a/core/vswitch_controller_p2p.py b/core/vswitch_controller_p2p.py index f2ed73dd..a1158d4e 100644 --- a/core/vswitch_controller_p2p.py +++ b/core/vswitch_controller_p2p.py @@ -88,10 +88,6 @@ class VswitchControllerP2P(IVswitchController): # ovs-discuss 2015-06-30. flow = {'table':'3', 'priority':'1', 'actions': ['drop']} self._vswitch.add_flow(BRIDGE_NAME, flow) - - flow = add_ports_to_flow(_FLOW_TEMPLATE, phy2_number, phy1_number) - self._vswitch.add_flow(BRIDGE_NAME, flow) - except: self._vswitch.stop() raise diff --git a/testcases/testcase.py b/testcases/testcase.py index 7b349ece..3ea97c3a 100644 --- a/testcases/testcase.py +++ b/testcases/testcase.py @@ -93,13 +93,82 @@ class TestCase(object): 'multistream': self._multistream} vswitch = vswitch_ctl.get_vswitch() + # TODO BOM 15-08-07 the frame mod code assumes that the + # physical ports are ports 1 & 2. The actual numbers + # need to be retrived from the vSwitch and the metadata value + # updated accordingly. if self._frame_mod == "vlan": + # 0x8100 => VLAN ethertype + self._logger.debug(" **** VLAN ***** ") flow = {'table':'2', 'priority':'1000', 'metadata':'2', 'actions': ['push_vlan:0x8100', 'goto_table:3']} vswitch.add_flow('br0', flow) flow = {'table':'2', 'priority':'1000', 'metadata':'1', 'actions': ['push_vlan:0x8100', 'goto_table:3']} vswitch.add_flow('br0', flow) + elif self._frame_mod == "mpls": + # 0x8847 => MPLS unicast ethertype + self._logger.debug(" **** MPLS ***** ") + flow = {'table':'2', 'priority':'1000', 'metadata':'2', + 'actions': ['push_mpls:0x8847', 'goto_table:3']} + vswitch.add_flow('br0', flow) + flow = {'table':'2', 'priority':'1000', 'metadata':'1', + 'actions': ['push_mpls:0x8847', 'goto_table:3']} + vswitch.add_flow('br0', flow) + elif self._frame_mod == "mac": + flow = {'table':'2', 'priority':'1000', 'metadata':'2', + 'actions': ['mod_dl_src:22:22:22:22:22:22', 'goto_table:3']} + vswitch.add_flow('br0', flow) + flow = {'table':'2', 'priority':'1000', 'metadata':'1', + 'actions': ['mod_dl_src:11:11:11:11:11:11', 'goto_table:3']} + vswitch.add_flow('br0', flow) + elif self._frame_mod == "dscp": + # DSCP 184d == 0x4E<<2 => 'Expedited Forwarding' + flow = {'table':'2', 'priority':'1000', 'metadata':'2', + 'dl_type':'0x0800', + 'actions': ['mod_nw_tos:184', 'goto_table:3']} + vswitch.add_flow('br0', flow) + flow = {'table':'2', 'priority':'1000', 'metadata':'1', + 'dl_type':'0x0800', + 'actions': ['mod_nw_tos:184', 'goto_table:3']} + vswitch.add_flow('br0', flow) + elif self._frame_mod == "ttl": + # 251 and 241 are the highest prime numbers < 255 + flow = {'table':'2', 'priority':'1000', 'metadata':'2', + 'dl_type':'0x0800', + 'actions': ['mod_nw_ttl:251', 'goto_table:3']} + vswitch.add_flow('br0', flow) + flow = {'table':'2', 'priority':'1000', 'metadata':'1', + 'dl_type':'0x0800', + 'actions': ['mod_nw_ttl:241', 'goto_table:3']} + vswitch.add_flow('br0', flow) + elif self._frame_mod == "ip_addr": + flow = {'table':'2', 'priority':'1000', 'metadata':'2', + 'dl_type':'0x0800', + 'actions': ['mod_nw_src:10.10.10.10', + 'mod_nw_dst:20.20.20.20', 'goto_table:3']} + vswitch.add_flow('br0', flow) + flow = {'table':'2', 'priority':'1000', 'metadata':'1', + 'dl_type':'0x0800', + 'actions': ['mod_nw_src:20.20.20.20', + 'mod_nw_dst:10.10.10.10', 'goto_table:3']} + vswitch.add_flow('br0', flow) + elif self._frame_mod == "ip_port": + # TODO BOM 15-08-27 The traffic generated is assumed + # to be UDP (nw_proto 17d) which is the default case but + # we will need to pick up the actual traffic params in use. + flow = {'table':'2', 'priority':'1000', 'metadata':'2', + 'dl_type':'0x0800', 'nw_proto':'17', + 'actions': ['mod_tp_src:44444', + 'mod_tp_dst:44444', 'goto_table:3']} + vswitch.add_flow('br0', flow) + flow = {'table':'2', 'priority':'1000', 'metadata':'1', + 'dl_type':'0x0800', 'nw_proto':'17', + 'actions': ['mod_tp_src:44444', + 'mod_tp_dst:44444', 'goto_table:3']} + vswitch.add_flow('br0', flow) + else: + pass with traffic_ctl: traffic_ctl.send_traffic(traffic) -- cgit 1.2.3-korg