Merge branch 'master' of github.com:OPENNETWORKINGLAB/ONOS into thread_name
diff --git a/.gitignore b/.gitignore
index 7e971f7..c9e6bc1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,8 +4,9 @@
.project
.pydevproject
.settings
+.javacp
target
onos-logs
onos.log
-repo
+logback.*.xml
diff --git a/pom.xml b/pom.xml
index 5b8df0c..39e9f30 100644
--- a/pom.xml
+++ b/pom.xml
@@ -11,6 +11,12 @@
<name>ONOS</name>
<url>http://onlab.us/</url>
<repositories>
+ <!-- In Project repository -->
+ <repository>
+ <id>in-project</id>
+ <name>In Project Repo</name>
+ <url>file://${project.basedir}/repo</url>
+ </repository>
<repository>
<id>central</id>
<name>Maven Central repository</name>
@@ -21,12 +27,6 @@
<name>Public online Restlet repository</name>
<url>http://maven.restlet.org</url>
</repository>
- <!-- In Project repository -->
- <repository>
- <id>in-project</id>
- <name>In Project Repo</name>
- <url>file://${project.basedir}/repo</url>
- </repository>
</repositories>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
@@ -64,8 +64,8 @@
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
- <source>1.6</source>
- <target>1.6</target>
+ <source>1.7</source>
+ <target>1.7</target>
<encoding>UTF-8</encoding>
</configuration>
<executions>
@@ -183,6 +183,23 @@
</descriptorRefs>
</configuration>
</plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-dependency-plugin</artifactId>
+ <version>2.8</version>
+ <executions>
+ <execution>
+ <id>build-classpath</id>
+ <phase>generate-sources</phase>
+ <goals>
+ <goal>build-classpath</goal>
+ </goals>
+ <configuration>
+ <outputFile>${project.basedir}/.javacp</outputFile>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
</plugins>
</build>
<!-- for getting visualization reporting -->
@@ -248,6 +265,10 @@
</plugins>
</reporting>
<dependencies>
+ <!-- Commenting out original kryo 2.X
+ and using shaded version (net.onrc.onos.kryo2)
+ to workaround conflict with kryo 1.X in titan's dependency.(#443)
+ -->
<!--
<dependency>
<groupId>com.esotericsoftware.kryo</groupId>
diff --git a/prep-for-offline.sh b/prep-for-offline.sh
new file mode 100755
index 0000000..5b42988
--- /dev/null
+++ b/prep-for-offline.sh
@@ -0,0 +1,13 @@
+#!/bin/bash
+
+if [ -z "${MVN}" ]; then
+ MVN="mvn"
+fi
+
+# download package dependencies
+${MVN} -T 1C dependency:go-offline
+
+# run goals to download required plugins
+${MVN} -T 1C checkstyle:checkstyle
+${MVN} -q -T 1C clean test -Dtest=DoNotTest -DfailIfNoTests=false > /dev/null
+${MVN} -T 1C compile
diff --git a/setup-local-maven.sh b/rebuild-local-repo.sh
similarity index 66%
rename from setup-local-maven.sh
rename to rebuild-local-repo.sh
index f8e00f8..536cb99 100755
--- a/setup-local-maven.sh
+++ b/rebuild-local-repo.sh
@@ -4,17 +4,14 @@
MVN="mvn"
fi
-# Kryo2 workaround
+# Install Kryo2 workaround to local repo
+# - Shaded(rename package name to allow mixing 2 different Kryo version)
+# - Install created sharded jar to local repo
${MVN} -f kryo2/pom.xml package exec:exec
-${MVN} install:install-file -Dfile=./curator/curator-framework-1.3.5-SNAPSHOT.jar -DgroupId=com.netflix.curator -DartifactId=curator-framework -Dversion=1.3.5-SNAPSHOT -Dpackaging=jar -DgeneratePom=true
-${MVN} install:install-file -Dfile=./curator/curator-client-1.3.5-SNAPSHOT.jar -DgroupId=com.netflix.curator -DartifactId=curator-client -Dversion=1.3.5-SNAPSHOT -Dpackaging=jar -DgeneratePom=true
-${MVN} install:install-file -Dfile=./curator/curator-recipes-1.3.5-SNAPSHOT.jar -DgroupId=com.netflix.curator -DartifactId=curator-recipes -Dversion=1.3.5-SNAPSHOT -Dpackaging=jar -DgeneratePom=true
-${MVN} install:install-file -Dfile=./curator/curator-x-discovery-1.3.5-SNAPSHOT.jar -DgroupId=com.netflix.curator -DartifactId=curator-x-discovery -Dversion=1.3.5-SNAPSHOT -Dpackaging=jar -DgeneratePom=true
+# Install modified curators to local repo
+${MVN} install:install-file -Dfile=./curator/curator-framework-1.3.5-SNAPSHOT.jar -DgroupId=com.netflix.curator -DartifactId=curator-framework -Dversion=1.3.5-SNAPSHOT -Dpackaging=jar -DgeneratePom=true -DlocalRepositoryPath=./repo -DcreateChecksum=true
+${MVN} install:install-file -Dfile=./curator/curator-client-1.3.5-SNAPSHOT.jar -DgroupId=com.netflix.curator -DartifactId=curator-client -Dversion=1.3.5-SNAPSHOT -Dpackaging=jar -DgeneratePom=true -DlocalRepositoryPath=./repo -DcreateChecksum=true
+${MVN} install:install-file -Dfile=./curator/curator-recipes-1.3.5-SNAPSHOT.jar -DgroupId=com.netflix.curator -DartifactId=curator-recipes -Dversion=1.3.5-SNAPSHOT -Dpackaging=jar -DgeneratePom=true -DlocalRepositoryPath=./repo -DcreateChecksum=true
+${MVN} install:install-file -Dfile=./curator/curator-x-discovery-1.3.5-SNAPSHOT.jar -DgroupId=com.netflix.curator -DartifactId=curator-x-discovery -Dversion=1.3.5-SNAPSHOT -Dpackaging=jar -DgeneratePom=true -DlocalRepositoryPath=./repo -DcreateChecksum=true
-# download package dependencies
-${MVN} dependency:go-offline
-
-# run goals to download required plugins
-${MVN} -q test -Dtest=DoNotTest -DfailIfNoTests=false > /dev/null
-${MVN} clean compile
diff --git a/repo/com/netflix/curator/curator-client/1.3.5-SNAPSHOT/curator-client-1.3.5-SNAPSHOT.jar b/repo/com/netflix/curator/curator-client/1.3.5-SNAPSHOT/curator-client-1.3.5-SNAPSHOT.jar
new file mode 100644
index 0000000..c22d602
--- /dev/null
+++ b/repo/com/netflix/curator/curator-client/1.3.5-SNAPSHOT/curator-client-1.3.5-SNAPSHOT.jar
Binary files differ
diff --git a/repo/com/netflix/curator/curator-client/1.3.5-SNAPSHOT/curator-client-1.3.5-SNAPSHOT.jar.md5 b/repo/com/netflix/curator/curator-client/1.3.5-SNAPSHOT/curator-client-1.3.5-SNAPSHOT.jar.md5
new file mode 100644
index 0000000..2ace2a5
--- /dev/null
+++ b/repo/com/netflix/curator/curator-client/1.3.5-SNAPSHOT/curator-client-1.3.5-SNAPSHOT.jar.md5
@@ -0,0 +1 @@
+3746ec5212bdbb9140850c14f4451a0a
\ No newline at end of file
diff --git a/repo/com/netflix/curator/curator-client/1.3.5-SNAPSHOT/curator-client-1.3.5-SNAPSHOT.jar.sha1 b/repo/com/netflix/curator/curator-client/1.3.5-SNAPSHOT/curator-client-1.3.5-SNAPSHOT.jar.sha1
new file mode 100644
index 0000000..d05e228
--- /dev/null
+++ b/repo/com/netflix/curator/curator-client/1.3.5-SNAPSHOT/curator-client-1.3.5-SNAPSHOT.jar.sha1
@@ -0,0 +1 @@
+c59b35b37dc560ee16199d5dde2eac727d84df4f
\ No newline at end of file
diff --git a/repo/com/netflix/curator/curator-client/1.3.5-SNAPSHOT/curator-client-1.3.5-SNAPSHOT.pom b/repo/com/netflix/curator/curator-client/1.3.5-SNAPSHOT/curator-client-1.3.5-SNAPSHOT.pom
new file mode 100644
index 0000000..b5dcb31
--- /dev/null
+++ b/repo/com/netflix/curator/curator-client/1.3.5-SNAPSHOT/curator-client-1.3.5-SNAPSHOT.pom
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>com.netflix.curator</groupId>
+ <artifactId>curator-client</artifactId>
+ <version>1.3.5-SNAPSHOT</version>
+ <description>POM was created from install:install-file</description>
+</project>
diff --git a/repo/com/netflix/curator/curator-client/1.3.5-SNAPSHOT/curator-client-1.3.5-SNAPSHOT.pom.md5 b/repo/com/netflix/curator/curator-client/1.3.5-SNAPSHOT/curator-client-1.3.5-SNAPSHOT.pom.md5
new file mode 100644
index 0000000..eff6265
--- /dev/null
+++ b/repo/com/netflix/curator/curator-client/1.3.5-SNAPSHOT/curator-client-1.3.5-SNAPSHOT.pom.md5
@@ -0,0 +1 @@
+5fb6875fb1d6c621bece5d60ad23320c
\ No newline at end of file
diff --git a/repo/com/netflix/curator/curator-client/1.3.5-SNAPSHOT/curator-client-1.3.5-SNAPSHOT.pom.sha1 b/repo/com/netflix/curator/curator-client/1.3.5-SNAPSHOT/curator-client-1.3.5-SNAPSHOT.pom.sha1
new file mode 100644
index 0000000..1a61d7c
--- /dev/null
+++ b/repo/com/netflix/curator/curator-client/1.3.5-SNAPSHOT/curator-client-1.3.5-SNAPSHOT.pom.sha1
@@ -0,0 +1 @@
+a242a50033f0ccb0eaf3fe33d804d583d35242c3
\ No newline at end of file
diff --git a/repo/com/netflix/curator/curator-client/1.3.5-SNAPSHOT/maven-metadata-local.xml b/repo/com/netflix/curator/curator-client/1.3.5-SNAPSHOT/maven-metadata-local.xml
new file mode 100644
index 0000000..5c72507
--- /dev/null
+++ b/repo/com/netflix/curator/curator-client/1.3.5-SNAPSHOT/maven-metadata-local.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<metadata modelVersion="1.1.0">
+ <groupId>com.netflix.curator</groupId>
+ <artifactId>curator-client</artifactId>
+ <version>1.3.5-SNAPSHOT</version>
+ <versioning>
+ <snapshot>
+ <localCopy>true</localCopy>
+ </snapshot>
+ <lastUpdated>20140102175421</lastUpdated>
+ <snapshotVersions>
+ <snapshotVersion>
+ <extension>jar</extension>
+ <value>1.3.5-SNAPSHOT</value>
+ <updated>20140102175421</updated>
+ </snapshotVersion>
+ <snapshotVersion>
+ <extension>pom</extension>
+ <value>1.3.5-SNAPSHOT</value>
+ <updated>20140102175421</updated>
+ </snapshotVersion>
+ </snapshotVersions>
+ </versioning>
+</metadata>
diff --git a/repo/com/netflix/curator/curator-client/1.3.5-SNAPSHOT/maven-metadata-local.xml.md5 b/repo/com/netflix/curator/curator-client/1.3.5-SNAPSHOT/maven-metadata-local.xml.md5
new file mode 100644
index 0000000..88e6b32
--- /dev/null
+++ b/repo/com/netflix/curator/curator-client/1.3.5-SNAPSHOT/maven-metadata-local.xml.md5
@@ -0,0 +1 @@
+c18e768aaa00a69df8707c52999ece23
\ No newline at end of file
diff --git a/repo/com/netflix/curator/curator-client/1.3.5-SNAPSHOT/maven-metadata-local.xml.sha1 b/repo/com/netflix/curator/curator-client/1.3.5-SNAPSHOT/maven-metadata-local.xml.sha1
new file mode 100644
index 0000000..f7bbb41
--- /dev/null
+++ b/repo/com/netflix/curator/curator-client/1.3.5-SNAPSHOT/maven-metadata-local.xml.sha1
@@ -0,0 +1 @@
+4c1a4c050f9dfa58e2c06357292a68cc4db6c153
\ No newline at end of file
diff --git a/repo/com/netflix/curator/curator-client/maven-metadata-local.xml b/repo/com/netflix/curator/curator-client/maven-metadata-local.xml
new file mode 100644
index 0000000..601cdb2
--- /dev/null
+++ b/repo/com/netflix/curator/curator-client/maven-metadata-local.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<metadata>
+ <groupId>com.netflix.curator</groupId>
+ <artifactId>curator-client</artifactId>
+ <versioning>
+ <versions>
+ <version>1.3.5-SNAPSHOT</version>
+ </versions>
+ <lastUpdated>20140102175421</lastUpdated>
+ </versioning>
+</metadata>
diff --git a/repo/com/netflix/curator/curator-client/maven-metadata-local.xml.md5 b/repo/com/netflix/curator/curator-client/maven-metadata-local.xml.md5
new file mode 100644
index 0000000..e9772e0
--- /dev/null
+++ b/repo/com/netflix/curator/curator-client/maven-metadata-local.xml.md5
@@ -0,0 +1 @@
+81f0d8335cac788422454e1f404024b5
\ No newline at end of file
diff --git a/repo/com/netflix/curator/curator-client/maven-metadata-local.xml.sha1 b/repo/com/netflix/curator/curator-client/maven-metadata-local.xml.sha1
new file mode 100644
index 0000000..015f48f
--- /dev/null
+++ b/repo/com/netflix/curator/curator-client/maven-metadata-local.xml.sha1
@@ -0,0 +1 @@
+d4b4e3e335da0916395576e68f60183a8c614bde
\ No newline at end of file
diff --git a/repo/com/netflix/curator/curator-framework/1.3.5-SNAPSHOT/curator-framework-1.3.5-SNAPSHOT.jar b/repo/com/netflix/curator/curator-framework/1.3.5-SNAPSHOT/curator-framework-1.3.5-SNAPSHOT.jar
new file mode 100644
index 0000000..1b89270
--- /dev/null
+++ b/repo/com/netflix/curator/curator-framework/1.3.5-SNAPSHOT/curator-framework-1.3.5-SNAPSHOT.jar
Binary files differ
diff --git a/repo/com/netflix/curator/curator-framework/1.3.5-SNAPSHOT/curator-framework-1.3.5-SNAPSHOT.jar.md5 b/repo/com/netflix/curator/curator-framework/1.3.5-SNAPSHOT/curator-framework-1.3.5-SNAPSHOT.jar.md5
new file mode 100644
index 0000000..526cb88
--- /dev/null
+++ b/repo/com/netflix/curator/curator-framework/1.3.5-SNAPSHOT/curator-framework-1.3.5-SNAPSHOT.jar.md5
@@ -0,0 +1 @@
+837ffcfa86d11a2049d05d710c07bb4e
\ No newline at end of file
diff --git a/repo/com/netflix/curator/curator-framework/1.3.5-SNAPSHOT/curator-framework-1.3.5-SNAPSHOT.jar.sha1 b/repo/com/netflix/curator/curator-framework/1.3.5-SNAPSHOT/curator-framework-1.3.5-SNAPSHOT.jar.sha1
new file mode 100644
index 0000000..aecf353
--- /dev/null
+++ b/repo/com/netflix/curator/curator-framework/1.3.5-SNAPSHOT/curator-framework-1.3.5-SNAPSHOT.jar.sha1
@@ -0,0 +1 @@
+6ed887c7b72b142b72a8043218ba900673a3c83e
\ No newline at end of file
diff --git a/repo/com/netflix/curator/curator-framework/1.3.5-SNAPSHOT/curator-framework-1.3.5-SNAPSHOT.pom b/repo/com/netflix/curator/curator-framework/1.3.5-SNAPSHOT/curator-framework-1.3.5-SNAPSHOT.pom
new file mode 100644
index 0000000..84f098f
--- /dev/null
+++ b/repo/com/netflix/curator/curator-framework/1.3.5-SNAPSHOT/curator-framework-1.3.5-SNAPSHOT.pom
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>com.netflix.curator</groupId>
+ <artifactId>curator-framework</artifactId>
+ <version>1.3.5-SNAPSHOT</version>
+ <description>POM was created from install:install-file</description>
+</project>
diff --git a/repo/com/netflix/curator/curator-framework/1.3.5-SNAPSHOT/curator-framework-1.3.5-SNAPSHOT.pom.md5 b/repo/com/netflix/curator/curator-framework/1.3.5-SNAPSHOT/curator-framework-1.3.5-SNAPSHOT.pom.md5
new file mode 100644
index 0000000..cf9798c
--- /dev/null
+++ b/repo/com/netflix/curator/curator-framework/1.3.5-SNAPSHOT/curator-framework-1.3.5-SNAPSHOT.pom.md5
@@ -0,0 +1 @@
+f05dc58d60323b5b06c09d14dc435886
\ No newline at end of file
diff --git a/repo/com/netflix/curator/curator-framework/1.3.5-SNAPSHOT/curator-framework-1.3.5-SNAPSHOT.pom.sha1 b/repo/com/netflix/curator/curator-framework/1.3.5-SNAPSHOT/curator-framework-1.3.5-SNAPSHOT.pom.sha1
new file mode 100644
index 0000000..0895d5c
--- /dev/null
+++ b/repo/com/netflix/curator/curator-framework/1.3.5-SNAPSHOT/curator-framework-1.3.5-SNAPSHOT.pom.sha1
@@ -0,0 +1 @@
+6750549cf7f567ed3d0a13d0e98d3c32f2c6860d
\ No newline at end of file
diff --git a/repo/com/netflix/curator/curator-framework/1.3.5-SNAPSHOT/maven-metadata-local.xml b/repo/com/netflix/curator/curator-framework/1.3.5-SNAPSHOT/maven-metadata-local.xml
new file mode 100644
index 0000000..575d4c6
--- /dev/null
+++ b/repo/com/netflix/curator/curator-framework/1.3.5-SNAPSHOT/maven-metadata-local.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<metadata modelVersion="1.1.0">
+ <groupId>com.netflix.curator</groupId>
+ <artifactId>curator-framework</artifactId>
+ <version>1.3.5-SNAPSHOT</version>
+ <versioning>
+ <snapshot>
+ <localCopy>true</localCopy>
+ </snapshot>
+ <lastUpdated>20140102175420</lastUpdated>
+ <snapshotVersions>
+ <snapshotVersion>
+ <extension>jar</extension>
+ <value>1.3.5-SNAPSHOT</value>
+ <updated>20140102175420</updated>
+ </snapshotVersion>
+ <snapshotVersion>
+ <extension>pom</extension>
+ <value>1.3.5-SNAPSHOT</value>
+ <updated>20140102175420</updated>
+ </snapshotVersion>
+ </snapshotVersions>
+ </versioning>
+</metadata>
diff --git a/repo/com/netflix/curator/curator-framework/1.3.5-SNAPSHOT/maven-metadata-local.xml.md5 b/repo/com/netflix/curator/curator-framework/1.3.5-SNAPSHOT/maven-metadata-local.xml.md5
new file mode 100644
index 0000000..91a0276
--- /dev/null
+++ b/repo/com/netflix/curator/curator-framework/1.3.5-SNAPSHOT/maven-metadata-local.xml.md5
@@ -0,0 +1 @@
+ad227a30712055f5ce428b2698626e8c
\ No newline at end of file
diff --git a/repo/com/netflix/curator/curator-framework/1.3.5-SNAPSHOT/maven-metadata-local.xml.sha1 b/repo/com/netflix/curator/curator-framework/1.3.5-SNAPSHOT/maven-metadata-local.xml.sha1
new file mode 100644
index 0000000..e195786
--- /dev/null
+++ b/repo/com/netflix/curator/curator-framework/1.3.5-SNAPSHOT/maven-metadata-local.xml.sha1
@@ -0,0 +1 @@
+1094337510f3b3c0f4e7daebc584e00fea388570
\ No newline at end of file
diff --git a/repo/com/netflix/curator/curator-framework/maven-metadata-local.xml b/repo/com/netflix/curator/curator-framework/maven-metadata-local.xml
new file mode 100644
index 0000000..c0850b6
--- /dev/null
+++ b/repo/com/netflix/curator/curator-framework/maven-metadata-local.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<metadata>
+ <groupId>com.netflix.curator</groupId>
+ <artifactId>curator-framework</artifactId>
+ <versioning>
+ <versions>
+ <version>1.3.5-SNAPSHOT</version>
+ </versions>
+ <lastUpdated>20140102175420</lastUpdated>
+ </versioning>
+</metadata>
diff --git a/repo/com/netflix/curator/curator-framework/maven-metadata-local.xml.md5 b/repo/com/netflix/curator/curator-framework/maven-metadata-local.xml.md5
new file mode 100644
index 0000000..e6e4b37
--- /dev/null
+++ b/repo/com/netflix/curator/curator-framework/maven-metadata-local.xml.md5
@@ -0,0 +1 @@
+1ffcf4d9101ad330411364ae043e014d
\ No newline at end of file
diff --git a/repo/com/netflix/curator/curator-framework/maven-metadata-local.xml.sha1 b/repo/com/netflix/curator/curator-framework/maven-metadata-local.xml.sha1
new file mode 100644
index 0000000..11491ff
--- /dev/null
+++ b/repo/com/netflix/curator/curator-framework/maven-metadata-local.xml.sha1
@@ -0,0 +1 @@
+9d49a343907e558388584483f987d279714ffcc1
\ No newline at end of file
diff --git a/repo/com/netflix/curator/curator-recipes/1.3.5-SNAPSHOT/curator-recipes-1.3.5-SNAPSHOT.jar b/repo/com/netflix/curator/curator-recipes/1.3.5-SNAPSHOT/curator-recipes-1.3.5-SNAPSHOT.jar
new file mode 100644
index 0000000..30efe51
--- /dev/null
+++ b/repo/com/netflix/curator/curator-recipes/1.3.5-SNAPSHOT/curator-recipes-1.3.5-SNAPSHOT.jar
Binary files differ
diff --git a/repo/com/netflix/curator/curator-recipes/1.3.5-SNAPSHOT/curator-recipes-1.3.5-SNAPSHOT.jar.md5 b/repo/com/netflix/curator/curator-recipes/1.3.5-SNAPSHOT/curator-recipes-1.3.5-SNAPSHOT.jar.md5
new file mode 100644
index 0000000..2932cbd
--- /dev/null
+++ b/repo/com/netflix/curator/curator-recipes/1.3.5-SNAPSHOT/curator-recipes-1.3.5-SNAPSHOT.jar.md5
@@ -0,0 +1 @@
+a14fe0e16945c674b55c4e42635d1ae9
\ No newline at end of file
diff --git a/repo/com/netflix/curator/curator-recipes/1.3.5-SNAPSHOT/curator-recipes-1.3.5-SNAPSHOT.jar.sha1 b/repo/com/netflix/curator/curator-recipes/1.3.5-SNAPSHOT/curator-recipes-1.3.5-SNAPSHOT.jar.sha1
new file mode 100644
index 0000000..41613f9
--- /dev/null
+++ b/repo/com/netflix/curator/curator-recipes/1.3.5-SNAPSHOT/curator-recipes-1.3.5-SNAPSHOT.jar.sha1
@@ -0,0 +1 @@
+bd80a054cf18f037bd297b77566028e46c1056a9
\ No newline at end of file
diff --git a/repo/com/netflix/curator/curator-recipes/1.3.5-SNAPSHOT/curator-recipes-1.3.5-SNAPSHOT.pom b/repo/com/netflix/curator/curator-recipes/1.3.5-SNAPSHOT/curator-recipes-1.3.5-SNAPSHOT.pom
new file mode 100644
index 0000000..198deba
--- /dev/null
+++ b/repo/com/netflix/curator/curator-recipes/1.3.5-SNAPSHOT/curator-recipes-1.3.5-SNAPSHOT.pom
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>com.netflix.curator</groupId>
+ <artifactId>curator-recipes</artifactId>
+ <version>1.3.5-SNAPSHOT</version>
+ <description>POM was created from install:install-file</description>
+</project>
diff --git a/repo/com/netflix/curator/curator-recipes/1.3.5-SNAPSHOT/curator-recipes-1.3.5-SNAPSHOT.pom.md5 b/repo/com/netflix/curator/curator-recipes/1.3.5-SNAPSHOT/curator-recipes-1.3.5-SNAPSHOT.pom.md5
new file mode 100644
index 0000000..262bab7
--- /dev/null
+++ b/repo/com/netflix/curator/curator-recipes/1.3.5-SNAPSHOT/curator-recipes-1.3.5-SNAPSHOT.pom.md5
@@ -0,0 +1 @@
+b1ba9c9fb1147e4b8edafecd6c60954f
\ No newline at end of file
diff --git a/repo/com/netflix/curator/curator-recipes/1.3.5-SNAPSHOT/curator-recipes-1.3.5-SNAPSHOT.pom.sha1 b/repo/com/netflix/curator/curator-recipes/1.3.5-SNAPSHOT/curator-recipes-1.3.5-SNAPSHOT.pom.sha1
new file mode 100644
index 0000000..a75ea0c
--- /dev/null
+++ b/repo/com/netflix/curator/curator-recipes/1.3.5-SNAPSHOT/curator-recipes-1.3.5-SNAPSHOT.pom.sha1
@@ -0,0 +1 @@
+1729fd8fcb7a6252004eadc49aae0ddc436374c3
\ No newline at end of file
diff --git a/repo/com/netflix/curator/curator-recipes/1.3.5-SNAPSHOT/maven-metadata-local.xml b/repo/com/netflix/curator/curator-recipes/1.3.5-SNAPSHOT/maven-metadata-local.xml
new file mode 100644
index 0000000..982743d
--- /dev/null
+++ b/repo/com/netflix/curator/curator-recipes/1.3.5-SNAPSHOT/maven-metadata-local.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<metadata modelVersion="1.1.0">
+ <groupId>com.netflix.curator</groupId>
+ <artifactId>curator-recipes</artifactId>
+ <version>1.3.5-SNAPSHOT</version>
+ <versioning>
+ <snapshot>
+ <localCopy>true</localCopy>
+ </snapshot>
+ <lastUpdated>20140102175423</lastUpdated>
+ <snapshotVersions>
+ <snapshotVersion>
+ <extension>jar</extension>
+ <value>1.3.5-SNAPSHOT</value>
+ <updated>20140102175423</updated>
+ </snapshotVersion>
+ <snapshotVersion>
+ <extension>pom</extension>
+ <value>1.3.5-SNAPSHOT</value>
+ <updated>20140102175423</updated>
+ </snapshotVersion>
+ </snapshotVersions>
+ </versioning>
+</metadata>
diff --git a/repo/com/netflix/curator/curator-recipes/1.3.5-SNAPSHOT/maven-metadata-local.xml.md5 b/repo/com/netflix/curator/curator-recipes/1.3.5-SNAPSHOT/maven-metadata-local.xml.md5
new file mode 100644
index 0000000..8eedc9b
--- /dev/null
+++ b/repo/com/netflix/curator/curator-recipes/1.3.5-SNAPSHOT/maven-metadata-local.xml.md5
@@ -0,0 +1 @@
+50c512f43275d8025c64db161237902f
\ No newline at end of file
diff --git a/repo/com/netflix/curator/curator-recipes/1.3.5-SNAPSHOT/maven-metadata-local.xml.sha1 b/repo/com/netflix/curator/curator-recipes/1.3.5-SNAPSHOT/maven-metadata-local.xml.sha1
new file mode 100644
index 0000000..4eb06cf
--- /dev/null
+++ b/repo/com/netflix/curator/curator-recipes/1.3.5-SNAPSHOT/maven-metadata-local.xml.sha1
@@ -0,0 +1 @@
+c43e204325a14bd04b1421c294e21ba3d4c844c7
\ No newline at end of file
diff --git a/repo/com/netflix/curator/curator-recipes/maven-metadata-local.xml b/repo/com/netflix/curator/curator-recipes/maven-metadata-local.xml
new file mode 100644
index 0000000..c7018a0
--- /dev/null
+++ b/repo/com/netflix/curator/curator-recipes/maven-metadata-local.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<metadata>
+ <groupId>com.netflix.curator</groupId>
+ <artifactId>curator-recipes</artifactId>
+ <versioning>
+ <versions>
+ <version>1.3.5-SNAPSHOT</version>
+ </versions>
+ <lastUpdated>20140102175423</lastUpdated>
+ </versioning>
+</metadata>
diff --git a/repo/com/netflix/curator/curator-recipes/maven-metadata-local.xml.md5 b/repo/com/netflix/curator/curator-recipes/maven-metadata-local.xml.md5
new file mode 100644
index 0000000..88b4161
--- /dev/null
+++ b/repo/com/netflix/curator/curator-recipes/maven-metadata-local.xml.md5
@@ -0,0 +1 @@
+e21acd4765fda10d42252072e7b478f9
\ No newline at end of file
diff --git a/repo/com/netflix/curator/curator-recipes/maven-metadata-local.xml.sha1 b/repo/com/netflix/curator/curator-recipes/maven-metadata-local.xml.sha1
new file mode 100644
index 0000000..393d68d
--- /dev/null
+++ b/repo/com/netflix/curator/curator-recipes/maven-metadata-local.xml.sha1
@@ -0,0 +1 @@
+77b6ed5d47f571d3ba252620fe14a76504eb85a5
\ No newline at end of file
diff --git a/repo/com/netflix/curator/curator-x-discovery/1.3.5-SNAPSHOT/curator-x-discovery-1.3.5-SNAPSHOT.jar b/repo/com/netflix/curator/curator-x-discovery/1.3.5-SNAPSHOT/curator-x-discovery-1.3.5-SNAPSHOT.jar
new file mode 100644
index 0000000..147417e
--- /dev/null
+++ b/repo/com/netflix/curator/curator-x-discovery/1.3.5-SNAPSHOT/curator-x-discovery-1.3.5-SNAPSHOT.jar
Binary files differ
diff --git a/repo/com/netflix/curator/curator-x-discovery/1.3.5-SNAPSHOT/curator-x-discovery-1.3.5-SNAPSHOT.jar.md5 b/repo/com/netflix/curator/curator-x-discovery/1.3.5-SNAPSHOT/curator-x-discovery-1.3.5-SNAPSHOT.jar.md5
new file mode 100644
index 0000000..3025108
--- /dev/null
+++ b/repo/com/netflix/curator/curator-x-discovery/1.3.5-SNAPSHOT/curator-x-discovery-1.3.5-SNAPSHOT.jar.md5
@@ -0,0 +1 @@
+f0aadef06641b7da6dab0f17a03c10b5
\ No newline at end of file
diff --git a/repo/com/netflix/curator/curator-x-discovery/1.3.5-SNAPSHOT/curator-x-discovery-1.3.5-SNAPSHOT.jar.sha1 b/repo/com/netflix/curator/curator-x-discovery/1.3.5-SNAPSHOT/curator-x-discovery-1.3.5-SNAPSHOT.jar.sha1
new file mode 100644
index 0000000..d08e236
--- /dev/null
+++ b/repo/com/netflix/curator/curator-x-discovery/1.3.5-SNAPSHOT/curator-x-discovery-1.3.5-SNAPSHOT.jar.sha1
@@ -0,0 +1 @@
+1d1e79e81ac6f042a647e50fef6730a91e9281af
\ No newline at end of file
diff --git a/repo/com/netflix/curator/curator-x-discovery/1.3.5-SNAPSHOT/curator-x-discovery-1.3.5-SNAPSHOT.pom b/repo/com/netflix/curator/curator-x-discovery/1.3.5-SNAPSHOT/curator-x-discovery-1.3.5-SNAPSHOT.pom
new file mode 100644
index 0000000..af57ce1
--- /dev/null
+++ b/repo/com/netflix/curator/curator-x-discovery/1.3.5-SNAPSHOT/curator-x-discovery-1.3.5-SNAPSHOT.pom
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>com.netflix.curator</groupId>
+ <artifactId>curator-x-discovery</artifactId>
+ <version>1.3.5-SNAPSHOT</version>
+ <description>POM was created from install:install-file</description>
+</project>
diff --git a/repo/com/netflix/curator/curator-x-discovery/1.3.5-SNAPSHOT/curator-x-discovery-1.3.5-SNAPSHOT.pom.md5 b/repo/com/netflix/curator/curator-x-discovery/1.3.5-SNAPSHOT/curator-x-discovery-1.3.5-SNAPSHOT.pom.md5
new file mode 100644
index 0000000..72e09b8
--- /dev/null
+++ b/repo/com/netflix/curator/curator-x-discovery/1.3.5-SNAPSHOT/curator-x-discovery-1.3.5-SNAPSHOT.pom.md5
@@ -0,0 +1 @@
+672c8a21ef3629f6910ed0077b112f1c
\ No newline at end of file
diff --git a/repo/com/netflix/curator/curator-x-discovery/1.3.5-SNAPSHOT/curator-x-discovery-1.3.5-SNAPSHOT.pom.sha1 b/repo/com/netflix/curator/curator-x-discovery/1.3.5-SNAPSHOT/curator-x-discovery-1.3.5-SNAPSHOT.pom.sha1
new file mode 100644
index 0000000..b8c733f
--- /dev/null
+++ b/repo/com/netflix/curator/curator-x-discovery/1.3.5-SNAPSHOT/curator-x-discovery-1.3.5-SNAPSHOT.pom.sha1
@@ -0,0 +1 @@
+2c939a080e7dd43af4022310d3fac75191a393f5
\ No newline at end of file
diff --git a/repo/com/netflix/curator/curator-x-discovery/1.3.5-SNAPSHOT/maven-metadata-local.xml b/repo/com/netflix/curator/curator-x-discovery/1.3.5-SNAPSHOT/maven-metadata-local.xml
new file mode 100644
index 0000000..c3766b7
--- /dev/null
+++ b/repo/com/netflix/curator/curator-x-discovery/1.3.5-SNAPSHOT/maven-metadata-local.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<metadata modelVersion="1.1.0">
+ <groupId>com.netflix.curator</groupId>
+ <artifactId>curator-x-discovery</artifactId>
+ <version>1.3.5-SNAPSHOT</version>
+ <versioning>
+ <snapshot>
+ <localCopy>true</localCopy>
+ </snapshot>
+ <lastUpdated>20140102175425</lastUpdated>
+ <snapshotVersions>
+ <snapshotVersion>
+ <extension>jar</extension>
+ <value>1.3.5-SNAPSHOT</value>
+ <updated>20140102175425</updated>
+ </snapshotVersion>
+ <snapshotVersion>
+ <extension>pom</extension>
+ <value>1.3.5-SNAPSHOT</value>
+ <updated>20140102175425</updated>
+ </snapshotVersion>
+ </snapshotVersions>
+ </versioning>
+</metadata>
diff --git a/repo/com/netflix/curator/curator-x-discovery/1.3.5-SNAPSHOT/maven-metadata-local.xml.md5 b/repo/com/netflix/curator/curator-x-discovery/1.3.5-SNAPSHOT/maven-metadata-local.xml.md5
new file mode 100644
index 0000000..5efd07d
--- /dev/null
+++ b/repo/com/netflix/curator/curator-x-discovery/1.3.5-SNAPSHOT/maven-metadata-local.xml.md5
@@ -0,0 +1 @@
+bf828c8b78fcbf02d658c214a8146bd6
\ No newline at end of file
diff --git a/repo/com/netflix/curator/curator-x-discovery/1.3.5-SNAPSHOT/maven-metadata-local.xml.sha1 b/repo/com/netflix/curator/curator-x-discovery/1.3.5-SNAPSHOT/maven-metadata-local.xml.sha1
new file mode 100644
index 0000000..7a4e3bf
--- /dev/null
+++ b/repo/com/netflix/curator/curator-x-discovery/1.3.5-SNAPSHOT/maven-metadata-local.xml.sha1
@@ -0,0 +1 @@
+4a9f4761ac5f12f448f48bc8f08a2c098dd5435c
\ No newline at end of file
diff --git a/repo/com/netflix/curator/curator-x-discovery/maven-metadata-local.xml b/repo/com/netflix/curator/curator-x-discovery/maven-metadata-local.xml
new file mode 100644
index 0000000..37c9551
--- /dev/null
+++ b/repo/com/netflix/curator/curator-x-discovery/maven-metadata-local.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<metadata>
+ <groupId>com.netflix.curator</groupId>
+ <artifactId>curator-x-discovery</artifactId>
+ <versioning>
+ <versions>
+ <version>1.3.5-SNAPSHOT</version>
+ </versions>
+ <lastUpdated>20140102175425</lastUpdated>
+ </versioning>
+</metadata>
diff --git a/repo/com/netflix/curator/curator-x-discovery/maven-metadata-local.xml.md5 b/repo/com/netflix/curator/curator-x-discovery/maven-metadata-local.xml.md5
new file mode 100644
index 0000000..247854b
--- /dev/null
+++ b/repo/com/netflix/curator/curator-x-discovery/maven-metadata-local.xml.md5
@@ -0,0 +1 @@
+a719466f9f7df932f5a0727156fec652
\ No newline at end of file
diff --git a/repo/com/netflix/curator/curator-x-discovery/maven-metadata-local.xml.sha1 b/repo/com/netflix/curator/curator-x-discovery/maven-metadata-local.xml.sha1
new file mode 100644
index 0000000..3bc27f7
--- /dev/null
+++ b/repo/com/netflix/curator/curator-x-discovery/maven-metadata-local.xml.sha1
@@ -0,0 +1 @@
+e4d0f45d5a5d60836ee6eea43e937995464c1b8a
\ No newline at end of file
diff --git a/scripts/demo-reset-sw.sh b/scripts/demo-reset-sw.sh
index e6cabae..34950c5 100755
--- a/scripts/demo-reset-sw.sh
+++ b/scripts/demo-reset-sw.sh
@@ -1,17 +1,21 @@
#! /bin/bash
+source ~/env_cluster
basename=$ONOS_CLUSTER_BASENAME
DIR=${HOME}/ONOS
tstart=`date +"%s"`
echo "All Link Up"
$DIR/scripts/all-linkup.sh
echo "Delete Flows"
-$DIR/web/delete_flow.py 201 300
+$DIR/web/delete_flow.py 1 300
+$DIR/web/clear_flow.py 1 300
echo "Adding Flows"
$DIR/web/add_flow.py -m onos -f $DIR/web/flowdef_demo_start.txt
-ssh -i ~/.ssh/onlabkey.pem ${basename}5 'ONOS/start-onos.sh stop'
-ssh -i ~/.ssh/onlabkey.pem ${basename}7 'ONOS/start-onos.sh stop'
-for i in 1 2 3 4 6 8; do
- ssh -i ~/.ssh/onlabkey.pem ${basename}$i 'ONOS/start-onos.sh startifdown'
+ssh -i ~/.ssh/onlabkey.pem ${basename}5 'cd ONOS;./start-onos.sh stop'
+ssh -i ~/.ssh/onlabkey.pem ${basename}6 'cd ONOS;./start-onos.sh stop'
+ssh -i ~/.ssh/onlabkey.pem ${basename}7 'cd ONOS;./start-onos.sh stop'
+ssh -i ~/.ssh/onlabkey.pem ${basename}8 'cd ONOS;./start-onos.sh stop'
+for i in 1 2 3 4 ; do
+ ssh -i ~/.ssh/onlabkey.pem ${basename}$i 'cd ONOS;./start-onos.sh startifdown'
done
sleep 2
for i in 1 2 3 4 5 6 7 8; do
diff --git a/scripts/demo-scale-out-sw.sh b/scripts/demo-scale-out-sw.sh
index 887a025..762a00e 100755
--- a/scripts/demo-scale-out-sw.sh
+++ b/scripts/demo-scale-out-sw.sh
@@ -1,14 +1,31 @@
#! /bin/bash
+source ~/env_cluster
basename=$ONOS_CLUSTER_BASENAME
DIR=${HOME}/ONOS
+
+function scale_onos(){
+ for i in 5 6 7 8 ; do
+ ssh -i ~/.ssh/onlabkey.pem ${basename}${i} 'cd ONOS;./start-onos.sh start' &
+ done
+
+ while [ 1 ]; do
+ up=`for i in 5 6 7 8 ; do
+ ssh -i ~/.ssh/onlabkey.pem ${basename}${i} 'cd ONOS;./start-onos.sh status' &
+ done | grep "instance" | awk '{s+=$1}END{print s}'`
+
+ if [ x$up == "x4" ]; then
+ break;
+ fi
+ sleep 1
+ done
+}
+
start=`date +"%s"`
-echo "bring up two nodes"
-ssh -i ~/.ssh/onlabkey.pem ${basename}5 'ONOS/start-onos.sh start'
-ssh -i ~/.ssh/onlabkey.pem ${basename}7 'ONOS/start-onos.sh start'
+echo "bring up four nodes"
+scale_onos
sleep 2
echo "Adding more flows"
$DIR/web/add_flow.py -m onos -f $DIR/web/flowdef_demo_add.txt
endt=`date +"%s"`
(( delta = endt -start ))
echo "Scale Up Done: took $delta sec"
-
diff --git a/src/main/java/net/onrc/onos/datagrid/web/GetMapResource.java b/src/main/java/net/onrc/onos/datagrid/web/GetMapResource.java
index 124ac28..8c8e1cd 100644
--- a/src/main/java/net/onrc/onos/datagrid/web/GetMapResource.java
+++ b/src/main/java/net/onrc/onos/datagrid/web/GetMapResource.java
@@ -21,7 +21,7 @@
* - "flow-entry" : Get the Flow Entries
* - "topology" : Get the Topology
*
- * GET /wm/datagrid/get/map/{map-name}/json
+ * GET /wm/onos/datagrid/get/map/{map-name}/json
*/
public class GetMapResource extends ServerResource {
protected final static Logger log = LoggerFactory.getLogger(GetMapResource.class);
diff --git a/src/main/java/net/onrc/onos/graph/GraphDBConnection.java b/src/main/java/net/onrc/onos/graph/GraphDBConnection.java
index bf30297..7938bb6 100644
--- a/src/main/java/net/onrc/onos/graph/GraphDBConnection.java
+++ b/src/main/java/net/onrc/onos/graph/GraphDBConnection.java
@@ -33,6 +33,7 @@
.getLogger(GraphDBConnection.class);
private static GraphDBConnection singleton = new GraphDBConnection();
private static TitanGraph graph;
+ private static FramedGraph<TitanGraph> fg;
private static EventTransactionalGraph<TitanGraph> eg;
private static String configFile;
@@ -85,6 +86,7 @@
graph.createKeyIndex("ipv4_address", Vertex.class);
}
graph.commit();
+ fg = new FramedGraph<TitanGraph>(graph);
eg = new EventTransactionalGraph<TitanGraph>(graph);
}
return singleton;
@@ -95,13 +97,7 @@
*/
@Override
public FramedGraph<TitanGraph> getFramedGraph() {
- if (isValid()) {
- FramedGraph<TitanGraph> fg = new FramedGraph<TitanGraph>(graph);
- return fg;
- } else {
- log.error("new FramedGraph failed");
- return null;
- }
+ return fg;
}
/**
@@ -136,11 +132,11 @@
/**
* Commit changes for the graph operations.
- * @throws Exception
+ * @throws Exception
*/
@Override
public void commit() {
-// // Should not catch exception here!
+// // Should not catch exception here!
// try {
graph.commit();
// }
@@ -154,7 +150,7 @@
*/
@Override
public void rollback() {
- // Should not catch exception here!
+ // Should not catch exception here!
// try {
graph.rollback();
// }
diff --git a/src/main/java/net/onrc/onos/ofcontroller/core/internal/DeviceStorageImpl.java b/src/main/java/net/onrc/onos/ofcontroller/core/internal/DeviceStorageImpl.java
index ba4a3b5..b084be6 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/core/internal/DeviceStorageImpl.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/core/internal/DeviceStorageImpl.java
@@ -328,8 +328,18 @@
public void addOnosDevice(OnosDevice onosDevice) {
String macAddress = HexString.toHexString(onosDevice.getMacAddress().toBytes());
- log.debug("addOnosDevice: {}", onosDevice);
+ //if the switch port we try to attach a new device already has a link, then stop adding device
+ IPortObject portObject1 = ope.searchPort(HexString.toHexString(
+ onosDevice.getSwitchDPID()), onosDevice.getSwitchPort());
+
+ if ((portObject1 != null) && portObject1.getLinkedPorts().iterator().hasNext()) {
+ log.debug("stop adding OnosDevice: {} due to there is a link to: {}",
+ onosDevice, portObject1.getLinkedPorts().iterator().next().getPortId());
+ return;
+ }
+ log.debug("addOnosDevice: {}", onosDevice);
+
try {
IDeviceObject device = ope.searchDevice(macAddress);
diff --git a/src/main/java/net/onrc/onos/ofcontroller/core/internal/LinkStorageImpl.java b/src/main/java/net/onrc/onos/ofcontroller/core/internal/LinkStorageImpl.java
index 635e24e..a9088de 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/core/internal/LinkStorageImpl.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/core/internal/LinkStorageImpl.java
@@ -6,6 +6,7 @@
import net.floodlightcontroller.routing.Link;
import net.onrc.onos.graph.GraphDBOperation;
import net.onrc.onos.ofcontroller.core.ILinkStorage;
+import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IDeviceObject;
import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IPortObject;
import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.ISwitchObject;
import net.onrc.onos.ofcontroller.linkdiscovery.LinkInfo;
@@ -107,11 +108,33 @@
return addLink(link, null);
}
+ private void deleteDeviceOnPort(Long dpid, Short number)
+ {
+ IPortObject srcPortObject = op.searchPort(HexString.toHexString(dpid), number);
+ if (srcPortObject == null)
+ return;
+ Iterable<IDeviceObject> devices = srcPortObject.getDevices();
+ if (devices == null)
+ return;
+ if (devices.iterator().hasNext()) {
+ for (IDeviceObject deviceObject: srcPortObject.getDevices()) {
+ srcPortObject.removeDevice(deviceObject);
+ log.debug("delete Device "+ deviceObject.getMACAddress() +
+ " from sw: {} port: {} due to a new link added",
+ dpid, number);
+ }
+ }
+ }
+
@Override
public boolean addLink(Link link, LinkInfo linfo) {
boolean success = false;
try {
+ //delete the Device attachment points for the related switch and port
+ deleteDeviceOnPort(link.getSrc(),link.getSrcPort());
+ deleteDeviceOnPort(link.getDst(),link.getDstPort());
+
if (addLinkImpl(link)) {
// Set LinkInfo only if linfo is non-null.
if (linfo != null && (! setLinkInfoImpl(link, linfo))) {
diff --git a/src/main/java/net/onrc/onos/ofcontroller/floodlightlistener/NetworkGraphPublisher.java b/src/main/java/net/onrc/onos/ofcontroller/floodlightlistener/NetworkGraphPublisher.java
index 187465f..d1e7387 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/floodlightlistener/NetworkGraphPublisher.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/floodlightlistener/NetworkGraphPublisher.java
@@ -176,62 +176,63 @@
op.close();
}
- @Override
- public void linkDiscoveryUpdate(LDUpdate update) {
- Link lt = new Link(update.getSrc(),update.getSrcPort(),update.getDst(),update.getDstPort());
- //log.debug("{}:LinkDicoveryUpdate(): Updating Link {}",this.getClass(), lt);
-
- switch (update.getOperation()) {
- case LINK_REMOVED:
- log.debug("LinkDiscoveryUpdate(): Removing link {}", lt);
-
- if (linkStore.deleteLink(lt)) {
- // TODO publish DELETE_LINK event here
- TopologyElement topologyElement =
- new TopologyElement(update.getSrc(),
- update.getSrcPort(),
- update.getDst(),
- update.getDstPort());
- datagridService.notificationSendTopologyElementRemoved(topologyElement);
- }
- break;
- case LINK_UPDATED:
- log.debug("LinkDiscoveryUpdate(): Updating link {}", lt);
-
- LinkInfo linfo = linkStore.getLinkInfo(lt);
- // TODO update "linfo" using portState derived using "update"
- if (linkStore.update(lt, linfo, DM_OPERATION.UPDATE)) {
- // TODO publish UPDATE_LINK event here
- //
- // TODO NOTE: Here we assume that updated
- // link is UP.
- //
- TopologyElement topologyElement =
- new TopologyElement(update.getSrc(),
- update.getSrcPort(),
- update.getDst(),
- update.getDstPort());
- datagridService.notificationSendTopologyElementUpdated(topologyElement);
- }
- break;
- case LINK_ADDED:
- log.debug("LinkDiscoveryUpdate(): Adding link {}", lt);
-
- if (linkStore.addLink(lt)) {
- // TODO publish ADD_LINK event here
- TopologyElement topologyElement =
- new TopologyElement(update.getSrc(),
- update.getSrcPort(),
- update.getDst(),
- update.getDstPort());
- datagridService.notificationSendTopologyElementAdded(topologyElement);
- }
- break;
- default:
- break;
- }
+ @Override
+ public void linkDiscoveryUpdate(LDUpdate update) {
+ Link lt = new Link(update.getSrc(),update.getSrcPort(),update.getDst(),update.getDstPort());
+ //log.debug("{}:LinkDicoveryUpdate(): Updating Link {}",this.getClass(), lt);
- }
+ switch (update.getOperation()) {
+ case LINK_REMOVED:
+ log.debug("LinkDiscoveryUpdate(): Removing link {}", lt);
+
+ if (linkStore.deleteLink(lt)) {
+ // TODO publish DELETE_LINK event here
+ TopologyElement topologyElement =
+ new TopologyElement(update.getSrc(),
+ update.getSrcPort(),
+ update.getDst(),
+ update.getDstPort());
+ datagridService.notificationSendTopologyElementRemoved(topologyElement);
+ }
+ break;
+ case LINK_UPDATED:
+ log.debug("LinkDiscoveryUpdate(): Updating link {}", lt);
+
+ LinkInfo linfo = linkStore.getLinkInfo(lt);
+ // TODO update "linfo" using portState derived using "update"
+ if (linkStore.update(lt, linfo, DM_OPERATION.UPDATE)) {
+ // TODO publish UPDATE_LINK event here
+ //
+ // TODO NOTE: Here we assume that updated
+ // link is UP.
+ //
+ TopologyElement topologyElement =
+ new TopologyElement(update.getSrc(),
+ update.getSrcPort(),
+ update.getDst(),
+ update.getDstPort());
+ datagridService.notificationSendTopologyElementUpdated(topologyElement);
+ }
+ break;
+ case LINK_ADDED:
+ log.debug("LinkDiscoveryUpdate(): Adding link {}", lt);
+
+ if (linkStore.addLink(lt)) {
+ // TODO publish ADD_LINK event here
+ TopologyElement topologyElement =
+ new TopologyElement(update.getSrc(),
+ update.getSrcPort(),
+ update.getDst(),
+ update.getDstPort());
+ datagridService.notificationSendTopologyElementAdded(topologyElement);
+ }
+
+ break;
+ default:
+ break;
+ }
+
+ }
@Override
public void addedSwitch(IOFSwitch sw) {
diff --git a/src/main/java/net/onrc/onos/ofcontroller/flowmanager/FlowEventHandler.java b/src/main/java/net/onrc/onos/ofcontroller/flowmanager/FlowEventHandler.java
index 87cc4ce..afadaa4 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/flowmanager/FlowEventHandler.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/flowmanager/FlowEventHandler.java
@@ -217,6 +217,7 @@
processFlowPathEvents();
processTopologyEvents();
+ processUnmatchedFlowEntryAdd();
processFlowEntryEvents();
// Recompute all affected Flow Paths and keep only the modified
@@ -457,11 +458,11 @@
}
/**
- * Process the Flow Entry events.
+ * Process previously received Flow Entries with unmatched Flow Paths.
*/
- private void processFlowEntryEvents() {
+ private void processUnmatchedFlowEntryAdd() {
FlowPath flowPath;
- FlowEntry updatedFlowEntry;
+ FlowEntry localFlowEntry;
//
// Update Flow Entries with previously unmatched Flow Entry updates
@@ -469,19 +470,35 @@
if (! unmatchedFlowEntryAdd.isEmpty()) {
Map<Long, FlowEntry> remainingUpdates = new HashMap<Long, FlowEntry>();
for (FlowEntry flowEntry : unmatchedFlowEntryAdd.values()) {
+ // log.debug("Processing Unmatched Flow Entry: {}",
+ // flowEntry.toString());
+
flowPath = allFlowPaths.get(flowEntry.flowId().value());
- if (flowPath == null)
- continue;
- updatedFlowEntry = updateFlowEntryAdd(flowPath, flowEntry);
- if (updatedFlowEntry == null) {
+ if (flowPath == null) {
remainingUpdates.put(flowEntry.flowEntryId().value(),
flowEntry);
continue;
}
- modifiedFlowPaths.put(flowPath.flowId().value(), flowPath);
+ localFlowEntry = findFlowEntryAdd(flowPath, flowEntry);
+ if (localFlowEntry == null) {
+ remainingUpdates.put(flowEntry.flowEntryId().value(),
+ flowEntry);
+ continue;
+ }
+ if (updateFlowEntryAdd(flowPath, localFlowEntry, flowEntry)) {
+ modifiedFlowPaths.put(flowPath.flowId().value(), flowPath);
+ }
}
unmatchedFlowEntryAdd = remainingUpdates;
}
+ }
+
+ /**
+ * Process the Flow Entry events.
+ */
+ private void processFlowEntryEvents() {
+ FlowPath flowPath;
+ FlowEntry localFlowEntry;
//
// Process all Flow Entry events and update the appropriate state
@@ -506,15 +523,17 @@
flowEntry);
break;
}
- updatedFlowEntry = updateFlowEntryAdd(flowPath, flowEntry);
- if (updatedFlowEntry == null) {
+ localFlowEntry = findFlowEntryAdd(flowPath, flowEntry);
+ if (localFlowEntry == null) {
// Flow Entry not found: keep the entry for later matching
unmatchedFlowEntryAdd.put(flowEntry.flowEntryId().value(),
flowEntry);
break;
}
- // Add the updated entry to the list of updated Flow Entries
- modifiedFlowPaths.put(flowPath.flowId().value(), flowPath);
+ if (updateFlowEntryAdd(flowPath, localFlowEntry, flowEntry)) {
+ // Add the updated Flow Path to the list of updated paths
+ modifiedFlowPaths.put(flowPath.flowId().value(), flowPath);
+ }
break;
case ENTRY_REMOVE:
@@ -528,32 +547,37 @@
// Flow Path not found: ignore the update
break;
}
- updatedFlowEntry = updateFlowEntryRemove(flowPath, flowEntry);
- if (updatedFlowEntry == null) {
+ localFlowEntry = findFlowEntryRemove(flowPath, flowEntry);
+ if (localFlowEntry == null) {
// Flow Entry not found: ignore it
break;
}
- modifiedFlowPaths.put(flowPath.flowId().value(), flowPath);
+ if (updateFlowEntryRemove(flowPath, localFlowEntry,
+ flowEntry)) {
+ // Add the updated Flow Path to the list of updated paths
+ modifiedFlowPaths.put(flowPath.flowId().value(), flowPath);
+ }
break;
}
}
}
/**
- * Update a Flow Entry because of an external ENTRY_ADD event.
+ * Find a Flow Entry that should be updated because of an external
+ * ENTRY_ADD event.
*
* @param flowPath the FlowPath for the Flow Entry to update.
- * @param flowEntry the FlowEntry with the new state.
- * @return the updated Flow Entry if found, otherwise null.
+ * @param newFlowEntry the FlowEntry with the new state.
+ * @return the Flow Entry that should be updated if found, otherwise null.
*/
- private FlowEntry updateFlowEntryAdd(FlowPath flowPath,
- FlowEntry flowEntry) {
+ private FlowEntry findFlowEntryAdd(FlowPath flowPath,
+ FlowEntry newFlowEntry) {
//
// Iterate over all Flow Entries and find a match.
//
for (FlowEntry localFlowEntry : flowPath.flowEntries()) {
if (! TopologyManager.isSameFlowEntryDataPath(localFlowEntry,
- flowEntry)) {
+ newFlowEntry)) {
continue;
}
@@ -562,27 +586,89 @@
//
if (localFlowEntry.isValidFlowEntryId()) {
if (localFlowEntry.flowEntryId().value() !=
- flowEntry.flowEntryId().value()) {
+ newFlowEntry.flowEntryId().value()) {
//
// Find a local Flow Entry, but the Flow Entry ID doesn't
// match. Keep looking.
//
continue;
}
- } else {
- // Update the Flow Entry ID
- FlowEntryId flowEntryId =
- new FlowEntryId(flowEntry.flowEntryId().value());
- localFlowEntry.setFlowEntryId(flowEntryId);
}
+ return localFlowEntry;
+ }
- //
- // Update the local Flow Entry, and keep state to check
- // if the Flow Path has been installed.
- //
- localFlowEntry.setFlowEntryUserState(flowEntry.flowEntryUserState());
- localFlowEntry.setFlowEntrySwitchState(flowEntry.flowEntrySwitchState());
+ return null; // Entry not found
+ }
+
+ /**
+ * Update a Flow Entry because of an external ENTRY_ADD event.
+ *
+ * @param flowPath the FlowPath for the Flow Entry to update.
+ * @param localFlowEntry the local Flow Entry to update.
+ * @param newFlowEntry the FlowEntry with the new state.
+ * @return true if the local Flow Entry was updated, otherwise false.
+ */
+ private boolean updateFlowEntryAdd(FlowPath flowPath,
+ FlowEntry localFlowEntry,
+ FlowEntry newFlowEntry) {
+ boolean updated = false;
+
+ if (localFlowEntry.flowEntryUserState() ==
+ FlowEntryUserState.FE_USER_DELETE) {
+ // Don't add-back a Flow Entry that is already deleted
+ return false;
+ }
+
+ if (! localFlowEntry.isValidFlowEntryId()) {
+ // Update the Flow Entry ID
+ FlowEntryId flowEntryId =
+ new FlowEntryId(newFlowEntry.flowEntryId().value());
+ localFlowEntry.setFlowEntryId(flowEntryId);
+ updated = true;
+ }
+
+ //
+ // Update the local Flow Entry, and keep state to check
+ // if the Flow Path has been installed.
+ //
+ if (localFlowEntry.flowEntryUserState() !=
+ newFlowEntry.flowEntryUserState()) {
+ localFlowEntry.setFlowEntryUserState(
+ newFlowEntry.flowEntryUserState());
+ updated = true;
+ }
+ if (localFlowEntry.flowEntrySwitchState() !=
+ newFlowEntry.flowEntrySwitchState()) {
+ localFlowEntry.setFlowEntrySwitchState(
+ newFlowEntry.flowEntrySwitchState());
checkIfInstalledFlowPaths.put(flowPath.flowId().value(), flowPath);
+ updated = true;
+ }
+
+ return updated;
+ }
+
+ /**
+ * Find a Flow Entry that should be updated because of an external
+ * ENTRY_REMOVE event.
+ *
+ * @param flowPath the FlowPath for the Flow Entry to update.
+ * @param newFlowEntry the FlowEntry with the new state.
+ * @return the Flow Entry that should be updated if found, otherwise null.
+ */
+ private FlowEntry findFlowEntryRemove(FlowPath flowPath,
+ FlowEntry newFlowEntry) {
+ //
+ // Iterate over all Flow Entries and find a match based on
+ // the Flow Entry ID.
+ //
+ for (FlowEntry localFlowEntry : flowPath.flowEntries()) {
+ if (! localFlowEntry.isValidFlowEntryId())
+ continue;
+ if (localFlowEntry.flowEntryId().value() !=
+ newFlowEntry.flowEntryId().value()) {
+ continue;
+ }
return localFlowEntry;
}
@@ -593,31 +679,32 @@
* Update a Flow Entry because of an external ENTRY_REMOVE event.
*
* @param flowPath the FlowPath for the Flow Entry to update.
- * @param flowEntry the FlowEntry with the new state.
- * @return the updated Flow Entry if found, otherwise null.
+ * @param localFlowEntry the local Flow Entry to update.
+ * @param newFlowEntry the FlowEntry with the new state.
+ * @return true if the local Flow Entry was updated, otherwise false.
*/
- private FlowEntry updateFlowEntryRemove(FlowPath flowPath,
- FlowEntry flowEntry) {
+ private boolean updateFlowEntryRemove(FlowPath flowPath,
+ FlowEntry localFlowEntry,
+ FlowEntry newFlowEntry) {
+ boolean updated = false;
+
//
- // Iterate over all Flow Entries and find a match based on
- // the Flow Entry ID.
+ // Update the local Flow Entry.
//
- for (FlowEntry localFlowEntry : flowPath.flowEntries()) {
- if (! localFlowEntry.isValidFlowEntryId())
- continue;
- if (localFlowEntry.flowEntryId().value() !=
- flowEntry.flowEntryId().value()) {
- continue;
- }
- //
- // Update the local Flow Entry.
- //
- localFlowEntry.setFlowEntryUserState(flowEntry.flowEntryUserState());
- localFlowEntry.setFlowEntrySwitchState(flowEntry.flowEntrySwitchState());
- return localFlowEntry;
+ if (localFlowEntry.flowEntryUserState() !=
+ newFlowEntry.flowEntryUserState()) {
+ localFlowEntry.setFlowEntryUserState(
+ newFlowEntry.flowEntryUserState());
+ updated = true;
+ }
+ if (localFlowEntry.flowEntrySwitchState() !=
+ newFlowEntry.flowEntrySwitchState()) {
+ localFlowEntry.setFlowEntrySwitchState(
+ newFlowEntry.flowEntrySwitchState());
+ updated = true;
}
- return null; // Entry not found
+ return updated;
}
/**
diff --git a/src/main/java/net/onrc/onos/ofcontroller/flowmanager/FlowManager.java b/src/main/java/net/onrc/onos/ofcontroller/flowmanager/FlowManager.java
index 26bff9b..e821a97 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/flowmanager/FlowManager.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/flowmanager/FlowManager.java
@@ -37,6 +37,8 @@
import net.onrc.onos.ofcontroller.util.Pair;
import net.onrc.onos.ofcontroller.util.serializers.KryoFactory;
+import com.thinkaurelius.titan.core.TitanException;
+
import com.esotericsoftware.kryo2.Kryo;
import org.slf4j.Logger;
@@ -145,7 +147,12 @@
l.add(IDatagridService.class);
l.add(IRestApiService.class);
l.add(IFlowPusherService.class);
- l.add(IForwardingService.class);
+ //
+ // TODO: Comment-out the dependency on the IForwardingService,
+ // because it is an optional module. Apparently, adding the dependency
+ // here automatically enables the module.
+ //
+ // l.add(IForwardingService.class);
return l;
}
@@ -405,32 +412,40 @@
//
// Process all entries
//
+ // TODO: For now we have to create an explicit FlowEntry copy so
+ // we don't modify the original FlowEntry.
+ // This should go away after we start using the OpenFlow Barrier
+ // mechnanism in the FlowPusher.
+ //
+ Kryo kryo = kryoFactory.newKryo();
for (Pair<IOFSwitch, FlowEntry> entry : entries) {
FlowEntry flowEntry = entry.second;
//
// Mark the Flow Entry that it has been pushed to the switch
//
- flowEntry.setFlowEntrySwitchState(FlowEntrySwitchState.FE_SWITCH_UPDATED);
+ FlowEntry copyFlowEntry = kryo.copy(flowEntry);
+ copyFlowEntry.setFlowEntrySwitchState(FlowEntrySwitchState.FE_SWITCH_UPDATED);
//
// Write the Flow Entry to the Datagrid
//
- switch (flowEntry.flowEntryUserState()) {
+ switch (copyFlowEntry.flowEntryUserState()) {
case FE_USER_ADD:
- datagridService.notificationSendFlowEntryAdded(flowEntry);
+ datagridService.notificationSendFlowEntryAdded(copyFlowEntry);
break;
case FE_USER_MODIFY:
- datagridService.notificationSendFlowEntryUpdated(flowEntry);
+ datagridService.notificationSendFlowEntryUpdated(copyFlowEntry);
break;
case FE_USER_DELETE:
- datagridService.notificationSendFlowEntryRemoved(flowEntry.flowEntryId());
+ datagridService.notificationSendFlowEntryRemoved(copyFlowEntry.flowEntryId());
break;
case FE_USER_UNKNOWN:
assert(false);
break;
}
}
+ kryoFactory.deleteKryo(kryo);
}
/**
@@ -440,7 +455,13 @@
* @param flowPaths the collection of installed Flow Paths.
*/
void notificationFlowPathsInstalled(Collection<FlowPath> flowPaths) {
- forwardingService.flowsInstalled(flowPaths);
+ //
+ // TODO: Add an explicit check for null pointer, because
+ // the IForwardingService is optional. Remove the "if" statement
+ // after hte Forwarding Module becomes mandatory.
+ //
+ if (forwardingService != null)
+ forwardingService.flowsInstalled(flowPaths);
}
/**
@@ -487,6 +508,15 @@
if (mySwitch == null)
continue;
+ if (flowEntry.flowEntrySwitchState() ==
+ FlowEntrySwitchState.FE_SWITCH_UPDATED) {
+ //
+ // Don't push again Flow Entries that were already already
+ // installed into the switches.
+ //
+ continue;
+ }
+
//
// Assign Flow Entry IDs if missing.
//
@@ -662,16 +692,25 @@
log.debug("Deleting Flow Path From Database: {}",
flowPath.toString());
- try {
- if (! FlowDatabaseOperation.deleteFlow(
- dbHandlerInner,
- flowPath.flowId())) {
- log.error("Cannot delete Flow Path {} from Network Map",
- flowPath.flowId());
- }
- } catch (Exception e) {
- log.error("Exception deleting Flow Path from Network MAP: {}", e);
- }
+ boolean retry = false;
+ do {
+ retry = false;
+ try {
+ if (! FlowDatabaseOperation.deleteFlow(
+ dbHandlerInner,
+ flowPath.flowId())) {
+ log.error("Cannot delete Flow Path {} from Network Map",
+ flowPath.flowId());
+ retry = true;
+ }
+ } catch (TitanException te) {
+ log.error("Titan Exception deleting Flow Path from Network MAP: {}", te);
+ retry = true;
+ } catch (Exception e) {
+ log.error("Exception deleting Flow Path from Network MAP: {}", e);
+ }
+ } while (retry);
+
continue;
}
@@ -688,6 +727,11 @@
allValid = false;
break;
}
+ if (flowEntry.flowEntrySwitchState() !=
+ FlowEntrySwitchState.FE_SWITCH_UPDATED) {
+ allValid = false;
+ break;
+ }
}
if (! allValid)
continue;
@@ -697,15 +741,23 @@
//
// Write the Flow Path to the Network Map
//
- try {
- if (! FlowDatabaseOperation.addFlow(dbHandlerInner, flowPath)) {
- String logMsg = "Cannot write to Network Map Flow Path " +
- flowPath.flowId();
- log.error(logMsg);
+ boolean retry = false;
+ do {
+ retry = false;
+ try {
+ if (! FlowDatabaseOperation.addFlow(dbHandlerInner, flowPath)) {
+ String logMsg = "Cannot write to Network Map Flow Path " +
+ flowPath.flowId();
+ log.error(logMsg);
+ retry = true;
+ }
+ } catch (TitanException te) {
+ log.error("Titan Exception writing Flow Path to Network MAP: ", te);
+ retry = true;
+ } catch (Exception e) {
+ log.error("Exception writing Flow Path to Network MAP: ", e);
}
- } catch (Exception e) {
- log.error("Exception writing Flow Path to Network MAP: ", e);
- }
+ } while (retry);
}
}
}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/flowmanager/web/AddFlowResource.java b/src/main/java/net/onrc/onos/ofcontroller/flowmanager/web/AddFlowResource.java
index 9afaaec..2a7574b 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/flowmanager/web/AddFlowResource.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/flowmanager/web/AddFlowResource.java
@@ -18,7 +18,7 @@
* Flow Manager REST API implementation: Add a Flow with the Flow
* Entries:
*
- * POST /wm/flow/add/json
+ * POST /wm/onos/flows/add/json
*/
public class AddFlowResource extends ServerResource {
diff --git a/src/main/java/net/onrc/onos/ofcontroller/flowmanager/web/DeleteFlowResource.java b/src/main/java/net/onrc/onos/ofcontroller/flowmanager/web/DeleteFlowResource.java
index f4e23b8..d0991e8 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/flowmanager/web/DeleteFlowResource.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/flowmanager/web/DeleteFlowResource.java
@@ -14,7 +14,7 @@
* The "{flow-id}" request attribute value can be either a specific Flow ID,
* or the keyword "all" to delete all Flows:
*
- * GET /wm/flow/delete/{flow-id}/json
+ * GET /wm/onos/flows/delete/{flow-id}/json
*/
public class DeleteFlowResource extends ServerResource {
protected final static Logger log = LoggerFactory.getLogger(DeleteFlowResource.class);
diff --git a/src/main/java/net/onrc/onos/ofcontroller/flowmanager/web/GetAllFlowsResource.java b/src/main/java/net/onrc/onos/ofcontroller/flowmanager/web/GetAllFlowsResource.java
index a4ea960..91bd210 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/flowmanager/web/GetAllFlowsResource.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/flowmanager/web/GetAllFlowsResource.java
@@ -13,7 +13,7 @@
/**
* Flow Manager REST API implementation: Get all Flow state.
*
- * GET /wm/flow/getall/json"
+ * GET /wm/onos/flows/getall/json"
*/
public class GetAllFlowsResource extends ServerResource {
protected final static Logger log = LoggerFactory.getLogger(GetAllFlowsResource.class);
diff --git a/src/main/java/net/onrc/onos/ofcontroller/flowmanager/web/GetFlowByIdResource.java b/src/main/java/net/onrc/onos/ofcontroller/flowmanager/web/GetFlowByIdResource.java
index 9ceef6e..1bfb6a3 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/flowmanager/web/GetFlowByIdResource.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/flowmanager/web/GetFlowByIdResource.java
@@ -14,7 +14,7 @@
*
* The "{flow-id}" request attribute value is the Flow ID of the flow to get:
*
- * GET /wm/flow/get/{flow-id}/json
+ * GET /wm/onos/flows/get/{flow-id}/json
*/
public class GetFlowByIdResource extends ServerResource {
protected final static Logger log = LoggerFactory.getLogger(GetFlowByIdResource.class);
diff --git a/src/main/java/net/onrc/onos/ofcontroller/flowmanager/web/GetSummaryFlowsResource.java b/src/main/java/net/onrc/onos/ofcontroller/flowmanager/web/GetSummaryFlowsResource.java
index 58f82a9..9cffb56 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/flowmanager/web/GetSummaryFlowsResource.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/flowmanager/web/GetSummaryFlowsResource.java
@@ -20,7 +20,7 @@
* The "{max-flows}" request attribute value is the maximum number of flows
* to be returned.
*
- * GET /wm/flow/getsummary/{flow-id}/{max-flows}/json"
+ * GET /wm/onos/flows/getsummary/{flow-id}/{max-flows}/json"
*/
public class GetSummaryFlowsResource extends ServerResource {
protected final static Logger log = LoggerFactory.getLogger(GetSummaryFlowsResource.class);
diff --git a/src/main/java/net/onrc/onos/ofcontroller/flowprogrammer/FlowProgrammer.java b/src/main/java/net/onrc/onos/ofcontroller/flowprogrammer/FlowProgrammer.java
index a4f0a8c..641faaf 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/flowprogrammer/FlowProgrammer.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/flowprogrammer/FlowProgrammer.java
@@ -139,8 +139,8 @@
switch (msg.getType()) {
case FLOW_REMOVED:
OFFlowRemoved flowMsg = (OFFlowRemoved) msg;
- log.debug("Got flow removed from "+ sw.getId() +": "+ flowMsg.getCookie());
FlowEntryId id = new FlowEntryId(flowMsg.getCookie());
+ log.debug("Got flow entry removed from " + sw.getId() + ": " + id);
flowManager.flowEntryOnSwitchExpired(sw, id);
break;
default:
diff --git a/src/main/java/net/onrc/onos/ofcontroller/forwarding/Forwarding.java b/src/main/java/net/onrc/onos/ofcontroller/forwarding/Forwarding.java
index 02972e2..4415120 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/forwarding/Forwarding.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/forwarding/Forwarding.java
@@ -7,7 +7,6 @@
import java.util.Iterator;
import java.util.List;
import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
import net.floodlightcontroller.core.FloodlightContext;
import net.floodlightcontroller.core.IFloodlightProviderService;
@@ -62,6 +61,8 @@
private final int IDLE_TIMEOUT = 5; // seconds
private final int HARD_TIMEOUT = 0; // seconds
+
+ private final int PATH_PUSHED_TIMEOUT = 3000; // milliseconds
private IFloodlightProviderService floodlightProvider;
private IFlowService flowService;
@@ -71,12 +72,15 @@
private IDeviceStorage deviceStorage;
private TopologyManager topologyService;
- private Map<Path, Long> pendingFlows;
+ //private Map<Path, Long> pendingFlows;
+ // TODO it seems there is a Guava collection that will time out entries.
+ // We should see if this will work here.
+ private Map<Path, PushedFlow> pendingFlows;
private ListMultimap<Long, PacketToPush> waitingPackets;
private final Object lock = new Object();
- public class PacketToPush {
+ private class PacketToPush {
public final OFPacketOut packet;
public final long dpid;
@@ -86,15 +90,35 @@
}
}
- public final class Path {
+ private class PushedFlow {
+ public final long flowId;
+ private final long pushedTime;
+ public short firstHopOutPort = OFPort.OFPP_NONE.getValue();
+
+ public PushedFlow(long flowId) {
+ this.flowId = flowId;
+ pushedTime = System.currentTimeMillis();
+ }
+
+ public boolean isExpired() {
+ return (System.currentTimeMillis() - pushedTime) > PATH_PUSHED_TIMEOUT;
+ }
+ }
+
+ private final class Path {
public final SwitchPort srcPort;
public final SwitchPort dstPort;
+ public final MACAddress srcMac;
+ public final MACAddress dstMac;
- public Path(SwitchPort src, SwitchPort dst) {
+ public Path(SwitchPort src, SwitchPort dst,
+ MACAddress srcMac, MACAddress dstMac) {
srcPort = new SwitchPort(new Dpid(src.dpid().value()),
new Port(src.port().value()));
dstPort = new SwitchPort(new Dpid(dst.dpid().value()),
new Port(dst.port().value()));
+ this.srcMac = srcMac;
+ this.dstMac = dstMac;
}
@Override
@@ -105,7 +129,9 @@
Path otherPath = (Path) other;
return srcPort.equals(otherPath.srcPort) &&
- dstPort.equals(otherPath.dstPort);
+ dstPort.equals(otherPath.dstPort) &&
+ srcMac.equals(otherPath.srcMac) &&
+ dstMac.equals(otherPath.dstMac);
}
@Override
@@ -113,8 +139,16 @@
int hash = 17;
hash = 31 * hash + srcPort.hashCode();
hash = 31 * hash + dstPort.hashCode();
+ hash = 31 * hash + srcMac.hashCode();
+ hash = 31 * hash + dstMac.hashCode();
return hash;
}
+
+ @Override
+ public String toString() {
+ return "(" + srcMac + " at " + srcPort + ") => ("
+ + dstPort + " at " + dstMac + ")";
+ }
}
@Override
@@ -154,7 +188,8 @@
floodlightProvider.addOFMessageListener(OFType.PACKET_IN, this);
- pendingFlows = new ConcurrentHashMap<Path, Long>();
+ //pendingFlows = new ConcurrentHashMap<Path, Long>();
+ pendingFlows = new HashMap<Path, PushedFlow>();
//waitingPackets = Multimaps.synchronizedSetMultimap(
//HashMultimap.<Long, PacketToPush>create());
//waitingPackets = HashMultimap.create();
@@ -280,20 +315,35 @@
FlowPath flowPath, reverseFlowPath;
- Path pathspec = new Path(srcSwitchPort, dstSwitchPort);
+ Path pathspec = new Path(srcSwitchPort, dstSwitchPort,
+ srcMacAddress, dstMacAddress);
// TODO check concurrency
synchronized (lock) {
- Long existingFlowId = pendingFlows.get(pathspec);
+ PushedFlow existingFlow = pendingFlows.get(pathspec);
+ //Long existingFlowId = pendingFlows.get(pathspec);
- if (existingFlowId != null) {
+ if (existingFlow != null && !existingFlow.isExpired()) {
log.debug("Found existing flow {}",
- HexString.toHexString(existingFlowId));
+ HexString.toHexString(existingFlow.flowId));
OFPacketOut po = constructPacketOut(pi, sw);
- waitingPackets.put(existingFlowId, new PacketToPush(po, sw.getId()));
+
+ if (existingFlow.firstHopOutPort != OFPort.OFPP_NONE.getValue()) {
+ // Flow has been sent to the switches so it is safe to
+ // send a packet out now
+ sendPacketOut(sw, po, existingFlow.firstHopOutPort);
+ }
+ else {
+ // Flow has not yet been sent to switches so save the
+ // packet out for later
+ waitingPackets.put(existingFlow.flowId,
+ new PacketToPush(po, sw.getId()));
+ }
return;
}
+ //log.debug("Couldn't match {} in {}", pathspec, pendingFlows);
+
log.debug("Adding new flow between {} at {} and {} at {}",
new Object[]{srcMacAddress, srcSwitchPort, dstMacAddress, dstSwitchPort});
@@ -347,11 +397,14 @@
reverseFlowPath.setFlowId(reverseFlowId);
OFPacketOut po = constructPacketOut(pi, sw);
- Path reversePathSpec = new Path(dstSwitchPort, srcSwitchPort);
+ Path reversePathSpec = new Path(dstSwitchPort, srcSwitchPort,
+ dstMacAddress, srcMacAddress);
// Add to waiting lists
- pendingFlows.put(pathspec, flowId.value());
- pendingFlows.put(reversePathSpec, reverseFlowId.value());
+ //pendingFlows.put(pathspec, flowId.value());
+ //pendingFlows.put(reversePathSpec, reverseFlowId.value());
+ pendingFlows.put(pathspec, new PushedFlow(flowId.value()));
+ pendingFlows.put(reversePathSpec, new PushedFlow(reverseFlowId.value()));
waitingPackets.put(flowId.value(), new PacketToPush(po, sw.getId()));
}
@@ -416,33 +469,44 @@
}
private void flowInstalled(FlowPath installedFlowPath) {
- // TODO check concurrency
- // will need to sync and access both collections at once.
long flowId = installedFlowPath.flowId().value();
+ short outPort =
+ installedFlowPath.flowEntries().get(0).outPort().value();
+
+ MACAddress srcMacAddress = installedFlowPath.flowEntryMatch().srcMac();
+ MACAddress dstMacAddress = installedFlowPath.flowEntryMatch().dstMac();
+
Collection<PacketToPush> packets;
synchronized (lock) {
+ log.debug("Flow {} has been installed, sending queued packets",
+ installedFlowPath.flowId());
+
packets = waitingPackets.removeAll(flowId);
- //remove pending flows entry
- Path pathToRemove = new Path(installedFlowPath.dataPath().srcPort(),
- installedFlowPath.dataPath().dstPort());
- pendingFlows.remove(pathToRemove);
-
+ // remove pending flows entry
+ Path installedPath = new Path(installedFlowPath.dataPath().srcPort(),
+ installedFlowPath.dataPath().dstPort(),
+ srcMacAddress, dstMacAddress);
+ //pendingFlows.remove(pathToRemove);
+ PushedFlow existingFlow = pendingFlows.get(installedPath);
+ if (existingFlow != null)
+ existingFlow.firstHopOutPort = outPort;
}
for (PacketToPush packet : packets) {
IOFSwitch sw = floodlightProvider.getSwitches().get(packet.dpid);
- OFPacketOut po = packet.packet;
- short outPort =
- installedFlowPath.flowEntries().get(0).outPort().value();
- po.getActions().add(new OFActionOutput(outPort));
- po.setActionsLength((short)
- (po.getActionsLength() + OFActionOutput.MINIMUM_LENGTH));
- po.setLengthU(po.getLengthU() + OFActionOutput.MINIMUM_LENGTH);
-
- flowPusher.add(sw, po);
+ sendPacketOut(sw, packet.packet, outPort);
}
}
+
+ private void sendPacketOut(IOFSwitch sw, OFPacketOut po, short outPort) {
+ po.getActions().add(new OFActionOutput(outPort));
+ po.setActionsLength((short)
+ (po.getActionsLength() + OFActionOutput.MINIMUM_LENGTH));
+ po.setLengthU(po.getLengthU() + OFActionOutput.MINIMUM_LENGTH);
+
+ flowPusher.add(sw, po);
+ }
}
diff --git a/src/test/java/net/floodlightcontroller/util/MACAddressTest.java b/src/test/java/net/floodlightcontroller/util/MACAddressTest.java
index 5669614..f19eedb 100644
--- a/src/test/java/net/floodlightcontroller/util/MACAddressTest.java
+++ b/src/test/java/net/floodlightcontroller/util/MACAddressTest.java
@@ -18,7 +18,7 @@
address = MACAddress.valueOf("FF:FE:FD:10:20:30");
assertEquals(address,
MACAddress.valueOf(new byte[]{(byte) 0xFF, (byte) 0xFE, (byte) 0xFD, 0x10, 0x20, 0x30}));
- assertEquals("FF:FE:FD:10:20:30", address.toString());
+ assertEquals("ff:fe:fd:10:20:30", address.toString());
address = MACAddress.valueOf("00:11:22:aa:bb:cc");
assertEquals(address,
diff --git a/start-onos-embedded.sh b/start-onos-embedded.sh
index 6fc9362..0e9af68 100755
--- a/start-onos-embedded.sh
+++ b/start-onos-embedded.sh
@@ -36,6 +36,13 @@
if [ -z "${MVN}" ]; then
MVN="mvn"
fi
+
+if [ ! -f ${ONOS_HOME}/.javacp ]; then
+ ${MVN} -f ${ONOS_HOME}/pom.xml compile
+fi
+JAVA_CP=`cat ${ONOS_HOME}/.javacp`
+JAVA_CP="${JAVA_CP}:${ONOS_HOME}/target/classes"
+
#<logger name="net.floodlightcontroller.linkdiscovery.internal" level="TRACE"/>
#<appender-ref ref="STDOUT" />
@@ -96,8 +103,7 @@
# XXX MVN has to run at the project top dir..
cd ${ONOS_HOME}
- echo "${MVN} exec:exec -Dexec.executable=\"java\" -Dexec.args=\"${JVM_OPTS} -Dlogback.configurationFile=${ONOS_LOGBACK} -cp %classpath ${MAIN_CLASS} -cf ${ONOS_HOME}/conf/onos-embedded.properties\""
- ${MVN} exec:exec -Dexec.executable="java" -Dexec.args="${JVM_OPTS} -Dlogback.configurationFile=${ONOS_LOGBACK} -cp %classpath ${MAIN_CLASS} -cf ${ONOS_HOME}/conf/onos-embedded.properties" > ${LOGDIR}/onos.stdout 2>${LOGDIR}/onos.stderr &
+ java ${JVM_OPTS} -Dlogback.configurationFile=${ONOS_LOGBACK} -cp ${JAVA_CP} ${MAIN_CLASS} -cf ${ONOS_HOME}/conf/onos-embedded.properties > ${LOGDIR}/onos.`hostname`.stdout 2>${LOGDIR}/onos.`hostname`stderr &
echo "Waiting for ONOS to start..."
COUNT=0
@@ -160,6 +166,6 @@
echo "$n instance of onos running"
;;
*)
- echo "Usage: $0 {start|stop|restart|status|startifdown}"
+ echo "Usage: $0 {start|stop|status|startifdown}"
exit 1
esac
diff --git a/start-onos-jacoco.sh b/start-onos-jacoco.sh
index 2e04216..2d1adf4 100755
--- a/start-onos-jacoco.sh
+++ b/start-onos-jacoco.sh
@@ -43,6 +43,12 @@
MVN="mvn -o"
fi
+if [ ! -f ${ONOS_HOME}/.javacp ]; then
+ ${MVN} -f ${ONOS_HOME}/pom.xml compile
+fi
+JAVA_CP=`cat ${ONOS_HOME}/.javacp`
+JAVA_CP="${JAVA_CP}:${ONOS_HOME}/target/classes"
+
#<logger name="net.floodlightcontroller.linkdiscovery.internal" level="TRACE"/>
#<appender-ref ref="STDOUT" />
@@ -106,10 +112,7 @@
# XXX : MVN has to run at the project top dir
echo $ONOS_HOME
cd ${ONOS_HOME}
- pwd
- echo "${MVN} exec:exec -Dexec.executable=\"java\" -Dexec.args=\"${JVM_OPTS} -Dlogback.configurationFile=${ONOS_LOGBACK} -cp %classpath ${MAIN_CLASS} -cf ./conf/onos.properties\""
-
- ${MVN} exec:exec -Dexec.executable="java" -Dexec.args="${JVM_OPTS} -Dlogback.configurationFile=${ONOS_LOGBACK} -cp %classpath ${MAIN_CLASS} -cf ./conf/onos.properties" > ${LOGDIR}/onos.`hostname`.stdout 2>${LOGDIR}/onos.`hostname`.stderr &
+ java ${JVM_OPTS} -Dlogback.configurationFile=${ONOS_LOGBACK} -cp ${JAVA_CP} ${MAIN_CLASS} -cf ./conf/onos.properties > ${LOGDIR}/onos.`hostname`.stdout 2>${LOGDIR}/onos.`hostname`.stderr &
echo "Waiting for ONOS to start..."
COUNT=0
@@ -179,6 +182,6 @@
echo "$n instance of onos running"
;;
*)
- echo "Usage: $0 {start|stop|restart|status|startifdown}"
+ echo "Usage: $0 {start|stop|status|startifdown}"
exit 1
esac
diff --git a/start-onos.sh b/start-onos.sh
index 29a108c..1eb6831 100755
--- a/start-onos.sh
+++ b/start-onos.sh
@@ -1,21 +1,21 @@
#!/bin/bash
# Set paths
-if [ -z "${ONOS_HOME}" ]; then
- ONOS_HOME=`dirname $0`
-fi
+ONOS_HOME="${ONOS_HOME:-`dirname $0`}"
## Because the script change dir to $ONOS_HOME, we can set ONOS_LOGBACK and LOGDIR relative to $ONOS_HOME
-#ONOS_LOGBACK="${ONOS_HOME}/logback.`hostname`.xml"
-#LOGDIR=${ONOS_HOME}/onos-logs
-ONOS_LOGBACK="./logback.`hostname`.xml"
-LOGDIR=./onos-logs
+ONOS_LOGBACK=${ONOS_LOGBACK:-${ONOS_HOME}/logback.`hostname`.xml}
+LOGDIR=${ONOS_LOGDIR:-${ONOS_HOME}/onos-logs}
+
ONOS_LOG="${LOGDIR}/onos.`hostname`.log"
PCAP_LOG="${LOGDIR}/onos.`hostname`.pcap"
LOGS="$ONOS_LOG $PCAP_LOG"
+ONOS_PROPS=${ONOS_PROPS:-${ONOS_HOME}/conf/onos.properties}
+JMX_PORT=${JMX_PORT:-7189}
+
# Set JVM options
-JVM_OPTS=""
+JVM_OPTS="${JVM_OPTS:-}"
## If you want JaCoCo Code Coverage reports... uncomment line below
#JVM_OPTS="$JVM_OPTS -javaagent:${ONOS_HOME}/lib/jacocoagent.jar=dumponexit=true,output=file,destfile=${LOGDIR}/jacoco.exec"
JVM_OPTS="$JVM_OPTS -server -d64"
@@ -31,7 +31,7 @@
-XX:+UseThreadPriorities \
-XX:ThreadPriorityPolicy=42 \
-XX:+UseCompressedOops \
- -Dcom.sun.management.jmxremote.port=7189 \
+ -Dcom.sun.management.jmxremote.port=$JMX_PORT \
-Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.authenticate=false"
JVM_OPTS="$JVM_OPTS -Dhazelcast.logging.type=slf4j"
@@ -39,9 +39,13 @@
# Set ONOS core main class
MAIN_CLASS="net.onrc.onos.ofcontroller.core.Main"
-if [ -z "${MVN}" ]; then
- MVN="mvn -o"
+MVN=${MVN:-mvn -o}
+
+if [ ! -f ${ONOS_HOME}/.javacp ]; then
+ ${MVN} -f ${ONOS_HOME}/pom.xml compile
fi
+JAVA_CP=`cat ${ONOS_HOME}/.javacp`
+JAVA_CP="${JAVA_CP}:${ONOS_HOME}/target/classes"
#<logger name="net.floodlightcontroller.linkdiscovery.internal" level="TRACE"/>
#<appender-ref ref="STDOUT" />
@@ -101,15 +105,13 @@
# Run ONOS
echo "Starting ONOS controller ..."
- echo
+ echo
- # XXX : MVN has to run at the project top dir
+ # XXX : MVN has to run at the project top dir
echo $ONOS_HOME
cd ${ONOS_HOME}
- pwd
- echo "${MVN} exec:exec -Dexec.executable=\"java\" -Dexec.args=\"${JVM_OPTS} -Dlogback.configurationFile=${ONOS_LOGBACK} -cp %classpath ${MAIN_CLASS} -cf ./conf/onos.properties\""
-
- ${MVN} exec:exec -Dexec.executable="java" -Dexec.args="${JVM_OPTS} -Dlogback.configurationFile=${ONOS_LOGBACK} -cp %classpath ${MAIN_CLASS} -cf ./conf/onos.properties" > ${LOGDIR}/onos.`hostname`.stdout 2>${LOGDIR}/onos.`hostname`.stderr &
+ pwd
+ java ${JVM_OPTS} -Dlogback.configurationFile=${ONOS_LOGBACK} -cp ${JAVA_CP} ${MAIN_CLASS} -cf ${ONOS_PROPS} > ${LOGDIR}/onos.`hostname`.stdout 2>${LOGDIR}/onos.`hostname`.stderr &
echo "Waiting for ONOS to start..."
COUNT=0
@@ -161,13 +163,17 @@
start)
stop
check_db
- start
+ start
+ ;;
+ startnokill)
+ check_db
+ start
;;
startifdown)
n=`jps -l |grep "${MAIN_CLASS}" | wc -l`
if [ $n == 0 ]; then
start
- else
+ else
echo "$n instance of onos running"
fi
;;
@@ -179,6 +185,6 @@
echo "$n instance of onos running"
;;
*)
- echo "Usage: $0 {start|stop|restart|status|startifdown}"
+ echo "Usage: $0 {start|stop|status|startifdown}"
exit 1
esac
diff --git a/start-rest.sh b/start-rest.sh
index 01e7638..910eb41 100755
--- a/start-rest.sh
+++ b/start-rest.sh
@@ -73,6 +73,6 @@
status
;;
*)
- echo "Usage: $0 {start|stop|restart|status}"
+ echo "Usage: $0 {start|stop|status}"
exit 1
esac
diff --git a/titan/gremlin.sh b/titan/gremlin.sh
index 55354e3..a340dd7 100755
--- a/titan/gremlin.sh
+++ b/titan/gremlin.sh
@@ -6,11 +6,14 @@
BASE_DIR=`dirname $0`
ONOS_DIR="`dirname $0`/.."
-#CP=$( echo `dirname $0`/../lib/*.jar `dirname $0`/../lib/titan/*.jar . | sed 's/ /:/g')
-#CP=`${MVN} -f ${ONOS_DIR}/pom.xml dependency:build-classpath -Dmdep.outputFile=/dev/stdout -l /dev/stderr`
# Use a python script to parse the classpath out of the .classpath file
-CP=`${BASE_DIR}/../scripts/parse-classpath.py`
+if [ ! -f ${ONOS_DIR}/.javacp ]; then
+ echo "execute mvn compile at ONOS HOME directory."
+ exit 1
+fi
+CP=`cat ${ONOS_DIR}/.javacp`
+CP="${CP}:${ONOS_DIR}/target/classes"
if [[ "$CP" == *"Error reading classpath file"* ]]; then
echo $CP
diff --git a/vm-utils/onos.py b/vm-utils/onos.py
new file mode 100755
index 0000000..7756b59
--- /dev/null
+++ b/vm-utils/onos.py
@@ -0,0 +1,341 @@
+#!/usr/bin/env python
+
+"""
+onos.py: A basic (?) ONOS Controller() subclass for Mininet
+
+We implement the following classes:
+
+ONOSController: a custom Controller() subclass to start ONOS
+OVSSwitchONOS: a custom OVSSwitch() switch that connects to multiple controllers.
+
+We use single Zookeeper and Cassandra instances for now.
+
+As a custom file, exports:
+
+--controller onos
+--switch ovso
+
+Usage:
+
+$ sudo -E ./onos.py
+
+This will start up a simple 2-host, 2 ONOS network
+
+$ sudo -E mn --custom onos.py --controller onos,2 --switch ovso
+"""
+
+from mininet.node import Controller, OVSSwitch
+from mininet.net import Mininet
+from mininet.cli import CLI
+from mininet.topo import LinearTopo
+from mininet.log import setLogLevel, info, warn
+from mininet.util import quietRun
+
+# This should be cleaned up to avoid interfering with mn
+from shutil import copyfile
+from os import environ, path
+from functools import partial
+import time
+from sys import argv
+
+class ONOS( Controller ):
+ "Custom controller class for ONOS"
+
+ # Directories and configuration templates
+ home = environ[ 'HOME' ]
+ onosDir = home + "/ONOS"
+ zookeeperDir = home + "/zookeeper-3.4.5"
+ dirBase = '/tmp'
+ logDir = dirBase + '/onos-%s.logs'
+ # cassDir = dirBase + '/onos-%s.cassandra'
+ configFile = dirBase + '/onos-%s.properties'
+ logbackFile = dirBase + '/onos-%s.logback.xml'
+
+ # Base ONOS modules
+ baseModules = (
+ 'net.floodlightcontroller.core.FloodlightProvider',
+ 'net.floodlightcontroller.threadpool.ThreadPool',
+ 'net.onrc.onos.ofcontroller.floodlightlistener.NetworkGraphPublisher',
+ 'net.floodlightcontroller.ui.web.StaticWebRoutable',
+ 'net.onrc.onos.datagrid.HazelcastDatagrid',
+ 'net.onrc.onos.ofcontroller.flowmanager.FlowManager',
+ 'net.onrc.onos.ofcontroller.flowprogrammer.FlowProgrammer',
+ 'net.onrc.onos.ofcontroller.topology.TopologyManager',
+ 'net.onrc.onos.registry.controller.ZookeeperRegistry'
+ )
+
+ # Additions for reactive forwarding
+ reactiveModules = (
+ 'net.onrc.onos.ofcontroller.proxyarp.ProxyArpManager',
+ 'net.onrc.onos.ofcontroller.core.config.DefaultConfiguration',
+ 'net.onrc.onos.ofcontroller.forwarding.Forwarding'
+ )
+
+ # Module parameters
+ ofbase = 6633
+ restbase = 8080
+ jmxbase = 7189
+
+ fc = 'net.floodlightcontroller.'
+
+ # Things that vary per ONOS id
+ perNodeConfigBase = {
+ fc + 'core.FloodlightProvider.openflowport': ofbase,
+ fc + 'restserver.RestApiServer.port': restbase,
+ fc + 'core.FloodlightProvider.controllerid': 0
+ }
+
+ # Things that are static
+ staticConfig = {
+ 'net.onrc.onos.ofcontroller.floodlightlistener.NetworkGraphPublisher.dbconf':
+ '/tmp/cassandra.titan',
+ 'net.floodlightcontroller.core.FloodlightProvider.workerthreads': 16,
+ 'net.floodlightcontroller.forwarding.Forwarding.idletimeout': 5,
+ 'net.floodlightcontroller.forwarding.Forwarding.hardtimeout': 0
+ }
+
+ # Things that are based on onosDir
+ dirConfig = {
+ 'net.onrc.onos.datagrid.HazelcastDatagrid.datagridConfig':
+ '%s/conf/hazelcast.xml',
+ }
+
+ proctag = 'mn-onos-id'
+
+ # For maven debugging
+ # mvn = 'mvn -o -e -X'
+
+ def __init__( self, name, n=1, reactive=True, runAsRoot=False, **params):
+ """n: number of ONOS instances to run (1)
+ reactive: run in reactive mode (True)
+ runAsRoot: run ONOS as root (False)"""
+ self.check()
+ self.count = n
+ self.reactive = reactive
+ self.runAsRoot = runAsRoot
+ self.ids = range( 0, self.count )
+ Controller.__init__( self, name, **params )
+ # We don't need to run as root, and it can interfere
+ # with starting Zookeeper manually
+ self.user = None
+ if not self.runAsRoot:
+ try:
+ self.user = quietRun( 'who am i' ).split()[ 0 ]
+ self.sendCmd( 'su', self.user )
+ self.waiting = False
+ except:
+ warn( '__init__: failed to drop privileges\n' )
+ # Need to run commands from ONOS dir
+ self.cmd( 'cd', self.onosDir )
+ self.cmd( 'export PATH=$PATH:%s' % self.onosDir )
+ if hasattr( self, 'mvn' ):
+ self.cmd( 'export MVN="%s"' % self.mvn )
+
+ def check( self ):
+ "Set onosDir and check for ONOS prerequisites"
+ if not quietRun( 'which java' ):
+ raise Exception( 'java not found -'
+ ' make sure it is installed and in $PATH' )
+ if not quietRun( 'which mvn' ):
+ raise Exception( 'Maven (mvn) not found -'
+ ' make sure it is installed and in $PATH' )
+ if 'ONOS_HOME' in environ:
+ self.onosDir = environ[ 'ONOS_HOME' ]
+ else:
+ warn( '* $ONOS_HOME is not set - assuming %s\n' % self.onosDir )
+ for script in 'start-zk.sh', 'start-cassandra.sh', 'start-onos.sh':
+ script = path.join( self.onosDir, script )
+ if not path.exists( script ):
+ msg = '%s not found' % script
+ if 'ONOS_HOME' not in environ:
+ msg += ' (try setting $ONOS_HOME and/or sudo -E)'
+ raise Exception( msg )
+
+ def waitNetstat( self, pid ):
+ """Wait for pid to show up in netstat
+ We assume that once a process is listening on some
+ port, it is ready to go!"""
+ while True:
+ output = self.cmd( 'sudo netstat -natp | grep %s/' % pid )
+ if output:
+ return output
+ info( '.' )
+ time.sleep( 1 )
+
+ def waitStart( self, procname, pattern ):
+ "Wait for at least one of procname to show up in netstat"
+ # Check script exit code
+ exitCode = int( self.cmd( 'echo $?' ) )
+ if exitCode != 0:
+ raise Exception( '%s startup failed with code %d' %
+ ( procname, exitCode ) )
+ info( '* Waiting for %s startup' % procname )
+ result = self.cmd( 'pgrep -f %s' % pattern ).split()[ 0 ]
+ pid = int( result )
+ output = self.waitNetstat( pid )
+ info( '\n* %s process %d is listening\n' % ( procname, pid ) )
+ info( output )
+
+ def startCassandra( self ):
+ "Start Cassandra"
+ self.cmd( 'start-cassandra.sh start' )
+ self.waitStart( 'Cassandra', 'apache-cassandra' )
+ status = self.cmd( 'start-cassandra.sh status' )
+ if 'running' not in status:
+ raise Exception( 'Cassandra startup failed: ' + status )
+
+ def stopCassandra( self ):
+ "Stop Cassandra"
+ self.cmd( 'start-cassandra.sh stop' )
+
+ def startZookeeper( self, initcfg=True ):
+ "Start Zookeeper"
+ # Reinitialize configuration file
+ if initcfg:
+ cfg = self.zookeeperDir + '/conf/zoo.cfg'
+ template = self.zookeeperDir + '/conf/zoo_sample.cfg'
+ copyfile( template, cfg )
+ self.cmd( 'start-zk.sh restart' )
+ self.waitStart( 'Zookeeper', 'zookeeper' )
+ status = self.cmd( 'start-zk.sh status' )
+ if 'Error' in status:
+ raise Exception( 'Zookeeper startup failed: ' + status )
+
+ def stopZookeeper( self ):
+ "Stop Zookeeper"
+ self.cmd( 'start-zk.sh stop' )
+
+ def genProperties( self, id, path='/tmp' ):
+ "Generate ONOS properties file"
+ filename = path + '/onos-%s.properties' % id
+ with open( filename, 'w' ) as f:
+ # Write modules list
+ modules = list( self.baseModules )
+ if self.reactive:
+ modules += list( self.reactiveModules )
+ f.write( 'floodlight.modules = %s\n' %
+ ',\\\n'.join( modules ) )
+ # Write other parameters
+ for var, val in self.perNodeConfigBase.iteritems():
+ if type( val ) is int:
+ val += id
+ f.write( '%s = %s\n' % ( var, val ) )
+ for var, val in self.staticConfig.iteritems():
+ f.write( '%s = %s\n' % ( var, val ) )
+ for var, val in self.dirConfig.iteritems():
+ f.write( '%s = %s\n' % ( var, val % self.onosDir) )
+ return filename
+
+ def setVars( self, id, propsFile ):
+ """Set and return environment vars
+ id: ONOS instance number
+ propsFile: properties file name"""
+ # ONOS directories and files
+ logdir = self.logDir % id
+ # cassdir = self.cassDir % id
+ logback = self.logbackFile % id
+ jmxport = self.jmxbase + id
+ self.cmd( 'mkdir -p', logdir ) # , cassdir
+ self.cmd( 'export ONOS_LOGDIR="%s"' % logdir )
+ self.cmd( 'export ZOO_LOG_DIR="%s"' % logdir )
+ # self.cmd( 'export CASS_DIR="%s"' % cassdir )
+ self.cmd( 'export ONOS_LOGBACK="%s"' % logback )
+ self.cmd( 'export JMX_PORT=%s' % jmxport )
+ self.cmd( 'export JVM_OPTS="-D%s=%s"' % (
+ self.proctag, id ) )
+ self.cmd( 'export ONOS_PROPS="%s"' % propsFile )
+
+ def startONOS( self, id ):
+ """Start ONOS
+ id: new instance number"""
+ start = time.time()
+ self.stopONOS( id )
+ propsFile = self.genProperties( id )
+ self.setVars( id, propsFile )
+ self.cmdPrint( 'start-onos.sh startnokill' )
+ # start-onos.sh waits for ONOS startup
+ elapsed = time.time() - start
+ info( '* ONOS %s started in %.2f seconds\n' % ( id, elapsed ) )
+
+ def stopONOS( self, id ):
+ """Shut down ONOS
+ id: identifier for instance"""
+ pid = self.cmd( "jps -v | grep %s=%s | awk '{print $1}'" %
+ ( self.proctag, id ) ).strip()
+ if pid:
+ self.cmdPrint( 'kill', pid )
+
+ def start( self, *args ):
+ "Start ONOS instances"
+ info( '* Starting Cassandra\n' )
+ self.startCassandra()
+ info( '* Starting Zookeeper\n' )
+ self.startZookeeper()
+ for id in self.ids:
+ info( '* Starting ONOS %s\n' % id )
+ self.startONOS( id )
+
+ def stop( self, *args ):
+ "Stop ONOS instances"
+ for id in self.ids:
+ info( '* Stopping ONOS %s\n' % id )
+ self.stopONOS( id )
+ info( '* Stopping Zookeeper\n' )
+ self.stopZookeeper()
+ info( '* Stopping Cassandra\n' )
+ self.stopCassandra()
+
+ def clist( self ):
+ "Return list of controller specifiers (proto:ip:port)"
+ return [ 'tcp:127.0.0.1:%s' % ( self.ofbase + id )
+ for id in range( 0, self.count ) ]
+
+
+class OVSSwitchONOS( OVSSwitch ):
+ "OVS switch which connects to multiple controllers"
+ def start( self, controllers ):
+ OVSSwitch.start( self, controllers )
+ assert len( controllers ) == 1
+ c0 = controllers[ 0 ]
+ assert type( c0 ) == ONOS
+ clist = ','.join( c0.clist() )
+ self.cmd( 'ovs-vsctl set-controller', self, clist)
+ # Reconnect quickly to controllers (1s vs. 15s max_backoff)
+ for uuid in self.controllerUUIDs():
+ if uuid.count( '-' ) != 4:
+ # Doesn't look like a UUID
+ continue
+ uuid = uuid.strip()
+ self.cmd( 'ovs-vsctl set Controller', uuid,
+ 'max_backoff=1000' )
+
+
+def waitConnected( switches ):
+ "Wait until all switches connect to controllers"
+ start = time.time()
+ info( '* Waiting for switches to connect...\n' )
+ for s in switches:
+ info( s )
+ while not s.connected():
+ info( '.' )
+ time.sleep( 1 )
+ info( ' ' )
+ elapsed = time.time() - start
+ info( '\n* Connected in %.2f seconds\n' % elapsed )
+
+
+controllers = { 'onos': ONOS }
+switches = { 'ovso': OVSSwitchONOS }
+
+
+if __name__ == '__main__':
+ # Simple test for ONOS() controller class
+ setLogLevel( 'info' )
+ size = 2 if len( argv ) != 2 else int( argv[ 1 ] )
+ net = Mininet( topo=LinearTopo( size ),
+ controller=partial( ONOS, n=2 ),
+ switch=OVSSwitchONOS )
+ net.start()
+ waitConnected( net.switches )
+ CLI( net )
+ net.stop()
diff --git a/web/flowdef_demo_add.txt b/web/flowdef_demo_add.txt
index 7ef2fbb..600cd4e 100644
--- a/web/flowdef_demo_add.txt
+++ b/web/flowdef_demo_add.txt
@@ -1,61 +1,108 @@
-# Demo flow scale down
-201 ps_101_1 00:00:00:00:00:00:05:01 1 00:00:00:00:00:00:02:01 1 matchSrcMac 00:00:c0:a8:05:01 matchDstMac 00:00:c0:a8:02:01
-202 ps_101_2 00:00:00:00:00:00:02:01 1 00:00:00:00:00:00:05:01 1 matchSrcMac 00:00:c0:a8:02:01 matchDstMac 00:00:c0:a8:05:01
-203 ps_102_1 00:00:00:00:00:00:05:02 1 00:00:00:00:00:00:02:02 1 matchSrcMac 00:00:c0:a8:05:02 matchDstMac 00:00:c0:a8:02:02
-204 ps_102_2 00:00:00:00:00:00:02:02 1 00:00:00:00:00:00:05:02 1 matchSrcMac 00:00:c0:a8:02:02 matchDstMac 00:00:c0:a8:05:02
-205 ps_103_1 00:00:00:00:00:00:05:03 1 00:00:00:00:00:00:02:03 1 matchSrcMac 00:00:c0:a8:05:03 matchDstMac 00:00:c0:a8:02:03
-206 ps_103_2 00:00:00:00:00:00:02:03 1 00:00:00:00:00:00:05:03 1 matchSrcMac 00:00:c0:a8:02:03 matchDstMac 00:00:c0:a8:05:03
-207 ps_104_1 00:00:00:00:00:00:05:01 1 00:00:00:00:00:00:03:01 1 matchSrcMac 00:00:c0:a8:05:01 matchDstMac 00:00:c0:a8:03:01
-208 ps_104_2 00:00:00:00:00:00:03:01 1 00:00:00:00:00:00:05:01 1 matchSrcMac 00:00:c0:a8:03:01 matchDstMac 00:00:c0:a8:05:01
-209 ps_105_1 00:00:00:00:00:00:05:02 1 00:00:00:00:00:00:03:02 1 matchSrcMac 00:00:c0:a8:05:02 matchDstMac 00:00:c0:a8:03:02
-210 ps_105_2 00:00:00:00:00:00:03:02 1 00:00:00:00:00:00:05:02 1 matchSrcMac 00:00:c0:a8:03:02 matchDstMac 00:00:c0:a8:05:02
-211 ps_106_1 00:00:00:00:00:00:05:03 1 00:00:00:00:00:00:03:03 1 matchSrcMac 00:00:c0:a8:05:03 matchDstMac 00:00:c0:a8:03:03
-212 ps_106_2 00:00:00:00:00:00:03:03 1 00:00:00:00:00:00:05:03 1 matchSrcMac 00:00:c0:a8:03:03 matchDstMac 00:00:c0:a8:05:03
-213 ps_107_1 00:00:00:00:00:00:05:01 1 00:00:00:00:00:00:04:01 1 matchSrcMac 00:00:c0:a8:05:01 matchDstMac 00:00:c0:a8:04:01
-214 ps_107_2 00:00:00:00:00:00:04:01 1 00:00:00:00:00:00:05:01 1 matchSrcMac 00:00:c0:a8:04:01 matchDstMac 00:00:c0:a8:05:01
-215 ps_108_1 00:00:00:00:00:00:05:02 1 00:00:00:00:00:00:04:02 1 matchSrcMac 00:00:c0:a8:05:02 matchDstMac 00:00:c0:a8:04:02
-216 ps_108_2 00:00:00:00:00:00:04:02 1 00:00:00:00:00:00:05:02 1 matchSrcMac 00:00:c0:a8:04:02 matchDstMac 00:00:c0:a8:05:02
-217 ps_109_1 00:00:00:00:00:00:05:03 1 00:00:00:00:00:00:04:03 1 matchSrcMac 00:00:c0:a8:05:03 matchDstMac 00:00:c0:a8:04:03
-218 ps_109_2 00:00:00:00:00:00:04:03 1 00:00:00:00:00:00:05:03 1 matchSrcMac 00:00:c0:a8:04:03 matchDstMac 00:00:c0:a8:05:03
-219 ps_110_1 00:00:00:00:00:00:05:01 1 00:00:00:00:00:00:06:01 1 matchSrcMac 00:00:c0:a8:05:01 matchDstMac 00:00:c0:a8:06:01
-220 ps_110_2 00:00:00:00:00:00:06:01 1 00:00:00:00:00:00:05:01 1 matchSrcMac 00:00:c0:a8:06:01 matchDstMac 00:00:c0:a8:05:01
-221 ps_111_1 00:00:00:00:00:00:05:02 1 00:00:00:00:00:00:06:02 1 matchSrcMac 00:00:c0:a8:05:02 matchDstMac 00:00:c0:a8:06:02
-222 ps_111_2 00:00:00:00:00:00:06:02 1 00:00:00:00:00:00:05:02 1 matchSrcMac 00:00:c0:a8:06:02 matchDstMac 00:00:c0:a8:05:02
-223 ps_112_1 00:00:00:00:00:00:05:03 1 00:00:00:00:00:00:06:03 1 matchSrcMac 00:00:c0:a8:05:03 matchDstMac 00:00:c0:a8:06:03
-224 ps_112_2 00:00:00:00:00:00:06:03 1 00:00:00:00:00:00:05:03 1 matchSrcMac 00:00:c0:a8:06:03 matchDstMac 00:00:c0:a8:05:03
-225 ps_113_1 00:00:00:00:00:00:05:01 1 00:00:00:00:00:00:08:01 1 matchSrcMac 00:00:c0:a8:05:01 matchDstMac 00:00:c0:a8:08:01
-226 ps_113_2 00:00:00:00:00:00:08:01 1 00:00:00:00:00:00:05:01 1 matchSrcMac 00:00:c0:a8:08:01 matchDstMac 00:00:c0:a8:05:01
-227 ps_114_1 00:00:00:00:00:00:05:02 1 00:00:00:00:00:00:08:02 1 matchSrcMac 00:00:c0:a8:05:02 matchDstMac 00:00:c0:a8:08:02
-228 ps_114_2 00:00:00:00:00:00:08:02 1 00:00:00:00:00:00:05:02 1 matchSrcMac 00:00:c0:a8:08:02 matchDstMac 00:00:c0:a8:05:02
-229 ps_115_1 00:00:00:00:00:00:05:03 1 00:00:00:00:00:00:08:03 1 matchSrcMac 00:00:c0:a8:05:03 matchDstMac 00:00:c0:a8:08:03
-230 ps_115_2 00:00:00:00:00:00:08:03 1 00:00:00:00:00:00:05:03 1 matchSrcMac 00:00:c0:a8:08:03 matchDstMac 00:00:c0:a8:05:03
-231 ps_116_1 00:00:00:00:00:00:07:01 1 00:00:00:00:00:00:02:01 1 matchSrcMac 00:00:c0:a8:07:01 matchDstMac 00:00:c0:a8:02:01
-232 ps_116_2 00:00:00:00:00:00:02:01 1 00:00:00:00:00:00:07:01 1 matchSrcMac 00:00:c0:a8:02:01 matchDstMac 00:00:c0:a8:07:01
-233 ps_117_1 00:00:00:00:00:00:07:02 1 00:00:00:00:00:00:02:02 1 matchSrcMac 00:00:c0:a8:07:02 matchDstMac 00:00:c0:a8:02:02
-234 ps_117_2 00:00:00:00:00:00:02:02 1 00:00:00:00:00:00:07:02 1 matchSrcMac 00:00:c0:a8:02:02 matchDstMac 00:00:c0:a8:07:02
-235 ps_118_1 00:00:00:00:00:00:07:03 1 00:00:00:00:00:00:02:03 1 matchSrcMac 00:00:c0:a8:07:03 matchDstMac 00:00:c0:a8:02:03
-236 ps_118_2 00:00:00:00:00:00:02:03 1 00:00:00:00:00:00:07:03 1 matchSrcMac 00:00:c0:a8:02:03 matchDstMac 00:00:c0:a8:07:03
-237 ps_119_1 00:00:00:00:00:00:07:01 1 00:00:00:00:00:00:03:01 1 matchSrcMac 00:00:c0:a8:07:01 matchDstMac 00:00:c0:a8:03:01
-238 ps_119_2 00:00:00:00:00:00:03:01 1 00:00:00:00:00:00:07:01 1 matchSrcMac 00:00:c0:a8:03:01 matchDstMac 00:00:c0:a8:07:01
-239 ps_120_1 00:00:00:00:00:00:07:02 1 00:00:00:00:00:00:03:02 1 matchSrcMac 00:00:c0:a8:07:02 matchDstMac 00:00:c0:a8:03:02
-240 ps_120_2 00:00:00:00:00:00:03:02 1 00:00:00:00:00:00:07:02 1 matchSrcMac 00:00:c0:a8:03:02 matchDstMac 00:00:c0:a8:07:02
-241 ps_121_1 00:00:00:00:00:00:07:03 1 00:00:00:00:00:00:03:03 1 matchSrcMac 00:00:c0:a8:07:03 matchDstMac 00:00:c0:a8:03:03
-242 ps_121_2 00:00:00:00:00:00:03:03 1 00:00:00:00:00:00:07:03 1 matchSrcMac 00:00:c0:a8:03:03 matchDstMac 00:00:c0:a8:07:03
-243 ps_122_1 00:00:00:00:00:00:07:01 1 00:00:00:00:00:00:04:01 1 matchSrcMac 00:00:c0:a8:07:01 matchDstMac 00:00:c0:a8:04:01
-244 ps_122_2 00:00:00:00:00:00:04:01 1 00:00:00:00:00:00:07:01 1 matchSrcMac 00:00:c0:a8:04:01 matchDstMac 00:00:c0:a8:07:01
-245 ps_123_1 00:00:00:00:00:00:07:02 1 00:00:00:00:00:00:04:02 1 matchSrcMac 00:00:c0:a8:07:02 matchDstMac 00:00:c0:a8:04:02
-246 ps_123_2 00:00:00:00:00:00:04:02 1 00:00:00:00:00:00:07:02 1 matchSrcMac 00:00:c0:a8:04:02 matchDstMac 00:00:c0:a8:07:02
-247 ps_124_1 00:00:00:00:00:00:07:03 1 00:00:00:00:00:00:04:03 1 matchSrcMac 00:00:c0:a8:07:03 matchDstMac 00:00:c0:a8:04:03
-248 ps_124_2 00:00:00:00:00:00:04:03 1 00:00:00:00:00:00:07:03 1 matchSrcMac 00:00:c0:a8:04:03 matchDstMac 00:00:c0:a8:07:03
-249 ps_125_1 00:00:00:00:00:00:07:01 1 00:00:00:00:00:00:06:01 1 matchSrcMac 00:00:c0:a8:07:01 matchDstMac 00:00:c0:a8:06:01
-250 ps_125_2 00:00:00:00:00:00:06:01 1 00:00:00:00:00:00:07:01 1 matchSrcMac 00:00:c0:a8:06:01 matchDstMac 00:00:c0:a8:07:01
-251 ps_126_1 00:00:00:00:00:00:07:02 1 00:00:00:00:00:00:06:02 1 matchSrcMac 00:00:c0:a8:07:02 matchDstMac 00:00:c0:a8:06:02
-252 ps_126_2 00:00:00:00:00:00:06:02 1 00:00:00:00:00:00:07:02 1 matchSrcMac 00:00:c0:a8:06:02 matchDstMac 00:00:c0:a8:07:02
-253 ps_127_1 00:00:00:00:00:00:07:03 1 00:00:00:00:00:00:06:03 1 matchSrcMac 00:00:c0:a8:07:03 matchDstMac 00:00:c0:a8:06:03
-254 ps_127_2 00:00:00:00:00:00:06:03 1 00:00:00:00:00:00:07:03 1 matchSrcMac 00:00:c0:a8:06:03 matchDstMac 00:00:c0:a8:07:03
-255 ps_128_1 00:00:00:00:00:00:07:01 1 00:00:00:00:00:00:08:01 1 matchSrcMac 00:00:c0:a8:07:01 matchDstMac 00:00:c0:a8:08:01
-256 ps_128_2 00:00:00:00:00:00:08:01 1 00:00:00:00:00:00:07:01 1 matchSrcMac 00:00:c0:a8:08:01 matchDstMac 00:00:c0:a8:07:01
-257 ps_129_1 00:00:00:00:00:00:07:02 1 00:00:00:00:00:00:08:02 1 matchSrcMac 00:00:c0:a8:07:02 matchDstMac 00:00:c0:a8:08:02
-258 ps_129_2 00:00:00:00:00:00:08:02 1 00:00:00:00:00:00:07:02 1 matchSrcMac 00:00:c0:a8:08:02 matchDstMac 00:00:c0:a8:07:02
-259 ps_130_1 00:00:00:00:00:00:07:03 1 00:00:00:00:00:00:08:03 1 matchSrcMac 00:00:c0:a8:07:03 matchDstMac 00:00:c0:a8:08:03
-260 ps_130_2 00:00:00:00:00:00:08:03 1 00:00:00:00:00:00:07:03 1 matchSrcMac 00:00:c0:a8:08:03 matchDstMac 00:00:c0:a8:07:03
+145 ps_73_1 00:00:00:00:00:00:05:02 1 00:00:00:00:00:00:06:02 1 matchSrcMac 00:00:c0:a8:05:02 matchDstMac 00:00:c0:a8:06:02
+146 ps_73_2 00:00:00:00:00:00:06:02 1 00:00:00:00:00:00:05:02 1 matchSrcMac 00:00:c0:a8:06:02 matchDstMac 00:00:c0:a8:05:02
+147 ps_74_1 00:00:00:00:00:00:05:03 1 00:00:00:00:00:00:06:03 1 matchSrcMac 00:00:c0:a8:05:03 matchDstMac 00:00:c0:a8:06:03
+148 ps_74_2 00:00:00:00:00:00:06:03 1 00:00:00:00:00:00:05:03 1 matchSrcMac 00:00:c0:a8:06:03 matchDstMac 00:00:c0:a8:05:03
+149 ps_75_1 00:00:00:00:00:00:05:04 1 00:00:00:00:00:00:06:04 1 matchSrcMac 00:00:c0:a8:05:04 matchDstMac 00:00:c0:a8:06:04
+150 ps_75_2 00:00:00:00:00:00:06:04 1 00:00:00:00:00:00:05:04 1 matchSrcMac 00:00:c0:a8:06:04 matchDstMac 00:00:c0:a8:05:04
+151 ps_76_1 00:00:00:00:00:00:05:05 1 00:00:00:00:00:00:06:05 1 matchSrcMac 00:00:c0:a8:05:05 matchDstMac 00:00:c0:a8:06:05
+152 ps_76_2 00:00:00:00:00:00:06:05 1 00:00:00:00:00:00:05:05 1 matchSrcMac 00:00:c0:a8:06:05 matchDstMac 00:00:c0:a8:05:05
+153 ps_77_1 00:00:00:00:00:00:05:06 1 00:00:00:00:00:00:06:06 1 matchSrcMac 00:00:c0:a8:05:06 matchDstMac 00:00:c0:a8:06:06
+154 ps_77_2 00:00:00:00:00:00:06:06 1 00:00:00:00:00:00:05:06 1 matchSrcMac 00:00:c0:a8:06:06 matchDstMac 00:00:c0:a8:05:06
+155 ps_78_1 00:00:00:00:00:00:05:07 1 00:00:00:00:00:00:06:07 1 matchSrcMac 00:00:c0:a8:05:07 matchDstMac 00:00:c0:a8:06:07
+156 ps_78_2 00:00:00:00:00:00:06:07 1 00:00:00:00:00:00:05:07 1 matchSrcMac 00:00:c0:a8:06:07 matchDstMac 00:00:c0:a8:05:07
+157 ps_79_1 00:00:00:00:00:00:05:08 1 00:00:00:00:00:00:06:08 1 matchSrcMac 00:00:c0:a8:05:08 matchDstMac 00:00:c0:a8:06:08
+158 ps_79_2 00:00:00:00:00:00:06:08 1 00:00:00:00:00:00:05:08 1 matchSrcMac 00:00:c0:a8:06:08 matchDstMac 00:00:c0:a8:05:08
+159 ps_80_1 00:00:00:00:00:00:05:09 1 00:00:00:00:00:00:06:09 1 matchSrcMac 00:00:c0:a8:05:09 matchDstMac 00:00:c0:a8:06:09
+160 ps_80_2 00:00:00:00:00:00:06:09 1 00:00:00:00:00:00:05:09 1 matchSrcMac 00:00:c0:a8:06:09 matchDstMac 00:00:c0:a8:05:09
+161 ps_81_1 00:00:00:00:00:00:05:0a 1 00:00:00:00:00:00:06:0a 1 matchSrcMac 00:00:c0:a8:05:0a matchDstMac 00:00:c0:a8:06:0a
+162 ps_81_2 00:00:00:00:00:00:06:0a 1 00:00:00:00:00:00:05:0a 1 matchSrcMac 00:00:c0:a8:06:0a matchDstMac 00:00:c0:a8:05:0a
+163 ps_82_1 00:00:00:00:00:00:05:02 1 00:00:00:00:00:00:07:02 1 matchSrcMac 00:00:c0:a8:05:02 matchDstMac 00:00:c0:a8:07:02
+164 ps_82_2 00:00:00:00:00:00:07:02 1 00:00:00:00:00:00:05:02 1 matchSrcMac 00:00:c0:a8:07:02 matchDstMac 00:00:c0:a8:05:02
+165 ps_83_1 00:00:00:00:00:00:05:03 1 00:00:00:00:00:00:07:03 1 matchSrcMac 00:00:c0:a8:05:03 matchDstMac 00:00:c0:a8:07:03
+166 ps_83_2 00:00:00:00:00:00:07:03 1 00:00:00:00:00:00:05:03 1 matchSrcMac 00:00:c0:a8:07:03 matchDstMac 00:00:c0:a8:05:03
+167 ps_84_1 00:00:00:00:00:00:05:04 1 00:00:00:00:00:00:07:04 1 matchSrcMac 00:00:c0:a8:05:04 matchDstMac 00:00:c0:a8:07:04
+168 ps_84_2 00:00:00:00:00:00:07:04 1 00:00:00:00:00:00:05:04 1 matchSrcMac 00:00:c0:a8:07:04 matchDstMac 00:00:c0:a8:05:04
+169 ps_85_1 00:00:00:00:00:00:05:05 1 00:00:00:00:00:00:07:05 1 matchSrcMac 00:00:c0:a8:05:05 matchDstMac 00:00:c0:a8:07:05
+170 ps_85_2 00:00:00:00:00:00:07:05 1 00:00:00:00:00:00:05:05 1 matchSrcMac 00:00:c0:a8:07:05 matchDstMac 00:00:c0:a8:05:05
+171 ps_86_1 00:00:00:00:00:00:05:06 1 00:00:00:00:00:00:07:06 1 matchSrcMac 00:00:c0:a8:05:06 matchDstMac 00:00:c0:a8:07:06
+172 ps_86_2 00:00:00:00:00:00:07:06 1 00:00:00:00:00:00:05:06 1 matchSrcMac 00:00:c0:a8:07:06 matchDstMac 00:00:c0:a8:05:06
+173 ps_87_1 00:00:00:00:00:00:05:07 1 00:00:00:00:00:00:07:07 1 matchSrcMac 00:00:c0:a8:05:07 matchDstMac 00:00:c0:a8:07:07
+174 ps_87_2 00:00:00:00:00:00:07:07 1 00:00:00:00:00:00:05:07 1 matchSrcMac 00:00:c0:a8:07:07 matchDstMac 00:00:c0:a8:05:07
+175 ps_88_1 00:00:00:00:00:00:05:08 1 00:00:00:00:00:00:07:08 1 matchSrcMac 00:00:c0:a8:05:08 matchDstMac 00:00:c0:a8:07:08
+176 ps_88_2 00:00:00:00:00:00:07:08 1 00:00:00:00:00:00:05:08 1 matchSrcMac 00:00:c0:a8:07:08 matchDstMac 00:00:c0:a8:05:08
+177 ps_89_1 00:00:00:00:00:00:05:09 1 00:00:00:00:00:00:07:09 1 matchSrcMac 00:00:c0:a8:05:09 matchDstMac 00:00:c0:a8:07:09
+178 ps_89_2 00:00:00:00:00:00:07:09 1 00:00:00:00:00:00:05:09 1 matchSrcMac 00:00:c0:a8:07:09 matchDstMac 00:00:c0:a8:05:09
+179 ps_90_1 00:00:00:00:00:00:05:0a 1 00:00:00:00:00:00:07:0a 1 matchSrcMac 00:00:c0:a8:05:0a matchDstMac 00:00:c0:a8:07:0a
+180 ps_90_2 00:00:00:00:00:00:07:0a 1 00:00:00:00:00:00:05:0a 1 matchSrcMac 00:00:c0:a8:07:0a matchDstMac 00:00:c0:a8:05:0a
+181 ps_91_1 00:00:00:00:00:00:05:02 1 00:00:00:00:00:00:08:02 1 matchSrcMac 00:00:c0:a8:05:02 matchDstMac 00:00:c0:a8:08:02
+182 ps_91_2 00:00:00:00:00:00:08:02 1 00:00:00:00:00:00:05:02 1 matchSrcMac 00:00:c0:a8:08:02 matchDstMac 00:00:c0:a8:05:02
+183 ps_92_1 00:00:00:00:00:00:05:03 1 00:00:00:00:00:00:08:03 1 matchSrcMac 00:00:c0:a8:05:03 matchDstMac 00:00:c0:a8:08:03
+184 ps_92_2 00:00:00:00:00:00:08:03 1 00:00:00:00:00:00:05:03 1 matchSrcMac 00:00:c0:a8:08:03 matchDstMac 00:00:c0:a8:05:03
+185 ps_93_1 00:00:00:00:00:00:05:04 1 00:00:00:00:00:00:08:04 1 matchSrcMac 00:00:c0:a8:05:04 matchDstMac 00:00:c0:a8:08:04
+186 ps_93_2 00:00:00:00:00:00:08:04 1 00:00:00:00:00:00:05:04 1 matchSrcMac 00:00:c0:a8:08:04 matchDstMac 00:00:c0:a8:05:04
+187 ps_94_1 00:00:00:00:00:00:05:05 1 00:00:00:00:00:00:08:05 1 matchSrcMac 00:00:c0:a8:05:05 matchDstMac 00:00:c0:a8:08:05
+188 ps_94_2 00:00:00:00:00:00:08:05 1 00:00:00:00:00:00:05:05 1 matchSrcMac 00:00:c0:a8:08:05 matchDstMac 00:00:c0:a8:05:05
+189 ps_95_1 00:00:00:00:00:00:05:06 1 00:00:00:00:00:00:08:06 1 matchSrcMac 00:00:c0:a8:05:06 matchDstMac 00:00:c0:a8:08:06
+190 ps_95_2 00:00:00:00:00:00:08:06 1 00:00:00:00:00:00:05:06 1 matchSrcMac 00:00:c0:a8:08:06 matchDstMac 00:00:c0:a8:05:06
+191 ps_96_1 00:00:00:00:00:00:05:07 1 00:00:00:00:00:00:08:07 1 matchSrcMac 00:00:c0:a8:05:07 matchDstMac 00:00:c0:a8:08:07
+192 ps_96_2 00:00:00:00:00:00:08:07 1 00:00:00:00:00:00:05:07 1 matchSrcMac 00:00:c0:a8:08:07 matchDstMac 00:00:c0:a8:05:07
+193 ps_97_1 00:00:00:00:00:00:05:08 1 00:00:00:00:00:00:08:08 1 matchSrcMac 00:00:c0:a8:05:08 matchDstMac 00:00:c0:a8:08:08
+194 ps_97_2 00:00:00:00:00:00:08:08 1 00:00:00:00:00:00:05:08 1 matchSrcMac 00:00:c0:a8:08:08 matchDstMac 00:00:c0:a8:05:08
+195 ps_98_1 00:00:00:00:00:00:05:09 1 00:00:00:00:00:00:08:09 1 matchSrcMac 00:00:c0:a8:05:09 matchDstMac 00:00:c0:a8:08:09
+196 ps_98_2 00:00:00:00:00:00:08:09 1 00:00:00:00:00:00:05:09 1 matchSrcMac 00:00:c0:a8:08:09 matchDstMac 00:00:c0:a8:05:09
+197 ps_99_1 00:00:00:00:00:00:05:0a 1 00:00:00:00:00:00:08:0a 1 matchSrcMac 00:00:c0:a8:05:0a matchDstMac 00:00:c0:a8:08:0a
+198 ps_99_2 00:00:00:00:00:00:08:0a 1 00:00:00:00:00:00:05:0a 1 matchSrcMac 00:00:c0:a8:08:0a matchDstMac 00:00:c0:a8:05:0a
+199 ps_100_1 00:00:00:00:00:00:06:02 1 00:00:00:00:00:00:07:02 1 matchSrcMac 00:00:c0:a8:06:02 matchDstMac 00:00:c0:a8:07:02
+200 ps_100_2 00:00:00:00:00:00:07:02 1 00:00:00:00:00:00:06:02 1 matchSrcMac 00:00:c0:a8:07:02 matchDstMac 00:00:c0:a8:06:02
+201 ps_101_1 00:00:00:00:00:00:06:03 1 00:00:00:00:00:00:07:03 1 matchSrcMac 00:00:c0:a8:06:03 matchDstMac 00:00:c0:a8:07:03
+202 ps_101_2 00:00:00:00:00:00:07:03 1 00:00:00:00:00:00:06:03 1 matchSrcMac 00:00:c0:a8:07:03 matchDstMac 00:00:c0:a8:06:03
+203 ps_102_1 00:00:00:00:00:00:06:04 1 00:00:00:00:00:00:07:04 1 matchSrcMac 00:00:c0:a8:06:04 matchDstMac 00:00:c0:a8:07:04
+204 ps_102_2 00:00:00:00:00:00:07:04 1 00:00:00:00:00:00:06:04 1 matchSrcMac 00:00:c0:a8:07:04 matchDstMac 00:00:c0:a8:06:04
+205 ps_103_1 00:00:00:00:00:00:06:05 1 00:00:00:00:00:00:07:05 1 matchSrcMac 00:00:c0:a8:06:05 matchDstMac 00:00:c0:a8:07:05
+206 ps_103_2 00:00:00:00:00:00:07:05 1 00:00:00:00:00:00:06:05 1 matchSrcMac 00:00:c0:a8:07:05 matchDstMac 00:00:c0:a8:06:05
+207 ps_104_1 00:00:00:00:00:00:06:06 1 00:00:00:00:00:00:07:06 1 matchSrcMac 00:00:c0:a8:06:06 matchDstMac 00:00:c0:a8:07:06
+208 ps_104_2 00:00:00:00:00:00:07:06 1 00:00:00:00:00:00:06:06 1 matchSrcMac 00:00:c0:a8:07:06 matchDstMac 00:00:c0:a8:06:06
+209 ps_105_1 00:00:00:00:00:00:06:07 1 00:00:00:00:00:00:07:07 1 matchSrcMac 00:00:c0:a8:06:07 matchDstMac 00:00:c0:a8:07:07
+210 ps_105_2 00:00:00:00:00:00:07:07 1 00:00:00:00:00:00:06:07 1 matchSrcMac 00:00:c0:a8:07:07 matchDstMac 00:00:c0:a8:06:07
+211 ps_106_1 00:00:00:00:00:00:06:08 1 00:00:00:00:00:00:07:08 1 matchSrcMac 00:00:c0:a8:06:08 matchDstMac 00:00:c0:a8:07:08
+212 ps_106_2 00:00:00:00:00:00:07:08 1 00:00:00:00:00:00:06:08 1 matchSrcMac 00:00:c0:a8:07:08 matchDstMac 00:00:c0:a8:06:08
+213 ps_107_1 00:00:00:00:00:00:06:09 1 00:00:00:00:00:00:07:09 1 matchSrcMac 00:00:c0:a8:06:09 matchDstMac 00:00:c0:a8:07:09
+214 ps_107_2 00:00:00:00:00:00:07:09 1 00:00:00:00:00:00:06:09 1 matchSrcMac 00:00:c0:a8:07:09 matchDstMac 00:00:c0:a8:06:09
+215 ps_108_1 00:00:00:00:00:00:06:0a 1 00:00:00:00:00:00:07:0a 1 matchSrcMac 00:00:c0:a8:06:0a matchDstMac 00:00:c0:a8:07:0a
+216 ps_108_2 00:00:00:00:00:00:07:0a 1 00:00:00:00:00:00:06:0a 1 matchSrcMac 00:00:c0:a8:07:0a matchDstMac 00:00:c0:a8:06:0a
+217 ps_109_1 00:00:00:00:00:00:06:02 1 00:00:00:00:00:00:08:02 1 matchSrcMac 00:00:c0:a8:06:02 matchDstMac 00:00:c0:a8:08:02
+218 ps_109_2 00:00:00:00:00:00:08:02 1 00:00:00:00:00:00:06:02 1 matchSrcMac 00:00:c0:a8:08:02 matchDstMac 00:00:c0:a8:06:02
+219 ps_110_1 00:00:00:00:00:00:06:03 1 00:00:00:00:00:00:08:03 1 matchSrcMac 00:00:c0:a8:06:03 matchDstMac 00:00:c0:a8:08:03
+220 ps_110_2 00:00:00:00:00:00:08:03 1 00:00:00:00:00:00:06:03 1 matchSrcMac 00:00:c0:a8:08:03 matchDstMac 00:00:c0:a8:06:03
+221 ps_111_1 00:00:00:00:00:00:06:04 1 00:00:00:00:00:00:08:04 1 matchSrcMac 00:00:c0:a8:06:04 matchDstMac 00:00:c0:a8:08:04
+222 ps_111_2 00:00:00:00:00:00:08:04 1 00:00:00:00:00:00:06:04 1 matchSrcMac 00:00:c0:a8:08:04 matchDstMac 00:00:c0:a8:06:04
+223 ps_112_1 00:00:00:00:00:00:06:05 1 00:00:00:00:00:00:08:05 1 matchSrcMac 00:00:c0:a8:06:05 matchDstMac 00:00:c0:a8:08:05
+224 ps_112_2 00:00:00:00:00:00:08:05 1 00:00:00:00:00:00:06:05 1 matchSrcMac 00:00:c0:a8:08:05 matchDstMac 00:00:c0:a8:06:05
+225 ps_113_1 00:00:00:00:00:00:06:06 1 00:00:00:00:00:00:08:06 1 matchSrcMac 00:00:c0:a8:06:06 matchDstMac 00:00:c0:a8:08:06
+226 ps_113_2 00:00:00:00:00:00:08:06 1 00:00:00:00:00:00:06:06 1 matchSrcMac 00:00:c0:a8:08:06 matchDstMac 00:00:c0:a8:06:06
+227 ps_114_1 00:00:00:00:00:00:06:07 1 00:00:00:00:00:00:08:07 1 matchSrcMac 00:00:c0:a8:06:07 matchDstMac 00:00:c0:a8:08:07
+228 ps_114_2 00:00:00:00:00:00:08:07 1 00:00:00:00:00:00:06:07 1 matchSrcMac 00:00:c0:a8:08:07 matchDstMac 00:00:c0:a8:06:07
+229 ps_115_1 00:00:00:00:00:00:06:08 1 00:00:00:00:00:00:08:08 1 matchSrcMac 00:00:c0:a8:06:08 matchDstMac 00:00:c0:a8:08:08
+230 ps_115_2 00:00:00:00:00:00:08:08 1 00:00:00:00:00:00:06:08 1 matchSrcMac 00:00:c0:a8:08:08 matchDstMac 00:00:c0:a8:06:08
+231 ps_116_1 00:00:00:00:00:00:06:09 1 00:00:00:00:00:00:08:09 1 matchSrcMac 00:00:c0:a8:06:09 matchDstMac 00:00:c0:a8:08:09
+232 ps_116_2 00:00:00:00:00:00:08:09 1 00:00:00:00:00:00:06:09 1 matchSrcMac 00:00:c0:a8:08:09 matchDstMac 00:00:c0:a8:06:09
+233 ps_117_1 00:00:00:00:00:00:06:0a 1 00:00:00:00:00:00:08:0a 1 matchSrcMac 00:00:c0:a8:06:0a matchDstMac 00:00:c0:a8:08:0a
+234 ps_117_2 00:00:00:00:00:00:08:0a 1 00:00:00:00:00:00:06:0a 1 matchSrcMac 00:00:c0:a8:08:0a matchDstMac 00:00:c0:a8:06:0a
+235 ps_118_1 00:00:00:00:00:00:07:02 1 00:00:00:00:00:00:08:02 1 matchSrcMac 00:00:c0:a8:07:02 matchDstMac 00:00:c0:a8:08:02
+236 ps_118_2 00:00:00:00:00:00:08:02 1 00:00:00:00:00:00:07:02 1 matchSrcMac 00:00:c0:a8:08:02 matchDstMac 00:00:c0:a8:07:02
+237 ps_119_1 00:00:00:00:00:00:07:03 1 00:00:00:00:00:00:08:03 1 matchSrcMac 00:00:c0:a8:07:03 matchDstMac 00:00:c0:a8:08:03
+238 ps_119_2 00:00:00:00:00:00:08:03 1 00:00:00:00:00:00:07:03 1 matchSrcMac 00:00:c0:a8:08:03 matchDstMac 00:00:c0:a8:07:03
+239 ps_120_1 00:00:00:00:00:00:07:04 1 00:00:00:00:00:00:08:04 1 matchSrcMac 00:00:c0:a8:07:04 matchDstMac 00:00:c0:a8:08:04
+240 ps_120_2 00:00:00:00:00:00:08:04 1 00:00:00:00:00:00:07:04 1 matchSrcMac 00:00:c0:a8:08:04 matchDstMac 00:00:c0:a8:07:04
+241 ps_121_1 00:00:00:00:00:00:07:05 1 00:00:00:00:00:00:08:05 1 matchSrcMac 00:00:c0:a8:07:05 matchDstMac 00:00:c0:a8:08:05
+242 ps_121_2 00:00:00:00:00:00:08:05 1 00:00:00:00:00:00:07:05 1 matchSrcMac 00:00:c0:a8:08:05 matchDstMac 00:00:c0:a8:07:05
+243 ps_122_1 00:00:00:00:00:00:07:06 1 00:00:00:00:00:00:08:06 1 matchSrcMac 00:00:c0:a8:07:06 matchDstMac 00:00:c0:a8:08:06
+244 ps_122_2 00:00:00:00:00:00:08:06 1 00:00:00:00:00:00:07:06 1 matchSrcMac 00:00:c0:a8:08:06 matchDstMac 00:00:c0:a8:07:06
+245 ps_123_1 00:00:00:00:00:00:07:07 1 00:00:00:00:00:00:08:07 1 matchSrcMac 00:00:c0:a8:07:07 matchDstMac 00:00:c0:a8:08:07
+246 ps_123_2 00:00:00:00:00:00:08:07 1 00:00:00:00:00:00:07:07 1 matchSrcMac 00:00:c0:a8:08:07 matchDstMac 00:00:c0:a8:07:07
+247 ps_124_1 00:00:00:00:00:00:07:08 1 00:00:00:00:00:00:08:08 1 matchSrcMac 00:00:c0:a8:07:08 matchDstMac 00:00:c0:a8:08:08
+248 ps_124_2 00:00:00:00:00:00:08:08 1 00:00:00:00:00:00:07:08 1 matchSrcMac 00:00:c0:a8:08:08 matchDstMac 00:00:c0:a8:07:08
+249 ps_125_1 00:00:00:00:00:00:07:09 1 00:00:00:00:00:00:08:09 1 matchSrcMac 00:00:c0:a8:07:09 matchDstMac 00:00:c0:a8:08:09
+250 ps_125_2 00:00:00:00:00:00:08:09 1 00:00:00:00:00:00:07:09 1 matchSrcMac 00:00:c0:a8:08:09 matchDstMac 00:00:c0:a8:07:09
+251 ps_126_1 00:00:00:00:00:00:07:0a 1 00:00:00:00:00:00:08:0a 1 matchSrcMac 00:00:c0:a8:07:0a matchDstMac 00:00:c0:a8:08:0a
+252 ps_126_2 00:00:00:00:00:00:08:0a 1 00:00:00:00:00:00:07:0a 1 matchSrcMac 00:00:c0:a8:08:0a matchDstMac 00:00:c0:a8:07:0a
diff --git a/web/flowdef_demo_start.txt b/web/flowdef_demo_start.txt
index fe0e3b5..507cc93 100644
--- a/web/flowdef_demo_start.txt
+++ b/web/flowdef_demo_start.txt
@@ -1,4 +1,3 @@
-# Demo flow scale down
1 ps_1_1 00:00:00:00:00:00:02:02 1 00:00:00:00:00:00:03:02 1 matchSrcMac 00:00:c0:a8:02:02 matchDstMac 00:00:c0:a8:03:02
2 ps_1_2 00:00:00:00:00:00:03:02 1 00:00:00:00:00:00:02:02 1 matchSrcMac 00:00:c0:a8:03:02 matchDstMac 00:00:c0:a8:02:02
3 ps_2_1 00:00:00:00:00:00:02:03 1 00:00:00:00:00:00:03:03 1 matchSrcMac 00:00:c0:a8:02:03 matchDstMac 00:00:c0:a8:03:03
@@ -19,183 +18,127 @@
18 ps_9_2 00:00:00:00:00:00:03:0a 1 00:00:00:00:00:00:02:0a 1 matchSrcMac 00:00:c0:a8:03:0a matchDstMac 00:00:c0:a8:02:0a
19 ps_10_1 00:00:00:00:00:00:02:0b 1 00:00:00:00:00:00:03:0b 1 matchSrcMac 00:00:c0:a8:02:0b matchDstMac 00:00:c0:a8:03:0b
20 ps_10_2 00:00:00:00:00:00:03:0b 1 00:00:00:00:00:00:02:0b 1 matchSrcMac 00:00:c0:a8:03:0b matchDstMac 00:00:c0:a8:02:0b
-21 ps_11_1 00:00:00:00:00:00:02:02 1 00:00:00:00:00:00:04:02 1 matchSrcMac 00:00:c0:a8:02:02 matchDstMac 00:00:c0:a8:04:02
-22 ps_11_2 00:00:00:00:00:00:04:02 1 00:00:00:00:00:00:02:02 1 matchSrcMac 00:00:c0:a8:04:02 matchDstMac 00:00:c0:a8:02:02
-23 ps_12_1 00:00:00:00:00:00:02:03 1 00:00:00:00:00:00:04:03 1 matchSrcMac 00:00:c0:a8:02:03 matchDstMac 00:00:c0:a8:04:03
-24 ps_12_2 00:00:00:00:00:00:04:03 1 00:00:00:00:00:00:02:03 1 matchSrcMac 00:00:c0:a8:04:03 matchDstMac 00:00:c0:a8:02:03
-25 ps_13_1 00:00:00:00:00:00:02:04 1 00:00:00:00:00:00:04:04 1 matchSrcMac 00:00:c0:a8:02:04 matchDstMac 00:00:c0:a8:04:04
-26 ps_13_2 00:00:00:00:00:00:04:04 1 00:00:00:00:00:00:02:04 1 matchSrcMac 00:00:c0:a8:04:04 matchDstMac 00:00:c0:a8:02:04
-27 ps_14_1 00:00:00:00:00:00:02:05 1 00:00:00:00:00:00:04:05 1 matchSrcMac 00:00:c0:a8:02:05 matchDstMac 00:00:c0:a8:04:05
-28 ps_14_2 00:00:00:00:00:00:04:05 1 00:00:00:00:00:00:02:05 1 matchSrcMac 00:00:c0:a8:04:05 matchDstMac 00:00:c0:a8:02:05
-29 ps_15_1 00:00:00:00:00:00:02:06 1 00:00:00:00:00:00:04:06 1 matchSrcMac 00:00:c0:a8:02:06 matchDstMac 00:00:c0:a8:04:06
-30 ps_15_2 00:00:00:00:00:00:04:06 1 00:00:00:00:00:00:02:06 1 matchSrcMac 00:00:c0:a8:04:06 matchDstMac 00:00:c0:a8:02:06
-31 ps_16_1 00:00:00:00:00:00:02:07 1 00:00:00:00:00:00:04:07 1 matchSrcMac 00:00:c0:a8:02:07 matchDstMac 00:00:c0:a8:04:07
-32 ps_16_2 00:00:00:00:00:00:04:07 1 00:00:00:00:00:00:02:07 1 matchSrcMac 00:00:c0:a8:04:07 matchDstMac 00:00:c0:a8:02:07
-33 ps_17_1 00:00:00:00:00:00:02:08 1 00:00:00:00:00:00:04:08 1 matchSrcMac 00:00:c0:a8:02:08 matchDstMac 00:00:c0:a8:04:08
-34 ps_17_2 00:00:00:00:00:00:04:08 1 00:00:00:00:00:00:02:08 1 matchSrcMac 00:00:c0:a8:04:08 matchDstMac 00:00:c0:a8:02:08
-35 ps_18_1 00:00:00:00:00:00:02:09 1 00:00:00:00:00:00:04:09 1 matchSrcMac 00:00:c0:a8:02:09 matchDstMac 00:00:c0:a8:04:09
-36 ps_18_2 00:00:00:00:00:00:04:09 1 00:00:00:00:00:00:02:09 1 matchSrcMac 00:00:c0:a8:04:09 matchDstMac 00:00:c0:a8:02:09
-37 ps_19_1 00:00:00:00:00:00:02:0a 1 00:00:00:00:00:00:04:0a 1 matchSrcMac 00:00:c0:a8:02:0a matchDstMac 00:00:c0:a8:04:0a
-38 ps_19_2 00:00:00:00:00:00:04:0a 1 00:00:00:00:00:00:02:0a 1 matchSrcMac 00:00:c0:a8:04:0a matchDstMac 00:00:c0:a8:02:0a
-39 ps_20_1 00:00:00:00:00:00:02:0b 1 00:00:00:00:00:00:04:0b 1 matchSrcMac 00:00:c0:a8:02:0b matchDstMac 00:00:c0:a8:04:0b
-40 ps_20_2 00:00:00:00:00:00:04:0b 1 00:00:00:00:00:00:02:0b 1 matchSrcMac 00:00:c0:a8:04:0b matchDstMac 00:00:c0:a8:02:0b
-41 ps_21_1 00:00:00:00:00:00:02:02 1 00:00:00:00:00:00:06:02 1 matchSrcMac 00:00:c0:a8:02:02 matchDstMac 00:00:c0:a8:06:02
-42 ps_21_2 00:00:00:00:00:00:06:02 1 00:00:00:00:00:00:02:02 1 matchSrcMac 00:00:c0:a8:06:02 matchDstMac 00:00:c0:a8:02:02
-43 ps_22_1 00:00:00:00:00:00:02:03 1 00:00:00:00:00:00:06:03 1 matchSrcMac 00:00:c0:a8:02:03 matchDstMac 00:00:c0:a8:06:03
-44 ps_22_2 00:00:00:00:00:00:06:03 1 00:00:00:00:00:00:02:03 1 matchSrcMac 00:00:c0:a8:06:03 matchDstMac 00:00:c0:a8:02:03
-45 ps_23_1 00:00:00:00:00:00:02:04 1 00:00:00:00:00:00:06:04 1 matchSrcMac 00:00:c0:a8:02:04 matchDstMac 00:00:c0:a8:06:04
-46 ps_23_2 00:00:00:00:00:00:06:04 1 00:00:00:00:00:00:02:04 1 matchSrcMac 00:00:c0:a8:06:04 matchDstMac 00:00:c0:a8:02:04
-47 ps_24_1 00:00:00:00:00:00:02:05 1 00:00:00:00:00:00:06:05 1 matchSrcMac 00:00:c0:a8:02:05 matchDstMac 00:00:c0:a8:06:05
-48 ps_24_2 00:00:00:00:00:00:06:05 1 00:00:00:00:00:00:02:05 1 matchSrcMac 00:00:c0:a8:06:05 matchDstMac 00:00:c0:a8:02:05
-49 ps_25_1 00:00:00:00:00:00:02:06 1 00:00:00:00:00:00:06:06 1 matchSrcMac 00:00:c0:a8:02:06 matchDstMac 00:00:c0:a8:06:06
-50 ps_25_2 00:00:00:00:00:00:06:06 1 00:00:00:00:00:00:02:06 1 matchSrcMac 00:00:c0:a8:06:06 matchDstMac 00:00:c0:a8:02:06
-51 ps_26_1 00:00:00:00:00:00:02:07 1 00:00:00:00:00:00:06:07 1 matchSrcMac 00:00:c0:a8:02:07 matchDstMac 00:00:c0:a8:06:07
-52 ps_26_2 00:00:00:00:00:00:06:07 1 00:00:00:00:00:00:02:07 1 matchSrcMac 00:00:c0:a8:06:07 matchDstMac 00:00:c0:a8:02:07
-53 ps_27_1 00:00:00:00:00:00:02:08 1 00:00:00:00:00:00:06:08 1 matchSrcMac 00:00:c0:a8:02:08 matchDstMac 00:00:c0:a8:06:08
-54 ps_27_2 00:00:00:00:00:00:06:08 1 00:00:00:00:00:00:02:08 1 matchSrcMac 00:00:c0:a8:06:08 matchDstMac 00:00:c0:a8:02:08
-55 ps_28_1 00:00:00:00:00:00:02:09 1 00:00:00:00:00:00:06:09 1 matchSrcMac 00:00:c0:a8:02:09 matchDstMac 00:00:c0:a8:06:09
-56 ps_28_2 00:00:00:00:00:00:06:09 1 00:00:00:00:00:00:02:09 1 matchSrcMac 00:00:c0:a8:06:09 matchDstMac 00:00:c0:a8:02:09
-57 ps_29_1 00:00:00:00:00:00:02:0a 1 00:00:00:00:00:00:06:0a 1 matchSrcMac 00:00:c0:a8:02:0a matchDstMac 00:00:c0:a8:06:0a
-58 ps_29_2 00:00:00:00:00:00:06:0a 1 00:00:00:00:00:00:02:0a 1 matchSrcMac 00:00:c0:a8:06:0a matchDstMac 00:00:c0:a8:02:0a
-59 ps_30_1 00:00:00:00:00:00:02:0b 1 00:00:00:00:00:00:06:0b 1 matchSrcMac 00:00:c0:a8:02:0b matchDstMac 00:00:c0:a8:06:0b
-60 ps_30_2 00:00:00:00:00:00:06:0b 1 00:00:00:00:00:00:02:0b 1 matchSrcMac 00:00:c0:a8:06:0b matchDstMac 00:00:c0:a8:02:0b
-61 ps_31_1 00:00:00:00:00:00:02:02 1 00:00:00:00:00:00:08:02 1 matchSrcMac 00:00:c0:a8:02:02 matchDstMac 00:00:c0:a8:08:02
-62 ps_31_2 00:00:00:00:00:00:08:02 1 00:00:00:00:00:00:02:02 1 matchSrcMac 00:00:c0:a8:08:02 matchDstMac 00:00:c0:a8:02:02
-63 ps_32_1 00:00:00:00:00:00:02:03 1 00:00:00:00:00:00:08:03 1 matchSrcMac 00:00:c0:a8:02:03 matchDstMac 00:00:c0:a8:08:03
-64 ps_32_2 00:00:00:00:00:00:08:03 1 00:00:00:00:00:00:02:03 1 matchSrcMac 00:00:c0:a8:08:03 matchDstMac 00:00:c0:a8:02:03
-65 ps_33_1 00:00:00:00:00:00:02:04 1 00:00:00:00:00:00:08:04 1 matchSrcMac 00:00:c0:a8:02:04 matchDstMac 00:00:c0:a8:08:04
-66 ps_33_2 00:00:00:00:00:00:08:04 1 00:00:00:00:00:00:02:04 1 matchSrcMac 00:00:c0:a8:08:04 matchDstMac 00:00:c0:a8:02:04
-67 ps_34_1 00:00:00:00:00:00:02:05 1 00:00:00:00:00:00:08:05 1 matchSrcMac 00:00:c0:a8:02:05 matchDstMac 00:00:c0:a8:08:05
-68 ps_34_2 00:00:00:00:00:00:08:05 1 00:00:00:00:00:00:02:05 1 matchSrcMac 00:00:c0:a8:08:05 matchDstMac 00:00:c0:a8:02:05
-69 ps_35_1 00:00:00:00:00:00:02:06 1 00:00:00:00:00:00:08:06 1 matchSrcMac 00:00:c0:a8:02:06 matchDstMac 00:00:c0:a8:08:06
-70 ps_35_2 00:00:00:00:00:00:08:06 1 00:00:00:00:00:00:02:06 1 matchSrcMac 00:00:c0:a8:08:06 matchDstMac 00:00:c0:a8:02:06
-71 ps_36_1 00:00:00:00:00:00:02:07 1 00:00:00:00:00:00:08:07 1 matchSrcMac 00:00:c0:a8:02:07 matchDstMac 00:00:c0:a8:08:07
-72 ps_36_2 00:00:00:00:00:00:08:07 1 00:00:00:00:00:00:02:07 1 matchSrcMac 00:00:c0:a8:08:07 matchDstMac 00:00:c0:a8:02:07
-73 ps_37_1 00:00:00:00:00:00:02:08 1 00:00:00:00:00:00:08:08 1 matchSrcMac 00:00:c0:a8:02:08 matchDstMac 00:00:c0:a8:08:08
-74 ps_37_2 00:00:00:00:00:00:08:08 1 00:00:00:00:00:00:02:08 1 matchSrcMac 00:00:c0:a8:08:08 matchDstMac 00:00:c0:a8:02:08
-75 ps_38_1 00:00:00:00:00:00:02:09 1 00:00:00:00:00:00:08:09 1 matchSrcMac 00:00:c0:a8:02:09 matchDstMac 00:00:c0:a8:08:09
-76 ps_38_2 00:00:00:00:00:00:08:09 1 00:00:00:00:00:00:02:09 1 matchSrcMac 00:00:c0:a8:08:09 matchDstMac 00:00:c0:a8:02:09
-77 ps_39_1 00:00:00:00:00:00:02:0a 1 00:00:00:00:00:00:08:0a 1 matchSrcMac 00:00:c0:a8:02:0a matchDstMac 00:00:c0:a8:08:0a
-78 ps_39_2 00:00:00:00:00:00:08:0a 1 00:00:00:00:00:00:02:0a 1 matchSrcMac 00:00:c0:a8:08:0a matchDstMac 00:00:c0:a8:02:0a
-79 ps_40_1 00:00:00:00:00:00:02:0b 1 00:00:00:00:00:00:08:0b 1 matchSrcMac 00:00:c0:a8:02:0b matchDstMac 00:00:c0:a8:08:0b
-80 ps_40_2 00:00:00:00:00:00:08:0b 1 00:00:00:00:00:00:02:0b 1 matchSrcMac 00:00:c0:a8:08:0b matchDstMac 00:00:c0:a8:02:0b
-81 ps_41_1 00:00:00:00:00:00:03:02 1 00:00:00:00:00:00:04:02 1 matchSrcMac 00:00:c0:a8:03:02 matchDstMac 00:00:c0:a8:04:02
-82 ps_41_2 00:00:00:00:00:00:04:02 1 00:00:00:00:00:00:03:02 1 matchSrcMac 00:00:c0:a8:04:02 matchDstMac 00:00:c0:a8:03:02
-83 ps_42_1 00:00:00:00:00:00:03:03 1 00:00:00:00:00:00:04:03 1 matchSrcMac 00:00:c0:a8:03:03 matchDstMac 00:00:c0:a8:04:03
-84 ps_42_2 00:00:00:00:00:00:04:03 1 00:00:00:00:00:00:03:03 1 matchSrcMac 00:00:c0:a8:04:03 matchDstMac 00:00:c0:a8:03:03
-85 ps_43_1 00:00:00:00:00:00:03:04 1 00:00:00:00:00:00:04:04 1 matchSrcMac 00:00:c0:a8:03:04 matchDstMac 00:00:c0:a8:04:04
-86 ps_43_2 00:00:00:00:00:00:04:04 1 00:00:00:00:00:00:03:04 1 matchSrcMac 00:00:c0:a8:04:04 matchDstMac 00:00:c0:a8:03:04
-87 ps_44_1 00:00:00:00:00:00:03:05 1 00:00:00:00:00:00:04:05 1 matchSrcMac 00:00:c0:a8:03:05 matchDstMac 00:00:c0:a8:04:05
-88 ps_44_2 00:00:00:00:00:00:04:05 1 00:00:00:00:00:00:03:05 1 matchSrcMac 00:00:c0:a8:04:05 matchDstMac 00:00:c0:a8:03:05
-89 ps_45_1 00:00:00:00:00:00:03:06 1 00:00:00:00:00:00:04:06 1 matchSrcMac 00:00:c0:a8:03:06 matchDstMac 00:00:c0:a8:04:06
-90 ps_45_2 00:00:00:00:00:00:04:06 1 00:00:00:00:00:00:03:06 1 matchSrcMac 00:00:c0:a8:04:06 matchDstMac 00:00:c0:a8:03:06
-91 ps_46_1 00:00:00:00:00:00:03:07 1 00:00:00:00:00:00:04:07 1 matchSrcMac 00:00:c0:a8:03:07 matchDstMac 00:00:c0:a8:04:07
-92 ps_46_2 00:00:00:00:00:00:04:07 1 00:00:00:00:00:00:03:07 1 matchSrcMac 00:00:c0:a8:04:07 matchDstMac 00:00:c0:a8:03:07
-93 ps_47_1 00:00:00:00:00:00:03:08 1 00:00:00:00:00:00:04:08 1 matchSrcMac 00:00:c0:a8:03:08 matchDstMac 00:00:c0:a8:04:08
-94 ps_47_2 00:00:00:00:00:00:04:08 1 00:00:00:00:00:00:03:08 1 matchSrcMac 00:00:c0:a8:04:08 matchDstMac 00:00:c0:a8:03:08
-95 ps_48_1 00:00:00:00:00:00:03:09 1 00:00:00:00:00:00:04:09 1 matchSrcMac 00:00:c0:a8:03:09 matchDstMac 00:00:c0:a8:04:09
-96 ps_48_2 00:00:00:00:00:00:04:09 1 00:00:00:00:00:00:03:09 1 matchSrcMac 00:00:c0:a8:04:09 matchDstMac 00:00:c0:a8:03:09
-97 ps_49_1 00:00:00:00:00:00:03:0a 1 00:00:00:00:00:00:04:0a 1 matchSrcMac 00:00:c0:a8:03:0a matchDstMac 00:00:c0:a8:04:0a
-98 ps_49_2 00:00:00:00:00:00:04:0a 1 00:00:00:00:00:00:03:0a 1 matchSrcMac 00:00:c0:a8:04:0a matchDstMac 00:00:c0:a8:03:0a
-99 ps_50_1 00:00:00:00:00:00:03:0b 1 00:00:00:00:00:00:04:0b 1 matchSrcMac 00:00:c0:a8:03:0b matchDstMac 00:00:c0:a8:04:0b
-100 ps_50_2 00:00:00:00:00:00:04:0b 1 00:00:00:00:00:00:03:0b 1 matchSrcMac 00:00:c0:a8:04:0b matchDstMac 00:00:c0:a8:03:0b
-101 ps_51_1 00:00:00:00:00:00:03:02 1 00:00:00:00:00:00:06:02 1 matchSrcMac 00:00:c0:a8:03:02 matchDstMac 00:00:c0:a8:06:02
-102 ps_51_2 00:00:00:00:00:00:06:02 1 00:00:00:00:00:00:03:02 1 matchSrcMac 00:00:c0:a8:06:02 matchDstMac 00:00:c0:a8:03:02
-103 ps_52_1 00:00:00:00:00:00:03:03 1 00:00:00:00:00:00:06:03 1 matchSrcMac 00:00:c0:a8:03:03 matchDstMac 00:00:c0:a8:06:03
-104 ps_52_2 00:00:00:00:00:00:06:03 1 00:00:00:00:00:00:03:03 1 matchSrcMac 00:00:c0:a8:06:03 matchDstMac 00:00:c0:a8:03:03
-105 ps_53_1 00:00:00:00:00:00:03:04 1 00:00:00:00:00:00:06:04 1 matchSrcMac 00:00:c0:a8:03:04 matchDstMac 00:00:c0:a8:06:04
-106 ps_53_2 00:00:00:00:00:00:06:04 1 00:00:00:00:00:00:03:04 1 matchSrcMac 00:00:c0:a8:06:04 matchDstMac 00:00:c0:a8:03:04
-107 ps_54_1 00:00:00:00:00:00:03:05 1 00:00:00:00:00:00:06:05 1 matchSrcMac 00:00:c0:a8:03:05 matchDstMac 00:00:c0:a8:06:05
-108 ps_54_2 00:00:00:00:00:00:06:05 1 00:00:00:00:00:00:03:05 1 matchSrcMac 00:00:c0:a8:06:05 matchDstMac 00:00:c0:a8:03:05
-109 ps_55_1 00:00:00:00:00:00:03:06 1 00:00:00:00:00:00:06:06 1 matchSrcMac 00:00:c0:a8:03:06 matchDstMac 00:00:c0:a8:06:06
-110 ps_55_2 00:00:00:00:00:00:06:06 1 00:00:00:00:00:00:03:06 1 matchSrcMac 00:00:c0:a8:06:06 matchDstMac 00:00:c0:a8:03:06
-111 ps_56_1 00:00:00:00:00:00:03:07 1 00:00:00:00:00:00:06:07 1 matchSrcMac 00:00:c0:a8:03:07 matchDstMac 00:00:c0:a8:06:07
-112 ps_56_2 00:00:00:00:00:00:06:07 1 00:00:00:00:00:00:03:07 1 matchSrcMac 00:00:c0:a8:06:07 matchDstMac 00:00:c0:a8:03:07
-113 ps_57_1 00:00:00:00:00:00:03:08 1 00:00:00:00:00:00:06:08 1 matchSrcMac 00:00:c0:a8:03:08 matchDstMac 00:00:c0:a8:06:08
-114 ps_57_2 00:00:00:00:00:00:06:08 1 00:00:00:00:00:00:03:08 1 matchSrcMac 00:00:c0:a8:06:08 matchDstMac 00:00:c0:a8:03:08
-115 ps_58_1 00:00:00:00:00:00:03:09 1 00:00:00:00:00:00:06:09 1 matchSrcMac 00:00:c0:a8:03:09 matchDstMac 00:00:c0:a8:06:09
-116 ps_58_2 00:00:00:00:00:00:06:09 1 00:00:00:00:00:00:03:09 1 matchSrcMac 00:00:c0:a8:06:09 matchDstMac 00:00:c0:a8:03:09
-117 ps_59_1 00:00:00:00:00:00:03:0a 1 00:00:00:00:00:00:06:0a 1 matchSrcMac 00:00:c0:a8:03:0a matchDstMac 00:00:c0:a8:06:0a
-118 ps_59_2 00:00:00:00:00:00:06:0a 1 00:00:00:00:00:00:03:0a 1 matchSrcMac 00:00:c0:a8:06:0a matchDstMac 00:00:c0:a8:03:0a
-119 ps_60_1 00:00:00:00:00:00:03:0b 1 00:00:00:00:00:00:06:0b 1 matchSrcMac 00:00:c0:a8:03:0b matchDstMac 00:00:c0:a8:06:0b
-120 ps_60_2 00:00:00:00:00:00:06:0b 1 00:00:00:00:00:00:03:0b 1 matchSrcMac 00:00:c0:a8:06:0b matchDstMac 00:00:c0:a8:03:0b
-121 ps_61_1 00:00:00:00:00:00:03:02 1 00:00:00:00:00:00:08:02 1 matchSrcMac 00:00:c0:a8:03:02 matchDstMac 00:00:c0:a8:08:02
-122 ps_61_2 00:00:00:00:00:00:08:02 1 00:00:00:00:00:00:03:02 1 matchSrcMac 00:00:c0:a8:08:02 matchDstMac 00:00:c0:a8:03:02
-123 ps_62_1 00:00:00:00:00:00:03:03 1 00:00:00:00:00:00:08:03 1 matchSrcMac 00:00:c0:a8:03:03 matchDstMac 00:00:c0:a8:08:03
-124 ps_62_2 00:00:00:00:00:00:08:03 1 00:00:00:00:00:00:03:03 1 matchSrcMac 00:00:c0:a8:08:03 matchDstMac 00:00:c0:a8:03:03
-125 ps_63_1 00:00:00:00:00:00:03:04 1 00:00:00:00:00:00:08:04 1 matchSrcMac 00:00:c0:a8:03:04 matchDstMac 00:00:c0:a8:08:04
-126 ps_63_2 00:00:00:00:00:00:08:04 1 00:00:00:00:00:00:03:04 1 matchSrcMac 00:00:c0:a8:08:04 matchDstMac 00:00:c0:a8:03:04
-127 ps_64_1 00:00:00:00:00:00:03:05 1 00:00:00:00:00:00:08:05 1 matchSrcMac 00:00:c0:a8:03:05 matchDstMac 00:00:c0:a8:08:05
-128 ps_64_2 00:00:00:00:00:00:08:05 1 00:00:00:00:00:00:03:05 1 matchSrcMac 00:00:c0:a8:08:05 matchDstMac 00:00:c0:a8:03:05
-129 ps_65_1 00:00:00:00:00:00:03:06 1 00:00:00:00:00:00:08:06 1 matchSrcMac 00:00:c0:a8:03:06 matchDstMac 00:00:c0:a8:08:06
-130 ps_65_2 00:00:00:00:00:00:08:06 1 00:00:00:00:00:00:03:06 1 matchSrcMac 00:00:c0:a8:08:06 matchDstMac 00:00:c0:a8:03:06
-131 ps_66_1 00:00:00:00:00:00:03:07 1 00:00:00:00:00:00:08:07 1 matchSrcMac 00:00:c0:a8:03:07 matchDstMac 00:00:c0:a8:08:07
-132 ps_66_2 00:00:00:00:00:00:08:07 1 00:00:00:00:00:00:03:07 1 matchSrcMac 00:00:c0:a8:08:07 matchDstMac 00:00:c0:a8:03:07
-133 ps_67_1 00:00:00:00:00:00:03:08 1 00:00:00:00:00:00:08:08 1 matchSrcMac 00:00:c0:a8:03:08 matchDstMac 00:00:c0:a8:08:08
-134 ps_67_2 00:00:00:00:00:00:08:08 1 00:00:00:00:00:00:03:08 1 matchSrcMac 00:00:c0:a8:08:08 matchDstMac 00:00:c0:a8:03:08
-135 ps_68_1 00:00:00:00:00:00:03:09 1 00:00:00:00:00:00:08:09 1 matchSrcMac 00:00:c0:a8:03:09 matchDstMac 00:00:c0:a8:08:09
-136 ps_68_2 00:00:00:00:00:00:08:09 1 00:00:00:00:00:00:03:09 1 matchSrcMac 00:00:c0:a8:08:09 matchDstMac 00:00:c0:a8:03:09
-137 ps_69_1 00:00:00:00:00:00:03:0a 1 00:00:00:00:00:00:08:0a 1 matchSrcMac 00:00:c0:a8:03:0a matchDstMac 00:00:c0:a8:08:0a
-138 ps_69_2 00:00:00:00:00:00:08:0a 1 00:00:00:00:00:00:03:0a 1 matchSrcMac 00:00:c0:a8:08:0a matchDstMac 00:00:c0:a8:03:0a
-139 ps_70_1 00:00:00:00:00:00:03:0b 1 00:00:00:00:00:00:08:0b 1 matchSrcMac 00:00:c0:a8:03:0b matchDstMac 00:00:c0:a8:08:0b
-140 ps_70_2 00:00:00:00:00:00:08:0b 1 00:00:00:00:00:00:03:0b 1 matchSrcMac 00:00:c0:a8:08:0b matchDstMac 00:00:c0:a8:03:0b
-141 ps_71_1 00:00:00:00:00:00:04:02 1 00:00:00:00:00:00:06:02 1 matchSrcMac 00:00:c0:a8:04:02 matchDstMac 00:00:c0:a8:06:02
-142 ps_71_2 00:00:00:00:00:00:06:02 1 00:00:00:00:00:00:04:02 1 matchSrcMac 00:00:c0:a8:06:02 matchDstMac 00:00:c0:a8:04:02
-143 ps_72_1 00:00:00:00:00:00:04:03 1 00:00:00:00:00:00:06:03 1 matchSrcMac 00:00:c0:a8:04:03 matchDstMac 00:00:c0:a8:06:03
-144 ps_72_2 00:00:00:00:00:00:06:03 1 00:00:00:00:00:00:04:03 1 matchSrcMac 00:00:c0:a8:06:03 matchDstMac 00:00:c0:a8:04:03
-145 ps_73_1 00:00:00:00:00:00:04:04 1 00:00:00:00:00:00:06:04 1 matchSrcMac 00:00:c0:a8:04:04 matchDstMac 00:00:c0:a8:06:04
-146 ps_73_2 00:00:00:00:00:00:06:04 1 00:00:00:00:00:00:04:04 1 matchSrcMac 00:00:c0:a8:06:04 matchDstMac 00:00:c0:a8:04:04
-147 ps_74_1 00:00:00:00:00:00:04:05 1 00:00:00:00:00:00:06:05 1 matchSrcMac 00:00:c0:a8:04:05 matchDstMac 00:00:c0:a8:06:05
-148 ps_74_2 00:00:00:00:00:00:06:05 1 00:00:00:00:00:00:04:05 1 matchSrcMac 00:00:c0:a8:06:05 matchDstMac 00:00:c0:a8:04:05
-149 ps_75_1 00:00:00:00:00:00:04:06 1 00:00:00:00:00:00:06:06 1 matchSrcMac 00:00:c0:a8:04:06 matchDstMac 00:00:c0:a8:06:06
-150 ps_75_2 00:00:00:00:00:00:06:06 1 00:00:00:00:00:00:04:06 1 matchSrcMac 00:00:c0:a8:06:06 matchDstMac 00:00:c0:a8:04:06
-151 ps_76_1 00:00:00:00:00:00:04:07 1 00:00:00:00:00:00:06:07 1 matchSrcMac 00:00:c0:a8:04:07 matchDstMac 00:00:c0:a8:06:07
-152 ps_76_2 00:00:00:00:00:00:06:07 1 00:00:00:00:00:00:04:07 1 matchSrcMac 00:00:c0:a8:06:07 matchDstMac 00:00:c0:a8:04:07
-153 ps_77_1 00:00:00:00:00:00:04:08 1 00:00:00:00:00:00:06:08 1 matchSrcMac 00:00:c0:a8:04:08 matchDstMac 00:00:c0:a8:06:08
-154 ps_77_2 00:00:00:00:00:00:06:08 1 00:00:00:00:00:00:04:08 1 matchSrcMac 00:00:c0:a8:06:08 matchDstMac 00:00:c0:a8:04:08
-155 ps_78_1 00:00:00:00:00:00:04:09 1 00:00:00:00:00:00:06:09 1 matchSrcMac 00:00:c0:a8:04:09 matchDstMac 00:00:c0:a8:06:09
-156 ps_78_2 00:00:00:00:00:00:06:09 1 00:00:00:00:00:00:04:09 1 matchSrcMac 00:00:c0:a8:06:09 matchDstMac 00:00:c0:a8:04:09
-157 ps_79_1 00:00:00:00:00:00:04:0a 1 00:00:00:00:00:00:06:0a 1 matchSrcMac 00:00:c0:a8:04:0a matchDstMac 00:00:c0:a8:06:0a
-158 ps_79_2 00:00:00:00:00:00:06:0a 1 00:00:00:00:00:00:04:0a 1 matchSrcMac 00:00:c0:a8:06:0a matchDstMac 00:00:c0:a8:04:0a
-159 ps_80_1 00:00:00:00:00:00:04:0b 1 00:00:00:00:00:00:06:0b 1 matchSrcMac 00:00:c0:a8:04:0b matchDstMac 00:00:c0:a8:06:0b
-160 ps_80_2 00:00:00:00:00:00:06:0b 1 00:00:00:00:00:00:04:0b 1 matchSrcMac 00:00:c0:a8:06:0b matchDstMac 00:00:c0:a8:04:0b
-161 ps_81_1 00:00:00:00:00:00:04:02 1 00:00:00:00:00:00:08:02 1 matchSrcMac 00:00:c0:a8:04:02 matchDstMac 00:00:c0:a8:08:02
-162 ps_81_2 00:00:00:00:00:00:08:02 1 00:00:00:00:00:00:04:02 1 matchSrcMac 00:00:c0:a8:08:02 matchDstMac 00:00:c0:a8:04:02
-163 ps_82_1 00:00:00:00:00:00:04:03 1 00:00:00:00:00:00:08:03 1 matchSrcMac 00:00:c0:a8:04:03 matchDstMac 00:00:c0:a8:08:03
-164 ps_82_2 00:00:00:00:00:00:08:03 1 00:00:00:00:00:00:04:03 1 matchSrcMac 00:00:c0:a8:08:03 matchDstMac 00:00:c0:a8:04:03
-165 ps_83_1 00:00:00:00:00:00:04:04 1 00:00:00:00:00:00:08:04 1 matchSrcMac 00:00:c0:a8:04:04 matchDstMac 00:00:c0:a8:08:04
-166 ps_83_2 00:00:00:00:00:00:08:04 1 00:00:00:00:00:00:04:04 1 matchSrcMac 00:00:c0:a8:08:04 matchDstMac 00:00:c0:a8:04:04
-167 ps_84_1 00:00:00:00:00:00:04:05 1 00:00:00:00:00:00:08:05 1 matchSrcMac 00:00:c0:a8:04:05 matchDstMac 00:00:c0:a8:08:05
-168 ps_84_2 00:00:00:00:00:00:08:05 1 00:00:00:00:00:00:04:05 1 matchSrcMac 00:00:c0:a8:08:05 matchDstMac 00:00:c0:a8:04:05
-169 ps_85_1 00:00:00:00:00:00:04:06 1 00:00:00:00:00:00:08:06 1 matchSrcMac 00:00:c0:a8:04:06 matchDstMac 00:00:c0:a8:08:06
-170 ps_85_2 00:00:00:00:00:00:08:06 1 00:00:00:00:00:00:04:06 1 matchSrcMac 00:00:c0:a8:08:06 matchDstMac 00:00:c0:a8:04:06
-171 ps_86_1 00:00:00:00:00:00:04:07 1 00:00:00:00:00:00:08:07 1 matchSrcMac 00:00:c0:a8:04:07 matchDstMac 00:00:c0:a8:08:07
-172 ps_86_2 00:00:00:00:00:00:08:07 1 00:00:00:00:00:00:04:07 1 matchSrcMac 00:00:c0:a8:08:07 matchDstMac 00:00:c0:a8:04:07
-173 ps_87_1 00:00:00:00:00:00:04:08 1 00:00:00:00:00:00:08:08 1 matchSrcMac 00:00:c0:a8:04:08 matchDstMac 00:00:c0:a8:08:08
-174 ps_87_2 00:00:00:00:00:00:08:08 1 00:00:00:00:00:00:04:08 1 matchSrcMac 00:00:c0:a8:08:08 matchDstMac 00:00:c0:a8:04:08
-175 ps_88_1 00:00:00:00:00:00:04:09 1 00:00:00:00:00:00:08:09 1 matchSrcMac 00:00:c0:a8:04:09 matchDstMac 00:00:c0:a8:08:09
-176 ps_88_2 00:00:00:00:00:00:08:09 1 00:00:00:00:00:00:04:09 1 matchSrcMac 00:00:c0:a8:08:09 matchDstMac 00:00:c0:a8:04:09
-177 ps_89_1 00:00:00:00:00:00:04:0a 1 00:00:00:00:00:00:08:0a 1 matchSrcMac 00:00:c0:a8:04:0a matchDstMac 00:00:c0:a8:08:0a
-178 ps_89_2 00:00:00:00:00:00:08:0a 1 00:00:00:00:00:00:04:0a 1 matchSrcMac 00:00:c0:a8:08:0a matchDstMac 00:00:c0:a8:04:0a
-179 ps_90_1 00:00:00:00:00:00:04:0b 1 00:00:00:00:00:00:08:0b 1 matchSrcMac 00:00:c0:a8:04:0b matchDstMac 00:00:c0:a8:08:0b
-180 ps_90_2 00:00:00:00:00:00:08:0b 1 00:00:00:00:00:00:04:0b 1 matchSrcMac 00:00:c0:a8:08:0b matchDstMac 00:00:c0:a8:04:0b
-181 ps_91_1 00:00:00:00:00:00:06:02 1 00:00:00:00:00:00:08:02 1 matchSrcMac 00:00:c0:a8:06:02 matchDstMac 00:00:c0:a8:08:02
-182 ps_91_2 00:00:00:00:00:00:08:02 1 00:00:00:00:00:00:06:02 1 matchSrcMac 00:00:c0:a8:08:02 matchDstMac 00:00:c0:a8:06:02
-183 ps_92_1 00:00:00:00:00:00:06:03 1 00:00:00:00:00:00:08:03 1 matchSrcMac 00:00:c0:a8:06:03 matchDstMac 00:00:c0:a8:08:03
-184 ps_92_2 00:00:00:00:00:00:08:03 1 00:00:00:00:00:00:06:03 1 matchSrcMac 00:00:c0:a8:08:03 matchDstMac 00:00:c0:a8:06:03
-185 ps_93_1 00:00:00:00:00:00:06:04 1 00:00:00:00:00:00:08:04 1 matchSrcMac 00:00:c0:a8:06:04 matchDstMac 00:00:c0:a8:08:04
-186 ps_93_2 00:00:00:00:00:00:08:04 1 00:00:00:00:00:00:06:04 1 matchSrcMac 00:00:c0:a8:08:04 matchDstMac 00:00:c0:a8:06:04
-187 ps_94_1 00:00:00:00:00:00:06:05 1 00:00:00:00:00:00:08:05 1 matchSrcMac 00:00:c0:a8:06:05 matchDstMac 00:00:c0:a8:08:05
-188 ps_94_2 00:00:00:00:00:00:08:05 1 00:00:00:00:00:00:06:05 1 matchSrcMac 00:00:c0:a8:08:05 matchDstMac 00:00:c0:a8:06:05
-189 ps_95_1 00:00:00:00:00:00:06:06 1 00:00:00:00:00:00:08:06 1 matchSrcMac 00:00:c0:a8:06:06 matchDstMac 00:00:c0:a8:08:06
-190 ps_95_2 00:00:00:00:00:00:08:06 1 00:00:00:00:00:00:06:06 1 matchSrcMac 00:00:c0:a8:08:06 matchDstMac 00:00:c0:a8:06:06
-191 ps_96_1 00:00:00:00:00:00:06:07 1 00:00:00:00:00:00:08:07 1 matchSrcMac 00:00:c0:a8:06:07 matchDstMac 00:00:c0:a8:08:07
-192 ps_96_2 00:00:00:00:00:00:08:07 1 00:00:00:00:00:00:06:07 1 matchSrcMac 00:00:c0:a8:08:07 matchDstMac 00:00:c0:a8:06:07
-193 ps_97_1 00:00:00:00:00:00:06:08 1 00:00:00:00:00:00:08:08 1 matchSrcMac 00:00:c0:a8:06:08 matchDstMac 00:00:c0:a8:08:08
-194 ps_97_2 00:00:00:00:00:00:08:08 1 00:00:00:00:00:00:06:08 1 matchSrcMac 00:00:c0:a8:08:08 matchDstMac 00:00:c0:a8:06:08
-195 ps_98_1 00:00:00:00:00:00:06:09 1 00:00:00:00:00:00:08:09 1 matchSrcMac 00:00:c0:a8:06:09 matchDstMac 00:00:c0:a8:08:09
-196 ps_98_2 00:00:00:00:00:00:08:09 1 00:00:00:00:00:00:06:09 1 matchSrcMac 00:00:c0:a8:08:09 matchDstMac 00:00:c0:a8:06:09
-197 ps_99_1 00:00:00:00:00:00:06:0a 1 00:00:00:00:00:00:08:0a 1 matchSrcMac 00:00:c0:a8:06:0a matchDstMac 00:00:c0:a8:08:0a
-198 ps_99_2 00:00:00:00:00:00:08:0a 1 00:00:00:00:00:00:06:0a 1 matchSrcMac 00:00:c0:a8:08:0a matchDstMac 00:00:c0:a8:06:0a
-199 ps_100_1 00:00:00:00:00:00:06:0b 1 00:00:00:00:00:00:08:0b 1 matchSrcMac 00:00:c0:a8:06:0b matchDstMac 00:00:c0:a8:08:0b
-200 ps_100_2 00:00:00:00:00:00:08:0b 1 00:00:00:00:00:00:06:0b 1 matchSrcMac 00:00:c0:a8:08:0b matchDstMac 00:00:c0:a8:06:0b
+21 ps_11_1 00:00:00:00:00:00:02:0c 1 00:00:00:00:00:00:03:0c 1 matchSrcMac 00:00:c0:a8:02:0c matchDstMac 00:00:c0:a8:03:0c
+22 ps_11_2 00:00:00:00:00:00:03:0c 1 00:00:00:00:00:00:02:0c 1 matchSrcMac 00:00:c0:a8:03:0c matchDstMac 00:00:c0:a8:02:0c
+23 ps_12_1 00:00:00:00:00:00:02:0d 1 00:00:00:00:00:00:03:0d 1 matchSrcMac 00:00:c0:a8:02:0d matchDstMac 00:00:c0:a8:03:0d
+24 ps_12_2 00:00:00:00:00:00:03:0d 1 00:00:00:00:00:00:02:0d 1 matchSrcMac 00:00:c0:a8:03:0d matchDstMac 00:00:c0:a8:02:0d
+25 ps_13_1 00:00:00:00:00:00:02:0e 1 00:00:00:00:00:00:03:0e 1 matchSrcMac 00:00:c0:a8:02:0e matchDstMac 00:00:c0:a8:03:0e
+26 ps_13_2 00:00:00:00:00:00:03:0e 1 00:00:00:00:00:00:02:0e 1 matchSrcMac 00:00:c0:a8:03:0e matchDstMac 00:00:c0:a8:02:0e
+27 ps_14_1 00:00:00:00:00:00:02:0f 1 00:00:00:00:00:00:03:0f 1 matchSrcMac 00:00:c0:a8:02:0f matchDstMac 00:00:c0:a8:03:0f
+28 ps_14_2 00:00:00:00:00:00:03:0f 1 00:00:00:00:00:00:02:0f 1 matchSrcMac 00:00:c0:a8:03:0f matchDstMac 00:00:c0:a8:02:0f
+29 ps_15_1 00:00:00:00:00:00:02:10 1 00:00:00:00:00:00:03:10 1 matchSrcMac 00:00:c0:a8:02:10 matchDstMac 00:00:c0:a8:03:10
+30 ps_15_2 00:00:00:00:00:00:03:10 1 00:00:00:00:00:00:02:10 1 matchSrcMac 00:00:c0:a8:03:10 matchDstMac 00:00:c0:a8:02:10
+31 ps_16_1 00:00:00:00:00:00:02:11 1 00:00:00:00:00:00:03:11 1 matchSrcMac 00:00:c0:a8:02:11 matchDstMac 00:00:c0:a8:03:11
+32 ps_16_2 00:00:00:00:00:00:03:11 1 00:00:00:00:00:00:02:11 1 matchSrcMac 00:00:c0:a8:03:11 matchDstMac 00:00:c0:a8:02:11
+33 ps_17_1 00:00:00:00:00:00:02:12 1 00:00:00:00:00:00:03:12 1 matchSrcMac 00:00:c0:a8:02:12 matchDstMac 00:00:c0:a8:03:12
+34 ps_17_2 00:00:00:00:00:00:03:12 1 00:00:00:00:00:00:02:12 1 matchSrcMac 00:00:c0:a8:03:12 matchDstMac 00:00:c0:a8:02:12
+35 ps_18_1 00:00:00:00:00:00:02:13 1 00:00:00:00:00:00:03:13 1 matchSrcMac 00:00:c0:a8:02:13 matchDstMac 00:00:c0:a8:03:13
+36 ps_18_2 00:00:00:00:00:00:03:13 1 00:00:00:00:00:00:02:13 1 matchSrcMac 00:00:c0:a8:03:13 matchDstMac 00:00:c0:a8:02:13
+37 ps_19_1 00:00:00:00:00:00:02:14 1 00:00:00:00:00:00:03:14 1 matchSrcMac 00:00:c0:a8:02:14 matchDstMac 00:00:c0:a8:03:14
+38 ps_19_2 00:00:00:00:00:00:03:14 1 00:00:00:00:00:00:02:14 1 matchSrcMac 00:00:c0:a8:03:14 matchDstMac 00:00:c0:a8:02:14
+39 ps_20_1 00:00:00:00:00:00:02:15 1 00:00:00:00:00:00:03:15 1 matchSrcMac 00:00:c0:a8:02:15 matchDstMac 00:00:c0:a8:03:15
+40 ps_20_2 00:00:00:00:00:00:03:15 1 00:00:00:00:00:00:02:15 1 matchSrcMac 00:00:c0:a8:03:15 matchDstMac 00:00:c0:a8:02:15
+41 ps_21_1 00:00:00:00:00:00:02:16 1 00:00:00:00:00:00:03:16 1 matchSrcMac 00:00:c0:a8:02:16 matchDstMac 00:00:c0:a8:03:16
+42 ps_21_2 00:00:00:00:00:00:03:16 1 00:00:00:00:00:00:02:16 1 matchSrcMac 00:00:c0:a8:03:16 matchDstMac 00:00:c0:a8:02:16
+43 ps_22_1 00:00:00:00:00:00:02:17 1 00:00:00:00:00:00:03:17 1 matchSrcMac 00:00:c0:a8:02:17 matchDstMac 00:00:c0:a8:03:17
+44 ps_22_2 00:00:00:00:00:00:03:17 1 00:00:00:00:00:00:02:17 1 matchSrcMac 00:00:c0:a8:03:17 matchDstMac 00:00:c0:a8:02:17
+45 ps_23_1 00:00:00:00:00:00:02:18 1 00:00:00:00:00:00:03:18 1 matchSrcMac 00:00:c0:a8:02:18 matchDstMac 00:00:c0:a8:03:18
+46 ps_23_2 00:00:00:00:00:00:03:18 1 00:00:00:00:00:00:02:18 1 matchSrcMac 00:00:c0:a8:03:18 matchDstMac 00:00:c0:a8:02:18
+47 ps_24_1 00:00:00:00:00:00:02:19 1 00:00:00:00:00:00:03:19 1 matchSrcMac 00:00:c0:a8:02:19 matchDstMac 00:00:c0:a8:03:19
+48 ps_24_2 00:00:00:00:00:00:03:19 1 00:00:00:00:00:00:02:19 1 matchSrcMac 00:00:c0:a8:03:19 matchDstMac 00:00:c0:a8:02:19
+49 ps_25_1 00:00:00:00:00:00:02:02 1 00:00:00:00:00:00:04:02 1 matchSrcMac 00:00:c0:a8:02:02 matchDstMac 00:00:c0:a8:04:02
+50 ps_25_2 00:00:00:00:00:00:04:02 1 00:00:00:00:00:00:02:02 1 matchSrcMac 00:00:c0:a8:04:02 matchDstMac 00:00:c0:a8:02:02
+51 ps_26_1 00:00:00:00:00:00:02:03 1 00:00:00:00:00:00:04:03 1 matchSrcMac 00:00:c0:a8:02:03 matchDstMac 00:00:c0:a8:04:03
+52 ps_26_2 00:00:00:00:00:00:04:03 1 00:00:00:00:00:00:02:03 1 matchSrcMac 00:00:c0:a8:04:03 matchDstMac 00:00:c0:a8:02:03
+53 ps_27_1 00:00:00:00:00:00:02:04 1 00:00:00:00:00:00:04:04 1 matchSrcMac 00:00:c0:a8:02:04 matchDstMac 00:00:c0:a8:04:04
+54 ps_27_2 00:00:00:00:00:00:04:04 1 00:00:00:00:00:00:02:04 1 matchSrcMac 00:00:c0:a8:04:04 matchDstMac 00:00:c0:a8:02:04
+55 ps_28_1 00:00:00:00:00:00:02:05 1 00:00:00:00:00:00:04:05 1 matchSrcMac 00:00:c0:a8:02:05 matchDstMac 00:00:c0:a8:04:05
+56 ps_28_2 00:00:00:00:00:00:04:05 1 00:00:00:00:00:00:02:05 1 matchSrcMac 00:00:c0:a8:04:05 matchDstMac 00:00:c0:a8:02:05
+57 ps_29_1 00:00:00:00:00:00:02:06 1 00:00:00:00:00:00:04:06 1 matchSrcMac 00:00:c0:a8:02:06 matchDstMac 00:00:c0:a8:04:06
+58 ps_29_2 00:00:00:00:00:00:04:06 1 00:00:00:00:00:00:02:06 1 matchSrcMac 00:00:c0:a8:04:06 matchDstMac 00:00:c0:a8:02:06
+59 ps_30_1 00:00:00:00:00:00:02:07 1 00:00:00:00:00:00:04:07 1 matchSrcMac 00:00:c0:a8:02:07 matchDstMac 00:00:c0:a8:04:07
+60 ps_30_2 00:00:00:00:00:00:04:07 1 00:00:00:00:00:00:02:07 1 matchSrcMac 00:00:c0:a8:04:07 matchDstMac 00:00:c0:a8:02:07
+61 ps_31_1 00:00:00:00:00:00:02:08 1 00:00:00:00:00:00:04:08 1 matchSrcMac 00:00:c0:a8:02:08 matchDstMac 00:00:c0:a8:04:08
+62 ps_31_2 00:00:00:00:00:00:04:08 1 00:00:00:00:00:00:02:08 1 matchSrcMac 00:00:c0:a8:04:08 matchDstMac 00:00:c0:a8:02:08
+63 ps_32_1 00:00:00:00:00:00:02:09 1 00:00:00:00:00:00:04:09 1 matchSrcMac 00:00:c0:a8:02:09 matchDstMac 00:00:c0:a8:04:09
+64 ps_32_2 00:00:00:00:00:00:04:09 1 00:00:00:00:00:00:02:09 1 matchSrcMac 00:00:c0:a8:04:09 matchDstMac 00:00:c0:a8:02:09
+65 ps_33_1 00:00:00:00:00:00:02:0a 1 00:00:00:00:00:00:04:0a 1 matchSrcMac 00:00:c0:a8:02:0a matchDstMac 00:00:c0:a8:04:0a
+66 ps_33_2 00:00:00:00:00:00:04:0a 1 00:00:00:00:00:00:02:0a 1 matchSrcMac 00:00:c0:a8:04:0a matchDstMac 00:00:c0:a8:02:0a
+67 ps_34_1 00:00:00:00:00:00:02:0b 1 00:00:00:00:00:00:04:0b 1 matchSrcMac 00:00:c0:a8:02:0b matchDstMac 00:00:c0:a8:04:0b
+68 ps_34_2 00:00:00:00:00:00:04:0b 1 00:00:00:00:00:00:02:0b 1 matchSrcMac 00:00:c0:a8:04:0b matchDstMac 00:00:c0:a8:02:0b
+69 ps_35_1 00:00:00:00:00:00:02:0c 1 00:00:00:00:00:00:04:0c 1 matchSrcMac 00:00:c0:a8:02:0c matchDstMac 00:00:c0:a8:04:0c
+70 ps_35_2 00:00:00:00:00:00:04:0c 1 00:00:00:00:00:00:02:0c 1 matchSrcMac 00:00:c0:a8:04:0c matchDstMac 00:00:c0:a8:02:0c
+71 ps_36_1 00:00:00:00:00:00:02:0d 1 00:00:00:00:00:00:04:0d 1 matchSrcMac 00:00:c0:a8:02:0d matchDstMac 00:00:c0:a8:04:0d
+72 ps_36_2 00:00:00:00:00:00:04:0d 1 00:00:00:00:00:00:02:0d 1 matchSrcMac 00:00:c0:a8:04:0d matchDstMac 00:00:c0:a8:02:0d
+73 ps_37_1 00:00:00:00:00:00:02:0e 1 00:00:00:00:00:00:04:0e 1 matchSrcMac 00:00:c0:a8:02:0e matchDstMac 00:00:c0:a8:04:0e
+74 ps_37_2 00:00:00:00:00:00:04:0e 1 00:00:00:00:00:00:02:0e 1 matchSrcMac 00:00:c0:a8:04:0e matchDstMac 00:00:c0:a8:02:0e
+75 ps_38_1 00:00:00:00:00:00:02:0f 1 00:00:00:00:00:00:04:0f 1 matchSrcMac 00:00:c0:a8:02:0f matchDstMac 00:00:c0:a8:04:0f
+76 ps_38_2 00:00:00:00:00:00:04:0f 1 00:00:00:00:00:00:02:0f 1 matchSrcMac 00:00:c0:a8:04:0f matchDstMac 00:00:c0:a8:02:0f
+77 ps_39_1 00:00:00:00:00:00:02:10 1 00:00:00:00:00:00:04:10 1 matchSrcMac 00:00:c0:a8:02:10 matchDstMac 00:00:c0:a8:04:10
+78 ps_39_2 00:00:00:00:00:00:04:10 1 00:00:00:00:00:00:02:10 1 matchSrcMac 00:00:c0:a8:04:10 matchDstMac 00:00:c0:a8:02:10
+79 ps_40_1 00:00:00:00:00:00:02:11 1 00:00:00:00:00:00:04:11 1 matchSrcMac 00:00:c0:a8:02:11 matchDstMac 00:00:c0:a8:04:11
+80 ps_40_2 00:00:00:00:00:00:04:11 1 00:00:00:00:00:00:02:11 1 matchSrcMac 00:00:c0:a8:04:11 matchDstMac 00:00:c0:a8:02:11
+81 ps_41_1 00:00:00:00:00:00:02:12 1 00:00:00:00:00:00:04:12 1 matchSrcMac 00:00:c0:a8:02:12 matchDstMac 00:00:c0:a8:04:12
+82 ps_41_2 00:00:00:00:00:00:04:12 1 00:00:00:00:00:00:02:12 1 matchSrcMac 00:00:c0:a8:04:12 matchDstMac 00:00:c0:a8:02:12
+83 ps_42_1 00:00:00:00:00:00:02:13 1 00:00:00:00:00:00:04:13 1 matchSrcMac 00:00:c0:a8:02:13 matchDstMac 00:00:c0:a8:04:13
+84 ps_42_2 00:00:00:00:00:00:04:13 1 00:00:00:00:00:00:02:13 1 matchSrcMac 00:00:c0:a8:04:13 matchDstMac 00:00:c0:a8:02:13
+85 ps_43_1 00:00:00:00:00:00:02:14 1 00:00:00:00:00:00:04:14 1 matchSrcMac 00:00:c0:a8:02:14 matchDstMac 00:00:c0:a8:04:14
+86 ps_43_2 00:00:00:00:00:00:04:14 1 00:00:00:00:00:00:02:14 1 matchSrcMac 00:00:c0:a8:04:14 matchDstMac 00:00:c0:a8:02:14
+87 ps_44_1 00:00:00:00:00:00:02:15 1 00:00:00:00:00:00:04:15 1 matchSrcMac 00:00:c0:a8:02:15 matchDstMac 00:00:c0:a8:04:15
+88 ps_44_2 00:00:00:00:00:00:04:15 1 00:00:00:00:00:00:02:15 1 matchSrcMac 00:00:c0:a8:04:15 matchDstMac 00:00:c0:a8:02:15
+89 ps_45_1 00:00:00:00:00:00:02:16 1 00:00:00:00:00:00:04:16 1 matchSrcMac 00:00:c0:a8:02:16 matchDstMac 00:00:c0:a8:04:16
+90 ps_45_2 00:00:00:00:00:00:04:16 1 00:00:00:00:00:00:02:16 1 matchSrcMac 00:00:c0:a8:04:16 matchDstMac 00:00:c0:a8:02:16
+91 ps_46_1 00:00:00:00:00:00:02:17 1 00:00:00:00:00:00:04:17 1 matchSrcMac 00:00:c0:a8:02:17 matchDstMac 00:00:c0:a8:04:17
+92 ps_46_2 00:00:00:00:00:00:04:17 1 00:00:00:00:00:00:02:17 1 matchSrcMac 00:00:c0:a8:04:17 matchDstMac 00:00:c0:a8:02:17
+93 ps_47_1 00:00:00:00:00:00:02:18 1 00:00:00:00:00:00:04:18 1 matchSrcMac 00:00:c0:a8:02:18 matchDstMac 00:00:c0:a8:04:18
+94 ps_47_2 00:00:00:00:00:00:04:18 1 00:00:00:00:00:00:02:18 1 matchSrcMac 00:00:c0:a8:04:18 matchDstMac 00:00:c0:a8:02:18
+95 ps_48_1 00:00:00:00:00:00:02:19 1 00:00:00:00:00:00:04:19 1 matchSrcMac 00:00:c0:a8:02:19 matchDstMac 00:00:c0:a8:04:19
+96 ps_48_2 00:00:00:00:00:00:04:19 1 00:00:00:00:00:00:02:19 1 matchSrcMac 00:00:c0:a8:04:19 matchDstMac 00:00:c0:a8:02:19
+97 ps_49_1 00:00:00:00:00:00:03:02 1 00:00:00:00:00:00:04:02 1 matchSrcMac 00:00:c0:a8:03:02 matchDstMac 00:00:c0:a8:04:02
+98 ps_49_2 00:00:00:00:00:00:04:02 1 00:00:00:00:00:00:03:02 1 matchSrcMac 00:00:c0:a8:04:02 matchDstMac 00:00:c0:a8:03:02
+99 ps_50_1 00:00:00:00:00:00:03:03 1 00:00:00:00:00:00:04:03 1 matchSrcMac 00:00:c0:a8:03:03 matchDstMac 00:00:c0:a8:04:03
+100 ps_50_2 00:00:00:00:00:00:04:03 1 00:00:00:00:00:00:03:03 1 matchSrcMac 00:00:c0:a8:04:03 matchDstMac 00:00:c0:a8:03:03
+101 ps_51_1 00:00:00:00:00:00:03:04 1 00:00:00:00:00:00:04:04 1 matchSrcMac 00:00:c0:a8:03:04 matchDstMac 00:00:c0:a8:04:04
+102 ps_51_2 00:00:00:00:00:00:04:04 1 00:00:00:00:00:00:03:04 1 matchSrcMac 00:00:c0:a8:04:04 matchDstMac 00:00:c0:a8:03:04
+103 ps_52_1 00:00:00:00:00:00:03:05 1 00:00:00:00:00:00:04:05 1 matchSrcMac 00:00:c0:a8:03:05 matchDstMac 00:00:c0:a8:04:05
+104 ps_52_2 00:00:00:00:00:00:04:05 1 00:00:00:00:00:00:03:05 1 matchSrcMac 00:00:c0:a8:04:05 matchDstMac 00:00:c0:a8:03:05
+105 ps_53_1 00:00:00:00:00:00:03:06 1 00:00:00:00:00:00:04:06 1 matchSrcMac 00:00:c0:a8:03:06 matchDstMac 00:00:c0:a8:04:06
+106 ps_53_2 00:00:00:00:00:00:04:06 1 00:00:00:00:00:00:03:06 1 matchSrcMac 00:00:c0:a8:04:06 matchDstMac 00:00:c0:a8:03:06
+107 ps_54_1 00:00:00:00:00:00:03:07 1 00:00:00:00:00:00:04:07 1 matchSrcMac 00:00:c0:a8:03:07 matchDstMac 00:00:c0:a8:04:07
+108 ps_54_2 00:00:00:00:00:00:04:07 1 00:00:00:00:00:00:03:07 1 matchSrcMac 00:00:c0:a8:04:07 matchDstMac 00:00:c0:a8:03:07
+109 ps_55_1 00:00:00:00:00:00:03:08 1 00:00:00:00:00:00:04:08 1 matchSrcMac 00:00:c0:a8:03:08 matchDstMac 00:00:c0:a8:04:08
+110 ps_55_2 00:00:00:00:00:00:04:08 1 00:00:00:00:00:00:03:08 1 matchSrcMac 00:00:c0:a8:04:08 matchDstMac 00:00:c0:a8:03:08
+111 ps_56_1 00:00:00:00:00:00:03:09 1 00:00:00:00:00:00:04:09 1 matchSrcMac 00:00:c0:a8:03:09 matchDstMac 00:00:c0:a8:04:09
+112 ps_56_2 00:00:00:00:00:00:04:09 1 00:00:00:00:00:00:03:09 1 matchSrcMac 00:00:c0:a8:04:09 matchDstMac 00:00:c0:a8:03:09
+113 ps_57_1 00:00:00:00:00:00:03:0a 1 00:00:00:00:00:00:04:0a 1 matchSrcMac 00:00:c0:a8:03:0a matchDstMac 00:00:c0:a8:04:0a
+114 ps_57_2 00:00:00:00:00:00:04:0a 1 00:00:00:00:00:00:03:0a 1 matchSrcMac 00:00:c0:a8:04:0a matchDstMac 00:00:c0:a8:03:0a
+115 ps_58_1 00:00:00:00:00:00:03:0b 1 00:00:00:00:00:00:04:0b 1 matchSrcMac 00:00:c0:a8:03:0b matchDstMac 00:00:c0:a8:04:0b
+116 ps_58_2 00:00:00:00:00:00:04:0b 1 00:00:00:00:00:00:03:0b 1 matchSrcMac 00:00:c0:a8:04:0b matchDstMac 00:00:c0:a8:03:0b
+117 ps_59_1 00:00:00:00:00:00:03:0c 1 00:00:00:00:00:00:04:0c 1 matchSrcMac 00:00:c0:a8:03:0c matchDstMac 00:00:c0:a8:04:0c
+118 ps_59_2 00:00:00:00:00:00:04:0c 1 00:00:00:00:00:00:03:0c 1 matchSrcMac 00:00:c0:a8:04:0c matchDstMac 00:00:c0:a8:03:0c
+119 ps_60_1 00:00:00:00:00:00:03:0d 1 00:00:00:00:00:00:04:0d 1 matchSrcMac 00:00:c0:a8:03:0d matchDstMac 00:00:c0:a8:04:0d
+120 ps_60_2 00:00:00:00:00:00:04:0d 1 00:00:00:00:00:00:03:0d 1 matchSrcMac 00:00:c0:a8:04:0d matchDstMac 00:00:c0:a8:03:0d
+121 ps_61_1 00:00:00:00:00:00:03:0e 1 00:00:00:00:00:00:04:0e 1 matchSrcMac 00:00:c0:a8:03:0e matchDstMac 00:00:c0:a8:04:0e
+122 ps_61_2 00:00:00:00:00:00:04:0e 1 00:00:00:00:00:00:03:0e 1 matchSrcMac 00:00:c0:a8:04:0e matchDstMac 00:00:c0:a8:03:0e
+123 ps_62_1 00:00:00:00:00:00:03:0f 1 00:00:00:00:00:00:04:0f 1 matchSrcMac 00:00:c0:a8:03:0f matchDstMac 00:00:c0:a8:04:0f
+124 ps_62_2 00:00:00:00:00:00:04:0f 1 00:00:00:00:00:00:03:0f 1 matchSrcMac 00:00:c0:a8:04:0f matchDstMac 00:00:c0:a8:03:0f
+125 ps_63_1 00:00:00:00:00:00:03:10 1 00:00:00:00:00:00:04:10 1 matchSrcMac 00:00:c0:a8:03:10 matchDstMac 00:00:c0:a8:04:10
+126 ps_63_2 00:00:00:00:00:00:04:10 1 00:00:00:00:00:00:03:10 1 matchSrcMac 00:00:c0:a8:04:10 matchDstMac 00:00:c0:a8:03:10
+127 ps_64_1 00:00:00:00:00:00:03:11 1 00:00:00:00:00:00:04:11 1 matchSrcMac 00:00:c0:a8:03:11 matchDstMac 00:00:c0:a8:04:11
+128 ps_64_2 00:00:00:00:00:00:04:11 1 00:00:00:00:00:00:03:11 1 matchSrcMac 00:00:c0:a8:04:11 matchDstMac 00:00:c0:a8:03:11
+129 ps_65_1 00:00:00:00:00:00:03:12 1 00:00:00:00:00:00:04:12 1 matchSrcMac 00:00:c0:a8:03:12 matchDstMac 00:00:c0:a8:04:12
+130 ps_65_2 00:00:00:00:00:00:04:12 1 00:00:00:00:00:00:03:12 1 matchSrcMac 00:00:c0:a8:04:12 matchDstMac 00:00:c0:a8:03:12
+131 ps_66_1 00:00:00:00:00:00:03:13 1 00:00:00:00:00:00:04:13 1 matchSrcMac 00:00:c0:a8:03:13 matchDstMac 00:00:c0:a8:04:13
+132 ps_66_2 00:00:00:00:00:00:04:13 1 00:00:00:00:00:00:03:13 1 matchSrcMac 00:00:c0:a8:04:13 matchDstMac 00:00:c0:a8:03:13
+133 ps_67_1 00:00:00:00:00:00:03:14 1 00:00:00:00:00:00:04:14 1 matchSrcMac 00:00:c0:a8:03:14 matchDstMac 00:00:c0:a8:04:14
+134 ps_67_2 00:00:00:00:00:00:04:14 1 00:00:00:00:00:00:03:14 1 matchSrcMac 00:00:c0:a8:04:14 matchDstMac 00:00:c0:a8:03:14
+135 ps_68_1 00:00:00:00:00:00:03:15 1 00:00:00:00:00:00:04:15 1 matchSrcMac 00:00:c0:a8:03:15 matchDstMac 00:00:c0:a8:04:15
+136 ps_68_2 00:00:00:00:00:00:04:15 1 00:00:00:00:00:00:03:15 1 matchSrcMac 00:00:c0:a8:04:15 matchDstMac 00:00:c0:a8:03:15
+137 ps_69_1 00:00:00:00:00:00:03:16 1 00:00:00:00:00:00:04:16 1 matchSrcMac 00:00:c0:a8:03:16 matchDstMac 00:00:c0:a8:04:16
+138 ps_69_2 00:00:00:00:00:00:04:16 1 00:00:00:00:00:00:03:16 1 matchSrcMac 00:00:c0:a8:04:16 matchDstMac 00:00:c0:a8:03:16
+139 ps_70_1 00:00:00:00:00:00:03:17 1 00:00:00:00:00:00:04:17 1 matchSrcMac 00:00:c0:a8:03:17 matchDstMac 00:00:c0:a8:04:17
+140 ps_70_2 00:00:00:00:00:00:04:17 1 00:00:00:00:00:00:03:17 1 matchSrcMac 00:00:c0:a8:04:17 matchDstMac 00:00:c0:a8:03:17
+141 ps_71_1 00:00:00:00:00:00:03:18 1 00:00:00:00:00:00:04:18 1 matchSrcMac 00:00:c0:a8:03:18 matchDstMac 00:00:c0:a8:04:18
+142 ps_71_2 00:00:00:00:00:00:04:18 1 00:00:00:00:00:00:03:18 1 matchSrcMac 00:00:c0:a8:04:18 matchDstMac 00:00:c0:a8:03:18
+143 ps_72_1 00:00:00:00:00:00:03:19 1 00:00:00:00:00:00:04:19 1 matchSrcMac 00:00:c0:a8:03:19 matchDstMac 00:00:c0:a8:04:19
+144 ps_72_2 00:00:00:00:00:00:04:19 1 00:00:00:00:00:00:03:19 1 matchSrcMac 00:00:c0:a8:04:19 matchDstMac 00:00:c0:a8:03:19
diff --git a/web/floodlight/js/controller-status.js b/web/js/controller-status.js
similarity index 100%
rename from web/floodlight/js/controller-status.js
rename to web/js/controller-status.js
diff --git a/web/floodlight/js/jquery-1.7.2.min.js b/web/js/jquery-1.7.2.min.js
similarity index 100%
rename from web/floodlight/js/jquery-1.7.2.min.js
rename to web/js/jquery-1.7.2.min.js
diff --git a/web/floodlight/js/onos-topology-route.js b/web/js/onos-topology-route.js
similarity index 100%
rename from web/floodlight/js/onos-topology-route.js
rename to web/js/onos-topology-route.js
diff --git a/web/floodlight/js/onos-topology.js b/web/js/onos-topology.js
similarity index 100%
rename from web/floodlight/js/onos-topology.js
rename to web/js/onos-topology.js
diff --git a/web/onos-topology.html b/web/onos-topology.html
index d72c0e1..5834521 100644
--- a/web/onos-topology.html
+++ b/web/onos-topology.html
@@ -24,7 +24,7 @@
<button id="more">more</button>
<button id="less">less</button>
--!>
-<svg width="4in" height="2in"
+<svg width="0.1in" height="0.1in"
viewBox="0 0 4000 2000" version="1.1"
xmlns="http://www.w3.org/2000/svg">
<defs>