Merge pull request #360 from pgreyson/master
Map-based topology view and assorted
diff --git a/cassandra.titan b/cassandra.titan
index 2f34fb3..6c6670f 100644
--- a/cassandra.titan
+++ b/cassandra.titan
@@ -1,6 +1,5 @@
-storage.backend=cassandra
+storage.backend=cassandrathrift
storage.hostname=localhost
storage.keyspace=onos
storage.connection-pool-size=4096
storage.replication-factor=3
-storage.read-consistency-level=1
diff --git a/cluster-mgmt/bin/bootup.sh b/cluster-mgmt/bin/bootup.sh
new file mode 100755
index 0000000..e58e802
--- /dev/null
+++ b/cluster-mgmt/bin/bootup.sh
@@ -0,0 +1,20 @@
+#! /bin/bash
+. $HOME/bin/func.sh
+
+onos stop
+cassandra cleandb
+cassandra stop
+zk stop
+
+zk start
+cassandra start
+cassandra cleandb
+db_status=`cassandra checkdb |grep OK | wc -l`
+if [ $db_status != 1 ];then
+ echo $db_status
+ echo "Cassandra DB was screwed up. Need DB key drop"
+ exit
+fi
+onos start
+switch local
+#dsh -g $basename 'cd ONOS; ./ctrl-local.sh'
diff --git a/cluster-mgmt/bin/pingall-speedup.sh b/cluster-mgmt/bin/pingall-speedup.sh
index 0ffbf57..9bec6ba 100755
--- a/cluster-mgmt/bin/pingall-speedup.sh
+++ b/cluster-mgmt/bin/pingall-speedup.sh
@@ -4,7 +4,9 @@
elif [ ! -f ${HOME}/ONOS/web/$1 ]; then
echo "no such flowdef file: $1"
fi
-dsh "cd ONOS/web; ./pingallm-local.py $1" > /tmp/.pingall.result.$$
-cat /tmp/.pingall.result.$$ | grep "Pingall flow" | sort -n -k 4
-cat /tmp/.pingall.result.$$ | grep "Pingall Result" | awk '{s+=$5; f+=$7; i+=$9}END{printf("Pingall Result: success %d fail %d incomplete %d\n",s,f,i)}'
+logfile="/tmp/.$USER.pingall.result.$$"
+echo "Raw data at $logfile"
+dsh "cd ONOS/web; ./pingallm-local.py $1" > $logfile
+cat $logfile | grep "Pingall flow" | sort -n -k 4
+cat $logfile | grep "Pingall Result" | awk '{s+=$5; f+=$7; i+=$9}END{printf("Pingall Result: success %d fail %d incomplete %d\n",s,f,i)}'
diff --git a/cluster-mgmt/bin/start.sh b/cluster-mgmt/bin/start.sh
index e58e802..277d69b 100755
--- a/cluster-mgmt/bin/start.sh
+++ b/cluster-mgmt/bin/start.sh
@@ -3,12 +3,7 @@
onos stop
cassandra cleandb
-cassandra stop
-zk stop
-zk start
-cassandra start
-cassandra cleandb
db_status=`cassandra checkdb |grep OK | wc -l`
if [ $db_status != 1 ];then
echo $db_status
diff --git a/conf/onos.properties b/conf/onos.properties
new file mode 100644
index 0000000..668da42
--- /dev/null
+++ b/conf/onos.properties
@@ -0,0 +1,18 @@
+floodlight.modules = net.floodlightcontroller.storage.memory.MemoryStorageSource,\
+net.floodlightcontroller.core.FloodlightProvider,\
+net.floodlightcontroller.threadpool.ThreadPool,\
+net.floodlightcontroller.devicemanager.internal.DeviceManagerImpl,\
+net.floodlightcontroller.staticflowentry.StaticFlowEntryPusher,\
+net.floodlightcontroller.counter.CounterStore,\
+net.floodlightcontroller.perfmon.PktInProcessingTime,\
+net.floodlightcontroller.ui.web.StaticWebRoutable,\
+net.floodlightcontroller.onoslistener.OnosPublisher, \
+net.onrc.onos.registry.controller.ZookeeperRegistry
+net.floodlightcontroller.restserver.RestApiServer.port = 8080
+net.floodlightcontroller.core.FloodlightProvider.openflowport = 6633
+net.floodlightcontroller.core.FloodlightProvider.workerthreads = 16
+net.floodlightcontroller.jython.JythonDebugInterface.port = 6655
+net.floodlightcontroller.forwarding.Forwarding.idletimeout = 5
+net.floodlightcontroller.forwarding.Forwarding.hardtimeout = 0
+net.floodlightcontroller.onoslistener.OnosPublisher.dbconf = /tmp/cassandra.titan
+
diff --git a/scripts/ctrl-sw.sh b/scripts/ctrl-sw.sh
new file mode 100755
index 0000000..401b7fa
--- /dev/null
+++ b/scripts/ctrl-sw.sh
@@ -0,0 +1,31 @@
+#! /usr/bin/env python
+import sys
+import time
+import os
+import re
+import json
+import socket
+
+CONFIG_FILE=os.getenv("HOME") + "/ONOS/web/config.json"
+
+def read_config():
+ global controllers
+ f = open(CONFIG_FILE)
+ conf = json.load(f)
+ controllers = conf['controllers']
+ f.close()
+
+if __name__ == "__main__":
+ read_config()
+
+ url = ""
+ for idx in sys.argv[1:]:
+ url += "tcp:%s:6633" % socket.gethostbyname(controllers[int(idx)-1]) + " "
+
+ print url[:-1]
+
+ switches = os.popen("sudo ovs-vsctl list-br").read().split("\n");
+ switches.remove('')
+ for s in switches:
+ print "set switch %s controller %s" % (s, url)
+ os.popen("sudo ovs-vsctl set-controller %s %s" % (s, url) )
diff --git a/scripts/runiperf.sh b/scripts/runiperf.sh
index ec903e3..3df4fb0 100755
--- a/scripts/runiperf.sh
+++ b/scripts/runiperf.sh
@@ -24,21 +24,24 @@
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)
- killcmd='pkill -KILL -f \"iperf .* -o .*/iperf_%s.out\"' % (flowid)
+# 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)
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)
- killcmd='pkill -KILL -f \"iperf .* -o .*/iperfsvr_%s.out\"' % (flowid)
+# 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)
+ killcmd='sudo pkill -KILL -f \"iperf .* -o .*/iperfsvr_%s.out\"' % (flowid)
print killcmd
print cmd
else:
- 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)
- killcmd='pkill -KILL -f \"iperf .* -o .*/iperfclient_%s.out\"' % (flowid)
+ 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)
+ killcmd='sudo pkill -KILL -f \"iperf .* -o .*/iperfclient_%s.out\"' % (flowid)
print killcmd
print cmd
os.popen(killcmd)
diff --git a/src/main/java/net/floodlightcontroller/core/INetMapTopologyObjects.java b/src/main/java/net/floodlightcontroller/core/INetMapTopologyObjects.java
index 73b21fe..4a03327 100644
--- a/src/main/java/net/floodlightcontroller/core/INetMapTopologyObjects.java
+++ b/src/main/java/net/floodlightcontroller/core/INetMapTopologyObjects.java
@@ -44,10 +44,11 @@
@JsonProperty("ports")
@Adjacency(label="on")
public Iterable<IPortObject> getPorts();
-
- @JsonIgnore
- @GremlinGroovy("_().out('on').has('number',port_num)")
- public IPortObject getPort(final short port_num);
+
+// Requires Frames 2.3.0
+// @JsonIgnore
+// @GremlinGroovy("_().out('on').has('number',port_num)")
+// public IPortObject getPort(@GremlinParam("port_num") final short port_num);
@Adjacency(label="on")
public void addPort(final IPortObject port);
diff --git a/src/main/java/net/floodlightcontroller/core/internal/SwitchStorageImpl.java b/src/main/java/net/floodlightcontroller/core/internal/SwitchStorageImpl.java
index f040881..b8197b7 100644
--- a/src/main/java/net/floodlightcontroller/core/internal/SwitchStorageImpl.java
+++ b/src/main/java/net/floodlightcontroller/core/internal/SwitchStorageImpl.java
@@ -48,7 +48,7 @@
log.info("SwitchStorage:setStatus dpid:{} state: {} done", dpid, state);
} else {
conn.endTx(Transaction.ROLLBACK);
- log.info("SwitchStorage:setStatus dpid:{} state: {} failed", dpid, state);
+ log.info("SwitchStorage:setStatus dpid:{} state: {} failed: switch not found", dpid, state);
}
}
@@ -83,9 +83,12 @@
conn.endTx(Transaction.COMMIT);
}
+ } else {
+ log.error("SwitchStorage:addPort dpid:{} port:{} : failed switch does not exist", dpid, port.getPortNumber());
}
} catch (Exception e) {
// TODO: handle exceptions
+ e.printStackTrace();
conn.endTx(Transaction.ROLLBACK);
log.error("SwitchStorage:addPort dpid:{} port:{} failed", dpid, port.getPortNumber());
}
@@ -115,32 +118,37 @@
log.info("SwitchStorage:addSwitch(): dpid {} ", dpid);
- try {
- ISwitchObject sw = conn.utils().searchSwitch(conn, dpid);
- if (sw != null) {
- /*
- * Do nothing or throw exception?
- */
-
- log.info("SwitchStorage:addSwitch dpid:{} already exists", dpid);
- sw.setState(SwitchState.ACTIVE.toString());
- conn.endTx(Transaction.COMMIT);
- } else {
- sw = conn.utils().newSwitch(conn);
+ try {
+ ISwitchObject sw = conn.utils().searchSwitch(conn, dpid);
+ if (sw != null) {
+ /*
+ * Do nothing or throw exception?
+ */
- sw.setType("switch");
- sw.setDPID(dpid);
- sw.setState(SwitchState.ACTIVE.toString());
- conn.endTx(Transaction.COMMIT);
- log.info("SwitchStorage:addSwitch dpid:{} added", dpid);
- }
- } catch (Exception e) {
- /*
- * retry?
- */
- conn.endTx(Transaction.ROLLBACK);
- log.info("SwitchStorage:addSwitch dpid:{} failed", dpid);
- }
+ log.info("SwitchStorage:addSwitch dpid:{} already exists", dpid);
+ sw.setState(SwitchState.ACTIVE.toString());
+ conn.endTx(Transaction.COMMIT);
+ } else {
+ sw = conn.utils().newSwitch(conn);
+
+ if (sw != null) {
+ sw.setType("switch");
+ sw.setDPID(dpid);
+ sw.setState(SwitchState.ACTIVE.toString());
+ conn.endTx(Transaction.COMMIT);
+ log.info("SwitchStorage:addSwitch dpid:{} added", dpid);
+ } else {
+ log.error("switchStorage:addSwitch dpid:{} failed -> newSwitch failed", dpid);
+ }
+ }
+ } catch (Exception e) {
+ /*
+ * retry?
+ */
+ e.printStackTrace();
+ conn.endTx(Transaction.ROLLBACK);
+ log.info("SwitchStorage:addSwitch dpid:{} failed", dpid);
+ }
}
@@ -160,6 +168,7 @@
}
} catch (Exception e) {
// TODO: handle exceptions
+ e.printStackTrace();
conn.endTx(Transaction.ROLLBACK);
log.error("SwitchStorage:deleteSwitch {} failed", dpid);
}
diff --git a/src/main/java/net/floodlightcontroller/core/internal/TopoSwitchServiceImpl.java b/src/main/java/net/floodlightcontroller/core/internal/TopoSwitchServiceImpl.java
index 9f63fd7..931802e 100644
--- a/src/main/java/net/floodlightcontroller/core/internal/TopoSwitchServiceImpl.java
+++ b/src/main/java/net/floodlightcontroller/core/internal/TopoSwitchServiceImpl.java
@@ -1,14 +1,14 @@
package net.floodlightcontroller.core.internal;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
import net.floodlightcontroller.core.INetMapTopologyObjects.IPortObject;
import net.floodlightcontroller.core.INetMapTopologyObjects.ISwitchObject;
import net.floodlightcontroller.core.INetMapTopologyService.ITopoSwitchService;
import net.onrc.onos.util.GraphDBConnection;
import net.onrc.onos.util.GraphDBConnection.Transaction;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
public class TopoSwitchServiceImpl implements ITopoSwitchService {
private GraphDBConnection conn;
@@ -21,7 +21,7 @@
@Override
public void close() {
- conn.endTx(Transaction.COMMIT);
+
conn.close();
}
diff --git a/src/main/java/net/floodlightcontroller/flowcache/FlowManager.java b/src/main/java/net/floodlightcontroller/flowcache/FlowManager.java
index fc94260..4de2cbc 100644
--- a/src/main/java/net/floodlightcontroller/flowcache/FlowManager.java
+++ b/src/main/java/net/floodlightcontroller/flowcache/FlowManager.java
@@ -102,13 +102,14 @@
private final ScheduledExecutorService mapReaderScheduler =
Executors.newScheduledThreadPool(1);
+ private final ScheduledExecutorService shortestPathReconcileScheduler =
+ Executors.newScheduledThreadPool(1);
+
final Runnable mapReader = new Runnable() {
public void run() {
long startTime = System.nanoTime();
int counterAllFlowEntries = 0;
int counterMyNotUpdatedFlowEntries = 0;
- int counterAllFlowPaths = 0;
- int counterMyFlowPaths = 0;
if (floodlightProvider == null) {
log.debug("FloodlightProvider service not found!");
@@ -120,7 +121,6 @@
new LinkedList<IFlowEntry>();
LinkedList<IFlowEntry> deleteFlowEntries =
new LinkedList<IFlowEntry>();
- LinkedList<IFlowPath> deleteFlows = new LinkedList<IFlowPath>();
//
// Fetch all Flow Entries and select only my Flow Entries
@@ -218,6 +218,45 @@
conn.utils().removeFlowEntry(conn, flowEntryObj);
}
+ conn.endTx(Transaction.COMMIT);
+
+ if (processed_measurement_flow) {
+ long estimatedTime =
+ System.nanoTime() - modifiedMeasurementFlowTime;
+ String logMsg = "MEASUREMENT: Pushed Flow delay: " +
+ (double)estimatedTime / 1000000000 + " sec";
+ log.debug(logMsg);
+ }
+
+ long estimatedTime = System.nanoTime() - startTime;
+ double rate = 0.0;
+ if (estimatedTime > 0)
+ rate = ((double)counterAllFlowEntries * 1000000000) / estimatedTime;
+ String logMsg = "MEASUREMENT: Processed AllFlowEntries: " +
+ counterAllFlowEntries + " MyNotUpdatedFlowEntries: " +
+ counterMyNotUpdatedFlowEntries + " in " +
+ (double)estimatedTime / 1000000000 + " sec: " +
+ rate + " paths/s";
+ log.debug(logMsg);
+ }
+ };
+
+ final Runnable shortestPathReconcile = new Runnable() {
+ public void run() {
+ long startTime = System.nanoTime();
+ int counterAllFlowPaths = 0;
+ int counterMyFlowPaths = 0;
+
+ if (floodlightProvider == null) {
+ log.debug("FloodlightProvider service not found!");
+ return;
+ }
+ Map<Long, IOFSwitch> mySwitches =
+ floodlightProvider.getSwitches();
+ LinkedList<IFlowPath> deleteFlows = new LinkedList<IFlowPath>();
+
+ boolean processed_measurement_flow = false;
+
//
// Fetch and recompute the Shortest Path for those
// Flow Paths this controller is responsible for.
@@ -228,11 +267,6 @@
counterAllFlowPaths++;
if (flowPathObj == null)
continue;
- String dataPathSummaryStr = flowPathObj.getDataPathSummary();
- if (dataPathSummaryStr == null)
- continue; // Could be invalid entry?
- if (dataPathSummaryStr.isEmpty())
- continue; // No need to maintain this flow
String srcDpidStr = flowPathObj.getSrcSwitch();
if (srcDpidStr == null)
@@ -250,6 +284,13 @@
if (mySwitch == null)
continue; // Ignore: not my responsibility
+ // Test the Data Path Summary string
+ String dataPathSummaryStr = flowPathObj.getDataPathSummary();
+ if (dataPathSummaryStr == null)
+ continue; // Could be invalid entry?
+ if (dataPathSummaryStr.isEmpty())
+ continue; // No need to maintain this flow
+
//
// Test whether we need to complete the Flow cleanup,
// if the Flow has been deleted by the user.
@@ -336,9 +377,7 @@
double rate = 0.0;
if (estimatedTime > 0)
rate = ((double)counterAllFlowPaths * 1000000000) / estimatedTime;
- String logMsg = "MEASUREMENT: Processed AllFlowEntries: " +
- counterAllFlowEntries + " MyNotUpdatedFlowEntries: " +
- counterMyNotUpdatedFlowEntries + " AllFlowPaths: " +
+ String logMsg = "MEASUREMENT: Processed AllFlowPaths: " +
counterAllFlowPaths + " MyFlowPaths: " +
counterMyFlowPaths + " in " +
(double)estimatedTime / 1000000000 + " sec: " +
@@ -350,6 +389,9 @@
final ScheduledFuture<?> mapReaderHandle =
mapReaderScheduler.scheduleAtFixedRate(mapReader, 3, 3, TimeUnit.SECONDS);
+ final ScheduledFuture<?> shortestPathReconcileHandle =
+ shortestPathReconcileScheduler.scheduleAtFixedRate(shortestPathReconcile, 3, 3, TimeUnit.SECONDS);
+
@Override
public void init(String conf) {
conn = GraphDBConnection.getInstance(conf);
@@ -1232,44 +1274,15 @@
*/
@Override
public FlowPath addAndMaintainShortestPathFlow(FlowPath flowPath) {
- String dataPathSummaryStr = null;
-
//
- // Do the shortest path computation
+ // Don't do the shortest path computation here.
+ // Instead, let the Flow reconciliation thread take care of it.
//
- DataPath dataPath =
- topoRouteService.getShortestPath(flowPath.dataPath().srcPort(),
- flowPath.dataPath().dstPort());
- if (dataPath == null) {
- // We need the DataPath to populate the Network MAP
- dataPath = new DataPath();
- dataPath.setSrcPort(flowPath.dataPath().srcPort());
- dataPath.setDstPort(flowPath.dataPath().dstPort());
- }
- // Compute the Data Path summary
- dataPathSummaryStr = dataPath.dataPathSummary();
-
- //
- // Set the incoming port matching and the outgoing port output
- // actions for each flow entry.
- //
- for (FlowEntry flowEntry : dataPath.flowEntries()) {
- // Set the incoming port matching
- FlowEntryMatch flowEntryMatch = new FlowEntryMatch();
- flowEntry.setFlowEntryMatch(flowEntryMatch);
- flowEntryMatch.enableInPort(flowEntry.inPort());
-
- // Set the outgoing port output action
- ArrayList<FlowEntryAction> flowEntryActions = flowEntry.flowEntryActions();
- if (flowEntryActions == null) {
- flowEntryActions = new ArrayList<FlowEntryAction>();
- flowEntry.setFlowEntryActions(flowEntryActions);
- }
- FlowEntryAction flowEntryAction = new FlowEntryAction();
- flowEntryAction.setActionOutput(flowEntry.outPort());
- flowEntryActions.add(flowEntryAction);
- }
+ // We need the DataPath to populate the Network MAP
+ DataPath dataPath = new DataPath();
+ dataPath.setSrcPort(flowPath.dataPath().srcPort());
+ dataPath.setDstPort(flowPath.dataPath().dstPort());
//
// Prepare the computed Flow Path
@@ -1281,6 +1294,7 @@
computedFlowPath.setFlowEntryMatch(new FlowEntryMatch(flowPath.flowEntryMatch()));
FlowId flowId = new FlowId();
+ String dataPathSummaryStr = dataPath.dataPathSummary();
if (! addFlow(computedFlowPath, flowId, dataPathSummaryStr))
return null;
@@ -1323,73 +1337,14 @@
//
// Remove the old Flow Entries, and add the new Flow Entries
//
-
- //
- // Remove the Flow Entries from the Network MAP
- //
Iterable<IFlowEntry> flowEntries = flowObj.getFlowEntries();
LinkedList<IFlowEntry> deleteFlowEntries = new LinkedList<IFlowEntry>();
for (IFlowEntry flowEntryObj : flowEntries) {
- String dpidStr = flowEntryObj.getSwitchDpid();
- if (dpidStr == null)
- continue;
- Dpid dpid = new Dpid(dpidStr);
- IOFSwitch mySwitch = mySwitches.get(dpid.value());
-
flowEntryObj.setUserState("FE_USER_DELETE");
- if (mySwitch == null) {
- //
- // Not my switch. Mark it for deletion in the Network MAP
- //
- flowEntryObj.setSwitchState("FE_SWITCH_NOT_UPDATED");
- continue;
- }
-
- deleteFlowEntries.add(flowEntryObj);
-
- //
- // Delete the flow entry from the switch
- //
- // flowEntryObj.setSwitchState("FE_SWITCH_NOT_UPDATED");
- installFlowEntry(mySwitch, flowObj, flowEntryObj);
- // flowEntryObj.setSwitchState("FE_SWITCH_UPDATED");
+ flowEntryObj.setSwitchState("FE_SWITCH_NOT_UPDATED");
}
- for (IFlowEntry flowEntryObj : deleteFlowEntries) {
- flowObj.removeFlowEntry(flowEntryObj);
- conn.utils().removeFlowEntry(conn, flowEntryObj);
- }
-
- //
- // Install the new shortest path into the Network MAP and the switches.
- //
for (FlowEntry flowEntry : newDataPath.flowEntries()) {
- flowEntry.setFlowEntryUserState(FlowEntryUserState.FE_USER_ADD);
- IFlowEntry flowEntryObj = addFlowEntry(flowObj, flowEntry);
- if (flowEntryObj == null) {
- //
- // TODO: Remove the "new Object[] wrapper in the statement
- // below after the SLF4J logger is upgraded to
- // Version 1.7.5
- //
- log.error("Cannot add Flow Entry to switch {} for Path Flow from {} to {} : Flow Entry not in the Network MAP",
- new Object[] {
- flowEntry.dpid(),
- newDataPath.srcPort(),
- newDataPath.dstPort()
- });
- continue;
- }
-
- IOFSwitch mySwitch = mySwitches.get(flowEntry.dpid().value());
- if (mySwitch == null) {
- // Not my switch: just add to the Network MAP
- continue;
- }
-
- // Install the Flow Entry into the switch
- if (installFlowEntry(mySwitch, flowObj, flowEntryObj)) {
- flowEntryObj.setSwitchState("FE_SWITCH_UPDATED");
- }
+ addFlowEntry(flowObj, flowEntry);
}
//
diff --git a/src/main/java/net/floodlightcontroller/linkdiscovery/internal/LinkStorageImpl.java b/src/main/java/net/floodlightcontroller/linkdiscovery/internal/LinkStorageImpl.java
index 0ab52e2..d62d65b 100644
--- a/src/main/java/net/floodlightcontroller/linkdiscovery/internal/LinkStorageImpl.java
+++ b/src/main/java/net/floodlightcontroller/linkdiscovery/internal/LinkStorageImpl.java
@@ -1,9 +1,7 @@
package net.floodlightcontroller.linkdiscovery.internal;
import java.util.ArrayList;
-import java.util.Collection;
import java.util.List;
-import java.util.Set;
import net.floodlightcontroller.core.INetMapTopologyObjects.IPortObject;
import net.floodlightcontroller.core.INetMapTopologyObjects.ISwitchObject;
@@ -13,7 +11,6 @@
import net.floodlightcontroller.linkdiscovery.LinkInfo;
import net.floodlightcontroller.routing.Link;
import net.onrc.onos.util.GraphDBConnection;
-import net.onrc.onos.util.GraphDBConnection.GenerateEvent;
import net.onrc.onos.util.GraphDBConnection.Transaction;
import org.openflow.util.HexString;
@@ -21,20 +18,15 @@
import org.slf4j.LoggerFactory;
import com.thinkaurelius.titan.core.TitanException;
-import com.thinkaurelius.titan.core.TitanFactory;
-import com.thinkaurelius.titan.core.TitanGraph;
import com.tinkerpop.blueprints.Direction;
-import com.tinkerpop.blueprints.TransactionalGraph.Conclusion;
-import com.tinkerpop.blueprints.Vertex;
import com.tinkerpop.blueprints.Edge;
-import com.tinkerpop.blueprints.util.wrappers.event.EventGraph;
-import com.tinkerpop.blueprints.util.wrappers.event.EventTransactionalGraph;
+import com.tinkerpop.blueprints.Vertex;
import com.tinkerpop.gremlin.java.GremlinPipeline;
import com.tinkerpop.pipes.PipeFunction;
import com.tinkerpop.pipes.transform.PathPipe;
public class LinkStorageImpl implements ILinkStorage {
- public TitanGraph graph;
+
protected static Logger log = LoggerFactory.getLogger(LinkStorageImpl.class);
protected String conf;
@@ -63,18 +55,6 @@
break;
}
}
-
- private Vertex getPortVertex(String dpid, short port) {
- Vertex vsw, vport = null;
- if ((vsw = graph.getVertices("dpid", dpid).iterator().next()) != null) {
- GremlinPipeline<Vertex, Vertex> pipe = new GremlinPipeline<Vertex, Vertex>();
- pipe.start(vsw).out("on").has("number", port);
- if (pipe.hasNext()) {
- vport = pipe.next();
- }
- }
- return vport;
- }
public void addOrUpdateLink(Link lt, LinkInfo linkinfo, DM_OPERATION op) {
GraphDBConnection conn = GraphDBConnection.getInstance(this.conf);
@@ -96,9 +76,9 @@
if (vportSrc != null && vportDst != null) {
// check if the link exists
- List<IPortObject> currLinks = new ArrayList<IPortObject>();
- Iterable<IPortObject> currPorts = vportSrc.getLinkedPorts();
+ Iterable<IPortObject> currPorts = vportSrc.getLinkedPorts();
+ List<IPortObject> currLinks = new ArrayList<IPortObject>();
for (IPortObject V : currPorts) {
currLinks.add(V);
}
@@ -110,20 +90,21 @@
new Object[]{op, lt, vportSrc, vportDst});
}
} else {
- conn.getFramedGraph().addEdge(null, vportSrc.asVertex(), vportDst.asVertex(), "link");
+ vportSrc.setLinkPort(vportDst);
+
conn.endTx(Transaction.COMMIT);
log.debug("addOrUpdateLink(): link added {} {} src {} dst {}", new Object[]{op, lt, vportSrc, vportDst});
}
} else {
log.error("addOrUpdateLink(): failed invalid vertices {} {} src {} dst {}", new Object[]{op, lt, vportSrc, vportDst});
- conn.endTx(Transaction.ROLLBACK);
+ // conn.endTx(Transaction.ROLLBACK);
}
} catch (TitanException e) {
/*
* retry till we succeed?
*/
- log.error("addOrUpdateLink(): titan exception {} {} {}", new Object[]{op, lt, e.toString()});
e.printStackTrace();
+ log.error("addOrUpdateLink(): titan exception {} {} {}", new Object[]{op, lt, e.toString()});
}
}
@@ -155,7 +136,6 @@
port = lt.getDstPort();
vportDst = conn.utils().searchPort(conn, dpid, port);
// FIXME: This needs to remove all edges
- // FIXME: Events will only be generated on singleton graph object (GraphDBConnection)
if (vportSrc != null && vportDst != null) {
@@ -174,7 +154,7 @@
} else {
log.error("deleteLink(): failed invalid vertices {} src {} dst {}", new Object[]{lt, vportSrc, vportDst});
- conn.endTx(Transaction.ROLLBACK);
+// conn.endTx(Transaction.ROLLBACK);
}
} catch (TitanException e) {
@@ -189,13 +169,15 @@
// TODO: Fix me
@Override
public List<Link> getLinks(Long dpid, short port) {
- Vertex vportSrc, vportDst;
+ GraphDBConnection conn = GraphDBConnection.getInstance(this.conf);
+ IPortObject vportSrc, vportDst;
List<Link> links = null;
Link lt;
- vportSrc = getPortVertex(HexString.toHexString(dpid), port);
+ vportSrc = conn.utils().searchPort(conn, HexString.toHexString(dpid), port);
if (vportSrc != null) {
- for (Edge e : vportSrc.getEdges(Direction.OUT)) {
+
+ for (Edge e : vportSrc.asVertex().getEdges(Direction.OUT)) {
if (e.getLabel().equals("link")) {
break;
}
@@ -209,18 +191,7 @@
//TODO extract the DB location from properties
this.conf = conf;
- graph = TitanFactory.open(this.conf);
-
- // FIXME: These keys are not needed for Links but we better create it before using it as per titan
- Set<String> s = graph.getIndexedKeys(Vertex.class);
- if (!s.contains("dpid")) {
- graph.createKeyIndex("dpid", Vertex.class);
- graph.stopTransaction(Conclusion.SUCCESS);
- }
- if (!s.contains("type")) {
- graph.createKeyIndex("type", Vertex.class);
- graph.stopTransaction(Conclusion.SUCCESS);
- }
+
}
@Override
@@ -237,9 +208,9 @@
public List<Link> getActiveLinks() {
- ITopoSwitchService swService = new TopoSwitchServiceImpl();
+ GraphDBConnection conn = GraphDBConnection.getInstance(this.conf);
- Iterable<ISwitchObject> switches = swService.getActiveSwitches();
+ Iterable<ISwitchObject> switches = conn.utils().getActiveSwitches(conn);
List<Link> links = new ArrayList<Link>();
for (ISwitchObject sw : switches) {
@@ -292,7 +263,7 @@
@Override
public void close() {
// TODO Auto-generated method stub
- graph.shutdown();
+// graph.shutdown();
}
diff --git a/src/main/java/net/floodlightcontroller/onoslistener/OnosPublisher.java b/src/main/java/net/floodlightcontroller/onoslistener/OnosPublisher.java
index 6d8087b..e07196f 100644
--- a/src/main/java/net/floodlightcontroller/onoslistener/OnosPublisher.java
+++ b/src/main/java/net/floodlightcontroller/onoslistener/OnosPublisher.java
@@ -51,7 +51,7 @@
protected static final String CleanupEnabled = "EnableCleanup";
protected IThreadPoolService threadPool;
- protected final int CLEANUP_TASK_INTERVAL = 10; // 10 sec
+ protected final int CLEANUP_TASK_INTERVAL = 60; // 1 min
protected SingletonTask cleanupTask;
/**
diff --git a/src/main/java/net/onrc/onos/util/GraphDBConnection.java b/src/main/java/net/onrc/onos/util/GraphDBConnection.java
index 84a0501..4d23b0d 100644
--- a/src/main/java/net/onrc/onos/util/GraphDBConnection.java
+++ b/src/main/java/net/onrc/onos/util/GraphDBConnection.java
@@ -87,6 +87,7 @@
FramedGraph<TitanGraph> fg = new FramedGraph<TitanGraph>(graph);
return fg;
} else {
+ log.error("new FramedGraph failed");
return null;
}
}
@@ -118,16 +119,16 @@
public void endTx(Transaction tx) {
try {
- switch (tx) {
+ switch (tx) {
case COMMIT:
graph.stopTransaction(Conclusion.SUCCESS);
case ROLLBACK:
graph.stopTransaction(Conclusion.FAILURE);
}
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
+ } catch (Exception e) {
+ // TODO Auto-generated catch block
+ log.error("{}",e.toString());
+ }
}
public void endTx(TransactionHandle tr, Transaction tx) {
@@ -167,6 +168,7 @@
}
public void close() {
+ endTx(Transaction.COMMIT);
// graph.shutdown();
}
diff --git a/src/main/java/net/onrc/onos/util/GraphDBUtils.java b/src/main/java/net/onrc/onos/util/GraphDBUtils.java
index eea57fd..7ed51b9 100644
--- a/src/main/java/net/onrc/onos/util/GraphDBUtils.java
+++ b/src/main/java/net/onrc/onos/util/GraphDBUtils.java
@@ -38,7 +38,7 @@
// TODO Auto-generated method stub
FramedGraph<TitanGraph> fg = conn.getFramedGraph();
- return fg.getVertices("dpid",dpid).iterator().hasNext() ?
+ return (fg != null && fg.getVertices("dpid",dpid).iterator().hasNext()) ?
fg.getVertices("dpid",dpid,ISwitchObject.class).iterator().next() : null;
}
@@ -47,7 +47,7 @@
public IDeviceObject searchDevice(GraphDBConnection conn, String macAddr) {
// TODO Auto-generated method stub
FramedGraph<TitanGraph> fg = conn.getFramedGraph();
- return fg.getVertices("dl_address",macAddr).iterator().hasNext() ? fg.getVertices("dl_address",macAddr,
+ return (fg != null && fg.getVertices("dl_address",macAddr).iterator().hasNext()) ? fg.getVertices("dl_address",macAddr,
IDeviceObject.class).iterator().next() : null;
}
@@ -58,6 +58,9 @@
// if (sw != null) {
//
// IPortObject port = null;
+//
+ // Requires Frames 2.3.0
+//
// try {
// port = sw.getPort(number);
// } catch (Exception e) {
@@ -67,12 +70,15 @@
//
// return port;
// }
-// return null;
- GremlinPipeline<Vertex, IPortObject> pipe = new GremlinPipeline<Vertex, IPortObject>();
- pipe.start(sw.asVertex());
- pipe.out("on").has("number", number);
- FramedVertexIterable<IPortObject> r = new FramedVertexIterable<IPortObject>(conn.getFramedGraph(), (Iterable) pipe, IPortObject.class);
- return r.iterator().hasNext() ? r.iterator().next() : null;
+
+ if (sw != null) {
+ GremlinPipeline<Vertex, IPortObject> pipe = new GremlinPipeline<Vertex, IPortObject>();
+ pipe.start(sw.asVertex());
+ pipe.out("on").has("number", number);
+ FramedVertexIterable<IPortObject> r = new FramedVertexIterable<IPortObject>(conn.getFramedGraph(), (Iterable) pipe, IPortObject.class);
+ return r != null && r.iterator().hasNext() ? r.iterator().next() : null;
+ }
+ return null;
}
@Override
@@ -93,19 +99,19 @@
public void removePort(GraphDBConnection conn, IPortObject port) {
FramedGraph<TitanGraph> fg = conn.getFramedGraph();
// EventGraph<TitanGraph> eg = conn.getEventGraph();
- fg.removeVertex(port.asVertex());
+ if (fg != null) fg.removeVertex(port.asVertex());
}
@Override
public void removeDevice(GraphDBConnection conn, IDeviceObject dev) {
FramedGraph<TitanGraph> fg = conn.getFramedGraph();
- fg.removeVertex(dev.asVertex());
+ if (fg != null) fg.removeVertex(dev.asVertex());
}
@Override
public Iterable<IDeviceObject> getDevices(GraphDBConnection conn) {
FramedGraph<TitanGraph> fg = conn.getFramedGraph();
- return fg.getVertices("type","device",IDeviceObject.class);
+ return fg != null ? fg.getVertices("type","device",IDeviceObject.class) : null;
}
@Override
@@ -226,7 +232,12 @@
@Override
public ISwitchObject searchActiveSwitch(GraphDBConnection conn, String dpid) {
- // TODO Auto-generated method stub
- return null;
+
+ ISwitchObject sw = searchSwitch(conn, dpid);
+ if ((sw != null) &&
+ sw.getState().equals(SwitchState.ACTIVE.toString())) {
+ return sw;
+ }
+ return null;
}
}
diff --git a/web/link.json b/web/link.json
new file mode 100644
index 0000000..1bf2b66
--- /dev/null
+++ b/web/link.json
@@ -0,0 +1,2636 @@
+[
+ {
+ "dst-switch": "00:00:00:16:97:08:9a:46",
+ "src-switch": "00:00:00:00:ba:5e:ba:11",
+ "src-port": 2,
+ "dst-port": 2
+ },
+ {
+ "dst-switch": "00:00:00:08:a2:08:f9:01",
+ "src-switch": "00:00:00:00:ba:5e:ba:11",
+ "src-port": 3,
+ "dst-port": 2
+ },
+ {
+ "dst-switch": "00:00:00:00:00:00:02:01",
+ "src-switch": "00:00:00:00:ba:5e:ba:11",
+ "src-port": 4,
+ "dst-port": 51
+ },
+ {
+ "dst-switch": "00:00:00:00:00:00:05:01",
+ "src-switch": "00:00:00:00:00:00:ba:12",
+ "src-port": 5,
+ "dst-port": 26
+ },
+ {
+ "dst-switch": "00:00:00:00:00:00:04:01",
+ "src-switch": "00:00:00:00:00:00:ba:12",
+ "src-port": 4,
+ "dst-port": 26
+ },
+ {
+ "dst-switch": "00:00:00:08:a2:08:f9:01",
+ "src-switch": "00:00:00:00:00:00:ba:12",
+ "src-port": 2,
+ "dst-port": 3
+ },
+ {
+ "dst-switch": "00:00:00:00:ba:5e:ba:13",
+ "src-switch": "00:00:00:00:00:00:ba:12",
+ "src-port": 3,
+ "dst-port": 2
+ },
+ {
+ "dst-switch": "00:00:00:00:00:00:07:01",
+ "src-switch": "00:00:20:4e:7f:51:8a:35",
+ "src-port": 5,
+ "dst-port": 26
+ },
+ {
+ "dst-switch": "00:00:00:16:97:08:9a:46",
+ "src-switch": "00:00:20:4e:7f:51:8a:35",
+ "src-port": 2,
+ "dst-port": 3
+ },
+ {
+ "dst-switch": "00:00:00:08:a2:08:f9:01",
+ "src-switch": "00:00:20:4e:7f:51:8a:35",
+ "src-port": 3,
+ "dst-port": 4
+ },
+ {
+ "dst-switch": "00:00:00:00:ba:5e:ba:13",
+ "src-switch": "00:00:20:4e:7f:51:8a:35",
+ "src-port": 4,
+ "dst-port": 3
+ },
+ {
+ "dst-switch": "00:00:00:00:00:00:06:01",
+ "src-switch": "00:00:00:00:ba:5e:ba:13",
+ "src-port": 4,
+ "dst-port": 26
+ },
+ {
+ "dst-switch": "00:00:00:00:00:00:ba:12",
+ "src-switch": "00:00:00:00:ba:5e:ba:13",
+ "src-port": 2,
+ "dst-port": 3
+ },
+ {
+ "dst-switch": "00:00:20:4e:7f:51:8a:35",
+ "src-switch": "00:00:00:00:ba:5e:ba:13",
+ "src-port": 3,
+ "dst-port": 4
+ },
+ {
+ "dst-switch": "00:00:00:00:00:00:03:01",
+ "src-switch": "00:00:00:08:a2:08:f9:01",
+ "src-port": 5,
+ "dst-port": 26
+ },
+ {
+ "dst-switch": "00:00:00:00:ba:5e:ba:11",
+ "src-switch": "00:00:00:08:a2:08:f9:01",
+ "src-port": 2,
+ "dst-port": 3
+ },
+ {
+ "dst-switch": "00:00:00:00:00:00:ba:12",
+ "src-switch": "00:00:00:08:a2:08:f9:01",
+ "src-port": 3,
+ "dst-port": 2
+ },
+ {
+ "dst-switch": "00:00:20:4e:7f:51:8a:35",
+ "src-switch": "00:00:00:08:a2:08:f9:01",
+ "src-port": 4,
+ "dst-port": 3
+ },
+ {
+ "dst-switch": "00:00:00:00:00:00:08:01",
+ "src-switch": "00:00:00:16:97:08:9a:46",
+ "src-port": 4,
+ "dst-port": 26
+ },
+ {
+ "dst-switch": "00:00:00:00:ba:5e:ba:11",
+ "src-switch": "00:00:00:16:97:08:9a:46",
+ "src-port": 2,
+ "dst-port": 2
+ },
+ {
+ "dst-switch": "00:00:20:4e:7f:51:8a:35",
+ "src-switch": "00:00:00:16:97:08:9a:46",
+ "src-port": 3,
+ "dst-port": 2
+ },
+ {
+ "dst-port": 21,
+ "dst-switch": "00:00:00:00:00:00:07:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:07:15"
+ },
+ {
+ "dst-port": 15,
+ "dst-switch": "00:00:00:00:00:00:06:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:06:0f"
+ },
+ {
+ "dst-port": 17,
+ "dst-switch": "00:00:00:00:00:00:07:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:07:11"
+ },
+ {
+ "dst-port": 12,
+ "dst-switch": "00:00:00:00:00:00:06:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:06:0c"
+ },
+ {
+ "dst-port": 3,
+ "dst-switch": "00:00:00:00:00:00:03:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:03:03"
+ },
+ {
+ "dst-port": 22,
+ "dst-switch": "00:00:00:00:00:00:05:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:05:16"
+ },
+ {
+ "dst-port": 11,
+ "dst-switch": "00:00:00:00:00:00:07:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:07:0b"
+ },
+ {
+ "dst-port": 14,
+ "dst-switch": "00:00:00:00:00:00:03:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:03:0e"
+ },
+ {
+ "dst-port": 13,
+ "dst-switch": "00:00:00:00:00:00:03:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:03:0d"
+ },
+ {
+ "dst-port": 12,
+ "dst-switch": "00:00:00:00:00:00:04:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:04:0c"
+ },
+ {
+ "dst-port": 25,
+ "dst-switch": "00:00:00:00:00:00:06:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:06:19"
+ },
+ {
+ "dst-port": 18,
+ "dst-switch": "00:00:00:00:00:00:03:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:03:12"
+ },
+ {
+ "dst-port": 22,
+ "dst-switch": "00:00:00:00:00:00:02:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:02:16"
+ },
+ {
+ "dst-port": 6,
+ "dst-switch": "00:00:00:00:00:00:07:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:07:06"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:01:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:01:02"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:01:03",
+ "src-port": 3,
+ "src-switch": "00:00:00:00:00:00:01:02"
+ },
+ {
+ "dst-port": 51,
+ "dst-switch": "00:00:00:00:00:00:02:01",
+ "src-port": 4,
+ "src-switch": "00:00:00:00:00:00:01:02"
+ },
+ {
+ "dst-port": 17,
+ "dst-switch": "00:00:00:00:00:00:06:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:06:11"
+ },
+ {
+ "dst-port": 4,
+ "dst-switch": "00:00:00:00:00:00:02:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:02:04"
+ },
+ {
+ "dst-port": 6,
+ "dst-switch": "00:00:00:00:00:00:02:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:02:06"
+ },
+ {
+ "dst-port": 9,
+ "dst-switch": "00:00:00:00:00:00:03:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:03:09"
+ },
+ {
+ "dst-port": 20,
+ "dst-switch": "00:00:00:00:00:00:07:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:07:14"
+ },
+ {
+ "dst-port": 15,
+ "dst-switch": "00:00:00:00:00:00:03:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:03:0f"
+ },
+ {
+ "dst-port": 14,
+ "dst-switch": "00:00:00:00:00:00:04:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:04:0e"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:07:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:07:02"
+ },
+ {
+ "dst-port": 8,
+ "dst-switch": "00:00:00:00:00:00:03:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:03:08"
+ },
+ {
+ "dst-port": 13,
+ "dst-switch": "00:00:00:00:00:00:04:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:04:0d"
+ },
+ {
+ "dst-port": 11,
+ "dst-switch": "00:00:00:00:00:00:08:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:08:0b"
+ },
+ {
+ "dst-port": 22,
+ "dst-switch": "00:00:00:00:00:00:04:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:04:16"
+ },
+ {
+ "dst-port": 18,
+ "dst-switch": "00:00:00:00:00:00:08:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:08:12"
+ },
+ {
+ "dst-port": 26,
+ "dst-switch": "00:00:00:00:00:00:03:01",
+ "src-port": 5,
+ "src-switch": "00:00:00:00:00:00:01:03"
+ },
+ {
+ "dst-port": 3,
+ "dst-switch": "00:00:00:00:00:00:01:02",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:01:03"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:01:04",
+ "src-port": 3,
+ "src-switch": "00:00:00:00:00:00:01:03"
+ },
+ {
+ "dst-port": 3,
+ "dst-switch": "00:00:00:00:00:00:01:06",
+ "src-port": 4,
+ "src-switch": "00:00:00:00:00:00:01:03"
+ },
+ {
+ "dst-port": 7,
+ "dst-switch": "00:00:00:00:00:00:07:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:07:07"
+ },
+ {
+ "dst-port": 25,
+ "dst-switch": "00:00:00:00:00:00:07:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:07:19"
+ },
+ {
+ "dst-port": 26,
+ "dst-switch": "00:00:00:00:00:00:07:01",
+ "src-port": 6,
+ "src-switch": "00:00:00:00:00:00:01:06"
+ },
+ {
+ "dst-port": 4,
+ "dst-switch": "00:00:00:00:00:00:01:04",
+ "src-port": 5,
+ "src-switch": "00:00:00:00:00:00:01:06"
+ },
+ {
+ "dst-port": 3,
+ "dst-switch": "00:00:00:00:00:00:01:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:01:06"
+ },
+ {
+ "dst-port": 4,
+ "dst-switch": "00:00:00:00:00:00:01:03",
+ "src-port": 3,
+ "src-switch": "00:00:00:00:00:00:01:06"
+ },
+ {
+ "dst-port": 3,
+ "dst-switch": "00:00:00:00:00:00:01:05",
+ "src-port": 4,
+ "src-switch": "00:00:00:00:00:00:01:06"
+ },
+ {
+ "dst-port": 20,
+ "dst-switch": "00:00:00:00:00:00:04:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:04:14"
+ },
+ {
+ "dst-port": 8,
+ "dst-switch": "00:00:00:00:00:00:07:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:07:08"
+ },
+ {
+ "dst-port": 26,
+ "dst-switch": "00:00:00:00:00:00:05:01",
+ "src-port": 6,
+ "src-switch": "00:00:00:00:00:00:01:04"
+ },
+ {
+ "dst-port": 26,
+ "dst-switch": "00:00:00:00:00:00:04:01",
+ "src-port": 5,
+ "src-switch": "00:00:00:00:00:00:01:04"
+ },
+ {
+ "dst-port": 3,
+ "dst-switch": "00:00:00:00:00:00:01:03",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:01:04"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:01:05",
+ "src-port": 3,
+ "src-switch": "00:00:00:00:00:00:01:04"
+ },
+ {
+ "dst-port": 5,
+ "dst-switch": "00:00:00:00:00:00:01:06",
+ "src-port": 4,
+ "src-switch": "00:00:00:00:00:00:01:04"
+ },
+ {
+ "dst-port": 6,
+ "dst-switch": "00:00:00:00:00:00:04:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:04:06"
+ },
+ {
+ "dst-port": 5,
+ "dst-switch": "00:00:00:00:00:00:08:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:08:05"
+ },
+ {
+ "dst-port": 15,
+ "dst-switch": "00:00:00:00:00:00:07:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:07:0f"
+ },
+ {
+ "dst-port": 3,
+ "dst-switch": "00:00:00:00:00:00:01:04",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:01:05"
+ },
+ {
+ "dst-port": 4,
+ "dst-switch": "00:00:00:00:00:00:01:06",
+ "src-port": 3,
+ "src-switch": "00:00:00:00:00:00:01:05"
+ },
+ {
+ "dst-port": 26,
+ "dst-switch": "00:00:00:00:00:00:06:01",
+ "src-port": 4,
+ "src-switch": "00:00:00:00:00:00:01:05"
+ },
+ {
+ "dst-port": 25,
+ "dst-switch": "00:00:00:00:00:00:04:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:04:19"
+ },
+ {
+ "dst-port": 20,
+ "dst-switch": "00:00:00:00:00:00:03:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:03:14"
+ },
+ {
+ "dst-port": 12,
+ "dst-switch": "00:00:00:00:00:00:05:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:05:0c"
+ },
+ {
+ "dst-port": 14,
+ "dst-switch": "00:00:00:00:00:00:07:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:07:0e"
+ },
+ {
+ "dst-port": 25,
+ "dst-switch": "00:00:00:00:00:00:05:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:05:19"
+ },
+ {
+ "dst-port": 16,
+ "dst-switch": "00:00:00:00:00:00:04:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:04:10"
+ },
+ {
+ "dst-port": 10,
+ "dst-switch": "00:00:00:00:00:00:04:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:04:0a"
+ },
+ {
+ "dst-port": 11,
+ "dst-switch": "00:00:00:00:00:00:03:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:03:0b"
+ },
+ {
+ "dst-port": 15,
+ "dst-switch": "00:00:00:00:00:00:02:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:02:0f"
+ },
+ {
+ "dst-port": 12,
+ "dst-switch": "00:00:00:00:00:00:07:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:07:0c"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:03:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:03:02"
+ },
+ {
+ "dst-port": 22,
+ "dst-switch": "00:00:00:00:00:00:07:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:07:16"
+ },
+ {
+ "dst-port": 10,
+ "dst-switch": "00:00:00:00:00:00:03:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:03:0a"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:08:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:08:02"
+ },
+ {
+ "dst-port": 17,
+ "dst-switch": "00:00:00:00:00:00:03:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:03:11"
+ },
+ {
+ "dst-port": 31,
+ "dst-switch": "00:00:00:00:00:00:02:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:02:1f"
+ },
+ {
+ "dst-port": 11,
+ "dst-switch": "00:00:00:00:00:00:04:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:04:0b"
+ },
+ {
+ "dst-port": 17,
+ "dst-switch": "00:00:00:00:00:00:08:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:08:11"
+ },
+ {
+ "dst-port": 44,
+ "dst-switch": "00:00:00:00:00:00:02:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:02:2c"
+ },
+ {
+ "dst-port": 9,
+ "dst-switch": "00:00:00:00:00:00:04:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:04:09"
+ },
+ {
+ "dst-port": 25,
+ "dst-switch": "00:00:00:00:00:00:08:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:08:19"
+ },
+ {
+ "dst-port": 16,
+ "dst-switch": "00:00:00:00:00:00:07:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:07:10"
+ },
+ {
+ "dst-port": 23,
+ "dst-switch": "00:00:00:00:00:00:06:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:06:17"
+ },
+ {
+ "dst-port": 39,
+ "dst-switch": "00:00:00:00:00:00:02:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:02:27"
+ },
+ {
+ "dst-port": 14,
+ "dst-switch": "00:00:00:00:00:00:08:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:08:0e"
+ },
+ {
+ "dst-port": 11,
+ "dst-switch": "00:00:00:00:00:00:02:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:02:0b"
+ },
+ {
+ "dst-port": 21,
+ "dst-switch": "00:00:00:00:00:00:05:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:05:15"
+ },
+ {
+ "dst-port": 13,
+ "dst-switch": "00:00:00:00:00:00:07:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:07:0d"
+ },
+ {
+ "dst-port": 13,
+ "dst-switch": "00:00:00:00:00:00:06:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:06:0d"
+ },
+ {
+ "dst-port": 21,
+ "dst-switch": "00:00:00:00:00:00:03:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:03:15"
+ },
+ {
+ "dst-port": 27,
+ "dst-switch": "00:00:00:00:00:00:02:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:02:1b"
+ },
+ {
+ "dst-port": 3,
+ "dst-switch": "00:00:00:00:00:00:07:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:07:03"
+ },
+ {
+ "dst-port": 21,
+ "dst-switch": "00:00:00:00:00:00:06:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:06:15"
+ },
+ {
+ "dst-port": 13,
+ "dst-switch": "00:00:00:00:00:00:02:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:02:0d"
+ },
+ {
+ "dst-port": 5,
+ "dst-switch": "00:00:00:00:00:00:04:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:04:05"
+ },
+ {
+ "dst-port": 10,
+ "dst-switch": "00:00:00:00:00:00:08:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:08:0a"
+ },
+ {
+ "dst-port": 23,
+ "dst-switch": "00:00:00:00:00:00:08:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:08:17"
+ },
+ {
+ "dst-port": 18,
+ "dst-switch": "00:00:00:00:00:00:07:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:07:12"
+ },
+ {
+ "dst-port": 8,
+ "dst-switch": "00:00:00:00:00:00:08:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:08:08"
+ },
+ {
+ "dst-port": 8,
+ "dst-switch": "00:00:00:00:00:00:06:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:06:08"
+ },
+ {
+ "dst-port": 17,
+ "dst-switch": "00:00:00:00:00:00:02:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:02:11"
+ },
+ {
+ "dst-port": 23,
+ "dst-switch": "00:00:00:00:00:00:04:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:04:17"
+ },
+ {
+ "dst-port": 35,
+ "dst-switch": "00:00:00:00:00:00:02:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:02:23"
+ },
+ {
+ "dst-port": 38,
+ "dst-switch": "00:00:00:00:00:00:02:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:02:26"
+ },
+ {
+ "dst-port": 25,
+ "dst-switch": "00:00:00:00:00:00:03:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:03:19"
+ },
+ {
+ "dst-port": 4,
+ "dst-switch": "00:00:00:00:00:00:07:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:07:04"
+ },
+ {
+ "dst-port": 36,
+ "dst-switch": "00:00:00:00:00:00:02:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:02:24"
+ },
+ {
+ "dst-port": 10,
+ "dst-switch": "00:00:00:00:00:00:07:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:07:0a"
+ },
+ {
+ "dst-port": 23,
+ "dst-switch": "00:00:00:00:00:00:03:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:03:17"
+ },
+ {
+ "dst-port": 12,
+ "dst-switch": "00:00:00:00:00:00:02:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:02:0c"
+ },
+ {
+ "dst-port": 43,
+ "dst-switch": "00:00:00:00:00:00:02:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:02:2b"
+ },
+ {
+ "dst-port": 5,
+ "dst-switch": "00:00:00:00:00:00:07:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:07:05"
+ },
+ {
+ "dst-port": 8,
+ "dst-switch": "00:00:00:00:00:00:04:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:04:08"
+ },
+ {
+ "dst-port": 4,
+ "dst-switch": "00:00:00:00:00:00:08:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:08:04"
+ },
+ {
+ "dst-port": 24,
+ "dst-switch": "00:00:00:00:00:00:02:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:02:18"
+ },
+ {
+ "dst-port": 28,
+ "dst-switch": "00:00:00:00:00:00:02:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:02:1c"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:07:0c",
+ "src-port": 12,
+ "src-switch": "00:00:00:00:00:00:07:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:07:16",
+ "src-port": 22,
+ "src-switch": "00:00:00:00:00:00:07:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:07:14",
+ "src-port": 20,
+ "src-switch": "00:00:00:00:00:00:07:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:07:06",
+ "src-port": 6,
+ "src-switch": "00:00:00:00:00:00:07:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:07:0d",
+ "src-port": 13,
+ "src-switch": "00:00:00:00:00:00:07:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:07:13",
+ "src-port": 19,
+ "src-switch": "00:00:00:00:00:00:07:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:07:05",
+ "src-port": 5,
+ "src-switch": "00:00:00:00:00:00:07:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:07:12",
+ "src-port": 18,
+ "src-switch": "00:00:00:00:00:00:07:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:07:19",
+ "src-port": 25,
+ "src-switch": "00:00:00:00:00:00:07:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:07:07",
+ "src-port": 7,
+ "src-switch": "00:00:00:00:00:00:07:01"
+ },
+ {
+ "dst-port": 6,
+ "dst-switch": "00:00:00:00:00:00:01:06",
+ "src-port": 26,
+ "src-switch": "00:00:00:00:00:00:07:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:07:08",
+ "src-port": 8,
+ "src-switch": "00:00:00:00:00:00:07:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:07:11",
+ "src-port": 17,
+ "src-switch": "00:00:00:00:00:00:07:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:07:02",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:07:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:07:09",
+ "src-port": 9,
+ "src-switch": "00:00:00:00:00:00:07:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:07:0a",
+ "src-port": 10,
+ "src-switch": "00:00:00:00:00:00:07:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:07:17",
+ "src-port": 23,
+ "src-switch": "00:00:00:00:00:00:07:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:07:10",
+ "src-port": 16,
+ "src-switch": "00:00:00:00:00:00:07:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:07:0f",
+ "src-port": 15,
+ "src-switch": "00:00:00:00:00:00:07:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:07:18",
+ "src-port": 24,
+ "src-switch": "00:00:00:00:00:00:07:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:07:0e",
+ "src-port": 14,
+ "src-switch": "00:00:00:00:00:00:07:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:07:15",
+ "src-port": 21,
+ "src-switch": "00:00:00:00:00:00:07:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:07:03",
+ "src-port": 3,
+ "src-switch": "00:00:00:00:00:00:07:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:07:0b",
+ "src-port": 11,
+ "src-switch": "00:00:00:00:00:00:07:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:07:04",
+ "src-port": 4,
+ "src-switch": "00:00:00:00:00:00:07:01"
+ },
+ {
+ "dst-port": 16,
+ "dst-switch": "00:00:00:00:00:00:03:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:03:10"
+ },
+ {
+ "dst-port": 12,
+ "dst-switch": "00:00:00:00:00:00:03:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:03:0c"
+ },
+ {
+ "dst-port": 30,
+ "dst-switch": "00:00:00:00:00:00:02:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:02:1e"
+ },
+ {
+ "dst-port": 4,
+ "dst-switch": "00:00:00:00:00:00:06:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:06:04"
+ },
+ {
+ "dst-port": 19,
+ "dst-switch": "00:00:00:00:00:00:02:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:02:13"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:02:28",
+ "src-port": 40,
+ "src-switch": "00:00:00:00:00:00:02:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:02:16",
+ "src-port": 22,
+ "src-switch": "00:00:00:00:00:00:02:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:02:31",
+ "src-port": 49,
+ "src-switch": "00:00:00:00:00:00:02:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:02:0c",
+ "src-port": 12,
+ "src-switch": "00:00:00:00:00:00:02:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:02:1f",
+ "src-port": 31,
+ "src-switch": "00:00:00:00:00:00:02:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:02:14",
+ "src-port": 20,
+ "src-switch": "00:00:00:00:00:00:02:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:02:06",
+ "src-port": 6,
+ "src-switch": "00:00:00:00:00:00:02:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:02:1b",
+ "src-port": 27,
+ "src-switch": "00:00:00:00:00:00:02:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:02:22",
+ "src-port": 34,
+ "src-switch": "00:00:00:00:00:00:02:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:02:13",
+ "src-port": 19,
+ "src-switch": "00:00:00:00:00:00:02:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:02:0d",
+ "src-port": 13,
+ "src-switch": "00:00:00:00:00:00:02:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:02:29",
+ "src-port": 41,
+ "src-switch": "00:00:00:00:00:00:02:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:02:30",
+ "src-port": 48,
+ "src-switch": "00:00:00:00:00:00:02:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:02:05",
+ "src-port": 5,
+ "src-switch": "00:00:00:00:00:00:02:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:02:1c",
+ "src-port": 28,
+ "src-switch": "00:00:00:00:00:00:02:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:02:21",
+ "src-port": 33,
+ "src-switch": "00:00:00:00:00:00:02:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:02:12",
+ "src-port": 18,
+ "src-switch": "00:00:00:00:00:00:02:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:02:2a",
+ "src-port": 42,
+ "src-switch": "00:00:00:00:00:00:02:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:02:19",
+ "src-port": 25,
+ "src-switch": "00:00:00:00:00:00:02:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:02:2f",
+ "src-port": 47,
+ "src-switch": "00:00:00:00:00:00:02:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:02:2e",
+ "src-port": 46,
+ "src-switch": "00:00:00:00:00:00:02:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:02:07",
+ "src-port": 7,
+ "src-switch": "00:00:00:00:00:00:02:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:02:1a",
+ "src-port": 26,
+ "src-switch": "00:00:00:00:00:00:02:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:02:24",
+ "src-port": 36,
+ "src-switch": "00:00:00:00:00:00:02:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:02:08",
+ "src-port": 8,
+ "src-switch": "00:00:00:00:00:00:02:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:02:2d",
+ "src-port": 45,
+ "src-switch": "00:00:00:00:00:00:02:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:02:23",
+ "src-port": 35,
+ "src-switch": "00:00:00:00:00:00:02:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:02:11",
+ "src-port": 17,
+ "src-switch": "00:00:00:00:00:00:02:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:02:02",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:02:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:02:09",
+ "src-port": 9,
+ "src-switch": "00:00:00:00:00:00:02:01"
+ },
+ {
+ "dst-port": 4,
+ "dst-switch": "00:00:00:00:00:00:01:02",
+ "src-port": 51,
+ "src-switch": "00:00:00:00:00:00:02:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:02:25",
+ "src-port": 37,
+ "src-switch": "00:00:00:00:00:00:02:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:02:2c",
+ "src-port": 44,
+ "src-switch": "00:00:00:00:00:00:02:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:02:2b",
+ "src-port": 43,
+ "src-switch": "00:00:00:00:00:00:02:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:02:10",
+ "src-port": 16,
+ "src-switch": "00:00:00:00:00:00:02:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:02:1e",
+ "src-port": 30,
+ "src-switch": "00:00:00:00:00:00:02:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:02:17",
+ "src-port": 23,
+ "src-switch": "00:00:00:00:00:00:02:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:02:0a",
+ "src-port": 10,
+ "src-switch": "00:00:00:00:00:00:02:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:02:0f",
+ "src-port": 15,
+ "src-switch": "00:00:00:00:00:00:02:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:02:26",
+ "src-port": 38,
+ "src-switch": "00:00:00:00:00:00:02:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:02:1d",
+ "src-port": 29,
+ "src-switch": "00:00:00:00:00:00:02:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:02:18",
+ "src-port": 24,
+ "src-switch": "00:00:00:00:00:00:02:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:02:0e",
+ "src-port": 14,
+ "src-switch": "00:00:00:00:00:00:02:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:02:15",
+ "src-port": 21,
+ "src-switch": "00:00:00:00:00:00:02:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:02:03",
+ "src-port": 3,
+ "src-switch": "00:00:00:00:00:00:02:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:02:27",
+ "src-port": 39,
+ "src-switch": "00:00:00:00:00:00:02:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:02:20",
+ "src-port": 32,
+ "src-switch": "00:00:00:00:00:00:02:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:02:0b",
+ "src-port": 11,
+ "src-switch": "00:00:00:00:00:00:02:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:02:04",
+ "src-port": 4,
+ "src-switch": "00:00:00:00:00:00:02:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:02:04",
+ "src-port": 4,
+ "src-switch": "00:00:00:00:00:00:02:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:02:32",
+ "src-port": 50,
+ "src-switch": "00:00:00:00:00:00:02:01"
+ },
+ {
+ "dst-port": 16,
+ "dst-switch": "00:00:00:00:00:00:06:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:06:10"
+ },
+ {
+ "dst-port": 20,
+ "dst-switch": "00:00:00:00:00:00:08:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:08:14"
+ },
+ {
+ "dst-port": 4,
+ "dst-switch": "00:00:00:00:00:00:05:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:05:04"
+ },
+ {
+ "dst-port": 49,
+ "dst-switch": "00:00:00:00:00:00:02:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:02:31"
+ },
+ {
+ "dst-port": 20,
+ "dst-switch": "00:00:00:00:00:00:05:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:05:14"
+ },
+ {
+ "dst-port": 5,
+ "dst-switch": "00:00:00:00:00:00:03:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:03:05"
+ },
+ {
+ "dst-port": 24,
+ "dst-switch": "00:00:00:00:00:00:07:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:07:18"
+ },
+ {
+ "dst-port": 18,
+ "dst-switch": "00:00:00:00:00:00:02:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:02:12"
+ },
+ {
+ "dst-port": 11,
+ "dst-switch": "00:00:00:00:00:00:05:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:05:0b"
+ },
+ {
+ "dst-port": 42,
+ "dst-switch": "00:00:00:00:00:00:02:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:02:2a"
+ },
+ {
+ "dst-port": 24,
+ "dst-switch": "00:00:00:00:00:00:08:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:08:18"
+ },
+ {
+ "dst-port": 48,
+ "dst-switch": "00:00:00:00:00:00:02:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:02:30"
+ },
+ {
+ "dst-port": 20,
+ "dst-switch": "00:00:00:00:00:00:06:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:06:14"
+ },
+ {
+ "dst-port": 21,
+ "dst-switch": "00:00:00:00:00:00:04:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:04:15"
+ },
+ {
+ "dst-port": 19,
+ "dst-switch": "00:00:00:00:00:00:05:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:05:13"
+ },
+ {
+ "dst-port": 7,
+ "dst-switch": "00:00:00:00:00:00:06:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:06:07"
+ },
+ {
+ "dst-port": 37,
+ "dst-switch": "00:00:00:00:00:00:02:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:02:25"
+ },
+ {
+ "dst-port": 33,
+ "dst-switch": "00:00:00:00:00:00:02:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:02:21"
+ },
+ {
+ "dst-port": 23,
+ "dst-switch": "00:00:00:00:00:00:07:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:07:17"
+ },
+ {
+ "dst-port": 6,
+ "dst-switch": "00:00:00:00:00:00:06:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:06:06"
+ },
+ {
+ "dst-port": 16,
+ "dst-switch": "00:00:00:00:00:00:02:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:02:10"
+ },
+ {
+ "dst-port": 17,
+ "dst-switch": "00:00:00:00:00:00:05:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:05:11"
+ },
+ {
+ "dst-port": 13,
+ "dst-switch": "00:00:00:00:00:00:08:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:08:0d"
+ },
+ {
+ "dst-port": 32,
+ "dst-switch": "00:00:00:00:00:00:02:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:02:20"
+ },
+ {
+ "dst-port": 16,
+ "dst-switch": "00:00:00:00:00:00:08:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:08:10"
+ },
+ {
+ "dst-port": 9,
+ "dst-switch": "00:00:00:00:00:00:07:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:07:09"
+ },
+ {
+ "dst-port": 34,
+ "dst-switch": "00:00:00:00:00:00:02:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:02:22"
+ },
+ {
+ "dst-port": 4,
+ "dst-switch": "00:00:00:00:00:00:03:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:03:04"
+ },
+ {
+ "dst-port": 9,
+ "dst-switch": "00:00:00:00:00:00:06:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:06:09"
+ },
+ {
+ "dst-port": 21,
+ "dst-switch": "00:00:00:00:00:00:08:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:08:15"
+ },
+ {
+ "dst-port": 7,
+ "dst-switch": "00:00:00:00:00:00:03:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:03:07"
+ },
+ {
+ "dst-port": 12,
+ "dst-switch": "00:00:00:00:00:00:08:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:08:0c"
+ },
+ {
+ "dst-port": 47,
+ "dst-switch": "00:00:00:00:00:00:02:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:02:2f"
+ },
+ {
+ "dst-port": 16,
+ "dst-switch": "00:00:00:00:00:00:05:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:05:10"
+ },
+ {
+ "dst-port": 9,
+ "dst-switch": "00:00:00:00:00:00:02:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:02:09"
+ },
+ {
+ "dst-port": 13,
+ "dst-switch": "00:00:00:00:00:00:05:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:05:0d"
+ },
+ {
+ "dst-port": 19,
+ "dst-switch": "00:00:00:00:00:00:08:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:08:13"
+ },
+ {
+ "dst-port": 6,
+ "dst-switch": "00:00:00:00:00:00:03:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:03:06"
+ },
+ {
+ "dst-port": 15,
+ "dst-switch": "00:00:00:00:00:00:05:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:05:0f"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:06:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:06:02"
+ },
+ {
+ "dst-port": 9,
+ "dst-switch": "00:00:00:00:00:00:05:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:05:09"
+ },
+ {
+ "dst-port": 24,
+ "dst-switch": "00:00:00:00:00:00:03:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:03:18"
+ },
+ {
+ "dst-port": 18,
+ "dst-switch": "00:00:00:00:00:00:05:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:05:12"
+ },
+ {
+ "dst-port": 24,
+ "dst-switch": "00:00:00:00:00:00:05:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:05:18"
+ },
+ {
+ "dst-port": 45,
+ "dst-switch": "00:00:00:00:00:00:02:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:02:2d"
+ },
+ {
+ "dst-port": 11,
+ "dst-switch": "00:00:00:00:00:00:06:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:06:0b"
+ },
+ {
+ "dst-port": 19,
+ "dst-switch": "00:00:00:00:00:00:03:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:03:13"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:05:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:05:02"
+ },
+ {
+ "dst-port": 20,
+ "dst-switch": "00:00:00:00:00:00:02:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:02:14"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:08:0c",
+ "src-port": 12,
+ "src-switch": "00:00:00:00:00:00:08:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:08:16",
+ "src-port": 22,
+ "src-switch": "00:00:00:00:00:00:08:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:08:14",
+ "src-port": 20,
+ "src-switch": "00:00:00:00:00:00:08:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:08:06",
+ "src-port": 6,
+ "src-switch": "00:00:00:00:00:00:08:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:08:0d",
+ "src-port": 13,
+ "src-switch": "00:00:00:00:00:00:08:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:08:13",
+ "src-port": 19,
+ "src-switch": "00:00:00:00:00:00:08:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:08:05",
+ "src-port": 5,
+ "src-switch": "00:00:00:00:00:00:08:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:08:12",
+ "src-port": 18,
+ "src-switch": "00:00:00:00:00:00:08:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:08:19",
+ "src-port": 25,
+ "src-switch": "00:00:00:00:00:00:08:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:08:07",
+ "src-port": 7,
+ "src-switch": "00:00:00:00:00:00:08:01"
+ },
+ {
+ "dst-port": 4,
+ "dst-switch": "00:00:00:00:00:00:01:01",
+ "src-port": 26,
+ "src-switch": "00:00:00:00:00:00:08:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:08:08",
+ "src-port": 8,
+ "src-switch": "00:00:00:00:00:00:08:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:08:11",
+ "src-port": 17,
+ "src-switch": "00:00:00:00:00:00:08:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:08:02",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:08:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:08:09",
+ "src-port": 9,
+ "src-switch": "00:00:00:00:00:00:08:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:08:0a",
+ "src-port": 10,
+ "src-switch": "00:00:00:00:00:00:08:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:08:17",
+ "src-port": 23,
+ "src-switch": "00:00:00:00:00:00:08:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:08:10",
+ "src-port": 16,
+ "src-switch": "00:00:00:00:00:00:08:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:08:0f",
+ "src-port": 15,
+ "src-switch": "00:00:00:00:00:00:08:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:08:18",
+ "src-port": 24,
+ "src-switch": "00:00:00:00:00:00:08:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:08:0e",
+ "src-port": 14,
+ "src-switch": "00:00:00:00:00:00:08:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:08:15",
+ "src-port": 21,
+ "src-switch": "00:00:00:00:00:00:08:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:08:03",
+ "src-port": 3,
+ "src-switch": "00:00:00:00:00:00:08:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:08:0b",
+ "src-port": 11,
+ "src-switch": "00:00:00:00:00:00:08:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:08:04",
+ "src-port": 4,
+ "src-switch": "00:00:00:00:00:00:08:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:03:0c",
+ "src-port": 12,
+ "src-switch": "00:00:00:00:00:00:03:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:03:16",
+ "src-port": 22,
+ "src-switch": "00:00:00:00:00:00:03:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:03:14",
+ "src-port": 20,
+ "src-switch": "00:00:00:00:00:00:03:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:03:06",
+ "src-port": 6,
+ "src-switch": "00:00:00:00:00:00:03:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:03:0d",
+ "src-port": 13,
+ "src-switch": "00:00:00:00:00:00:03:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:03:0d",
+ "src-port": 13,
+ "src-switch": "00:00:00:00:00:00:03:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:03:13",
+ "src-port": 19,
+ "src-switch": "00:00:00:00:00:00:03:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:03:05",
+ "src-port": 5,
+ "src-switch": "00:00:00:00:00:00:03:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:03:12",
+ "src-port": 18,
+ "src-switch": "00:00:00:00:00:00:03:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:03:19",
+ "src-port": 25,
+ "src-switch": "00:00:00:00:00:00:03:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:03:07",
+ "src-port": 7,
+ "src-switch": "00:00:00:00:00:00:03:01"
+ },
+ {
+ "dst-port": 5,
+ "dst-switch": "00:00:00:00:00:00:01:03",
+ "src-port": 26,
+ "src-switch": "00:00:00:00:00:00:03:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:03:08",
+ "src-port": 8,
+ "src-switch": "00:00:00:00:00:00:03:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:03:11",
+ "src-port": 17,
+ "src-switch": "00:00:00:00:00:00:03:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:03:02",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:03:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:03:09",
+ "src-port": 9,
+ "src-switch": "00:00:00:00:00:00:03:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:03:0a",
+ "src-port": 10,
+ "src-switch": "00:00:00:00:00:00:03:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:03:17",
+ "src-port": 23,
+ "src-switch": "00:00:00:00:00:00:03:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:03:10",
+ "src-port": 16,
+ "src-switch": "00:00:00:00:00:00:03:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:03:0f",
+ "src-port": 15,
+ "src-switch": "00:00:00:00:00:00:03:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:03:18",
+ "src-port": 24,
+ "src-switch": "00:00:00:00:00:00:03:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:03:0e",
+ "src-port": 14,
+ "src-switch": "00:00:00:00:00:00:03:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:03:15",
+ "src-port": 21,
+ "src-switch": "00:00:00:00:00:00:03:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:03:03",
+ "src-port": 3,
+ "src-switch": "00:00:00:00:00:00:03:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:03:0b",
+ "src-port": 11,
+ "src-switch": "00:00:00:00:00:00:03:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:03:04",
+ "src-port": 4,
+ "src-switch": "00:00:00:00:00:00:03:01"
+ },
+ {
+ "dst-port": 3,
+ "dst-switch": "00:00:00:00:00:00:06:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:06:03"
+ },
+ {
+ "dst-port": 29,
+ "dst-switch": "00:00:00:00:00:00:02:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:02:1d"
+ },
+ {
+ "dst-port": 3,
+ "dst-switch": "00:00:00:00:00:00:05:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:05:03"
+ },
+ {
+ "dst-port": 25,
+ "dst-switch": "00:00:00:00:00:00:02:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:02:19"
+ },
+ {
+ "dst-port": 7,
+ "dst-switch": "00:00:00:00:00:00:04:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:04:07"
+ },
+ {
+ "dst-port": 8,
+ "dst-switch": "00:00:00:00:00:00:02:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:02:08"
+ },
+ {
+ "dst-port": 14,
+ "dst-switch": "00:00:00:00:00:00:02:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:02:0e"
+ },
+ {
+ "dst-port": 14,
+ "dst-switch": "00:00:00:00:00:00:05:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:05:0e"
+ },
+ {
+ "dst-port": 7,
+ "dst-switch": "00:00:00:00:00:00:02:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:02:07"
+ },
+ {
+ "dst-port": 6,
+ "dst-switch": "00:00:00:00:00:00:05:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:05:06"
+ },
+ {
+ "dst-port": 15,
+ "dst-switch": "00:00:00:00:00:00:08:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:08:0f"
+ },
+ {
+ "dst-port": 5,
+ "dst-switch": "00:00:00:00:00:00:02:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:02:05"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:05:0c",
+ "src-port": 12,
+ "src-switch": "00:00:00:00:00:00:05:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:05:16",
+ "src-port": 22,
+ "src-switch": "00:00:00:00:00:00:05:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:05:14",
+ "src-port": 20,
+ "src-switch": "00:00:00:00:00:00:05:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:05:06",
+ "src-port": 6,
+ "src-switch": "00:00:00:00:00:00:05:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:05:0d",
+ "src-port": 13,
+ "src-switch": "00:00:00:00:00:00:05:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:05:13",
+ "src-port": 19,
+ "src-switch": "00:00:00:00:00:00:05:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:05:05",
+ "src-port": 5,
+ "src-switch": "00:00:00:00:00:00:05:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:05:12",
+ "src-port": 18,
+ "src-switch": "00:00:00:00:00:00:05:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:05:19",
+ "src-port": 25,
+ "src-switch": "00:00:00:00:00:00:05:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:05:07",
+ "src-port": 7,
+ "src-switch": "00:00:00:00:00:00:05:01"
+ },
+ {
+ "dst-port": 6,
+ "dst-switch": "00:00:00:00:00:00:01:04",
+ "src-port": 26,
+ "src-switch": "00:00:00:00:00:00:05:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:05:08",
+ "src-port": 8,
+ "src-switch": "00:00:00:00:00:00:05:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:05:11",
+ "src-port": 17,
+ "src-switch": "00:00:00:00:00:00:05:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:05:02",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:05:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:05:09",
+ "src-port": 9,
+ "src-switch": "00:00:00:00:00:00:05:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:05:0a",
+ "src-port": 10,
+ "src-switch": "00:00:00:00:00:00:05:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:05:17",
+ "src-port": 23,
+ "src-switch": "00:00:00:00:00:00:05:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:05:10",
+ "src-port": 16,
+ "src-switch": "00:00:00:00:00:00:05:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:05:0f",
+ "src-port": 15,
+ "src-switch": "00:00:00:00:00:00:05:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:05:18",
+ "src-port": 24,
+ "src-switch": "00:00:00:00:00:00:05:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:05:0e",
+ "src-port": 14,
+ "src-switch": "00:00:00:00:00:00:05:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:05:15",
+ "src-port": 21,
+ "src-switch": "00:00:00:00:00:00:05:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:05:03",
+ "src-port": 3,
+ "src-switch": "00:00:00:00:00:00:05:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:05:0b",
+ "src-port": 11,
+ "src-switch": "00:00:00:00:00:00:05:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:05:04",
+ "src-port": 4,
+ "src-switch": "00:00:00:00:00:00:05:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:01:02",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:01:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:01:06",
+ "src-port": 3,
+ "src-switch": "00:00:00:00:00:00:01:01"
+ },
+ {
+ "dst-port": 26,
+ "dst-switch": "00:00:00:00:00:00:08:01",
+ "src-port": 4,
+ "src-switch": "00:00:00:00:00:00:01:01"
+ },
+ {
+ "dst-port": 18,
+ "dst-switch": "00:00:00:00:00:00:04:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:04:12"
+ },
+ {
+ "dst-port": 10,
+ "dst-switch": "00:00:00:00:00:00:02:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:02:0a"
+ },
+ {
+ "dst-port": 3,
+ "dst-switch": "00:00:00:00:00:00:02:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:02:03"
+ },
+ {
+ "dst-port": 17,
+ "dst-switch": "00:00:00:00:00:00:04:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:04:11"
+ },
+ {
+ "dst-port": 23,
+ "dst-switch": "00:00:00:00:00:00:05:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:05:17"
+ },
+ {
+ "dst-port": 18,
+ "dst-switch": "00:00:00:00:00:00:06:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:06:12"
+ },
+ {
+ "dst-port": 19,
+ "dst-switch": "00:00:00:00:00:00:06:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:06:13"
+ },
+ {
+ "dst-port": 7,
+ "dst-switch": "00:00:00:00:00:00:05:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:05:07"
+ },
+ {
+ "dst-port": 10,
+ "dst-switch": "00:00:00:00:00:00:06:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:06:0a"
+ },
+ {
+ "dst-port": 40,
+ "dst-switch": "00:00:00:00:00:00:02:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:02:28"
+ },
+ {
+ "dst-port": 10,
+ "dst-switch": "00:00:00:00:00:00:05:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:05:0a"
+ },
+ {
+ "dst-port": 50,
+ "dst-switch": "00:00:00:00:00:00:02:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:02:32"
+ },
+ {
+ "dst-port": 41,
+ "dst-switch": "00:00:00:00:00:00:02:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:02:29"
+ },
+ {
+ "dst-port": 5,
+ "dst-switch": "00:00:00:00:00:00:05:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:05:05"
+ },
+ {
+ "dst-port": 5,
+ "dst-switch": "00:00:00:00:00:00:06:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:06:05"
+ },
+ {
+ "dst-port": 22,
+ "dst-switch": "00:00:00:00:00:00:08:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:08:16"
+ },
+ {
+ "dst-port": 3,
+ "dst-switch": "00:00:00:00:00:00:04:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:04:03"
+ },
+ {
+ "dst-port": 23,
+ "dst-switch": "00:00:00:00:00:00:02:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:02:17"
+ },
+ {
+ "dst-port": 19,
+ "dst-switch": "00:00:00:00:00:00:04:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:04:13"
+ },
+ {
+ "dst-port": 4,
+ "dst-switch": "00:00:00:00:00:00:04:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:04:04"
+ },
+ {
+ "dst-port": 26,
+ "dst-switch": "00:00:00:00:00:00:02:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:02:1a"
+ },
+ {
+ "dst-port": 6,
+ "dst-switch": "00:00:00:00:00:00:08:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:08:06"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:04:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:04:02"
+ },
+ {
+ "dst-port": 19,
+ "dst-switch": "00:00:00:00:00:00:07:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:07:13"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:04:0c",
+ "src-port": 12,
+ "src-switch": "00:00:00:00:00:00:04:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:04:16",
+ "src-port": 22,
+ "src-switch": "00:00:00:00:00:00:04:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:04:14",
+ "src-port": 20,
+ "src-switch": "00:00:00:00:00:00:04:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:04:06",
+ "src-port": 6,
+ "src-switch": "00:00:00:00:00:00:04:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:04:0d",
+ "src-port": 13,
+ "src-switch": "00:00:00:00:00:00:04:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:04:13",
+ "src-port": 19,
+ "src-switch": "00:00:00:00:00:00:04:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:04:05",
+ "src-port": 5,
+ "src-switch": "00:00:00:00:00:00:04:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:04:12",
+ "src-port": 18,
+ "src-switch": "00:00:00:00:00:00:04:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:04:19",
+ "src-port": 25,
+ "src-switch": "00:00:00:00:00:00:04:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:04:07",
+ "src-port": 7,
+ "src-switch": "00:00:00:00:00:00:04:01"
+ },
+ {
+ "dst-port": 5,
+ "dst-switch": "00:00:00:00:00:00:01:04",
+ "src-port": 26,
+ "src-switch": "00:00:00:00:00:00:04:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:04:08",
+ "src-port": 8,
+ "src-switch": "00:00:00:00:00:00:04:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:04:11",
+ "src-port": 17,
+ "src-switch": "00:00:00:00:00:00:04:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:04:02",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:04:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:04:09",
+ "src-port": 9,
+ "src-switch": "00:00:00:00:00:00:04:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:04:0a",
+ "src-port": 10,
+ "src-switch": "00:00:00:00:00:00:04:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:04:17",
+ "src-port": 23,
+ "src-switch": "00:00:00:00:00:00:04:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:04:10",
+ "src-port": 16,
+ "src-switch": "00:00:00:00:00:00:04:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:04:0f",
+ "src-port": 15,
+ "src-switch": "00:00:00:00:00:00:04:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:04:18",
+ "src-port": 24,
+ "src-switch": "00:00:00:00:00:00:04:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:04:0e",
+ "src-port": 14,
+ "src-switch": "00:00:00:00:00:00:04:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:04:15",
+ "src-port": 21,
+ "src-switch": "00:00:00:00:00:00:04:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:04:03",
+ "src-port": 3,
+ "src-switch": "00:00:00:00:00:00:04:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:04:0b",
+ "src-port": 11,
+ "src-switch": "00:00:00:00:00:00:04:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:04:04",
+ "src-port": 4,
+ "src-switch": "00:00:00:00:00:00:04:01"
+ },
+ {
+ "dst-port": 21,
+ "dst-switch": "00:00:00:00:00:00:02:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:02:15"
+ },
+ {
+ "dst-port": 3,
+ "dst-switch": "00:00:00:00:00:00:08:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:08:03"
+ },
+ {
+ "dst-port": 24,
+ "dst-switch": "00:00:00:00:00:00:06:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:06:18"
+ },
+ {
+ "dst-port": 9,
+ "dst-switch": "00:00:00:00:00:00:08:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:08:09"
+ },
+ {
+ "dst-port": 46,
+ "dst-switch": "00:00:00:00:00:00:02:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:02:2e"
+ },
+ {
+ "dst-port": 15,
+ "dst-switch": "00:00:00:00:00:00:04:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:04:0f"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:02:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:02:02"
+ },
+ {
+ "dst-port": 14,
+ "dst-switch": "00:00:00:00:00:00:06:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:06:0e"
+ },
+ {
+ "dst-port": 22,
+ "dst-switch": "00:00:00:00:00:00:03:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:03:16"
+ },
+ {
+ "dst-port": 22,
+ "dst-switch": "00:00:00:00:00:00:06:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:06:16"
+ },
+ {
+ "dst-port": 7,
+ "dst-switch": "00:00:00:00:00:00:08:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:08:07"
+ },
+ {
+ "dst-port": 24,
+ "dst-switch": "00:00:00:00:00:00:04:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:04:18"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:06:0c",
+ "src-port": 12,
+ "src-switch": "00:00:00:00:00:00:06:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:06:16",
+ "src-port": 22,
+ "src-switch": "00:00:00:00:00:00:06:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:06:14",
+ "src-port": 20,
+ "src-switch": "00:00:00:00:00:00:06:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:06:06",
+ "src-port": 6,
+ "src-switch": "00:00:00:00:00:00:06:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:06:0d",
+ "src-port": 13,
+ "src-switch": "00:00:00:00:00:00:06:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:06:13",
+ "src-port": 19,
+ "src-switch": "00:00:00:00:00:00:06:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:06:05",
+ "src-port": 5,
+ "src-switch": "00:00:00:00:00:00:06:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:06:12",
+ "src-port": 18,
+ "src-switch": "00:00:00:00:00:00:06:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:06:19",
+ "src-port": 25,
+ "src-switch": "00:00:00:00:00:00:06:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:06:07",
+ "src-port": 7,
+ "src-switch": "00:00:00:00:00:00:06:01"
+ },
+ {
+ "dst-port": 4,
+ "dst-switch": "00:00:00:00:00:00:01:05",
+ "src-port": 26,
+ "src-switch": "00:00:00:00:00:00:06:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:06:08",
+ "src-port": 8,
+ "src-switch": "00:00:00:00:00:00:06:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:06:11",
+ "src-port": 17,
+ "src-switch": "00:00:00:00:00:00:06:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:06:02",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:06:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:06:09",
+ "src-port": 9,
+ "src-switch": "00:00:00:00:00:00:06:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:06:0a",
+ "src-port": 10,
+ "src-switch": "00:00:00:00:00:00:06:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:06:17",
+ "src-port": 23,
+ "src-switch": "00:00:00:00:00:00:06:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:06:10",
+ "src-port": 16,
+ "src-switch": "00:00:00:00:00:00:06:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:06:0f",
+ "src-port": 15,
+ "src-switch": "00:00:00:00:00:00:06:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:06:18",
+ "src-port": 24,
+ "src-switch": "00:00:00:00:00:00:06:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:06:0e",
+ "src-port": 14,
+ "src-switch": "00:00:00:00:00:00:06:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:06:15",
+ "src-port": 21,
+ "src-switch": "00:00:00:00:00:00:06:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:06:03",
+ "src-port": 3,
+ "src-switch": "00:00:00:00:00:00:06:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:06:0b",
+ "src-port": 11,
+ "src-switch": "00:00:00:00:00:00:06:01"
+ },
+ {
+ "dst-port": 2,
+ "dst-switch": "00:00:00:00:00:00:06:04",
+ "src-port": 4,
+ "src-switch": "00:00:00:00:00:00:06:01"
+ },
+ {
+ "dst-port": 8,
+ "dst-switch": "00:00:00:00:00:00:05:01",
+ "src-port": 2,
+ "src-switch": "00:00:00:00:00:00:05:08"
+ }
+]
diff --git a/web/topology_rest.py b/web/topology_rest.py
index 036776f..7bbf7ce 100755
--- a/web/topology_rest.py
+++ b/web/topology_rest.py
@@ -15,6 +15,7 @@
CONFIG_FILE=os.getenv("HOME") + "/ONOS/web/config.json"
+LINK_FILE=os.getenv("HOME") + "/ONOS/web/link.json"
## Global Var for ON.Lab local REST ##
RestIP="localhost"
@@ -22,6 +23,9 @@
ONOS_DEFAULT_HOST="localhost" ;# Has to set if LB=False
DEBUG=1
+pp = pprint.PrettyPrinter(indent=4)
+app = Flask(__name__)
+
def read_config():
global LB, TESTBED, controllers, core_switches, ONOS_GUI3_HOST, ONOS_GUI3_CONTROL_HOST
f = open(CONFIG_FILE)
@@ -34,8 +38,23 @@
ONOS_GUI3_CONTROL_HOST=conf['ONOS_GUI3_CONTROL_HOST']
f.close()
-pp = pprint.PrettyPrinter(indent=4)
-app = Flask(__name__)
+def read_link_def():
+ global link_def
+ f=open(LINK_FILE)
+ try:
+ link_def=json.load(f)
+ f.close()
+ except:
+ print "Can't read link def file (link.json)"
+ sys.exit(1)
+
+def get_link_ports(src_dpid, dst_dpid):
+ ret = (-1, -1)
+ for link in link_def:
+ if link['src-switch'] == src_dpid and link['dst-switch'] == dst_dpid:
+ ret = (link['src-port'], link['dst-port'])
+ break
+ return ret
## Worker Functions ##
def log_error(txt):
@@ -671,10 +690,12 @@
### Command ###
@app.route("/gui/controller/<cmd>/<controller_name>")
def controller_status_change(cmd, controller_name):
-# 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)
- start_onos="cd; onos start %s" % (controller_name[-1:])
- stop_onos="cd; onos stop %s" % (controller_name[-1:])
+ if (TESTBED == "hw"):
+ start_onos="cd; onos start %s" % (controller_name[-1:])
+ stop_onos="cd; 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)
if cmd == "up":
result=os.popen(start_onos).read()
@@ -749,27 +770,37 @@
cmd = 'up'
result=""
-
for dpid in (src_dpid, dst_dpid):
if dpid in core_switches:
host = controllers[0]
- src_ports = [1, 2, 3, 4, 5]
else:
hostid=int(dpid.split(':')[-2])
host = controllers[hostid-1]
- if hostid == 2 :
- src_ports = [51]
- else :
- src_ports = [26]
- for port in src_ports :
- cmd_string="ssh -i ~/.ssh/onlabkey.pem %s 'cd ONOS/scripts; ./link.sh %s %s %s'" % (host, dpid, port, cmd)
- print cmd_string
- res=os.popen(cmd_string).read()
- result = result + ' ' + res
+ if dpid == src_dpid:
+ (port, dontcare) = get_link_ports(dpid, dst_dpid)
+ else:
+ (port, dontcare) = get_link_ports(dpid, src_dpid)
+
+ cmd_string="ssh -i ~/.ssh/onlabkey.pem %s 'cd ONOS/scripts; ./link.sh %s %s %s'" % (host, dpid, port, cmd)
+ print cmd_string
+ res=os.popen(cmd_string).read()
+ result = result + ' ' + res
return result
+# if hostid == 2 :
+# src_ports = [51]
+# else :
+# src_ports = [26]
+#
+# for port in src_ports :
+# cmd_string="ssh -i ~/.ssh/onlabkey.pem %s 'cd ONOS/scripts; ./link.sh %s %s %s'" % (host, dpid, port, cmd)
+# print cmd_string
+# res=os.popen(cmd_string).read()
+
+
+
# Link up on hardware testbed
def link_up_hw(src_dpid, src_port, dst_dpid, dst_port):
@@ -875,16 +906,14 @@
#1 FOOBAR 00:00:00:00:00:00:01:01 1 00:00:00:00:00:00:01:0b 1 matchSrcMac 00:00:00:00:00:00 matchDstMac 00:01:00:00:00:00
@app.route("/gui/addflow/<src_dpid>/<src_port>/<dst_dpid>/<dst_port>/<srcMAC>/<dstMAC>")
def add_flow(src_dpid, src_port, dst_dpid, dst_port, srcMAC, dstMAC):
- command = "/home/ubuntu/ONOS/web/get_flow.py all |grep FlowPath |gawk '{print strtonum($4)}'| sort -n | tail -n 1"
- print command
- ret = os.popen(command).read()
- if ret == "":
- flow_nr=0
- else:
- flow_nr=int(ret)
-
+ host = pick_host()
+ url ="%s/wm/flow/getsummary/%s/%s/json" % (host, 0, 0)
+ (code, result) = get_json(url)
+ parsedResult = json.loads(result)
+ flow_nr = int(parsedResult[-1]['flowId'], 16)
flow_nr += 1
- command = "/home/ubuntu/ONOS/web/add_flow.py -m onos %d %s %s %s %s %s matchSrcMac %s matchDstMac %s" % (flow_nr, "dummy", src_dpid, src_port, dst_dpid, dst_port, srcMAC, dstMAC)
+ command = "/home/ubuntu/ONOS/web/add_flow.py -m onos %d %s %s %s %s %s matchSrcMac %s matchDstMac %s" % (flow_nr, "dummy", src_dpid, src_port, dst_dpid, dst_port, srcMAC, dstMAC)
+ flow_nr += 1
command1 = "/home/ubuntu/ONOS/web/add_flow.py -m onos %d %s %s %s %s %s matchSrcMac %s matchDstMac %s" % (flow_nr, "dummy", dst_dpid, dst_port, src_dpid, src_port, dstMAC, srcMAC)
print command
errcode = os.popen(command).read()
@@ -999,6 +1028,7 @@
if __name__ == "__main__":
random.seed()
read_config()
+ read_link_def()
if len(sys.argv) > 1 and sys.argv[1] == "-d":
# add_flow("00:00:00:00:00:00:02:02", 1, "00:00:00:00:00:00:03:02", 1, "00:00:00:00:02:02", "00:00:00:00:03:0c")
# link_change("up", "00:00:00:00:ba:5e:ba:11", 1, "00:00:00:00:00:00:00:00", 1)
@@ -1016,7 +1046,8 @@
# devices()
# iperf_start(1,10,15)
# iperf_rate(1)
- switches()
+# switches()
+ add_flow(1,2,3,4,5,6)
else:
app.debug = True
app.run(threaded=True, host="0.0.0.0", port=9000)