Merge remote-tracking branch 'upstream/master'
diff --git a/cassandra.titan b/cassandra.titan
index 6c6670f..c36ecc0 100644
--- a/cassandra.titan
+++ b/cassandra.titan
@@ -3,3 +3,5 @@
storage.keyspace=onos
storage.connection-pool-size=4096
storage.replication-factor=3
+storage.write-consistency-level=ALL
+storage.read-consistency-level=ONE
diff --git a/cassandra.titan.nothrift b/cassandra.titan.nothrift
new file mode 100644
index 0000000..04f9fd7
--- /dev/null
+++ b/cassandra.titan.nothrift
@@ -0,0 +1,7 @@
+storage.backend=cassandra
+storage.hostname=localhost
+storage.keyspace=onos
+storage.connection-pool-size=4096
+storage.replication-factor=3
+storage.write-consistency-level=ALL
+storage.read-consistency-level=ONE
diff --git a/cluster-mgmt/bin/demo-reset-hw.sh b/cluster-mgmt/bin/demo-reset-hw.sh
new file mode 100755
index 0000000..c5101a1
--- /dev/null
+++ b/cluster-mgmt/bin/demo-reset-hw.sh
@@ -0,0 +1,17 @@
+#! /bin/bash
+DIR=${HOME}/ONOS
+$DIR/scripts/all-linkup-hw.sh
+$DIR/web/delete_flow.py 201 300
+$DIR/web/clean_flow.py 201 300
+$DIR/web/add_flow.py -m onos -f $DIR/web/flowdef_demo_start.txt
+onos stop 5
+onos stop 7
+for i in 1 2 3 4 6 8; do
+ status=`onos status $i | grep instance | awk '{print $2}'`
+ echo "onos $i status $status"
+ if [ x$status == "x0" ]; then
+ onos start $i
+ fi
+done
+sleep 2
+switch local
diff --git a/cluster-mgmt/bin/demo-scale-out-hw.sh b/cluster-mgmt/bin/demo-scale-out-hw.sh
new file mode 100755
index 0000000..eb06c56
--- /dev/null
+++ b/cluster-mgmt/bin/demo-scale-out-hw.sh
@@ -0,0 +1,7 @@
+#! /bin/bash
+onos start 5
+onos start 7
+sleep 2
+cd ONOS/web; ./add_flow.py -m onos -f flowdef_demo_add.txt
+sleep 3
+switch all
diff --git a/scripts/runiperf.sh b/scripts/runiperf.sh
index 3df4fb0..7066bc6 100755
--- a/scripts/runiperf.sh
+++ b/scripts/runiperf.sh
@@ -4,14 +4,15 @@
# Usage: flowid src_dpid dst_dpid params
def usage():
- print "%s flowid src_dpid dst_dpid svr|client <proto>/<duration>/<interval>/<samples>" % sys.argv[0]
+ print "%s flowid src_dpid dst_dpid hw:svr|sw:svr|hw:client|sw:client <proto>/<duration>/<interval>/<samples>" % sys.argv[0]
sys.exit()
def main():
flowid = sys.argv[1]
src_dpid = sys.argv[2]
dst_dpid = sys.argv[3]
- server = sys.argv[4].upper()[0]
+ (testbed,server) = sys.argv[4].upper().split(':')
+ server = server[0]
params = sys.argv[5].split('/')
proto = params[0]
duration = params[1]
@@ -24,23 +25,27 @@
dst_hostid=int(dst_dpid.split(':')[-1], 16)
if (proto == "tcp"):
-# cmd="ssh -o StrictHostKeyChecking=no 1.1.%d.1 '/home/ubuntu/ONOS/scripts/iperf -t%s -i%s -k%s -yJ -o /home/ubuntu/ONOS/web/log/iperf_%s.out -c 192.168.%d.%d 2>&1 &' &" % (src_hostid, duration, interval, samples, flowid, dst_nwid, dst_hostid)
- cmd="${HOME}/ONOS/test-network/mininet/mrun host%d \'/home/ubuntu/ONOS/scripts/iperf -t%s -i%s -k%s -yJ -o /home/ubuntu/ONOS/web/log/iperf_%s.out -c 192.168.%d.%d 2>&1 &\' &" % (src_hostid, duration, interval, samples, flowid, dst_nwid, dst_hostid)
- killcmd='sudo pkill -KILL -f \"iperf .* -o .*/iperf_%s.out\"' % (flowid)
- print killcmd
- print cmd
- os.popen(killcmd)
- os.popen(cmd)
+ if (testbed == "SW"):
+ cmd="ssh -o StrictHostKeyChecking=no 1.1.%d.1 '/home/ubuntu/ONOS/scripts/iperf -t%s -i%s -k%s -yJ -o /home/ubuntu/ONOS/web/log/iperf_%s.out -c 192.168.%d.%d 2>&1 &' &" % (src_hostid, duration, interval, samples, flowid, dst_nwid, dst_hostid)
+ killcmd='sudo pkill -KILL -f \"iperf .* -o .*/iperf_%s.out\"' % (flowid)
+ print killcmd
+ print cmd
+ os.popen(killcmd)
+ os.popen(cmd)
else:
if (server == 'S'):
-# cmd="ssh -o StrictHostKeyChecking=no 1.1.%d.1 '/home/ubuntu/ONOS/scripts/iperf -us -i%s -k%s -yJ -o /home/ubuntu/ONOS/web/log/iperfsvr_%s.out 2>&1 &' &" % (dst_hostid, interval, samples, flowid)
- cmd="${HOME}/ONOS/test-network/mininet/mrun host%d \'/home/ubuntu/ONOS/scripts/iperf -us -i%s -k%s -yJ -o /home/ubuntu/ONOS/web/log/iperfsvr_%s.out 2>&1 &\' &" % (dst_hostid, interval, samples, flowid)
+ if (testbed == "SW"):
+ cmd="ssh -o StrictHostKeyChecking=no 1.1.%d.1 '/home/ubuntu/ONOS/scripts/iperf -us -i%s -k%s -yJ -o /home/ubuntu/ONOS/web/log/iperfsvr_%s.out 2>&1 &' &" % (dst_hostid, interval, samples, flowid)
+ else:
+ cmd="~/mininet/util/m g%sh%02d '/home/ubuntu/ONOS/scripts/iperf -us -i%s -k%s -yJ -o /home/ubuntu/ONOS/web/log/iperfsvr_%s.out 2>&1 &' &" % (dst_nwid, dst_hostid, interval, samples, flowid)
killcmd='sudo pkill -KILL -f \"iperf .* -o .*/iperfsvr_%s.out\"' % (flowid)
print killcmd
print cmd
else:
- cmd="${HOME}/ONOS/test-network/mininet/mrun host%d \'/home/ubuntu/ONOS/scripts/iperf -l 1000 -u -t%s -i%s -k%s -yJ -o /home/ubuntu/ONOS/web/log/iperfclient_%s.out -c 192.168.%d.%d 2>&1 &\' &" % (src_hostid, duration, interval, samples, flowid, dst_nwid, dst_hostid)
-# cmd="ssh -o StrictHostKeyChecking=no 1.1.%d.1 '/home/ubuntu/ONOS/scripts/iperf -l 1000 -u -t%s -i%s -k%s -yJ -o /home/ubuntu/ONOS/web/log/iperfclient_%s.out -c 192.168.%d.%d 2>&1 &' &" % (src_hostid, duration, interval, samples, flowid, dst_nwid, dst_hostid)
+ if (testbed == "SW"):
+ cmd="ssh -o StrictHostKeyChecking=no 1.1.%d.1 '/home/ubuntu/ONOS/scripts/iperf -u -t%s -i%s -k%s -yJ -o /home/ubuntu/ONOS/web/log/iperfclient_%s.out -c 192.168.%d.%d 2>&1 &' &" % (src_hostid, duration, interval, samples, flowid, dst_nwid, dst_hostid)
+ else:
+ cmd="~/mininet/util/m g%sh%02d '/home/ubuntu/ONOS/scripts/iperf -u -t%s -i%s -k%s -yJ -o /home/ubuntu/ONOS/web/log/iperfclient_%s.out -c 192.168.%d.%d 2>&1 &' &" % (src_nwid, src_hostid, duration, interval, samples, flowid, dst_nwid, dst_hostid + 1)
killcmd='sudo pkill -KILL -f \"iperf .* -o .*/iperfclient_%s.out\"' % (flowid)
print killcmd
print cmd
diff --git a/src/main/java/net/floodlightcontroller/core/web/ClearFlowTableResource.java b/src/main/java/net/floodlightcontroller/core/web/ClearFlowTableResource.java
new file mode 100644
index 0000000..c2d2eb4
--- /dev/null
+++ b/src/main/java/net/floodlightcontroller/core/web/ClearFlowTableResource.java
@@ -0,0 +1,55 @@
+package net.floodlightcontroller.core.web;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import net.floodlightcontroller.core.IFloodlightProviderService;
+import net.floodlightcontroller.core.IOFSwitch;
+
+import org.codehaus.jackson.map.ObjectMapper;
+import org.openflow.util.HexString;
+import org.restlet.resource.Post;
+import org.restlet.resource.ServerResource;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ClearFlowTableResource extends ServerResource {
+ static Logger log = LoggerFactory.getLogger(ClearFlowTableResource.class);
+
+ @Post("json")
+ public List<String> ClearFlowTable(String jsonData){
+ IFloodlightProviderService floodlightProvider =
+ (IFloodlightProviderService) getContext().getAttributes()
+ .get(IFloodlightProviderService.class.getCanonicalName());
+
+ Map<Long, IOFSwitch> switches = floodlightProvider.getSwitches();
+
+ List<String> response = new ArrayList<String>();
+ ObjectMapper mapper = new ObjectMapper();
+ String[] dpids = null;
+ try {
+ dpids = mapper.readValue(jsonData, String[].class);
+ } catch (IOException e) {
+ log.debug("Error parsing switch dpid array: {}", e.getMessage());
+ response.add("Error parsing input");
+ return response;
+ }
+
+
+ for (String dpid : dpids){
+ IOFSwitch sw = switches.get(HexString.toLong(dpid));
+ if (sw != null){
+ sw.clearAllFlowMods();
+ response.add(dpid + " cleared");
+ }
+ else {
+ response.add(dpid + " not found");
+ }
+ }
+
+ return response;
+ }
+
+}
diff --git a/src/main/java/net/floodlightcontroller/core/web/CoreWebRoutable.java b/src/main/java/net/floodlightcontroller/core/web/CoreWebRoutable.java
index c110651..2bb39ef 100644
--- a/src/main/java/net/floodlightcontroller/core/web/CoreWebRoutable.java
+++ b/src/main/java/net/floodlightcontroller/core/web/CoreWebRoutable.java
@@ -65,6 +65,7 @@
router.attach("/topology/switches/{filter}/json", TopoSwitchesResource.class);
router.attach("/topology/links/json", TopoLinksResource.class);
router.attach("/topology/devices/json", TopoDevicesResource.class);
+ router.attach("/clearflowtable/json", ClearFlowTableResource.class);
return router;
}
}
diff --git a/src/main/java/net/floodlightcontroller/flowcache/FlowManager.java b/src/main/java/net/floodlightcontroller/flowcache/FlowManager.java
index 4de2cbc..c562556 100644
--- a/src/main/java/net/floodlightcontroller/flowcache/FlowManager.java
+++ b/src/main/java/net/floodlightcontroller/flowcache/FlowManager.java
@@ -7,15 +7,12 @@
import java.util.Comparator;
import java.util.EnumSet;
import java.util.HashMap;
-import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Random;
-import java.util.TreeMap;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
import net.floodlightcontroller.core.IFloodlightProviderService;
@@ -59,7 +56,6 @@
import org.openflow.protocol.OFType;
import org.openflow.protocol.action.OFAction;
import org.openflow.protocol.action.OFActionOutput;
-import org.openflow.util.HexString;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -69,8 +65,8 @@
public GraphDBConnection conn;
protected IRestApiService restApi;
- protected IFloodlightProviderService floodlightProvider;
- protected ITopoRouteService topoRouteService;
+ protected volatile IFloodlightProviderService floodlightProvider;
+ protected volatile ITopoRouteService topoRouteService;
protected FloodlightModuleContext context;
protected OFMessageDamper messageDamper;
@@ -99,14 +95,21 @@
private static Logger log = LoggerFactory.getLogger(FlowManager.class);
// The periodic task(s)
- private final ScheduledExecutorService mapReaderScheduler =
- Executors.newScheduledThreadPool(1);
-
- private final ScheduledExecutorService shortestPathReconcileScheduler =
- Executors.newScheduledThreadPool(1);
+ private ScheduledExecutorService mapReaderScheduler;
+ private ScheduledExecutorService shortestPathReconcileScheduler;
final Runnable mapReader = new Runnable() {
public void run() {
+ try {
+ runImpl();
+ } catch (Exception e) {
+ log.debug("Exception processing All Flow Entries from the Network MAP: ", e);
+ conn.endTx(Transaction.ROLLBACK);
+ return;
+ }
+ }
+
+ private void runImpl() {
long startTime = System.nanoTime();
int counterAllFlowEntries = 0;
int counterMyNotUpdatedFlowEntries = 0;
@@ -243,6 +246,16 @@
final Runnable shortestPathReconcile = new Runnable() {
public void run() {
+ try {
+ runImpl();
+ } catch (Exception e) {
+ log.debug("Exception processing All Flows from the Network MAP: ", e);
+ conn.endTx(Transaction.ROLLBACK);
+ return;
+ }
+ }
+
+ private void runImpl() {
long startTime = System.nanoTime();
int counterAllFlowPaths = 0;
int counterMyFlowPaths = 0;
@@ -386,15 +399,15 @@
}
};
- final ScheduledFuture<?> mapReaderHandle =
- mapReaderScheduler.scheduleAtFixedRate(mapReader, 3, 3, TimeUnit.SECONDS);
+ //final ScheduledFuture<?> mapReaderHandle =
+ //mapReaderScheduler.scheduleAtFixedRate(mapReader, 3, 3, TimeUnit.SECONDS);
- final ScheduledFuture<?> shortestPathReconcileHandle =
- shortestPathReconcileScheduler.scheduleAtFixedRate(shortestPathReconcile, 3, 3, TimeUnit.SECONDS);
+ //final ScheduledFuture<?> shortestPathReconcileHandle =
+ //shortestPathReconcileScheduler.scheduleAtFixedRate(shortestPathReconcile, 3, 3, TimeUnit.SECONDS);
@Override
public void init(String conf) {
- conn = GraphDBConnection.getInstance(conf);
+ conn = GraphDBConnection.getInstance(conf);
}
public void finalize() {
@@ -449,6 +462,9 @@
// TODO: An ugly hack!
String conf = "/tmp/cassandra.titan";
this.init(conf);
+
+ mapReaderScheduler = Executors.newScheduledThreadPool(1);
+ shortestPathReconcileScheduler = Executors.newScheduledThreadPool(1);
}
private long getNextFlowEntryId() {
@@ -471,10 +487,15 @@
@Override
public void startUp(FloodlightModuleContext context) {
- restApi.addRestletRoutable(new FlowWebRoutable());
-
- // Initialize the Flow Entry ID generator
- nextFlowEntryIdPrefix = randomGenerator.nextInt();
+ restApi.addRestletRoutable(new FlowWebRoutable());
+
+ // Initialize the Flow Entry ID generator
+ nextFlowEntryIdPrefix = randomGenerator.nextInt();
+
+ mapReaderScheduler.scheduleAtFixedRate(
+ mapReader, 3, 3, TimeUnit.SECONDS);
+ shortestPathReconcileScheduler.scheduleAtFixedRate(
+ shortestPathReconcile, 3, 3, TimeUnit.SECONDS);
}
/**
diff --git a/web/clear_core.py b/web/clear_core.py
new file mode 100755
index 0000000..ea3e964
--- /dev/null
+++ b/web/clear_core.py
@@ -0,0 +1,33 @@
+#! /usr/bin/env python
+
+import os
+import json
+
+CONFIG_FILE=os.getenv("HOME") + "/ONOS/web/config.json"
+
+def read_config():
+ global LB, TESTBED, controllers, core_switches, ONOS_GUI3_HOST, ONOS_GUI3_CONTROL_HOST
+ f = open(CONFIG_FILE)
+ conf = json.load(f)
+ LB = conf['LB']
+ TESTBED = conf['TESTBED']
+ controllers = conf['controllers']
+ core_switches=conf['core_switches']
+ ONOS_GUI3_HOST=conf['ONOS_GUI3_HOST']
+ ONOS_GUI3_CONTROL_HOST=conf['ONOS_GUI3_CONTROL_HOST']
+ f.close()
+
+if __name__ == "__main__":
+ onos_rest_port = 8080
+ read_config()
+
+ try:
+ sw_list = json.dumps(core_switches)
+ command = "curl -s -H 'Content-Type: application/json' -d '%s' http://%s:%s/wm/core/clearflowtable/json" % (sw_list, controllers[0], onos_rest_port)
+
+ print command
+ result = os.popen(command).read()
+ print result
+ except:
+ print "REST IF has issue"
+ exit
diff --git a/web/flowdef_demo_add.txt b/web/flowdef_demo_add.txt
new file mode 100644
index 0000000..7ef2fbb
--- /dev/null
+++ b/web/flowdef_demo_add.txt
@@ -0,0 +1,61 @@
+# Demo flow scale down
+201 ps_101_1 00:00:00:00:00:00:05:01 1 00:00:00:00:00:00:02:01 1 matchSrcMac 00:00:c0:a8:05:01 matchDstMac 00:00:c0:a8:02:01
+202 ps_101_2 00:00:00:00:00:00:02:01 1 00:00:00:00:00:00:05:01 1 matchSrcMac 00:00:c0:a8:02:01 matchDstMac 00:00:c0:a8:05:01
+203 ps_102_1 00:00:00:00:00:00:05:02 1 00:00:00:00:00:00:02:02 1 matchSrcMac 00:00:c0:a8:05:02 matchDstMac 00:00:c0:a8:02:02
+204 ps_102_2 00:00:00:00:00:00:02:02 1 00:00:00:00:00:00:05:02 1 matchSrcMac 00:00:c0:a8:02:02 matchDstMac 00:00:c0:a8:05:02
+205 ps_103_1 00:00:00:00:00:00:05:03 1 00:00:00:00:00:00:02:03 1 matchSrcMac 00:00:c0:a8:05:03 matchDstMac 00:00:c0:a8:02:03
+206 ps_103_2 00:00:00:00:00:00:02:03 1 00:00:00:00:00:00:05:03 1 matchSrcMac 00:00:c0:a8:02:03 matchDstMac 00:00:c0:a8:05:03
+207 ps_104_1 00:00:00:00:00:00:05:01 1 00:00:00:00:00:00:03:01 1 matchSrcMac 00:00:c0:a8:05:01 matchDstMac 00:00:c0:a8:03:01
+208 ps_104_2 00:00:00:00:00:00:03:01 1 00:00:00:00:00:00:05:01 1 matchSrcMac 00:00:c0:a8:03:01 matchDstMac 00:00:c0:a8:05:01
+209 ps_105_1 00:00:00:00:00:00:05:02 1 00:00:00:00:00:00:03:02 1 matchSrcMac 00:00:c0:a8:05:02 matchDstMac 00:00:c0:a8:03:02
+210 ps_105_2 00:00:00:00:00:00:03:02 1 00:00:00:00:00:00:05:02 1 matchSrcMac 00:00:c0:a8:03:02 matchDstMac 00:00:c0:a8:05:02
+211 ps_106_1 00:00:00:00:00:00:05:03 1 00:00:00:00:00:00:03:03 1 matchSrcMac 00:00:c0:a8:05:03 matchDstMac 00:00:c0:a8:03:03
+212 ps_106_2 00:00:00:00:00:00:03:03 1 00:00:00:00:00:00:05:03 1 matchSrcMac 00:00:c0:a8:03:03 matchDstMac 00:00:c0:a8:05:03
+213 ps_107_1 00:00:00:00:00:00:05:01 1 00:00:00:00:00:00:04:01 1 matchSrcMac 00:00:c0:a8:05:01 matchDstMac 00:00:c0:a8:04:01
+214 ps_107_2 00:00:00:00:00:00:04:01 1 00:00:00:00:00:00:05:01 1 matchSrcMac 00:00:c0:a8:04:01 matchDstMac 00:00:c0:a8:05:01
+215 ps_108_1 00:00:00:00:00:00:05:02 1 00:00:00:00:00:00:04:02 1 matchSrcMac 00:00:c0:a8:05:02 matchDstMac 00:00:c0:a8:04:02
+216 ps_108_2 00:00:00:00:00:00:04:02 1 00:00:00:00:00:00:05:02 1 matchSrcMac 00:00:c0:a8:04:02 matchDstMac 00:00:c0:a8:05:02
+217 ps_109_1 00:00:00:00:00:00:05:03 1 00:00:00:00:00:00:04:03 1 matchSrcMac 00:00:c0:a8:05:03 matchDstMac 00:00:c0:a8:04:03
+218 ps_109_2 00:00:00:00:00:00:04:03 1 00:00:00:00:00:00:05:03 1 matchSrcMac 00:00:c0:a8:04:03 matchDstMac 00:00:c0:a8:05:03
+219 ps_110_1 00:00:00:00:00:00:05:01 1 00:00:00:00:00:00:06:01 1 matchSrcMac 00:00:c0:a8:05:01 matchDstMac 00:00:c0:a8:06:01
+220 ps_110_2 00:00:00:00:00:00:06:01 1 00:00:00:00:00:00:05:01 1 matchSrcMac 00:00:c0:a8:06:01 matchDstMac 00:00:c0:a8:05:01
+221 ps_111_1 00:00:00:00:00:00:05:02 1 00:00:00:00:00:00:06:02 1 matchSrcMac 00:00:c0:a8:05:02 matchDstMac 00:00:c0:a8:06:02
+222 ps_111_2 00:00:00:00:00:00:06:02 1 00:00:00:00:00:00:05:02 1 matchSrcMac 00:00:c0:a8:06:02 matchDstMac 00:00:c0:a8:05:02
+223 ps_112_1 00:00:00:00:00:00:05:03 1 00:00:00:00:00:00:06:03 1 matchSrcMac 00:00:c0:a8:05:03 matchDstMac 00:00:c0:a8:06:03
+224 ps_112_2 00:00:00:00:00:00:06:03 1 00:00:00:00:00:00:05:03 1 matchSrcMac 00:00:c0:a8:06:03 matchDstMac 00:00:c0:a8:05:03
+225 ps_113_1 00:00:00:00:00:00:05:01 1 00:00:00:00:00:00:08:01 1 matchSrcMac 00:00:c0:a8:05:01 matchDstMac 00:00:c0:a8:08:01
+226 ps_113_2 00:00:00:00:00:00:08:01 1 00:00:00:00:00:00:05:01 1 matchSrcMac 00:00:c0:a8:08:01 matchDstMac 00:00:c0:a8:05:01
+227 ps_114_1 00:00:00:00:00:00:05:02 1 00:00:00:00:00:00:08:02 1 matchSrcMac 00:00:c0:a8:05:02 matchDstMac 00:00:c0:a8:08:02
+228 ps_114_2 00:00:00:00:00:00:08:02 1 00:00:00:00:00:00:05:02 1 matchSrcMac 00:00:c0:a8:08:02 matchDstMac 00:00:c0:a8:05:02
+229 ps_115_1 00:00:00:00:00:00:05:03 1 00:00:00:00:00:00:08:03 1 matchSrcMac 00:00:c0:a8:05:03 matchDstMac 00:00:c0:a8:08:03
+230 ps_115_2 00:00:00:00:00:00:08:03 1 00:00:00:00:00:00:05:03 1 matchSrcMac 00:00:c0:a8:08:03 matchDstMac 00:00:c0:a8:05:03
+231 ps_116_1 00:00:00:00:00:00:07:01 1 00:00:00:00:00:00:02:01 1 matchSrcMac 00:00:c0:a8:07:01 matchDstMac 00:00:c0:a8:02:01
+232 ps_116_2 00:00:00:00:00:00:02:01 1 00:00:00:00:00:00:07:01 1 matchSrcMac 00:00:c0:a8:02:01 matchDstMac 00:00:c0:a8:07:01
+233 ps_117_1 00:00:00:00:00:00:07:02 1 00:00:00:00:00:00:02:02 1 matchSrcMac 00:00:c0:a8:07:02 matchDstMac 00:00:c0:a8:02:02
+234 ps_117_2 00:00:00:00:00:00:02:02 1 00:00:00:00:00:00:07:02 1 matchSrcMac 00:00:c0:a8:02:02 matchDstMac 00:00:c0:a8:07:02
+235 ps_118_1 00:00:00:00:00:00:07:03 1 00:00:00:00:00:00:02:03 1 matchSrcMac 00:00:c0:a8:07:03 matchDstMac 00:00:c0:a8:02:03
+236 ps_118_2 00:00:00:00:00:00:02:03 1 00:00:00:00:00:00:07:03 1 matchSrcMac 00:00:c0:a8:02:03 matchDstMac 00:00:c0:a8:07:03
+237 ps_119_1 00:00:00:00:00:00:07:01 1 00:00:00:00:00:00:03:01 1 matchSrcMac 00:00:c0:a8:07:01 matchDstMac 00:00:c0:a8:03:01
+238 ps_119_2 00:00:00:00:00:00:03:01 1 00:00:00:00:00:00:07:01 1 matchSrcMac 00:00:c0:a8:03:01 matchDstMac 00:00:c0:a8:07:01
+239 ps_120_1 00:00:00:00:00:00:07:02 1 00:00:00:00:00:00:03:02 1 matchSrcMac 00:00:c0:a8:07:02 matchDstMac 00:00:c0:a8:03:02
+240 ps_120_2 00:00:00:00:00:00:03:02 1 00:00:00:00:00:00:07:02 1 matchSrcMac 00:00:c0:a8:03:02 matchDstMac 00:00:c0:a8:07:02
+241 ps_121_1 00:00:00:00:00:00:07:03 1 00:00:00:00:00:00:03:03 1 matchSrcMac 00:00:c0:a8:07:03 matchDstMac 00:00:c0:a8:03:03
+242 ps_121_2 00:00:00:00:00:00:03:03 1 00:00:00:00:00:00:07:03 1 matchSrcMac 00:00:c0:a8:03:03 matchDstMac 00:00:c0:a8:07:03
+243 ps_122_1 00:00:00:00:00:00:07:01 1 00:00:00:00:00:00:04:01 1 matchSrcMac 00:00:c0:a8:07:01 matchDstMac 00:00:c0:a8:04:01
+244 ps_122_2 00:00:00:00:00:00:04:01 1 00:00:00:00:00:00:07:01 1 matchSrcMac 00:00:c0:a8:04:01 matchDstMac 00:00:c0:a8:07:01
+245 ps_123_1 00:00:00:00:00:00:07:02 1 00:00:00:00:00:00:04:02 1 matchSrcMac 00:00:c0:a8:07:02 matchDstMac 00:00:c0:a8:04:02
+246 ps_123_2 00:00:00:00:00:00:04:02 1 00:00:00:00:00:00:07:02 1 matchSrcMac 00:00:c0:a8:04:02 matchDstMac 00:00:c0:a8:07:02
+247 ps_124_1 00:00:00:00:00:00:07:03 1 00:00:00:00:00:00:04:03 1 matchSrcMac 00:00:c0:a8:07:03 matchDstMac 00:00:c0:a8:04:03
+248 ps_124_2 00:00:00:00:00:00:04:03 1 00:00:00:00:00:00:07:03 1 matchSrcMac 00:00:c0:a8:04:03 matchDstMac 00:00:c0:a8:07:03
+249 ps_125_1 00:00:00:00:00:00:07:01 1 00:00:00:00:00:00:06:01 1 matchSrcMac 00:00:c0:a8:07:01 matchDstMac 00:00:c0:a8:06:01
+250 ps_125_2 00:00:00:00:00:00:06:01 1 00:00:00:00:00:00:07:01 1 matchSrcMac 00:00:c0:a8:06:01 matchDstMac 00:00:c0:a8:07:01
+251 ps_126_1 00:00:00:00:00:00:07:02 1 00:00:00:00:00:00:06:02 1 matchSrcMac 00:00:c0:a8:07:02 matchDstMac 00:00:c0:a8:06:02
+252 ps_126_2 00:00:00:00:00:00:06:02 1 00:00:00:00:00:00:07:02 1 matchSrcMac 00:00:c0:a8:06:02 matchDstMac 00:00:c0:a8:07:02
+253 ps_127_1 00:00:00:00:00:00:07:03 1 00:00:00:00:00:00:06:03 1 matchSrcMac 00:00:c0:a8:07:03 matchDstMac 00:00:c0:a8:06:03
+254 ps_127_2 00:00:00:00:00:00:06:03 1 00:00:00:00:00:00:07:03 1 matchSrcMac 00:00:c0:a8:06:03 matchDstMac 00:00:c0:a8:07:03
+255 ps_128_1 00:00:00:00:00:00:07:01 1 00:00:00:00:00:00:08:01 1 matchSrcMac 00:00:c0:a8:07:01 matchDstMac 00:00:c0:a8:08:01
+256 ps_128_2 00:00:00:00:00:00:08:01 1 00:00:00:00:00:00:07:01 1 matchSrcMac 00:00:c0:a8:08:01 matchDstMac 00:00:c0:a8:07:01
+257 ps_129_1 00:00:00:00:00:00:07:02 1 00:00:00:00:00:00:08:02 1 matchSrcMac 00:00:c0:a8:07:02 matchDstMac 00:00:c0:a8:08:02
+258 ps_129_2 00:00:00:00:00:00:08:02 1 00:00:00:00:00:00:07:02 1 matchSrcMac 00:00:c0:a8:08:02 matchDstMac 00:00:c0:a8:07:02
+259 ps_130_1 00:00:00:00:00:00:07:03 1 00:00:00:00:00:00:08:03 1 matchSrcMac 00:00:c0:a8:07:03 matchDstMac 00:00:c0:a8:08:03
+260 ps_130_2 00:00:00:00:00:00:08:03 1 00:00:00:00:00:00:07:03 1 matchSrcMac 00:00:c0:a8:08:03 matchDstMac 00:00:c0:a8:07:03
diff --git a/web/flowdef_demo_start.txt b/web/flowdef_demo_start.txt
new file mode 100644
index 0000000..fe0e3b5
--- /dev/null
+++ b/web/flowdef_demo_start.txt
@@ -0,0 +1,201 @@
+# Demo flow scale down
+1 ps_1_1 00:00:00:00:00:00:02:02 1 00:00:00:00:00:00:03:02 1 matchSrcMac 00:00:c0:a8:02:02 matchDstMac 00:00:c0:a8:03:02
+2 ps_1_2 00:00:00:00:00:00:03:02 1 00:00:00:00:00:00:02:02 1 matchSrcMac 00:00:c0:a8:03:02 matchDstMac 00:00:c0:a8:02:02
+3 ps_2_1 00:00:00:00:00:00:02:03 1 00:00:00:00:00:00:03:03 1 matchSrcMac 00:00:c0:a8:02:03 matchDstMac 00:00:c0:a8:03:03
+4 ps_2_2 00:00:00:00:00:00:03:03 1 00:00:00:00:00:00:02:03 1 matchSrcMac 00:00:c0:a8:03:03 matchDstMac 00:00:c0:a8:02:03
+5 ps_3_1 00:00:00:00:00:00:02:04 1 00:00:00:00:00:00:03:04 1 matchSrcMac 00:00:c0:a8:02:04 matchDstMac 00:00:c0:a8:03:04
+6 ps_3_2 00:00:00:00:00:00:03:04 1 00:00:00:00:00:00:02:04 1 matchSrcMac 00:00:c0:a8:03:04 matchDstMac 00:00:c0:a8:02:04
+7 ps_4_1 00:00:00:00:00:00:02:05 1 00:00:00:00:00:00:03:05 1 matchSrcMac 00:00:c0:a8:02:05 matchDstMac 00:00:c0:a8:03:05
+8 ps_4_2 00:00:00:00:00:00:03:05 1 00:00:00:00:00:00:02:05 1 matchSrcMac 00:00:c0:a8:03:05 matchDstMac 00:00:c0:a8:02:05
+9 ps_5_1 00:00:00:00:00:00:02:06 1 00:00:00:00:00:00:03:06 1 matchSrcMac 00:00:c0:a8:02:06 matchDstMac 00:00:c0:a8:03:06
+10 ps_5_2 00:00:00:00:00:00:03:06 1 00:00:00:00:00:00:02:06 1 matchSrcMac 00:00:c0:a8:03:06 matchDstMac 00:00:c0:a8:02:06
+11 ps_6_1 00:00:00:00:00:00:02:07 1 00:00:00:00:00:00:03:07 1 matchSrcMac 00:00:c0:a8:02:07 matchDstMac 00:00:c0:a8:03:07
+12 ps_6_2 00:00:00:00:00:00:03:07 1 00:00:00:00:00:00:02:07 1 matchSrcMac 00:00:c0:a8:03:07 matchDstMac 00:00:c0:a8:02:07
+13 ps_7_1 00:00:00:00:00:00:02:08 1 00:00:00:00:00:00:03:08 1 matchSrcMac 00:00:c0:a8:02:08 matchDstMac 00:00:c0:a8:03:08
+14 ps_7_2 00:00:00:00:00:00:03:08 1 00:00:00:00:00:00:02:08 1 matchSrcMac 00:00:c0:a8:03:08 matchDstMac 00:00:c0:a8:02:08
+15 ps_8_1 00:00:00:00:00:00:02:09 1 00:00:00:00:00:00:03:09 1 matchSrcMac 00:00:c0:a8:02:09 matchDstMac 00:00:c0:a8:03:09
+16 ps_8_2 00:00:00:00:00:00:03:09 1 00:00:00:00:00:00:02:09 1 matchSrcMac 00:00:c0:a8:03:09 matchDstMac 00:00:c0:a8:02:09
+17 ps_9_1 00:00:00:00:00:00:02:0a 1 00:00:00:00:00:00:03:0a 1 matchSrcMac 00:00:c0:a8:02:0a matchDstMac 00:00:c0:a8:03:0a
+18 ps_9_2 00:00:00:00:00:00:03:0a 1 00:00:00:00:00:00:02:0a 1 matchSrcMac 00:00:c0:a8:03:0a matchDstMac 00:00:c0:a8:02:0a
+19 ps_10_1 00:00:00:00:00:00:02:0b 1 00:00:00:00:00:00:03:0b 1 matchSrcMac 00:00:c0:a8:02:0b matchDstMac 00:00:c0:a8:03:0b
+20 ps_10_2 00:00:00:00:00:00:03:0b 1 00:00:00:00:00:00:02:0b 1 matchSrcMac 00:00:c0:a8:03:0b matchDstMac 00:00:c0:a8:02:0b
+21 ps_11_1 00:00:00:00:00:00:02:02 1 00:00:00:00:00:00:04:02 1 matchSrcMac 00:00:c0:a8:02:02 matchDstMac 00:00:c0:a8:04:02
+22 ps_11_2 00:00:00:00:00:00:04:02 1 00:00:00:00:00:00:02:02 1 matchSrcMac 00:00:c0:a8:04:02 matchDstMac 00:00:c0:a8:02:02
+23 ps_12_1 00:00:00:00:00:00:02:03 1 00:00:00:00:00:00:04:03 1 matchSrcMac 00:00:c0:a8:02:03 matchDstMac 00:00:c0:a8:04:03
+24 ps_12_2 00:00:00:00:00:00:04:03 1 00:00:00:00:00:00:02:03 1 matchSrcMac 00:00:c0:a8:04:03 matchDstMac 00:00:c0:a8:02:03
+25 ps_13_1 00:00:00:00:00:00:02:04 1 00:00:00:00:00:00:04:04 1 matchSrcMac 00:00:c0:a8:02:04 matchDstMac 00:00:c0:a8:04:04
+26 ps_13_2 00:00:00:00:00:00:04:04 1 00:00:00:00:00:00:02:04 1 matchSrcMac 00:00:c0:a8:04:04 matchDstMac 00:00:c0:a8:02:04
+27 ps_14_1 00:00:00:00:00:00:02:05 1 00:00:00:00:00:00:04:05 1 matchSrcMac 00:00:c0:a8:02:05 matchDstMac 00:00:c0:a8:04:05
+28 ps_14_2 00:00:00:00:00:00:04:05 1 00:00:00:00:00:00:02:05 1 matchSrcMac 00:00:c0:a8:04:05 matchDstMac 00:00:c0:a8:02:05
+29 ps_15_1 00:00:00:00:00:00:02:06 1 00:00:00:00:00:00:04:06 1 matchSrcMac 00:00:c0:a8:02:06 matchDstMac 00:00:c0:a8:04:06
+30 ps_15_2 00:00:00:00:00:00:04:06 1 00:00:00:00:00:00:02:06 1 matchSrcMac 00:00:c0:a8:04:06 matchDstMac 00:00:c0:a8:02:06
+31 ps_16_1 00:00:00:00:00:00:02:07 1 00:00:00:00:00:00:04:07 1 matchSrcMac 00:00:c0:a8:02:07 matchDstMac 00:00:c0:a8:04:07
+32 ps_16_2 00:00:00:00:00:00:04:07 1 00:00:00:00:00:00:02:07 1 matchSrcMac 00:00:c0:a8:04:07 matchDstMac 00:00:c0:a8:02:07
+33 ps_17_1 00:00:00:00:00:00:02:08 1 00:00:00:00:00:00:04:08 1 matchSrcMac 00:00:c0:a8:02:08 matchDstMac 00:00:c0:a8:04:08
+34 ps_17_2 00:00:00:00:00:00:04:08 1 00:00:00:00:00:00:02:08 1 matchSrcMac 00:00:c0:a8:04:08 matchDstMac 00:00:c0:a8:02:08
+35 ps_18_1 00:00:00:00:00:00:02:09 1 00:00:00:00:00:00:04:09 1 matchSrcMac 00:00:c0:a8:02:09 matchDstMac 00:00:c0:a8:04:09
+36 ps_18_2 00:00:00:00:00:00:04:09 1 00:00:00:00:00:00:02:09 1 matchSrcMac 00:00:c0:a8:04:09 matchDstMac 00:00:c0:a8:02:09
+37 ps_19_1 00:00:00:00:00:00:02:0a 1 00:00:00:00:00:00:04:0a 1 matchSrcMac 00:00:c0:a8:02:0a matchDstMac 00:00:c0:a8:04:0a
+38 ps_19_2 00:00:00:00:00:00:04:0a 1 00:00:00:00:00:00:02:0a 1 matchSrcMac 00:00:c0:a8:04:0a matchDstMac 00:00:c0:a8:02:0a
+39 ps_20_1 00:00:00:00:00:00:02:0b 1 00:00:00:00:00:00:04:0b 1 matchSrcMac 00:00:c0:a8:02:0b matchDstMac 00:00:c0:a8:04:0b
+40 ps_20_2 00:00:00:00:00:00:04:0b 1 00:00:00:00:00:00:02:0b 1 matchSrcMac 00:00:c0:a8:04:0b matchDstMac 00:00:c0:a8:02:0b
+41 ps_21_1 00:00:00:00:00:00:02:02 1 00:00:00:00:00:00:06:02 1 matchSrcMac 00:00:c0:a8:02:02 matchDstMac 00:00:c0:a8:06:02
+42 ps_21_2 00:00:00:00:00:00:06:02 1 00:00:00:00:00:00:02:02 1 matchSrcMac 00:00:c0:a8:06:02 matchDstMac 00:00:c0:a8:02:02
+43 ps_22_1 00:00:00:00:00:00:02:03 1 00:00:00:00:00:00:06:03 1 matchSrcMac 00:00:c0:a8:02:03 matchDstMac 00:00:c0:a8:06:03
+44 ps_22_2 00:00:00:00:00:00:06:03 1 00:00:00:00:00:00:02:03 1 matchSrcMac 00:00:c0:a8:06:03 matchDstMac 00:00:c0:a8:02:03
+45 ps_23_1 00:00:00:00:00:00:02:04 1 00:00:00:00:00:00:06:04 1 matchSrcMac 00:00:c0:a8:02:04 matchDstMac 00:00:c0:a8:06:04
+46 ps_23_2 00:00:00:00:00:00:06:04 1 00:00:00:00:00:00:02:04 1 matchSrcMac 00:00:c0:a8:06:04 matchDstMac 00:00:c0:a8:02:04
+47 ps_24_1 00:00:00:00:00:00:02:05 1 00:00:00:00:00:00:06:05 1 matchSrcMac 00:00:c0:a8:02:05 matchDstMac 00:00:c0:a8:06:05
+48 ps_24_2 00:00:00:00:00:00:06:05 1 00:00:00:00:00:00:02:05 1 matchSrcMac 00:00:c0:a8:06:05 matchDstMac 00:00:c0:a8:02:05
+49 ps_25_1 00:00:00:00:00:00:02:06 1 00:00:00:00:00:00:06:06 1 matchSrcMac 00:00:c0:a8:02:06 matchDstMac 00:00:c0:a8:06:06
+50 ps_25_2 00:00:00:00:00:00:06:06 1 00:00:00:00:00:00:02:06 1 matchSrcMac 00:00:c0:a8:06:06 matchDstMac 00:00:c0:a8:02:06
+51 ps_26_1 00:00:00:00:00:00:02:07 1 00:00:00:00:00:00:06:07 1 matchSrcMac 00:00:c0:a8:02:07 matchDstMac 00:00:c0:a8:06:07
+52 ps_26_2 00:00:00:00:00:00:06:07 1 00:00:00:00:00:00:02:07 1 matchSrcMac 00:00:c0:a8:06:07 matchDstMac 00:00:c0:a8:02:07
+53 ps_27_1 00:00:00:00:00:00:02:08 1 00:00:00:00:00:00:06:08 1 matchSrcMac 00:00:c0:a8:02:08 matchDstMac 00:00:c0:a8:06:08
+54 ps_27_2 00:00:00:00:00:00:06:08 1 00:00:00:00:00:00:02:08 1 matchSrcMac 00:00:c0:a8:06:08 matchDstMac 00:00:c0:a8:02:08
+55 ps_28_1 00:00:00:00:00:00:02:09 1 00:00:00:00:00:00:06:09 1 matchSrcMac 00:00:c0:a8:02:09 matchDstMac 00:00:c0:a8:06:09
+56 ps_28_2 00:00:00:00:00:00:06:09 1 00:00:00:00:00:00:02:09 1 matchSrcMac 00:00:c0:a8:06:09 matchDstMac 00:00:c0:a8:02:09
+57 ps_29_1 00:00:00:00:00:00:02:0a 1 00:00:00:00:00:00:06:0a 1 matchSrcMac 00:00:c0:a8:02:0a matchDstMac 00:00:c0:a8:06:0a
+58 ps_29_2 00:00:00:00:00:00:06:0a 1 00:00:00:00:00:00:02:0a 1 matchSrcMac 00:00:c0:a8:06:0a matchDstMac 00:00:c0:a8:02:0a
+59 ps_30_1 00:00:00:00:00:00:02:0b 1 00:00:00:00:00:00:06:0b 1 matchSrcMac 00:00:c0:a8:02:0b matchDstMac 00:00:c0:a8:06:0b
+60 ps_30_2 00:00:00:00:00:00:06:0b 1 00:00:00:00:00:00:02:0b 1 matchSrcMac 00:00:c0:a8:06:0b matchDstMac 00:00:c0:a8:02:0b
+61 ps_31_1 00:00:00:00:00:00:02:02 1 00:00:00:00:00:00:08:02 1 matchSrcMac 00:00:c0:a8:02:02 matchDstMac 00:00:c0:a8:08:02
+62 ps_31_2 00:00:00:00:00:00:08:02 1 00:00:00:00:00:00:02:02 1 matchSrcMac 00:00:c0:a8:08:02 matchDstMac 00:00:c0:a8:02:02
+63 ps_32_1 00:00:00:00:00:00:02:03 1 00:00:00:00:00:00:08:03 1 matchSrcMac 00:00:c0:a8:02:03 matchDstMac 00:00:c0:a8:08:03
+64 ps_32_2 00:00:00:00:00:00:08:03 1 00:00:00:00:00:00:02:03 1 matchSrcMac 00:00:c0:a8:08:03 matchDstMac 00:00:c0:a8:02:03
+65 ps_33_1 00:00:00:00:00:00:02:04 1 00:00:00:00:00:00:08:04 1 matchSrcMac 00:00:c0:a8:02:04 matchDstMac 00:00:c0:a8:08:04
+66 ps_33_2 00:00:00:00:00:00:08:04 1 00:00:00:00:00:00:02:04 1 matchSrcMac 00:00:c0:a8:08:04 matchDstMac 00:00:c0:a8:02:04
+67 ps_34_1 00:00:00:00:00:00:02:05 1 00:00:00:00:00:00:08:05 1 matchSrcMac 00:00:c0:a8:02:05 matchDstMac 00:00:c0:a8:08:05
+68 ps_34_2 00:00:00:00:00:00:08:05 1 00:00:00:00:00:00:02:05 1 matchSrcMac 00:00:c0:a8:08:05 matchDstMac 00:00:c0:a8:02:05
+69 ps_35_1 00:00:00:00:00:00:02:06 1 00:00:00:00:00:00:08:06 1 matchSrcMac 00:00:c0:a8:02:06 matchDstMac 00:00:c0:a8:08:06
+70 ps_35_2 00:00:00:00:00:00:08:06 1 00:00:00:00:00:00:02:06 1 matchSrcMac 00:00:c0:a8:08:06 matchDstMac 00:00:c0:a8:02:06
+71 ps_36_1 00:00:00:00:00:00:02:07 1 00:00:00:00:00:00:08:07 1 matchSrcMac 00:00:c0:a8:02:07 matchDstMac 00:00:c0:a8:08:07
+72 ps_36_2 00:00:00:00:00:00:08:07 1 00:00:00:00:00:00:02:07 1 matchSrcMac 00:00:c0:a8:08:07 matchDstMac 00:00:c0:a8:02:07
+73 ps_37_1 00:00:00:00:00:00:02:08 1 00:00:00:00:00:00:08:08 1 matchSrcMac 00:00:c0:a8:02:08 matchDstMac 00:00:c0:a8:08:08
+74 ps_37_2 00:00:00:00:00:00:08:08 1 00:00:00:00:00:00:02:08 1 matchSrcMac 00:00:c0:a8:08:08 matchDstMac 00:00:c0:a8:02:08
+75 ps_38_1 00:00:00:00:00:00:02:09 1 00:00:00:00:00:00:08:09 1 matchSrcMac 00:00:c0:a8:02:09 matchDstMac 00:00:c0:a8:08:09
+76 ps_38_2 00:00:00:00:00:00:08:09 1 00:00:00:00:00:00:02:09 1 matchSrcMac 00:00:c0:a8:08:09 matchDstMac 00:00:c0:a8:02:09
+77 ps_39_1 00:00:00:00:00:00:02:0a 1 00:00:00:00:00:00:08:0a 1 matchSrcMac 00:00:c0:a8:02:0a matchDstMac 00:00:c0:a8:08:0a
+78 ps_39_2 00:00:00:00:00:00:08:0a 1 00:00:00:00:00:00:02:0a 1 matchSrcMac 00:00:c0:a8:08:0a matchDstMac 00:00:c0:a8:02:0a
+79 ps_40_1 00:00:00:00:00:00:02:0b 1 00:00:00:00:00:00:08:0b 1 matchSrcMac 00:00:c0:a8:02:0b matchDstMac 00:00:c0:a8:08:0b
+80 ps_40_2 00:00:00:00:00:00:08:0b 1 00:00:00:00:00:00:02:0b 1 matchSrcMac 00:00:c0:a8:08:0b matchDstMac 00:00:c0:a8:02:0b
+81 ps_41_1 00:00:00:00:00:00:03:02 1 00:00:00:00:00:00:04:02 1 matchSrcMac 00:00:c0:a8:03:02 matchDstMac 00:00:c0:a8:04:02
+82 ps_41_2 00:00:00:00:00:00:04:02 1 00:00:00:00:00:00:03:02 1 matchSrcMac 00:00:c0:a8:04:02 matchDstMac 00:00:c0:a8:03:02
+83 ps_42_1 00:00:00:00:00:00:03:03 1 00:00:00:00:00:00:04:03 1 matchSrcMac 00:00:c0:a8:03:03 matchDstMac 00:00:c0:a8:04:03
+84 ps_42_2 00:00:00:00:00:00:04:03 1 00:00:00:00:00:00:03:03 1 matchSrcMac 00:00:c0:a8:04:03 matchDstMac 00:00:c0:a8:03:03
+85 ps_43_1 00:00:00:00:00:00:03:04 1 00:00:00:00:00:00:04:04 1 matchSrcMac 00:00:c0:a8:03:04 matchDstMac 00:00:c0:a8:04:04
+86 ps_43_2 00:00:00:00:00:00:04:04 1 00:00:00:00:00:00:03:04 1 matchSrcMac 00:00:c0:a8:04:04 matchDstMac 00:00:c0:a8:03:04
+87 ps_44_1 00:00:00:00:00:00:03:05 1 00:00:00:00:00:00:04:05 1 matchSrcMac 00:00:c0:a8:03:05 matchDstMac 00:00:c0:a8:04:05
+88 ps_44_2 00:00:00:00:00:00:04:05 1 00:00:00:00:00:00:03:05 1 matchSrcMac 00:00:c0:a8:04:05 matchDstMac 00:00:c0:a8:03:05
+89 ps_45_1 00:00:00:00:00:00:03:06 1 00:00:00:00:00:00:04:06 1 matchSrcMac 00:00:c0:a8:03:06 matchDstMac 00:00:c0:a8:04:06
+90 ps_45_2 00:00:00:00:00:00:04:06 1 00:00:00:00:00:00:03:06 1 matchSrcMac 00:00:c0:a8:04:06 matchDstMac 00:00:c0:a8:03:06
+91 ps_46_1 00:00:00:00:00:00:03:07 1 00:00:00:00:00:00:04:07 1 matchSrcMac 00:00:c0:a8:03:07 matchDstMac 00:00:c0:a8:04:07
+92 ps_46_2 00:00:00:00:00:00:04:07 1 00:00:00:00:00:00:03:07 1 matchSrcMac 00:00:c0:a8:04:07 matchDstMac 00:00:c0:a8:03:07
+93 ps_47_1 00:00:00:00:00:00:03:08 1 00:00:00:00:00:00:04:08 1 matchSrcMac 00:00:c0:a8:03:08 matchDstMac 00:00:c0:a8:04:08
+94 ps_47_2 00:00:00:00:00:00:04:08 1 00:00:00:00:00:00:03:08 1 matchSrcMac 00:00:c0:a8:04:08 matchDstMac 00:00:c0:a8:03:08
+95 ps_48_1 00:00:00:00:00:00:03:09 1 00:00:00:00:00:00:04:09 1 matchSrcMac 00:00:c0:a8:03:09 matchDstMac 00:00:c0:a8:04:09
+96 ps_48_2 00:00:00:00:00:00:04:09 1 00:00:00:00:00:00:03:09 1 matchSrcMac 00:00:c0:a8:04:09 matchDstMac 00:00:c0:a8:03:09
+97 ps_49_1 00:00:00:00:00:00:03:0a 1 00:00:00:00:00:00:04:0a 1 matchSrcMac 00:00:c0:a8:03:0a matchDstMac 00:00:c0:a8:04:0a
+98 ps_49_2 00:00:00:00:00:00:04:0a 1 00:00:00:00:00:00:03:0a 1 matchSrcMac 00:00:c0:a8:04:0a matchDstMac 00:00:c0:a8:03:0a
+99 ps_50_1 00:00:00:00:00:00:03:0b 1 00:00:00:00:00:00:04:0b 1 matchSrcMac 00:00:c0:a8:03:0b matchDstMac 00:00:c0:a8:04:0b
+100 ps_50_2 00:00:00:00:00:00:04:0b 1 00:00:00:00:00:00:03:0b 1 matchSrcMac 00:00:c0:a8:04:0b matchDstMac 00:00:c0:a8:03:0b
+101 ps_51_1 00:00:00:00:00:00:03:02 1 00:00:00:00:00:00:06:02 1 matchSrcMac 00:00:c0:a8:03:02 matchDstMac 00:00:c0:a8:06:02
+102 ps_51_2 00:00:00:00:00:00:06:02 1 00:00:00:00:00:00:03:02 1 matchSrcMac 00:00:c0:a8:06:02 matchDstMac 00:00:c0:a8:03:02
+103 ps_52_1 00:00:00:00:00:00:03:03 1 00:00:00:00:00:00:06:03 1 matchSrcMac 00:00:c0:a8:03:03 matchDstMac 00:00:c0:a8:06:03
+104 ps_52_2 00:00:00:00:00:00:06:03 1 00:00:00:00:00:00:03:03 1 matchSrcMac 00:00:c0:a8:06:03 matchDstMac 00:00:c0:a8:03:03
+105 ps_53_1 00:00:00:00:00:00:03:04 1 00:00:00:00:00:00:06:04 1 matchSrcMac 00:00:c0:a8:03:04 matchDstMac 00:00:c0:a8:06:04
+106 ps_53_2 00:00:00:00:00:00:06:04 1 00:00:00:00:00:00:03:04 1 matchSrcMac 00:00:c0:a8:06:04 matchDstMac 00:00:c0:a8:03:04
+107 ps_54_1 00:00:00:00:00:00:03:05 1 00:00:00:00:00:00:06:05 1 matchSrcMac 00:00:c0:a8:03:05 matchDstMac 00:00:c0:a8:06:05
+108 ps_54_2 00:00:00:00:00:00:06:05 1 00:00:00:00:00:00:03:05 1 matchSrcMac 00:00:c0:a8:06:05 matchDstMac 00:00:c0:a8:03:05
+109 ps_55_1 00:00:00:00:00:00:03:06 1 00:00:00:00:00:00:06:06 1 matchSrcMac 00:00:c0:a8:03:06 matchDstMac 00:00:c0:a8:06:06
+110 ps_55_2 00:00:00:00:00:00:06:06 1 00:00:00:00:00:00:03:06 1 matchSrcMac 00:00:c0:a8:06:06 matchDstMac 00:00:c0:a8:03:06
+111 ps_56_1 00:00:00:00:00:00:03:07 1 00:00:00:00:00:00:06:07 1 matchSrcMac 00:00:c0:a8:03:07 matchDstMac 00:00:c0:a8:06:07
+112 ps_56_2 00:00:00:00:00:00:06:07 1 00:00:00:00:00:00:03:07 1 matchSrcMac 00:00:c0:a8:06:07 matchDstMac 00:00:c0:a8:03:07
+113 ps_57_1 00:00:00:00:00:00:03:08 1 00:00:00:00:00:00:06:08 1 matchSrcMac 00:00:c0:a8:03:08 matchDstMac 00:00:c0:a8:06:08
+114 ps_57_2 00:00:00:00:00:00:06:08 1 00:00:00:00:00:00:03:08 1 matchSrcMac 00:00:c0:a8:06:08 matchDstMac 00:00:c0:a8:03:08
+115 ps_58_1 00:00:00:00:00:00:03:09 1 00:00:00:00:00:00:06:09 1 matchSrcMac 00:00:c0:a8:03:09 matchDstMac 00:00:c0:a8:06:09
+116 ps_58_2 00:00:00:00:00:00:06:09 1 00:00:00:00:00:00:03:09 1 matchSrcMac 00:00:c0:a8:06:09 matchDstMac 00:00:c0:a8:03:09
+117 ps_59_1 00:00:00:00:00:00:03:0a 1 00:00:00:00:00:00:06:0a 1 matchSrcMac 00:00:c0:a8:03:0a matchDstMac 00:00:c0:a8:06:0a
+118 ps_59_2 00:00:00:00:00:00:06:0a 1 00:00:00:00:00:00:03:0a 1 matchSrcMac 00:00:c0:a8:06:0a matchDstMac 00:00:c0:a8:03:0a
+119 ps_60_1 00:00:00:00:00:00:03:0b 1 00:00:00:00:00:00:06:0b 1 matchSrcMac 00:00:c0:a8:03:0b matchDstMac 00:00:c0:a8:06:0b
+120 ps_60_2 00:00:00:00:00:00:06:0b 1 00:00:00:00:00:00:03:0b 1 matchSrcMac 00:00:c0:a8:06:0b matchDstMac 00:00:c0:a8:03:0b
+121 ps_61_1 00:00:00:00:00:00:03:02 1 00:00:00:00:00:00:08:02 1 matchSrcMac 00:00:c0:a8:03:02 matchDstMac 00:00:c0:a8:08:02
+122 ps_61_2 00:00:00:00:00:00:08:02 1 00:00:00:00:00:00:03:02 1 matchSrcMac 00:00:c0:a8:08:02 matchDstMac 00:00:c0:a8:03:02
+123 ps_62_1 00:00:00:00:00:00:03:03 1 00:00:00:00:00:00:08:03 1 matchSrcMac 00:00:c0:a8:03:03 matchDstMac 00:00:c0:a8:08:03
+124 ps_62_2 00:00:00:00:00:00:08:03 1 00:00:00:00:00:00:03:03 1 matchSrcMac 00:00:c0:a8:08:03 matchDstMac 00:00:c0:a8:03:03
+125 ps_63_1 00:00:00:00:00:00:03:04 1 00:00:00:00:00:00:08:04 1 matchSrcMac 00:00:c0:a8:03:04 matchDstMac 00:00:c0:a8:08:04
+126 ps_63_2 00:00:00:00:00:00:08:04 1 00:00:00:00:00:00:03:04 1 matchSrcMac 00:00:c0:a8:08:04 matchDstMac 00:00:c0:a8:03:04
+127 ps_64_1 00:00:00:00:00:00:03:05 1 00:00:00:00:00:00:08:05 1 matchSrcMac 00:00:c0:a8:03:05 matchDstMac 00:00:c0:a8:08:05
+128 ps_64_2 00:00:00:00:00:00:08:05 1 00:00:00:00:00:00:03:05 1 matchSrcMac 00:00:c0:a8:08:05 matchDstMac 00:00:c0:a8:03:05
+129 ps_65_1 00:00:00:00:00:00:03:06 1 00:00:00:00:00:00:08:06 1 matchSrcMac 00:00:c0:a8:03:06 matchDstMac 00:00:c0:a8:08:06
+130 ps_65_2 00:00:00:00:00:00:08:06 1 00:00:00:00:00:00:03:06 1 matchSrcMac 00:00:c0:a8:08:06 matchDstMac 00:00:c0:a8:03:06
+131 ps_66_1 00:00:00:00:00:00:03:07 1 00:00:00:00:00:00:08:07 1 matchSrcMac 00:00:c0:a8:03:07 matchDstMac 00:00:c0:a8:08:07
+132 ps_66_2 00:00:00:00:00:00:08:07 1 00:00:00:00:00:00:03:07 1 matchSrcMac 00:00:c0:a8:08:07 matchDstMac 00:00:c0:a8:03:07
+133 ps_67_1 00:00:00:00:00:00:03:08 1 00:00:00:00:00:00:08:08 1 matchSrcMac 00:00:c0:a8:03:08 matchDstMac 00:00:c0:a8:08:08
+134 ps_67_2 00:00:00:00:00:00:08:08 1 00:00:00:00:00:00:03:08 1 matchSrcMac 00:00:c0:a8:08:08 matchDstMac 00:00:c0:a8:03:08
+135 ps_68_1 00:00:00:00:00:00:03:09 1 00:00:00:00:00:00:08:09 1 matchSrcMac 00:00:c0:a8:03:09 matchDstMac 00:00:c0:a8:08:09
+136 ps_68_2 00:00:00:00:00:00:08:09 1 00:00:00:00:00:00:03:09 1 matchSrcMac 00:00:c0:a8:08:09 matchDstMac 00:00:c0:a8:03:09
+137 ps_69_1 00:00:00:00:00:00:03:0a 1 00:00:00:00:00:00:08:0a 1 matchSrcMac 00:00:c0:a8:03:0a matchDstMac 00:00:c0:a8:08:0a
+138 ps_69_2 00:00:00:00:00:00:08:0a 1 00:00:00:00:00:00:03:0a 1 matchSrcMac 00:00:c0:a8:08:0a matchDstMac 00:00:c0:a8:03:0a
+139 ps_70_1 00:00:00:00:00:00:03:0b 1 00:00:00:00:00:00:08:0b 1 matchSrcMac 00:00:c0:a8:03:0b matchDstMac 00:00:c0:a8:08:0b
+140 ps_70_2 00:00:00:00:00:00:08:0b 1 00:00:00:00:00:00:03:0b 1 matchSrcMac 00:00:c0:a8:08:0b matchDstMac 00:00:c0:a8:03:0b
+141 ps_71_1 00:00:00:00:00:00:04:02 1 00:00:00:00:00:00:06:02 1 matchSrcMac 00:00:c0:a8:04:02 matchDstMac 00:00:c0:a8:06:02
+142 ps_71_2 00:00:00:00:00:00:06:02 1 00:00:00:00:00:00:04:02 1 matchSrcMac 00:00:c0:a8:06:02 matchDstMac 00:00:c0:a8:04:02
+143 ps_72_1 00:00:00:00:00:00:04:03 1 00:00:00:00:00:00:06:03 1 matchSrcMac 00:00:c0:a8:04:03 matchDstMac 00:00:c0:a8:06:03
+144 ps_72_2 00:00:00:00:00:00:06:03 1 00:00:00:00:00:00:04:03 1 matchSrcMac 00:00:c0:a8:06:03 matchDstMac 00:00:c0:a8:04:03
+145 ps_73_1 00:00:00:00:00:00:04:04 1 00:00:00:00:00:00:06:04 1 matchSrcMac 00:00:c0:a8:04:04 matchDstMac 00:00:c0:a8:06:04
+146 ps_73_2 00:00:00:00:00:00:06:04 1 00:00:00:00:00:00:04:04 1 matchSrcMac 00:00:c0:a8:06:04 matchDstMac 00:00:c0:a8:04:04
+147 ps_74_1 00:00:00:00:00:00:04:05 1 00:00:00:00:00:00:06:05 1 matchSrcMac 00:00:c0:a8:04:05 matchDstMac 00:00:c0:a8:06:05
+148 ps_74_2 00:00:00:00:00:00:06:05 1 00:00:00:00:00:00:04:05 1 matchSrcMac 00:00:c0:a8:06:05 matchDstMac 00:00:c0:a8:04:05
+149 ps_75_1 00:00:00:00:00:00:04:06 1 00:00:00:00:00:00:06:06 1 matchSrcMac 00:00:c0:a8:04:06 matchDstMac 00:00:c0:a8:06:06
+150 ps_75_2 00:00:00:00:00:00:06:06 1 00:00:00:00:00:00:04:06 1 matchSrcMac 00:00:c0:a8:06:06 matchDstMac 00:00:c0:a8:04:06
+151 ps_76_1 00:00:00:00:00:00:04:07 1 00:00:00:00:00:00:06:07 1 matchSrcMac 00:00:c0:a8:04:07 matchDstMac 00:00:c0:a8:06:07
+152 ps_76_2 00:00:00:00:00:00:06:07 1 00:00:00:00:00:00:04:07 1 matchSrcMac 00:00:c0:a8:06:07 matchDstMac 00:00:c0:a8:04:07
+153 ps_77_1 00:00:00:00:00:00:04:08 1 00:00:00:00:00:00:06:08 1 matchSrcMac 00:00:c0:a8:04:08 matchDstMac 00:00:c0:a8:06:08
+154 ps_77_2 00:00:00:00:00:00:06:08 1 00:00:00:00:00:00:04:08 1 matchSrcMac 00:00:c0:a8:06:08 matchDstMac 00:00:c0:a8:04:08
+155 ps_78_1 00:00:00:00:00:00:04:09 1 00:00:00:00:00:00:06:09 1 matchSrcMac 00:00:c0:a8:04:09 matchDstMac 00:00:c0:a8:06:09
+156 ps_78_2 00:00:00:00:00:00:06:09 1 00:00:00:00:00:00:04:09 1 matchSrcMac 00:00:c0:a8:06:09 matchDstMac 00:00:c0:a8:04:09
+157 ps_79_1 00:00:00:00:00:00:04:0a 1 00:00:00:00:00:00:06:0a 1 matchSrcMac 00:00:c0:a8:04:0a matchDstMac 00:00:c0:a8:06:0a
+158 ps_79_2 00:00:00:00:00:00:06:0a 1 00:00:00:00:00:00:04:0a 1 matchSrcMac 00:00:c0:a8:06:0a matchDstMac 00:00:c0:a8:04:0a
+159 ps_80_1 00:00:00:00:00:00:04:0b 1 00:00:00:00:00:00:06:0b 1 matchSrcMac 00:00:c0:a8:04:0b matchDstMac 00:00:c0:a8:06:0b
+160 ps_80_2 00:00:00:00:00:00:06:0b 1 00:00:00:00:00:00:04:0b 1 matchSrcMac 00:00:c0:a8:06:0b matchDstMac 00:00:c0:a8:04:0b
+161 ps_81_1 00:00:00:00:00:00:04:02 1 00:00:00:00:00:00:08:02 1 matchSrcMac 00:00:c0:a8:04:02 matchDstMac 00:00:c0:a8:08:02
+162 ps_81_2 00:00:00:00:00:00:08:02 1 00:00:00:00:00:00:04:02 1 matchSrcMac 00:00:c0:a8:08:02 matchDstMac 00:00:c0:a8:04:02
+163 ps_82_1 00:00:00:00:00:00:04:03 1 00:00:00:00:00:00:08:03 1 matchSrcMac 00:00:c0:a8:04:03 matchDstMac 00:00:c0:a8:08:03
+164 ps_82_2 00:00:00:00:00:00:08:03 1 00:00:00:00:00:00:04:03 1 matchSrcMac 00:00:c0:a8:08:03 matchDstMac 00:00:c0:a8:04:03
+165 ps_83_1 00:00:00:00:00:00:04:04 1 00:00:00:00:00:00:08:04 1 matchSrcMac 00:00:c0:a8:04:04 matchDstMac 00:00:c0:a8:08:04
+166 ps_83_2 00:00:00:00:00:00:08:04 1 00:00:00:00:00:00:04:04 1 matchSrcMac 00:00:c0:a8:08:04 matchDstMac 00:00:c0:a8:04:04
+167 ps_84_1 00:00:00:00:00:00:04:05 1 00:00:00:00:00:00:08:05 1 matchSrcMac 00:00:c0:a8:04:05 matchDstMac 00:00:c0:a8:08:05
+168 ps_84_2 00:00:00:00:00:00:08:05 1 00:00:00:00:00:00:04:05 1 matchSrcMac 00:00:c0:a8:08:05 matchDstMac 00:00:c0:a8:04:05
+169 ps_85_1 00:00:00:00:00:00:04:06 1 00:00:00:00:00:00:08:06 1 matchSrcMac 00:00:c0:a8:04:06 matchDstMac 00:00:c0:a8:08:06
+170 ps_85_2 00:00:00:00:00:00:08:06 1 00:00:00:00:00:00:04:06 1 matchSrcMac 00:00:c0:a8:08:06 matchDstMac 00:00:c0:a8:04:06
+171 ps_86_1 00:00:00:00:00:00:04:07 1 00:00:00:00:00:00:08:07 1 matchSrcMac 00:00:c0:a8:04:07 matchDstMac 00:00:c0:a8:08:07
+172 ps_86_2 00:00:00:00:00:00:08:07 1 00:00:00:00:00:00:04:07 1 matchSrcMac 00:00:c0:a8:08:07 matchDstMac 00:00:c0:a8:04:07
+173 ps_87_1 00:00:00:00:00:00:04:08 1 00:00:00:00:00:00:08:08 1 matchSrcMac 00:00:c0:a8:04:08 matchDstMac 00:00:c0:a8:08:08
+174 ps_87_2 00:00:00:00:00:00:08:08 1 00:00:00:00:00:00:04:08 1 matchSrcMac 00:00:c0:a8:08:08 matchDstMac 00:00:c0:a8:04:08
+175 ps_88_1 00:00:00:00:00:00:04:09 1 00:00:00:00:00:00:08:09 1 matchSrcMac 00:00:c0:a8:04:09 matchDstMac 00:00:c0:a8:08:09
+176 ps_88_2 00:00:00:00:00:00:08:09 1 00:00:00:00:00:00:04:09 1 matchSrcMac 00:00:c0:a8:08:09 matchDstMac 00:00:c0:a8:04:09
+177 ps_89_1 00:00:00:00:00:00:04:0a 1 00:00:00:00:00:00:08:0a 1 matchSrcMac 00:00:c0:a8:04:0a matchDstMac 00:00:c0:a8:08:0a
+178 ps_89_2 00:00:00:00:00:00:08:0a 1 00:00:00:00:00:00:04:0a 1 matchSrcMac 00:00:c0:a8:08:0a matchDstMac 00:00:c0:a8:04:0a
+179 ps_90_1 00:00:00:00:00:00:04:0b 1 00:00:00:00:00:00:08:0b 1 matchSrcMac 00:00:c0:a8:04:0b matchDstMac 00:00:c0:a8:08:0b
+180 ps_90_2 00:00:00:00:00:00:08:0b 1 00:00:00:00:00:00:04:0b 1 matchSrcMac 00:00:c0:a8:08:0b matchDstMac 00:00:c0:a8:04:0b
+181 ps_91_1 00:00:00:00:00:00:06:02 1 00:00:00:00:00:00:08:02 1 matchSrcMac 00:00:c0:a8:06:02 matchDstMac 00:00:c0:a8:08:02
+182 ps_91_2 00:00:00:00:00:00:08:02 1 00:00:00:00:00:00:06:02 1 matchSrcMac 00:00:c0:a8:08:02 matchDstMac 00:00:c0:a8:06:02
+183 ps_92_1 00:00:00:00:00:00:06:03 1 00:00:00:00:00:00:08:03 1 matchSrcMac 00:00:c0:a8:06:03 matchDstMac 00:00:c0:a8:08:03
+184 ps_92_2 00:00:00:00:00:00:08:03 1 00:00:00:00:00:00:06:03 1 matchSrcMac 00:00:c0:a8:08:03 matchDstMac 00:00:c0:a8:06:03
+185 ps_93_1 00:00:00:00:00:00:06:04 1 00:00:00:00:00:00:08:04 1 matchSrcMac 00:00:c0:a8:06:04 matchDstMac 00:00:c0:a8:08:04
+186 ps_93_2 00:00:00:00:00:00:08:04 1 00:00:00:00:00:00:06:04 1 matchSrcMac 00:00:c0:a8:08:04 matchDstMac 00:00:c0:a8:06:04
+187 ps_94_1 00:00:00:00:00:00:06:05 1 00:00:00:00:00:00:08:05 1 matchSrcMac 00:00:c0:a8:06:05 matchDstMac 00:00:c0:a8:08:05
+188 ps_94_2 00:00:00:00:00:00:08:05 1 00:00:00:00:00:00:06:05 1 matchSrcMac 00:00:c0:a8:08:05 matchDstMac 00:00:c0:a8:06:05
+189 ps_95_1 00:00:00:00:00:00:06:06 1 00:00:00:00:00:00:08:06 1 matchSrcMac 00:00:c0:a8:06:06 matchDstMac 00:00:c0:a8:08:06
+190 ps_95_2 00:00:00:00:00:00:08:06 1 00:00:00:00:00:00:06:06 1 matchSrcMac 00:00:c0:a8:08:06 matchDstMac 00:00:c0:a8:06:06
+191 ps_96_1 00:00:00:00:00:00:06:07 1 00:00:00:00:00:00:08:07 1 matchSrcMac 00:00:c0:a8:06:07 matchDstMac 00:00:c0:a8:08:07
+192 ps_96_2 00:00:00:00:00:00:08:07 1 00:00:00:00:00:00:06:07 1 matchSrcMac 00:00:c0:a8:08:07 matchDstMac 00:00:c0:a8:06:07
+193 ps_97_1 00:00:00:00:00:00:06:08 1 00:00:00:00:00:00:08:08 1 matchSrcMac 00:00:c0:a8:06:08 matchDstMac 00:00:c0:a8:08:08
+194 ps_97_2 00:00:00:00:00:00:08:08 1 00:00:00:00:00:00:06:08 1 matchSrcMac 00:00:c0:a8:08:08 matchDstMac 00:00:c0:a8:06:08
+195 ps_98_1 00:00:00:00:00:00:06:09 1 00:00:00:00:00:00:08:09 1 matchSrcMac 00:00:c0:a8:06:09 matchDstMac 00:00:c0:a8:08:09
+196 ps_98_2 00:00:00:00:00:00:08:09 1 00:00:00:00:00:00:06:09 1 matchSrcMac 00:00:c0:a8:08:09 matchDstMac 00:00:c0:a8:06:09
+197 ps_99_1 00:00:00:00:00:00:06:0a 1 00:00:00:00:00:00:08:0a 1 matchSrcMac 00:00:c0:a8:06:0a matchDstMac 00:00:c0:a8:08:0a
+198 ps_99_2 00:00:00:00:00:00:08:0a 1 00:00:00:00:00:00:06:0a 1 matchSrcMac 00:00:c0:a8:08:0a matchDstMac 00:00:c0:a8:06:0a
+199 ps_100_1 00:00:00:00:00:00:06:0b 1 00:00:00:00:00:00:08:0b 1 matchSrcMac 00:00:c0:a8:06:0b matchDstMac 00:00:c0:a8:08:0b
+200 ps_100_2 00:00:00:00:00:00:08:0b 1 00:00:00:00:00:00:06:0b 1 matchSrcMac 00:00:c0:a8:08:0b matchDstMac 00:00:c0:a8:06:0b
diff --git a/web/topology_rest.py b/web/topology_rest.py
index 7bbf7ce..43865f1 100755
--- a/web/topology_rest.py
+++ b/web/topology_rest.py
@@ -691,8 +691,8 @@
@app.route("/gui/controller/<cmd>/<controller_name>")
def controller_status_change(cmd, controller_name):
if (TESTBED == "hw"):
- start_onos="cd; onos start %s" % (controller_name[-1:])
- stop_onos="cd; onos stop %s" % (controller_name[-1:])
+ start_onos="/home/admin/bin/onos start %s" % (controller_name[-1:])
+ stop_onos="/home/admin/bin/onos stop %s" % (controller_name[-1:])
else:
start_onos="ssh -i ~/.ssh/onlabkey.pem %s ONOS/start-onos.sh start" % (controller_name)
stop_onos="ssh -i ~/.ssh/onlabkey.pem %s ONOS/start-onos.sh stop" % (controller_name)
@@ -864,11 +864,11 @@
cmd = 'up'
result=""
host = controllers[0]
- cmd_string="~/ONOS/scripts/link.sh %s %s %s " % (src_dpid, port1, cmd)
+ cmd_string="~/ONOS/scripts/link-hw.sh %s %s %s " % (src_dpid, port1, cmd)
print cmd_string
res=os.popen(cmd_string).read()
result = result + ' ' + res
- cmd_string="~/ONOS/scripts/link.sh %s %s %s " % (dst_dpid, port2, cmd)
+ cmd_string="~/ONOS/scripts/link-hw.sh %s %s %s " % (dst_dpid, port2, cmd)
print cmd_string
res=os.popen(cmd_string).read()
result = result + ' ' + res
@@ -892,9 +892,9 @@
cmd_string="ssh -i ~/.ssh/onlabkey.pem %s 'cd ONOS/scripts; ./link.sh %s %s %s'" % (host, src_dpid, src_port, cmd)
else:
if ( src_dpid == "00:00:00:08:a2:08:f9:01" ):
- cmd_string="~/ONOS/scripts/link.sh %s %s %s " % ( dst_dpid, dst_port, cmd)
+ cmd_string="~/ONOS/scripts/link-hw.sh %s %s %s " % ( dst_dpid, dst_port, cmd)
else:
- cmd_string="~/ONOS/scripts/link.sh %s %s %s " % ( src_dpid, src_port, cmd)
+ cmd_string="~/ONOS/scripts/link-hw.sh %s %s %s " % ( src_dpid, src_port, cmd)
print cmd_string
result=os.popen(cmd_string).read()
@@ -957,34 +957,46 @@
src_host = controllers[0]
else:
hostid=int(src_dpid.split(':')[-2])
- src_host = controllers[hostid-1]
+ if TESTBED == "hw":
+ src_host = "mininet%i" % hostid
+ else:
+ src_host = controllers[hostid-1]
if dst_dpid in core_switches:
dst_host = controllers[0]
else:
hostid=int(dst_dpid.split(':')[-2])
- dst_host = controllers[hostid-1]
+ if TESTBED == "hw":
+ dst_host = "mininet%i" % hostid
+ else:
+ dst_host = controllers[hostid-1]
-# /runiperf.sh <flowid> <src_dpid> <dst_dpid> svr|client <proto>/<duration>/<interval>/<samples>
+# /runiperf.sh <flowid> <src_dpid> <dst_dpid> hw:svr|sw:svr|hw:client|sw:client <proto>/<duration>/<interval>/<samples>
protocol="udp"
interval=0.1
- cmd_string="ssh -i ~/.ssh/onlabkey.pem %s 'cd ONOS/scripts; ./runiperf.sh %d %s %s %s %s/%s/%s/%s'" % (dst_host, flowId, src_dpid, dst_dpid, "svr", protocol, duration, interval, samples)
+ if TESTBED == "hw":
+ cmd_string="dsh -w %s 'cd ONOS/scripts; " % dst_host
+ else:
+ cmd_string="ssh -i ~/.ssh/onlabkey.pem %s 'cd ONOS/scripts; " % dst_host
+ cmd_string += "./runiperf.sh %d %s %s %s:%s %s/%s/%s/%s'" % (flowId, src_dpid, dst_dpid, TESTBED, "svr", protocol, duration, interval, samples)
print cmd_string
os.popen(cmd_string)
- cmd_string="ssh -i ~/.ssh/onlabkey.pem %s 'cd ONOS/scripts; ./runiperf.sh %d %s %s %s %s/%s/%s/%s'" % (src_host, flowId, src_dpid, dst_dpid, "client", protocol, duration, interval, samples)
+ if TESTBED == "hw":
+ cmd_string="dsh -w %s 'cd ONOS/scripts; " % src_host
+ else:
+ cmd_string="ssh -i ~/.ssh/onlabkey.pem %s 'cd ONOS/scripts;" % src_host
+ cmd_string+="./runiperf.sh %d %s %s %s:%s %s/%s/%s/%s'" % (flowId, src_dpid, dst_dpid, TESTBED, "client", protocol, duration, interval, samples)
print cmd_string
os.popen(cmd_string)
return cmd_string
+
#* Get Iperf Throughput
#http://localhost:9000/gui/iperf/rate/<flow_id>
@app.route("/gui/iperf/rate/<flow_id>")
def iperf_rate(flow_id):
- if (TESTBED == "hw"):
- return "{}"
-
try:
command = "curl -s \'http://%s:%s/wm/flow/get/%s/json\'" % (RestIP, RestPort, flow_id)
print command
@@ -1005,9 +1017,12 @@
dst_port = parsedResult['dataPath']['dstPort']['port']['value']
if dst_dpid in core_switches:
- host = controllers[0]
+ host = controllers[0]
else:
- hostid=int(dst_dpid.split(':')[-2])
+ hostid=int(dst_dpid.split(':')[-2])
+ if TESTBED == "hw":
+ host = "mininet%i" % hostid
+ else:
host = controllers[hostid-1]
try:
@@ -1024,7 +1039,6 @@
resp = Response(result, status=200, mimetype='application/json')
return resp
-
if __name__ == "__main__":
random.seed()
read_config()