From f8739e7feb9973550ef2fc69e6768b331e0ef28e Mon Sep 17 00:00:00 2001
From: Billy O'Mahony <billy.o.mahony@intel.com>
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<billy.o.mahony@intel.com>
Reviewed-by: Maryam Tahhan <maryam.tahhan@intel.com>
Reviewed-by: Martin Klozik <martinx.klozik@intel.com>
Reviewed-by: Radek Zetik <radekx.zetik@intel.com>
Reviewed-by: Dino Madarang <dino.simeonx.madarang@intel.com>
Change-Id: I2fa35972b90b165c00f0d0a7515fa275d0f17aa4
---
 testcases/testcase.py | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 69 insertions(+)

(limited to 'testcases')

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