Using latest version of mininet

refs: #2851

Change-Id: Ica4936cb98245a0b1a22d8ceada4e7a0f6dbddc8
diff --git a/.gitignore b/.gitignore
index 35d7ca8..be51b16 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,21 +1,14 @@
-*.pyc
-mnexec
-*.pyc
-*~
-*.1
-*.xcodeproj
-*.xcworkspace
-\#*\#
-mininet.egg-info
+Mini_NDN.egg-info
 build
 dist
 doc/html
 doc/latex
-trunk
-data
-trash
-measures
-debian
-.fuse*
-.project
-.pydev*
+NFD
+NLSR
+crypto
+mininet
+ndn-cxx
+ndn-tools
+openflow
+examples
+util
diff --git a/INSTALL.md b/INSTALL.md
index 9f76b26..22f330d 100644
--- a/INSTALL.md
+++ b/INSTALL.md
@@ -10,7 +10,7 @@
 
 ### Installing NDN
 
-Each node in **Mini-NDN** will run the official implementation of NDN. Let's get it.
+Each node in **Mini-NDN** will run the official implementation of NDN. The following dependencies are needed:
 
 Mini-NDN uses NFD, NLSR, and ndn-tlv-ping.
 
@@ -20,45 +20,33 @@
 To install NLSR:
 http://named-data.net/doc/NLSR/current/INSTALL.html
 
-To install ndn-tlv-ping:
-https://github.com/named-data/ndn-tlv-ping
+To install ndn-tools:
+https://github.com/named-data/ndn-tools
 
-### Downloading and installing **Mini-NDN**
+### Installing Mininet
 
-If you don't have it yet, you'll need to have _git_ installed first. In Ubuntu, that would be:
+**Mini-NDN** is based on Mininet. To install Mininet:
+https://github.com/mininet/mininet/INSTALL
 
-    sudo apt-get install git
+### Installing **Mini-NDN**
 
-Now, let's get the source code of **Mini-NDN**.
-Go to your home directory and use the following command:
+If you have all the dependencies installed simply clone this repository and run:
 
-    git clone https://github.com/named-data/mini-ndn
+    sudo ./install.sh -i
 
-As a result, there will be a directory named _mini-ndn_ in your home directory, containing all the source code.
+else if you don't have the dependencies:
 
-Still in your home directory, use the utility install script with _-fnv_ options:
-
-    sudo ./mini-ndn/util/install.sh -fnv
-
-where
--f: install open(F)low
--n: install mini(N)et dependencies + core files
--v: install open (V)switch
-
-Prerequisite packages will be downloaded and installed during the process.
+    sudo ./install.sh -mrfti
 
 ### Verification
 
-Once everything is installed, the following command can be issued for verification from the home folder:
+Once everything is installed, the following command can be issued for verification
 
-    sudo minindn --pingall 50 --ctime 180 mini-ndn/ndn_utils/hyperbolic_conf_file/minindn.caida.conf
-
-where:
---pingall: Will schedule and collect the specified number of pings from each node to every other node
---ctime: Convergence time for NLSR, provide according to the size of the topology
-
-Note: The configuration file contains hyperbolic coordinates but hyperbolic routing will only be
-activated if --hr is provided
+    sudo minindn --pingall 50 --ctime 180 ndn_utils/hyperbolic_conf_file/minindn.caida.conf
 
 All the ping logs will be stored under /tmp/node-name/ping-data and the command will provide a
 command line interface at the end.
+
+When the "mininet>" CLI prompt appears, press CTRL+D to terminate the experiment.
+Then, execute `ls /tmp/*/ping-data/*.txt | wc -l`, and expect to see "90".
+Execute `cat /tmp/*/ping-data/*.txt | grep loss`, and expect to see "0% packet loss" on every line.
diff --git a/INSTALL_mininet b/INSTALL_mininet
deleted file mode 100644
index d3e4695..0000000
--- a/INSTALL_mininet
+++ /dev/null
@@ -1,123 +0,0 @@
-
-Mininet Installation/Configuration Notes
-----------------------------------------
-
-Mininet 2.0.0
----
-
-The supported installation methods for Mininet are 1) using a
-pre-built VM image, and 2) native installation on Ubuntu. You can also
-easily create your own Mininet VM image (4).
-
-(Other distributions may be supported in the future - if you would
-like to contribute an installation script, we would welcome it!)
-
-1. Easiest "installation" - use our pre-built VM image!
-
-   The easiest way to get Mininet running is to start with one of our
-   pre-built virtual machine images from <http://openflow.org/mininet>
-
-   Boot up the VM image, log in, and follow the instructions on the
-   Mininet web site.
-
-   One advantage of using the VM image is that it doesn't mess with
-   your native OS installation or damage it in any way.
-
-   Although a single Mininet instance can simulate multiple networks
-   with multiple controllers, only one Mininet instance may currently
-   be run at a time, and Mininet requires root access in the machine
-   it's running on.  Therefore, if you have a multiuser system, you
-   may wish to consider running Mininet in a VM.
-
-2. Next-easiest option: use our Ubuntu package!
-
-   To install Mininet itself (i.e. `mn` and the Python API) on Ubuntu
-   12.10+:
-
-        sudo apt-get install mininet
-
-   Note: if you are upgrading from an older version of Mininet, make
-   sure you remove the old OVS from `/usr/local`:
-
-        sudo rm /usr/local/bin/ovs*
-        sudo rm /usr/local/sbin/ovs*
-
-3. Native installation from source on Ubuntu 11.10+
-
-   If you're reading this, you've probably already done so, but the
-   command to download the Mininet source code is:
-
-        git clone git://github.com/mininet/mininet.git
-
-   If you are running Ubuntu, you may be able to use our handy
-   `install.sh` script, which is in `mininet/util`.
-
-   *WARNING: USE AT YOUR OWN RISK!*
-
-   `install.sh` is a bit intrusive and may possibly damage your OS
-   and/or home directory, by creating/modifying several directories
-   such as `mininet`, `openflow`, `oftest`, `pox`, or `noxcosre`.
-   Although we hope it won't do anything completely terrible, you may
-   want to look at the script before you run it, and you should make
-   sure your system and home directory are backed up just in case!
-
-   To install Mininet itself, the OpenFlow reference implementation, and
-   Open vSwitch, you may use:
-
-        mininet/util/install.sh -fnv
-
-   This should be reasonably quick, and the following command should
-   work after the installation:
-
-        sudo mn --test pingall
-
-   To install ALL of the software which we use for OpenFlow tutorials,
-   including POX, the OpenFlow WireShark dissector, the `oftest`
-   framework, and other potentially useful software (and to add some
-   stuff to `/etc/sysctl.conf` which may or may not be useful) you may
-   use:
-
-        mininet/util/install.sh -a
-
-   This takes about 4 minutes on our test system.
-
-4. Creating your own Mininet/OpenFlow tutorial VM
-
-   Creating your own Ubuntu Mininet VM for use with the OpenFlow tutorial
-   is easy! First, create a new Ubuntu VM. Next, run two commands in it:
-
-        wget https://raw.github.com/mininet/mininet/master/util/vm/install-mininet-vm.sh
-        time install-mininet-vm.sh
-
-   Finally, verify that Mininet is installed and working in the VM:
-
-        sudo mn --test pingall
-
-5. Installation on other Linux distributions
-
-   Although we don't support other Linux distributions directly, it
-   should be possible to install and run Mininet with some degree of
-   manual effort.
-
-   In general, you must have:
-
-   * A Linux kernel compiled with network namespace support enabled
-
-   * An OpenFlow implementation (either the reference user or kernel
-     space implementations, or Open vSwitch.) Appropriate kernel
-     modules (e.g. tun and ofdatapath for the reference kernel
-     implementation) must be loaded.
-
-   * Python, `bash`, `ping`, `iperf`, etc.`
-
-   * Root privileges (required for network device access)
-
-   We encourage contribution of patches to the `install.sh` script to
-   support other Linux distributions.
-
-
-Good luck!
-
-Mininet Team
-
----
diff --git a/LICENSE b/LICENSE
deleted file mode 100644
index 704d157..0000000
--- a/LICENSE
+++ /dev/null
@@ -1,33 +0,0 @@
-Mininet 2.0.0 License
-
-Copyright (c) 2012 Open Networking Laboratory
-Copyright (c) 2009-2012 Bob Lantz and The Board of Trustees of
-The Leland Stanford Junior University
-
-Original authors: Bob Lantz and Brandon Heller
-
-We are making Mininet available for public use and benefit with the
-expectation that others will use, modify and enhance the Software and
-contribute those enhancements back to the community. However, since we
-would like to make the Software available for broadest use, with as few
-restrictions as possible permission is hereby granted, free of charge, to
-any person obtaining a copy of this Software to deal in the Software
-under the copyrights without restriction, including without limitation
-the rights to use, copy, modify, merge, publish, distribute, sublicense,
-and/or sell copies of the Software, and to permit persons to whom the
-Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included
-in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-The name and trademarks of copyright holder(s) may NOT be used in
-advertising or publicity pertaining to the Software or any derivatives
-without specific, written prior permission.
diff --git a/Makefile b/Makefile
deleted file mode 100644
index 9aea747..0000000
--- a/Makefile
+++ /dev/null
@@ -1,66 +0,0 @@
-MININET = mininet/*.py
-TEST = mininet/test/*.py
-EXAMPLES = examples/*.py
-MN = bin/mn
-BIN = $(MN)
-NDN = ndn/**/*.py
-PYSRC = $(MININET) $(TEST) $(EXAMPLES) $(BIN) $(NDN)
-MNEXEC = mnexec
-MANPAGES = mn.1 mnexec.1
-P8IGN = E251,E201,E302,E202
-BINDIR = /usr/bin
-MANDIR = /usr/share/man/man1
-DOCDIRS = doc/html doc/latex
-PDF = doc/latex/refman.pdf
-
-all: codecheck test
-
-clean:
-	rm -rf build dist *.egg-info *.pyc $(MNEXEC) $(MANPAGES) $(DOCDIRS)
-
-codecheck: $(PYSRC)
-	-echo "Running code check"
-	util/versioncheck.py
-	pyflakes $(PYSRC)
-	pylint --rcfile=.pylint $(PYSRC)
-	pep8 --repeat --ignore=$(P8IGN) $(PYSRC)
-
-errcheck: $(PYSRC)
-	-echo "Running check for errors only"
-	pyflakes $(PYSRC)
-	pylint -E --rcfile=.pylint $(PYSRC)
-
-test: $(MININET) $(TEST)
-	-echo "Running tests"
-	mininet/test/test_nets.py
-	mininet/test/test_hifi.py
-
-mnexec: mnexec.c $(MN) mininet/net.py
-	cc $(CFLAGS) $(LDFLAGS) -DVERSION=\"`PYTHONPATH=. $(MN) --version`\" $< -o $@
-
-install: $(MNEXEC) $(MANPAGES)
-	install $(MNEXEC) $(BINDIR)
-	install $(MANPAGES) $(MANDIR)
-	python setup.py install
-
-develop: $(MNEXEC) $(MANPAGES)
-	# Perhaps we should link these as well
-	install $(MNEXEC) $(BINDIR)
-	install $(MANPAGES) $(MANDIR)
-	python setup.py develop
-
-man: $(MANPAGES)
-
-mn.1: $(MN)
-	PYTHONPATH=. help2man -N -n "create a Mininet network." \
-	--no-discard-stderr $< -o $@
-
-mnexec.1: mnexec
-	help2man -N -n "execution utility for Mininet." \
-	-h "-h" -v "-v" --no-discard-stderr ./$< -o $@ 
-
-.PHONY: doc
-
-doc: man
-	doxygen doc/doxygen.cfg
-	make -C doc/latex
diff --git a/README_mininet.md b/README_mininet.md
deleted file mode 100644
index cf0e8b8..0000000
--- a/README_mininet.md
+++ /dev/null
@@ -1,134 +0,0 @@
-
-Mininet: Rapid Prototyping for Software Defined Networks
-========================================================
-
-*The best way to emulate almost any network on your laptop!*
-
-Version 2.0.0
-
-### What is Mininet?
-
-Mininet emulates a complete network of hosts, links, and switches
-on a single machine.  To create a sample two-host, one-switch network,
-just run:
-
-  `sudo mn`
-
-Mininet is useful for interactive development, testing, and demos,
-especially those using OpenFlow and SDN.  OpenFlow-based network
-controllers prototyped in Mininet can usually be transferred to
-hardware with minimal changes for full line-rate execution.
-
-### How does it work?
-
-Mininet creates virtual networks using process-based virtualization
-and network namespaces - features that are available in recent Linux
-kernels.  In Mininet, hosts are emulated as `bash` processes running in
-a network namespace, so any code that would normally run on a Linux
-server (like a web server or client program) should run just fine
-within a Mininet "Host".  The Mininet "Host" will have its own private
-network interface and can only see its own processes.  Switches in
-Mininet are software-based switches like Open vSwitch or the OpenFlow
-reference switch.  Links are virtual ethernet pairs, which live in the
-Linux kernel and connect our emulated switches to emulated hosts
-(processes).
-
-### Features
-
-Mininet includes:
-
-* A command-line launcher (`mn`) to instantiate networks.
-
-* A handy Python API for creating networks of varying sizes and
-  topologies.
-
-* Examples (in the `examples/` directory) to help you get started.
-
-* Full API documentation via Python `help()` docstrings, as well as
-  the ability to generate PDF/HTML documentation with `make doc`.
-
-* Parametrized topologies (`Topo` subclasses) using the Mininet
-  object.  For example, a tree network may be created with the
-  command:
-
-  `mn --topo tree,depth=2,fanout=3`
-
-* A command-line interface (`CLI` class) which provides useful
-  diagnostic commands (like `iperf` and `ping`), as well as the
-  ability to run a command to a node. For example,
-
-  `mininet> h11 ifconfig -a`
-
-  tells host h11 to run the command `ifconfig -a`
-
-* A "cleanup" command to get rid of junk (interfaces, processes, files
-  in /tmp, etc.) which might be left around by Mininet or Linux. Try
-  this if things stop working!
-
-  `mn -c`
-
-### New features in 2.0.0
-
-Mininet 2.0.0 is a major upgrade and provides
-a number of enhancements and new features, including:
-
-* "Mininet-HiFi" functionality:
-
-    * Link bandwidth limits using `tc` (`TCIntf` and `TCLink` classes)
-
-    * CPU isolation and bandwidth limits (`CPULimitedHost` class)
-
-* Support for Open vSwitch 1.4+ (including Ubuntu OVS packages)
-
-* Debian packaging (and `apt-get install mininet` in Ubuntu 12.10)
-
-* First-class Interface (`Intf`) and Link (`Link`) classes for easier
-  extensibility
-
-* An upgraded Topology (`Topo`) class which supports node and link
-  customization
-
-* Man pages for the `mn` and `mnexec` utilities.
-
-[Since the API (most notably the topology) has changed, existing code
-that runs in Mininet 1.0 will need to be changed to run with Mininet
-2.0. This is the primary reason for the major version number change.]
-
-### Installation
-
-See `INSTALL` for installation instructions and details.
-
-### Documentation
-
-In addition to the API documentation (`make doc`), much useful
-information, including a Mininet walkthrough and an introduction
-to the Python API, is available on the
-[Mininet Web Site](http://openflow.org/mininet).
-There is also a wiki which you are encouraged to read and to
-contribute to, particularly the Frequently Asked Questions (FAQ.)
-
-### Support
-
-Mininet is community-supported. We encourage you to join the
-Mininet mailing list, `mininet-discuss` at:
-
-<https://mailman.stanford.edu/mailman/listinfo/mininet-discuss>
-
-### Contributing
-
-Mininet is an open-source project and is currently hosted at
-<https://github.com/mininet>. You are encouraged to download the code,
-examine it, modify it, and submit bug reports, bug fixes, feature
-requests, and enhancements!
-
-Best wishes, and we look forward to seeing what you can do with
-Mininet to change the networking world!
-
-### Credits
-
-The Mininet Team:
-
-* Bob Lantz
-* Brandon Heller
-* Nikhil Handigol
-* Vimal Jeyakumar
diff --git a/bin/minindn b/bin/minindn
index 1c92097..952c568 100755
--- a/bin/minindn
+++ b/bin/minindn
@@ -5,12 +5,13 @@
 from mininet.log import setLogLevel, output, info
 from mininet.cli import CLI
 from mininet.link import TCLink
-from mininet.conf_parser import parse_hosts, parse_links
+from mininet.util import ipStr, ipParse
 
 from ndn.experiments.multiple_failure_experiment import MultipleFailureExperiment
 from ndn.experiments.pingall_experiment import PingallExperiment
 from ndn.experiments.failure_experiment import FailureExperiment
 from ndn.ndn_host import NdnHost, CpuLimitedNdnHost
+from ndn.conf_parser import parse_hosts, parse_links
 
 import os.path, time
 import optparse
@@ -114,15 +115,12 @@
 def execute(template_file='minindn.conf', testbed=False, pingall=None, ctime=None, hr=False, faces=3, failure=False, isMultipleFailure=False, isCliEnabled=True):
     "Create a network based on template_file"
 
-    home = expanduser("~")
-
     if template_file == '':
         template_file='minindn.conf'
 
     if os.path.exists(template_file) == False:
         info('No template file given and default template file minindn.conf not found. Exiting...\n')
         quit()
-
     topo = NdnTopo(template_file)
 
     t = datetime.datetime.now()
@@ -144,6 +142,22 @@
 
     net.start()
 
+    # Giving proper IPs to intf so neighbor nodes can communicate
+    # This is one way of giving connectivity, another way could be
+    # to insert a switch between each pair of neighbors
+    ndnNetBase = "1.0.0.0"
+    interfaces = []
+    for host in net.hosts:
+        for intf in host.intfList():
+            link = intf.link
+            node1, node2 = link.intf1.node, link.intf2.node
+            if link.intf1 not in interfaces and link.intf2 not in interfaces:
+                interfaces.append(link.intf1)
+                interfaces.append(link.intf2)
+                node1.setIP(ipStr(ipParse(ndnNetBase) + 1) + '/30', intf=link.intf1)
+                node2.setIP(ipStr(ipParse(ndnNetBase) + 2) + '/30', intf=link.intf2)
+                ndnNetBase = ipStr(ipParse(ndnNetBase) + 4)
+
     nodes = ""    # Used later to check prefix name in checkFIB
 
     # NLSR initialization
@@ -160,7 +174,7 @@
             host.nlsrParameters["hyperbolic-state"] = "on"
 
         # Generate NLSR configuration file
-        configGenerator = NlsrConfigGenerator(host, home)
+        configGenerator = NlsrConfigGenerator(host)
         configGenerator.createConfigFile()
 
         # Start NLSR
diff --git a/bin/minindnedit b/bin/minindnedit
index 70e0dce..8c56cfc 100755
--- a/bin/minindnedit
+++ b/bin/minindnedit
@@ -42,7 +42,7 @@
 from mininet.net import Mininet, VERSION
 from mininet.util import ipStr, netParse, ipAdd, quietRun
 from mininet.util import buildTopo
-from mininet.util import custom, customConstructor
+from mininet.util import custom
 from mininet.term import makeTerm, cleanUpScreens
 from mininet.node import Controller, RemoteController, NOX, OVSController
 from mininet.node import CPULimitedHost, Host, Node
diff --git a/examples/README b/examples/README
deleted file mode 100644
index dd71bea..0000000
--- a/examples/README
+++ /dev/null
@@ -1,102 +0,0 @@
-
-Mininet Examples
-
-These examples are intended to help you get started using
-Mininet's Python API.
-
----
-
-baresshd.py:
-
-This example uses Mininet's medium-level API to create an sshd
-process running in a namespace. Doesn't use OpenFlow.
-
-consoles.py:
-
-This example creates a grid of console windows, one for each node, 
-and allows interaction with and monitoring of each console, including
-graphical monitoring.
-
-controllers.py:
-
-This example creates a network and adds multiple controllers to it.
-
-cpu.py:
-
-This example tests iperf bandwidth for varying CPU limits.
-
-emptynet.py:
-
-This example demonstrates creating an empty network (i.e. with no
-topology object) and adding nodes to it.
-
-hwintf.py:
-
-This example shows how to add an interface (for example a real
-hardware interface) to a network after the network is created.
-
-limit.py:
-
-This example shows how to use link and CPU limits.
-
-linearbandwidth.py:
-
-This example shows how to create a custom topology programatically
-by subclassing Topo, and how to run a series of tests on it.
-
-miniedit.py:
-
-This example demonstrates creating a network via a graphical editor.
-
-multiping.py:
-
-This example demonstrates one method for 
-monitoring output from multiple hosts, using node.monitor().
-
-multipoll.py:
-
-This example demonstrates monitoring output files from multiple hosts.
-
-multitest.py:
-
-This example creates a network and runs multiple tests on it.
-
-popen.py:
-
-This example monitors a number of hosts using host.popen() and
-pmonitor().
-
-popenpoll.py:
-
-This example demonstrates monitoring output from multiple hosts using
-the node.popen() interface (which returns Popen objects) and pmonitor().
-
-scratchnet.py, scratchnetuser.py:
-
-These two examples demonstrate how to create a network by using the lowest-
-level Mininet functions. Generally the higher-level API is easier to use,
-but scratchnet shows what is going on behind the scenes.
-
-simpleperf.py:
-
-A simple example of configuring network and CPU bandwidth limits.
-
-sshd.py:
-
-This example shows how to run an sshd process in each host, allowing
-you to log in via ssh. This requires connecting the Mininet data network
-to an interface in the root namespace (generaly the control network
-already lives in the root namespace, so it does not need to be explicitly
-connected.)
-
-treeping64.py:
-
-This example creates a 64-host tree network, and attempts to check full
-connectivity using ping, for different switch/datapath types.
-
-tree1024.py:
-
-This example attempts to create a 1024-host network, and then runs the
-CLI on it. It may run into scalability limits, depending on available
-memory and sysctl configuration (see INSTALL.)
-
diff --git a/examples/baresshd.py b/examples/baresshd.py
deleted file mode 100644
index a714edb..0000000
--- a/examples/baresshd.py
+++ /dev/null
@@ -1,32 +0,0 @@
-#!/usr/bin/python
-
-"This example doesn't use OpenFlow, but attempts to run sshd in a namespace."
-
-from mininet.node import Host
-from mininet.util import ensureRoot
-
-ensureRoot()
-
-print "*** Creating nodes"
-h1 = Host( 'h1' )
-
-root = Host( 'root', inNamespace=False )
-
-print "*** Creating links"
-h1.linkTo( root )
-
-print h1
-
-print "*** Configuring nodes"
-h1.setIP( '10.0.0.1', 8 )
-root.setIP( '10.0.0.2', 8 )
-
-print "*** Creating banner file"
-f = open( '/tmp/%s.banner' % h1.name, 'w' )
-f.write( 'Welcome to %s at %s\n' % ( h1.name, h1.IP() ) )
-f.close()
-
-print "*** Running sshd"
-h1.cmd( '/usr/sbin/sshd -o "Banner /tmp/%s.banner"' % h1.name )
-
-print "*** You may now ssh into", h1.name, "at", h1.IP()
diff --git a/examples/consoles.py b/examples/consoles.py
deleted file mode 100644
index ea2e28d..0000000
--- a/examples/consoles.py
+++ /dev/null
@@ -1,456 +0,0 @@
-#!/usr/bin/python
-
-"""
-consoles.py: bring up a bunch of miniature consoles on a virtual network
-
-This demo shows how to monitor a set of nodes by using
-Node's monitor() and Tkinter's createfilehandler().
-
-We monitor nodes in a couple of ways:
-
-- First, each individual node is monitored, and its output is added
-  to its console window
-
-- Second, each time a console window gets iperf output, it is parsed
-  and accumulated. Once we have output for all consoles, a bar is
-  added to the bandwidth graph.
-
-The consoles also support limited interaction:
-
-- Pressing "return" in a console will send a command to it
-
-- Pressing the console's title button will open up an xterm
-
-Bob Lantz, April 2010
-
-"""
-
-import re
-
-from Tkinter import Frame, Button, Label, Text, Scrollbar, Canvas, Wm, READABLE
-
-from mininet.log import setLogLevel
-from mininet.topolib import TreeNet
-from mininet.term import makeTerms, cleanUpScreens
-from mininet.util import quietRun
-
-class Console( Frame ):
-    "A simple console on a host."
-
-    def __init__( self, parent, net, node, height=10, width=32, title='Node' ):
-        Frame.__init__( self, parent )
-
-        self.net = net
-        self.node = node
-        self.prompt = node.name + '# '
-        self.height, self.width, self.title = height, width, title
-
-        # Initialize widget styles
-        self.buttonStyle = { 'font': 'Monaco 7' }
-        self.textStyle = {
-            'font': 'Monaco 7',
-            'bg': 'black',
-            'fg': 'green',
-            'width': self.width,
-            'height': self.height,
-            'relief': 'sunken',
-            'insertbackground': 'green',
-            'highlightcolor': 'green',
-            'selectforeground': 'black',
-            'selectbackground': 'green'
-        }
-
-        # Set up widgets
-        self.text = self.makeWidgets( )
-        self.bindEvents()
-        self.sendCmd( 'export TERM=dumb' )
-
-        self.outputHook = None
-
-    def makeWidgets( self ):
-        "Make a label, a text area, and a scroll bar."
-
-        def newTerm( net=self.net, node=self.node, title=self.title ):
-            "Pop up a new terminal window for a node."
-            net.terms += makeTerms( [ node ], title )
-        label = Button( self, text=self.node.name, command=newTerm,
-                        **self.buttonStyle )
-        label.pack( side='top', fill='x' )
-        text = Text( self, wrap='word', **self.textStyle )
-        ybar = Scrollbar( self, orient='vertical', width=7,
-                          command=text.yview )
-        text.configure( yscrollcommand=ybar.set )
-        text.pack( side='left', expand=True, fill='both' )
-        ybar.pack( side='right', fill='y' )
-        return text
-
-    def bindEvents( self ):
-        "Bind keyboard and file events."
-        # The text widget handles regular key presses, but we
-        # use special handlers for the following:
-        self.text.bind( '<Return>', self.handleReturn )
-        self.text.bind( '<Control-c>', self.handleInt )
-        self.text.bind( '<KeyPress>', self.handleKey )
-        # This is not well-documented, but it is the correct
-        # way to trigger a file event handler from Tk's
-        # event loop!
-        self.tk.createfilehandler( self.node.stdout, READABLE,
-                                   self.handleReadable )
-
-    # We're not a terminal (yet?), so we ignore the following
-    # control characters other than [\b\n\r]
-    ignoreChars = re.compile( r'[\x00-\x07\x09\x0b\x0c\x0e-\x1f]+' )
-
-    def append( self, text ):
-        "Append something to our text frame."
-        text = self.ignoreChars.sub( '', text )
-        self.text.insert( 'end', text )
-        self.text.mark_set( 'insert', 'end' )
-        self.text.see( 'insert' )
-        outputHook = lambda x, y: True  # make pylint happier
-        if self.outputHook:
-            outputHook = self.outputHook
-        outputHook( self, text )
-
-    def handleKey( self, event ):
-        "If it's an interactive command, send it to the node."
-        char = event.char
-        if self.node.waiting:
-            self.node.write( char )
-
-    def handleReturn( self, event ):
-        "Handle a carriage return."
-        cmd = self.text.get( 'insert linestart', 'insert lineend' )
-        # Send it immediately, if "interactive" command
-        if self.node.waiting:
-            self.node.write( event.char )
-            return
-        # Otherwise send the whole line to the shell
-        pos = cmd.find( self.prompt )
-        if pos >= 0:
-            cmd = cmd[ pos + len( self.prompt ): ]
-        self.sendCmd( cmd )
-
-    # Callback ignores event
-    def handleInt( self, _event=None ):
-        "Handle control-c."
-        self.node.sendInt()
-
-    def sendCmd( self, cmd ):
-        "Send a command to our node."
-        if not self.node.waiting:
-            self.node.sendCmd( cmd )
-
-    def handleReadable( self, _fds, timeoutms=None ):
-        "Handle file readable event."
-        data = self.node.monitor( timeoutms )
-        self.append( data )
-        if not self.node.waiting:
-            # Print prompt
-            self.append( self.prompt )
-
-    def waiting( self ):
-        "Are we waiting for output?"
-        return self.node.waiting
-
-    def waitOutput( self ):
-        "Wait for any remaining output."
-        while self.node.waiting:
-            # A bit of a trade-off here...
-            self.handleReadable( self, timeoutms=1000)
-            self.update()
-
-    def clear( self ):
-        "Clear all of our text."
-        self.text.delete( '1.0', 'end' )
-
-
-class Graph( Frame ):
-
-    "Graph that we can add bars to over time."
-
-    def __init__( self, parent=None, bg = 'white', gheight=200, gwidth=500,
-                  barwidth=10, ymax=3.5,):
-
-        Frame.__init__( self, parent )
-
-        self.bg = bg
-        self.gheight = gheight
-        self.gwidth = gwidth
-        self.barwidth = barwidth
-        self.ymax = float( ymax )
-        self.xpos = 0
-
-        # Create everything
-        self.title, self.scale, self.graph = self.createWidgets()
-        self.updateScrollRegions()
-        self.yview( 'moveto', '1.0' )
-
-    def createScale( self ):
-        "Create a and return a new canvas with scale markers."
-        height = float( self.gheight )
-        width = 25
-        ymax = self.ymax
-        scale = Canvas( self, width=width, height=height,
-                        background=self.bg )
-        opts = { 'fill': 'red' }
-        # Draw scale line
-        scale.create_line( width - 1, height, width - 1, 0, **opts )
-        # Draw ticks and numbers
-        for y in range( 0, int( ymax + 1 ) ):
-            ypos = height * (1 - float( y ) / ymax )
-            scale.create_line( width, ypos, width - 10, ypos, **opts )
-            scale.create_text( 10, ypos, text=str( y ), **opts )
-        return scale
-
-    def updateScrollRegions( self ):
-        "Update graph and scale scroll regions."
-        ofs = 20
-        height = self.gheight + ofs
-        self.graph.configure( scrollregion=( 0, -ofs,
-                              self.xpos * self.barwidth, height ) )
-        self.scale.configure( scrollregion=( 0, -ofs, 0, height ) )
-
-    def yview( self, *args ):
-        "Scroll both scale and graph."
-        self.graph.yview( *args )
-        self.scale.yview( *args )
-
-    def createWidgets( self ):
-        "Create initial widget set."
-
-        # Objects
-        title = Label( self, text='Bandwidth (Gb/s)', bg=self.bg )
-        width = self.gwidth
-        height = self.gheight
-        scale = self.createScale()
-        graph = Canvas( self, width=width, height=height, background=self.bg)
-        xbar = Scrollbar( self, orient='horizontal', command=graph.xview )
-        ybar = Scrollbar( self, orient='vertical', command=self.yview )
-        graph.configure( xscrollcommand=xbar.set, yscrollcommand=ybar.set,
-                         scrollregion=(0, 0, width, height ) )
-        scale.configure( yscrollcommand=ybar.set )
-
-        # Layout
-        title.grid( row=0, columnspan=3, sticky='new')
-        scale.grid( row=1, column=0, sticky='nsew' )
-        graph.grid( row=1, column=1, sticky='nsew' )
-        ybar.grid( row=1, column=2, sticky='ns' )
-        xbar.grid( row=2, column=0, columnspan=2, sticky='ew' )
-        self.rowconfigure( 1, weight=1 )
-        self.columnconfigure( 1, weight=1 )
-        return title, scale, graph
-
-    def addBar( self, yval ):
-        "Add a new bar to our graph."
-        percent = yval / self.ymax
-        c = self.graph
-        x0 = self.xpos * self.barwidth
-        x1 = x0 + self.barwidth
-        y0 = self.gheight
-        y1 = ( 1 - percent ) * self.gheight
-        c.create_rectangle( x0, y0, x1, y1, fill='green' )
-        self.xpos += 1
-        self.updateScrollRegions()
-        self.graph.xview( 'moveto', '1.0' )
-
-    def clear( self ):
-        "Clear graph contents."
-        self.graph.delete( 'all' )
-        self.xpos = 0
-
-    def test( self ):
-        "Add a bar for testing purposes."
-        ms = 1000
-        if self.xpos < 10:
-            self.addBar( self.xpos / 10 * self.ymax  )
-            self.after( ms, self.test )
-
-    def setTitle( self, text ):
-        "Set graph title"
-        self.title.configure( text=text, font='Helvetica 9 bold' )
-
-
-class ConsoleApp( Frame ):
-
-    "Simple Tk consoles for Mininet."
-
-    menuStyle = { 'font': 'Geneva 7 bold' }
-
-    def __init__( self, net, parent=None, width=4 ):
-        Frame.__init__( self, parent )
-        self.top = self.winfo_toplevel()
-        self.top.title( 'Mininet' )
-        self.net = net
-        self.menubar = self.createMenuBar()
-        cframe = self.cframe = Frame( self )
-        self.consoles = {}  # consoles themselves
-        titles = {
-            'hosts': 'Host',
-            'switches': 'Switch',
-            'controllers': 'Controller'
-        }
-        for name in titles:
-            nodes = getattr( net, name )
-            frame, consoles = self.createConsoles(
-                cframe, nodes, width, titles[ name ] )
-            self.consoles[ name ] = Object( frame=frame, consoles=consoles )
-        self.selected = None
-        self.select( 'hosts' )
-        self.cframe.pack( expand=True, fill='both' )
-        cleanUpScreens()
-        # Close window gracefully
-        Wm.wm_protocol( self.top, name='WM_DELETE_WINDOW', func=self.quit )
-
-        # Initialize graph
-        graph = Graph( cframe )
-        self.consoles[ 'graph' ] = Object( frame=graph, consoles=[ graph ] )
-        self.graph = graph
-        self.graphVisible = False
-        self.updates = 0
-        self.hostCount = len( self.consoles[ 'hosts' ].consoles )
-        self.bw = 0
-
-        self.pack( expand=True, fill='both' )
-
-    def updateGraph( self, _console, output ):
-        "Update our graph."
-        m = re.search( r'(\d+) Mbits/sec', output )
-        if not m:
-            return
-        self.updates += 1
-        self.bw += .001 * float( m.group( 1 ) )
-        if self.updates >= self.hostCount:
-            self.graph.addBar( self.bw )
-            self.bw = 0
-            self.updates = 0
-
-    def setOutputHook( self, fn=None, consoles=None ):
-        "Register fn as output hook [on specific consoles.]"
-        if consoles is None:
-            consoles = self.consoles[ 'hosts' ].consoles
-        for console in consoles:
-            console.outputHook = fn
-
-    def createConsoles( self, parent, nodes, width, title ):
-        "Create a grid of consoles in a frame."
-        f = Frame( parent )
-        # Create consoles
-        consoles = []
-        index = 0
-        for node in nodes:
-            console = Console( f, self.net, node, title=title )
-            consoles.append( console )
-            row = index / width
-            column = index % width
-            console.grid( row=row, column=column, sticky='nsew' )
-            index += 1
-            f.rowconfigure( row, weight=1 )
-            f.columnconfigure( column, weight=1 )
-        return f, consoles
-
-    def select( self, groupName ):
-        "Select a group of consoles to display."
-        if self.selected is not None:
-            self.selected.frame.pack_forget()
-        self.selected = self.consoles[ groupName ]
-        self.selected.frame.pack( expand=True, fill='both' )
-
-    def createMenuBar( self ):
-        "Create and return a menu (really button) bar."
-        f = Frame( self )
-        buttons = [
-            ( 'Hosts', lambda: self.select( 'hosts' ) ),
-            ( 'Switches', lambda: self.select( 'switches' ) ),
-            ( 'Controllers', lambda: self.select( 'controllers' ) ),
-            ( 'Graph', lambda: self.select( 'graph' ) ),
-            ( 'Ping', self.ping ),
-            ( 'Iperf', self.iperf ),
-            ( 'Interrupt', self.stop ),
-            ( 'Clear', self.clear ),
-            ( 'Quit', self.quit )
-        ]
-        for name, cmd in buttons:
-            b = Button( f, text=name, command=cmd, **self.menuStyle )
-            b.pack( side='left' )
-        f.pack( padx=4, pady=4, fill='x' )
-        return f
-
-    def clear( self ):
-        "Clear selection."
-        for console in self.selected.consoles:
-            console.clear()
-
-    def waiting( self, consoles=None ):
-        "Are any of our hosts waiting for output?"
-        if consoles is None:
-            consoles = self.consoles[ 'hosts' ].consoles
-        for console in consoles:
-            if console.waiting():
-                return True
-        return False
-
-    def ping( self ):
-        "Tell each host to ping the next one."
-        consoles = self.consoles[ 'hosts' ].consoles
-        if self.waiting( consoles ):
-            return
-        count = len( consoles )
-        i = 0
-        for console in consoles:
-            i = ( i + 1 ) % count
-            ip = consoles[ i ].node.IP()
-            console.sendCmd( 'ping ' + ip )
-
-    def iperf( self ):
-        "Tell each host to iperf to the next one."
-        consoles = self.consoles[ 'hosts' ].consoles
-        if self.waiting( consoles ):
-            return
-        count = len( consoles )
-        self.setOutputHook( self.updateGraph )
-        for console in consoles:
-            console.node.cmd( 'iperf -sD' )
-        i = 0
-        for console in consoles:
-            i = ( i + 1 ) % count
-            ip = consoles[ i ].node.IP()
-            console.sendCmd( 'iperf -t 99999 -i 1 -c ' + ip )
-
-    def stop( self, wait=True ):
-        "Interrupt all hosts."
-        consoles = self.consoles[ 'hosts' ].consoles
-        for console in consoles:
-            console.handleInt()
-        if wait:
-            for console in consoles:
-                console.waitOutput()
-        self.setOutputHook( None )
-        # Shut down any iperfs that might still be running
-        quietRun( 'killall -9 iperf' )
-
-    def quit( self ):
-        "Stop everything and quit."
-        self.stop( wait=False)
-        Frame.quit( self )
-
-
-# Make it easier to construct and assign objects
-
-def assign( obj, **kwargs ):
-    "Set a bunch of fields in an object."
-    obj.__dict__.update( kwargs )
-
-class Object( object ):
-    "Generic object you can stuff junk into."
-    def __init__( self, **kwargs ):
-        assign( self, **kwargs )
-
-
-if __name__ == '__main__':
-    setLogLevel( 'info' )
-    network = TreeNet( depth=2, fanout=4 )
-    network.start()
-    app = ConsoleApp( network, width=4 )
-    app.mainloop()
-    network.stop()
diff --git a/examples/controllers.py b/examples/controllers.py
deleted file mode 100644
index 6eeef0e..0000000
--- a/examples/controllers.py
+++ /dev/null
@@ -1,64 +0,0 @@
-#!/usr/bin/python
-
-"""
-This example creates a multi-controller network from
-semi-scratch; note a topo object could also be used and
-would be passed into the Mininet() constructor.
-"""
-
-from mininet.net import Mininet
-from mininet.node import Controller, OVSKernelSwitch
-from mininet.cli import CLI
-from mininet.log import setLogLevel
-
-Switch = OVSKernelSwitch
-
-def addHost( net, N ):
-    "Create host hN and add to net."
-    name = 'h%d' % N
-    ip = '10.0.0.%d' % N
-    return net.addHost( name, ip=ip )
-
-def multiControllerNet():
-    "Create a network with multiple controllers."
-
-    net = Mininet( controller=Controller, switch=Switch)
-
-    print "*** Creating controllers"
-    c1 = net.addController( 'c1', port=6633 )
-    c2 = net.addController( 'c2', port=6634 )
-
-    print "*** Creating switches"
-    s1 = net.addSwitch( 's1' )
-    s2 = net.addSwitch( 's2' )
-
-    print "*** Creating hosts"
-    hosts1 = [ addHost( net, n ) for n in 3, 4 ]
-    hosts2 = [ addHost( net, n ) for n in 5, 6 ]
-
-    print "*** Creating links"
-    for h in hosts1:
-        s1.linkTo( h )
-    for h in hosts2:
-        s2.linkTo( h )
-    s1.linkTo( s2 )
-
-    print "*** Starting network"
-    net.build()
-    c1.start()
-    c2.start()
-    s1.start( [ c1 ] )
-    s2.start( [ c2 ] )
-
-    print "*** Testing network"
-    net.pingAll()
-
-    print "*** Running CLI"
-    CLI( net )
-
-    print "*** Stopping network"
-    net.stop()
-
-if __name__ == '__main__':
-    setLogLevel( 'info' )  # for CLI output
-    multiControllerNet()
diff --git a/examples/cpu.py b/examples/cpu.py
deleted file mode 100644
index 6dfc936..0000000
--- a/examples/cpu.py
+++ /dev/null
@@ -1,81 +0,0 @@
-#!/usr/bin/python
-
-"""
-cpu.py: test iperf bandwidth for varying cpu limits
-"""
-
-from mininet.net import Mininet
-from mininet.node import CPULimitedHost
-from mininet.topolib import TreeTopo
-from mininet.util import custom
-from mininet.log import setLogLevel, output
-
-from time import sleep
-
-def waitListening(client, server, port):
-    "Wait until server is listening on port"
-    if not client.cmd('which telnet'):
-        raise Exception('Could not find telnet')
-    cmd = ('sh -c "echo A | telnet -e A %s %s"' %
-           (server.IP(), port))
-    while 'Connected' not in client.cmd(cmd):
-        output('waiting for', server,
-               'to listen on port', port, '\n')
-        sleep(.5)
-
-
-def bwtest( cpuLimits, period_us=100000, seconds=5 ):
-    """Example/test of link and CPU bandwidth limits
-       cpu: cpu limit as fraction of overall CPU time"""
-
-    topo = TreeTopo( depth=1, fanout=2 )
-
-    results = {}
-
-    for sched in 'rt', 'cfs':
-        print '*** Testing with', sched, 'bandwidth limiting'
-        for cpu in cpuLimits:
-            host = custom( CPULimitedHost, sched=sched,
-                           period_us=period_us,
-                           cpu=cpu )
-            net = Mininet( topo=topo, host=host )
-            net.start()
-            net.pingAll()
-            hosts = [ net.getNodeByName( h ) for h in topo.hosts() ]
-            client, server = hosts[ 0 ], hosts[ -1 ]
-            server.cmd( 'iperf -s -p 5001 &' )
-            waitListening( client, server, 5001 )
-            result = client.cmd( 'iperf -yc -t %s -c %s' % (
-                seconds, server.IP() ) ).split( ',' )
-            bps = float( result[ -1 ] )
-            server.cmdPrint( 'kill %iperf' )
-            net.stop()
-            updated = results.get( sched, [] )
-            updated += [ ( cpu, bps ) ]
-            results[ sched ] = updated
-
-    return results
-
-
-def dump( results ):
-    "Dump results"
-
-    fmt = '%s\t%s\t%s'
-
-    print
-    print fmt % ( 'sched', 'cpu', 'client MB/s' )
-    print
-
-    for sched in sorted( results.keys() ):
-        entries = results[ sched ]
-        for cpu, bps in entries:
-            pct = '%.2f%%' % ( cpu * 100 )
-            mbps = bps / 1e6
-            print fmt % ( sched, pct, mbps )
-
-
-if __name__ == '__main__':
-    setLogLevel( 'info' )
-    limits = [ .45, .4, .3, .2, .1 ]
-    out = bwtest( limits )
-    dump( out )
diff --git a/examples/emptynet.py b/examples/emptynet.py
deleted file mode 100644
index 9f57855..0000000
--- a/examples/emptynet.py
+++ /dev/null
@@ -1,44 +0,0 @@
-#!/usr/bin/python
-
-"""
-This example shows how to create an empty Mininet object
-(without a topology object) and add nodes to it manually.
-"""
-
-from mininet.net import Mininet
-from mininet.node import Controller
-from mininet.cli import CLI
-from mininet.log import setLogLevel, info
-
-def emptyNet():
-
-    "Create an empty network and add nodes to it."
-
-    net = Mininet( controller=Controller )
-
-    info( '*** Adding controller\n' )
-    net.addController( 'c0' )
-
-    info( '*** Adding hosts\n' )
-    h1 = net.addHost( 'h1', ip='10.0.0.1' )
-    h2 = net.addHost( 'h2', ip='10.0.0.2' )
-
-    info( '*** Adding switch\n' )
-    s3 = net.addSwitch( 's3' )
-
-    info( '*** Creating links\n' )
-    h1.linkTo( s3 )
-    h2.linkTo( s3 )
-
-    info( '*** Starting network\n')
-    net.start()
-
-    info( '*** Running CLI\n' )
-    CLI( net )
-
-    info( '*** Stopping network' )
-    net.stop()
-
-if __name__ == '__main__':
-    setLogLevel( 'info' )
-    emptyNet()
diff --git a/examples/hwintf.py b/examples/hwintf.py
deleted file mode 100644
index e5960d9..0000000
--- a/examples/hwintf.py
+++ /dev/null
@@ -1,48 +0,0 @@
-#!/usr/bin/python
-
-"""
-This example shows how to add an interface (for example a real
-hardware interface) to a network after the network is created.
-"""
-
-import re
-
-from mininet.cli import CLI
-from mininet.log import setLogLevel, info, error
-from mininet.net import Mininet
-from mininet.link import Intf
-from mininet.topolib import TreeTopo
-from mininet.util import quietRun
-
-def checkIntf( intf ):
-    "Make sure intf exists and is not configured."
-    if ( ' %s:' % intf ) not in quietRun( 'ip link show' ):
-        error( 'Error:', intf, 'does not exist!\n' )
-        exit( 1 )
-    ips = re.findall( r'\d+\.\d+\.\d+\.\d+', quietRun( 'ifconfig ' + intf ) )
-    if ips:
-        error( 'Error:', intf, 'has an IP address,'
-               'and is probably in use!\n' )
-        exit( 1 )
-
-if __name__ == '__main__':
-    setLogLevel( 'info' )
-
-    intfName = 'eth1'
-    info( '*** Checking', intfName, '\n' )
-    checkIntf( intfName )
-
-    info( '*** Creating network\n' )
-    net = Mininet( topo=TreeTopo( depth=1, fanout=2 ) )
-
-    switch = net.switches[ 0 ]
-    info( '*** Adding hardware interface', intfName, 'to switch',
-          switch.name, '\n' )
-    _intf = Intf( intfName, node=switch )
-
-    info( '*** Note: you may need to reconfigure the interfaces for '
-          'the Mininet hosts:\n', net.hosts, '\n' )
-
-    net.start()
-    CLI( net )
-    net.stop()
diff --git a/examples/limit.py b/examples/limit.py
deleted file mode 100644
index 0b23ca1..0000000
--- a/examples/limit.py
+++ /dev/null
@@ -1,53 +0,0 @@
-#!/usr/bin/python
-
-"""
-limit.py: example of using link and CPU limits
-"""
-
-from mininet.net import Mininet
-from mininet.link import TCIntf
-from mininet.node import CPULimitedHost
-from mininet.topolib import TreeTopo
-from mininet.util import custom
-from mininet.log import setLogLevel
-
-
-def testLinkLimit( net, bw ):
-    "Run bandwidth limit test"
-    print '*** Testing network %.2f Mbps bandwidth limit' % bw
-    net.iperf( )
-
-
-def limit( bw=10, cpu=.1 ):
-    """Example/test of link and CPU bandwidth limits
-       bw: interface bandwidth limit in Mbps
-       cpu: cpu limit as fraction of overall CPU time"""
-    intf = custom( TCIntf, bw=bw )
-    myTopo = TreeTopo( depth=1, fanout=2 )
-    for sched in 'rt', 'cfs':
-        print '*** Testing with', sched, 'bandwidth limiting'
-        host = custom( CPULimitedHost, sched=sched, cpu=cpu )
-        net = Mininet( topo=myTopo, intf=intf, host=host )
-        net.start()
-        testLinkLimit( net, bw=bw )
-        net.runCpuLimitTest( cpu=cpu )
-        net.stop()
-
-def verySimpleLimit( bw=150 ):
-    "Absurdly simple limiting test"
-    intf = custom( TCIntf, bw=bw )
-    net = Mininet( intf=intf )
-    h1, h2 = net.addHost( 'h1' ), net.addHost( 'h2' )
-    net.addLink( h1, h2 )
-    net.start()
-    net.pingAll()
-    net.iperf()
-    h1.cmdPrint( 'tc -s qdisc ls dev', h1.defaultIntf() )
-    h2.cmdPrint( 'tc -d class show dev', h2.defaultIntf() )
-    h1.cmdPrint( 'tc -s qdisc ls dev', h1.defaultIntf() )
-    h2.cmdPrint( 'tc -d class show dev', h2.defaultIntf() )
-    net.stop()
-
-if __name__ == '__main__':
-    setLogLevel( 'info' )
-    limit()
diff --git a/examples/linearbandwidth.py b/examples/linearbandwidth.py
deleted file mode 100644
index 3fd06c7..0000000
--- a/examples/linearbandwidth.py
+++ /dev/null
@@ -1,110 +0,0 @@
-#!/usr/bin/python
-
-"""
-Test bandwidth (using iperf) on linear networks of varying size,
-using both kernel and user datapaths.
-
-We construct a network of N hosts and N-1 switches, connected as follows:
-
-h1 <-> s1 <-> s2 .. sN-1
-       |       |    |
-       h2      h3   hN
-
-WARNING: by default, the reference controller only supports 16
-switches, so this test WILL NOT WORK unless you have recompiled
-your controller to support 100 switches (or more.)
-
-In addition to testing the bandwidth across varying numbers
-of switches, this example demonstrates:
-
-- creating a custom topology, LinearTestTopo
-- using the ping() and iperf() tests from Mininet()
-- testing both the kernel and user switches
-
-"""
-
-from mininet.net import Mininet
-from mininet.node import UserSwitch, OVSKernelSwitch
-from mininet.topo import Topo
-from mininet.log import lg
-from mininet.util import irange
-
-import sys
-flush = sys.stdout.flush
-
-class LinearTestTopo( Topo ):
-    "Topology for a string of N hosts and N-1 switches."
-
-    def __init__( self, N, **params ):
-
-        # Initialize topology
-        Topo.__init__( self, **params )
-
-        # Create switches and hosts
-        hosts = [ self.addHost( 'h%s' % h )
-                  for h in irange( 1, N ) ]
-        switches = [ self.addSwitch( 's%s' % s )
-                     for s in irange( 1, N - 1 ) ]
-
-        # Wire up switches
-        last = None
-        for switch in switches:
-            if last:
-                self.addLink( last, switch )
-            last = switch
-
-        # Wire up hosts
-        self.addLink( hosts[ 0 ], switches[ 0 ] )
-        for host, switch in zip( hosts[ 1: ], switches ):
-            self.addLink( host, switch )
-
-
-def linearBandwidthTest( lengths ):
-
-    "Check bandwidth at various lengths along a switch chain."
-
-    results = {}
-    switchCount = max( lengths )
-    hostCount = switchCount + 1
-
-    switches = { 'reference user': UserSwitch,
-                 'Open vSwitch kernel': OVSKernelSwitch }
-
-    topo = LinearTestTopo( hostCount )
-
-    for datapath in switches.keys():
-        print "*** testing", datapath, "datapath"
-        Switch = switches[ datapath ]
-        results[ datapath ] = []
-        net = Mininet( topo=topo, switch=Switch )
-        net.start()
-        print "*** testing basic connectivity"
-        for n in lengths:
-            net.ping( [ net.hosts[ 0 ], net.hosts[ n ] ] )
-        print "*** testing bandwidth"
-        for n in lengths:
-            src, dst = net.hosts[ 0 ], net.hosts[ n ]
-            print "testing", src.name, "<->", dst.name,
-            bandwidth = net.iperf( [ src, dst ] )
-            print bandwidth
-            flush()
-            results[ datapath ] += [ ( n, bandwidth ) ]
-        net.stop()
-
-    for datapath in switches.keys():
-        print
-        print "*** Linear network results for", datapath, "datapath:"
-        print
-        result = results[ datapath ]
-        print "SwitchCount\tiperf Results"
-        for switchCount, bandwidth in result:
-            print switchCount, '\t\t',
-            print bandwidth[ 0 ], 'server, ', bandwidth[ 1 ], 'client'
-        print
-    print
-
-if __name__ == '__main__':
-    lg.setLogLevel( 'info' )
-    sizes = [ 1, 10, 20, 40, 60, 80, 100 ]
-    print "*** Running linearBandwidthTest", sizes
-    linearBandwidthTest( sizes  )
diff --git a/examples/miniedit.py b/examples/miniedit.py
deleted file mode 100644
index c17cf3d..0000000
--- a/examples/miniedit.py
+++ /dev/null
@@ -1,771 +0,0 @@
-#!/usr/bin/python
-
-"""
-MiniEdit: a simple network editor for Mininet
-
-This is a simple demonstration of how one might build a
-GUI application using Mininet as the network model.
-
-Development version - not entirely functional!
-
-Bob Lantz, April 2010
-"""
-import optparse
-
-from Tkinter import Frame, Button, Label, Scrollbar, Canvas
-from Tkinter import Menu, BitmapImage, PhotoImage, Wm, Toplevel
-
-# someday: from ttk import *
-
-from mininet.log import setLogLevel
-from mininet.net import Mininet
-from mininet.util import ipStr
-from mininet.term import makeTerm, cleanUpScreens
-
-
-def parse_args():
-    usage="""Usage: miniccnxedit [template_file]
-	If no template_file is given, generated template will be written
-	to the file topo.miniccnx in the current directory.
-    """
-
-    parser = optparse.OptionParser(usage)
-
-    #parser.add_option("-t", "--template", help="template file name")
-    _, arg = parser.parse_args()
-
-    return arg
-
-class MiniEdit( Frame ):
-
-    "A simple network editor for Mininet."
-
-    def __init__( self, parent=None, cheight=200, cwidth=500, template_file='topo.miniccnx' ):
-
-        Frame.__init__( self, parent )
-        self.action = None
-        self.appName = 'Mini-CCNx'
-	self.template_file = template_file
-
-        # Style
-        self.font = ( 'Geneva', 9 )
-        self.smallFont = ( 'Geneva', 7 )
-        self.bg = 'white'
-
-        # Title
-        self.top = self.winfo_toplevel()
-        self.top.title( self.appName )
-
-        # Menu bar
-        self.createMenubar()
-
-        # Editing canvas
-        self.cheight, self.cwidth = cheight, cwidth
-        self.cframe, self.canvas = self.createCanvas()
-
-        # Toolbar
-        self.images = miniEditImages()
-        self.buttons = {}
-        self.active = None
-        self.tools = ( 'Select', 'Host', 'Switch', 'Link' )
-        self.customColors = { 'Switch': 'darkGreen', 'Host': 'blue' }
-        self.toolbar = self.createToolbar()
-
-        # Layout
-        self.toolbar.grid( column=0, row=0, sticky='nsew')
-        self.cframe.grid( column=1, row=0 )
-        self.columnconfigure( 1, weight=1 )
-        self.rowconfigure( 0, weight=1 )
-        self.pack( expand=True, fill='both' )
-
-        # About box
-        self.aboutBox = None
-
-        # Initialize node data
-        self.nodeBindings = self.createNodeBindings()
-        self.nodePrefixes = { 'Switch': 's', 'Host': 'h' }
-        self.widgetToItem = {}
-        self.itemToWidget = {}
-
-        # Initialize link tool
-        self.link = self.linkWidget = None
-
-        # Selection support
-        self.selection = None
-
-        # Keyboard bindings
-        self.bind( '<Control-q>', lambda event: self.quit() )
-        self.bind( '<KeyPress-Delete>', self.deleteSelection )
-        self.bind( '<KeyPress-BackSpace>', self.deleteSelection )
-        self.focus()
-
-        # Event handling initalization
-        self.linkx = self.linky = self.linkItem = None
-        self.lastSelection = None
-
-        # Model initialization
-        self.links = {}
-        self.nodeCount = 0
-        self.net = None
-
-        # Close window gracefully
-        Wm.wm_protocol( self.top, name='WM_DELETE_WINDOW', func=self.quit )
-
-    def quit( self ):
-        "Stop our network, if any, then quit."
-        self.stop()
-        Frame.quit( self )
-
-    def createMenubar( self ):
-        "Create our menu bar."
-
-        font = self.font
-
-        mbar = Menu( self.top, font=font )
-        self.top.configure( menu=mbar )
-
-        # Application menu
-        appMenu = Menu( mbar, tearoff=False )
-        mbar.add_cascade( label=self.appName, font=font, menu=appMenu )
-        appMenu.add_command( label='About Mini-CCNx', command=self.about,
-                             font=font)
-        appMenu.add_separator()
-        appMenu.add_command( label='Quit', command=self.quit, font=font )
-
-        #fileMenu = Menu( mbar, tearoff=False )
-        #mbar.add_cascade( label="File", font=font, menu=fileMenu )
-        #fileMenu.add_command( label="Load...", font=font )
-        #fileMenu.add_separator()
-        #fileMenu.add_command( label="Save", font=font )
-        #fileMenu.add_separator()
-        #fileMenu.add_command( label="Print", font=font )
-
-        editMenu = Menu( mbar, tearoff=False )
-        mbar.add_cascade( label="Edit", font=font, menu=editMenu )
-        editMenu.add_command( label="Cut", font=font,
-                              command=lambda: self.deleteSelection( None ) )
-
-       # runMenu = Menu( mbar, tearoff=False )
-       # mbar.add_cascade( label="Run", font=font, menu=runMenu )
-       # runMenu.add_command( label="Run", font=font, command=self.doRun )
-       # runMenu.add_command( label="Stop", font=font, command=self.doStop )
-       # runMenu.add_separator()
-       # runMenu.add_command( label='Xterm', font=font, command=self.xterm )
-
-    # Canvas
-
-    def createCanvas( self ):
-        "Create and return our scrolling canvas frame."
-        f = Frame( self )
-
-        canvas = Canvas( f, width=self.cwidth, height=self.cheight,
-                         bg=self.bg )
-
-        # Scroll bars
-        xbar = Scrollbar( f, orient='horizontal', command=canvas.xview )
-        ybar = Scrollbar( f, orient='vertical', command=canvas.yview )
-        canvas.configure( xscrollcommand=xbar.set, yscrollcommand=ybar.set )
-
-        # Resize box
-        resize = Label( f, bg='white' )
-
-        # Layout
-        canvas.grid( row=0, column=1, sticky='nsew')
-        ybar.grid( row=0, column=2, sticky='ns')
-        xbar.grid( row=1, column=1, sticky='ew' )
-        resize.grid( row=1, column=2, sticky='nsew' )
-
-        # Resize behavior
-        f.rowconfigure( 0, weight=1 )
-        f.columnconfigure( 1, weight=1 )
-        f.grid( row=0, column=0, sticky='nsew' )
-        f.bind( '<Configure>', lambda event: self.updateScrollRegion() )
-
-        # Mouse bindings
-        canvas.bind( '<ButtonPress-1>', self.clickCanvas )
-        canvas.bind( '<B1-Motion>', self.dragCanvas )
-        canvas.bind( '<ButtonRelease-1>', self.releaseCanvas )
-
-        return f, canvas
-
-    def updateScrollRegion( self ):
-        "Update canvas scroll region to hold everything."
-        bbox = self.canvas.bbox( 'all' )
-        if bbox is not None:
-            self.canvas.configure( scrollregion=( 0, 0, bbox[ 2 ],
-                                   bbox[ 3 ] ) )
-
-    def canvasx( self, x_root ):
-        "Convert root x coordinate to canvas coordinate."
-        c = self.canvas
-        return c.canvasx( x_root ) - c.winfo_rootx()
-
-    def canvasy( self, y_root ):
-        "Convert root y coordinate to canvas coordinate."
-        c = self.canvas
-        return c.canvasy( y_root ) - c.winfo_rooty()
-
-    # Toolbar
-
-    def activate( self, toolName ):
-        "Activate a tool and press its button."
-        # Adjust button appearance
-        if self.active:
-            self.buttons[ self.active ].configure( relief='raised' )
-        self.buttons[ toolName ].configure( relief='sunken' )
-        # Activate dynamic bindings
-        self.active = toolName
-
-    def createToolbar( self ):
-        "Create and return our toolbar frame."
-
-        toolbar = Frame( self )
-
-        # Tools
-        for tool in self.tools:
-            cmd = ( lambda t=tool: self.activate( t ) )
-            b = Button( toolbar, text=tool, font=self.smallFont, command=cmd)
-            if tool in self.images:
-                b.config( height=50, image=self.images[ tool ] )
-                # b.config( compound='top' )
-            b.pack( fill='x' )
-            self.buttons[ tool ] = b
-        self.activate( self.tools[ 0 ] )
-
-        # Spacer
-        Label( toolbar, text='' ).pack()
-
-        # Commands
-        #for cmd, color in [ ( 'Stop', 'darkRed' ), ( 'Run', 'darkGreen' ) ]:
-        #    doCmd = getattr( self, 'do' + cmd )
-        #    b = Button( toolbar, text=cmd, font=self.smallFont,
-        #                fg=color, command=doCmd )
-        #    b.pack( fill='x', side='bottom' )
-
-	for cmd, color in [ ( 'Generate', 'darkGreen' ) ]:
-            doCmd = getattr( self, 'do' + cmd )
-            b = Button( toolbar, text=cmd, font=self.smallFont,
-                        fg=color, command=doCmd )
-            b.pack( fill='x', side='bottom' )
-
-
-        return toolbar
-
-    def doGenerate( self ):
-        "Generate template."
-        self.activate( 'Select' )
-        for tool in self.tools:
-            self.buttons[ tool ].config( state='disabled' )
-
-        self.buildTemplate()
-
-	for tool in self.tools:
-            self.buttons[ tool ].config( state='normal' )
-
-    def doStop( self ):
-        "Stop command."
-        self.stop()
-        for tool in self.tools:
-            self.buttons[ tool ].config( state='normal' )
-
-    def buildTemplate( self ):
-	"Generate template"
-	
-	template = open(self.template_file, 'w')
-
-	# hosts
-	template.write('[hosts]\n')
-	for widget in self.widgetToItem:
-            name = widget[ 'text' ]
-            tags = self.canvas.gettags( self.widgetToItem[ widget ] )
-	    if 'Host' in tags:
-		template.write(name + ':\n')	
-
-	# switches/routers
-	template.write('[routers]\n')
-	for widget in self.widgetToItem:
-            name = widget[ 'text' ]
-            tags = self.canvas.gettags( self.widgetToItem[ widget ] )
-	    if 'Switch' in tags:
-		template.write(name + ':\n')	
-
-        # Make links
-	template.write('[links]\n')
-        for link in self.links.values():
-             ( src, dst ) = link
-             srcName, dstName = src[ 'text' ], dst[ 'text' ]
-             template.write(srcName + ':' + dstName + '\n')
-
-	template.close()   
-
-
-    # Generic canvas handler
-    #
-    # We could have used bindtags, as in nodeIcon, but
-    # the dynamic approach used here
-    # may actually require less code. In any case, it's an
-    # interesting introspection-based alternative to bindtags.
-
-    def canvasHandle( self, eventName, event ):
-        "Generic canvas event handler"
-        if self.active is None:
-            return
-        toolName = self.active
-        handler = getattr( self, eventName + toolName, None )
-        if handler is not None:
-            handler( event )
-
-    def clickCanvas( self, event ):
-        "Canvas click handler."
-        self.canvasHandle( 'click', event )
-
-    def dragCanvas( self, event ):
-        "Canvas drag handler."
-        self.canvasHandle( 'drag', event )
-
-    def releaseCanvas( self, event ):
-        "Canvas mouse up handler."
-        self.canvasHandle( 'release', event )
-
-    # Currently the only items we can select directly are
-    # links. Nodes are handled by bindings in the node icon.
-
-    def findItem( self, x, y ):
-        "Find items at a location in our canvas."
-        items = self.canvas.find_overlapping( x, y, x, y )
-        if len( items ) == 0:
-            return None
-        else:
-            return items[ 0 ]
-
-    # Canvas bindings for Select, Host, Switch and Link tools
-
-    def clickSelect( self, event ):
-        "Select an item."
-        self.selectItem( self.findItem( event.x, event.y ) )
-
-    def deleteItem( self, item ):
-        "Delete an item."
-        # Don't delete while network is running
-        if self.buttons[ 'Select' ][ 'state' ] == 'disabled':
-            return
-        # Delete from model
-        if item in self.links:
-            self.deleteLink( item )
-        if item in self.itemToWidget:
-            self.deleteNode( item )
-        # Delete from view
-        self.canvas.delete( item )
-
-    def deleteSelection( self, _event ):
-        "Delete the selected item."
-        if self.selection is not None:
-            self.deleteItem( self.selection )
-        self.selectItem( None )
-
-    def nodeIcon( self, node, name ):
-        "Create a new node icon."
-        icon = Button( self.canvas, image=self.images[ node ],
-                       text=name, compound='top' )
-        # Unfortunately bindtags wants a tuple
-        bindtags = [ str( self.nodeBindings ) ]
-        bindtags += list( icon.bindtags() )
-        icon.bindtags( tuple( bindtags ) )
-        return icon
-
-    def newNode( self, node, event ):
-        "Add a new node to our canvas."
-        c = self.canvas
-        x, y = c.canvasx( event.x ), c.canvasy( event.y )
-        self.nodeCount += 1
-        name = self.nodePrefixes[ node ] + str( self.nodeCount )
-        icon = self.nodeIcon( node, name )
-        item = self.canvas.create_window( x, y, anchor='c', window=icon,
-                                          tags=node )
-        self.widgetToItem[ icon ] = item
-        self.itemToWidget[ item ] = icon
-        self.selectItem( item )
-        icon.links = {}
-
-    def clickHost( self, event ):
-        "Add a new host to our canvas."
-        self.newNode( 'Host', event )
-
-    def clickSwitch( self, event ):
-        "Add a new switch to our canvas."
-        self.newNode( 'Switch', event )
-
-    def dragLink( self, event ):
-        "Drag a link's endpoint to another node."
-        if self.link is None:
-            return
-        # Since drag starts in widget, we use root coords
-        x = self.canvasx( event.x_root )
-        y = self.canvasy( event.y_root )
-        c = self.canvas
-        c.coords( self.link, self.linkx, self.linky, x, y )
-
-    def releaseLink( self, _event ):
-        "Give up on the current link."
-        if self.link is not None:
-            self.canvas.delete( self.link )
-        self.linkWidget = self.linkItem = self.link = None
-
-    # Generic node handlers
-
-    def createNodeBindings( self ):
-        "Create a set of bindings for nodes."
-        bindings = {
-            '<ButtonPress-1>': self.clickNode,
-            '<B1-Motion>': self.dragNode,
-            '<ButtonRelease-1>': self.releaseNode,
-            '<Enter>': self.enterNode,
-            '<Leave>': self.leaveNode,
-            '<Double-ButtonPress-1>': self.xterm
-        }
-        l = Label()  # lightweight-ish owner for bindings
-        for event, binding in bindings.items():
-            l.bind( event, binding )
-        return l
-
-    def selectItem( self, item ):
-        "Select an item and remember old selection."
-        self.lastSelection = self.selection
-        self.selection = item
-
-    def enterNode( self, event ):
-        "Select node on entry."
-        self.selectNode( event )
-
-    def leaveNode( self, _event ):
-        "Restore old selection on exit."
-        self.selectItem( self.lastSelection )
-
-    def clickNode( self, event ):
-        "Node click handler."
-        if self.active is 'Link':
-            self.startLink( event )
-        else:
-            self.selectNode( event )
-        return 'break'
-
-    def dragNode( self, event ):
-        "Node drag handler."
-        if self.active is 'Link':
-            self.dragLink( event )
-        else:
-            self.dragNodeAround( event )
-
-    def releaseNode( self, event ):
-        "Node release handler."
-        if self.active is 'Link':
-            self.finishLink( event )
-
-    # Specific node handlers
-
-    def selectNode( self, event ):
-        "Select the node that was clicked on."
-        item = self.widgetToItem.get( event.widget, None )
-        self.selectItem( item )
-
-    def dragNodeAround( self, event ):
-        "Drag a node around on the canvas."
-        c = self.canvas
-        # Convert global to local coordinates;
-        # Necessary since x, y are widget-relative
-        x = self.canvasx( event.x_root )
-        y = self.canvasy( event.y_root )
-        w = event.widget
-        # Adjust node position
-        item = self.widgetToItem[ w ]
-        c.coords( item, x, y )
-        # Adjust link positions
-        for dest in w.links:
-            link = w.links[ dest ]
-            item = self.widgetToItem[ dest ]
-            x1, y1 = c.coords( item )
-            c.coords( link, x, y, x1, y1 )
-
-    def startLink( self, event ):
-        "Start a new link."
-        if event.widget not in self.widgetToItem:
-            # Didn't click on a node
-            return
-        w = event.widget
-        item = self.widgetToItem[ w ]
-        x, y = self.canvas.coords( item )
-        self.link = self.canvas.create_line( x, y, x, y, width=4,
-                                             fill='blue', tag='link' )
-        self.linkx, self.linky = x, y
-        self.linkWidget = w
-        self.linkItem = item
-
-        # Link bindings
-        # Selection still needs a bit of work overall
-        # Callbacks ignore event
-
-        def select( _event, link=self.link ):
-            "Select item on mouse entry."
-            self.selectItem( link )
-
-        def highlight( _event, link=self.link ):
-            "Highlight item on mouse entry."
-            # self.selectItem( link )
-            self.canvas.itemconfig( link, fill='green' )
-
-        def unhighlight( _event, link=self.link ):
-            "Unhighlight item on mouse exit."
-            self.canvas.itemconfig( link, fill='blue' )
-            # self.selectItem( None )
-
-        self.canvas.tag_bind( self.link, '<Enter>', highlight )
-        self.canvas.tag_bind( self.link, '<Leave>', unhighlight )
-        self.canvas.tag_bind( self.link, '<ButtonPress-1>', select )
-
-    def finishLink( self, event ):
-        "Finish creating a link"
-        if self.link is None:
-            return
-        source = self.linkWidget
-        c = self.canvas
-        # Since we dragged from the widget, use root coords
-        x, y = self.canvasx( event.x_root ), self.canvasy( event.y_root )
-        target = self.findItem( x, y )
-        dest = self.itemToWidget.get( target, None )
-        if ( source is None or dest is None or source == dest
-                or dest in source.links or source in dest.links ):
-            self.releaseLink( event )
-            return
-        # For now, don't allow hosts to be directly linked
-#        stags = self.canvas.gettags( self.widgetToItem[ source ] )
-#        dtags = self.canvas.gettags( target )
-#        if 'Host' in stags and 'Host' in dtags:
-#            self.releaseLink( event )
-#            return
-        x, y = c.coords( target )
-        c.coords( self.link, self.linkx, self.linky, x, y )
-        self.addLink( source, dest )
-        # We're done
-        self.link = self.linkWidget = None
-
-    # Menu handlers
-
-    def about( self ):
-        "Display about box."
-        about = self.aboutBox
-        if about is None:
-            bg = 'white'
-            about = Toplevel( bg='white' )
-            about.title( 'About' )
-            info = self.appName + ': a simple network editor for Mini-CCNx - based on Miniedit '
-            warning = 'Development version - not entirely functional!'
-	    author = 'Carlos Cabral, Jan 2013'
-            author2 = 'Miniedit by Bob Lantz <rlantz@cs>, April 2010'
-            line1 = Label( about, text=info, font='Helvetica 10 bold', bg=bg )
-            line2 = Label( about, text=warning, font='Helvetica 9', bg=bg )
-            line3 = Label( about, text=author, font='Helvetica 9', bg=bg )
-	    line4 = Label( about, text=author2, font='Helvetica 9', bg=bg )
-            line1.pack( padx=20, pady=10 )
-            line2.pack(pady=10 )
-            line3.pack(pady=10 )
-	    line4.pack(pady=10 )
-            hide = ( lambda about=about: about.withdraw() )
-            self.aboutBox = about
-            # Hide on close rather than destroying window
-            Wm.wm_protocol( about, name='WM_DELETE_WINDOW', func=hide )
-        # Show (existing) window
-        about.deiconify()
-
-    def createToolImages( self ):
-        "Create toolbar (and icon) images."
-
-    # Model interface
-    #
-    # Ultimately we will either want to use a topo or
-    # mininet object here, probably.
-
-    def addLink( self, source, dest ):
-        "Add link to model."
-        source.links[ dest ] = self.link
-        dest.links[ source ] = self.link
-        self.links[ self.link ] = ( source, dest )
-
-    def deleteLink( self, link ):
-        "Delete link from model."
-        pair = self.links.get( link, None )
-        if pair is not None:
-            source, dest = pair
-            del source.links[ dest ]
-            del dest.links[ source ]
-        if link is not None:
-            del self.links[ link ]
-
-    def deleteNode( self, item ):
-        "Delete node (and its links) from model."
-        widget = self.itemToWidget[ item ]
-        for link in widget.links.values():
-            # Delete from view and model
-            self.deleteItem( link )
-        del self.itemToWidget[ item ]
-        del self.widgetToItem[ widget ]
-
-    def build( self ):
-        "Build network based on our topology."
-
-        net = Mininet( topo=None )
-
-        # Make controller
-        net.addController( 'c0' )
-        # Make nodes
-        for widget in self.widgetToItem:
-            name = widget[ 'text' ]
-            tags = self.canvas.gettags( self.widgetToItem[ widget ] )
-            nodeNum = int( name[ 1: ] )
-            if 'Switch' in tags:
-                net.addSwitch( name )
-            elif 'Host' in tags:
-                net.addHost( name, ip=ipStr( nodeNum ) )
-            else:
-                raise Exception( "Cannot create mystery node: " + name )
-        # Make links
-        for link in self.links.values():
-            ( src, dst ) = link
-            srcName, dstName = src[ 'text' ], dst[ 'text' ]
-            src, dst = net.nameToNode[ srcName ], net.nameToNode[ dstName ]
-            src.linkTo( dst )
-
-        # Build network (we have to do this separately at the moment )
-        net.build()
-
-        return net
-
-    def start( self ):
-        "Start network."
-        if self.net is None:
-            self.net = self.build()
-            self.net.start()
-
-    def stop( self ):
-        "Stop network."
-        if self.net is not None:
-            self.net.stop()
-        cleanUpScreens()
-        self.net = None
-
-    def xterm( self, _ignore=None ):
-        "Make an xterm when a button is pressed."
-        if ( self.selection is None or
-             self.net is None or
-             self.selection not in self.itemToWidget ):
-            return
-        name = self.itemToWidget[ self.selection ][ 'text' ]
-        if name not in self.net.nameToNode:
-            return
-        term = makeTerm( self.net.nameToNode[ name ], 'Host' )
-        self.net.terms.append( term )
-
-
-def miniEditImages():
-    "Create and return images for MiniEdit."
-
-    # Image data. Git will be unhappy. However, the alternative
-    # is to keep track of separate binary files, which is also
-    # unappealing.
-
-    return {
-        'Select': BitmapImage(
-            file='/usr/include/X11/bitmaps/left_ptr' ),
-
-	'Switch' : PhotoImage( data=r"""
-	   R0lGODlhOgArAMIEAB8aFwB7tQCb343L8P///////////////yH+GlNvZnR3YXJlOiBNaWNyb3NvZnQgT2ZmaWNlACwAAAAAOgArAAAD/ki63P4wykmrvTjr3YYfQigKH7d5Y6qmnjmBayyHg8vAAqDPaUTbowaA13OIahqcyEgEQEbIi7LIGA1FzsaSQK0QfbnH10sMa83VsqX53HLL7sgUTudR5s367F7PEq4CYDJRcngqfgshiAqAMwF3AYdWTCERjSoBjy+ZVItvMg6XIZmaEgOkSmJwlKOkkKSRlaqraaewr7ABhnqBNLmZuL+6vCzCrpvGsB9EH8m5wc7R0sbQ09bT1dOEBLbXwMjeEN7HpuO6Dt3hFObi7Ovj7d7bEOnYD+4V8PfqF/wN/lKsxZPmop6wBwaFzTsRbVvCWzYQmlMW0UKzZCUqatzICLGjx48gKyYAADs=
-"""),
-	'Host' : PhotoImage( data=r"""
-	    R0lGODlhKQAyAMIHAJyeoK+wsrW2uMHCxM7P0Ozt7fn5+f///yH+EUNyZWF0ZWQgd2l0aCBHSU1QACwAAAAAKQAyAAAD63i63P4wykmrvS4cwLv/IEhxRxGeKGBM3pa+X9QeBmxrT3gMNpyLrt6rgcJgisKXgIFMopaLpjMEVUinn2pQ1ImSrN8uGKCVegHn8bl8CqbV7jFbJ47H650592sX4zl6MX9ocIOBLYNvhkxtiYV8eYx0kJSEi2d7WFmSmZqRmIKeHoddoqOcoaZkqIiqq6CtqqQkrq9jnaKzaLW6Wy8DBMHCp7ClPT+ArMY2t1u9Qs3Et6k+W87KtMfW0r6x1d7P2uDYu+LLtt3nQ9ufxeXM7MkOuCnR7UTe6/jyEOqeWj/SYQEowxXBfgYPJAAAOw==
-"""),
-        'Hosti': PhotoImage( data=r"""
-            R0lGODlhIAAYAPcAMf//////zP//mf//Zv//M///AP/M///MzP/M
-            mf/MZv/MM//MAP+Z//+ZzP+Zmf+ZZv+ZM/+ZAP9m//9mzP9mmf9m
-            Zv9mM/9mAP8z//8zzP8zmf8zZv8zM/8zAP8A//8AzP8Amf8AZv8A
-            M/8AAMz//8z/zMz/mcz/Zsz/M8z/AMzM/8zMzMzMmczMZszMM8zM
-            AMyZ/8yZzMyZmcyZZsyZM8yZAMxm/8xmzMxmmcxmZsxmM8xmAMwz
-            /8wzzMwzmcwzZswzM8wzAMwA/8wAzMwAmcwAZswAM8wAAJn//5n/
-            zJn/mZn/Zpn/M5n/AJnM/5nMzJnMmZnMZpnMM5nMAJmZ/5mZzJmZ
-            mZmZZpmZM5mZAJlm/5lmzJlmmZlmZplmM5lmAJkz/5kzzJkzmZkz
-            ZpkzM5kzAJkA/5kAzJkAmZkAZpkAM5kAAGb//2b/zGb/mWb/Zmb/
-            M2b/AGbM/2bMzGbMmWbMZmbMM2bMAGaZ/2aZzGaZmWaZZmaZM2aZ
-            AGZm/2ZmzGZmmWZmZmZmM2ZmAGYz/2YzzGYzmWYzZmYzM2YzAGYA
-            /2YAzGYAmWYAZmYAM2YAADP//zP/zDP/mTP/ZjP/MzP/ADPM/zPM
-            zDPMmTPMZjPMMzPMADOZ/zOZzDOZmTOZZjOZMzOZADNm/zNmzDNm
-            mTNmZjNmMzNmADMz/zMzzDMzmTMzZjMzMzMzADMA/zMAzDMAmTMA
-            ZjMAMzMAAAD//wD/zAD/mQD/ZgD/MwD/AADM/wDMzADMmQDMZgDM
-            MwDMAACZ/wCZzACZmQCZZgCZMwCZAABm/wBmzABmmQBmZgBmMwBm
-            AAAz/wAzzAAzmQAzZgAzMwAzAAAA/wAAzAAAmQAAZgAAM+4AAN0A
-            ALsAAKoAAIgAAHcAAFUAAEQAACIAABEAAADuAADdAAC7AACqAACI
-            AAB3AABVAABEAAAiAAARAAAA7gAA3QAAuwAAqgAAiAAAdwAAVQAA
-            RAAAIgAAEe7u7t3d3bu7u6qqqoiIiHd3d1VVVURERCIiIhEREQAA
-            ACH5BAEAAAAALAAAAAAgABgAAAiNAAH8G0iwoMGDCAcKTMiw4UBw
-            BPXVm0ixosWLFvVBHFjPoUeC9Tb+6/jRY0iQ/8iVbHiS40CVKxG2
-            HEkQZsyCM0mmvGkw50uePUV2tEnOZkyfQA8iTYpTKNOgKJ+C3AhO
-            p9SWVaVOfWj1KdauTL9q5UgVbFKsEjGqXVtP40NwcBnCjXtw7tx/
-            C8cSBBAQADs=
-        """ ),
-
-        'Switchi': PhotoImage( data=r"""
-            R0lGODlhIAAYAPcAMf//////zP//mf//Zv//M///AP/M///MzP/M
-            mf/MZv/MM//MAP+Z//+ZzP+Zmf+ZZv+ZM/+ZAP9m//9mzP9mmf9m
-            Zv9mM/9mAP8z//8zzP8zmf8zZv8zM/8zAP8A//8AzP8Amf8AZv8A
-            M/8AAMz//8z/zMz/mcz/Zsz/M8z/AMzM/8zMzMzMmczMZszMM8zM
-            AMyZ/8yZzMyZmcyZZsyZM8yZAMxm/8xmzMxmmcxmZsxmM8xmAMwz
-            /8wzzMwzmcwzZswzM8wzAMwA/8wAzMwAmcwAZswAM8wAAJn//5n/
-            zJn/mZn/Zpn/M5n/AJnM/5nMzJnMmZnMZpnMM5nMAJmZ/5mZzJmZ
-            mZmZZpmZM5mZAJlm/5lmzJlmmZlmZplmM5lmAJkz/5kzzJkzmZkz
-            ZpkzM5kzAJkA/5kAzJkAmZkAZpkAM5kAAGb//2b/zGb/mWb/Zmb/
-            M2b/AGbM/2bMzGbMmWbMZmbMM2bMAGaZ/2aZzGaZmWaZZmaZM2aZ
-            AGZm/2ZmzGZmmWZmZmZmM2ZmAGYz/2YzzGYzmWYzZmYzM2YzAGYA
-            /2YAzGYAmWYAZmYAM2YAADP//zP/zDP/mTP/ZjP/MzP/ADPM/zPM
-            zDPMmTPMZjPMMzPMADOZ/zOZzDOZmTOZZjOZMzOZADNm/zNmzDNm
-            mTNmZjNmMzNmADMz/zMzzDMzmTMzZjMzMzMzADMA/zMAzDMAmTMA
-            ZjMAMzMAAAD//wD/zAD/mQD/ZgD/MwD/AADM/wDMzADMmQDMZgDM
-            MwDMAACZ/wCZzACZmQCZZgCZMwCZAABm/wBmzABmmQBmZgBmMwBm
-            AAAz/wAzzAAzmQAzZgAzMwAzAAAA/wAAzAAAmQAAZgAAM+4AAN0A
-            ALsAAKoAAIgAAHcAAFUAAEQAACIAABEAAADuAADdAAC7AACqAACI
-            AAB3AABVAABEAAAiAAARAAAA7gAA3QAAuwAAqgAAiAAAdwAAVQAA
-            RAAAIgAAEe7u7t3d3bu7u6qqqoiIiHd3d1VVVURERCIiIhEREQAA
-            ACH5BAEAAAAALAAAAAAgABgAAAhwAAEIHEiwoMGDCBMqXMiwocOH
-            ECNKnEixosWB3zJq3Mixo0eNAL7xG0mypMmTKPl9Cznyn8uWL/m5
-            /AeTpsyYI1eKlBnO5r+eLYHy9Ck0J8ubPmPOrMmUpM6UUKMa/Ui1
-            6saLWLNq3cq1q9evYB0GBAA7
-        """ ),
-
-        'Link': PhotoImage( data=r"""
-            R0lGODlhFgAWAPcAMf//////zP//mf//Zv//M///AP/M///MzP/M
-            mf/MZv/MM//MAP+Z//+ZzP+Zmf+ZZv+ZM/+ZAP9m//9mzP9mmf9m
-            Zv9mM/9mAP8z//8zzP8zmf8zZv8zM/8zAP8A//8AzP8Amf8AZv8A
-            M/8AAMz//8z/zMz/mcz/Zsz/M8z/AMzM/8zMzMzMmczMZszMM8zM
-            AMyZ/8yZzMyZmcyZZsyZM8yZAMxm/8xmzMxmmcxmZsxmM8xmAMwz
-            /8wzzMwzmcwzZswzM8wzAMwA/8wAzMwAmcwAZswAM8wAAJn//5n/
-            zJn/mZn/Zpn/M5n/AJnM/5nMzJnMmZnMZpnMM5nMAJmZ/5mZzJmZ
-            mZmZZpmZM5mZAJlm/5lmzJlmmZlmZplmM5lmAJkz/5kzzJkzmZkz
-            ZpkzM5kzAJkA/5kAzJkAmZkAZpkAM5kAAGb//2b/zGb/mWb/Zmb/
-            M2b/AGbM/2bMzGbMmWbMZmbMM2bMAGaZ/2aZzGaZmWaZZmaZM2aZ
-            AGZm/2ZmzGZmmWZmZmZmM2ZmAGYz/2YzzGYzmWYzZmYzM2YzAGYA
-            /2YAzGYAmWYAZmYAM2YAADP//zP/zDP/mTP/ZjP/MzP/ADPM/zPM
-            zDPMmTPMZjPMMzPMADOZ/zOZzDOZmTOZZjOZMzOZADNm/zNmzDNm
-            mTNmZjNmMzNmADMz/zMzzDMzmTMzZjMzMzMzADMA/zMAzDMAmTMA
-            ZjMAMzMAAAD//wD/zAD/mQD/ZgD/MwD/AADM/wDMzADMmQDMZgDM
-            MwDMAACZ/wCZzACZmQCZZgCZMwCZAABm/wBmzABmmQBmZgBmMwBm
-            AAAz/wAzzAAzmQAzZgAzMwAzAAAA/wAAzAAAmQAAZgAAM+4AAN0A
-            ALsAAKoAAIgAAHcAAFUAAEQAACIAABEAAADuAADdAAC7AACqAACI
-            AAB3AABVAABEAAAiAAARAAAA7gAA3QAAuwAAqgAAiAAAdwAAVQAA
-            RAAAIgAAEe7u7t3d3bu7u6qqqoiIiHd3d1VVVURERCIiIhEREQAA
-            ACH5BAEAAAAALAAAAAAWABYAAAhIAAEIHEiwoEGBrhIeXEgwoUKG
-            Cx0+hGhQoiuKBy1irChxY0GNHgeCDAlgZEiTHlFuVImRJUWXEGEy
-            lBmxI8mSNknm1Dnx5sCAADs=
-        """ )
-    }
-
-if __name__ == '__main__':
-    setLogLevel( 'info' )
-    temp_file = parse_args()[0]
-    app = MiniEdit(template_file=temp_file)
-    app.mainloop()
diff --git a/examples/multiping.py b/examples/multiping.py
deleted file mode 100644
index 3bd231c..0000000
--- a/examples/multiping.py
+++ /dev/null
@@ -1,86 +0,0 @@
-#!/usr/bin/python
-
-"""
-multiping.py: monitor multiple sets of hosts using ping
-
-This demonstrates how one may send a simple shell script to
-multiple hosts and monitor their output interactively for a period=
-of time.
-"""
-
-from mininet.net import Mininet
-from mininet.node import Node
-from mininet.topo import SingleSwitchTopo
-from mininet.log import setLogLevel
-
-from select import poll, POLLIN
-from time import time
-
-def chunks( l, n ):
-    "Divide list l into chunks of size n - thanks Stackoverflow"
-    return [ l[ i: i + n ] for i in range( 0, len( l ), n ) ]
-
-def startpings( host, targetips ):
-    "Tell host to repeatedly ping targets"
-
-    targetips.append( '10.0.0.200' )
-
-    targetips = ' '.join( targetips )
-
-    # BL: Not sure why loopback intf isn't up!
-    host.cmd( 'ifconfig lo up' )
-
-    # Simple ping loop
-    cmd = ( 'while true; do '
-            ' for ip in %s; do ' % targetips +
-            '  echo -n %s "->" $ip ' % host.IP() +
-            '   `ping -c1 -w 1 $ip | grep packets` ;'
-            '  sleep 1;'
-            ' done; '
-            'done &' )
-
-    print ( '*** Host %s (%s) will be pinging ips: %s' %
-            ( host.name, host.IP(), targetips ) )
-
-    host.cmd( cmd )
-
-def multiping( netsize, chunksize, seconds):
-    "Ping subsets of size chunksize in net of size netsize"
-
-    # Create network and identify subnets
-    topo = SingleSwitchTopo( netsize )
-    net = Mininet( topo=topo )
-    net.start()
-    hosts = net.hosts
-    subnets = chunks( hosts, chunksize )
-
-    # Create polling object
-    fds = [ host.stdout.fileno() for host in hosts ]
-    poller = poll()
-    for fd in fds:
-        poller.register( fd, POLLIN )
-
-    # Start pings
-    for subnet in subnets:
-        ips = [ host.IP() for host in subnet ]
-        for host in subnet:
-            startpings( host, ips )
-
-    # Monitor output
-    endTime = time() + seconds
-    while time() < endTime:
-        readable = poller.poll(1000)
-        for fd, _mask in readable:
-            node = Node.outToNode[ fd ]
-            print '%s:' % node.name, node.monitor().strip()
-
-    # Stop pings
-    for host in hosts:
-        host.cmd( 'kill %while' )
-
-    net.stop()
-
-
-if __name__ == '__main__':
-    setLogLevel( 'info' )
-    multiping( netsize=20, chunksize=4, seconds=10 )
diff --git a/examples/multipoll.py b/examples/multipoll.py
deleted file mode 100644
index aef1b10..0000000
--- a/examples/multipoll.py
+++ /dev/null
@@ -1,81 +0,0 @@
-#!/usr/bin/python
-
-"""
-Simple example of sending output to multiple files and
-monitoring them
-"""
-
-from mininet.topo import SingleSwitchTopo
-from mininet.net import Mininet
-from mininet.log import setLogLevel
-
-from time import time
-from select import poll, POLLIN
-from subprocess import Popen, PIPE
-
-def monitorFiles( outfiles, seconds, timeoutms ):
-    "Monitor set of files and return [(host, line)...]"
-    devnull = open( '/dev/null', 'w' )
-    tails, fdToFile, fdToHost = {}, {}, {}
-    for h, outfile in outfiles.iteritems():
-        tail = Popen( [ 'tail', '-f', outfile ],
-                      stdout=PIPE, stderr=devnull )
-        fd = tail.stdout.fileno()
-        tails[ h ] = tail
-        fdToFile[ fd ] = tail.stdout
-        fdToHost[ fd ] = h
-    # Prepare to poll output files
-    readable = poll()
-    for t in tails.values():
-        readable.register( t.stdout.fileno(), POLLIN )
-    # Run until a set number of seconds have elapsed
-    endTime = time() + seconds
-    while time() < endTime:
-        fdlist = readable.poll(timeoutms)
-        if fdlist:
-            for fd, _flags in fdlist:
-                f = fdToFile[ fd ]
-                host = fdToHost[ fd ]
-                # Wait for a line of output
-                line = f.readline().strip()
-                yield host, line
-        else:
-            # If we timed out, return nothing
-            yield None, ''
-    for t in tails.values():
-        t.terminate()
-    devnull.close()  # Not really necessary
-
-
-def monitorTest( N=3, seconds=3 ):
-    "Run pings and monitor multiple hosts"
-    topo = SingleSwitchTopo( N )
-    net = Mininet( topo )
-    net.start()
-    hosts = net.hosts
-    print "Starting test..."
-    server = hosts[ 0 ]
-    outfiles, errfiles = {}, {}
-    for h in hosts:
-        # Create and/or erase output files
-        outfiles[ h ] = '/tmp/%s.out' % h.name
-        errfiles[ h ] = '/tmp/%s.err' % h.name
-        h.cmd( 'echo >', outfiles[ h ] )
-        h.cmd( 'echo >', errfiles[ h ] )
-        # Start pings
-        h.cmdPrint('ping', server.IP(),
-                   '>', outfiles[ h ],
-                   '2>', errfiles[ h ],
-                   '&' )
-    print "Monitoring output for", seconds, "seconds"
-    for h, line in monitorFiles( outfiles, seconds, timeoutms=500 ):
-        if h:
-            print '%s: %s' % ( h.name, line )
-    for h in hosts:
-        h.cmd('kill %ping')
-    net.stop()
-
-
-if __name__ == '__main__':
-    setLogLevel('info')
-    monitorTest()
diff --git a/examples/multitest.py b/examples/multitest.py
deleted file mode 100644
index bcb40f7..0000000
--- a/examples/multitest.py
+++ /dev/null
@@ -1,35 +0,0 @@
-#!/usr/bin/python
-
-"""
-This example shows how to create a network and run multiple tests.
-For a more complicated test example, see udpbwtest.py.
-"""
-
-from mininet.cli import CLI
-from mininet.log import lg, info
-from mininet.net import Mininet
-from mininet.node import OVSKernelSwitch
-from mininet.topolib import TreeTopo
-
-def ifconfigTest( net ):
-    "Run ifconfig on all hosts in net."
-    hosts = net.hosts
-    for host in hosts:
-        info( host.cmd( 'ifconfig' ) )
-
-if __name__ == '__main__':
-    lg.setLogLevel( 'info' )
-    info( "*** Initializing Mininet and kernel modules\n" )
-    OVSKernelSwitch.setup()
-    info( "*** Creating network\n" )
-    network = Mininet( TreeTopo( depth=2, fanout=2 ), switch=OVSKernelSwitch)
-    info( "*** Starting network\n" )
-    network.start()
-    info( "*** Running ping test\n" )
-    network.pingAll()
-    info( "*** Running ifconfig test\n" )
-    ifconfigTest( network )
-    info( "*** Starting CLI (type 'exit' to exit)\n" )
-    CLI( network )
-    info( "*** Stopping network\n" )
-    network.stop()
diff --git a/examples/popen.py b/examples/popen.py
deleted file mode 100644
index 332822f..0000000
--- a/examples/popen.py
+++ /dev/null
@@ -1,36 +0,0 @@
-#!/usr/bin/python
-
-"""
-This example monitors a number of hosts using host.popen() and
-pmonitor()
-"""
-
-from mininet.net import Mininet
-from mininet.node import CPULimitedHost
-from mininet.topo import SingleSwitchTopo
-from mininet.log import setLogLevel
-from mininet.util import custom, pmonitor
-
-def monitorhosts( hosts=5, sched='cfs' ):
-    "Start a bunch of pings and monitor them using popen"
-    mytopo = SingleSwitchTopo( hosts )
-    cpu = .5 / hosts
-    myhost = custom( CPULimitedHost, cpu=cpu, sched=sched )
-    net = Mininet( topo=mytopo, host=myhost )
-    net.start()
-    # Start a bunch of pings
-    popens = {}
-    last = net.hosts[ -1 ]
-    for host in net.hosts:
-        popens[ host ] = host.popen( "ping -c5 %s" % last.IP() )
-        last = host
-    # Monitor them and print output
-    for host, line in pmonitor( popens ):
-        if host:
-            print "<%s>: %s" % ( host.name, line.strip() )
-    # Done
-    net.stop()
-
-if __name__ == '__main__':
-    setLogLevel( 'info' )
-    monitorhosts( hosts=5 )
diff --git a/examples/popenpoll.py b/examples/popenpoll.py
deleted file mode 100644
index c581c27..0000000
--- a/examples/popenpoll.py
+++ /dev/null
@@ -1,33 +0,0 @@
-#!/usr/bin/python
-
-"Monitor multiple hosts using popen()/pmonitor()"
-
-from mininet.net import Mininet
-from mininet.topo import SingleSwitchTopo
-from mininet.util import pmonitor
-from time import time
-from signal import SIGINT
-
-def pmonitorTest( N=3, seconds=10 ):
-    "Run pings and monitor multiple hosts using pmonitor"
-    topo = SingleSwitchTopo( N )
-    net = Mininet( topo )
-    net.start()
-    hosts = net.hosts
-    print "Starting test..."
-    server = hosts[ 0 ]
-    popens = {}
-    for h in hosts:
-        popens[ h ] = h.popen('ping', server.IP() )
-    print "Monitoring output for", seconds, "seconds"
-    endTime = time() + seconds
-    for h, line in pmonitor( popens, timeoutms=500 ):
-        if h:
-            print '%s: %s' % ( h.name, line ),
-        if time() >= endTime:
-            for p in popens.values():
-                p.send_signal( SIGINT )
-    net.stop()
-
-if __name__ == '__main__':
-    pmonitorTest()
diff --git a/examples/router.gif b/examples/router.gif
deleted file mode 100644
index a670ac7..0000000
--- a/examples/router.gif
+++ /dev/null
Binary files differ
diff --git a/examples/scratchnet.py b/examples/scratchnet.py
deleted file mode 100644
index 966a183..0000000
--- a/examples/scratchnet.py
+++ /dev/null
@@ -1,68 +0,0 @@
-#!/usr/bin/python
-
-"""
-Build a simple network from scratch, using mininet primitives.
-This is more complicated than using the higher-level classes,
-but it exposes the configuration details and allows customization.
-
-For most tasks, the higher-level API will be preferable.
-"""
-
-from mininet.net import Mininet
-from mininet.node import Node
-from mininet.link import Link
-from mininet.log import setLogLevel, info
-from mininet.util import quietRun
-
-from time import sleep
-
-def scratchNet( cname='controller', cargs='-v ptcp:' ):
-    "Create network from scratch using Open vSwitch."
-
-    info( "*** Creating nodes\n" )
-    controller = Node( 'c0', inNamespace=False )
-    switch = Node( 's0', inNamespace=False )
-    h0 = Node( 'h0' )
-    h1 = Node( 'h1' )
-
-    info( "*** Creating links\n" )
-    Link( h0, switch )
-    Link( h1, switch )
-
-    info( "*** Configuring hosts\n" )
-    h0.setIP( '192.168.123.1/24' )
-    h1.setIP( '192.168.123.2/24' )
-    info( str( h0 ) + '\n' )
-    info( str( h1 ) + '\n' )
-
-    info( "*** Starting network using Open vSwitch\n" )
-    controller.cmd( cname + ' ' + cargs + '&' )
-    switch.cmd( 'ovs-vsctl del-br dp0' )
-    switch.cmd( 'ovs-vsctl add-br dp0' )
-    for intf in switch.intfs.values():
-        print switch.cmd( 'ovs-vsctl add-port dp0 %s' % intf )
-
-    # Note: controller and switch are in root namespace, and we
-    # can connect via loopback interface
-    switch.cmd( 'ovs-vsctl set-controller dp0 tcp:127.0.0.1:6633' )
-
-    info( '*** Waiting for switch to connect to controller' )
-    while 'is_connected' not in quietRun( 'ovs-vsctl show' ):
-        sleep( 1 )
-        info( '.' )
-    info( '\n' )
-
-    info( "*** Running test\n" )
-    h0.cmdPrint( 'ping -c1 ' + h1.IP() )
-
-    info( "*** Stopping network\n" )
-    controller.cmd( 'kill %' + cname )
-    switch.cmd( 'ovs-vsctl del-br dp0' )
-    switch.deleteIntfs()
-    info( '\n' )
-
-if __name__ == '__main__':
-    setLogLevel( 'info' )
-    info( '*** Scratch network demo (kernel datapath)\n' )
-    Mininet.init()
-    scratchNet()
diff --git a/examples/scratchnetuser.py b/examples/scratchnetuser.py
deleted file mode 100644
index ccd20e9..0000000
--- a/examples/scratchnetuser.py
+++ /dev/null
@@ -1,73 +0,0 @@
-#!/usr/bin/python
-
-"""
-Build a simple network from scratch, using mininet primitives.
-This is more complicated than using the higher-level classes,
-but it exposes the configuration details and allows customization.
-
-For most tasks, the higher-level API will be preferable.
-
-This version uses the user datapath and an explicit control network.
-"""
-
-from mininet.net import Mininet
-from mininet.node import Node
-from mininet.link import Link
-from mininet.log import setLogLevel, info
-
-def linkIntfs( node1, node2 ):
-    "Create link from node1 to node2 and return intfs"
-    link = Link( node1, node2 )
-    return link.intf1, link.intf2
-
-def scratchNetUser( cname='controller', cargs='ptcp:' ):
-    "Create network from scratch using user switch."
-
-    # It's not strictly necessary for the controller and switches
-    # to be in separate namespaces. For performance, they probably
-    # should be in the root namespace. However, it's interesting to
-    # see how they could work even if they are in separate namespaces.
-
-    info( '*** Creating Network\n' )
-    controller = Node( 'c0' )
-    switch = Node( 's0')
-    h0 = Node( 'h0' )
-    h1 = Node( 'h1' )
-    cintf, sintf = linkIntfs( controller, switch )
-    h0intf, sintf1 = linkIntfs( h0, switch )
-    h1intf, sintf2 = linkIntfs( h1, switch )
-
-    info( '*** Configuring control network\n' )
-    controller.setIP( '10.0.123.1/24', intf=cintf )
-    switch.setIP( '10.0.123.2/24', intf=sintf)
-
-    info( '*** Configuring hosts\n' )
-    h0.setIP( '192.168.123.1/24', intf=h0intf )
-    h1.setIP( '192.168.123.2/24', intf=h1intf )
-
-    info( '*** Network state:\n' )
-    for node in controller, switch, h0, h1:
-        info( str( node ) + '\n' )
-
-    info( '*** Starting controller and user datapath\n' )
-    controller.cmd( cname + ' ' + cargs + '&' )
-    switch.cmd( 'ifconfig lo 127.0.0.1' )
-    intfs = [ str( i ) for i in sintf1, sintf2 ]
-    switch.cmd( 'ofdatapath -i ' + ','.join( intfs ) + ' ptcp: &' )
-    switch.cmd( 'ofprotocol tcp:' + controller.IP() + ' tcp:localhost &' )
-
-    info( '*** Running test\n' )
-    h0.cmdPrint( 'ping -c1 ' + h1.IP() )
-
-    info( '*** Stopping network\n' )
-    controller.cmd( 'kill %' + cname )
-    switch.cmd( 'kill %ofdatapath' )
-    switch.cmd( 'kill %ofprotocol' )
-    switch.deleteIntfs()
-    info( '\n' )
-
-if __name__ == '__main__':
-    setLogLevel( 'info' )
-    info( '*** Scratch network demo (user datapath)\n' )
-    Mininet.init()
-    scratchNetUser()
diff --git a/examples/server.gif b/examples/server.gif
deleted file mode 100644
index b16b0da..0000000
--- a/examples/server.gif
+++ /dev/null
Binary files differ
diff --git a/examples/simpleperf.py b/examples/simpleperf.py
deleted file mode 100644
index 1da4b66..0000000
--- a/examples/simpleperf.py
+++ /dev/null
@@ -1,49 +0,0 @@
-#!/usr/bin/python
-
-"""
-Simple example of setting network and CPU parameters
-
-NOTE: link params limit BW, add latency, and loss.
-There is a high chance that pings WILL fail and that
-iperf will hang indefinitely if the TCP handshake fails
-to complete.
-"""
-
-from mininet.topo import Topo
-from mininet.net import Mininet
-from mininet.node import CPULimitedHost
-from mininet.link import TCLink
-from mininet.util import dumpNodeConnections
-from mininet.log import setLogLevel
-
-class SingleSwitchTopo(Topo):
-    "Single switch connected to n hosts."
-    def __init__(self, n=2, **opts):
-        Topo.__init__(self, **opts)
-        switch = self.addSwitch('s1')
-        for h in range(n):
-            # Each host gets 50%/n of system CPU
-            host = self.addHost('h%s' % (h + 1),
-                                cpu=.5 / n)
-            # 10 Mbps, 5ms delay, 10% loss
-            self.addLink(host, switch,
-                         bw=10, delay='5ms', loss=10, use_htb=True)
-
-def perfTest():
-    "Create network and run simple performance test"
-    topo = SingleSwitchTopo(n=4)
-    net = Mininet(topo=topo,
-                  host=CPULimitedHost, link=TCLink)
-    net.start()
-    print "Dumping host connections"
-    dumpNodeConnections(net.hosts)
-    print "Testing network connectivity"
-    net.pingAll()
-    print "Testing bandwidth between h1 and h4"
-    h1, h4 = net.getNodeByName('h1', 'h4')
-    net.iperf((h1, h4))
-    net.stop()
-
-if __name__ == '__main__':
-    setLogLevel('info')
-    perfTest()
diff --git a/examples/sshd.py b/examples/sshd.py
deleted file mode 100644
index 2bedb9c..0000000
--- a/examples/sshd.py
+++ /dev/null
@@ -1,71 +0,0 @@
-#!/usr/bin/python
-
-"""
-Create a network and start sshd(8) on each host.
-
-While something like rshd(8) would be lighter and faster,
-(and perfectly adequate on an in-machine network)
-the advantage of running sshd is that scripts can work
-unchanged on mininet and hardware.
-
-In addition to providing ssh access to hosts, this example
-demonstrates:
-
-- creating a convenience function to construct networks
-- connecting the host network to the root namespace
-- running server processes (sshd in this case) on hosts
-"""
-
-from mininet.net import Mininet
-from mininet.cli import CLI
-from mininet.log import lg
-from mininet.node import Node, OVSKernelSwitch
-from mininet.topolib import TreeTopo
-from mininet.link import Link
-
-def TreeNet( depth=1, fanout=2, **kwargs ):
-    "Convenience function for creating tree networks."
-    topo = TreeTopo( depth, fanout )
-    return Mininet( topo, **kwargs )
-
-def connectToRootNS( network, switch, ip, prefixLen, routes ):
-    """Connect hosts to root namespace via switch. Starts network.
-      network: Mininet() network object
-      switch: switch to connect to root namespace
-      ip: IP address for root namespace node
-      prefixLen: IP address prefix length (e.g. 8, 16, 24)
-      routes: host networks to route to"""
-    # Create a node in root namespace and link to switch 0
-    root = Node( 'root', inNamespace=False )
-    intf = Link( root, switch ).intf1
-    root.setIP( ip, prefixLen, intf )
-    # Start network that now includes link to root namespace
-    network.start()
-    # Add routes from root ns to hosts
-    for route in routes:
-        root.cmd( 'route add -net ' + route + ' dev ' + str( intf ) )
-
-def sshd( network, cmd='/usr/sbin/sshd', opts='-D' ):
-    "Start a network, connect it to root ns, and run sshd on all hosts."
-    switch = network.switches[ 0 ]  # switch to use
-    ip = '10.123.123.1'  # our IP address on host network
-    routes = [ '10.0.0.0/8' ]  # host networks to route to
-    connectToRootNS( network, switch, ip, 8, routes )
-    for host in network.hosts:
-        host.cmd( cmd + ' ' + opts + '&' )
-    print
-    print "*** Hosts are running sshd at the following addresses:"
-    print
-    for host in network.hosts:
-        print host.name, host.IP()
-    print
-    print "*** Type 'exit' or control-D to shut down network"
-    CLI( network )
-    for host in network.hosts:
-        host.cmd( 'kill %' + cmd )
-    network.stop()
-
-if __name__ == '__main__':
-    lg.setLogLevel( 'info')
-    net = TreeNet( depth=1, fanout=4, switch=OVSKernelSwitch )
-    sshd( net )
diff --git a/examples/tree1024.py b/examples/tree1024.py
deleted file mode 100644
index 9397131..0000000
--- a/examples/tree1024.py
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/python
-
-"""
-Create a 1024-host network, and run the CLI on it.
-If this fails because of kernel limits, you may have
-to adjust them, e.g. by adding entries to /etc/sysctl.conf
-and running sysctl -p. Check util/sysctl_addon.
-"""
-
-from mininet.cli import CLI
-from mininet.log import setLogLevel
-from mininet.node import OVSKernelSwitch
-from mininet.topolib import TreeNet
-
-if __name__ == '__main__':
-    setLogLevel( 'info' )
-    network = TreeNet( depth=2, fanout=32, switch=OVSKernelSwitch )
-    network.run( CLI, network )
diff --git a/examples/treeping64.py b/examples/treeping64.py
deleted file mode 100644
index ba60f1b..0000000
--- a/examples/treeping64.py
+++ /dev/null
@@ -1,32 +0,0 @@
-#!/usr/bin/python
-
-"Create a 64-node tree network, and test connectivity using ping."
-
-from mininet.log import setLogLevel
-from mininet.node import UserSwitch, OVSKernelSwitch  # , KernelSwitch
-from mininet.topolib import TreeNet
-
-def treePing64():
-    "Run ping test on 64-node tree networks."
-
-    results = {}
-    switches = {  # 'reference kernel': KernelSwitch,
-                  'reference user': UserSwitch,
-                  'Open vSwitch kernel': OVSKernelSwitch }
-
-    for name in switches:
-        print "*** Testing", name, "datapath"
-        switch = switches[ name ]
-        network = TreeNet( depth=2, fanout=8, switch=switch )
-        result = network.run( network.pingAll )
-        results[ name ] = result
-
-    print
-    print "*** Tree network ping results:"
-    for name in switches:
-        print "%s: %d%% packet loss" % ( name, results[ name ] )
-    print
-
-if __name__ == '__main__':
-    setLogLevel( 'info' )
-    treePing64()
diff --git a/install.sh b/install.sh
new file mode 100755
index 0000000..ca86513
--- /dev/null
+++ b/install.sh
@@ -0,0 +1,182 @@
+#!/bin/bash
+
+test -e /etc/debian_version && DIST="Debian"
+grep Ubuntu /etc/lsb-release &> /dev/null && DIST="Ubuntu"
+
+if [[ $DIST == Ubuntu || $DIST == Debian ]]; then
+    update='sudo apt-get update'
+    install='sudo apt-get -y install'
+    remove='sudo apt-get -y remove'
+    pkginst='sudo dpkg -i'
+    # Prereqs for this script
+    if ! which lsb_release &> /dev/null; then
+        $install lsb-release
+    fi
+fi
+
+test -e /etc/fedora-release && DIST="Fedora"
+if [[ $DIST == Fedora ]]; then
+    update='sudo yum update'
+    install='sudo yum -y install'
+    remove='sudo yum -y erase'
+    pkginst='sudo rpm -ivh'
+    # Prereqs for this script
+    if ! which lsb_release &> /dev/null; then
+        $install redhat-lsb-core
+    fi
+fi
+
+function forwarder {
+    if [[ $cxx != true ]]; then
+        ndncxx
+        cxx="true"
+    fi
+
+    if [[ $DIST == Ubuntu || $DIST == Debian ]]; then
+        $install libpcap-dev pkg-config
+    fi
+
+    if [[ $DIST == Fedora ]]; then
+        $install libpcap-devel
+    fi
+
+    git clone --depth 1 https://github.com/named-data/NFD
+    cd NFD
+    ./waf configure --without-websocket
+    ./waf
+    sudo ./waf install
+    cd ../
+}
+
+function routing {
+    if [[ $cxx != true ]]; then
+        ndncxx
+        cxx="true"
+    fi
+
+    if [[ $DIST == Ubuntu ]]; then
+        $install liblog4cxx10-dev libprotobuf-dev protobuf-compiler
+    fi
+
+    if [[ $DIST == Fedora ]]; then
+        $install log4cxx log4cxx-devel openssl-devel protobuf-devel
+    fi
+
+    git clone --depth 1 https://github.com/named-data/NLSR
+    cd NLSR
+    ./waf configure
+    ./waf
+    sudo ./waf install
+    cd ../
+}
+
+function ndncxx {
+    if [[ updated != true ]]; then
+        $update
+        updated="true"
+    fi
+
+    if [[ $DIST == Ubuntu || $DIST == Debian ]]; then
+        $install git libsqlite3-dev libboost-all-dev make g++
+        crypto
+    fi
+
+    if [[ $DIST == Fedora ]]; then
+        $install gcc-c++ sqlite-devel boost-devel
+    fi
+
+    git clone --depth 1 https://github.com/named-data/ndn-cxx
+    cd ndn-cxx
+    ./waf configure
+    ./waf
+    sudo ./waf install
+    cd ../
+}
+
+function crypto {
+    mkdir crypto
+    cd crypto
+    $install unzip
+    wget http://www.cryptopp.com/cryptopp562.zip
+    unzip cryptopp562.zip
+    make
+    sudo make install
+    cd ../
+}
+
+function tools {
+    if [[ $cxx != true ]]; then
+        ndncxx
+        cxx="true"
+    fi
+
+    git clone --depth 1 https://github.com/named-data/ndn-tools
+    cd ndn-tools
+    ./waf configure
+    ./waf
+    sudo ./waf install
+    cd ../
+}
+
+function mininet {
+    if [[ updated != true ]]; then
+        $update
+        updated="true"
+    fi
+
+    if [[ $pysetup != true ]]; then
+        pysetup="true"
+    fi
+
+    git clone --depth 1 https://github.com/mininet/mininet
+    cd mininet
+    sudo ./util/install.sh -fnv
+    cd ../
+}
+
+function minindn {
+    if [[ updated != true ]]; then
+        $update
+        updated="true"
+    fi
+
+    if [[ $pysetup != true ]]; then
+        $install python-setuptools
+        pysetup="true"
+    fi
+    sudo mkdir -p /usr/local/etc/mini-ndn/
+    sudo cp ndn_utils/client.conf.sample /usr/local/etc/mini-ndn/
+    sudo cp ndn_utils/nfd.conf /usr/local/etc/mini-ndn/
+    sudo cp ndn_utils/nlsr.conf /usr/local/etc/mini-ndn/
+    sudo python setup.py install
+}
+
+
+function usage {
+    printf '\nUsage: %s [-mfrti]\n\n' $(basename $0) >&2
+
+    printf 'options:\n' >&2
+    printf -- ' -f: install NFD\n' >&2
+    printf -- ' -i: install mini-ndn\n' >&2
+    printf -- ' -m: install mininet and dependencies\n' >&2
+    printf -- ' -r: install NLSR\n' >&2
+    printf -- ' -t: install tools\n' >&2
+    exit 2
+}
+
+if [[ $# -eq 0 ]]; then
+    usage
+else
+    while getopts 'mfrti' OPTION
+    do
+        case $OPTION in
+        f)    forwarder;;
+        i)    minindn;;
+        m)    mininet;;
+        r)    routing;;
+        t)    tools;;
+        ?)    usage;;
+        esac
+    done
+    shift $(($OPTIND - 1))
+fi
diff --git a/mininet/__init__.py b/mininet/__init__.py
deleted file mode 100644
index c15ea6a..0000000
--- a/mininet/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-"Docstring to silence pylint; ignores --ignore option for __init__.py"
diff --git a/mininet/clean.py b/mininet/clean.py
deleted file mode 100644
index eac8fda..0000000
--- a/mininet/clean.py
+++ /dev/null
@@ -1,60 +0,0 @@
-"""
-Mininet Cleanup
-author: Bob Lantz (rlantz@cs.stanford.edu)
-
-Unfortunately, Mininet and OpenFlow (and the Linux kernel)
-don't always clean up properly after themselves. Until they do
-(or until cleanup functionality is integrated into the Python
-code), this script may be used to get rid of unwanted garbage.
-It may also get rid of 'false positives', but hopefully
-nothing irreplaceable!
-"""
-
-from subprocess import Popen, PIPE
-
-from mininet.log import info
-from mininet.term import cleanUpScreens
-
-def sh( cmd ):
-    "Print a command and send it to the shell"
-    info( cmd + '\n' )
-    return Popen( [ '/bin/sh', '-c', cmd ], stdout=PIPE ).communicate()[ 0 ]
-
-def cleanup():
-    """Clean up junk which might be left over from old runs;
-       do fast stuff before slow dp and link removal!"""
-
-    info("*** Removing excess controllers/ofprotocols/ofdatapaths/pings/noxes"
-         "\n")
-    zombies = 'controller ofprotocol ofdatapath ping nox_core lt-nox_core '
-    zombies += 'ovs-openflowd udpbwtest'
-    # Note: real zombie processes can't actually be killed, since they
-    # are already (un)dead. Then again,
-    # you can't connect to them either, so they're mostly harmless.
-    sh( 'killall -9 ' + zombies + ' 2> /dev/null' )
-
-    info( "*** Removing junk from /tmp\n" )
-    sh( 'rm -f /tmp/vconn* /tmp/vlogs* /tmp/*.out /tmp/*.log' )
-
-    info( "*** Removing old screen sessions\n" )
-    cleanUpScreens()
-
-    info( "*** Removing excess kernel datapaths\n" )
-    dps = sh( "ps ax | egrep -o 'dp[0-9]+' | sed 's/dp/nl:/'" ).split( '\n' )
-    for dp in dps:
-        if dp != '':
-            sh( 'dpctl deldp ' + dp )
-
-    info( "***  Removing OVS datapaths" )
-    dps = sh("ovs-vsctl list-br").split( '\n' )
-    for dp in dps:
-        if dp:
-            sh( 'ovs-vsctl del-br ' + dp )
-
-    info( "*** Removing all links of the pattern foo-ethX\n" )
-    links = sh( "ip link show | egrep -o '(\w+-eth\w+)'" ).split( '\n' )
-    for link in links:
-        if link != '':
-            sh( "ip link del " + link )
-
-    info( "*** Cleanup complete.\n" )
diff --git a/mininet/cli.py b/mininet/cli.py
deleted file mode 100644
index db03787..0000000
--- a/mininet/cli.py
+++ /dev/null
@@ -1,376 +0,0 @@
-"""
-A simple command-line interface for Mininet.
-
-The Mininet CLI provides a simple control console which
-makes it easy to talk to nodes. For example, the command
-
-mininet> h27 ifconfig
-
-runs 'ifconfig' on host h27.
-
-Having a single console rather than, for example, an xterm for each
-node is particularly convenient for networks of any reasonable
-size.
-
-The CLI automatically substitutes IP addresses for node names,
-so commands like
-
-mininet> h2 ping h3
-
-should work correctly and allow host h2 to ping host h3
-
-Several useful commands are provided, including the ability to
-list all nodes ('nodes'), to print out the network topology
-('net') and to check connectivity ('pingall', 'pingpair')
-and bandwidth ('iperf'.)
-"""
-
-from subprocess import call
-from cmd import Cmd
-from os import isatty
-from select import poll, POLLIN
-import sys
-import time
-
-from mininet.log import info, output, error
-from mininet.term import makeTerms
-from mininet.util import quietRun, isShellBuiltin, dumpNodeConnections
-
-class CLI( Cmd ):
-    "Simple command-line interface to talk to nodes."
-
-    prompt = 'minindn> '
-
-    def __init__( self, mininet, stdin=sys.stdin, script=None ):
-        self.mn = mininet
-        self.nodelist = self.mn.controllers + self.mn.switches + self.mn.hosts
-        self.nodemap = {}  # map names to Node objects
-        for node in self.nodelist:
-            self.nodemap[ node.name ] = node
-        # Local variable bindings for py command
-        self.locals = { 'net': mininet }
-        self.locals.update( self.nodemap )
-        # Attempt to handle input
-        self.stdin = stdin
-        self.inPoller = poll()
-        self.inPoller.register( stdin )
-        self.inputFile = script
-        Cmd.__init__( self )
-        info( '*** Starting CLI:\n' )
-        if self.inputFile:
-            self.do_source( self.inputFile )
-            return
-        while True:
-            try:
-                # Make sure no nodes are still waiting
-                for node in self.nodelist:
-                    while node.waiting:
-                        node.sendInt()
-                        node.monitor()
-                if self.isatty():
-                    quietRun( 'stty sane' )
-                self.cmdloop()
-                break
-            except KeyboardInterrupt:
-                output( '\nInterrupt\n' )
-
-    def emptyline( self ):
-        "Don't repeat last command when you hit return."
-        pass
-
-    # Disable pylint "Unused argument: 'arg's'" messages, as well as
-    # "method could be a function" warning, since each CLI function
-    # must have the same interface
-    # pylint: disable-msg=R0201
-
-    helpStr = (
-        'You may also send a command to a node using:\n'
-        '  <node> command {args}\n'
-        'For example:\n'
-        '  mininet> h1 ifconfig\n'
-        '\n'
-        'The interpreter automatically substitutes IP addresses\n'
-        'for node names when a node is the first arg, so commands\n'
-        'like\n'
-        '  mininet> h2 ping h3\n'
-        'should work.\n'
-        '\n'
-        'Some character-oriented interactive commands require\n'
-        'noecho:\n'
-        '  mininet> noecho h2 vi foo.py\n'
-        'However, starting up an xterm/gterm is generally better:\n'
-        '  mininet> xterm h2\n\n'
-    )
-
-    def do_help( self, line ):
-        "Describe available CLI commands."
-        Cmd.do_help( self, line )
-        if line is '':
-            output( self.helpStr )
-
-    def do_nodes( self, _line ):
-        "List all nodes."
-        nodes = ' '.join( [ node.name for node in sorted( self.nodelist ) ] )
-        output( 'available nodes are: \n%s\n' % nodes )
-
-    def do_net( self, _line ):
-        "List network connections."
-        dumpNodeConnections( self.nodelist )
-
-    def do_sh( self, line ):
-        "Run an external shell command"
-        call( line, shell=True )
-
-    # do_py() needs to catch any exception during eval()
-    # pylint: disable-msg=W0703
-
-    def do_py( self, line ):
-        """Evaluate a Python expression.
-           Node names may be used, e.g.: h1.cmd('ls')"""
-        try:
-            result = eval( line, globals(), self.locals )
-            if not result:
-                return
-            elif isinstance( result, str ):
-                output( result + '\n' )
-            else:
-                output( repr( result ) + '\n' )
-        except Exception, e:
-            output( str( e ) + '\n' )
-
-    # pylint: enable-msg=W0703
-
-    def do_pingall( self, _line ):
-        "Ping between all hosts."
-        self.mn.pingAll()
-
-    def do_pingpair( self, _line ):
-        "Ping between first two hosts, useful for testing."
-        self.mn.pingPair()
-
-    def do_pingallfull( self, _line ):
-        "Ping between first two hosts, returns all ping results."
-        self.mn.pingAllFull()
-
-    def do_pingpairfull( self, _line ):
-        "Ping between first two hosts, returns all ping results."
-        self.mn.pingPairFull()
-
-    def do_iperf( self, line ):
-        "Simple iperf TCP test between two (optionally specified) hosts."
-        args = line.split()
-        if not args:
-            self.mn.iperf()
-        elif len(args) == 2:
-            hosts = []
-            err = False
-            for arg in args:
-                if arg not in self.nodemap:
-                    err = True
-                    error( "node '%s' not in network\n" % arg )
-                else:
-                    hosts.append( self.nodemap[ arg ] )
-            if not err:
-                self.mn.iperf( hosts )
-        else:
-            error( 'invalid number of args: iperf src dst\n' )
-
-    def do_iperfudp( self, line ):
-        "Simple iperf TCP test between two (optionally specified) hosts."
-        args = line.split()
-        if not args:
-            self.mn.iperf( l4Type='UDP' )
-        elif len(args) == 3:
-            udpBw = args[ 0 ]
-            hosts = []
-            err = False
-            for arg in args[ 1:3 ]:
-                if arg not in self.nodemap:
-                    err = True
-                    error( "node '%s' not in network\n" % arg )
-                else:
-                    hosts.append( self.nodemap[ arg ] )
-            if not err:
-                self.mn.iperf( hosts, l4Type='UDP', udpBw=udpBw )
-        else:
-            error( 'invalid number of args: iperfudp bw src dst\n' +
-                   'bw examples: 10M\n' )
-
-    def do_intfs( self, _line ):
-        "List interfaces."
-        for node in self.nodelist:
-            output( '%s: %s\n' %
-                    ( node.name, ','.join( node.intfNames() ) ) )
-            
-    def do_ccndump(self, _line):
-        "Dump FIB entries"
-        for node in self.nodelist:
-            if 'fib' in node.params:
-                output(node.name + ': ')
-                for name in node.params['fib']:
-                    output(str(name) + ' ')
-                output('\n')
-           
-
-    def do_dump( self, _line ):
-        "Dump node info."
-        for node in self.nodelist:
-            output( '%s\n' % repr( node ) )
-
-    def do_link( self, line ):
-        "Bring link(s) between two nodes up or down."
-        args = line.split()
-        if len(args) != 3:
-            error( 'invalid number of args: link end1 end2 [up down]\n' )
-        elif args[ 2 ] not in [ 'up', 'down' ]:
-            error( 'invalid type: link end1 end2 [up down]\n' )
-        else:
-            self.mn.configLinkStatus( *args )
-
-    def do_xterm( self, line, term='xterm' ):
-        "Spawn xterm(s) for the given node(s)."
-        args = line.split()
-        if not args:
-            error( 'usage: %s node1 node2 ...\n' % term )
-        else:
-            for arg in args:
-                if arg not in self.nodemap:
-                    error( "node '%s' not in network\n" % arg )
-                else:
-                    node = self.nodemap[ arg ]
-                    self.mn.terms += makeTerms( [ node ], term = term )
-
-    def do_gterm( self, line ):
-        "Spawn gnome-terminal(s) for the given node(s)."
-        self.do_xterm( line, term='gterm' )
-
-    def do_exit( self, _line ):
-        "Exit"
-        return 'exited by user command'
-
-    def do_quit( self, line ):
-        "Exit"
-        return self.do_exit( line )
-
-    def do_EOF( self, line ):
-        "Exit"
-        output( '\n' )
-        return self.do_exit( line )
-
-    def isatty( self ):
-        "Is our standard input a tty?"
-        return isatty( self.stdin.fileno() )
-
-    def do_noecho( self, line ):
-        "Run an interactive command with echoing turned off."
-        if self.isatty():
-            quietRun( 'stty -echo' )
-        self.default( line )
-        if self.isatty():
-            quietRun( 'stty echo' )
-
-    def do_source( self, line ):
-        "Read commands from an input file."
-        args = line.split()
-        if len(args) != 1:
-            error( 'usage: source <file>\n' )
-            return
-        try:
-            self.inputFile = open( args[ 0 ] )
-            while True:
-                line = self.inputFile.readline()
-                if len( line ) > 0:
-                    self.onecmd( line )
-                else:
-                    break
-        except IOError:
-            error( 'error reading file %s\n' % args[ 0 ] )
-        self.inputFile = None
-
-    def do_dpctl( self, line ):
-        "Run dpctl command on all switches."
-        args = line.split()
-        if len(args) < 1:
-            error( 'usage: dpctl command [arg1] [arg2] ...\n' )
-            return
-        for sw in self.mn.switches:
-            output( '*** ' + sw.name + ' ' + ('-' * 72) + '\n' )
-            output( sw.dpctl( *args ) )
-
-    def do_time( self, line ):
-        "Measure time taken for any command in Mininet."
-        start = time.time()
-        self.onecmd(line)
-        elapsed = time.time() - start
-        self.stdout.write("*** Elapsed time: %0.6f secs\n" % elapsed)
-
-    def default( self, line ):
-        """Called on an input line when the command prefix is not recognized.
-        Overridden to run shell commands when a node is the first CLI argument.
-        Past the first CLI argument, node names are automatically replaced with
-        corresponding IP addrs."""
-
-        first, args, line = self.parseline( line )
-        if not args:
-            return
-        if args and len(args) > 0 and args[ -1 ] == '\n':
-            args = args[ :-1 ]
-        rest = args.split( ' ' )
-
-        if first in self.nodemap:
-            node = self.nodemap[ first ]
-            # Substitute IP addresses for node names in command
-            rest = [ self.nodemap[ arg ].IP()
-                     if arg in self.nodemap else arg
-                     for arg in rest ]
-            rest = ' '.join( rest )
-            # Run cmd on node:
-            builtin = isShellBuiltin( first )
-            node.sendCmd( rest, printPid=( not builtin ) )
-            self.waitForNode( node )
-        else:
-            error( '*** Unknown command: %s\n' % first )
-
-    # pylint: enable-msg=R0201
-
-    def waitForNode( self, node ):
-        "Wait for a node to finish, and  print its output."
-        # Pollers
-        nodePoller = poll()
-        nodePoller.register( node.stdout )
-        bothPoller = poll()
-        bothPoller.register( self.stdin, POLLIN )
-        bothPoller.register( node.stdout, POLLIN )
-        if self.isatty():
-            # Buffer by character, so that interactive
-            # commands sort of work
-            quietRun( 'stty -icanon min 1' )
-        while True:
-            try:
-                bothPoller.poll()
-                # XXX BL: this doesn't quite do what we want.
-                if False and self.inputFile:
-                    key = self.inputFile.read( 1 )
-                    if key is not '':
-                        node.write(key)
-                    else:
-                        self.inputFile = None
-                if isReadable( self.inPoller ):
-                    key = self.stdin.read( 1 )
-                    node.write( key )
-                if isReadable( nodePoller ):
-                    data = node.monitor()
-                    output( data )
-                if not node.waiting:
-                    break
-            except KeyboardInterrupt:
-                node.sendInt()
-
-# Helper functions
-
-def isReadable( poller ):
-    "Check whether a Poll object has a readable fd."
-    for fdmask in poller.poll( 0 ):
-        mask = fdmask[ 1 ]
-        if mask & POLLIN:
-            return True
diff --git a/mininet/link.py b/mininet/link.py
deleted file mode 100644
index 6c9dd7d..0000000
--- a/mininet/link.py
+++ /dev/null
@@ -1,399 +0,0 @@
-"""
-link.py: interface and link abstractions for mininet
-
-It seems useful to bundle functionality for interfaces into a single
-class.
-
-Also it seems useful to enable the possibility of multiple flavors of
-links, including:
-
-- simple veth pairs
-- tunneled links
-- patchable links (which can be disconnected and reconnected via a patchbay)
-- link simulators (e.g. wireless)
-
-Basic division of labor:
-
-  Nodes: know how to execute commands
-  Intfs: know how to configure themselves
-  Links: know how to connect nodes together
-
-Intf: basic interface object that can configure itself
-TCIntf: interface with bandwidth limiting and delay via tc
-
-Link: basic link class for creating veth pairs
-"""
-
-from mininet.log import info, error, debug
-from mininet.util import makeIntfPair
-from time import sleep
-import re
-
-class Intf( object ):
-
-    "Basic interface object that can configure itself."
-
-    def __init__( self, name, node=None, port=None, link=None, **params ):
-        """name: interface name (e.g. h1-eth0)
-           node: owning node (where this intf most likely lives)
-           link: parent link if we're part of a link
-           other arguments are passed to config()"""
-        self.node = node
-        self.name = name
-        self.link = link
-        self.mac, self.ip, self.prefixLen = None, None, None
-        # Add to node (and move ourselves if necessary )
-        node.addIntf( self, port=port )
-        # Save params for future reference
-        self.params = params
-        self.config( **params )
-
-    def cmd( self, *args, **kwargs ):
-        "Run a command in our owning node"
-        return self.node.cmd( *args, **kwargs )
-
-    def ifconfig( self, *args ):
-        "Configure ourselves using ifconfig"
-        return self.cmd( 'ifconfig', self.name, *args )
-
-    def setIP( self, ipstr, prefixLen=None ):
-        """Set our IP address"""
-        # This is a sign that we should perhaps rethink our prefix
-        # mechanism and/or the way we specify IP addresses
-        if '/' in ipstr:
-            self.ip, self.prefixLen = ipstr.split( '/' )
-            return self.ifconfig( ipstr, 'up' )
-        else:
-            self.ip, self.prefixLen = ipstr, prefixLen
-            return self.ifconfig( '%s/%s' % ( ipstr, prefixLen ) )
-
-    def setMAC( self, macstr ):
-        """Set the MAC address for an interface.
-           macstr: MAC address as string"""
-        self.mac = macstr
-        return ( self.ifconfig( 'down' ) +
-                 self.ifconfig( 'hw', 'ether', macstr ) +
-                 self.ifconfig( 'up' ) )
-
-    _ipMatchRegex = re.compile( r'\d+\.\d+\.\d+\.\d+' )
-    _macMatchRegex = re.compile( r'..:..:..:..:..:..' )
-
-    def updateIP( self ):
-        "Return updated IP address based on ifconfig"
-        ifconfig = self.ifconfig()
-        ips = self._ipMatchRegex.findall( ifconfig )
-        self.ip = ips[ 0 ] if ips else None
-        return self.ip
-
-    def updateMAC( self ):
-        "Return updated MAC address based on ifconfig"
-        ifconfig = self.ifconfig()
-        macs = self._macMatchRegex.findall( ifconfig )
-        self.mac = macs[ 0 ] if macs else None
-        return self.mac
-
-    def IP( self ):
-        "Return IP address"
-        return self.ip
-
-    def MAC( self ):
-        "Return MAC address"
-        return self.mac
-
-    def isUp( self, setUp=False ):
-        "Return whether interface is up"
-        if setUp:
-            self.ifconfig( 'up' )
-        return "UP" in self.ifconfig()
-
-    def rename( self, newname ):
-        "Rename interface"
-        self.ifconfig( 'down' )
-        result = self.cmd( 'ip link set', self.name, 'name', newname )
-        self.name = newname
-        self.ifconfig( 'up' )
-        return result
-
-    # The reason why we configure things in this way is so
-    # That the parameters can be listed and documented in
-    # the config method.
-    # Dealing with subclasses and superclasses is slightly
-    # annoying, but at least the information is there!
-
-    def setParam( self, results, method, **param ):
-        """Internal method: configure a *single* parameter
-           results: dict of results to update
-           method: config method name
-           param: arg=value (ignore if value=None)
-           value may also be list or dict"""
-        name, value = param.items()[ 0 ]
-        f = getattr( self, method, None )
-        if not f or value is None:
-            return
-        if type( value ) is list:
-            result = f( *value )
-        elif type( value ) is dict:
-            result = f( **value )
-        else:
-            result = f( value )
-        results[ name ] = result
-        return result
-
-    def config( self, mac=None, ip=None, ifconfig=None,
-                up=True, **_params ):
-        """Configure Node according to (optional) parameters:
-           mac: MAC address
-           ip: IP address
-           ifconfig: arbitrary interface configuration
-           Subclasses should override this method and call
-           the parent class's config(**params)"""
-        # If we were overriding this method, we would call
-        # the superclass config method here as follows:
-        # r = Parent.config( **params )
-        r = {}
-        self.setParam( r, 'setMAC', mac=mac )
-        self.setParam( r, 'setIP', ip=ip )
-        self.setParam( r, 'isUp', up=up )
-        self.setParam( r, 'ifconfig', ifconfig=ifconfig )
-        self.updateIP()
-        self.updateMAC()
-        return r
-
-    def delete( self ):
-        "Delete interface"
-        self.cmd( 'ip link del ' + self.name )
-        # Does it help to sleep to let things run?
-        sleep( 0.001 )
-
-    def __repr__( self ):
-        return '<%s %s>' % ( self.__class__.__name__, self.name )
-
-    def __str__( self ):
-        return self.name
-
-
-class TCIntf( Intf ):
-    """Interface customized by tc (traffic control) utility
-       Allows specification of bandwidth limits (various methods)
-       as well as delay, loss and max queue length"""
-
-    def bwCmds( self, bw=None, speedup=0, use_hfsc=False, use_tbf=False,
-                latency_ms=None, enable_ecn=False, enable_red=False ):
-        "Return tc commands to set bandwidth"
-
-
-        cmds, parent = [], ' root '
-
-        if bw and ( bw < 0 or bw > 1000 ):
-            error( 'Bandwidth', bw, 'is outside range 0..1000 Mbps\n' )
-
-        elif bw is not None:
-            # BL: this seems a bit brittle...
-            if ( speedup > 0 and
-                 self.node.name[0:1] == 's' ):
-                bw = speedup
-            # This may not be correct - we should look more closely
-            # at the semantics of burst (and cburst) to make sure we
-            # are specifying the correct sizes. For now I have used
-            # the same settings we had in the mininet-hifi code.
-            if use_hfsc:
-                cmds += [ '%s qdisc add dev %s root handle 1:0 hfsc default 1',
-                          '%s class add dev %s parent 1:0 classid 1:1 hfsc sc '
-                          + 'rate %fMbit ul rate %fMbit' % ( bw, bw ) ]
-            elif use_tbf:
-                if latency_ms is None:
-                    latency_ms = 15 * 8 / bw
-                cmds += [ '%s qdisc add dev %s root handle 1: tbf ' +
-                          'rate %fMbit burst 15000 latency %fms' %
-                          ( bw, latency_ms ) ]
-            else:
-                cmds += [ '%s qdisc add dev %s root handle 1:0 htb default 1',
-                          '%s class add dev %s parent 1:0 classid 1:1 htb ' +
-                          'rate %fMbit burst 15k' % bw ]
-            parent = ' parent 1:1 '
-
-            # ECN or RED
-            if enable_ecn:
-                cmds += [ '%s qdisc add dev %s' + parent +
-                          'handle 10: red limit 1000000 ' +
-                          'min 30000 max 35000 avpkt 1500 ' +
-                          'burst 20 ' +
-                          'bandwidth %fmbit probability 1 ecn' % bw ]
-                parent = ' parent 10: '
-            elif enable_red:
-                cmds += [ '%s qdisc add dev %s' + parent +
-                          'handle 10: red limit 1000000 ' +
-                          'min 30000 max 35000 avpkt 1500 ' +
-                          'burst 20 ' +
-                          'bandwidth %fmbit probability 1' % bw ]
-                parent = ' parent 10: '
-        return cmds, parent
-
-    @staticmethod
-    def delayCmds( parent, delay=None, jitter=None,
-                   loss=None, max_queue_size=None ):
-        "Internal method: return tc commands for delay and loss"
-
-        cmds = []
-        if delay and delay < 0:
-            error( 'Negative delay', delay, '\n' )
-        elif jitter and jitter < 0:
-            error( 'Negative jitter', jitter, '\n' )
-        elif loss and ( loss < 0 or loss > 100 ):
-            error( 'Bad loss percentage', loss, '%%\n' )
-        else:
-            # Delay/jitter/loss/max queue size
-            netemargs = '%s%s%s%s' % (
-                'delay %s ' % delay if delay is not None else '',
-                '%s ' % jitter if jitter is not None else '',
-                'loss %d ' % loss if loss is not None else '',
-                'limit %d' % max_queue_size if max_queue_size is not None
-                else '' )
-            if netemargs:
-                cmds = [ '%s qdisc add dev %s ' + parent +
-                         ' handle 10: netem ' +
-                         netemargs ]
-        return cmds
-
-    def tc( self, cmd, tc='tc' ):
-        "Execute tc command for our interface"
-        c = cmd % (tc, self)  # Add in tc command and our name
-        debug(" *** executing command: %s\n" % c)
-        return self.cmd( c )
-
-    def config( self, bw=None, delay=None, jitter=None, loss=None,
-                disable_gro=True, speedup=0, use_hfsc=False, use_tbf=False,
-                latency_ms=None, enable_ecn=False, enable_red=False,
-                max_queue_size=None, **params ):
-        "Configure the port and set its properties."
-
-        result = Intf.config( self, **params)
-
-        # Disable GRO
-        if disable_gro:
-            self.cmd( 'ethtool -K %s gro off' % self )
-
-        # Optimization: return if nothing else to configure
-        # Question: what happens if we want to reset things?
-        if ( bw is None and not delay and not loss
-             and max_queue_size is None ):
-            return
-
-        # Clear existing configuration
-        cmds = [ '%s qdisc del dev %s root' ]
-
-        # Bandwidth limits via various methods
-        bwcmds, parent = self.bwCmds( bw=bw, speedup=speedup,
-                                      use_hfsc=use_hfsc, use_tbf=use_tbf,
-                                      latency_ms=latency_ms,
-                                      enable_ecn=enable_ecn,
-                                      enable_red=enable_red )
-        cmds += bwcmds
-
-        # Delay/jitter/loss/max_queue_size using netem
-        cmds += self.delayCmds( delay=delay, jitter=jitter, loss=loss,
-                                max_queue_size=max_queue_size,
-                                parent=parent )
-
-        # Ugly but functional: display configuration info
-        stuff = ( ( [ '%.2fMbit' % bw ] if bw is not None else [] ) +
-                  ( [ '%s delay' % delay ] if delay is not None else [] ) +
-                  ( [ '%s jitter' % jitter ] if jitter is not None else [] ) +
-                  ( ['%d%% loss' % loss ] if loss is not None else [] ) +
-                  ( [ 'ECN' ] if enable_ecn else [ 'RED' ]
-                    if enable_red else [] ) )
-        info( '(' + ' '.join( stuff ) + ') ' )
-
-        # Execute all the commands in our node
-        debug("at map stage w/cmds: %s\n" % cmds)
-        tcoutputs = [ self.tc(cmd) for cmd in cmds ]
-        debug( "cmds:", cmds, '\n' )
-        debug( "outputs:", tcoutputs, '\n' )
-        result[ 'tcoutputs'] = tcoutputs
-
-        return result
-
-
-class Link( object ):
-
-    """A basic link is just a veth pair.
-       Other types of links could be tunnels, link emulators, etc.."""
-
-    def __init__( self, node1, node2, port1=None, port2=None,
-                  intfName1=None, intfName2=None,
-                  intf=Intf, cls1=None, cls2=None, params1=None,
-                  params2=None ):
-        """Create veth link to another node, making two new interfaces.
-           node1: first node
-           node2: second node
-           port1: node1 port number (optional)
-           port2: node2 port number (optional)
-           intf: default interface class/constructor
-           cls1, cls2: optional interface-specific constructors
-           intfName1: node1 interface name (optional)
-           intfName2: node2  interface name (optional)
-           params1: parameters for interface 1
-           params2: parameters for interface 2"""
-        # This is a bit awkward; it seems that having everything in
-        # params would be more orthogonal, but being able to specify
-        # in-line arguments is more convenient!
-        if port1 is None:
-            port1 = node1.newPort()
-        if port2 is None:
-            port2 = node2.newPort()
-        if not intfName1:
-            intfName1 = self.intfName( node1, port1 )
-        if not intfName2:
-            intfName2 = self.intfName( node2, port2 )
-
-        self.makeIntfPair( intfName1, intfName2 )
-
-        if not cls1:
-            cls1 = intf
-        if not cls2:
-            cls2 = intf
-        if not params1:
-            params1 = {}
-        if not params2:
-            params2 = {}
-
-        intf1 = cls1( name=intfName1, node=node1, port=port1,
-                      link=self, **params1  )
-        intf2 = cls2( name=intfName2, node=node2, port=port2,
-                      link=self, **params2 )
-
-        # All we are is dust in the wind, and our two interfaces
-        self.intf1, self.intf2 = intf1, intf2
-
-    @classmethod
-    def intfName( cls, node, n ):
-        "Construct a canonical interface name node-ethN for interface n."
-        return node.name + '-eth' + repr( n )
-
-    @classmethod
-    def makeIntfPair( cls, intf1, intf2 ):
-        """Create pair of interfaces
-           intf1: name of interface 1
-           intf2: name of interface 2
-           (override this class method [and possibly delete()]
-           to change link type)"""
-        makeIntfPair( intf1, intf2  )
-
-    def delete( self ):
-        "Delete this link"
-        self.intf1.delete()
-        self.intf2.delete()
-
-    def __str__( self ):
-        return '%s<->%s' % ( self.intf1, self.intf2 )
-
-class TCLink( Link ):
-    "Link with symmetric TC interfaces configured via opts"
-    def __init__( self, node1, node2, port1=None, port2=None,
-                  intfName1=None, intfName2=None, **params ):
-        Link.__init__( self, node1, node2, port1=port1, port2=port2,
-                       intfName1=intfName1, intfName2=intfName2,
-                       cls1=TCIntf,
-                       cls2=TCIntf,
-                       params1=params,
-                       params2=params)
diff --git a/mininet/log.py b/mininet/log.py
deleted file mode 100644
index cd00821..0000000
--- a/mininet/log.py
+++ /dev/null
@@ -1,178 +0,0 @@
-"Logging functions for Mininet."
-
-import logging
-from logging import Logger
-import types
-
-# Create a new loglevel, 'CLI info', which enables a Mininet user to see only
-# the output of the commands they execute, plus any errors or warnings.  This
-# level is in between info and warning.  CLI info-level commands should not be
-# printed during regression tests.
-OUTPUT = 25
-
-LEVELS = { 'debug': logging.DEBUG,
-           'info': logging.INFO,
-           'output': OUTPUT,
-           'warning': logging.WARNING,
-           'error': logging.ERROR,
-           'critical': logging.CRITICAL }
-
-# change this to logging.INFO to get printouts when running unit tests
-LOGLEVELDEFAULT = OUTPUT
-
-#default: '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
-LOGMSGFORMAT = '%(message)s'
-
-
-# Modified from python2.5/__init__.py
-class StreamHandlerNoNewline( logging.StreamHandler ):
-    """StreamHandler that doesn't print newlines by default.
-       Since StreamHandler automatically adds newlines, define a mod to more
-       easily support interactive mode when we want it, or errors-only logging
-       for running unit tests."""
-
-    def emit( self, record ):
-        """Emit a record.
-           If a formatter is specified, it is used to format the record.
-           The record is then written to the stream with a trailing newline
-           [ N.B. this may be removed depending on feedback ]. If exception
-           information is present, it is formatted using
-           traceback.printException and appended to the stream."""
-        try:
-            msg = self.format( record )
-            fs = '%s'  # was '%s\n'
-            if not hasattr( types, 'UnicodeType' ):  # if no unicode support...
-                self.stream.write( fs % msg )
-            else:
-                try:
-                    self.stream.write( fs % msg )
-                except UnicodeError:
-                    self.stream.write( fs % msg.encode( 'UTF-8' ) )
-            self.flush()
-        except ( KeyboardInterrupt, SystemExit ):
-            raise
-        except:
-            self.handleError( record )
-
-
-class Singleton( type ):
-    """Singleton pattern from Wikipedia
-       See http://en.wikipedia.org/wiki/SingletonPattern#Python
-
-       Intended to be used as a __metaclass_ param, as shown for the class
-       below.
-
-       Changed cls first args to mcs to satisfy pylint."""
-
-    def __init__( mcs, name, bases, dict_ ):
-        super( Singleton, mcs ).__init__( name, bases, dict_ )
-        mcs.instance = None
-
-    def __call__( mcs, *args, **kw ):
-        if mcs.instance is None:
-            mcs.instance = super( Singleton, mcs ).__call__( *args, **kw )
-            return mcs.instance
-
-
-class MininetLogger( Logger, object ):
-    """Mininet-specific logger
-       Enable each mininet .py file to with one import:
-
-       from mininet.log import [lg, info, error]
-
-       ...get a default logger that doesn't require one newline per logging
-       call.
-
-       Inherit from object to ensure that we have at least one new-style base
-       class, and can then use the __metaclass__ directive, to prevent this
-       error:
-
-       TypeError: Error when calling the metaclass bases
-       a new-style class can't have only classic bases
-
-       If Python2.5/logging/__init__.py defined Filterer as a new-style class,
-       via Filterer( object ): rather than Filterer, we wouldn't need this.
-
-       Use singleton pattern to ensure only one logger is ever created."""
-
-    __metaclass__ = Singleton
-
-    def __init__( self ):
-
-        Logger.__init__( self, "mininet" )
-
-        # create console handler
-        ch = StreamHandlerNoNewline()
-        # create formatter
-        formatter = logging.Formatter( LOGMSGFORMAT )
-        # add formatter to ch
-        ch.setFormatter( formatter )
-        # add ch to lg
-        self.addHandler( ch )
-
-        self.setLogLevel()
-
-    def setLogLevel( self, levelname=None ):
-        """Setup loglevel.
-           Convenience function to support lowercase names.
-           levelName: level name from LEVELS"""
-        level = LOGLEVELDEFAULT
-        if levelname is not None:
-            if levelname not in LEVELS:
-                raise Exception( 'unknown levelname seen in setLogLevel' )
-            else:
-                level = LEVELS.get( levelname, level )
-
-        self.setLevel( level )
-        self.handlers[ 0 ].setLevel( level )
-
-    # pylint: disable-msg=E0202
-    # "An attribute inherited from mininet.log hide this method"
-    # Not sure why this is occurring - this function definitely gets called.
-
-    # See /usr/lib/python2.5/logging/__init__.py; modified from warning()
-    def output( self, msg, *args, **kwargs ):
-        """Log 'msg % args' with severity 'OUTPUT'.
-
-           To pass exception information, use the keyword argument exc_info
-           with a true value, e.g.
-
-           logger.warning("Houston, we have a %s", "cli output", exc_info=1)
-        """
-        if self.manager.disable >= OUTPUT:
-            return
-        if self.isEnabledFor( OUTPUT ):
-            self._log( OUTPUT, msg, args, kwargs )
-
-    # pylint: enable-msg=E0202
-
-lg = MininetLogger()
-
-# Make things a bit more convenient by adding aliases
-# (info, warn, error, debug) and allowing info( 'this', 'is', 'OK' )
-# In the future we may wish to make things more efficient by only
-# doing the join (and calling the function) unless the logging level
-# is high enough.
-
-def makeListCompatible( fn ):
-    """Return a new function allowing fn( 'a 1 b' ) to be called as
-       newfn( 'a', 1, 'b' )"""
-
-    def newfn( *args ):
-        "Generated function. Closure-ish."
-        if len( args ) == 1:
-            return fn( *args )
-        args = ' '.join( [ str( arg ) for arg in args ] )
-        return fn( args )
-
-    # Fix newfn's name and docstring
-    setattr( newfn, '__name__', fn.__name__ )
-    setattr( newfn, '__doc__', fn.__doc__ )
-    return newfn
-
-info, output, warn, error, debug = (
-    lg.info, lg.output, lg.warn, lg.error, lg.debug ) = [
-        makeListCompatible( f ) for f in
-            lg.info, lg.output, lg.warn, lg.error, lg.debug ]
-
-setLogLevel = lg.setLogLevel
diff --git a/mininet/moduledeps.py b/mininet/moduledeps.py
deleted file mode 100644
index 862c1f6..0000000
--- a/mininet/moduledeps.py
+++ /dev/null
@@ -1,68 +0,0 @@
-"Module dependency utility functions for Mininet."
-
-from mininet.util import quietRun
-from mininet.log import info, error, debug
-from os import environ
-
-def lsmod():
-    "Return output of lsmod."
-    return quietRun( 'lsmod' )
-
-def rmmod( mod ):
-    """Return output of lsmod.
-       mod: module string"""
-    return quietRun( [ 'rmmod', mod ] )
-
-def modprobe( mod ):
-    """Return output of modprobe
-       mod: module string"""
-    return quietRun( [ 'modprobe', mod ] )
-
-OF_KMOD = 'ofdatapath'
-OVS_KMOD = 'openvswitch_mod'  # Renamed 'openvswitch' in OVS 1.7+/Linux 3.5+
-TUN = 'tun'
-
-def moduleDeps( subtract=None, add=None ):
-    """Handle module dependencies.
-       subtract: string or list of module names to remove, if already loaded
-       add: string or list of module names to add, if not already loaded"""
-    subtract = subtract if subtract is not None else []
-    add = add if add is not None else []
-    if type( subtract ) is str:
-        subtract = [ subtract ]
-    if type( add ) is str:
-        add = [ add ]
-    for mod in subtract:
-        if mod in lsmod():
-            info( '*** Removing ' + mod + '\n' )
-            rmmodOutput = rmmod( mod )
-            if rmmodOutput:
-                error( 'Error removing ' + mod + ': "%s">\n' % rmmodOutput )
-                exit( 1 )
-            if mod in lsmod():
-                error( 'Failed to remove ' + mod + '; still there!\n' )
-                exit( 1 )
-    for mod in add:
-        if mod not in lsmod():
-            info( '*** Loading ' + mod + '\n' )
-            modprobeOutput = modprobe( mod )
-            if modprobeOutput:
-                error( 'Error inserting ' + mod +
-                       ' - is it installed and available via modprobe?\n' +
-                       'Error was: "%s"\n' % modprobeOutput )
-            if mod not in lsmod():
-                error( 'Failed to insert ' + mod + ' - quitting.\n' )
-                exit( 1 )
-        else:
-            debug( '*** ' + mod + ' already loaded\n' )
-
-
-def pathCheck( *args, **kwargs ):
-    "Make sure each program in *args can be found in $PATH."
-    moduleName = kwargs.get( 'moduleName', 'it' )
-    for arg in args:
-        if not quietRun( 'which ' + arg ):
-            error( 'Cannot find required executable %s.\n' % arg +
-                   'Please make sure that %s is installed ' % moduleName +
-                   'and available in your $PATH:\n(%s)\n' % environ[ 'PATH' ] )
-            exit( 1 )
diff --git a/mininet/net.py b/mininet/net.py
deleted file mode 100644
index 847850b..0000000
--- a/mininet/net.py
+++ /dev/null
@@ -1,775 +0,0 @@
-"""
-
-    Mininet: A simple networking testbed for OpenFlow/SDN!
-
-author: Bob Lantz (rlantz@cs.stanford.edu)
-author: Brandon Heller (brandonh@stanford.edu)
-
-Mininet creates scalable OpenFlow test networks by using
-process-based virtualization and network namespaces.
-
-Simulated hosts are created as processes in separate network
-namespaces. This allows a complete OpenFlow network to be simulated on
-top of a single Linux kernel.
-
-Each host has:
-
-A virtual console (pipes to a shell)
-A virtual interfaces (half of a veth pair)
-A parent shell (and possibly some child processes) in a namespace
-
-Hosts have a network interface which is configured via ifconfig/ip
-link/etc.
-
-This version supports both the kernel and user space datapaths
-from the OpenFlow reference implementation (openflowswitch.org)
-as well as OpenVSwitch (openvswitch.org.)
-
-In kernel datapath mode, the controller and switches are simply
-processes in the root namespace.
-
-Kernel OpenFlow datapaths are instantiated using dpctl(8), and are
-attached to the one side of a veth pair; the other side resides in the
-host namespace. In this mode, switch processes can simply connect to the
-controller via the loopback interface.
-
-In user datapath mode, the controller and switches can be full-service
-nodes that live in their own network namespaces and have management
-interfaces and IP addresses on a control network (e.g. 192.168.123.1,
-currently routed although it could be bridged.)
-
-In addition to a management interface, user mode switches also have
-several switch interfaces, halves of veth pairs whose other halves
-reside in the host nodes that the switches are connected to.
-
-Consistent, straightforward naming is important in order to easily
-identify hosts, switches and controllers, both from the CLI and
-from program code. Interfaces are named to make it easy to identify
-which interfaces belong to which node.
-
-The basic naming scheme is as follows:
-
-    Host nodes are named h1-hN
-    Switch nodes are named s1-sN
-    Controller nodes are named c0-cN
-    Interfaces are named {nodename}-eth0 .. {nodename}-ethN
-
-Note: If the network topology is created using mininet.topo, then
-node numbers are unique among hosts and switches (e.g. we have
-h1..hN and SN..SN+M) and also correspond to their default IP addresses
-of 10.x.y.z/8 where x.y.z is the base-256 representation of N for
-hN. This mapping allows easy determination of a node's IP
-address from its name, e.g. h1 -> 10.0.0.1, h257 -> 10.0.1.1.
-
-Note also that 10.0.0.1 can often be written as 10.1 for short, e.g.
-"ping 10.1" is equivalent to "ping 10.0.0.1".
-
-Currently we wrap the entire network in a 'mininet' object, which
-constructs a simulated network based on a network topology created
-using a topology object (e.g. LinearTopo) from mininet.topo or
-mininet.topolib, and a Controller which the switches will connect
-to. Several configuration options are provided for functions such as
-automatically setting MAC addresses, populating the ARP table, or
-even running a set of terminals to allow direct interaction with nodes.
-
-After the network is created, it can be started using start(), and a
-variety of useful tasks maybe performed, including basic connectivity
-and bandwidth tests and running the mininet CLI.
-
-Once the network is up and running, test code can easily get access
-to host and switch objects which can then be used for arbitrary
-experiments, typically involving running a series of commands on the
-hosts.
-
-After all desired tests or activities have been completed, the stop()
-method may be called to shut down the network.
-
-"""
-
-import os
-import re
-import select
-import signal
-from time import sleep
-
-from mininet.cli import CLI
-from mininet.log import info, error, debug, output
-from mininet.node import Host, OVSKernelSwitch, Controller
-from mininet.link import Link, Intf
-from mininet.util import quietRun, fixLimits, numCores, ensureRoot
-from mininet.util import macColonHex, ipStr, ipParse, netParse, ipAdd, nextCCNnet
-from mininet.term import cleanUpScreens, makeTerms
-import pdb
-
-# Mininet version: should be consistent with README and LICENSE
-VERSION = "2.0.0"
-
-class Mininet( object ):
-    "Network emulation with hosts spawned in network namespaces."
-
-    def __init__( self, topo=None, switch=OVSKernelSwitch, host=Host,
-                  controller=Controller, link=Link, intf=Intf,
-                  build=True, xterms=False, cleanup=False, ipBase='10.0.0.0/8',
-                  inNamespace=False,
-                  autoSetMacs=False, autoStaticArp=False, autoPinCpus=False,
-                  listenPort=None ):
-        """Create Mininet object.
-           topo: Topo (topology) object or None
-           switch: default Switch class
-           host: default Host class/constructor
-           controller: default Controller class/constructor
-           link: default Link class/constructor
-           intf: default Intf class/constructor
-           ipBase: base IP address for hosts,
-           build: build now from topo?
-           xterms: if build now, spawn xterms?
-           cleanup: if build now, cleanup before creating?
-           inNamespace: spawn switches and controller in net namespaces?
-           autoSetMacs: set MAC addrs automatically like IP addresses?
-           autoStaticArp: set all-pairs static MAC addrs?
-           autoPinCpus: pin hosts to (real) cores (requires CPULimitedHost)?
-           listenPort: base listening port to open; will be incremented for
-               each additional switch in the net if inNamespace=False"""
-        self.topo = topo
-        self.switch = switch
-        self.host = host
-        self.controller = controller
-        self.link = link
-        self.intf = intf
-        self.ipBase = ipBase
-        self.ipBaseNum, self.prefixLen = netParse( self.ipBase )
-        self.nextIP = 1  # start for address allocation
-        self.ccnNetBase = '1.0.0.0'
-        self.inNamespace = inNamespace
-        self.xterms = xterms
-        self.cleanup = cleanup
-        self.autoSetMacs = autoSetMacs
-        self.autoStaticArp = autoStaticArp
-        self.autoPinCpus = autoPinCpus
-        self.numCores = numCores()
-        self.nextCore = 0  # next core for pinning hosts to CPUs
-        self.listenPort = listenPort
-
-        self.hosts = []
-        self.switches = []
-        self.controllers = []
-
-        self.nameToNode = {}  # name to Node (Host/Switch) objects
-
-        self.terms = []  # list of spawned xterm processes
-
-        Mininet.init()  # Initialize Mininet if necessary
-
-        self.built = False
-        if topo and build:
-            self.build()
-
-    def isNdnhost(self, node):
-        if 'fib' in node.params:
-            return True
-        else:
-            return False
-        
-    def addHost( self, name, cls=None, **params ):
-        """Add host.
-           name: name of host to add
-           cls: custom host class/constructor (optional)
-           params: parameters for host
-           returns: added host"""
-        # Default IP and MAC addresses
-	#pdb.set_trace()
-        #defaults = { 'ip': ipAdd( self.nextIP,
-                                  #ipBaseNum=self.ipBaseNum,
-                                  #prefixLen=self.prefixLen ) +
-                                  #'/%s' % self.prefixLen }
-        #if self.autoSetMacs:
-            #defaults[ 'mac'] = macColonHex( self.nextIP )
-        #if self.autoPinCpus:
-            #defaults[ 'cores' ] = self.nextCore
-            #self.nextCore = ( self.nextCore + 1 ) % self.numCores        
-        #self.nextIP += 1
-	defaults = {}
-        defaults.update( params )
-
-        if not cls:
-            cls = self.host
-        h = cls( name, **defaults )
-        self.hosts.append( h )
-        self.nameToNode[ name ] = h
-        return h
-
-    def addSwitch( self, name, cls=None, **params ):
-        """Add switch.
-           name: name of switch to add
-           cls: custom switch class/constructor (optional)
-           returns: added switch
-           side effect: increments listenPort ivar ."""
-        defaults = { 'listenPort': self.listenPort,
-                     'inNamespace': self.inNamespace }
-        defaults.update( params )
-        if not cls:
-            cls = self.switch
-        sw = cls( name, **defaults )
-        if not self.inNamespace and self.listenPort:
-            self.listenPort += 1
-        self.switches.append( sw )
-        self.nameToNode[ name ] = sw
-        return sw
-
-    def addController( self, name='c0', controller=None, **params ):
-        """Add controller.
-           controller: Controller class"""
-        if not controller:
-            controller = self.controller
-        controller_new = controller( name, **params )
-        if controller_new:  # allow controller-less setups
-            self.controllers.append( controller_new )
-            self.nameToNode[ name ] = controller_new
-        return controller_new
-
-    # BL: is this better than just using nameToNode[] ?
-    # Should it have a better name?
-    def getNodeByName( self, *args ):
-        "Return node(s) with given name(s)"
-        if len( args ) == 1:
-            return self.nameToNode[ args[ 0 ] ]
-        return [ self.nameToNode[ n ] for n in args ]
-
-    def get( self, *args ):
-        "Convenience alias for getNodeByName"
-        return self.getNodeByName( *args )
-
-    def addLink( self, node1, node2, port1=None, port2=None,
-                 cls=None, **params ):
-        """"Add a link from node1 to node2
-            node1: source node
-            node2: dest node
-            port1: source port
-            port2: dest port
-            returns: link object"""
-        defaults = { 'port1': port1,
-                     'port2': port2,
-                     'intf': self.intf }
-        defaults.update( params )
-        if not cls:
-            cls = self.link
-        return cls( node1, node2, **defaults )
-
-    def configHosts( self ):
-        "Configure a set of hosts."
-        for host in self.hosts:
-            info( host.name + ' ' )
-            intf = host.defaultIntf()
-            if self.isNdnhost(host):
-                host.configNdn()
-                host.configDefault(ip=None,mac=None)         
-            elif intf:
-                host.configDefault( defaultRoute=intf )
-            else:
-                # Don't configure nonexistent intf
-                host.configDefault( ip=None, mac=None )
-            # You're low priority, dude!
-            # BL: do we want to do this here or not?
-            # May not make sense if we have CPU lmiting...
-            # quietRun( 'renice +18 -p ' + repr( host.pid ) )
-            # This may not be the right place to do this, but
-            # it needs to be done somewhere.
-            host.cmd( 'ifconfig lo up' )
-        info( '\n' )
-
-    def buildFromTopo( self, topo=None ):
-        """Build mininet from a topology object
-           At the end of this function, everything should be connected
-           and up."""
-
-        # Possibly we should clean up here and/or validate
-        # the topo
-        if self.cleanup:
-            pass
-
-        info( '*** Creating network\n' )
-
-        #if not self.controllers:
-            # Add a default controller
-            #info( '*** Adding controller\n' )
-            #classes = self.controller
-            #if type( classes ) is not list:
-            #    classes = [ classes ]
-            #for i, cls in enumerate( classes ):
-            #    self.addController( 'c%d' % i, cls )
-
-        info( '*** Adding hosts:\n' )
-        for hostName in topo.hosts():
-	    #pdb.set_trace()
-            self.addHost( hostName, **topo.nodeInfo( hostName ) )
-            info( hostName + ' ' )
-
-        info( '\n*** Adding switches:\n' )
-        for switchName in topo.switches():
-            self.addSwitch( switchName, **topo.nodeInfo( switchName) )
-            info( switchName + ' ' )
-
-        info( '\n*** Adding links:\n' )
-        for srcName, dstName in topo.links(sort=True):
-            src, dst = self.nameToNode[ srcName ], self.nameToNode[ dstName ]
-            params = topo.linkInfo( srcName, dstName )
-            srcPort, dstPort = topo.port( srcName, dstName )
-            self.addLink( src, dst, srcPort, dstPort, **params )
-            if self.isNdnhost(src):
-                src.setIP(ipStr(ipParse(self.ccnNetBase) + 1) + '/30', intf=src.name + '-eth' + str(srcPort))
-                dst.setIP(ipStr(ipParse(self.ccnNetBase) + 2) + '/30', intf=dst.name + '-eth' + str(dstPort))
-                self.ccnNetBase=nextCCNnet(self.ccnNetBase)
-                
-            info( '(%s, %s) ' % ( src.name, dst.name ) )
-
-        info( '\n' )
-        
-        
-    def configureControlNetwork( self ):
-        "Control net config hook: override in subclass"
-        raise Exception( 'configureControlNetwork: '
-                         'should be overriden in subclass', self )
-
-    def build( self ):
-        "Build mininet."
-
-        if self.topo:
-            self.buildFromTopo( self.topo )
-        if ( self.inNamespace ):
-            self.configureControlNetwork()
-        info( '*** Configuring hosts\n' )
-        self.configHosts()
-        if self.xterms:
-            self.startTerms()
-        if self.autoStaticArp:
-            self.staticArp()
-        self.built = True
-
-    def startTerms( self ):
-        "Start a terminal for each node."
-        info( "*** Running terms on %s\n" % os.environ[ 'DISPLAY' ] )
-        cleanUpScreens()
-        self.terms += makeTerms( self.controllers, 'controller' )
-        self.terms += makeTerms( self.switches, 'switch' )
-        self.terms += makeTerms( self.hosts, 'host' )
-
-    def stopXterms( self ):
-        "Kill each xterm."
-        for term in self.terms:
-            os.kill( term.pid, signal.SIGKILL )
-        cleanUpScreens()
-
-    def staticArp( self ):
-        "Add all-pairs ARP entries to remove the need to handle broadcast."
-        for src in self.hosts:
-            for dst in self.hosts:
-                if src != dst:
-                    src.setARP( ip=dst.IP(), mac=dst.MAC() )
-
-    def start( self ):
-        "Start controller and switches."
-        if not self.built:
-            self.build()
-        info( '*** Starting controller\n' )
-        for controller in self.controllers:
-            controller.start()
-        info( '*** Starting %s switches\n' % len( self.switches ) )
-        for switch in self.switches:
-            info( switch.name + ' ')
-            switch.start( self.controllers )
-        info( '\n' )
-
-    def stop( self ):
-        "Stop the controller(s), switches and hosts"
-        if self.terms:
-            info( '*** Stopping %i terms\n' % len( self.terms ) )
-            self.stopXterms()
-        info( '*** Stopping %i hosts\n' % len( self.hosts ) )
-        for host in self.hosts:
-            info( host.name + ' ' )
-            host.terminate()
-        info( '\n' )
-        info( '*** Stopping %i switches\n' % len( self.switches ) )
-        for switch in self.switches:
-            info( switch.name + ' ' )
-            switch.stop()
-        info( '\n' )
-        info( '*** Stopping %i controllers\n' % len( self.controllers ) )
-        for controller in self.controllers:
-            info( controller.name + ' ' )
-            controller.stop()
-        info( '\n*** Done\n' )
-
-    def run( self, test, *args, **kwargs ):
-        "Perform a complete start/test/stop cycle."
-        self.start()
-        info( '*** Running test\n' )
-        result = test( *args, **kwargs )
-        self.stop()
-        return result
-
-    def monitor( self, hosts=None, timeoutms=-1 ):
-        """Monitor a set of hosts (or all hosts by default),
-           and return their output, a line at a time.
-           hosts: (optional) set of hosts to monitor
-           timeoutms: (optional) timeout value in ms
-           returns: iterator which returns host, line"""
-        if hosts is None:
-            hosts = self.hosts
-        poller = select.poll()
-        Node = hosts[ 0 ]  # so we can call class method fdToNode
-        for host in hosts:
-            poller.register( host.stdout )
-        while True:
-            ready = poller.poll( timeoutms )
-            for fd, event in ready:
-                host = Node.fdToNode( fd )
-                if event & select.POLLIN:
-                    line = host.readline()
-                    if line is not None:
-                        yield host, line
-            # Return if non-blocking
-            if not ready and timeoutms >= 0:
-                yield None, None
-
-    # XXX These test methods should be moved out of this class.
-    # Probably we should create a tests.py for them
-
-    @staticmethod
-    def _parsePing( pingOutput ):
-        "Parse ping output and return packets sent, received."
-        # Check for downed link
-        if 'connect: Network is unreachable' in pingOutput:
-            return (1, 0)
-        r = r'(\d+) packets transmitted, (\d+) received'
-        m = re.search( r, pingOutput )
-        if m is None:
-            error( '*** Error: could not parse ping output: %s\n' %
-                   pingOutput )
-            return (1, 0)
-        sent, received = int( m.group( 1 ) ), int( m.group( 2 ) )
-        return sent, received
-
-    def ping( self, hosts=None, timeout=None ):
-        """Ping between all specified hosts.
-           hosts: list of hosts
-           timeout: time to wait for a response, as string
-           returns: ploss packet loss percentage"""
-        # should we check if running?
-        packets = 0
-        lost = 0
-        ploss = None
-        if not hosts:
-            hosts = self.hosts
-            output( '*** Ping: testing ping reachability\n' )
-        for node in hosts:
-            output( '%s -> ' % node.name )
-            for dest in hosts:
-                if node != dest:
-                    opts = ''
-                    if timeout:
-                        opts = '-W %s' % timeout
-                    result = node.cmd( 'ping -c1 %s %s' % (opts, dest.IP()) )
-                    sent, received = self._parsePing( result )
-                    packets += sent
-                    if received > sent:
-                        error( '*** Error: received too many packets' )
-                        error( '%s' % result )
-                        node.cmdPrint( 'route' )
-                        exit( 1 )
-                    lost += sent - received
-                    output( ( '%s ' % dest.name ) if received else 'X ' )
-            output( '\n' )
-            ploss = 100 * lost / packets
-        output( "*** Results: %i%% dropped (%d/%d lost)\n" %
-                ( ploss, lost, packets ) )
-        return ploss
-
-    @staticmethod
-    def _parsePingFull( pingOutput ):
-        "Parse ping output and return all data."
-        # Check for downed link
-        if 'connect: Network is unreachable' in pingOutput:
-            return (1, 0)
-        r = r'(\d+) packets transmitted, (\d+) received'
-        m = re.search( r, pingOutput )
-        if m is None:
-            error( '*** Error: could not parse ping output: %s\n' %
-                   pingOutput )
-            return (1, 0, 0, 0, 0, 0)
-        sent, received = int( m.group( 1 ) ), int( m.group( 2 ) )
-        r = r'rtt min/avg/max/mdev = '
-        r += r'(\d+\.\d+)/(\d+\.\d+)/(\d+\.\d+)/(\d+\.\d+) ms'
-        m = re.search( r, pingOutput )
-        rttmin = float( m.group( 1 ) )
-        rttavg = float( m.group( 2 ) )
-        rttmax = float( m.group( 3 ) )
-        rttdev = float( m.group( 4 ) )
-        return sent, received, rttmin, rttavg, rttmax, rttdev
-
-    def pingFull( self, hosts=None, timeout=None ):
-        """Ping between all specified hosts and return all data.
-           hosts: list of hosts
-           timeout: time to wait for a response, as string
-           returns: all ping data; see function body."""
-        # should we check if running?
-        # Each value is a tuple: (src, dsd, [all ping outputs])
-        all_outputs = []
-        if not hosts:
-            hosts = self.hosts
-            output( '*** Ping: testing ping reachability\n' )
-        for node in hosts:
-            output( '%s -> ' % node.name )
-            for dest in hosts:
-                if node != dest:
-                    opts = ''
-                    if timeout:
-                        opts = '-W %s' % timeout
-                    result = node.cmd( 'ping -c1 %s %s' % (opts, dest.IP()) )
-                    outputs = self._parsePingFull( result )
-                    sent, received, rttmin, rttavg, rttmax, rttdev = outputs
-                    all_outputs.append( (node, dest, outputs) )
-                    output( ( '%s ' % dest.name ) if received else 'X ' )
-            output( '\n' )
-        output( "*** Results: \n" )
-        for outputs in all_outputs:
-            src, dest, ping_outputs = outputs
-            sent, received, rttmin, rttavg, rttmax, rttdev = ping_outputs
-            output( " %s->%s: %s/%s, " % (src, dest, sent, received ) )
-            output( "rtt min/avg/max/mdev %0.3f/%0.3f/%0.3f/%0.3f ms\n" %
-                    (rttmin, rttavg, rttmax, rttdev) )
-        return all_outputs
-
-    def pingAll( self ):
-        """Ping between all hosts.
-           returns: ploss packet loss percentage"""
-        return self.ping()
-
-    def pingPair( self ):
-        """Ping between first two hosts, useful for testing.
-           returns: ploss packet loss percentage"""
-        hosts = [ self.hosts[ 0 ], self.hosts[ 1 ] ]
-        return self.ping( hosts=hosts )
-
-    def pingAllFull( self ):
-        """Ping between all hosts.
-           returns: ploss packet loss percentage"""
-        return self.pingFull()
-
-    def pingPairFull( self ):
-        """Ping between first two hosts, useful for testing.
-           returns: ploss packet loss percentage"""
-        hosts = [ self.hosts[ 0 ], self.hosts[ 1 ] ]
-        return self.pingFull( hosts=hosts )
-
-    @staticmethod
-    def _parseIperf( iperfOutput ):
-        """Parse iperf output and return bandwidth.
-           iperfOutput: string
-           returns: result string"""
-        r = r'([\d\.]+ \w+/sec)'
-        m = re.findall( r, iperfOutput )
-        if m:
-            return m[-1]
-        else:
-            # was: raise Exception(...)
-            error( 'could not parse iperf output: ' + iperfOutput )
-            return ''
-
-    # XXX This should be cleaned up
-
-    def iperf( self, hosts=None, l4Type='TCP', udpBw='10M' ):
-        """Run iperf between two hosts.
-           hosts: list of hosts; if None, uses opposite hosts
-           l4Type: string, one of [ TCP, UDP ]
-           returns: results two-element array of server and client speeds"""
-        if not quietRun( 'which telnet' ):
-            error( 'Cannot find telnet in $PATH - required for iperf test' )
-            return
-        if not hosts:
-            hosts = [ self.hosts[ 0 ], self.hosts[ -1 ] ]
-        else:
-            assert len( hosts ) == 2
-        client, server = hosts
-        output( '*** Iperf: testing ' + l4Type + ' bandwidth between ' )
-        output( "%s and %s\n" % ( client.name, server.name ) )
-        server.cmd( 'killall -9 iperf' )
-        iperfArgs = 'iperf '
-        bwArgs = ''
-        if l4Type == 'UDP':
-            iperfArgs += '-u '
-            bwArgs = '-b ' + udpBw + ' '
-        elif l4Type != 'TCP':
-            raise Exception( 'Unexpected l4 type: %s' % l4Type )
-        server.sendCmd( iperfArgs + '-s', printPid=True )
-        servout = ''
-        while server.lastPid is None:
-            servout += server.monitor()
-        if l4Type == 'TCP':
-            while 'Connected' not in client.cmd(
-                    'sh -c "echo A | telnet -e A %s 5001"' % server.IP()):
-                output('waiting for iperf to start up...')
-                sleep(.5)
-        cliout = client.cmd( iperfArgs + '-t 5 -c ' + server.IP() + ' ' +
-                             bwArgs )
-        debug( 'Client output: %s\n' % cliout )
-        server.sendInt()
-        servout += server.waitOutput()
-        debug( 'Server output: %s\n' % servout )
-        result = [ self._parseIperf( servout ), self._parseIperf( cliout ) ]
-        if l4Type == 'UDP':
-            result.insert( 0, udpBw )
-        output( '*** Results: %s\n' % result )
-        return result
-
-    def runCpuLimitTest( self, cpu, duration=5 ):
-        """run CPU limit test with 'while true' processes.
-        cpu: desired CPU fraction of each host
-        duration: test duration in seconds
-        returns a single list of measured CPU fractions as floats.
-        """
-        pct = cpu * 100
-        info('*** Testing CPU %.0f%% bandwidth limit\n' % pct)
-        hosts = self.hosts
-        for h in hosts:
-            h.cmd( 'while true; do a=1; done &' )
-        pids = [h.cmd( 'echo $!' ).strip() for h in hosts]
-        pids_str = ",".join(["%s" % pid for pid in pids])
-        cmd = 'ps -p %s -o pid,%%cpu,args' % pids_str
-        # It's a shame that this is what pylint prefers
-        outputs = []
-        for _ in range( duration ):
-            sleep( 1 )
-            outputs.append( quietRun( cmd ).strip() )
-        for h in hosts:
-            h.cmd( 'kill %1' )
-        cpu_fractions = []
-        for test_output in outputs:
-            # Split by line.  Ignore first line, which looks like this:
-            # PID %CPU COMMAND\n
-            for line in test_output.split('\n')[1:]:
-                r = r'\d+\s*(\d+\.\d+)'
-                m = re.search( r, line )
-                if m is None:
-                    error( '*** Error: could not extract CPU fraction: %s\n' %
-                           line )
-                    return None
-                cpu_fractions.append( float( m.group( 1 ) ) )
-        output( '*** Results: %s\n' % cpu_fractions )
-        return cpu_fractions
-
-    # BL: I think this can be rewritten now that we have
-    # a real link class.
-    def configLinkStatus( self, src, dst, status ):
-        """Change status of src <-> dst links.
-           src: node name
-           dst: node name
-           status: string {up, down}"""
-        if src not in self.nameToNode:
-            error( 'src not in network: %s\n' % src )
-        elif dst not in self.nameToNode:
-            error( 'dst not in network: %s\n' % dst )
-        else:
-            if type( src ) is str:
-                src = self.nameToNode[ src ]
-            if type( dst ) is str:
-                dst = self.nameToNode[ dst ]
-            connections = src.connectionsTo( dst )
-            if len( connections ) == 0:
-                error( 'src and dst not connected: %s %s\n' % ( src, dst) )
-            for srcIntf, dstIntf in connections:
-                result = srcIntf.ifconfig( status )
-                if result:
-                    error( 'link src status change failed: %s\n' % result )
-                result = dstIntf.ifconfig( status )
-                if result:
-                    error( 'link dst status change failed: %s\n' % result )
-
-    def interact( self ):
-        "Start network and run our simple CLI."
-        self.start()
-        result = CLI( self )
-        self.stop()
-        return result
-
-    inited = False
-
-    @classmethod
-    def init( cls ):
-        "Initialize Mininet"
-        if cls.inited:
-            return
-        ensureRoot()
-        fixLimits()
-        cls.inited = True
-
-
-class MininetWithControlNet( Mininet ):
-
-    """Control network support:
-
-       Create an explicit control network. Currently this is only
-       used/usable with the user datapath.
-
-       Notes:
-
-       1. If the controller and switches are in the same (e.g. root)
-          namespace, they can just use the loopback connection.
-
-       2. If we can get unix domain sockets to work, we can use them
-          instead of an explicit control network.
-
-       3. Instead of routing, we could bridge or use 'in-band' control.
-
-       4. Even if we dispense with this in general, it could still be
-          useful for people who wish to simulate a separate control
-          network (since real networks may need one!)
-
-       5. Basically nobody ever used this code, so it has been moved
-          into its own class.
-
-       6. Ultimately we may wish to extend this to allow us to create a
-          control network which every node's control interface is
-          attached to."""
-
-    def configureControlNetwork( self ):
-        "Configure control network."
-        self.configureRoutedControlNetwork()
-
-    # We still need to figure out the right way to pass
-    # in the control network location.
-
-    def configureRoutedControlNetwork( self, ip='192.168.123.1',
-                                       prefixLen=16 ):
-        """Configure a routed control network on controller and switches.
-           For use with the user datapath only right now."""
-        controller = self.controllers[ 0 ]
-        info( controller.name + ' <->' )
-        cip = ip
-        snum = ipParse( ip )
-        for switch in self.switches:
-            info( ' ' + switch.name )
-            link = self.link( switch, controller, port1=0 )
-            sintf, cintf = link.intf1, link.intf2
-            switch.controlIntf = sintf
-            snum += 1
-            while snum & 0xff in [ 0, 255 ]:
-                snum += 1
-            sip = ipStr( snum )
-            cintf.setIP( cip, prefixLen )
-            sintf.setIP( sip, prefixLen )
-            controller.setHostRoute( sip, cintf )
-            switch.setHostRoute( cip, sintf )
-        info( '\n' )
-        info( '*** Testing control network\n' )
-        while not cintf.isUp():
-            info( '*** Waiting for', cintf, 'to come up\n' )
-            sleep( 1 )
-        for switch in self.switches:
-            while not sintf.isUp():
-                info( '*** Waiting for', sintf, 'to come up\n' )
-                sleep( 1 )
-            if self.ping( hosts=[ switch, controller ] ) != 0:
-                error( '*** Error: control network test failed\n' )
-                exit( 1 )
-        info( '\n' )
diff --git a/mininet/node.py b/mininet/node.py
deleted file mode 100644
index 84e0bc6..0000000
--- a/mininet/node.py
+++ /dev/null
@@ -1,1107 +0,0 @@
-"""
-Node objects for Mininet.
-
-Nodes provide a simple abstraction for interacting with hosts, switches
-and controllers. Local nodes are simply one or more processes on the local
-machine.
-
-Node: superclass for all (primarily local) network nodes.
-
-Host: a virtual host. By default, a host is simply a shell; commands
-    may be sent using Cmd (which waits for output), or using sendCmd(),
-    which returns immediately, allowing subsequent monitoring using
-    monitor(). Examples of how to run experiments using this
-    functionality are provided in the examples/ directory.
-
-CPULimitedHost: a virtual host whose CPU bandwidth is limited by
-    RT or CFS bandwidth limiting.
-
-Switch: superclass for switch nodes.
-
-UserSwitch: a switch using the user-space switch from the OpenFlow
-    reference implementation.
-
-KernelSwitch: a switch using the kernel switch from the OpenFlow reference
-    implementation.
-
-OVSSwitch: a switch using the OpenVSwitch OpenFlow-compatible switch
-    implementation (openvswitch.org).
-
-Controller: superclass for OpenFlow controllers. The default controller
-    is controller(8) from the reference implementation.
-
-NOXController: a controller node using NOX (noxrepo.org).
-
-RemoteController: a remote controller node, which may use any
-    arbitrary OpenFlow-compatible controller, and which is not
-    created or managed by mininet.
-
-Future enhancements:
-
-- Possibly make Node, Switch and Controller more abstract so that
-  they can be used for both local and remote nodes
-
-- Create proxy objects for remote nodes (Mininet: Cluster Edition)
-"""
-
-import os
-import re
-import signal
-import select
-from subprocess import Popen, PIPE, STDOUT
-
-from mininet.log import info, error, warn, debug
-from mininet.util import ( quietRun, errRun, errFail, moveIntf, isShellBuiltin,
-                           numCores, retry, mountCgroups, run )
-from mininet.moduledeps import moduleDeps, pathCheck, OVS_KMOD, OF_KMOD, TUN
-from mininet.link import Link, Intf, TCIntf
-import pdb
-
-class Node( object ):
-    """A virtual network node is simply a shell in a network namespace.
-       We communicate with it using pipes."""
-
-    portBase = 0  # Nodes always start with eth0/port0, even in OF 1.0
-
-    def __init__( self, name, inNamespace=True, **params ):
-        """name: name of node
-           inNamespace: in network namespace?
-           params: Node parameters (see config() for details)"""
-
-        # Make sure class actually works
-        self.checkSetup()
-
-        self.name = name
-        self.inNamespace = inNamespace
-
-        # Stash configuration parameters for future reference
-        self.params = params
-
-        self.intfs = {}  # dict of port numbers to interfaces
-        self.ports = {}  # dict of interfaces to port numbers
-                         # replace with Port objects, eventually ?
-        self.nameToIntf = {}  # dict of interface names to Intfs
-
-        # Make pylint happy
-        ( self.shell, self.execed, self.pid, self.stdin, self.stdout,
-            self.lastPid, self.lastCmd, self.pollOut ) = (
-                None, None, None, None, None, None, None, None )
-        self.waiting = False
-        self.readbuf = ''
-
-        # Start command interpreter shell
-        self.startShell()
-
-    # File descriptor to node mapping support
-    # Class variables and methods
-
-    inToNode = {}  # mapping of input fds to nodes
-    outToNode = {}  # mapping of output fds to nodes
-
-    @classmethod
-    def fdToNode( cls, fd ):
-        """Return node corresponding to given file descriptor.
-           fd: file descriptor
-           returns: node"""
-        node = cls.outToNode.get( fd )
-        return node or cls.inToNode.get( fd )
-
-    # Command support via shell process in namespace
-
-    def startShell( self ):
-        "Start a shell process for running commands"
-        if self.shell:
-            error( "%s: shell is already running" )
-            return
-        # mnexec: (c)lose descriptors, (d)etach from tty,
-        # (p)rint pid, and run in (n)amespace
-        opts = '-cdp'
-        if self.inNamespace:
-            opts += 'n'
-        # bash -m: enable job control
-        cmd = [ 'mnexec', opts, 'bash', '-m' ]
-        self.shell = Popen( cmd, stdin=PIPE, stdout=PIPE, stderr=STDOUT,
-                            close_fds=True )
-        self.stdin = self.shell.stdin
-        self.stdout = self.shell.stdout
-        self.pid = self.shell.pid
-        self.pollOut = select.poll()
-        self.pollOut.register( self.stdout )
-        # Maintain mapping between file descriptors and nodes
-        # This is useful for monitoring multiple nodes
-        # using select.poll()
-        self.outToNode[ self.stdout.fileno() ] = self
-        self.inToNode[ self.stdin.fileno() ] = self
-        self.execed = False
-        self.lastCmd = None
-        self.lastPid = None
-        self.readbuf = ''
-        self.waiting = False
-
-    def cleanup( self ):
-        "Help python collect its garbage."
-        if not self.inNamespace:
-            for intfName in self.intfNames():
-                if self.name in intfName:
-                    quietRun( 'ip link del ' + intfName )
-        self.shell = None
-
-    # Subshell I/O, commands and control
-
-    def read( self, maxbytes=1024 ):
-        """Buffered read from node, non-blocking.
-           maxbytes: maximum number of bytes to return"""
-        count = len( self.readbuf )
-        if count < maxbytes:
-            data = os.read( self.stdout.fileno(), maxbytes - count )
-            self.readbuf += data
-        if maxbytes >= len( self.readbuf ):
-            result = self.readbuf
-            self.readbuf = ''
-        else:
-            result = self.readbuf[ :maxbytes ]
-            self.readbuf = self.readbuf[ maxbytes: ]
-        return result
-
-    def readline( self ):
-        """Buffered readline from node, non-blocking.
-           returns: line (minus newline) or None"""
-        self.readbuf += self.read( 1024 )
-        if '\n' not in self.readbuf:
-            return None
-        pos = self.readbuf.find( '\n' )
-        line = self.readbuf[ 0: pos ]
-        self.readbuf = self.readbuf[ pos + 1: ]
-        return line
-
-    def write( self, data ):
-        """Write data to node.
-           data: string"""
-        os.write( self.stdin.fileno(), data )
-
-    def terminate( self ):
-        "Send kill signal to Node and clean up after it."
-        os.kill( self.pid, signal.SIGKILL )
-        self.cleanup()
-
-    def stop( self ):
-        "Stop node."
-        self.terminate()
-
-    def waitReadable( self, timeoutms=None ):
-        """Wait until node's output is readable.
-           timeoutms: timeout in ms or None to wait indefinitely."""
-        if len( self.readbuf ) == 0:
-            self.pollOut.poll( timeoutms )
-
-    def sendCmd( self, *args, **kwargs ):
-        """Send a command, followed by a command to echo a sentinel,
-           and return without waiting for the command to complete.
-           args: command and arguments, or string
-           printPid: print command's PID?"""
-        assert not self.waiting
-        printPid = kwargs.get( 'printPid', True )
-        # Allow sendCmd( [ list ] )
-        if len( args ) == 1 and type( args[ 0 ] ) is list:
-            cmd = args[ 0 ]
-        # Allow sendCmd( cmd, arg1, arg2... )
-        elif len( args ) > 0:
-            cmd = args
-        # Convert to string
-        if not isinstance( cmd, str ):
-            cmd = ' '.join( [ str( c ) for c in cmd ] )
-        if not re.search( r'\w', cmd ):
-            # Replace empty commands with something harmless
-            cmd = 'echo -n'
-        self.lastCmd = cmd
-        printPid = printPid and not isShellBuiltin( cmd )
-        if len( cmd ) > 0 and cmd[ -1 ] == '&':
-            # print ^A{pid}\n{sentinel}
-            cmd += ' printf "\\001%d\n\\177" $! \n'
-        else:
-            # print sentinel
-            cmd += '; printf "\\177"'
-            if printPid and not isShellBuiltin( cmd ):
-                cmd = 'mnexec -p ' + cmd
-        self.write( cmd + '\n' )
-        self.lastPid = None
-        self.waiting = True
-
-    def sendInt( self, sig=signal.SIGINT ):
-        "Interrupt running command."
-        if self.lastPid:
-            try:
-                os.kill( self.lastPid, sig )
-            except OSError:
-                pass
-
-    def monitor( self, timeoutms=None ):
-        """Monitor and return the output of a command.
-           Set self.waiting to False if command has completed.
-           timeoutms: timeout in ms or None to wait indefinitely."""
-        self.waitReadable( timeoutms )
-        data = self.read( 1024 )
-        # Look for PID
-        marker = chr( 1 ) + r'\d+\n'
-        if chr( 1 ) in data:
-            markers = re.findall( marker, data )
-            if markers:
-                self.lastPid = int( markers[ 0 ][ 1: ] )
-                data = re.sub( marker, '', data )
-        # Look for sentinel/EOF
-        if len( data ) > 0 and data[ -1 ] == chr( 127 ):
-            self.waiting = False
-            data = data[ :-1 ]
-        elif chr( 127 ) in data:
-            self.waiting = False
-            data = data.replace( chr( 127 ), '' )
-        return data
-
-    def waitOutput( self, verbose=False ):
-        """Wait for a command to complete.
-           Completion is signaled by a sentinel character, ASCII(127)
-           appearing in the output stream.  Wait for the sentinel and return
-           the output, including trailing newline.
-           verbose: print output interactively"""
-        log = info if verbose else debug
-        output = ''
-        while self.waiting:
-            data = self.monitor()
-            output += data
-            log( data )
-        return output
-
-    def cmd( self, *args, **kwargs ):
-        """Send a command, wait for output, and return it.
-           cmd: string"""
-        verbose = kwargs.get( 'verbose', False )
-        log = info if verbose else debug
-        log( '*** %s : %s\n' % ( self.name, args ) )
-        self.sendCmd( *args, **kwargs )
-        return self.waitOutput( verbose )
-
-    def cmdPrint( self, *args):
-        """Call cmd and printing its output
-           cmd: string"""
-        return self.cmd( *args, **{ 'verbose': True } )
-
-    def popen( self, *args, **kwargs ):
-        """Return a Popen() object in our namespace
-           args: Popen() args, single list, or string
-           kwargs: Popen() keyword args"""
-        defaults = { 'stdout': PIPE, 'stderr': PIPE,
-                     'mncmd':
-                     [ 'mnexec', '-a', str( self.pid ) ] }
-        defaults.update( kwargs )
-        if len( args ) == 1:
-            if type( args[ 0 ] ) is list:
-                # popen([cmd, arg1, arg2...])
-                cmd = args[ 0 ]
-            elif type( args[ 0 ] ) is str:
-                # popen("cmd arg1 arg2...")
-                cmd = args[ 0 ].split()
-            else:
-                raise Exception( 'popen() requires a string or list' )
-        elif len( args ) > 0:
-            # popen( cmd, arg1, arg2... )
-            cmd = list( args )
-        # Attach to our namespace  using mnexec -a
-        mncmd = defaults[ 'mncmd' ]
-        del defaults[ 'mncmd' ]
-        cmd = mncmd + cmd
-        # Shell requires a string, not a list!
-        if defaults.get( 'shell', False ):
-            cmd = ' '.join( cmd )
-        return Popen( cmd, **defaults )
-
-    def pexec( self, *args, **kwargs ):
-        """Execute a command using popen
-           returns: out, err, exitcode"""
-        popen = self.popen( *args, **kwargs)
-        out, err = popen.communicate()
-        exitcode = popen.wait()
-        return out, err, exitcode
-
-    # Interface management, configuration, and routing
-
-    # BL notes: This might be a bit redundant or over-complicated.
-    # However, it does allow a bit of specialization, including
-    # changing the canonical interface names. It's also tricky since
-    # the real interfaces are created as veth pairs, so we can't
-    # make a single interface at a time.
-
-    def newPort( self ):
-        "Return the next port number to allocate."
-        if len( self.ports ) > 0:
-            return max( self.ports.values() ) + 1
-        return self.portBase
-
-    def addIntf( self, intf, port=None ):
-        """Add an interface.
-           intf: interface
-           port: port number (optional, typically OpenFlow port number)"""
-        if port is None:
-            port = self.newPort()
-        self.intfs[ port ] = intf
-        self.ports[ intf ] = port
-        self.nameToIntf[ intf.name ] = intf
-        debug( '\n' )
-        debug( 'added intf %s:%d to node %s\n' % ( intf, port, self.name ) )
-        if self.inNamespace:
-            debug( 'moving', intf, 'into namespace for', self.name, '\n' )
-            moveIntf( intf.name, self )
-
-    def defaultIntf( self ):
-        "Return interface for lowest port"
-        ports = self.intfs.keys()
-        if ports:
-            return self.intfs[ min( ports ) ]
-        else:
-            warn( '*** defaultIntf: warning:', self.name,
-                  'has no interfaces\n' )
-
-    def intf( self, intf='' ):
-        """Return our interface object with given string name,
-           default intf if name is falsy (None, empty string, etc).
-           or the input intf arg.
-
-        Having this fcn return its arg for Intf objects makes it
-        easier to construct functions with flexible input args for
-        interfaces (those that accept both string names and Intf objects).
-        """
-        if not intf:
-            return self.defaultIntf()
-        elif type( intf) is str:
-            return self.nameToIntf[ intf ]
-        else:
-            return intf
-
-    def connectionsTo( self, node):
-        "Return [ intf1, intf2... ] for all intfs that connect self to node."
-        # We could optimize this if it is important
-        connections = []
-        for intf in self.intfList():
-            link = intf.link
-            if link:
-                node1, node2 = link.intf1.node, link.intf2.node
-                if node1 == self and node2 == node:
-                    connections += [ ( intf, link.intf2 ) ]
-                elif node1 == node and node2 == self:
-                    connections += [ ( intf, link.intf1 ) ]
-        return connections
-
-    def deleteIntfs( self ):
-        "Delete all of our interfaces."
-        # In theory the interfaces should go away after we shut down.
-        # However, this takes time, so we're better off removing them
-        # explicitly so that we won't get errors if we run before they
-        # have been removed by the kernel. Unfortunately this is very slow,
-        # at least with Linux kernels before 2.6.33
-        for intf in self.intfs.values():
-            intf.delete()
-            info( '.' )
-
-    # Routing support
-
-    def setARP( self, ip, mac ):
-        """Add an ARP entry.
-           ip: IP address as string
-           mac: MAC address as string"""
-        result = self.cmd( 'arp', '-s', ip, mac )
-        return result
-
-    def setHostRoute( self, ip, intf ):
-        """Add route to host.
-           ip: IP address as dotted decimal
-           intf: string, interface name"""
-        return self.cmd( 'route add -host', ip, 'dev', intf )
-
-    def setDefaultRoute( self, intf=None ):
-        """Set the default route to go through intf.
-           intf: string, interface name"""
-        if not intf:
-            intf = self.defaultIntf()
-        self.cmd( 'ip route flush root 0/0' )
-        return self.cmd( 'route add default %s' % intf )
-
-    # Convenience and configuration methods
-
-    def setMAC( self, mac, intf=None ):
-        """Set the MAC address for an interface.
-           intf: intf or intf name
-           mac: MAC address as string"""
-        return self.intf( intf ).setMAC( mac )
-
-    def setIP( self, ip, prefixLen=8, intf=None ):
-        """Set the IP address for an interface.
-           intf: intf or intf name
-           ip: IP address as a string
-           prefixLen: prefix length, e.g. 8 for /8 or 16M addrs"""
-        # This should probably be rethought
-        if '/' not in ip:
-            ip = '%s/%s' % ( ip, prefixLen )
-        return self.intf( intf ).setIP( ip )
-
-    def IP( self, intf=None ):
-        "Return IP address of a node or specific interface."
-        return self.intf( intf ).IP()
-
-    def MAC( self, intf=None ):
-        "Return MAC address of a node or specific interface."
-        return self.intf( intf ).MAC()
-
-    def intfIsUp( self, intf=None ):
-        "Check if an interface is up."
-        return self.intf( intf ).isUp()
-
-    # The reason why we configure things in this way is so
-    # That the parameters can be listed and documented in
-    # the config method.
-    # Dealing with subclasses and superclasses is slightly
-    # annoying, but at least the information is there!
-
-    def setParam( self, results, method, **param ):
-        """Internal method: configure a *single* parameter
-           results: dict of results to update
-           method: config method name
-           param: arg=value (ignore if value=None)
-           value may also be list or dict"""
-        name, value = param.items()[ 0 ]
-        f = getattr( self, method, None )
-        if not f or value is None:
-            return
-        if type( value ) is list:
-            result = f( *value )
-        elif type( value ) is dict:
-            result = f( **value )
-        else:
-            result = f( value )
-        results[ name ] = result
-        return result
-
-    def config( self, mac=None, ip=None,
-                defaultRoute=None, lo='up', **_params ):
-        """Configure Node according to (optional) parameters:
-           mac: MAC address for default interface
-           ip: IP address for default interface
-           ifconfig: arbitrary interface configuration
-           Subclasses should override this method and call
-           the parent class's config(**params)"""
-        # If we were overriding this method, we would call
-        # the superclass config method here as follows:
-        # r = Parent.config( **_params )
-        r = {}
-        self.setParam( r, 'setMAC', mac=mac )
-        self.setParam( r, 'setIP', ip=ip )
-        self.setParam( r, 'defaultRoute', defaultRoute=defaultRoute )
-        # This should be examined
-        self.cmd( 'ifconfig lo ' + lo )
-        return r
-
-    def configDefault( self, **moreParams ):
-        "Configure with default parameters"
-        self.params.update( moreParams )
-        self.config( **self.params )
-
-    # This is here for backward compatibility
-    def linkTo( self, node, link=Link ):
-        """(Deprecated) Link to another node
-           replace with Link( node1, node2)"""
-        return link( self, node )
-
-    # Other methods
-
-    def intfList( self ):
-        "List of our interfaces sorted by port number"
-        return [ self.intfs[ p ] for p in sorted( self.intfs.iterkeys() ) ]
-
-    def intfNames( self ):
-        "The names of our interfaces sorted by port number"
-        return [ str( i ) for i in self.intfList() ]
-
-    def __repr__( self ):
-        "More informative string representation"
-        intfs = ( ','.join( [ '%s:%s' % ( i.name, i.IP() )
-                              for i in self.intfList() ] ) )
-        return '<%s %s: %s pid=%s> ' % (
-            self.__class__.__name__, self.name, intfs, self.pid )
-
-    def __str__( self ):
-        "Abbreviated string representation"
-        return self.name
-
-    # Automatic class setup support
-
-    isSetup = False
-
-    @classmethod
-    def checkSetup( cls ):
-        "Make sure our class and superclasses are set up"
-        while cls and not getattr( cls, 'isSetup', True ):
-            cls.setup()
-            cls.isSetup = True
-            # Make pylint happy
-            cls = getattr( type( cls ), '__base__', None )
-
-    @classmethod
-    def setup( cls ):
-        "Make sure our class dependencies are available"
-        pathCheck( 'mnexec', 'ifconfig', moduleName='Mininet')
-
-
-class Host( Node ):
-    "A host is simply a Node"
-    pass
-
-
-
-class CPULimitedHost( Host ):
-
-    "CPU limited host"
-
-    def __init__( self, name, sched='cfs', **kwargs ):
-        Host.__init__( self, name, **kwargs )
-        # Initialize class if necessary
-        if not CPULimitedHost.inited:
-            CPULimitedHost.init()
-        # Create a cgroup and move shell into it
-        self.cgroup = 'cpu,cpuacct,cpuset:/' + self.name
-        errFail( 'cgcreate -g ' + self.cgroup )
-        # We don't add ourselves to a cpuset because you must
-        # specify the cpu and memory placement first
-        errFail( 'cgclassify -g cpu,cpuacct:/%s %s' % ( self.name, self.pid ) )
-        # BL: Setting the correct period/quota is tricky, particularly
-        # for RT. RT allows very small quotas, but the overhead
-        # seems to be high. CFS has a mininimum quota of 1 ms, but
-        # still does better with larger period values.
-        self.period_us = kwargs.get( 'period_us', 100000 )
-        self.sched = sched
-        self.rtprio = 20
-
-    def cgroupSet( self, param, value, resource='cpu' ):
-        "Set a cgroup parameter and return its value"
-        cmd = 'cgset -r %s.%s=%s /%s' % (
-            resource, param, value, self.name )
-        quietRun( cmd )
-        nvalue = int( self.cgroupGet( param, resource ) )
-        if nvalue != value:
-            error( '*** error: cgroupSet: %s set to %s instead of %s\n'
-                   % ( param, nvalue, value ) )
-        return nvalue
-
-    def cgroupGet( self, param, resource='cpu' ):
-        "Return value of cgroup parameter"
-        cmd = 'cgget -r %s.%s /%s' % (
-            resource, param, self.name )
-
-        return int(quietRun( cmd ).split()[ -1 ] )
-
-    def cgroupDel( self ):
-        "Clean up our cgroup"
-        # info( '*** deleting cgroup', self.cgroup, '\n' )
-        _out, _err, exitcode = errRun( 'cgdelete -r ' + self.cgroup )
-        return exitcode != 0
-
-    def popen( self, *args, **kwargs ):
-        """Return a Popen() object in node's namespace
-           args: Popen() args, single list, or string
-           kwargs: Popen() keyword args"""
-        # Tell mnexec to execute command in our cgroup
-        mncmd = [ 'mnexec', '-a', str( self.pid ),
-                  '-g', self.name ]
-        if self.sched == 'rt':
-            mncmd += [ '-r', str( self.rtprio ) ]
-        return Host.popen( self, *args, mncmd=mncmd, **kwargs )
-
-    def cleanup( self ):
-        "Clean up our cgroup"
-        retry( retries=3, delaySecs=1, fn=self.cgroupDel )
-
-    def chrt( self ):
-        "Set RT scheduling priority"
-        quietRun( 'chrt -p %s %s' % ( self.rtprio, self.pid ) )
-        result = quietRun( 'chrt -p %s' % self.pid )
-        firstline = result.split( '\n' )[ 0 ]
-        lastword = firstline.split( ' ' )[ -1 ]
-        if lastword != 'SCHED_RR':
-            error( '*** error: could not assign SCHED_RR to %s\n' % self.name )
-        return lastword
-
-    def rtInfo( self, f ):
-        "Internal method: return parameters for RT bandwidth"
-        pstr, qstr = 'rt_period_us', 'rt_runtime_us'
-        # RT uses wall clock time for period and quota
-        quota = int( self.period_us * f * numCores() )
-        return pstr, qstr, self.period_us, quota
-
-    def cfsInfo( self, f):
-        "Internal method: return parameters for CFS bandwidth"
-        pstr, qstr = 'cfs_period_us', 'cfs_quota_us'
-        # CFS uses wall clock time for period and CPU time for quota.
-        quota = int( self.period_us * f * numCores() )
-        period = self.period_us
-        if f > 0 and quota < 1000:
-            debug( '(cfsInfo: increasing default period) ' )
-            quota = 1000
-            period = int( quota / f / numCores() )
-        return pstr, qstr, period, quota
-
-    # BL comment:
-    # This may not be the right API,
-    # since it doesn't specify CPU bandwidth in "absolute"
-    # units the way link bandwidth is specified.
-    # We should use MIPS or SPECINT or something instead.
-    # Alternatively, we should change from system fraction
-    # to CPU seconds per second, essentially assuming that
-    # all CPUs are the same.
-
-    def setCPUFrac( self, f=-1, sched=None):
-        """Set overall CPU fraction for this host
-           f: CPU bandwidth limit (fraction)
-           sched: 'rt' or 'cfs'
-           Note 'cfs' requires CONFIG_CFS_BANDWIDTH"""
-        if not f:
-            return
-        if not sched:
-            sched = self.sched
-        if sched == 'rt':
-            pstr, qstr, period, quota = self.rtInfo( f )
-        elif sched == 'cfs':
-            pstr, qstr, period, quota = self.cfsInfo( f )
-        else:
-            return
-        if quota < 0:
-            # Reset to unlimited
-            quota = -1
-        # Set cgroup's period and quota
-        self.cgroupSet( pstr, period )
-        self.cgroupSet( qstr, quota )
-        if sched == 'rt':
-            # Set RT priority if necessary
-            self.chrt()
-        info( '(%s %d/%dus) ' % ( sched, quota, period ) )
-
-    def setCPUs( self, cores, mems=0 ):
-        "Specify (real) cores that our cgroup can run on"
-        if type( cores ) is list:
-            cores = ','.join( [ str( c ) for c in cores ] )
-        self.cgroupSet( resource='cpuset', param='cpus',
-                        value=cores )
-        # Memory placement is probably not relevant, but we
-        # must specify it anyway
-        self.cgroupSet( resource='cpuset', param='mems',
-                        value=mems)
-        # We have to do this here after we've specified
-        # cpus and mems
-        errFail( 'cgclassify -g cpuset:/%s %s' % (
-                 self.name, self.pid ) )
-
-    def config( self, cpu=None, cores=None, **params ):
-        """cpu: desired overall system CPU fraction
-           cores: (real) core(s) this host can run on
-           params: parameters for Node.config()"""
-        r = Node.config( self, **params )
-        # Was considering cpu={'cpu': cpu , 'sched': sched}, but
-        # that seems redundant
-
-        self.setParam( r, 'setCPUFrac', cpu=cpu )
-        self.setParam( r, 'setCPUs', cores=cores )
-
-        return r
-
-    inited = False
-
-    @classmethod
-    def init( cls ):
-        "Initialization for CPULimitedHost class"
-        mountCgroups()
-        cls.inited = True
-
-# Some important things to note:
-#
-# The "IP" address which setIP() assigns to the switch is not
-# an "IP address for the switch" in the sense of IP routing.
-# Rather, it is the IP address for the control interface,
-# on the control network, and it is only relevant to the
-# controller. If you are running in the root namespace
-# (which is the only way to run OVS at the moment), the
-# control interface is the loopback interface, and you
-# normally never want to change its IP address!
-#
-# In general, you NEVER want to attempt to use Linux's
-# network stack (i.e. ifconfig) to "assign" an IP address or
-# MAC address to a switch data port. Instead, you "assign"
-# the IP and MAC addresses in the controller by specifying
-# packets that you want to receive or send. The "MAC" address
-# reported by ifconfig for a switch data port is essentially
-# meaningless. It is important to understand this if you
-# want to create a functional router using OpenFlow.
-
-class Switch( Node ):
-    """A Switch is a Node that is running (or has execed?)
-       an OpenFlow switch."""
-
-    portBase = 1  # Switches start with port 1 in OpenFlow
-    dpidLen = 16  # digits in dpid passed to switch
-
-    def __init__( self, name, dpid=None, opts='', listenPort=None, **params):
-        """dpid: dpid for switch (or None to derive from name, e.g. s1 -> 1)
-           opts: additional switch options
-           listenPort: port to listen on for dpctl connections"""
-        Node.__init__( self, name, **params )
-        self.dpid = dpid if dpid else self.defaultDpid()
-        self.opts = opts
-        self.listenPort = listenPort
-        if not self.inNamespace:
-            self.controlIntf = Intf( 'lo', self, port=0 )
-
-    def defaultDpid( self ):
-        "Derive dpid from switch name, s1 -> 1"
-        try:
-            dpid = int( re.findall( '\d+', self.name )[ 0 ] )
-            dpid = hex( dpid )[ 2: ]
-            dpid = '0' * ( self.dpidLen - len( dpid ) ) + dpid
-            return dpid
-        except IndexError:
-            raise Exception( 'Unable to derive default datapath ID - '
-                             'please either specify a dpid or use a '
-                             'canonical switch name such as s23.' )
-
-    def defaultIntf( self ):
-        "Return control interface"
-        if self.controlIntf:
-            return self.controlIntf
-        else:
-            return Node.defaultIntf( self )
-
-    def sendCmd( self, *cmd, **kwargs ):
-        """Send command to Node.
-           cmd: string"""
-        kwargs.setdefault( 'printPid', False )
-        if not self.execed:
-            return Node.sendCmd( self, *cmd, **kwargs )
-        else:
-            error( '*** Error: %s has execed and cannot accept commands' %
-                   self.name )
-
-    def __repr__( self ):
-        "More informative string representation"
-        intfs = ( ','.join( [ '%s:%s' % ( i.name, i.IP() )
-                              for i in self.intfList() ] ) )
-        return '<%s %s: %s pid=%s> ' % (
-            self.__class__.__name__, self.name, intfs, self.pid )
-
-class UserSwitch( Switch ):
-    "User-space switch."
-
-    dpidLen = 12
-
-    def __init__( self, name, **kwargs ):
-        """Init.
-           name: name for the switch"""
-        Switch.__init__( self, name, **kwargs )
-        pathCheck( 'ofdatapath', 'ofprotocol',
-                   moduleName='the OpenFlow reference user switch' +
-                              '(openflow.org)' )
-        if self.listenPort:
-            self.opts += ' --listen=ptcp:%i ' % self.listenPort
-
-    @classmethod
-    def setup( cls ):
-        "Ensure any dependencies are loaded; if not, try to load them."
-        if not os.path.exists( '/dev/net/tun' ):
-            moduleDeps( add=TUN )
-
-    def dpctl( self, *args ):
-        "Run dpctl command"
-        if not self.listenPort:
-            return "can't run dpctl without passive listening port"
-        return self.cmd( 'dpctl ' + ' '.join( args ) +
-                         ' tcp:127.0.0.1:%i' % self.listenPort )
-
-    def start( self, controllers ):
-        """Start OpenFlow reference user datapath.
-           Log to /tmp/sN-{ofd,ofp}.log.
-           controllers: list of controller objects"""
-        # Add controllers
-        clist = ','.join( [ 'tcp:%s:%d' % ( c.IP(), c.port )
-                            for c in controllers ] )
-        ofdlog = '/tmp/' + self.name + '-ofd.log'
-        ofplog = '/tmp/' + self.name + '-ofp.log'
-        self.cmd( 'ifconfig lo up' )
-        intfs = [ str( i ) for i in self.intfList() if not i.IP() ]
-        self.cmd( 'ofdatapath -i ' + ','.join( intfs ) +
-                  ' punix:/tmp/' + self.name + ' -d ' + self.dpid +
-                  ' 1> ' + ofdlog + ' 2> ' + ofdlog + ' &' )
-        self.cmd( 'ofprotocol unix:/tmp/' + self.name +
-                  ' ' + clist +
-                  ' --fail=closed ' + self.opts +
-                  ' 1> ' + ofplog + ' 2>' + ofplog + ' &' )
-
-    def stop( self ):
-        "Stop OpenFlow reference user datapath."
-        self.cmd( 'kill %ofdatapath' )
-        self.cmd( 'kill %ofprotocol' )
-        self.deleteIntfs()
-
-
-class OVSLegacyKernelSwitch( Switch ):
-    """Open VSwitch legacy kernel-space switch using ovs-openflowd.
-       Currently only works in the root namespace."""
-
-    def __init__( self, name, dp=None, **kwargs ):
-        """Init.
-           name: name for switch
-           dp: netlink id (0, 1, 2, ...)
-           defaultMAC: default MAC as unsigned int; random value if None"""
-        Switch.__init__( self, name, **kwargs )
-        self.dp = dp if dp else self.name
-        self.intf = self.dp
-        if self.inNamespace:
-            error( "OVSKernelSwitch currently only works"
-                   " in the root namespace.\n" )
-            exit( 1 )
-
-    @classmethod
-    def setup( cls ):
-        "Ensure any dependencies are loaded; if not, try to load them."
-        pathCheck( 'ovs-dpctl', 'ovs-openflowd',
-                   moduleName='Open vSwitch (openvswitch.org)')
-        moduleDeps( subtract=OF_KMOD, add=OVS_KMOD )
-
-    def start( self, controllers ):
-        "Start up kernel datapath."
-        ofplog = '/tmp/' + self.name + '-ofp.log'
-        quietRun( 'ifconfig lo up' )
-        # Delete local datapath if it exists;
-        # then create a new one monitoring the given interfaces
-        self.cmd( 'ovs-dpctl del-dp ' + self.dp )
-        self.cmd( 'ovs-dpctl add-dp ' + self.dp )
-        intfs = [ str( i ) for i in self.intfList() if not i.IP() ]
-        self.cmd( 'ovs-dpctl', 'add-if', self.dp, ' '.join( intfs ) )
-        # Run protocol daemon
-        clist = ','.join( [ 'tcp:%s:%d' % ( c.IP(), c.port )
-                            for c in controllers ] )
-        self.cmd( 'ovs-openflowd ' + self.dp +
-                  ' ' + clist +
-                  ' --fail=secure ' + self.opts +
-                  ' --datapath-id=' + self.dpid +
-                  ' 1>' + ofplog + ' 2>' + ofplog + '&' )
-        self.execed = False
-
-    def stop( self ):
-        "Terminate kernel datapath."
-        quietRun( 'ovs-dpctl del-dp ' + self.dp )
-        self.cmd( 'kill %ovs-openflowd' )
-        self.deleteIntfs()
-
-
-class OVSSwitch( Switch ):
-    "Open vSwitch switch. Depends on ovs-vsctl."
-
-    def __init__( self, name, failMode='secure', **params ):
-        """Init.
-           name: name for switch
-           failMode: controller loss behavior (secure|open)"""
-        Switch.__init__( self, name, **params )
-        self.failMode = failMode
-
-    @classmethod
-    def setup( cls ):
-        "Make sure Open vSwitch is installed and working"
-        pathCheck( 'ovs-vsctl',
-                   moduleName='Open vSwitch (openvswitch.org)')
-        # This should no longer be needed, and it breaks
-        # with OVS 1.7 which has renamed the kernel module:
-        #  moduleDeps( subtract=OF_KMOD, add=OVS_KMOD )
-        out, err, exitcode = errRun( 'ovs-vsctl -t 1 show' )
-        if exitcode:
-            error( out + err +
-                   'ovs-vsctl exited with code %d\n' % exitcode +
-                   '*** Error connecting to ovs-db with ovs-vsctl\n'
-                   'Make sure that Open vSwitch is installed, '
-                   'that ovsdb-server is running, and that\n'
-                   '"ovs-vsctl show" works correctly.\n'
-                   'You may wish to try '
-                   '"service openvswitch-switch start".\n' )
-            exit( 1 )
-
-    def dpctl( self, *args ):
-        "Run ovs-dpctl command"
-        return self.cmd( 'ovs-dpctl', args[ 0 ], self, *args[ 1: ] )
-
-    @staticmethod
-    def TCReapply( intf ):
-        """Unfortunately OVS and Mininet are fighting
-           over tc queuing disciplines. As a quick hack/
-           workaround, we clear OVS's and reapply our own."""
-        if type( intf ) is TCIntf:
-            intf.config( **intf.params )
-
-    def attach( self, intf ):
-        "Connect a data port"
-        self.cmd( 'ovs-vsctl add-port', self, intf )
-        self.cmd( 'ifconfig', intf, 'up' )
-        self.TCReapply( intf )
-
-    def detach( self, intf ):
-        "Disconnect a data port"
-        self.cmd( 'ovs-vsctl del-port', self, intf )
-
-    def start( self, controllers ):
-        "Start up a new OVS OpenFlow switch using ovs-vsctl"
-        if self.inNamespace:
-            raise Exception(
-                'OVS kernel switch does not work in a namespace' )
-        # We should probably call config instead, but this
-        # requires some rethinking...
-        self.cmd( 'ifconfig lo up' )
-        # Annoyingly, --if-exists option seems not to work
-        self.cmd( 'ovs-vsctl del-br', self )
-        self.cmd( 'ovs-vsctl add-br', self )
-        self.cmd( 'ovs-vsctl -- set Bridge', self,
-                  'other_config:datapath-id=' + self.dpid )
-        self.cmd( 'ovs-vsctl set-fail-mode', self, self.failMode )
-        for intf in self.intfList():
-            if not intf.IP():
-                self.attach( intf )
-        # Add controllers
-        clist = ' '.join( [ 'tcp:%s:%d' % ( c.IP(), c.port )
-                            for c in controllers ] )
-        if self.listenPort:
-            clist += ' ptcp:%s' % self.listenPort
-        self.cmd( 'ovs-vsctl set-controller', self, clist )
-
-    def stop( self ):
-        "Terminate OVS switch."
-        self.cmd( 'ovs-vsctl del-br', self )
-        self.deleteIntfs()
-
-OVSKernelSwitch = OVSSwitch
-
-
-class Controller( Node ):
-    """A Controller is a Node that is running (or has execed?) an
-       OpenFlow controller."""
-
-    def __init__( self, name, inNamespace=False, command='controller',
-                  cargs='-v ptcp:%d', cdir=None, ip="127.0.0.1",
-                  port=6633, **params ):
-        self.command = command
-        self.cargs = cargs
-        self.cdir = cdir
-        self.ip = ip
-        self.port = port
-        Node.__init__( self, name, inNamespace=inNamespace,
-                       ip=ip, **params  )
-        self.cmd( 'ifconfig lo up' )  # Shouldn't be necessary
-        self.checkListening()
-
-    def checkListening( self ):
-        "Make sure no controllers are running on our port"
-        # Verify that Telnet is installed first:
-        out, _err, returnCode = errRun( "which telnet" )
-        if 'telnet' not in out or returnCode != 0:
-            raise Exception( "Error running telnet to check for listening "
-                             "controllers; please check that it is "
-                             "installed." )
-        listening = self.cmd( "echo A | telnet -e A %s %d" %
-                              ( self.ip, self.port ) )
-        if 'Unable' not in listening:
-            servers = self.cmd( 'netstat -atp' ).split( '\n' )
-            pstr = ':%d ' % self.port
-            clist = servers[ 0:1 ] + [ s for s in servers if pstr in s ]
-            raise Exception( "Please shut down the controller which is"
-                             " running on port %d:\n" % self.port +
-                             '\n'.join( clist ) )
-
-    def start( self ):
-        """Start <controller> <args> on controller.
-           Log to /tmp/cN.log"""
-        pathCheck( self.command )
-        cout = '/tmp/' + self.name + '.log'
-        if self.cdir is not None:
-            self.cmd( 'cd ' + self.cdir )
-        self.cmd( self.command + ' ' + self.cargs % self.port +
-                  ' 1>' + cout + ' 2>' + cout + '&' )
-        self.execed = False
-
-    def stop( self ):
-        "Stop controller."
-        self.cmd( 'kill %' + self.command )
-        self.terminate()
-
-    def IP( self, intf=None ):
-        "Return IP address of the Controller"
-        if self.intfs:
-            ip = Node.IP( self, intf )
-        else:
-            ip = self.ip
-        return ip
-
-    def __repr__( self ):
-        "More informative string representation"
-        return '<%s %s: %s:%s pid=%s> ' % (
-            self.__class__.__name__, self.name,
-            self.IP(), self.port, self.pid )
-
-
-class OVSController( Controller ):
-    "Open vSwitch controller"
-    def __init__( self, name, command='ovs-controller', **kwargs ):
-        Controller.__init__( self, name, command=command, **kwargs )
-
-
-class NOX( Controller ):
-    "Controller to run a NOX application."
-
-    def __init__( self, name, *noxArgs, **kwargs ):
-        """Init.
-           name: name to give controller
-           noxArgs: arguments (strings) to pass to NOX"""
-        if not noxArgs:
-            warn( 'warning: no NOX modules specified; '
-                  'running packetdump only\n' )
-            noxArgs = [ 'packetdump' ]
-        elif type( noxArgs ) not in ( list, tuple ):
-            noxArgs = [ noxArgs ]
-
-        if 'NOX_CORE_DIR' not in os.environ:
-            exit( 'exiting; please set missing NOX_CORE_DIR env var' )
-        noxCoreDir = os.environ[ 'NOX_CORE_DIR' ]
-
-        Controller.__init__( self, name,
-                             command=noxCoreDir + '/nox_core',
-                             cargs='--libdir=/usr/local/lib -v -i ptcp:%s ' +
-                             ' '.join( noxArgs ),
-                             cdir=noxCoreDir,
-                             **kwargs )
-
-
-class RemoteController( Controller ):
-    "Controller running outside of Mininet's control."
-
-    def __init__( self, name, ip='127.0.0.1',
-                  port=6633, **kwargs):
-        """Init.
-           name: name to give controller
-           ip: the IP address where the remote controller is
-           listening
-           port: the port where the remote controller is listening"""
-        Controller.__init__( self, name, ip=ip, port=port, **kwargs )
-
-    def start( self ):
-        "Overridden to do nothing."
-        return
-
-    def stop( self ):
-        "Overridden to do nothing."
-        return
-
-    def checkListening( self ):
-        "Warn if remote controller is not accessible"
-        listening = self.cmd( "echo A | telnet -e A %s %d" %
-                              ( self.ip, self.port ) )
-        if 'Unable' in listening:
-            warn( "Unable to contact the remote controller"
-                  " at %s:%d\n" % ( self.ip, self.port ) )
diff --git a/mininet/term.py b/mininet/term.py
deleted file mode 100644
index 3cd70f2..0000000
--- a/mininet/term.py
+++ /dev/null
@@ -1,60 +0,0 @@
-"""
-Terminal creation and cleanup.
-Utility functions to run a term (connected via screen(1)) on each host.
-
-Requires GNU screen(1) and xterm(1).
-Optionally uses gnome-terminal.
-"""
-
-import re
-from subprocess import Popen
-
-from mininet.log import error
-from mininet.util import quietRun
-
-def quoteArg( arg ):
-    "Quote an argument if it contains spaces."
-    return repr( arg ) if ' ' in arg else arg
-
-def makeTerm( node, title='Node', term='xterm' ):
-    """Run screen on a node, and hook up a terminal.
-       node: Node object
-       title: base title
-       term: 'xterm' or 'gterm'
-       returns: process created"""
-    title += ': ' + node.name
-    if not node.inNamespace:
-        title += ' (root)'
-    cmds = {
-        'xterm': [ 'xterm', '-title', title, '-e' ],
-        'gterm': [ 'gnome-terminal', '--title', title, '-e' ]
-    }
-    if term not in cmds:
-        error( 'invalid terminal type: %s' % term )
-        return
-    if not node.execed:
-        node.cmd( 'screen -dmS ' + 'mininet.' + node.name)
-        args = [ 'screen', '-D', '-RR', '-S', 'mininet.' + node.name ]
-    else:
-        args = [ 'sh', '-c', 'exec tail -f /tmp/' + node.name + '*.log' ]
-    if term == 'gterm':
-        # Compress these for gnome-terminal, which expects one token
-        # to follow the -e option
-        args = [ ' '.join( [ quoteArg( arg ) for arg in args ] ) ]
-    return Popen( cmds[ term ] + args )
-
-def cleanUpScreens():
-    "Remove moldy old screen sessions."
-    r = r'(\d+\.mininet\.[hsc]\d+)'
-    output = quietRun( 'screen -ls' ).split( '\n' )
-    for line in output:
-        m = re.search( r, line )
-        if m:
-            quietRun( 'screen -S ' + m.group( 1 ) + ' -X quit' )
-
-def makeTerms( nodes, title='Node', term='xterm' ):
-    """Create terminals.
-       nodes: list of Node objects
-       title: base title for each
-       returns: list of created terminal processes"""
-    return [ makeTerm( node, title, term ) for node in nodes ]
diff --git a/mininet/test/test_hifi.py b/mininet/test/test_hifi.py
deleted file mode 100644
index ace7bb5..0000000
--- a/mininet/test/test_hifi.py
+++ /dev/null
@@ -1,127 +0,0 @@
-#!/usr/bin/env python
-
-"""Package: mininet
-   Test creation and pings for topologies with link and/or CPU options."""
-
-import unittest
-
-from mininet.net import Mininet
-from mininet.node import OVSKernelSwitch
-from mininet.node import CPULimitedHost
-from mininet.link import TCLink
-from mininet.topo import Topo
-from mininet.log import setLogLevel
-
-
-SWITCH = OVSKernelSwitch
-# Number of hosts for each test
-N = 2
-
-
-class SingleSwitchOptionsTopo(Topo):
-    "Single switch connected to n hosts."
-    def __init__(self, n=2, hopts=None, lopts=None):
-        if not hopts:
-            hopts = {}
-        if not lopts:
-            lopts = {}
-        Topo.__init__(self, hopts=hopts, lopts=lopts)
-        switch = self.addSwitch('s1')
-        for h in range(n):
-            host = self.addHost('h%s' % (h + 1))
-            self.addLink(host, switch)
-
-
-class testOptionsTopo( unittest.TestCase ):
-    "Verify ability to create networks with host and link options."
-
-    def runOptionsTopoTest( self, n, hopts=None, lopts=None ):
-        "Generic topology-with-options test runner."
-        mn = Mininet( topo=SingleSwitchOptionsTopo( n=n, hopts=hopts,
-                                                    lopts=lopts ),
-                      host=CPULimitedHost, link=TCLink )
-        dropped = mn.run( mn.ping )
-        self.assertEqual( dropped, 0 )
-
-    def assertWithinTolerance(self, measured, expected, tolerance_frac):
-        """Check that a given value is within a tolerance of expected
-        tolerance_frac: less-than-1.0 value; 0.8 would yield 20% tolerance.
-        """
-        self.assertTrue( float(measured) >= float(expected) * tolerance_frac )
-        self.assertTrue( float(measured) >= float(expected) * tolerance_frac )
-
-    def testCPULimits( self ):
-        "Verify topology creation with CPU limits set for both schedulers."
-        CPU_FRACTION = 0.1
-        CPU_TOLERANCE = 0.8  # CPU fraction below which test should fail
-        hopts = { 'cpu': CPU_FRACTION }
-        #self.runOptionsTopoTest( N, hopts=hopts )
-
-        mn = Mininet( SingleSwitchOptionsTopo( n=N, hopts=hopts ),
-                      host=CPULimitedHost )
-        mn.start()
-        results = mn.runCpuLimitTest( cpu=CPU_FRACTION )
-        mn.stop()
-        for cpu in results:
-            self.assertWithinTolerance( cpu, CPU_FRACTION, CPU_TOLERANCE )
-
-    def testLinkBandwidth( self ):
-        "Verify that link bandwidths are accurate within a bound."
-        BW = 5  # Mbps
-        BW_TOLERANCE = 0.8  # BW fraction below which test should fail
-        # Verify ability to create limited-link topo first;
-        lopts = { 'bw': BW, 'use_htb': True }
-        # Also verify correctness of limit limitng within a bound.
-        mn = Mininet( SingleSwitchOptionsTopo( n=N, lopts=lopts ),
-                      link=TCLink )
-        bw_strs = mn.run( mn.iperf )
-        for bw_str in bw_strs:
-            bw = float( bw_str.split(' ')[0] )
-            self.assertWithinTolerance( bw, BW, BW_TOLERANCE )
-
-    def testLinkDelay( self ):
-        "Verify that link delays are accurate within a bound."
-        DELAY_MS = 15
-        DELAY_TOLERANCE = 0.8  # Delay fraction below which test should fail
-        lopts = { 'delay': '%sms' % DELAY_MS, 'use_htb': True }
-        mn = Mininet( SingleSwitchOptionsTopo( n=N, lopts=lopts ),
-                      link=TCLink )
-        ping_delays = mn.run( mn.pingFull )
-        test_outputs = ping_delays[0]
-        # Ignore unused variables below
-        # pylint: disable-msg=W0612
-        node, dest, ping_outputs = test_outputs
-        sent, received, rttmin, rttavg, rttmax, rttdev = ping_outputs
-        self.assertEqual( sent, received )
-        # pylint: enable-msg=W0612
-        for rttval in [rttmin, rttavg, rttmax]:
-            # Multiply delay by 4 to cover there & back on two links
-            self.assertWithinTolerance( rttval, DELAY_MS * 4.0,
-                                        DELAY_TOLERANCE)
-
-    def testLinkLoss( self ):
-        "Verify that we see packet drops with a high configured loss rate."
-        LOSS_PERCENT = 99
-        REPS = 1
-        lopts = { 'loss': LOSS_PERCENT, 'use_htb': True }
-        mn = Mininet( topo=SingleSwitchOptionsTopo( n=N, lopts=lopts ),
-                      host=CPULimitedHost, link=TCLink )
-        # Drops are probabilistic, but the chance of no dropped packets is
-        # 1 in 100 million with 4 hops for a link w/99% loss.
-        dropped_total = 0
-        mn.start()
-        for _ in range(REPS):
-            dropped_total += mn.ping(timeout='1')
-        mn.stop()
-        self.assertTrue(dropped_total > 0)
-
-    def testMostOptions( self ):
-        "Verify topology creation with most link options and CPU limits."
-        lopts = { 'bw': 10, 'delay': '5ms', 'use_htb': True }
-        hopts = { 'cpu': 0.5 / N }
-        self.runOptionsTopoTest( N, hopts=hopts, lopts=lopts )
-
-
-if __name__ == '__main__':
-    setLogLevel( 'warning' )
-    unittest.main()
diff --git a/mininet/test/test_nets.py b/mininet/test/test_nets.py
deleted file mode 100644
index fde8e87..0000000
--- a/mininet/test/test_nets.py
+++ /dev/null
@@ -1,50 +0,0 @@
-#!/usr/bin/env python
-
-"""Package: mininet
-   Test creation and all-pairs ping for each included mininet topo type."""
-
-import unittest
-
-from mininet.net import Mininet
-from mininet.node import Host, Controller
-from mininet.node import UserSwitch, OVSKernelSwitch
-from mininet.topo import SingleSwitchTopo, LinearTopo
-from mininet.log import setLogLevel
-
-SWITCHES = { 'user': UserSwitch,
-             'ovsk': OVSKernelSwitch,
-}
-
-
-class testSingleSwitch( unittest.TestCase ):
-    "For each datapath type, test ping with single switch topologies."
-
-    def testMinimal( self ):
-        "Ping test with both datapaths on minimal topology"
-        for switch in SWITCHES.values():
-            mn = Mininet( SingleSwitchTopo(), switch, Host, Controller )
-            dropped = mn.run( mn.ping )
-            self.assertEqual( dropped, 0 )
-
-    def testSingle5( self ):
-        "Ping test with both datapaths on 5-host single-switch topology"
-        for switch in SWITCHES.values():
-            mn = Mininet( SingleSwitchTopo( k=5 ), switch, Host, Controller )
-            dropped = mn.run( mn.ping )
-            self.assertEqual( dropped, 0 )
-
-
-class testLinear( unittest.TestCase ):
-    "For each datapath type, test all-pairs ping with LinearNet."
-
-    def testLinear5( self ):
-        "Ping test with both datapaths on a 5-switch topology"
-        for switch in SWITCHES.values():
-            mn = Mininet( LinearTopo( k=5 ), switch, Host, Controller )
-            dropped = mn.run( mn.ping )
-            self.assertEqual( dropped, 0 )
-
-
-if __name__ == '__main__':
-    setLogLevel( 'warning' )
-    unittest.main()
diff --git a/mininet/topo.py b/mininet/topo.py
deleted file mode 100644
index bd4afb5..0000000
--- a/mininet/topo.py
+++ /dev/null
@@ -1,237 +0,0 @@
-#!/usr/bin/env python
-'''@package topo
-
-Network topology creation.
-
-@author Brandon Heller (brandonh@stanford.edu)
-
-This package includes code to represent network topologies.
-
-A Topo object can be a topology database for NOX, can represent a physical
-setup for testing, and can even be emulated with the Mininet package.
-'''
-
-# BL: we may have to fix compatibility here.
-# networkx is also a fairly heavyweight dependency
-# from networkx.classes.graph import Graph
-
-from networkx import Graph
-from mininet.util import irange, natural, naturalSeq
-import pdb
-
-class Topo(object):
-    "Data center network representation for structured multi-trees."
-
-    def __init__(self, hopts=None, sopts=None, lopts=None, ropts=None):
-        """Topo object:
-           hinfo: default host options
-           sopts: default switch options
-           lopts: default link options"""
-        self.g = Graph()
-        self.node_info = {}
-        self.link_info = {}  # (src, dst) tuples hash to EdgeInfo objects
-        self.hopts = {} if hopts is None else hopts
-	self.ropts = {} if ropts is None else ropts
-        self.sopts = {} if sopts is None else sopts
-        self.lopts = {} if lopts is None else lopts
-        self.ports = {}  # ports[src][dst] is port on src that connects to dst
-
-    def addNode(self, name, **opts):
-        """Add Node to graph.
-           name: name
-           opts: node options
-           returns: node name"""
-        self.g.add_node(name)
-        self.node_info[name] = opts
-        return name
-
-    def addHost(self, name, **opts):
-        """Convenience method: Add host to graph.
-           name: host name
-           opts: host options
-           returns: host name"""
-	#pdb.set_trace()
-        if not opts:
-	 if self.hopts:
-            opts = self.hopts
-	 elif self.ropts:
-	    opts = self.ropts
-        return self.addNode(name, **opts)
-
-    def addSwitch(self, name, **opts):
-        """Convenience method: Add switch to graph.
-           name: switch name
-           opts: switch options
-           returns: switch name"""
-        if not opts and self.sopts:
-            opts = self.sopts
-        result = self.addNode(name, isSwitch=True, **opts)
-        return result
-
-    def addLink(self, node1, node2, port1=None, port2=None,
-                **opts):
-        """node1, node2: nodes to link together
-           port1, port2: ports (optional)
-           opts: link options (optional)
-           returns: link info key"""
-        if not opts and self.lopts:
-            opts = self.lopts
-        self.addPort(node1, node2, port1, port2)
-        key = tuple(self.sorted([node1, node2]))
-        self.link_info[key] = opts
-        self.g.add_edge(*key)
-        return key
-
-    def addPort(self, src, dst, sport=None, dport=None):
-        '''Generate port mapping for new edge.
-        @param src source switch name
-        @param dst destination switch name
-        '''
-        self.ports.setdefault(src, {})
-        self.ports.setdefault(dst, {})
-        # New port: number of outlinks + base
-        src_base = 1 if self.isSwitch(src) else 0
-        dst_base = 1 if self.isSwitch(dst) else 0
-        if sport is None:
-            sport = len(self.ports[src]) + src_base
-        if dport is None:
-            dport = len(self.ports[dst]) + dst_base
-        self.ports[src][dst] = sport
-        self.ports[dst][src] = dport
-
-    def nodes(self, sort=True):
-        "Return nodes in graph"
-        if sort:
-            return self.sorted( self.g.nodes() )
-        else:
-            return self.g.nodes()
-
-    def isSwitch(self, n):
-        '''Returns true if node is a switch.'''
-	#pdb.set_trace()
-        info = self.node_info[n]
-        return info and info.get('isSwitch', False)
-
-    def switches(self, sort=True):
-        '''Return switches.
-        sort: sort switches alphabetically
-        @return dpids list of dpids
-        '''
-        return [n for n in self.nodes(sort) if self.isSwitch(n)]
-
-    def hosts(self, sort=True):
-        '''Return hosts.
-        sort: sort hosts alphabetically
-        @return dpids list of dpids
-        '''
-        return [n for n in self.nodes(sort) if not self.isSwitch(n)]
-
-    def links(self, sort=True):
-        '''Return links.
-        sort: sort links alphabetically
-        @return links list of name pairs
-        '''
-        if not sort:
-            return self.g.edges()
-        else:
-            links = [tuple(self.sorted(e)) for e in self.g.edges()]
-            return sorted( links, key=naturalSeq )
-
-    def port(self, src, dst):
-        '''Get port number.
-
-        @param src source switch name
-        @param dst destination switch name
-        @return tuple (src_port, dst_port):
-            src_port: port on source switch leading to the destination switch
-            dst_port: port on destination switch leading to the source switch
-        '''
-        if src in self.ports and dst in self.ports[src]:
-            assert dst in self.ports and src in self.ports[dst]
-            return (self.ports[src][dst], self.ports[dst][src])
-
-    def linkInfo( self, src, dst ):
-        "Return link metadata"
-        src, dst = self.sorted([src, dst])
-        return self.link_info[(src, dst)]
-
-    def setlinkInfo( self, src, dst, info ):
-        "Set link metadata"
-        src, dst = self.sorted([src, dst])
-        self.link_info[(src, dst)] = info
-
-    def nodeInfo( self, name ):
-        "Return metadata (dict) for node"
-        info = self.node_info[ name ]
-        return info if info is not None else {}
-
-    def setNodeInfo( self, name, info ):
-        "Set metadata (dict) for node"
-        self.node_info[ name ] = info
-
-    @staticmethod
-    def sorted( items ):
-        "Items sorted in natural (i.e. alphabetical) order"
-        return sorted(items, key=natural)
-
-class SingleSwitchTopo(Topo):
-    '''Single switch connected to k hosts.'''
-
-    def __init__(self, k=2, **opts):
-        '''Init.
-
-        @param k number of hosts
-        @param enable_all enables all nodes and switches?
-        '''
-        super(SingleSwitchTopo, self).__init__(**opts)
-
-        self.k = k
-
-        switch = self.addSwitch('s1')
-        for h in irange(1, k):
-            host = self.addHost('h%s' % h)
-            self.addLink(host, switch)
-
-
-class SingleSwitchReversedTopo(Topo):
-    '''Single switch connected to k hosts, with reversed ports.
-
-    The lowest-numbered host is connected to the highest-numbered port.
-
-    Useful to verify that Mininet properly handles custom port numberings.
-    '''
-    def __init__(self, k=2, **opts):
-        '''Init.
-
-        @param k number of hosts
-        @param enable_all enables all nodes and switches?
-        '''
-        super(SingleSwitchReversedTopo, self).__init__(**opts)
-        self.k = k
-        switch = self.addSwitch('s1')
-        for h in irange(1, k):
-            host = self.addHost('h%s' % h)
-            self.addLink(host, switch,
-                         port1=0, port2=(k - h + 1))
-
-class LinearTopo(Topo):
-    "Linear topology of k switches, with one host per switch."
-
-    def __init__(self, k=2, **opts):
-        """Init.
-           k: number of switches (and hosts)
-           hconf: host configuration options
-           lconf: link configuration options"""
-
-        super(LinearTopo, self).__init__(**opts)
-
-        self.k = k
-
-        lastSwitch = None
-        for i in irange(1, k):
-            host = self.addHost('h%s' % i)
-            switch = self.addSwitch('s%s' % i)
-            self.addLink( host, switch)
-            if lastSwitch:
-                self.addLink( switch, lastSwitch)
-            lastSwitch = switch
diff --git a/mininet/topolib.py b/mininet/topolib.py
deleted file mode 100644
index 63ba36d..0000000
--- a/mininet/topolib.py
+++ /dev/null
@@ -1,36 +0,0 @@
-"Library of potentially useful topologies for Mininet"
-
-from mininet.topo import Topo
-from mininet.net import Mininet
-
-class TreeTopo( Topo ):
-    "Topology for a tree network with a given depth and fanout."
-
-    def __init__( self, depth=1, fanout=2 ):
-        super( TreeTopo, self ).__init__()
-        # Numbering:  h1..N, s1..M
-        self.hostNum = 1
-        self.switchNum = 1
-        # Build topology
-        self.addTree( depth, fanout )
-
-    def addTree( self, depth, fanout ):
-        """Add a subtree starting with node n.
-           returns: last node added"""
-        isSwitch = depth > 0
-        if isSwitch:
-            node = self.addSwitch( 's%s' % self.switchNum )
-            self.switchNum += 1
-            for _ in range( fanout ):
-                child = self.addTree( depth - 1, fanout )
-                self.addLink( node, child )
-        else:
-            node = self.addHost( 'h%s' % self.hostNum )
-            self.hostNum += 1
-        return node
-
-
-def TreeNet( depth=1, fanout=2, **kwargs ):
-    "Convenience function for creating tree networks."
-    topo = TreeTopo( depth, fanout )
-    return Mininet( topo, **kwargs )
diff --git a/mininet/util.py b/mininet/util.py
deleted file mode 100644
index 6a3dc14..0000000
--- a/mininet/util.py
+++ /dev/null
@@ -1,473 +0,0 @@
-"Utility functions for Mininet."
-
-from mininet.log import output, info, error, warn
-
-from time import sleep
-from resource import setrlimit, RLIMIT_NPROC, RLIMIT_NOFILE
-from select import poll, POLLIN
-from subprocess import call, check_call, Popen, PIPE, STDOUT
-import re
-from fcntl import fcntl, F_GETFL, F_SETFL
-from os import O_NONBLOCK
-import os
-
-# Command execution support
-
-def run( cmd ):
-    """Simple interface to subprocess.call()
-       cmd: list of command params"""
-    return call( cmd.split( ' ' ) )
-
-def checkRun( cmd ):
-    """Simple interface to subprocess.check_call()
-       cmd: list of command params"""
-    return check_call( cmd.split( ' ' ) )
-
-# pylint doesn't understand explicit type checking
-# pylint: disable-msg=E1103
-
-def oldQuietRun( *cmd ):
-    """Run a command, routing stderr to stdout, and return the output.
-       cmd: list of command params"""
-    if len( cmd ) == 1:
-        cmd = cmd[ 0 ]
-        if isinstance( cmd, str ):
-            cmd = cmd.split( ' ' )
-    popen = Popen( cmd, stdout=PIPE, stderr=STDOUT )
-    # We can't use Popen.communicate() because it uses
-    # select(), which can't handle
-    # high file descriptor numbers! poll() can, however.
-    out = ''
-    readable = poll()
-    readable.register( popen.stdout )
-    while True:
-        while readable.poll():
-            data = popen.stdout.read( 1024 )
-            if len( data ) == 0:
-                break
-            out += data
-        popen.poll()
-        if popen.returncode is not None:
-            break
-    return out
-
-
-# This is a bit complicated, but it enables us to
-# monitor command output as it is happening
-
-def errRun( *cmd, **kwargs ):
-    """Run a command and return stdout, stderr and return code
-       cmd: string or list of command and args
-       stderr: STDOUT to merge stderr with stdout
-       shell: run command using shell
-       echo: monitor output to console"""
-    # Allow passing in a list or a string
-    if len( cmd ) == 1:
-        cmd = cmd[ 0 ]
-        if isinstance( cmd, str ):
-            cmd = cmd.split( ' ' )
-    cmd = [ str( arg ) for arg in cmd ]
-    # By default we separate stderr, don't run in a shell, and don't echo
-    stderr = kwargs.get( 'stderr', PIPE )
-    shell = kwargs.get( 'shell', False )
-    echo = kwargs.get( 'echo', False )
-    if echo:
-        # cmd goes to stderr, output goes to stdout
-        info( cmd, '\n' )
-    popen = Popen( cmd, stdout=PIPE, stderr=stderr, shell=shell )
-    # We use poll() because select() doesn't work with large fd numbers,
-    # and thus communicate() doesn't work either
-    out, err = '', ''
-    poller = poll()
-    poller.register( popen.stdout, POLLIN )
-    fdtofile = { popen.stdout.fileno(): popen.stdout }
-    outDone, errDone = False, True
-    if popen.stderr:
-        fdtofile[ popen.stderr.fileno() ] = popen.stderr
-        poller.register( popen.stderr, POLLIN )
-        errDone = False
-    while not outDone or not errDone:
-        readable = poller.poll()
-        for fd, _event in readable:
-            f = fdtofile[ fd ]
-            data = f.read( 1024 )
-            if echo:
-                output( data )
-            if f == popen.stdout:
-                out += data
-                if data == '':
-                    outDone = True
-            elif f == popen.stderr:
-                err += data
-                if data == '':
-                    errDone = True
-    returncode = popen.wait()
-    return out, err, returncode
-
-def errFail( *cmd, **kwargs ):
-    "Run a command using errRun and raise exception on nonzero exit"
-    out, err, ret = errRun( *cmd, **kwargs )
-    if ret:
-        raise Exception( "errFail: %s failed with return code %s: %s"
-                         % ( cmd, ret, err ) )
-    return out, err, ret
-
-def quietRun( cmd, **kwargs ):
-    "Run a command and return merged stdout and stderr"
-    return errRun( cmd, stderr=STDOUT, **kwargs )[ 0 ]
-
-# pylint: enable-msg=E1103
-# pylint: disable-msg=E1101
-
-def isShellBuiltin( cmd ):
-    "Return True if cmd is a bash builtin."
-    if isShellBuiltin.builtIns is None:
-        isShellBuiltin.builtIns = quietRun( 'bash -c enable' )
-    space = cmd.find( ' ' )
-    if space > 0:
-        cmd = cmd[ :space]
-    return cmd in isShellBuiltin.builtIns
-
-isShellBuiltin.builtIns = None
-
-# pylint: enable-msg=E1101
-
-# Interface management
-#
-# Interfaces are managed as strings which are simply the
-# interface names, of the form 'nodeN-ethM'.
-#
-# To connect nodes, we create a pair of veth interfaces, and then place them
-# in the pair of nodes that we want to communicate. We then update the node's
-# list of interfaces and connectivity map.
-#
-# For the kernel datapath, switch interfaces
-# live in the root namespace and thus do not have to be
-# explicitly moved.
-
-def makeIntfPair( intf1, intf2 ):
-    """Make a veth pair connecting intf1 and intf2.
-       intf1: string, interface
-       intf2: string, interface
-       returns: success boolean"""
-    # Delete any old interfaces with the same names
-    quietRun( 'ip link del ' + intf1 )
-    quietRun( 'ip link del ' + intf2 )
-    # Create new pair
-    cmd = 'ip link add name ' + intf1 + ' type veth peer name ' + intf2
-    return quietRun( cmd )
-
-def retry( retries, delaySecs, fn, *args, **keywords ):
-    """Try something several times before giving up.
-       n: number of times to retry
-       delaySecs: wait this long between tries
-       fn: function to call
-       args: args to apply to function call"""
-    tries = 0
-    while not fn( *args, **keywords ) and tries < retries:
-        sleep( delaySecs )
-        tries += 1
-    if tries >= retries:
-        error( "*** gave up after %i retries\n" % tries )
-        exit( 1 )
-
-def moveIntfNoRetry( intf, node, printError=False ):
-    """Move interface to node, without retrying.
-       intf: string, interface
-       node: Node object
-       printError: if true, print error"""
-    cmd = 'ip link set ' + intf + ' netns ' + repr( node.pid )
-    quietRun( cmd )
-    links = node.cmd( 'ip link show' )
-    if not ( ' %s:' % intf ) in links:
-        if printError:
-            error( '*** Error: moveIntf: ' + intf +
-                   ' not successfully moved to ' + node.name + '\n' )
-        return False
-    return True
-
-def moveIntf( intf, node, printError=False, retries=3, delaySecs=0.001 ):
-    """Move interface to node, retrying on failure.
-       intf: string, interface
-       node: Node object
-       printError: if true, print error"""
-    retry( retries, delaySecs, moveIntfNoRetry, intf, node, printError )
-
-# Support for dumping network
-
-def dumpNodeConnections( nodes ):
-    "Dump connections to/from nodes."
-
-    def dumpConnections( node ):
-        "Helper function: dump connections to node"
-        for intf in node.intfList():
-            output( ' %s:' % intf )
-            if intf.link:
-                intfs = [ intf.link.intf1, intf.link.intf2 ]
-                intfs.remove( intf )
-                output( intfs[ 0 ] )
-            else:
-                output( ' ' )
-
-    for node in nodes:
-        output( node.name )
-        dumpConnections( node )
-        output( '\n' )
-
-def dumpNetConnections( net ):
-    "Dump connections in network"
-    nodes = net.controllers + net.switches + net.hosts
-    dumpNodeConnections( nodes )
-
-# IP and Mac address formatting and parsing
-
-def _colonHex( val, bytecount ):
-    """Generate colon-hex string.
-       val: input as unsigned int
-       bytecount: number of bytes to convert
-       returns: chStr colon-hex string"""
-    pieces = []
-    for i in range( bytecount - 1, -1, -1 ):
-        piece = ( ( 0xff << ( i * 8 ) ) & val ) >> ( i * 8 )
-        pieces.append( '%02x' % piece )
-    chStr = ':'.join( pieces )
-    return chStr
-
-def macColonHex( mac ):
-    """Generate MAC colon-hex string from unsigned int.
-       mac: MAC address as unsigned int
-       returns: macStr MAC colon-hex string"""
-    return _colonHex( mac, 6 )
-
-def ipStr( ip ):
-    """Generate IP address string from an unsigned int.
-       ip: unsigned int of form w << 24 | x << 16 | y << 8 | z
-       returns: ip address string w.x.y.z, or 10.x.y.z if w==0"""
-    w = ( ip >> 24 ) & 0xff
-    w = 10 if w == 0 else w
-    x = ( ip >> 16 ) & 0xff
-    y = ( ip >> 8 ) & 0xff
-    z = ip & 0xff
-    return "%i.%i.%i.%i" % ( w, x, y, z )
-
-def ipNum( w, x, y, z ):
-    """Generate unsigned int from components of IP address
-       returns: w << 24 | x << 16 | y << 8 | z"""
-    return ( w << 24 ) | ( x << 16 ) | ( y << 8 ) | z
-
-def nextCCNnet(curCCNnet):
-    netNum = ipParse(curCCNnet)
-    return ipStr(netNum+4)
-
-def ipAdd( i, prefixLen=8, ipBaseNum=0x0a000000 ):
-    """Return IP address string from ints
-       i: int to be added to ipbase
-       prefixLen: optional IP prefix length
-       ipBaseNum: option base IP address as int
-       returns IP address as string"""
-    # Ugly but functional
-    assert i < ( 1 << ( 32 - prefixLen ) )
-    mask = 0xffffffff ^ ( ( 1 << prefixLen ) - 1 )
-    ipnum = i + ( ipBaseNum & mask )
-    return ipStr( ipnum )
-
-def ipParse( ip ):
-    "Parse an IP address and return an unsigned int."
-    args = [ int( arg ) for arg in ip.split( '.' ) ]
-    return ipNum( *args )
-
-def netParse( ipstr ):
-    """Parse an IP network specification, returning
-       address and prefix len as unsigned ints"""
-    prefixLen = 0
-    if '/' in ipstr:
-        ip, pf = ipstr.split( '/' )
-        prefixLen = int( pf )
-    return ipParse( ip ), prefixLen
-
-def checkInt( s ):
-    "Check if input string is an int"
-    try:
-        int( s )
-        return True
-    except ValueError:
-        return False
-
-def checkFloat( s ):
-    "Check if input string is a float"
-    try:
-        float( s )
-        return True
-    except ValueError:
-        return False
-
-def makeNumeric( s ):
-    "Convert string to int or float if numeric."
-    if checkInt( s ):
-        return int( s )
-    elif checkFloat( s ):
-        return float( s )
-    else:
-        return s
-
-# Popen support
-
-def pmonitor(popens, timeoutms=500, readline=True,
-             readmax=1024 ):
-    """Monitor dict of hosts to popen objects
-       a line at a time
-       timeoutms: timeout for poll()
-       readline: return single line of output
-       yields: host, line/output (if any)
-       terminates: when all EOFs received"""
-    poller = poll()
-    fdToHost = {}
-    for host, popen in popens.iteritems():
-        fd = popen.stdout.fileno()
-        fdToHost[ fd ] = host
-        poller.register( fd, POLLIN )
-        if not readline:
-            # Use non-blocking reads
-            flags = fcntl( fd, F_GETFL )
-            fcntl( fd, F_SETFL, flags | O_NONBLOCK )
-    while True:
-        fds = poller.poll( timeoutms )
-        if fds:
-            for fd, _event in fds:
-                host = fdToHost[ fd ]
-                popen = popens[ host ]
-                if readline:
-                    # Attempt to read a line of output
-                    # This blocks until we receive a newline!
-                    line = popen.stdout.readline()
-                else:
-                    line = popen.stdout.read( readmax )
-                yield host, line
-                # Check for EOF
-                if not line:
-                    popen.poll()
-                    if popen.returncode is not None:
-                        poller.unregister( fd )
-                        del popens[ host ]
-                        if not popens:
-                            return
-        else:
-            yield None, ''
-
-# Other stuff we use
-
-def fixLimits():
-    "Fix ridiculously small resource limits."
-    setrlimit( RLIMIT_NPROC, ( 8192, 8192 ) )
-    setrlimit( RLIMIT_NOFILE, ( 16384, 16384 ) )
-
-def mountCgroups():
-    "Make sure cgroups file system is mounted"
-    mounts = quietRun( 'mount' )
-    cgdir = '/sys/fs/cgroup'
-    csdir = cgdir + '/cpuset'
-    if ('cgroup on %s' % cgdir not in mounts and
-            'cgroups on %s' % cgdir not in mounts):
-        raise Exception( "cgroups not mounted on " + cgdir )
-    if 'cpuset on %s' % csdir not in mounts:
-        errRun( 'mkdir -p ' + csdir )
-        errRun( 'mount -t cgroup -ocpuset cpuset ' + csdir )
-
-def natural( text ):
-    "To sort sanely/alphabetically: sorted( l, key=natural )"
-    def num( s ):
-        "Convert text segment to int if necessary"
-        return int( s ) if s.isdigit() else s
-    return [  num( s ) for s in re.split( r'(\d+)', text ) ]
-
-def naturalSeq( t ):
-    "Natural sort key function for sequences"
-    return [ natural( x ) for x in t ]
-
-def numCores():
-    "Returns number of CPU cores based on /proc/cpuinfo"
-    if hasattr( numCores, 'ncores' ):
-        return numCores.ncores
-    try:
-        numCores.ncores = int( quietRun('grep -c processor /proc/cpuinfo') )
-    except ValueError:
-        return 0
-    return numCores.ncores
-
-def irange(start, end):
-    """Inclusive range from start to end (vs. Python insanity.)
-       irange(1,5) -> 1, 2, 3, 4, 5"""
-    return range( start, end + 1 )
-
-def custom( cls, **params ):
-    "Returns customized constructor for class cls."
-    # Note: we may wish to see if we can use functools.partial() here
-    # and in customConstructor
-    def customized( *args, **kwargs):
-        "Customized constructor"
-        kwargs = kwargs.copy()
-        kwargs.update( params )
-        return cls( *args, **kwargs )
-    customized.__name__ = 'custom(%s,%s)' % ( cls, params )
-    return customized
-
-def splitArgs( argstr ):
-    """Split argument string into usable python arguments
-       argstr: argument string with format fn,arg2,kw1=arg3...
-       returns: fn, args, kwargs"""
-    split = argstr.split( ',' )
-    fn = split[ 0 ]
-    params = split[ 1: ]
-    # Convert int and float args; removes the need for function
-    # to be flexible with input arg formats.
-    args = [ makeNumeric( s ) for s in params if '=' not in s ]
-    kwargs = {}
-    for s in [ p for p in params if '=' in p ]:
-        key, val = s.split( '=' )
-        kwargs[ key ] = makeNumeric( val )
-    return fn, args, kwargs
-
-def customConstructor( constructors, argStr ):
-    """Return custom constructor based on argStr
-    The args and key/val pairs in argsStr will be automatically applied
-    when the generated constructor is later used.
-    """
-    cname, newargs, kwargs = splitArgs( argStr )
-    constructor = constructors.get( cname, None )
-
-    if not constructor:
-        raise Exception( "error: %s is unknown - please specify one of %s" %
-                         ( cname, constructors.keys() ) )
-
-    def customized( name, *args, **params ):
-        "Customized constructor, useful for Node, Link, and other classes"
-        params = params.copy()
-        params.update( kwargs )
-        if not newargs:
-            return constructor( name, *args, **params )
-        if args:
-            warn( 'warning: %s replacing %s with %s\n' % (
-                  constructor, args, newargs ) )
-        return constructor( name, *newargs, **params )
-
-    customized.__name__ = 'customConstructor(%s)' % argStr
-    return customized
-
-def buildTopo( topos, topoStr ):
-    """Create topology from string with format (object, arg1, arg2,...).
-    input topos is a dict of topo names to constructors, possibly w/args.
-    """
-    topo, args, kwargs = splitArgs( topoStr )
-    if topo not in topos:
-        raise Exception( 'Invalid topo name %s' % topo )
-    return topos[ topo ]( *args, **kwargs )
-
-def ensureRoot():
-    """Ensure that we are running as root.
-
-    Probably we should only sudo when needed as per Big Switch's patch.
-    """
-    if os.getuid() != 0:
-        print "*** Mininet must run as root."
-        exit( 1 )
-    return
diff --git a/mnexec.c b/mnexec.c
deleted file mode 100644
index 42a9cf6..0000000
--- a/mnexec.c
+++ /dev/null
@@ -1,179 +0,0 @@
-/* mnexec: execution utility for mininet
- *
- * Starts up programs and does things that are slow or
- * difficult in Python, including:
- *
- *  - closing all file descriptors except stdin/out/error
- *  - detaching from a controlling tty using setsid
- *  - running in a network namespace
- *  - printing out the pid of a process so we can identify it later
- *  - attaching to a namespace and cgroup
- *  - setting RT scheduling
- *
- * Partially based on public domain setsid(1)
-*/
-
-#include <stdio.h>
-#include <linux/sched.h>
-#include <unistd.h>
-#include <limits.h>
-#include <syscall.h>
-#include <fcntl.h>
-#include <stdlib.h>
-#include <limits.h>
-#include <sched.h>
-
-#if !defined(VERSION)
-#define VERSION "(devel)"
-#endif
-
-void usage(char *name) 
-{
-    printf("Execution utility for Mininet\n\n"
-           "Usage: %s [-cdnp] [-a pid] [-g group] [-r rtprio] cmd args...\n\n"
-           "Options:\n"
-           "  -c: close all file descriptors except stdin/out/error\n"
-           "  -d: detach from tty by calling setsid()\n"
-           "  -n: run in new network namespace\n"
-           "  -p: print ^A + pid\n"
-           "  -a pid: attach to pid's network namespace\n"
-           "  -g group: add to cgroup\n"
-           "  -r rtprio: run with SCHED_RR (usually requires -g)\n"
-           "  -v: print version\n",
-           name);
-}
-
-
-int setns(int fd, int nstype)
-{
-	return syscall(308, fd, nstype);
-}
-
-/* Validate alphanumeric path foo1/bar2/baz */
-void validate(char *path)
-{
-    char *s;
-    for (s=path; *s; s++) {
-        if (!isalnum(*s) && *s != '/') {
-            fprintf(stderr, "invalid path: %s\n", path);
-            exit(1);
-        }
-    }
-}
-
-/* Add our pid to cgroup */
-int cgroup(char *gname)
-{
-    static char path[PATH_MAX];
-    static char *groups[] = {
-        "cpu", "cpuacct", "cpuset", NULL
-    };
-    char **gptr;
-    pid_t pid = getpid();
-    int count = 0;
-    validate(gname);
-    for (gptr = groups; *gptr; gptr++) {
-        FILE *f;
-        snprintf(path, PATH_MAX, "/sys/fs/cgroup/%s/%s/tasks",
-                 *gptr, gname);
-        f = fopen(path, "w");
-        if (f) {
-            count++;
-            fprintf(f, "%d\n", pid);
-            fclose(f);
-        }
-    }
-    if (!count) {
-        fprintf(stderr, "cgroup: could not add to cgroup %s\n",
-            gname);
-        exit(1);
-    }
-}
-
-int main(int argc, char *argv[])
-{
-    char c;
-    int fd;
-    char path[PATH_MAX];
-    int nsid;
-    int pid;
-    static struct sched_param sp;
-    while ((c = getopt(argc, argv, "+cdnpa:g:r:vh")) != -1)
-        switch(c) {
-        case 'c':
-            /* close file descriptors except stdin/out/error */
-            for (fd = getdtablesize(); fd > 2; fd--)
-                close(fd);
-            break;
-        case 'd':
-            /* detach from tty */
-            if (getpgrp() == getpid()) {
-                switch(fork()) {
-                    case -1:
-                        perror("fork");
-                        return 1;
-                    case 0:		/* child */
-                        break;
-                    default:	/* parent */
-                        return 0;
-                }
-            }
-            setsid();
-            break;
-        case 'n':
-            /* run in network namespace */
-            if (unshare(CLONE_NEWNET) == -1) {
-                perror("unshare");
-                return 1;
-            }
-            break;
-        case 'p':
-            /* print pid */
-            printf("\001%d\n", getpid());
-            fflush(stdout);
-            break;
-        case 'a':
-            /* Attach to pid's network namespace */
-            pid = atoi(optarg);
-            sprintf(path, "/proc/%d/ns/net", pid );
-            nsid = open(path, O_RDONLY);
-            if (nsid < 0) {
-                perror(path);
-                return 1;
-            }
-            if (setns(nsid, 0) != 0) {
-                perror("setns");
-                return 1;
-            }
-            break;
-        case 'g':
-            /* Attach to cgroup */
-            cgroup(optarg);
-            break;
-        case 'r':
-            /* Set RT scheduling priority */
-            sp.sched_priority = atoi(optarg);
-            if (sched_setscheduler(getpid(), SCHED_RR, &sp) < 0) {
-                perror("sched_setscheduler");
-                return 1;
-            }
-            break;
-        case 'v':
-            printf("%s\n", VERSION);
-            exit(0);
-        case 'h':
-            usage(argv[0]);
-            exit(0);
-        default:
-            usage(argv[0]);
-            exit(1); 
-        }
-
-    if (optind < argc) {
-        execvp(argv[optind], &argv[optind]);
-        perror(argv[optind]);
-        return 1;
-    }
-    
-    usage(argv[0]);
-}
diff --git a/mininet/conf_parser.py b/ndn/conf_parser.py
similarity index 100%
rename from mininet/conf_parser.py
rename to ndn/conf_parser.py
diff --git a/ndn/nfd.py b/ndn/nfd.py
index b33fc37..6fea538 100644
--- a/ndn/nfd.py
+++ b/ndn/nfd.py
@@ -21,8 +21,8 @@
         self.ndnFolder = "%s/.ndn" % self.homeFolder
         self.clientConf = "%s/client.conf" % self.ndnFolder
 
-        # Copy nfd.conf file from mini-ndn/ndn_utils to the node's home
-        node.cmd("sudo cp ~/mini-ndn/ndn_utils/nfd.conf %s" % self.confFile)
+        # Copy nfd.conf file from /usr/local/etc/mini-ndn to the node's home
+        node.cmd("sudo cp /usr/local/etc/mini-ndn/nfd.conf %s" % self.confFile)
 
         # Open the conf file and change socket file name
         node.cmd("sudo sed -i 's|nfd.sock|%s.sock|g' %s" % (node.name, self.confFile))
@@ -31,7 +31,7 @@
         node.cmd("sudo mkdir %s" % self.ndnFolder)
 
         # Copy the client.conf file and change the unix socket
-        node.cmd("sudo cp ~/mini-ndn/ndn_utils/client.conf.sample %s" % self.clientConf)
+        node.cmd("sudo cp /usr/local/etc/mini-ndn/client.conf.sample %s" % self.clientConf)
         node.cmd("sudo sed -i 's|nfd.sock|%s.sock|g' %s" % (node.name, self.clientConf))
 
         # Change home folder
diff --git a/ndn/nlsr.py b/ndn/nlsr.py
index cda91ea..d376531 100644
--- a/ndn/nlsr.py
+++ b/ndn/nlsr.py
@@ -42,8 +42,8 @@
     ROUTING_LINK_STATE = "ls"
     ROUTING_HYPERBOLIC = "hr"
 
-    def __init__(self, node, home):
-        node.cmd("sudo cp %s/mini-ndn/ndn_utils/nlsr.conf nlsr.conf" % home)
+    def __init__(self, node):
+        node.cmd("sudo cp /usr/local/etc/mini-ndn/nlsr.conf nlsr.conf")
         self.node = node
 
         parameters = node.nlsrParameters
diff --git a/setup.py b/setup.py
index 19bfd83..ec8f76a 100644
--- a/setup.py
+++ b/setup.py
@@ -1,46 +1,9 @@
 #!/usr/bin/env python
 
-"Setuptools params"
-
 from setuptools import setup, find_packages
-from os.path import join
-
-# Get version number from source tree
-import sys
-sys.path.append( '.' )
-from mininet.net import VERSION
-
-scripts = [ join( 'bin', filename ) for filename in [ 'mn', 'minindn', 'minindnedit' ] ]
-
-modname = distname = 'mininet'
 
 setup(
-    name=distname,
-    version=VERSION,
-    description='Process-based OpenFlow emulator with NDN extension',
-    author='Bob Lantz, Carlos Cabral',
-    author_email='rlantz@cs.stanford.edu, cabral@dca.fee.unicamp.br',
-    packages=find_packages(exclude='test'),
-    long_description="""
-        Mininet is a network emulator which uses lightweight
-        virtualization to create virtual networks for rapid
-        prototyping of Software-Defined Network (SDN) designs
-        using OpenFlow. http://openflow.org/mininet.
-        This also includes an extension for using Content Centric
-        Networks based on the Named Data Networking (NDN) model.
-        """,
-    classifiers=[
-          "License :: OSI Approved :: BSD License",
-          "Programming Language :: Python",
-          "Development Status :: 2 - Pre-Alpha",
-          "Intended Audience :: Developers",
-          "Topic :: Internet",
-    ],
-    keywords='networking emulator protocol Internet OpenFlow SDN NDN NFD NLSR',
-    license='BSD',
-    install_requires=[
-        'setuptools',
-        'networkx'
-    ],
-    scripts=scripts,
+    name = "Mini-NDN",
+    packages = find_packages(),
+    scripts = ['bin/minindn', 'bin/minindnedit'],
 )
diff --git a/util/build-ovs-packages.sh b/util/build-ovs-packages.sh
deleted file mode 100644
index 6a14659..0000000
--- a/util/build-ovs-packages.sh
+++ /dev/null
@@ -1,94 +0,0 @@
-#!/bin/bash
-
-# Attempt to build debian packages for OVS
-
-set -e  # exit on error
-set -u  # exit on undefined variable
-
-kvers=`uname -r`
-ksrc=/lib/modules/$kvers/build
-dist=`lsb_release -is | tr [A-Z] [a-z]`
-release=`lsb_release -rs`
-arch=`uname -m`
-buildsuffix=-2
-if [ "$arch" = "i686" ]; then arch=i386; fi
-if [ "$arch" = "x86_64" ]; then arch=amd64; fi
-
-overs=1.4.0
-ovs=openvswitch-$overs
-ovstgz=$ovs.tar.gz
-ovsurl=http://openvswitch.org/releases/$ovstgz
-
-install='sudo apt-get install -y'
-
-echo "*** Installing debian/ubuntu build system"
- $install build-essential devscripts ubuntu-dev-tools debhelper dh-make
- $install diff patch cdbs quilt gnupg fakeroot lintian pbuilder piuparts
- $install module-assistant
-
-echo "*** Installing OVS dependencies"
- $install pkg-config gcc make python-dev libssl-dev libtool
- $install dkms ipsec-tools
-
-echo "*** Installing headers for $kvers"
- $install linux-headers-$kvers
-
-echo "*** Retrieving OVS source"
- wget -c $ovsurl
- tar xzf $ovstgz
- cd $ovs
-
-echo "*** Patching OVS source"
- # Not sure why this fails, but off it goes!
- sed -i -e 's/dh_strip/# dh_strip/' debian/rules
- if [ "$release" = "10.04" ]; then
-  # Lucid doesn't seem to have all the packages for ovsdbmonitor
-  echo "*** Patching debian/rules to remove dh_python2"
-  sed -i -e 's/dh_python2/dh_pysupport/' debian/rules
-  echo "*** Not building ovsdbmonitor since it's too hard on 10.04"
-  mv debian/ovsdbmonitor.install debian/ovsdbmonitor.install.backup
-  sed -i -e 's/ovsdbmonitor.install/ovsdbmonitor.install.backup/' Makefile.in
- else
-  # Install a bag of hurt for ovsdbmonitor
-  $install python-pyside.qtcore pyqt4-dev-tools python-twisted python-twisted-bin \
-   python-twisted-core python-twisted-conch python-anyjson python-zope.interface
- fi
- # init script was written to assume that commands complete
- sed -i -e 's/^set -e/#set -e/' debian/openvswitch-controller.init
-
-echo "*** Building OVS user packages"
- opts=--with-linux=/lib/modules/`uname -r`/build
- fakeroot make -f debian/rules DATAPATH_CONFIGURE_OPTS=$opts binary
-
-echo "*** Building OVS datapath kernel module package"
- # Still looking for the "right" way to do this...
- sudo mkdir -p /usr/src/linux
- ln -sf _debian/openvswitch.tar.gz .
- sudo make -f debian/rules.modules KSRC=$ksrc KVERS=$kvers binary-modules
-
-echo "*** Built the following packages:"
- cd ~
- ls -l *deb
-
-archive=ovs-$overs-core-$dist-$release-$arch$buildsuffix.tar
-ovsbase='common pki switch brcompat controller datapath-dkms'
-echo "*** Packing up $ovsbase .debs into:"
-echo "    $archive"
- pkgs=""
- for component in $ovsbase; do
-  if echo $component | egrep 'dkms|pki'; then
-    # Architecture-independent packages
-    deb=(openvswitch-${component}_$overs*all.deb)
-  else
-    deb=(openvswitch-${component}_$overs*$arch.deb)
-  fi
-  pkgs="$pkgs $deb"
- done
- rm -rf $archive
- tar cf $archive $pkgs
-
-echo "*** Contents of archive $archive:"
- tar tf $archive
-
-echo "*** Done (hopefully)"
-
diff --git a/util/colorfilters b/util/colorfilters
deleted file mode 100644
index 745fe21..0000000
--- a/util/colorfilters
+++ /dev/null
@@ -1,21 +0,0 @@
-# DO NOT EDIT THIS FILE!  It was created by Wireshark
-@Bad TCP@tcp.analysis.flags@[0,0,0][65535,24383,24383]
-@HSRP State Change@hsrp.state != 8 && hsrp.state != 16@[0,0,0][65535,63222,0]
-@Spanning Tree Topology  Change@stp.type == 0x80@[0,0,0][65535,63222,0]
-@OSPF State Change@ospf.msg != 1@[0,0,0][65535,63222,0]
-@ICMP errors@icmp.type eq 3 || icmp.type eq 4 || icmp.type eq 5 || icmp.type eq 11@[0,0,0][0,65535,3616]
-@ARP@arp@[55011,59486,65534][0,0,0]
-@ICMP@icmp@[49680,49737,65535][0,0,0]
-@TCP RST@tcp.flags.reset eq 1@[37008,0,0][65535,63121,32911]
-@TTL low or unexpected@( ! ip.dst == 224.0.0.0/4 && ip.ttl < 5) || (ip.dst == 224.0.0.0/24 && ip.ttl != 1)@[37008,0,0][65535,65535,65535]
-@of@of@[0,5,65535][65535,65535,65535]
-@Checksum Errors@cdp.checksum_bad==1 || edp.checksum_bad==1 || ip.checksum_bad==1 || tcp.checksum_bad==1 || udp.checksum_bad==1@[0,0,0][65535,24383,24383]
-@SMB@smb || nbss || nbns || nbipx || ipxsap || netbios@[65534,64008,39339][0,0,0]
-@HTTP@http || tcp.port == 80@[36107,65535,32590][0,0,0]
-@IPX@ipx || spx@[65534,58325,58808][0,0,0]
-@DCERPC@dcerpc@[51199,38706,65533][0,0,0]
-@Routing@hsrp || eigrp || ospf || bgp || cdp || vrrp || gvrp || igmp || ismp@[65534,62325,54808][0,0,0]
-@TCP SYN/FIN@tcp.flags & 0x02 || tcp.flags.fin == 1@[41026,41026,41026][0,0,0]
-@TCP@tcp@[59345,58980,65534][0,0,0]
-@UDP@udp@[28834,57427,65533][0,0,0]
-@Broadcast@eth[0] & 1@[65535,65535,65535][32768,32768,32768]
diff --git a/util/doxify.py b/util/doxify.py
deleted file mode 100644
index f9f60ad..0000000
--- a/util/doxify.py
+++ /dev/null
@@ -1,89 +0,0 @@
-#!/usr/bin/python
-
-"""
-Convert simple documentation to epydoc/pydoctor-compatible markup
-"""
-
-from sys import stdin, stdout, argv
-import os
-from tempfile import mkstemp
-from subprocess import call
-
-import re
-
-spaces = re.compile( r'\s+' )
-singleLineExp = re.compile( r'\s+"([^"]+)"' )
-commentStartExp = re.compile( r'\s+"""' )
-commentEndExp = re.compile( r'"""$' )
-returnExp = re.compile( r'\s+(returns:.*)' )
-lastindent = ''
-
-
-comment = False
-
-def fixParam( line ):
-    "Change foo: bar to @foo bar"
-    result = re.sub( r'(\w+):', r'@param \1', line )
-    result = re.sub( r'   @', r'@', result)
-    return result
-
-def fixReturns( line ):
-    "Change returns: foo to @return foo"
-    return re.sub( 'returns:', r'@returns', line )
-    
-def fixLine( line ):
-    global comment
-    match = spaces.match( line )
-    if not match:
-        return line
-    else:
-        indent = match.group(0)
-    if singleLineExp.match( line ):
-        return re.sub( '"', '"""', line )
-    if commentStartExp.match( line ):
-        comment = True
-    if comment:
-        line = fixReturns( line )
-        line = fixParam( line )
-    if commentEndExp.search( line ):
-        comment = False
-    return line
-
-
-def test():
-    "Test transformations"
-    assert fixLine(' "foo"') == ' """foo"""'
-    assert fixParam( 'foo: bar' ) == '@param foo bar'
-    assert commentStartExp.match( '   """foo"""')
-
-def funTest():
-    testFun = (
-    'def foo():\n'
-    '   "Single line comment"\n'
-    '   """This is a test"""\n'
-    '      bar: int\n'
-    '      baz: string\n'
-    '      returns: junk"""\n'
-    '   if True:\n'
-    '       print "OK"\n'
-    ).splitlines( True )
-
-    fixLines( testFun )
-    
-def fixLines( lines, fid ):
-    for line in lines:
-        os.write( fid, fixLine( line ) )
-
-if __name__ == '__main__':
-    if False:
-        funTest()
-    infile = open( argv[1] )
-    outfid, outname = mkstemp()
-    fixLines( infile.readlines(), outfid )
-    infile.close()
-    os.close( outfid )
-    call( [ 'doxypy', outname ] )
-
-
-
-    
diff --git a/util/install.sh b/util/install.sh
deleted file mode 100755
index c16883d..0000000
--- a/util/install.sh
+++ /dev/null
@@ -1,562 +0,0 @@
-#!/usr/bin/env bash
-
-# Mininet install script for Ubuntu (and Debian Lenny)
-# Brandon Heller (brandonh@stanford.edu)
-
-# Fail on error
-set -e
-
-# Fail on unset var usage
-set -o nounset
-
-# Location of CONFIG_NET_NS-enabled kernel(s)
-KERNEL_LOC=http://www.openflow.org/downloads/mininet
-
-# Attempt to identify Linux release
-
-DIST=Unknown
-RELEASE=Unknown
-CODENAME=Unknown
-ARCH=`uname -m`
-if [ "$ARCH" = "x86_64" ]; then ARCH="amd64"; fi
-if [ "$ARCH" = "i686" ]; then ARCH="i386"; fi
-
-test -e /etc/debian_version && DIST="Debian"
-grep Ubuntu /etc/lsb-release &> /dev/null && DIST="Ubuntu"
-if [ "$DIST" = "Ubuntu" ] || [ "$DIST" = "Debian" ]; then
-    install='sudo apt-get -y install'
-    remove='sudo apt-get -y remove'
-    pkginst='sudo dpkg -i'
-    # Prereqs for this script
-    if ! which lsb_release &> /dev/null; then
-        $install lsb-release
-    fi
-    if ! which bc &> /dev/null; then
-        $install bc
-    fi
-fi
-if which lsb_release &> /dev/null; then
-    DIST=`lsb_release -is`
-    RELEASE=`lsb_release -rs`
-    CODENAME=`lsb_release -cs`
-fi
-echo "Detected Linux distribution: $DIST $RELEASE $CODENAME $ARCH"
-
-# Kernel params
-
-if [ "$DIST" = "Ubuntu" ]; then
-    if [ "$RELEASE" = "10.04" ]; then
-        KERNEL_NAME='3.0.0-15-generic'
-    else
-        KERNEL_NAME=`uname -r`
-    fi
-    KERNEL_HEADERS=linux-headers-${KERNEL_NAME}
-elif [ "$DIST" = "Debian" ] && [ "$ARCH" = "i386" ] && [ "$CODENAME" = "lenny" ]; then
-    KERNEL_NAME=2.6.33.1-mininet
-    KERNEL_HEADERS=linux-headers-${KERNEL_NAME}_${KERNEL_NAME}-10.00.Custom_i386.deb
-    KERNEL_IMAGE=linux-image-${KERNEL_NAME}_${KERNEL_NAME}-10.00.Custom_i386.deb
-else
-    echo "Install.sh currently only supports Ubuntu and Debian Lenny i386."
-    exit 1
-fi
-
-# More distribution info
-DIST_LC=`echo $DIST | tr [A-Z] [a-z]` # as lower case
-
-# Kernel Deb pkg to be removed:
-KERNEL_IMAGE_OLD=linux-image-2.6.26-33-generic
-
-DRIVERS_DIR=/lib/modules/${KERNEL_NAME}/kernel/drivers/net
-
-OVS_RELEASE=1.4.0
-OVS_PACKAGE_LOC=https://github.com/downloads/mininet/mininet
-OVS_BUILDSUFFIX=-ignore # was -2
-OVS_PACKAGE_NAME=ovs-$OVS_RELEASE-core-$DIST_LC-$RELEASE-$ARCH$OVS_BUILDSUFFIX.tar
-OVS_SRC=~/openvswitch
-OVS_TAG=v$OVS_RELEASE
-OVS_BUILD=$OVS_SRC/build-$KERNEL_NAME
-OVS_KMODS=($OVS_BUILD/datapath/linux/{openvswitch_mod.ko,brcompat_mod.ko})
-
-function kernel {
-    echo "Install Mininet-compatible kernel if necessary"
-    sudo apt-get update
-    if [ "$DIST" = "Ubuntu" ] &&  [ "$RELEASE" = "10.04" ]; then
-        $install linux-image-$KERNEL_NAME
-    elif [ "$DIST" = "Debian" ]; then
-        # The easy approach: download pre-built linux-image and linux-headers packages:
-        wget -c $KERNEL_LOC/$KERNEL_HEADERS
-        wget -c $KERNEL_LOC/$KERNEL_IMAGE
-
-        # Install custom linux headers and image:
-        $pkginst $KERNEL_IMAGE $KERNEL_HEADERS
-
-        # The next two steps are to work around a bug in newer versions of
-        # kernel-package, which fails to add initrd images with the latest kernels.
-        # See http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=525032
-        # Generate initrd image if the .deb didn't install it:
-        if ! test -e /boot/initrd.img-${KERNEL_NAME}; then
-            sudo update-initramfs -c -k ${KERNEL_NAME}
-        fi
-
-        # Ensure /boot/grub/menu.lst boots with initrd image:
-        sudo update-grub
-
-        # The default should be the new kernel. Otherwise, you may need to modify
-        # /boot/grub/menu.lst to set the default to the entry corresponding to the
-        # kernel you just installed.
-    fi
-}
-
-function kernel_clean {
-    echo "Cleaning kernel..."
-
-    # To save disk space, remove previous kernel
-    if ! $remove $KERNEL_IMAGE_OLD; then
-        echo $KERNEL_IMAGE_OLD not installed.
-    fi
-
-    # Also remove downloaded packages:
-    rm -f ~/linux-headers-* ~/linux-image-*
-}
-
-# Install Mininet deps
-function mn_deps {
-    echo "Installing Mininet dependencies"
-    $install gcc make screen psmisc xterm ssh iperf iproute telnet \
-        python-setuptools python-networkx cgroup-bin ethtool help2man \
-        pyflakes pylint pep8
-
-    if [ "$DIST" = "Ubuntu" ] && [ "$RELEASE" = "10.04" ]; then
-        echo "Upgrading networkx to avoid deprecation warning"
-        sudo easy_install --upgrade networkx
-    fi
-
-    # Add sysctl parameters as noted in the INSTALL file to increase kernel
-    # limits to support larger setups:
-    sudo su -c "cat $HOME/mini-ndn/util/sysctl_addon >> /etc/sysctl.conf"
-
-    # Load new sysctl settings:
-    sudo sysctl -p
-
-    echo "Installing Mininet/Mini-CCNx core"
-    pushd ~/mini-ndn
-    sudo make install
-    popd
-}
-
-# The following will cause a full OF install, covering:
-# -user switch
-# The instructions below are an abbreviated version from
-# http://www.openflowswitch.org/wk/index.php/Debian_Install
-# ... modified to use Debian Lenny rather than unstable.
-function of {
-    echo "Installing OpenFlow reference implementation..."
-    cd ~/
-    $install git-core autoconf automake autotools-dev pkg-config \
-		make gcc libtool libc6-dev
-    git clone git://openflowswitch.org/openflow.git
-    cd ~/openflow
-
-    # Patch controller to handle more than 16 switches
-    patch -p1 < ~/mini-ndn/util/openflow-patches/controller.patch
-
-    # Resume the install:
-    ./boot.sh
-    ./configure
-    make
-    sudo make install
-
-    # Remove avahi-daemon, which may cause unwanted discovery packets to be
-    # sent during tests, near link status changes:
-    $remove avahi-daemon
-
-    # Disable IPv6.  Add to /etc/modprobe.d/blacklist:
-    if [ "$DIST" = "Ubuntu" ]; then
-        BLACKLIST=/etc/modprobe.d/blacklist.conf
-    else
-        BLACKLIST=/etc/modprobe.d/blacklist
-    fi
-    sudo sh -c "echo 'blacklist net-pf-10\nblacklist ipv6' >> $BLACKLIST"
-    cd ~
-}
-
-function wireshark {
-    echo "Installing Wireshark dissector..."
-
-    sudo apt-get install -y wireshark libgtk2.0-dev
-
-    if [ "$DIST" = "Ubuntu" ] && [ "$RELEASE" != "10.04" ]; then
-        # Install newer version
-        sudo apt-get install -y scons mercurial libglib2.0-dev
-        sudo apt-get install -y libwiretap-dev libwireshark-dev
-        cd ~
-        hg clone https://bitbucket.org/barnstorm/of-dissector
-        cd of-dissector/src
-        export WIRESHARK=/usr/include/wireshark
-        scons
-        # libwireshark0/ on 11.04; libwireshark1/ on later
-        WSDIR=`ls -d /usr/lib/wireshark/libwireshark* | head -1`
-        WSPLUGDIR=$WSDIR/plugins/
-        sudo cp openflow.so $WSPLUGDIR
-        echo "Copied openflow plugin to $WSPLUGDIR"
-    else
-        # Install older version from reference source
-        cd ~/openflow/utilities/wireshark_dissectors/openflow
-        make
-        sudo make install
-    fi
-
-    # Copy coloring rules: OF is white-on-blue:
-    mkdir -p ~/.wireshark
-    cp ~/mini-ndn/util/colorfilters ~/.wireshark
-}
-
-
-# Install Open vSwitch
-# Instructions derived from OVS INSTALL, INSTALL.OpenFlow and README files.
-
-function ovs {
-    echo "Installing Open vSwitch..."
-
-    # Required for module build/dkms install
-    $install $KERNEL_HEADERS
-
-    ovspresent=0
-
-    # First see if we have packages
-    # XXX wget -c seems to fail from github/amazon s3
-    cd /tmp
-    if wget $OVS_PACKAGE_LOC/$OVS_PACKAGE_NAME 2> /dev/null; then
-	$install patch dkms fakeroot python-argparse
-        tar xf $OVS_PACKAGE_NAME
-        orig=`tar tf $OVS_PACKAGE_NAME`
-        # Now install packages in reasonable dependency order
-        order='dkms common pki openvswitch-switch brcompat controller'
-        pkgs=""
-        for p in $order; do
-            pkg=`echo "$orig" | grep $p`
-	    # Annoyingly, things seem to be missing without this flag
-            $pkginst --force-confmiss $pkg
-        done
-        ovspresent=1
-    fi
-
-    # Otherwise try distribution's OVS packages
-    if [ "$DIST" = "Ubuntu" ] && [ `expr $RELEASE '>=' 11.10` = 1 ]; then
-        if ! dpkg --get-selections | grep openvswitch-datapath; then
-            # If you've already installed a datapath, assume you
-            # know what you're doing and don't need dkms datapath.
-            # Otherwise, install it.
-            $install openvswitch-datapath-dkms
-        fi
-	if $install openvswitch-switch openvswitch-controller; then
-            echo "Ignoring error installing openvswitch-controller"
-        fi
-        ovspresent=1
-    fi
-
-    # Switch can run on its own, but
-    # Mininet should control the controller
-    if [ -e /etc/init.d/openvswitch-controller ]; then
-        if sudo service openvswitch-controller stop; then
-            echo "Stopped running controller"
-        fi
-        sudo update-rc.d openvswitch-controller disable
-    fi
-
-    if [ $ovspresent = 1 ]; then
-        echo "Done (hopefully) installing packages"
-        cd ~
-        return
-    fi
-
-    # Otherwise attempt to install from source
-
-    $install pkg-config gcc make python-dev libssl-dev libtool
-
-    if [ "$DIST" = "Debian" ]; then
-        if [ "$CODENAME" = "lenny" ]; then
-            $install git-core
-            # Install Autoconf 2.63+ backport from Debian Backports repo:
-            # Instructions from http://backports.org/dokuwiki/doku.php?id=instructions
-            sudo su -c "echo 'deb http://www.backports.org/debian lenny-backports main contrib non-free' >> /etc/apt/sources.list"
-            sudo apt-get update
-            sudo apt-get -y --force-yes install debian-backports-keyring
-            sudo apt-get -y --force-yes -t lenny-backports install autoconf
-        fi
-    else
-        $install git
-    fi
-
-    # Install OVS from release
-    cd ~/
-    git clone git://openvswitch.org/openvswitch $OVS_SRC
-    cd $OVS_SRC
-    git checkout $OVS_TAG
-    ./boot.sh
-    BUILDDIR=/lib/modules/${KERNEL_NAME}/build
-    if [ ! -e $BUILDDIR ]; then
-        echo "Creating build sdirectory $BUILDDIR"
-        sudo mkdir -p $BUILDDIR
-    fi
-    opts="--with-linux=$BUILDDIR"
-    mkdir -p $OVS_BUILD
-    cd $OVS_BUILD
-    ../configure $opts
-    make
-    sudo make install
-
-    modprobe
-}
-
-function remove_ovs {
-    pkgs=`dpkg --get-selections | grep openvswitch | awk '{ print $1;}'`
-    echo "Removing existing Open vSwitch packages:"
-    echo $pkgs
-    if ! $remove $pkgs; then
-        echo "Not all packages removed correctly"
-    fi
-    # For some reason this doesn't happen
-    if scripts=`ls /etc/init.d/*openvswitch* 2>/dev/null`; then
-        echo $scripts
-        for s in $scripts; do
-            s=$(basename $s)
-            echo SCRIPT $s
-            sudo service $s stop
-            sudo rm -f /etc/init.d/$s
-            sudo update-rc.d -f $s remove
-        done
-    fi
-    echo "Done removing OVS"
-}
-
-# Install NOX with tutorial files
-function nox {
-    echo "Installing NOX w/tutorial files..."
-
-    # Install NOX deps:
-    $install autoconf automake g++ libtool python python-twisted \
-		swig libssl-dev make
-    if [ "$DIST" = "Debian" ]; then
-        $install libboost1.35-dev
-    elif [ "$DIST" = "Ubuntu" ]; then
-        $install python-dev libboost-dev
-        $install libboost-filesystem-dev
-        $install libboost-test-dev
-    fi
-    # Install NOX optional deps:
-    $install libsqlite3-dev python-simplejson
-
-    # Fetch NOX destiny
-    cd ~/
-    git clone https://github.com/noxrepo/nox-classic.git noxcore
-    cd noxcore
-    if ! git checkout -b destiny remotes/origin/destiny ; then
-        echo "Did not check out a new destiny branch - assuming current branch is destiny"
-    fi
-
-    # Apply patches
-    git checkout -b tutorial-destiny
-    git am ~/mini-ndn/util/nox-patches/*tutorial-port-nox-destiny*.patch
-    if [ "$DIST" = "Ubuntu" ] && [ `expr $RELEASE '>=' 12.04` = 1 ]; then
-        git am ~/mini-ndn/util/nox-patches/*nox-ubuntu12-hacks.patch
-    fi
-
-    # Build
-    ./boot.sh
-    mkdir build
-    cd build
-    ../configure
-    make -j3
-    #make check
-
-    # Add NOX_CORE_DIR env var:
-    sed -i -e 's|# for examples$|&\nexport NOX_CORE_DIR=~/noxcore/build/src|' ~/.bashrc
-
-    # To verify this install:
-    #cd ~/noxcore/build/src
-    #./nox_core -v -i ptcp:
-}
-
-# "Install" POX
-function pox {
-    echo "Installing POX into $HOME/pox..."
-    cd ~
-    git clone https://github.com/noxrepo/pox.git
-}
-
-# Install OFtest
-function oftest {
-    echo "Installing oftest..."
-
-    # Install deps:
-    $install tcpdump python-scapy
-
-    # Install oftest:
-    cd ~/
-    git clone git://github.com/floodlight/oftest
-    cd oftest
-    cd tools/munger
-    sudo make install
-}
-
-# Install cbench
-function cbench {
-    echo "Installing cbench..."
-
-    $install libsnmp-dev libpcap-dev libconfig-dev
-    cd ~/
-    git clone git://openflow.org/oflops.git
-    cd oflops
-    sh boot.sh || true # possible error in autoreconf, so run twice
-    sh boot.sh
-    ./configure --with-openflow-src-dir=$HOME/openflow
-    make
-    sudo make install || true # make install fails; force past this
-}
-
-function other {
-    echo "Doing other setup tasks..."
-
-    # Enable command auto completion using sudo; modify ~/.bashrc:
-    sed -i -e 's|# for examples$|&\ncomplete -cf sudo|' ~/.bashrc
-
-    # Install tcpdump and tshark, cmd-line packet dump tools.  Also install gitk,
-    # a graphical git history viewer.
-    $install tcpdump tshark gitk
-
-    # Install common text editors
-    $install vim nano emacs
-
-    # Install NTP
-    $install ntp
-
-    # Set git to colorize everything.
-    git config --global color.diff auto
-    git config --global color.status auto
-    git config --global color.branch auto
-
-    # Reduce boot screen opt-out delay. Modify timeout in /boot/grub/menu.lst to 1:
-    if [ "$DIST" = "Debian" ]; then
-        sudo sed -i -e 's/^timeout.*$/timeout         1/' /boot/grub/menu.lst
-    fi
-
-    # Clean unneeded debs:
-    rm -f ~/linux-headers-* ~/linux-image-*
-}
-
-# Script to copy built OVS kernel module to where modprobe will
-# find them automatically.  Removes the need to keep an environment variable
-# for insmod usage, and works nicely with multiple kernel versions.
-#
-# The downside is that after each recompilation of OVS you'll need to
-# re-run this script.  If you're using only one kernel version, then it may be
-# a good idea to use a symbolic link in place of the copy below.
-function modprobe {
-    echo "Setting up modprobe for OVS kmod..."
-
-    sudo cp $OVS_KMODS $DRIVERS_DIR
-    sudo depmod -a ${KERNEL_NAME}
-}
-
-function all {
-    echo "Running all commands..."
-    kernel
-    mn_deps
-    of
-    wireshark
-    ovs
-    # NOX-classic is deprecated, but you can install it manually if desired.
-    # nox
-    pox
-    oftest
-    cbench
-    other
-    echo "Please reboot, then run ./mininet/util/install.sh -c to remove unneeded packages."
-    echo "Enjoy Mininet!"
-}
-
-# Restore disk space and remove sensitive files before shipping a VM.
-function vm_clean {
-    echo "Cleaning VM..."
-    sudo apt-get clean
-    sudo rm -rf /tmp/*
-    sudo rm -rf openvswitch*.tar.gz
-
-    # Remove sensistive files
-    history -c  # note this won't work if you have multiple bash sessions
-    rm -f ~/.bash_history  # need to clear in memory and remove on disk
-    rm -f ~/.ssh/id_rsa* ~/.ssh/known_hosts
-    sudo rm -f ~/.ssh/authorized_keys*
-
-    # Remove Mininet files
-    #sudo rm -f /lib/modules/python2.5/site-packages/mininet*
-    #sudo rm -f /usr/bin/mnexec
-
-    # Clear optional dev script for SSH keychain load on boot
-    rm -f ~/.bash_profile
-
-    # Clear git changes
-    git config --global user.name "None"
-    git config --global user.email "None"
-
-    # Remove mininet install script
-    rm -f install-mininet.sh
-}
-
-function usage {
-    printf 'Usage: %s [-acdfhkmntvxy]\n\n' $(basename $0) >&2
-
-    printf 'This install script attempts to install useful packages\n' >&2
-    printf 'for Mininet. It should (hopefully) work on Ubuntu 10.04, 11.10\n' >&2
-    printf 'and Debian 5.0 (Lenny). If you run into trouble, try\n' >&2
-    printf 'installing one thing at a time, and looking at the \n' >&2
-    printf 'specific installation function in this script.\n\n' >&2
-
-    printf 'options:\n' >&2
-    printf -- ' -a: (default) install (A)ll packages - good luck!\n' >&2
-    printf -- ' -b: install controller (B)enchmark (oflops)\n' >&2
-    printf -- ' -c: (C)lean up after kernel install\n' >&2
-    printf -- ' -d: (D)elete some sensitive files from a VM image\n' >&2
-    printf -- ' -f: install open(F)low\n' >&2
-    printf -- ' -h: print this (H)elp message\n' >&2
-    printf -- ' -k: install new (K)ernel\n' >&2
-    printf -- ' -m: install Open vSwitch kernel (M)odule from source dir\n' >&2
-    printf -- ' -n: install mini(N)et dependencies + core files\n' >&2
-    printf -- ' -r: remove existing Open vSwitch packages\n' >&2
-    printf -- ' -t: install o(T)her stuff\n' >&2
-    printf -- ' -v: install open (V)switch\n' >&2
-    printf -- ' -w: install OpenFlow (w)ireshark dissector\n' >&2
-    printf -- ' -x: install NO(X) OpenFlow controller\n' >&2
-    printf -- ' -y: install (A)ll packages\n' >&2
-
-    exit 2
-}
-
-if [ $# -eq 0 ]
-then
-    all
-else
-    while getopts 'abcdfhkmnprtvwx' OPTION
-    do
-      case $OPTION in
-      a)    all;;
-      b)    cbench;;
-      c)    kernel_clean;;
-      d)    vm_clean;;
-      f)    of;;
-      h)    usage;;
-      k)    kernel;;
-      m)    modprobe;;
-      n)    mn_deps;;
-      p)    pox;;
-      r)    remove_ovs;;
-      t)    other;;
-      v)    ovs;;
-      w)    wireshark;;
-      x)    nox;;
-      ?)    usage;;
-      esac
-    done
-    shift $(($OPTIND - 1))
-fi
diff --git a/util/kbuild/kbuild b/util/kbuild/kbuild
deleted file mode 100644
index c8d2f96..0000000
--- a/util/kbuild/kbuild
+++ /dev/null
@@ -1,71 +0,0 @@
-#!/bin/bash
-
-# Script to build new Debian kernel packages for 2.6.33.1
-#
-# Caveats:
-#
-# Since kernel-package in debian-stable doesn't work with
-# 2.6.33.1, we attempt to patch it in place. This may not be the
-# right thing to do. A possibly better alternative is to install
-# a later version of kernel-package, although that could potentially
-# cause problems with upgrades, etc..
-#
-# The patch to tun.c is a workaround rather than a real fix.
-#
-# Building a full Debian kernel package with all drivers takes a long
-# time, 60-80 minutes on my laptop.
-#
-# Re-running a make-kpkg may not work without running 'make-kpkg clean'
-
-# Season to taste
-# export PATH=/usr/lib/ccache:$PATH
-export CONCURRENCY_LEVEL=3
-
-debversion=2.6.26-2-686-bigmem
-
-image=linux-image-$debversion
-
-echo "*** Installing $image"
-sudo aptitude install $image
-
-newversion=2.6.33.1
-archive=linux-$newversion.tar.bz2
-location=http://www.kernel.org/pub/linux/kernel/v2.6
-
-echo "*** Fetching $location/$archive"
-wget -c $location/$archive
-
-tree=linux-$newversion
-if [ -e $tree ]; then 
-  echo "*** $tree already exists"
-else
-  echo "*** Extracting $archive"
-  tar xjf $archive
-fi
-
-echo "*** Patching tun driver"
-patch $tree/drivers/net/tun.c < tun.patch
-
-echo "*** Patching debian build script"
-sudo patch /usr/share/kernel-package/ruleset/misc/version_vars.mk < version_vars.patch
-
-config=/boot/config-$debversion
-echo "*** Copying $config to $tree/.config"
-cp $config $tree/.config
-
-echo "*** Updating config"
-cd $tree
-yes '' | make oldconfig 1> /dev/null
-sed 's/# CONFIG_NET_NS is not set/CONFIG_NET_NS=y/' .config > .config-new
-mv .config-new .config
-echo "*** Result: " `grep CONFIG_NET_NS .config`
-
-echo "*** Building kernel"
-time fakeroot make-kpkg --initrd --append-to-version=-mininet kernel_image kernel_headers
-
-cd ..
-echo "*** Done - package should be in current directory"
-ls *$newversion*.deb
-
-echo "To install:"
-echo "# dpkg -i "  *$newversion*.deb
diff --git a/util/kbuild/tun.patch b/util/kbuild/tun.patch
deleted file mode 100644
index 3c4cc69..0000000
--- a/util/kbuild/tun.patch
+++ /dev/null
@@ -1,13 +0,0 @@
---- linux-2.6.33.1/drivers/net/tun.c	2010-03-24 22:47:32.000000000 -0700
-+++ tun-new.c	2010-03-24 22:45:00.000000000 -0700
-@@ -1006,7 +1006,9 @@
- 		if (err < 0)
- 			goto err_free_sk;
- 
--		if (device_create_file(&tun->dev->dev, &dev_attr_tun_flags) ||
-+		/* BL hack: check for null parent kobj */
-+		if (!tun->dev->dev.kobj.sd ||
-+		    device_create_file(&tun->dev->dev, &dev_attr_tun_flags) ||
- 		    device_create_file(&tun->dev->dev, &dev_attr_owner) ||
- 		    device_create_file(&tun->dev->dev, &dev_attr_group))
- 			printk(KERN_ERR "Failed to create tun sysfs files\n");
diff --git a/util/kbuild/version_vars.patch b/util/kbuild/version_vars.patch
deleted file mode 100644
index 6f55901..0000000
--- a/util/kbuild/version_vars.patch
+++ /dev/null
@@ -1,18 +0,0 @@
---- /usr/share/kernel-package/ruleset/misc/version_vars.mk	2010-03-25 18:14:41.000000000 -0700
-+++ version_vars.mk	2010-03-03 06:46:59.000000000 -0800
-@@ -138,11 +138,13 @@
- EXTRAV_ARG :=
- endif
- 
--UTS_RELEASE_HEADER=$(call doit,if [ -f include/linux/utsrelease.h ]; then  \
-+UTS_RELEASE_HEADER=$(call doit, if [ -f include/generated/utsrelease.h ]; then \
-+	                       echo include/generated/utsrelease.h;            \
-+			   else if [ -f include/linux/utsrelease.h ]; then  \
- 	                       echo include/linux/utsrelease.h;            \
- 	                   else                                            \
-                                echo include/linux/version.h ;              \
--	                   fi)
-+	                   fi fi)
- UTS_RELEASE_VERSION=$(call doit,if [ -f $(UTS_RELEASE_HEADER) ]; then                    \
-                  grep 'define UTS_RELEASE' $(UTS_RELEASE_HEADER) |                       \
-                  perl -nle  'm/^\s*\#define\s+UTS_RELEASE\s+("?)(\S+)\1/g && print $$2;';\
diff --git a/util/nox-patches/0001-OpenFlow-tutorial-port-nox-destiny.patch b/util/nox-patches/0001-OpenFlow-tutorial-port-nox-destiny.patch
deleted file mode 100644
index 881fc55..0000000
--- a/util/nox-patches/0001-OpenFlow-tutorial-port-nox-destiny.patch
+++ /dev/null
@@ -1,298 +0,0 @@
-From 5c9610ffb88c89b0f36359ad3c7547831482a3ff Mon Sep 17 00:00:00 2001
-From: Bob Lantz <rlantz@cs.stanford.edu>
-Date: Fri, 3 Feb 2012 14:48:58 -0800
-Subject: [PATCH] OpenFlow tutorial port nox-destiny.
-
----
- src/nox/coreapps/examples/Makefile.am            |    2 +-
- src/nox/coreapps/examples/tutorial/Makefile.am   |   25 ++++
- src/nox/coreapps/examples/tutorial/meta.json     |   12 ++
- src/nox/coreapps/examples/tutorial/pytutorial.py |   67 +++++++++++
- src/nox/coreapps/examples/tutorial/tutorial.cc   |  134 ++++++++++++++++++++++
- 5 files changed, 239 insertions(+), 1 deletions(-)
- create mode 100644 src/nox/coreapps/examples/tutorial/Makefile.am
- create mode 100644 src/nox/coreapps/examples/tutorial/__init__.py
- create mode 100644 src/nox/coreapps/examples/tutorial/meta.json
- create mode 100644 src/nox/coreapps/examples/tutorial/pytutorial.py
- create mode 100644 src/nox/coreapps/examples/tutorial/tutorial.cc
-
-diff --git a/src/nox/coreapps/examples/Makefile.am b/src/nox/coreapps/examples/Makefile.am
-index 126f32e..1a0458c 100644
---- a/src/nox/coreapps/examples/Makefile.am
-+++ b/src/nox/coreapps/examples/Makefile.am
-@@ -1,6 +1,6 @@
- include ../../../Make.vars 
- 
--SUBDIRS = t
-+SUBDIRS = tutorial t
- 
- EXTRA_DIST =\
- 	meta.json\
-diff --git a/src/nox/coreapps/examples/tutorial/Makefile.am b/src/nox/coreapps/examples/tutorial/Makefile.am
-new file mode 100644
-index 0000000..51cf921
---- /dev/null
-+++ b/src/nox/coreapps/examples/tutorial/Makefile.am
-@@ -0,0 +1,25 @@
-+include ../../../../Make.vars 
-+
-+EXTRA_DIST =\
-+	meta.xml \
-+	__init__.py \
-+	pytutorial.py
-+
-+if PY_ENABLED
-+AM_CPPFLAGS += $(PYTHON_CPPFLAGS)
-+endif # PY_ENABLED 
-+
-+pkglib_LTLIBRARIES =		\
-+	tutorial.la
-+
-+tutorial_la_CPPFLAGS = $(AM_CPPFLAGS) -I $(top_srcdir)/src/nox -I $(top_srcdir)/src/nox/coreapps/
-+tutorial_la_SOURCES = tutorial.cc
-+tutorial_la_LDFLAGS = -module -export-dynamic
-+
-+NOX_RUNTIMEFILES = meta.json \
-+	__init__.py \
-+	pytutorial.py
-+
-+all-local: nox-all-local
-+clean-local: nox-clean-local 
-+install-exec-hook: nox-install-local
-diff --git a/src/nox/coreapps/examples/tutorial/__init__.py b/src/nox/coreapps/examples/tutorial/__init__.py
-new file mode 100644
-index 0000000..e69de29
-diff --git a/src/nox/coreapps/examples/tutorial/meta.json b/src/nox/coreapps/examples/tutorial/meta.json
-new file mode 100644
-index 0000000..7a9f227
---- /dev/null
-+++ b/src/nox/coreapps/examples/tutorial/meta.json
-@@ -0,0 +1,12 @@
-+{
-+    "components": [
-+        {
-+            "name": "tutorial",
-+            "library": "tutorial" 
-+        },
-+        {
-+            "name": "pytutorial",
-+            "python": "nox.coreapps.examples.tutorial.pytutorial" 
-+        }
-+    ]
-+}
-diff --git a/src/nox/coreapps/examples/tutorial/pytutorial.py b/src/nox/coreapps/examples/tutorial/pytutorial.py
-new file mode 100644
-index 0000000..1e21c0b
---- /dev/null
-+++ b/src/nox/coreapps/examples/tutorial/pytutorial.py
-@@ -0,0 +1,67 @@
-+# Tutorial Controller
-+# Starts as a hub, and your job is to turn this into a learning switch.
-+
-+import logging
-+
-+from nox.lib.core import *
-+import nox.lib.openflow as openflow
-+from nox.lib.packet.ethernet import ethernet
-+from nox.lib.packet.packet_utils import mac_to_str, mac_to_int
-+
-+log = logging.getLogger('nox.coreapps.tutorial.pytutorial')
-+
-+
-+class pytutorial(Component):
-+
-+    def __init__(self, ctxt):
-+        Component.__init__(self, ctxt)
-+        # Use this table to store MAC addresses in the format of your choice;
-+        # Functions already imported, including mac_to_str, and mac_to_int,
-+        # should prove useful for converting the byte array provided by NOX
-+        # for packet MAC destination fields.
-+        # This table is initialized to empty when your module starts up.
-+        self.mac_to_port = {} # key: MAC addr; value: port
-+
-+    def learn_and_forward(self, dpid, inport, packet, buf, bufid):
-+        """Learn MAC src port mapping, then flood or send unicast."""
-+        
-+        # Initial hub behavior: flood packet out everything but input port.
-+        # Comment out the line below when starting the exercise.
-+        self.send_openflow(dpid, bufid, buf, openflow.OFPP_FLOOD, inport)
-+
-+        # Starter psuedocode for learning switch exercise below: you'll need to
-+        # replace each pseudocode line with more specific Python code.
-+
-+        # Learn the port for the source MAC
-+        #self.mac_to_port = <fill in>
-+        #if (destination MAC of the packet is known):
-+            # Send unicast packet to known output port
-+            #self.send_openflow( <fill in params> )
-+            # Later, only after learning controller works: 
-+            # push down flow entry and remove the send_openflow command above.
-+            #self.install_datapath_flow( <fill in params> )
-+        #else:
-+            #flood packet out everything but the input port
-+            #self.send_openflow(dpid, bufid, buf, openflow.OFPP_FLOOD, inport)
-+
-+    def packet_in_callback(self, dpid, inport, reason, len, bufid, packet):
-+        """Packet-in handler""" 
-+        if not packet.parsed:
-+            log.debug('Ignoring incomplete packet')
-+        else:
-+            self.learn_and_forward(dpid, inport, packet, packet.arr, bufid)    
-+
-+        return CONTINUE
-+
-+    def install(self):
-+        self.register_for_packet_in(self.packet_in_callback)
-+    
-+    def getInterface(self):
-+        return str(pytutorial)
-+
-+def getFactory():
-+    class Factory:
-+        def instance(self, ctxt):
-+            return pytutorial(ctxt)
-+
-+    return Factory()
-diff --git a/src/nox/coreapps/examples/tutorial/tutorial.cc b/src/nox/coreapps/examples/tutorial/tutorial.cc
-new file mode 100644
-index 0000000..e7240cc
---- /dev/null
-+++ b/src/nox/coreapps/examples/tutorial/tutorial.cc
-@@ -0,0 +1,134 @@
-+#include "component.hh"
-+#include "config.h"
-+#include "packet-in.hh"
-+#include "flow.hh"
-+#include "assert.hh"
-+#include "netinet++/ethernetaddr.hh"
-+#include "netinet++/ethernet.hh"
-+#include <boost/shared_array.hpp>
-+#include <boost/bind.hpp>
-+#ifdef LOG4CXX_ENABLED
-+#include <boost/format.hpp>
-+#include "log4cxx/logger.h"
-+#else
-+#include "vlog.hh"
-+#endif
-+
-+using namespace std;
-+using namespace vigil;
-+using namespace vigil::container;
-+
-+namespace
-+{
-+  static Vlog_module lg("tutorial");
-+ 
-+  /** Learning switch.
-+   */
-+  class tutorial
-+    : public Component 
-+  {
-+  public:
-+    /** Constructor.
-+     */
-+    tutorial(const Context* c, const json_object* node)
-+      : Component(c) 
-+    { }
-+    
-+    /** Configuration.
-+     * Add handler for packet-in event.
-+     */
-+    void configure(const Configuration*) 
-+    {
-+      register_handler<Packet_in_event>
-+	(boost::bind(&tutorial::handle, this, _1));
-+    }
-+    
-+    /** Just simply install.
-+     */
-+    void install() 
-+    {
-+      lg.dbg(" Install called ");
-+    }
-+
-+    /** Function to setup flow.
-+     */
-+    void setup_flow(Flow& flow, datapathid datapath_id , 
-+		    uint32_t buffer_id, uint16_t out_port)
-+    {
-+      ofp_flow_mod* ofm;
-+      size_t size = sizeof *ofm + sizeof(ofp_action_output);
-+      boost::shared_array<char> raw_of(new char[size]);
-+      ofm = (ofp_flow_mod*) raw_of.get();
-+
-+      ofm->header.version = OFP_VERSION;
-+      ofm->header.type = OFPT_FLOW_MOD;
-+      ofm->header.length = htons(size);
-+      ofm->match.wildcards = htonl(0);
-+      ofm->match.in_port = htons(flow.in_port);
-+      ofm->match.dl_vlan = flow.dl_vlan;
-+      memcpy(ofm->match.dl_src, flow.dl_src.octet, sizeof ofm->match.dl_src);
-+      memcpy(ofm->match.dl_dst, flow.dl_dst.octet, sizeof ofm->match.dl_dst);
-+      ofm->match.dl_type = flow.dl_type;
-+      ofm->match.nw_src = flow.nw_src;
-+      ofm->match.nw_dst = flow.nw_dst;
-+      ofm->match.nw_proto = flow.nw_proto;
-+      ofm->match.tp_src = flow.tp_src;
-+      ofm->match.tp_dst = flow.tp_dst;
-+      ofm->command = htons(OFPFC_ADD);
-+      ofm->buffer_id = htonl(buffer_id);
-+      ofm->idle_timeout = htons(5);
-+      ofm->hard_timeout = htons(OFP_FLOW_PERMANENT);
-+      ofm->priority = htons(OFP_DEFAULT_PRIORITY);
-+      ofp_action_output& action = *((ofp_action_output*)ofm->actions);
-+      memset(&action, 0, sizeof(ofp_action_output));
-+      action.type = htons(OFPAT_OUTPUT);
-+      action.len = htons(sizeof(ofp_action_output));
-+      action.max_len = htons(0);
-+      action.port = htons(out_port);
-+      send_openflow_command(datapath_id, &ofm->header, true);
-+    }
-+
-+    /** Function to handle packets.
-+     * @param datapath_id datapath id of switch
-+     * @param in_port port packet is received
-+     * @param buffer_id buffer id of packet
-+     * @param source source mac address in host order
-+     * @param destination destination mac address in host order
-+     */
-+    void handle_packet(datapathid datapath_id, uint16_t in_port, uint32_t buffer_id, 
-+		       uint64_t source, uint64_t destination)
-+    {
-+      send_openflow_packet(datapath_id, buffer_id, OFPP_FLOOD,
-+			   in_port, true);
-+    }
-+
-+    /** Packet-on handler.
-+     */
-+    Disposition handle(const Event& e)
-+    {
-+      const Packet_in_event& pi = assert_cast<const Packet_in_event&>(e);
-+      uint32_t buffer_id = pi.buffer_id;
-+      Flow flow(pi.in_port, *pi.get_buffer());
-+
-+      // drop LLDP packets
-+      if (flow.dl_type == ethernet::LLDP)
-+        return CONTINUE;
-+
-+      // pass handle of unicast packet, else flood
-+      if (!flow.dl_src.is_multicast())
-+	handle_packet(pi.datapath_id, pi.in_port, buffer_id, 
-+		      flow.dl_src.hb_long(), flow.dl_dst.hb_long());
-+      else
-+	send_openflow_packet(pi.datapath_id, buffer_id, OFPP_FLOOD,
-+			     pi.in_port, true);
-+      
-+      return CONTINUE;
-+    }
-+    
-+  private:
-+};
-+
-+REGISTER_COMPONENT(container::Simple_component_factory<tutorial>,
-+                   tutorial);
-+
-+} // unnamed namespace
--- 
-1.7.5.4
-
diff --git a/util/nox-patches/0002-nox-ubuntu12-hacks.patch b/util/nox-patches/0002-nox-ubuntu12-hacks.patch
deleted file mode 100644
index 77619bc..0000000
--- a/util/nox-patches/0002-nox-ubuntu12-hacks.patch
+++ /dev/null
@@ -1,175 +0,0 @@
-From 166693d7cb640d4a41251b87e92c52d9c688196b Mon Sep 17 00:00:00 2001
-From: Bob Lantz <rlantz@cs.stanford.edu>
-Date: Mon, 14 May 2012 15:30:44 -0700
-Subject: [PATCH] Hacks to get NOX classic/destiny to compile under Ubuntu
- 12.04
-
-Thanks to Srinivasu R. Kanduru for the initial patch.
-
-Apologies for the hacks - it is my hope that this will be fixed
-upstream eventually.
-
----
- config/ac_pkg_swig.m4                              |    7 ++++---
- src/Make.vars                                      |    2 +-
- src/nox/coreapps/pyrt/deferredcallback.cc          |    2 +-
- src/nox/coreapps/pyrt/pyglue.cc                    |    2 +-
- src/nox/coreapps/pyrt/pyrt.cc                      |    2 +-
- src/nox/netapps/authenticator/auth.i               |    2 ++
- src/nox/netapps/authenticator/flow_util.i          |    1 +
- src/nox/netapps/routing/routing.i                  |    2 ++
- .../switch_management/pyswitch_management.i        |    2 ++
- src/nox/netapps/tests/tests.cc                     |    2 +-
- src/nox/netapps/topology/pytopology.i              |    2 ++
- 11 files changed, 18 insertions(+), 8 deletions(-)
-
-diff --git a/config/ac_pkg_swig.m4 b/config/ac_pkg_swig.m4
-index d12556e..9b608f2 100644
---- a/config/ac_pkg_swig.m4
-+++ b/config/ac_pkg_swig.m4
-@@ -78,9 +78,10 @@ AC_DEFUN([AC_PROG_SWIG],[
-                         if test -z "$available_patch" ; then
-                                 [available_patch=0]
-                         fi
--                        if test $available_major -ne $required_major \
--                                -o $available_minor -ne $required_minor \
--                                -o $available_patch -lt $required_patch ; then
-+			major_done=`test $available_major -gt $required_major`
-+			minor_done=`test $available_minor -gt $required_minor`
-+                        if test !$major_done -a !$minor_done \
-+                                -a $available_patch -lt $required_patch ; then
-                                 AC_MSG_WARN([SWIG version >= $1 is required.  You have $swig_version.  You should look at http://www.swig.org])
-                                 SWIG=''
-                         else
-diff --git a/src/Make.vars b/src/Make.vars
-index d70d6aa..93b2879 100644
---- a/src/Make.vars
-+++ b/src/Make.vars
-@@ -53,7 +53,7 @@ AM_LDFLAGS += -export-dynamic
- endif
- 
- # set python runtimefiles to be installed in the same directory as pkg
--pkglib_SCRIPTS = $(NOX_RUNTIMEFILES) $(NOX_PYBUILDFILES)
-+pkgdata_SCRIPTS = $(NOX_RUNTIMEFILES) $(NOX_PYBUILDFILES)
- BUILT_SOURCES  = $(NOX_PYBUILDFILES)
- 
- # Runtime-files build and clean rules
-diff --git a/src/nox/coreapps/pyrt/deferredcallback.cc b/src/nox/coreapps/pyrt/deferredcallback.cc
-index 3a40fa7..111a586 100644
---- a/src/nox/coreapps/pyrt/deferredcallback.cc
-+++ b/src/nox/coreapps/pyrt/deferredcallback.cc
-@@ -69,7 +69,7 @@ DeferredCallback::get_instance(const Callback& c)
-     DeferredCallback* cb = new DeferredCallback(c);
- 
-     // flag as used in *_wrap.cc....correct?
--    return SWIG_Python_NewPointerObj(cb, s, SWIG_POINTER_OWN | 0);
-+    return SWIG_Python_NewPointerObj(m, cb, s, SWIG_POINTER_OWN | 0);
- }
- 
- bool
-diff --git a/src/nox/coreapps/pyrt/pyglue.cc b/src/nox/coreapps/pyrt/pyglue.cc
-index 48b9716..317fd04 100644
---- a/src/nox/coreapps/pyrt/pyglue.cc
-+++ b/src/nox/coreapps/pyrt/pyglue.cc
-@@ -874,7 +874,7 @@ to_python(const Flow& flow)
-     if (!s) {
-         throw std::runtime_error("Could not find Flow SWIG type_info");
-     }
--    return SWIG_Python_NewPointerObj(f, s, SWIG_POINTER_OWN | 0);
-+    return SWIG_Python_NewPointerObj(m, f, s, SWIG_POINTER_OWN | 0);
- 
- //     PyObject* dict = PyDict_New();
- //     if (!dict) {
-diff --git a/src/nox/coreapps/pyrt/pyrt.cc b/src/nox/coreapps/pyrt/pyrt.cc
-index fbda461..8ec05d6 100644
---- a/src/nox/coreapps/pyrt/pyrt.cc
-+++ b/src/nox/coreapps/pyrt/pyrt.cc
-@@ -776,7 +776,7 @@ Python_event_manager::create_python_context(const Context* ctxt,
-                             pretty_print_python_exception());
-     }
- 
--    PyObject* pyctxt = SWIG_Python_NewPointerObj(p, s, 0);
-+    PyObject* pyctxt = SWIG_Python_NewPointerObj(m, p, s, 0);
-     Py_INCREF(pyctxt); // XXX needed?
- 
-     //Py_DECREF(m);
-diff --git a/src/nox/netapps/authenticator/auth.i b/src/nox/netapps/authenticator/auth.i
-index 1de1a17..bfa04e2 100644
---- a/src/nox/netapps/authenticator/auth.i
-+++ b/src/nox/netapps/authenticator/auth.i
-@@ -18,6 +18,8 @@
- 
- %module "nox.netapps.authenticator.pyauth"
- 
-+// Hack to get it to compile -BL
-+%include "std_list.i"
- %{
- #include "core_events.hh"
- #include "pyrt/pycontext.hh"
-diff --git a/src/nox/netapps/authenticator/flow_util.i b/src/nox/netapps/authenticator/flow_util.i
-index f67c3ef..2a314e2 100644
---- a/src/nox/netapps/authenticator/flow_util.i
-+++ b/src/nox/netapps/authenticator/flow_util.i
-@@ -32,6 +32,7 @@ using namespace vigil::applications;
- %}
- 
- %include "common-defs.i"
-+%include "std_list.i"
- 
- %import "netinet/netinet.i"
- %import "pyrt/event.i"
-diff --git a/src/nox/netapps/routing/routing.i b/src/nox/netapps/routing/routing.i
-index 44ccb3d..f9221a2 100644
---- a/src/nox/netapps/routing/routing.i
-+++ b/src/nox/netapps/routing/routing.i
-@@ -17,6 +17,8 @@
-  */
- %module "nox.netapps.routing.pyrouting"
- 
-+// Hack to get it to compile -BL
-+%include "std_list.i"
- %{
- #include "pyrouting.hh"
- #include "routing.hh"
-diff --git a/src/nox/netapps/switch_management/pyswitch_management.i b/src/nox/netapps/switch_management/pyswitch_management.i
-index 72bfed4..ad2c90d 100644
---- a/src/nox/netapps/switch_management/pyswitch_management.i
-+++ b/src/nox/netapps/switch_management/pyswitch_management.i
-@@ -18,6 +18,8 @@
- 
- %module "nox.netapps.pyswitch_management"
- 
-+// Hack to get it to compile -BL
-+%include "std_list.i"
- %{
- #include "switch_management_proxy.hh"
- #include "pyrt/pycontext.hh"
-diff --git a/src/nox/netapps/tests/tests.cc b/src/nox/netapps/tests/tests.cc
-index 20e900d..f027028 100644
---- a/src/nox/netapps/tests/tests.cc
-+++ b/src/nox/netapps/tests/tests.cc
-@@ -306,7 +306,7 @@ private:
-             throw runtime_error("Could not find PyContext SWIG type_info.");
-         }
-         
--        PyObject* pyctxt = SWIG_Python_NewPointerObj(p, s, 0);
-+        PyObject* pyctxt = SWIG_Python_NewPointerObj(m, p, s, 0);
-         assert(pyctxt);
- 
-         Py_DECREF(m);
-diff --git a/src/nox/netapps/topology/pytopology.i b/src/nox/netapps/topology/pytopology.i
-index 94a9f4b..7a8cd94 100644
---- a/src/nox/netapps/topology/pytopology.i
-+++ b/src/nox/netapps/topology/pytopology.i
-@@ -18,6 +18,8 @@
- 
- %module "nox.netapps.topology"
- 
-+// Hack to get it to compile -BL
-+%include "std_list.i"
- %{
- #include "pytopology.hh"
- #include "pyrt/pycontext.hh"
--- 
-1.7.5.4
-
diff --git a/util/nox-patches/README b/util/nox-patches/README
deleted file mode 100644
index b74a668..0000000
--- a/util/nox-patches/README
+++ /dev/null
@@ -1,2 +0,0 @@
-0001: This patch adds the OpenFlow tutorial module source code to nox-destiny.
-0002: This patch hacks nox-destiny to compile on Ubuntu 12.04.
diff --git a/util/openflow-patches/README b/util/openflow-patches/README
deleted file mode 100644
index 36f19ad..0000000
--- a/util/openflow-patches/README
+++ /dev/null
@@ -1,5 +0,0 @@
-Patches for OpenFlow Reference Implementation
-
-controller.patch: patch controller to support up to 4096 switches (up from 16!)
-
-datapath.patch: patch to kernel datapath to compile with CONFIG_NET_NS=y
diff --git a/util/openflow-patches/controller.patch b/util/openflow-patches/controller.patch
deleted file mode 100644
index c392fae..0000000
--- a/util/openflow-patches/controller.patch
+++ /dev/null
@@ -1,15 +0,0 @@
-diff --git a/controller/controller.c b/controller/controller.c
-index 41f2547..6eec590 100644
---- a/controller/controller.c
-+++ b/controller/controller.c
-@@ -58,8 +58,8 @@
- #include "vlog.h"
- #define THIS_MODULE VLM_controller
- 
--#define MAX_SWITCHES 16
--#define MAX_LISTENERS 16
-+#define MAX_SWITCHES 4096
-+#define MAX_LISTENERS 4096
- 
- struct switch_ {
-     struct lswitch *lswitch;
diff --git a/util/openflow-patches/datapath.patch b/util/openflow-patches/datapath.patch
deleted file mode 100644
index 13c9df7..0000000
--- a/util/openflow-patches/datapath.patch
+++ /dev/null
@@ -1,26 +0,0 @@
-diff --git a/datapath/datapath.c b/datapath/datapath.c
-index 4a4d3a2..365aa25 100644
---- a/datapath/datapath.c
-+++ b/datapath/datapath.c
-@@ -47,6 +47,9 @@
- 
- #include "compat.h"
- 
-+#ifdef CONFIG_NET_NS
-+#include <net/net_namespace.h>
-+#endif
- 
- /* Strings to describe the manufacturer, hardware, and software.  This data
-  * is queriable through the switch description stats message. */
-@@ -259,6 +262,10 @@ send_openflow_skb(const struct datapath *dp,
-                  struct sk_buff *skb, const struct sender *sender)
- {
-        return (sender
--               ? genlmsg_unicast(skb, sender->pid)
-+#ifdef CONFIG_NET_NS
-+               ? genlmsg_unicast(&init_net, skb, sender->pid)
-+#else
-+               ? genlmsg_unicast(skb, sender->pid)
-+#endif
-                : genlmsg_multicast(skb, 0, dp_mc_group(dp), GFP_ATOMIC));
- }
diff --git a/util/sch_htb-ofbuf/Makefile b/util/sch_htb-ofbuf/Makefile
deleted file mode 100644
index c4d714f..0000000
--- a/util/sch_htb-ofbuf/Makefile
+++ /dev/null
@@ -1,11 +0,0 @@
-obj-m = sch_htb.o
-KVERSION = $(shell uname -r)
-all:
-	        make -C /lib/modules/$(KVERSION)/build M=$(PWD) modules
-install:
-		test -e /lib/modules/$(KVERSION)/kernel/net/sched/sch_htb.ko.bak || mv /lib/modules/$(KVERSION)/kernel/net/sched/sch_htb.ko /lib/modules/$(KVERSION)/kernel/net/sched/sch_htb.ko.bak
-		cp sch_htb.ko /lib/modules/$(KVERSION)/kernel/net/sched/sch_htb.ko
-		rmmod sch_htb
-		modprobe sch_htb
-clean:
-	        make -C /lib/modules/$(KVERSION)/build M=$(PWD) clean
diff --git a/util/sch_htb-ofbuf/README b/util/sch_htb-ofbuf/README
deleted file mode 100644
index 711ed77..0000000
--- a/util/sch_htb-ofbuf/README
+++ /dev/null
@@ -1,10 +0,0 @@
-Modified sch_htb implementation with ofbuf support.
-
-To compile, just type make.  To use this module instead
-of regular sch_htb, do:
-
-0. make
-1. rmmod sch_htb
-2. insmod ./sch_htb.ko
-
-To revert, just rmmod sch_htb.
diff --git a/util/sch_htb-ofbuf/sch_htb.c b/util/sch_htb-ofbuf/sch_htb.c
deleted file mode 100644
index baead1c..0000000
--- a/util/sch_htb-ofbuf/sch_htb.c
+++ /dev/null
@@ -1,1644 +0,0 @@
-#define OFBUF (1)
-/*
- * net/sched/sch_htb.c	Hierarchical token bucket, feed tree version
- *
- *		This program is free software; you can redistribute it and/or
- *		modify it under the terms of the GNU General Public License
- *		as published by the Free Software Foundation; either version
- *		2 of the License, or (at your option) any later version.
- *
- * Authors:	Martin Devera, <devik@cdi.cz>
- *
- * Credits (in time order) for older HTB versions:
- *              Stef Coene <stef.coene@docum.org>
- *			HTB support at LARTC mailing list
- *		Ondrej Kraus, <krauso@barr.cz>
- *			found missing INIT_QDISC(htb)
- *		Vladimir Smelhaus, Aamer Akhter, Bert Hubert
- *			helped a lot to locate nasty class stall bug
- *		Andi Kleen, Jamal Hadi, Bert Hubert
- *			code review and helpful comments on shaping
- *		Tomasz Wrona, <tw@eter.tym.pl>
- *			created test case so that I was able to fix nasty bug
- *		Wilfried Weissmann
- *			spotted bug in dequeue code and helped with fix
- *		Jiri Fojtasek
- *			fixed requeue routine
- *		and many others. thanks.
- */
-#include <linux/module.h>
-#include <linux/moduleparam.h>
-#include <linux/types.h>
-#include <linux/kernel.h>
-#include <linux/string.h>
-#include <linux/errno.h>
-#include <linux/skbuff.h>
-#include <linux/list.h>
-#include <linux/compiler.h>
-#include <linux/rbtree.h>
-#include <linux/workqueue.h>
-#include <linux/slab.h>
-#include <net/netlink.h>
-#include <net/pkt_sched.h>
-
-/* HTB algorithm.
-    Author: devik@cdi.cz
-    ========================================================================
-    HTB is like TBF with multiple classes. It is also similar to CBQ because
-    it allows to assign priority to each class in hierarchy.
-    In fact it is another implementation of Floyd's formal sharing.
-
-    Levels:
-    Each class is assigned level. Leaf has ALWAYS level 0 and root
-    classes have level TC_HTB_MAXDEPTH-1. Interior nodes has level
-    one less than their parent.
-*/
-
-static int htb_hysteresis __read_mostly = 0; /* whether to use mode hysteresis for speedup */
-#define HTB_VER 0x30011		/* major must be matched with number suplied by TC as version */
-
-#if HTB_VER >> 16 != TC_HTB_PROTOVER
-#error "Mismatched sch_htb.c and pkt_sch.h"
-#endif
-
-/* Module parameter and sysfs export */
-module_param    (htb_hysteresis, int, 0640);
-MODULE_PARM_DESC(htb_hysteresis, "Hysteresis mode, less CPU load, less accurate");
-
-/* used internaly to keep status of single class */
-enum htb_cmode {
-	HTB_CANT_SEND,		/* class can't send and can't borrow */
-	HTB_MAY_BORROW,		/* class can't send but may borrow */
-	HTB_CAN_SEND		/* class can send */
-};
-
-/* interior & leaf nodes; props specific to leaves are marked L: */
-struct htb_class {
-	struct Qdisc_class_common common;
-	/* general class parameters */
-	struct gnet_stats_basic_packed bstats;
-	struct gnet_stats_queue qstats;
-	struct gnet_stats_rate_est rate_est;
-	struct tc_htb_xstats xstats;	/* our special stats */
-	int refcnt;		/* usage count of this class */
-
-	/* topology */
-	int level;		/* our level (see above) */
-	unsigned int children;
-	struct htb_class *parent;	/* parent class */
-
-	int prio;		/* these two are used only by leaves... */
-	int quantum;		/* but stored for parent-to-leaf return */
-
-	union {
-		struct htb_class_leaf {
-			struct Qdisc *q;
-			int deficit[TC_HTB_MAXDEPTH];
-			struct list_head drop_list;
-		} leaf;
-		struct htb_class_inner {
-			struct rb_root feed[TC_HTB_NUMPRIO];	/* feed trees */
-			struct rb_node *ptr[TC_HTB_NUMPRIO];	/* current class ptr */
-			/* When class changes from state 1->2 and disconnects from
-			 * parent's feed then we lost ptr value and start from the
-			 * first child again. Here we store classid of the
-			 * last valid ptr (used when ptr is NULL).
-			 */
-			u32 last_ptr_id[TC_HTB_NUMPRIO];
-		} inner;
-	} un;
-	struct rb_node node[TC_HTB_NUMPRIO];	/* node for self or feed tree */
-	struct rb_node pq_node;	/* node for event queue */
-	psched_time_t pq_key;
-
-	int prio_activity;	/* for which prios are we active */
-	enum htb_cmode cmode;	/* current mode of the class */
-
-	/* class attached filters */
-	struct tcf_proto *filter_list;
-	int filter_cnt;
-
-	/* token bucket parameters */
-	struct qdisc_rate_table *rate;	/* rate table of the class itself */
-	struct qdisc_rate_table *ceil;	/* ceiling rate (limits borrows too) */
-	long buffer, cbuffer;	/* token bucket depth/rate */
-	psched_tdiff_t mbuffer;	/* max wait time */
-	long tokens, ctokens;	/* current number of tokens */
-	psched_time_t t_c;	/* checkpoint time */
-};
-
-struct htb_sched {
-	struct Qdisc_class_hash clhash;
-	struct list_head drops[TC_HTB_NUMPRIO];/* active leaves (for drops) */
-
-	/* self list - roots of self generating tree */
-	struct rb_root row[TC_HTB_MAXDEPTH][TC_HTB_NUMPRIO];
-	int row_mask[TC_HTB_MAXDEPTH];
-	struct rb_node *ptr[TC_HTB_MAXDEPTH][TC_HTB_NUMPRIO];
-	u32 last_ptr_id[TC_HTB_MAXDEPTH][TC_HTB_NUMPRIO];
-
-	/* self wait list - roots of wait PQs per row */
-	struct rb_root wait_pq[TC_HTB_MAXDEPTH];
-
-	/* time of nearest event per level (row) */
-	psched_time_t near_ev_cache[TC_HTB_MAXDEPTH];
-
-	int defcls;		/* class where unclassified flows go to */
-
-	/* filters for qdisc itself */
-	struct tcf_proto *filter_list;
-
-	int rate2quantum;	/* quant = rate / rate2quantum */
-	psched_time_t now;	/* cached dequeue time */
-	struct qdisc_watchdog watchdog;
-
-	/* non shaped skbs; let them go directly thru */
-	struct sk_buff_head direct_queue;
-	int direct_qlen;	/* max qlen of above */
-
-	long direct_pkts;
-
-#if OFBUF
-	/* overflow buffer */
-	struct sk_buff_head ofbuf;
-	int ofbuf_queued;	/* # packets queued in above */
-#endif
-
-#define HTB_WARN_TOOMANYEVENTS	0x1
-	unsigned int warned;	/* only one warning */
-	struct work_struct work;
-};
-
-/* find class in global hash table using given handle */
-static inline struct htb_class *htb_find(u32 handle, struct Qdisc *sch)
-{
-	struct htb_sched *q = qdisc_priv(sch);
-	struct Qdisc_class_common *clc;
-
-	clc = qdisc_class_find(&q->clhash, handle);
-	if (clc == NULL)
-		return NULL;
-	return container_of(clc, struct htb_class, common);
-}
-
-/**
- * htb_classify - classify a packet into class
- *
- * It returns NULL if the packet should be dropped or -1 if the packet
- * should be passed directly thru. In all other cases leaf class is returned.
- * We allow direct class selection by classid in priority. The we examine
- * filters in qdisc and in inner nodes (if higher filter points to the inner
- * node). If we end up with classid MAJOR:0 we enqueue the skb into special
- * internal fifo (direct). These packets then go directly thru. If we still
- * have no valid leaf we try to use MAJOR:default leaf. It still unsuccessful
- * then finish and return direct queue.
- */
-#define HTB_DIRECT ((struct htb_class *)-1L)
-
-static struct htb_class *htb_classify(struct sk_buff *skb, struct Qdisc *sch,
-				      int *qerr)
-{
-	struct htb_sched *q = qdisc_priv(sch);
-	struct htb_class *cl;
-	struct tcf_result res;
-	struct tcf_proto *tcf;
-	int result;
-
-	/* allow to select class by setting skb->priority to valid classid;
-	 * note that nfmark can be used too by attaching filter fw with no
-	 * rules in it
-	 */
-	if (skb->priority == sch->handle)
-		return HTB_DIRECT;	/* X:0 (direct flow) selected */
-	cl = htb_find(skb->priority, sch);
-	if (cl && cl->level == 0)
-		return cl;
-
-	*qerr = NET_XMIT_SUCCESS | __NET_XMIT_BYPASS;
-	tcf = q->filter_list;
-	while (tcf && (result = tc_classify(skb, tcf, &res)) >= 0) {
-#ifdef CONFIG_NET_CLS_ACT
-		switch (result) {
-		case TC_ACT_QUEUED:
-		case TC_ACT_STOLEN:
-			*qerr = NET_XMIT_SUCCESS | __NET_XMIT_STOLEN;
-		case TC_ACT_SHOT:
-			return NULL;
-		}
-#endif
-		cl = (void *)res.class;
-		if (!cl) {
-			if (res.classid == sch->handle)
-				return HTB_DIRECT;	/* X:0 (direct flow) */
-			cl = htb_find(res.classid, sch);
-			if (!cl)
-				break;	/* filter selected invalid classid */
-		}
-		if (!cl->level)
-			return cl;	/* we hit leaf; return it */
-
-		/* we have got inner class; apply inner filter chain */
-		tcf = cl->filter_list;
-	}
-	/* classification failed; try to use default class */
-	cl = htb_find(TC_H_MAKE(TC_H_MAJ(sch->handle), q->defcls), sch);
-	if (!cl || cl->level)
-		return HTB_DIRECT;	/* bad default .. this is safe bet */
-	return cl;
-}
-
-/**
- * htb_add_to_id_tree - adds class to the round robin list
- *
- * Routine adds class to the list (actually tree) sorted by classid.
- * Make sure that class is not already on such list for given prio.
- */
-static void htb_add_to_id_tree(struct rb_root *root,
-			       struct htb_class *cl, int prio)
-{
-	struct rb_node **p = &root->rb_node, *parent = NULL;
-
-	while (*p) {
-		struct htb_class *c;
-		parent = *p;
-		c = rb_entry(parent, struct htb_class, node[prio]);
-
-		if (cl->common.classid > c->common.classid)
-			p = &parent->rb_right;
-		else
-			p = &parent->rb_left;
-	}
-	rb_link_node(&cl->node[prio], parent, p);
-	rb_insert_color(&cl->node[prio], root);
-}
-
-/**
- * htb_add_to_wait_tree - adds class to the event queue with delay
- *
- * The class is added to priority event queue to indicate that class will
- * change its mode in cl->pq_key microseconds. Make sure that class is not
- * already in the queue.
- */
-static void htb_add_to_wait_tree(struct htb_sched *q,
-				 struct htb_class *cl, long delay)
-{
-	struct rb_node **p = &q->wait_pq[cl->level].rb_node, *parent = NULL;
-
-	cl->pq_key = q->now + delay;
-	if (cl->pq_key == q->now)
-		cl->pq_key++;
-
-	/* update the nearest event cache */
-	if (q->near_ev_cache[cl->level] > cl->pq_key)
-		q->near_ev_cache[cl->level] = cl->pq_key;
-
-	while (*p) {
-		struct htb_class *c;
-		parent = *p;
-		c = rb_entry(parent, struct htb_class, pq_node);
-		if (cl->pq_key >= c->pq_key)
-			p = &parent->rb_right;
-		else
-			p = &parent->rb_left;
-	}
-	rb_link_node(&cl->pq_node, parent, p);
-	rb_insert_color(&cl->pq_node, &q->wait_pq[cl->level]);
-}
-
-/**
- * htb_next_rb_node - finds next node in binary tree
- *
- * When we are past last key we return NULL.
- * Average complexity is 2 steps per call.
- */
-static inline void htb_next_rb_node(struct rb_node **n)
-{
-	*n = rb_next(*n);
-}
-
-/**
- * htb_add_class_to_row - add class to its row
- *
- * The class is added to row at priorities marked in mask.
- * It does nothing if mask == 0.
- */
-static inline void htb_add_class_to_row(struct htb_sched *q,
-					struct htb_class *cl, int mask)
-{
-	q->row_mask[cl->level] |= mask;
-	while (mask) {
-		int prio = ffz(~mask);
-		mask &= ~(1 << prio);
-		htb_add_to_id_tree(q->row[cl->level] + prio, cl, prio);
-	}
-}
-
-/* If this triggers, it is a bug in this code, but it need not be fatal */
-static void htb_safe_rb_erase(struct rb_node *rb, struct rb_root *root)
-{
-	if (RB_EMPTY_NODE(rb)) {
-		WARN_ON(1);
-	} else {
-		rb_erase(rb, root);
-		RB_CLEAR_NODE(rb);
-	}
-}
-
-
-/**
- * htb_remove_class_from_row - removes class from its row
- *
- * The class is removed from row at priorities marked in mask.
- * It does nothing if mask == 0.
- */
-static inline void htb_remove_class_from_row(struct htb_sched *q,
-						 struct htb_class *cl, int mask)
-{
-	int m = 0;
-
-	while (mask) {
-		int prio = ffz(~mask);
-
-		mask &= ~(1 << prio);
-		if (q->ptr[cl->level][prio] == cl->node + prio)
-			htb_next_rb_node(q->ptr[cl->level] + prio);
-
-		htb_safe_rb_erase(cl->node + prio, q->row[cl->level] + prio);
-		if (!q->row[cl->level][prio].rb_node)
-			m |= 1 << prio;
-	}
-	q->row_mask[cl->level] &= ~m;
-}
-
-/**
- * htb_activate_prios - creates active classe's feed chain
- *
- * The class is connected to ancestors and/or appropriate rows
- * for priorities it is participating on. cl->cmode must be new
- * (activated) mode. It does nothing if cl->prio_activity == 0.
- */
-static void htb_activate_prios(struct htb_sched *q, struct htb_class *cl)
-{
-	struct htb_class *p = cl->parent;
-	long m, mask = cl->prio_activity;
-
-	while (cl->cmode == HTB_MAY_BORROW && p && mask) {
-		m = mask;
-		while (m) {
-			int prio = ffz(~m);
-			m &= ~(1 << prio);
-
-			if (p->un.inner.feed[prio].rb_node)
-				/* parent already has its feed in use so that
-				 * reset bit in mask as parent is already ok
-				 */
-				mask &= ~(1 << prio);
-
-			htb_add_to_id_tree(p->un.inner.feed + prio, cl, prio);
-		}
-		p->prio_activity |= mask;
-		cl = p;
-		p = cl->parent;
-
-	}
-	if (cl->cmode == HTB_CAN_SEND && mask)
-		htb_add_class_to_row(q, cl, mask);
-}
-
-/**
- * htb_deactivate_prios - remove class from feed chain
- *
- * cl->cmode must represent old mode (before deactivation). It does
- * nothing if cl->prio_activity == 0. Class is removed from all feed
- * chains and rows.
- */
-static void htb_deactivate_prios(struct htb_sched *q, struct htb_class *cl)
-{
-	struct htb_class *p = cl->parent;
-	long m, mask = cl->prio_activity;
-
-	while (cl->cmode == HTB_MAY_BORROW && p && mask) {
-		m = mask;
-		mask = 0;
-		while (m) {
-			int prio = ffz(~m);
-			m &= ~(1 << prio);
-
-			if (p->un.inner.ptr[prio] == cl->node + prio) {
-				/* we are removing child which is pointed to from
-				 * parent feed - forget the pointer but remember
-				 * classid
-				 */
-				p->un.inner.last_ptr_id[prio] = cl->common.classid;
-				p->un.inner.ptr[prio] = NULL;
-			}
-
-			htb_safe_rb_erase(cl->node + prio, p->un.inner.feed + prio);
-
-			if (!p->un.inner.feed[prio].rb_node)
-				mask |= 1 << prio;
-		}
-
-		p->prio_activity &= ~mask;
-		cl = p;
-		p = cl->parent;
-
-	}
-	if (cl->cmode == HTB_CAN_SEND && mask)
-		htb_remove_class_from_row(q, cl, mask);
-}
-
-static inline long htb_lowater(const struct htb_class *cl)
-{
-	if (htb_hysteresis)
-		return cl->cmode != HTB_CANT_SEND ? -cl->cbuffer : 0;
-	else
-		return 0;
-}
-static inline long htb_hiwater(const struct htb_class *cl)
-{
-	if (htb_hysteresis)
-		return cl->cmode == HTB_CAN_SEND ? -cl->buffer : 0;
-	else
-		return 0;
-}
-
-
-/**
- * htb_class_mode - computes and returns current class mode
- *
- * It computes cl's mode at time cl->t_c+diff and returns it. If mode
- * is not HTB_CAN_SEND then cl->pq_key is updated to time difference
- * from now to time when cl will change its state.
- * Also it is worth to note that class mode doesn't change simply
- * at cl->{c,}tokens == 0 but there can rather be hysteresis of
- * 0 .. -cl->{c,}buffer range. It is meant to limit number of
- * mode transitions per time unit. The speed gain is about 1/6.
- */
-static inline enum htb_cmode
-htb_class_mode(struct htb_class *cl, long *diff)
-{
-	long toks;
-
-	if ((toks = (cl->ctokens + *diff)) < htb_lowater(cl)) {
-		*diff = -toks;
-		return HTB_CANT_SEND;
-	}
-
-	if ((toks = (cl->tokens + *diff)) >= htb_hiwater(cl))
-		return HTB_CAN_SEND;
-
-	*diff = -toks;
-	return HTB_MAY_BORROW;
-}
-
-/**
- * htb_change_class_mode - changes classe's mode
- *
- * This should be the only way how to change classe's mode under normal
- * cirsumstances. Routine will update feed lists linkage, change mode
- * and add class to the wait event queue if appropriate. New mode should
- * be different from old one and cl->pq_key has to be valid if changing
- * to mode other than HTB_CAN_SEND (see htb_add_to_wait_tree).
- */
-static void
-htb_change_class_mode(struct htb_sched *q, struct htb_class *cl, long *diff)
-{
-	enum htb_cmode new_mode = htb_class_mode(cl, diff);
-
-	if (new_mode == cl->cmode)
-		return;
-
-	if (cl->prio_activity) {	/* not necessary: speed optimization */
-		if (cl->cmode != HTB_CANT_SEND)
-			htb_deactivate_prios(q, cl);
-		cl->cmode = new_mode;
-		if (new_mode != HTB_CANT_SEND)
-			htb_activate_prios(q, cl);
-	} else
-		cl->cmode = new_mode;
-}
-
-/**
- * htb_activate - inserts leaf cl into appropriate active feeds
- *
- * Routine learns (new) priority of leaf and activates feed chain
- * for the prio. It can be called on already active leaf safely.
- * It also adds leaf into droplist.
- */
-static inline void htb_activate(struct htb_sched *q, struct htb_class *cl)
-{
-	WARN_ON(cl->level || !cl->un.leaf.q || !cl->un.leaf.q->q.qlen);
-
-	if (!cl->prio_activity) {
-		cl->prio_activity = 1 << cl->prio;
-		htb_activate_prios(q, cl);
-		list_add_tail(&cl->un.leaf.drop_list,
-			      q->drops + cl->prio);
-	}
-}
-
-/**
- * htb_deactivate - remove leaf cl from active feeds
- *
- * Make sure that leaf is active. In the other words it can't be called
- * with non-active leaf. It also removes class from the drop list.
- */
-static inline void htb_deactivate(struct htb_sched *q, struct htb_class *cl)
-{
-	WARN_ON(!cl->prio_activity);
-
-	htb_deactivate_prios(q, cl);
-	cl->prio_activity = 0;
-	list_del_init(&cl->un.leaf.drop_list);
-}
-
-static int htb_enqueue(struct sk_buff *skb, struct Qdisc *sch)
-{
-	int uninitialized_var(ret);
-	struct htb_sched *q = qdisc_priv(sch);
-	struct htb_class *cl = htb_classify(skb, sch, &ret);
-
-#if OFBUF
-    if(cl != HTB_DIRECT && cl)
-        skb_get(skb);
-#endif
-
-	if (cl == HTB_DIRECT) {
-		/* enqueue to helper queue */
-		if (q->direct_queue.qlen < q->direct_qlen) {
-			__skb_queue_tail(&q->direct_queue, skb);
-			q->direct_pkts++;
-		} else {
-			kfree_skb(skb);
-			sch->qstats.drops++;
-			return NET_XMIT_DROP;
-		}
-#ifdef CONFIG_NET_CLS_ACT
-	} else if (!cl) {
-		if (ret & __NET_XMIT_BYPASS)
-			sch->qstats.drops++;
-		kfree_skb(skb);
-		return ret;
-#endif
-	} else if ((ret = qdisc_enqueue(skb, cl->un.leaf.q)) != NET_XMIT_SUCCESS) {
-        /* We shouldn't drop this, but enqueue it into ofbuf */
-        // TODO: is skb actually valid?
-        // Ans: looks like qdisc_enqueue will end up freeing the packet
-        // if enqueue failed.  So we should incr refcnt before calling qdisc_enqueue...
-#if OFBUF
-        __skb_queue_tail(&q->ofbuf, skb);
-        q->ofbuf_queued++;
-#else 
-		if (net_xmit_drop_count(ret)) {
-			sch->qstats.drops++;
-			cl->qstats.drops++;
-		}
-		return ret;
-#endif
-	} else {
-		bstats_update(&cl->bstats, skb);
-		htb_activate(q, cl);
-#if OFBUF
-        kfree_skb(skb);
-#endif
-	}
-
-	sch->q.qlen++;
-	return NET_XMIT_SUCCESS;
-}
-
-static inline void htb_accnt_tokens(struct htb_class *cl, int bytes, long diff)
-{
-	long toks = diff + cl->tokens;
-
-	if (toks > cl->buffer)
-		toks = cl->buffer;
-	toks -= (long) qdisc_l2t(cl->rate, bytes);
-	if (toks <= -cl->mbuffer)
-		toks = 1 - cl->mbuffer;
-
-	cl->tokens = toks;
-}
-
-static inline void htb_accnt_ctokens(struct htb_class *cl, int bytes, long diff)
-{
-	long toks = diff + cl->ctokens;
-
-	if (toks > cl->cbuffer)
-		toks = cl->cbuffer;
-	toks -= (long) qdisc_l2t(cl->ceil, bytes);
-	if (toks <= -cl->mbuffer)
-		toks = 1 - cl->mbuffer;
-
-	cl->ctokens = toks;
-}
-
-/**
- * htb_charge_class - charges amount "bytes" to leaf and ancestors
- *
- * Routine assumes that packet "bytes" long was dequeued from leaf cl
- * borrowing from "level". It accounts bytes to ceil leaky bucket for
- * leaf and all ancestors and to rate bucket for ancestors at levels
- * "level" and higher. It also handles possible change of mode resulting
- * from the update. Note that mode can also increase here (MAY_BORROW to
- * CAN_SEND) because we can use more precise clock that event queue here.
- * In such case we remove class from event queue first.
- */
-static void htb_charge_class(struct htb_sched *q, struct htb_class *cl,
-			     int level, struct sk_buff *skb)
-{
-	int bytes = qdisc_pkt_len(skb);
-	enum htb_cmode old_mode;
-	long diff;
-
-	while (cl) {
-		diff = psched_tdiff_bounded(q->now, cl->t_c, cl->mbuffer);
-		if (cl->level >= level) {
-			if (cl->level == level)
-				cl->xstats.lends++;
-			htb_accnt_tokens(cl, bytes, diff);
-		} else {
-			cl->xstats.borrows++;
-			cl->tokens += diff;	/* we moved t_c; update tokens */
-		}
-		htb_accnt_ctokens(cl, bytes, diff);
-		cl->t_c = q->now;
-
-		old_mode = cl->cmode;
-		diff = 0;
-		htb_change_class_mode(q, cl, &diff);
-		if (old_mode != cl->cmode) {
-			if (old_mode != HTB_CAN_SEND)
-				htb_safe_rb_erase(&cl->pq_node, q->wait_pq + cl->level);
-			if (cl->cmode != HTB_CAN_SEND)
-				htb_add_to_wait_tree(q, cl, diff);
-		}
-
-		/* update basic stats except for leaves which are already updated */
-		if (cl->level)
-			bstats_update(&cl->bstats, skb);
-
-		cl = cl->parent;
-	}
-}
-
-/**
- * htb_do_events - make mode changes to classes at the level
- *
- * Scans event queue for pending events and applies them. Returns time of
- * next pending event (0 for no event in pq, q->now for too many events).
- * Note: Applied are events whose have cl->pq_key <= q->now.
- */
-static psched_time_t htb_do_events(struct htb_sched *q, int level,
-				   unsigned long start)
-{
-	/* don't run for longer than 2 jiffies; 2 is used instead of
-	 * 1 to simplify things when jiffy is going to be incremented
-	 * too soon
-	 */
-	unsigned long stop_at = start + 2;
-	while (time_before(jiffies, stop_at)) {
-		struct htb_class *cl;
-		long diff;
-		struct rb_node *p = rb_first(&q->wait_pq[level]);
-
-		if (!p)
-			return 0;
-
-		cl = rb_entry(p, struct htb_class, pq_node);
-		if (cl->pq_key > q->now)
-			return cl->pq_key;
-
-		htb_safe_rb_erase(p, q->wait_pq + level);
-		diff = psched_tdiff_bounded(q->now, cl->t_c, cl->mbuffer);
-		htb_change_class_mode(q, cl, &diff);
-		if (cl->cmode != HTB_CAN_SEND)
-			htb_add_to_wait_tree(q, cl, diff);
-	}
-
-	/* too much load - let's continue after a break for scheduling */
-	if (!(q->warned & HTB_WARN_TOOMANYEVENTS)) {
-		pr_warning("htb: too many events!\n");
-		q->warned |= HTB_WARN_TOOMANYEVENTS;
-	}
-
-	return q->now;
-}
-
-/* Returns class->node+prio from id-tree where classe's id is >= id. NULL
- * is no such one exists.
- */
-static struct rb_node *htb_id_find_next_upper(int prio, struct rb_node *n,
-					      u32 id)
-{
-	struct rb_node *r = NULL;
-	while (n) {
-		struct htb_class *cl =
-		    rb_entry(n, struct htb_class, node[prio]);
-
-		if (id > cl->common.classid) {
-			n = n->rb_right;
-		} else if (id < cl->common.classid) {
-			r = n;
-			n = n->rb_left;
-		} else {
-			return n;
-		}
-	}
-	return r;
-}
-
-/**
- * htb_lookup_leaf - returns next leaf class in DRR order
- *
- * Find leaf where current feed pointers points to.
- */
-static struct htb_class *htb_lookup_leaf(struct rb_root *tree, int prio,
-					 struct rb_node **pptr, u32 * pid)
-{
-	int i;
-	struct {
-		struct rb_node *root;
-		struct rb_node **pptr;
-		u32 *pid;
-	} stk[TC_HTB_MAXDEPTH], *sp = stk;
-
-	BUG_ON(!tree->rb_node);
-	sp->root = tree->rb_node;
-	sp->pptr = pptr;
-	sp->pid = pid;
-
-	for (i = 0; i < 65535; i++) {
-		if (!*sp->pptr && *sp->pid) {
-			/* ptr was invalidated but id is valid - try to recover
-			 * the original or next ptr
-			 */
-			*sp->pptr =
-			    htb_id_find_next_upper(prio, sp->root, *sp->pid);
-		}
-		*sp->pid = 0;	/* ptr is valid now so that remove this hint as it
-				 * can become out of date quickly
-				 */
-		if (!*sp->pptr) {	/* we are at right end; rewind & go up */
-			*sp->pptr = sp->root;
-			while ((*sp->pptr)->rb_left)
-				*sp->pptr = (*sp->pptr)->rb_left;
-			if (sp > stk) {
-				sp--;
-				if (!*sp->pptr) {
-					WARN_ON(1);
-					return NULL;
-				}
-				htb_next_rb_node(sp->pptr);
-			}
-		} else {
-			struct htb_class *cl;
-			cl = rb_entry(*sp->pptr, struct htb_class, node[prio]);
-			if (!cl->level)
-				return cl;
-			(++sp)->root = cl->un.inner.feed[prio].rb_node;
-			sp->pptr = cl->un.inner.ptr + prio;
-			sp->pid = cl->un.inner.last_ptr_id + prio;
-		}
-	}
-	WARN_ON(1);
-	return NULL;
-}
-
-/* dequeues packet at given priority and level; call only if
- * you are sure that there is active class at prio/level
- */
-static struct sk_buff *htb_dequeue_tree(struct htb_sched *q, int prio,
-					int level)
-{
-	struct sk_buff *skb = NULL;
-	struct htb_class *cl, *start;
-	/* look initial class up in the row */
-	start = cl = htb_lookup_leaf(q->row[level] + prio, prio,
-				     q->ptr[level] + prio,
-				     q->last_ptr_id[level] + prio);
-
-	do {
-next:
-		if (unlikely(!cl))
-			return NULL;
-
-		/* class can be empty - it is unlikely but can be true if leaf
-		 * qdisc drops packets in enqueue routine or if someone used
-		 * graft operation on the leaf since last dequeue;
-		 * simply deactivate and skip such class
-		 */
-		if (unlikely(cl->un.leaf.q->q.qlen == 0)) {
-			struct htb_class *next;
-			htb_deactivate(q, cl);
-
-			/* row/level might become empty */
-			if ((q->row_mask[level] & (1 << prio)) == 0)
-				return NULL;
-
-			next = htb_lookup_leaf(q->row[level] + prio,
-					       prio, q->ptr[level] + prio,
-					       q->last_ptr_id[level] + prio);
-
-			if (cl == start)	/* fix start if we just deleted it */
-				start = next;
-			cl = next;
-			goto next;
-		}
-
-		skb = cl->un.leaf.q->dequeue(cl->un.leaf.q);
-		if (likely(skb != NULL))
-			break;
-
-		qdisc_warn_nonwc("htb", cl->un.leaf.q);
-		htb_next_rb_node((level ? cl->parent->un.inner.ptr : q->
-				  ptr[0]) + prio);
-		cl = htb_lookup_leaf(q->row[level] + prio, prio,
-				     q->ptr[level] + prio,
-				     q->last_ptr_id[level] + prio);
-
-	} while (cl != start);
-
-	if (likely(skb != NULL)) {
-		cl->un.leaf.deficit[level] -= qdisc_pkt_len(skb);
-		if (cl->un.leaf.deficit[level] < 0) {
-			cl->un.leaf.deficit[level] += cl->quantum;
-			htb_next_rb_node((level ? cl->parent->un.inner.ptr : q->
-					  ptr[0]) + prio);
-		}
-		/* this used to be after charge_class but this constelation
-		 * gives us slightly better performance
-		 */
-		if (!cl->un.leaf.q->q.qlen)
-			htb_deactivate(q, cl);
-		htb_charge_class(q, cl, level, skb);
-	}
-	return skb;
-}
-
-static struct sk_buff *htb_dequeue(struct Qdisc *sch)
-{
-	struct sk_buff *skb;
-	struct htb_sched *q = qdisc_priv(sch);
-	int level;
-	psched_time_t next_event;
-	unsigned long start_at;
-    u32 r, i;
-    struct sk_buff *pkt;
-
-	/* try to dequeue direct packets as high prio (!) to minimize cpu work */
-	skb = __skb_dequeue(&q->direct_queue);
-	if (skb != NULL) {
-ok:
-		qdisc_bstats_update(sch, skb);
-		qdisc_unthrottled(sch);
-		sch->q.qlen--;
-#if OFBUF
-        if(q->ofbuf_queued > 0) {
-            i = 0;
-            r = net_random() % q->ofbuf_queued;
-            // enqueue the rth packet and drop the rest
-            while((pkt = __skb_dequeue(&q->ofbuf)) != NULL) {
-                if(i == r) {
-                    // the chosen one
-                    htb_enqueue(pkt, sch);
-                } else {
-                    kfree_skb(pkt);
-                }
-                i++;
-            }
-            q->ofbuf_queued = 0;
-        }
-#endif
-		return skb;
-	}
-
-	if (!sch->q.qlen)
-		goto fin;
-	q->now = psched_get_time();
-	start_at = jiffies;
-
-	next_event = q->now + 5 * PSCHED_TICKS_PER_SEC;
-
-	for (level = 0; level < TC_HTB_MAXDEPTH; level++) {
-		/* common case optimization - skip event handler quickly */
-		int m;
-		psched_time_t event;
-
-		if (q->now >= q->near_ev_cache[level]) {
-			event = htb_do_events(q, level, start_at);
-			if (!event)
-				event = q->now + PSCHED_TICKS_PER_SEC;
-			q->near_ev_cache[level] = event;
-		} else
-			event = q->near_ev_cache[level];
-
-		if (next_event > event)
-			next_event = event;
-
-		m = ~q->row_mask[level];
-		while (m != (int)(-1)) {
-			int prio = ffz(m);
-
-			m |= 1 << prio;
-			skb = htb_dequeue_tree(q, prio, level);
-			if (likely(skb != NULL))
-				goto ok;
-		}
-	}
-	sch->qstats.overlimits++;
-	if (likely(next_event > q->now))
-		qdisc_watchdog_schedule(&q->watchdog, next_event);
-	else
-		schedule_work(&q->work);
-fin:
-	return skb;
-}
-
-/* try to drop from each class (by prio) until one succeed */
-static unsigned int htb_drop(struct Qdisc *sch)
-{
-	struct htb_sched *q = qdisc_priv(sch);
-	int prio;
-
-	for (prio = TC_HTB_NUMPRIO - 1; prio >= 0; prio--) {
-		struct list_head *p;
-		list_for_each(p, q->drops + prio) {
-			struct htb_class *cl = list_entry(p, struct htb_class,
-							  un.leaf.drop_list);
-			unsigned int len;
-			if (cl->un.leaf.q->ops->drop &&
-			    (len = cl->un.leaf.q->ops->drop(cl->un.leaf.q))) {
-				sch->q.qlen--;
-				if (!cl->un.leaf.q->q.qlen)
-					htb_deactivate(q, cl);
-				return len;
-			}
-		}
-	}
-	return 0;
-}
-
-/* reset all classes */
-/* always caled under BH & queue lock */
-static void htb_reset(struct Qdisc *sch)
-{
-	struct htb_sched *q = qdisc_priv(sch);
-	struct htb_class *cl;
-	struct hlist_node *n;
-	unsigned int i;
-
-	for (i = 0; i < q->clhash.hashsize; i++) {
-		hlist_for_each_entry(cl, n, &q->clhash.hash[i], common.hnode) {
-			if (cl->level)
-				memset(&cl->un.inner, 0, sizeof(cl->un.inner));
-			else {
-				if (cl->un.leaf.q)
-					qdisc_reset(cl->un.leaf.q);
-				INIT_LIST_HEAD(&cl->un.leaf.drop_list);
-			}
-			cl->prio_activity = 0;
-			cl->cmode = HTB_CAN_SEND;
-
-		}
-	}
-	qdisc_watchdog_cancel(&q->watchdog);
-	__skb_queue_purge(&q->direct_queue);
-	sch->q.qlen = 0;
-#if OFBUF
-    __skb_queue_purge(&q->ofbuf);
-    q->ofbuf_queued = 0;
-#endif
-	memset(q->row, 0, sizeof(q->row));
-	memset(q->row_mask, 0, sizeof(q->row_mask));
-	memset(q->wait_pq, 0, sizeof(q->wait_pq));
-	memset(q->ptr, 0, sizeof(q->ptr));
-	for (i = 0; i < TC_HTB_NUMPRIO; i++)
-		INIT_LIST_HEAD(q->drops + i);
-}
-
-static const struct nla_policy htb_policy[TCA_HTB_MAX + 1] = {
-	[TCA_HTB_PARMS]	= { .len = sizeof(struct tc_htb_opt) },
-	[TCA_HTB_INIT]	= { .len = sizeof(struct tc_htb_glob) },
-	[TCA_HTB_CTAB]	= { .type = NLA_BINARY, .len = TC_RTAB_SIZE },
-	[TCA_HTB_RTAB]	= { .type = NLA_BINARY, .len = TC_RTAB_SIZE },
-};
-
-static void htb_work_func(struct work_struct *work)
-{
-	struct htb_sched *q = container_of(work, struct htb_sched, work);
-	struct Qdisc *sch = q->watchdog.qdisc;
-
-	__netif_schedule(qdisc_root(sch));
-}
-
-static int htb_init(struct Qdisc *sch, struct nlattr *opt)
-{
-	struct htb_sched *q = qdisc_priv(sch);
-	struct nlattr *tb[TCA_HTB_INIT + 1];
-	struct tc_htb_glob *gopt;
-	int err;
-	int i;
-
-	if (!opt)
-		return -EINVAL;
-
-	err = nla_parse_nested(tb, TCA_HTB_INIT, opt, htb_policy);
-	if (err < 0)
-		return err;
-
-	if (tb[TCA_HTB_INIT] == NULL) {
-		pr_err("HTB: hey probably you have bad tc tool ?\n");
-		return -EINVAL;
-	}
-	gopt = nla_data(tb[TCA_HTB_INIT]);
-	if (gopt->version != HTB_VER >> 16) {
-		pr_err("HTB: need tc/htb version %d (minor is %d), you have %d\n",
-		       HTB_VER >> 16, HTB_VER & 0xffff, gopt->version);
-		return -EINVAL;
-	}
-
-	err = qdisc_class_hash_init(&q->clhash);
-	if (err < 0)
-		return err;
-	for (i = 0; i < TC_HTB_NUMPRIO; i++)
-		INIT_LIST_HEAD(q->drops + i);
-
-	qdisc_watchdog_init(&q->watchdog, sch);
-	INIT_WORK(&q->work, htb_work_func);
-	skb_queue_head_init(&q->direct_queue);
-
-#if OFBUF
-    skb_queue_head_init(&q->ofbuf);
-    q->ofbuf_queued = 0;
-#endif
-
-	q->direct_qlen = qdisc_dev(sch)->tx_queue_len;
-
-	if (q->direct_qlen < 2)	/* some devices have zero tx_queue_len */
-		q->direct_qlen = 2;
-
-	if ((q->rate2quantum = gopt->rate2quantum) < 1)
-		q->rate2quantum = 1;
-	q->defcls = gopt->defcls;
-
-	return 0;
-}
-
-static int htb_dump(struct Qdisc *sch, struct sk_buff *skb)
-{
-	spinlock_t *root_lock = qdisc_root_sleeping_lock(sch);
-	struct htb_sched *q = qdisc_priv(sch);
-	struct nlattr *nest;
-	struct tc_htb_glob gopt;
-
-	spin_lock_bh(root_lock);
-
-	gopt.direct_pkts = q->direct_pkts;
-	gopt.version = HTB_VER;
-	gopt.rate2quantum = q->rate2quantum;
-	gopt.defcls = q->defcls;
-	gopt.debug = 0;
-
-	nest = nla_nest_start(skb, TCA_OPTIONS);
-	if (nest == NULL)
-		goto nla_put_failure;
-	NLA_PUT(skb, TCA_HTB_INIT, sizeof(gopt), &gopt);
-	nla_nest_end(skb, nest);
-
-	spin_unlock_bh(root_lock);
-	return skb->len;
-
-nla_put_failure:
-	spin_unlock_bh(root_lock);
-	nla_nest_cancel(skb, nest);
-	return -1;
-}
-
-static int htb_dump_class(struct Qdisc *sch, unsigned long arg,
-			  struct sk_buff *skb, struct tcmsg *tcm)
-{
-	struct htb_class *cl = (struct htb_class *)arg;
-	spinlock_t *root_lock = qdisc_root_sleeping_lock(sch);
-	struct nlattr *nest;
-	struct tc_htb_opt opt;
-
-	spin_lock_bh(root_lock);
-	tcm->tcm_parent = cl->parent ? cl->parent->common.classid : TC_H_ROOT;
-	tcm->tcm_handle = cl->common.classid;
-	if (!cl->level && cl->un.leaf.q)
-		tcm->tcm_info = cl->un.leaf.q->handle;
-
-	nest = nla_nest_start(skb, TCA_OPTIONS);
-	if (nest == NULL)
-		goto nla_put_failure;
-
-	memset(&opt, 0, sizeof(opt));
-
-	opt.rate = cl->rate->rate;
-	opt.buffer = cl->buffer;
-	opt.ceil = cl->ceil->rate;
-	opt.cbuffer = cl->cbuffer;
-	opt.quantum = cl->quantum;
-	opt.prio = cl->prio;
-	opt.level = cl->level;
-	NLA_PUT(skb, TCA_HTB_PARMS, sizeof(opt), &opt);
-
-	nla_nest_end(skb, nest);
-	spin_unlock_bh(root_lock);
-	return skb->len;
-
-nla_put_failure:
-	spin_unlock_bh(root_lock);
-	nla_nest_cancel(skb, nest);
-	return -1;
-}
-
-static int
-htb_dump_class_stats(struct Qdisc *sch, unsigned long arg, struct gnet_dump *d)
-{
-	struct htb_class *cl = (struct htb_class *)arg;
-
-	if (!cl->level && cl->un.leaf.q)
-		cl->qstats.qlen = cl->un.leaf.q->q.qlen;
-	cl->xstats.tokens = cl->tokens;
-	cl->xstats.ctokens = cl->ctokens;
-
-	if (gnet_stats_copy_basic(d, &cl->bstats) < 0 ||
-	    gnet_stats_copy_rate_est(d, NULL, &cl->rate_est) < 0 ||
-	    gnet_stats_copy_queue(d, &cl->qstats) < 0)
-		return -1;
-
-	return gnet_stats_copy_app(d, &cl->xstats, sizeof(cl->xstats));
-}
-
-static int htb_graft(struct Qdisc *sch, unsigned long arg, struct Qdisc *new,
-		     struct Qdisc **old)
-{
-	struct htb_class *cl = (struct htb_class *)arg;
-
-	if (cl->level)
-		return -EINVAL;
-	if (new == NULL &&
-	    (new = qdisc_create_dflt(sch->dev_queue, &pfifo_qdisc_ops,
-				     cl->common.classid)) == NULL)
-		return -ENOBUFS;
-
-	sch_tree_lock(sch);
-	*old = cl->un.leaf.q;
-	cl->un.leaf.q = new;
-	if (*old != NULL) {
-		qdisc_tree_decrease_qlen(*old, (*old)->q.qlen);
-		qdisc_reset(*old);
-	}
-	sch_tree_unlock(sch);
-	return 0;
-}
-
-static struct Qdisc *htb_leaf(struct Qdisc *sch, unsigned long arg)
-{
-	struct htb_class *cl = (struct htb_class *)arg;
-	return !cl->level ? cl->un.leaf.q : NULL;
-}
-
-static void htb_qlen_notify(struct Qdisc *sch, unsigned long arg)
-{
-	struct htb_class *cl = (struct htb_class *)arg;
-
-	if (cl->un.leaf.q->q.qlen == 0)
-		htb_deactivate(qdisc_priv(sch), cl);
-}
-
-static unsigned long htb_get(struct Qdisc *sch, u32 classid)
-{
-	struct htb_class *cl = htb_find(classid, sch);
-	if (cl)
-		cl->refcnt++;
-	return (unsigned long)cl;
-}
-
-static inline int htb_parent_last_child(struct htb_class *cl)
-{
-	if (!cl->parent)
-		/* the root class */
-		return 0;
-	if (cl->parent->children > 1)
-		/* not the last child */
-		return 0;
-	return 1;
-}
-
-static void htb_parent_to_leaf(struct htb_sched *q, struct htb_class *cl,
-			       struct Qdisc *new_q)
-{
-	struct htb_class *parent = cl->parent;
-
-	WARN_ON(cl->level || !cl->un.leaf.q || cl->prio_activity);
-
-	if (parent->cmode != HTB_CAN_SEND)
-		htb_safe_rb_erase(&parent->pq_node, q->wait_pq + parent->level);
-
-	parent->level = 0;
-	memset(&parent->un.inner, 0, sizeof(parent->un.inner));
-	INIT_LIST_HEAD(&parent->un.leaf.drop_list);
-	parent->un.leaf.q = new_q ? new_q : &noop_qdisc;
-	parent->tokens = parent->buffer;
-	parent->ctokens = parent->cbuffer;
-	parent->t_c = psched_get_time();
-	parent->cmode = HTB_CAN_SEND;
-}
-
-static void htb_destroy_class(struct Qdisc *sch, struct htb_class *cl)
-{
-	if (!cl->level) {
-		WARN_ON(!cl->un.leaf.q);
-		qdisc_destroy(cl->un.leaf.q);
-	}
-	gen_kill_estimator(&cl->bstats, &cl->rate_est);
-	qdisc_put_rtab(cl->rate);
-	qdisc_put_rtab(cl->ceil);
-
-	tcf_destroy_chain(&cl->filter_list);
-	kfree(cl);
-}
-
-static void htb_destroy(struct Qdisc *sch)
-{
-	struct htb_sched *q = qdisc_priv(sch);
-	struct hlist_node *n, *next;
-	struct htb_class *cl;
-	unsigned int i;
-
-	cancel_work_sync(&q->work);
-	qdisc_watchdog_cancel(&q->watchdog);
-	/* This line used to be after htb_destroy_class call below
-	 * and surprisingly it worked in 2.4. But it must precede it
-	 * because filter need its target class alive to be able to call
-	 * unbind_filter on it (without Oops).
-	 */
-	tcf_destroy_chain(&q->filter_list);
-
-	for (i = 0; i < q->clhash.hashsize; i++) {
-		hlist_for_each_entry(cl, n, &q->clhash.hash[i], common.hnode)
-			tcf_destroy_chain(&cl->filter_list);
-	}
-	for (i = 0; i < q->clhash.hashsize; i++) {
-		hlist_for_each_entry_safe(cl, n, next, &q->clhash.hash[i],
-					  common.hnode)
-			htb_destroy_class(sch, cl);
-	}
-	qdisc_class_hash_destroy(&q->clhash);
-	__skb_queue_purge(&q->direct_queue);
-#if OFBUF
-    __skb_queue_purge(&q->ofbuf);
-    q->ofbuf_queued = 0;
-#endif
-}
-
-static int htb_delete(struct Qdisc *sch, unsigned long arg)
-{
-	struct htb_sched *q = qdisc_priv(sch);
-	struct htb_class *cl = (struct htb_class *)arg;
-	unsigned int qlen;
-	struct Qdisc *new_q = NULL;
-	int last_child = 0;
-
-	// TODO: why don't allow to delete subtree ? references ? does
-	// tc subsys quarantee us that in htb_destroy it holds no class
-	// refs so that we can remove children safely there ?
-	if (cl->children || cl->filter_cnt)
-		return -EBUSY;
-
-	if (!cl->level && htb_parent_last_child(cl)) {
-		new_q = qdisc_create_dflt(sch->dev_queue, &pfifo_qdisc_ops,
-					  cl->parent->common.classid);
-		last_child = 1;
-	}
-
-	sch_tree_lock(sch);
-
-	if (!cl->level) {
-		qlen = cl->un.leaf.q->q.qlen;
-		qdisc_reset(cl->un.leaf.q);
-		qdisc_tree_decrease_qlen(cl->un.leaf.q, qlen);
-	}
-
-	/* delete from hash and active; remainder in destroy_class */
-	qdisc_class_hash_remove(&q->clhash, &cl->common);
-	if (cl->parent)
-		cl->parent->children--;
-
-	if (cl->prio_activity)
-		htb_deactivate(q, cl);
-
-	if (cl->cmode != HTB_CAN_SEND)
-		htb_safe_rb_erase(&cl->pq_node, q->wait_pq + cl->level);
-
-	if (last_child)
-		htb_parent_to_leaf(q, cl, new_q);
-
-	BUG_ON(--cl->refcnt == 0);
-	/*
-	 * This shouldn't happen: we "hold" one cops->get() when called
-	 * from tc_ctl_tclass; the destroy method is done from cops->put().
-	 */
-
-	sch_tree_unlock(sch);
-	return 0;
-}
-
-static void htb_put(struct Qdisc *sch, unsigned long arg)
-{
-	struct htb_class *cl = (struct htb_class *)arg;
-
-	if (--cl->refcnt == 0)
-		htb_destroy_class(sch, cl);
-}
-
-static int htb_change_class(struct Qdisc *sch, u32 classid,
-			    u32 parentid, struct nlattr **tca,
-			    unsigned long *arg)
-{
-	int err = -EINVAL;
-	struct htb_sched *q = qdisc_priv(sch);
-	struct htb_class *cl = (struct htb_class *)*arg, *parent;
-	struct nlattr *opt = tca[TCA_OPTIONS];
-	struct qdisc_rate_table *rtab = NULL, *ctab = NULL;
-	struct nlattr *tb[__TCA_HTB_MAX];
-	struct tc_htb_opt *hopt;
-
-	/* extract all subattrs from opt attr */
-	if (!opt)
-		goto failure;
-
-	err = nla_parse_nested(tb, TCA_HTB_MAX, opt, htb_policy);
-	if (err < 0)
-		goto failure;
-
-	err = -EINVAL;
-	if (tb[TCA_HTB_PARMS] == NULL)
-		goto failure;
-
-	parent = parentid == TC_H_ROOT ? NULL : htb_find(parentid, sch);
-
-	hopt = nla_data(tb[TCA_HTB_PARMS]);
-
-	rtab = qdisc_get_rtab(&hopt->rate, tb[TCA_HTB_RTAB]);
-	ctab = qdisc_get_rtab(&hopt->ceil, tb[TCA_HTB_CTAB]);
-	if (!rtab || !ctab)
-		goto failure;
-
-	if (!cl) {		/* new class */
-		struct Qdisc *new_q;
-		int prio;
-		struct {
-			struct nlattr		nla;
-			struct gnet_estimator	opt;
-		} est = {
-			.nla = {
-				.nla_len	= nla_attr_size(sizeof(est.opt)),
-				.nla_type	= TCA_RATE,
-			},
-			.opt = {
-				/* 4s interval, 16s averaging constant */
-				.interval	= 2,
-				.ewma_log	= 2,
-			},
-		};
-
-		/* check for valid classid */
-		if (!classid || TC_H_MAJ(classid ^ sch->handle) ||
-		    htb_find(classid, sch))
-			goto failure;
-
-		/* check maximal depth */
-		if (parent && parent->parent && parent->parent->level < 2) {
-			pr_err("htb: tree is too deep\n");
-			goto failure;
-		}
-		err = -ENOBUFS;
-		cl = kzalloc(sizeof(*cl), GFP_KERNEL);
-		if (!cl)
-			goto failure;
-
-		err = gen_new_estimator(&cl->bstats, &cl->rate_est,
-					qdisc_root_sleeping_lock(sch),
-					tca[TCA_RATE] ? : &est.nla);
-		if (err) {
-			kfree(cl);
-			goto failure;
-		}
-
-		cl->refcnt = 1;
-		cl->children = 0;
-		INIT_LIST_HEAD(&cl->un.leaf.drop_list);
-		RB_CLEAR_NODE(&cl->pq_node);
-
-		for (prio = 0; prio < TC_HTB_NUMPRIO; prio++)
-			RB_CLEAR_NODE(&cl->node[prio]);
-
-		/* create leaf qdisc early because it uses kmalloc(GFP_KERNEL)
-		 * so that can't be used inside of sch_tree_lock
-		 * -- thanks to Karlis Peisenieks
-		 */
-		new_q = qdisc_create_dflt(sch->dev_queue,
-					  &pfifo_qdisc_ops, classid);
-		sch_tree_lock(sch);
-		if (parent && !parent->level) {
-			unsigned int qlen = parent->un.leaf.q->q.qlen;
-
-			/* turn parent into inner node */
-			qdisc_reset(parent->un.leaf.q);
-			qdisc_tree_decrease_qlen(parent->un.leaf.q, qlen);
-			qdisc_destroy(parent->un.leaf.q);
-			if (parent->prio_activity)
-				htb_deactivate(q, parent);
-
-			/* remove from evt list because of level change */
-			if (parent->cmode != HTB_CAN_SEND) {
-				htb_safe_rb_erase(&parent->pq_node, q->wait_pq);
-				parent->cmode = HTB_CAN_SEND;
-			}
-			parent->level = (parent->parent ? parent->parent->level
-					 : TC_HTB_MAXDEPTH) - 1;
-			memset(&parent->un.inner, 0, sizeof(parent->un.inner));
-		}
-		/* leaf (we) needs elementary qdisc */
-		cl->un.leaf.q = new_q ? new_q : &noop_qdisc;
-
-		cl->common.classid = classid;
-		cl->parent = parent;
-
-		/* set class to be in HTB_CAN_SEND state */
-		cl->tokens = hopt->buffer;
-		cl->ctokens = hopt->cbuffer;
-		cl->mbuffer = 60 * PSCHED_TICKS_PER_SEC;	/* 1min */
-		cl->t_c = psched_get_time();
-		cl->cmode = HTB_CAN_SEND;
-
-		/* attach to the hash list and parent's family */
-		qdisc_class_hash_insert(&q->clhash, &cl->common);
-		if (parent)
-			parent->children++;
-	} else {
-		if (tca[TCA_RATE]) {
-			err = gen_replace_estimator(&cl->bstats, &cl->rate_est,
-						    qdisc_root_sleeping_lock(sch),
-						    tca[TCA_RATE]);
-			if (err)
-				return err;
-		}
-		sch_tree_lock(sch);
-	}
-
-	/* it used to be a nasty bug here, we have to check that node
-	 * is really leaf before changing cl->un.leaf !
-	 */
-	if (!cl->level) {
-		cl->quantum = rtab->rate.rate / q->rate2quantum;
-		if (!hopt->quantum && cl->quantum < 1000) {
-			pr_warning(
-			       "HTB: quantum of class %X is small. Consider r2q change.\n",
-			       cl->common.classid);
-			cl->quantum = 1000;
-		}
-		if (!hopt->quantum && cl->quantum > 200000) {
-			pr_warning(
-			       "HTB: quantum of class %X is big. Consider r2q change.\n",
-			       cl->common.classid);
-			cl->quantum = 200000;
-		}
-		if (hopt->quantum)
-			cl->quantum = hopt->quantum;
-		if ((cl->prio = hopt->prio) >= TC_HTB_NUMPRIO)
-			cl->prio = TC_HTB_NUMPRIO - 1;
-	}
-
-	cl->buffer = hopt->buffer;
-	cl->cbuffer = hopt->cbuffer;
-	if (cl->rate)
-		qdisc_put_rtab(cl->rate);
-	cl->rate = rtab;
-	if (cl->ceil)
-		qdisc_put_rtab(cl->ceil);
-	cl->ceil = ctab;
-	sch_tree_unlock(sch);
-
-	qdisc_class_hash_grow(sch, &q->clhash);
-
-	*arg = (unsigned long)cl;
-	return 0;
-
-failure:
-	if (rtab)
-		qdisc_put_rtab(rtab);
-	if (ctab)
-		qdisc_put_rtab(ctab);
-	return err;
-}
-
-static struct tcf_proto **htb_find_tcf(struct Qdisc *sch, unsigned long arg)
-{
-	struct htb_sched *q = qdisc_priv(sch);
-	struct htb_class *cl = (struct htb_class *)arg;
-	struct tcf_proto **fl = cl ? &cl->filter_list : &q->filter_list;
-
-	return fl;
-}
-
-static unsigned long htb_bind_filter(struct Qdisc *sch, unsigned long parent,
-				     u32 classid)
-{
-	struct htb_class *cl = htb_find(classid, sch);
-
-	/*if (cl && !cl->level) return 0;
-	 * The line above used to be there to prevent attaching filters to
-	 * leaves. But at least tc_index filter uses this just to get class
-	 * for other reasons so that we have to allow for it.
-	 * ----
-	 * 19.6.2002 As Werner explained it is ok - bind filter is just
-	 * another way to "lock" the class - unlike "get" this lock can
-	 * be broken by class during destroy IIUC.
-	 */
-	if (cl)
-		cl->filter_cnt++;
-	return (unsigned long)cl;
-}
-
-static void htb_unbind_filter(struct Qdisc *sch, unsigned long arg)
-{
-	struct htb_class *cl = (struct htb_class *)arg;
-
-	if (cl)
-		cl->filter_cnt--;
-}
-
-static void htb_walk(struct Qdisc *sch, struct qdisc_walker *arg)
-{
-	struct htb_sched *q = qdisc_priv(sch);
-	struct htb_class *cl;
-	struct hlist_node *n;
-	unsigned int i;
-
-	if (arg->stop)
-		return;
-
-	for (i = 0; i < q->clhash.hashsize; i++) {
-		hlist_for_each_entry(cl, n, &q->clhash.hash[i], common.hnode) {
-			if (arg->count < arg->skip) {
-				arg->count++;
-				continue;
-			}
-			if (arg->fn(sch, (unsigned long)cl, arg) < 0) {
-				arg->stop = 1;
-				return;
-			}
-			arg->count++;
-		}
-	}
-}
-
-static const struct Qdisc_class_ops htb_class_ops = {
-	.graft		=	htb_graft,
-	.leaf		=	htb_leaf,
-	.qlen_notify	=	htb_qlen_notify,
-	.get		=	htb_get,
-	.put		=	htb_put,
-	.change		=	htb_change_class,
-	.delete		=	htb_delete,
-	.walk		=	htb_walk,
-	.tcf_chain	=	htb_find_tcf,
-	.bind_tcf	=	htb_bind_filter,
-	.unbind_tcf	=	htb_unbind_filter,
-	.dump		=	htb_dump_class,
-	.dump_stats	=	htb_dump_class_stats,
-};
-
-static struct Qdisc_ops htb_qdisc_ops __read_mostly = {
-	.cl_ops		=	&htb_class_ops,
-	.id		=	"htb",
-	.priv_size	=	sizeof(struct htb_sched),
-	.enqueue	=	htb_enqueue,
-	.dequeue	=	htb_dequeue,
-	.peek		=	qdisc_peek_dequeued,
-	.drop		=	htb_drop,
-	.init		=	htb_init,
-	.reset		=	htb_reset,
-	.destroy	=	htb_destroy,
-	.dump		=	htb_dump,
-	.owner		=	THIS_MODULE,
-};
-
-static int __init htb_module_init(void)
-{
-	return register_qdisc(&htb_qdisc_ops);
-}
-static void __exit htb_module_exit(void)
-{
-	unregister_qdisc(&htb_qdisc_ops);
-}
-
-module_init(htb_module_init)
-module_exit(htb_module_exit)
-MODULE_LICENSE("GPL");
diff --git a/util/sysctl_addon b/util/sysctl_addon
deleted file mode 100644
index e26eecc..0000000
--- a/util/sysctl_addon
+++ /dev/null
@@ -1,17 +0,0 @@
-# Mininet: Increase open file limit
-fs.file-max = 100000
-
-# Mininet: increase network buffer space
-net.core.wmem_max = 16777216
-net.core.rmem_max = 16777216
-net.ipv4.tcp_rmem = 10240 87380 16777216
-net.ipv4.tcp_rmem = 10240 87380 16777216
-net.core.netdev_max_backlog = 5000
-
-# Mininet: increase arp cache size
-net.ipv4.neigh.default.gc_thresh1 = 4096 
-net.ipv4.neigh.default.gc_thresh2 = 8192 
-net.ipv4.neigh.default.gc_thresh3 = 16384
-
-# Mininet: increase routing table size
-net.ipv4.route.max_size=32768
diff --git a/util/unpep8 b/util/unpep8
deleted file mode 100644
index 931b217..0000000
--- a/util/unpep8
+++ /dev/null
@@ -1,198 +0,0 @@
-#!/usr/bin/python
-
-"""
-Translate from PEP8 Python style to Mininet (i.e. Arista-like) 
-Python style
-
-usage: unpep8 < old.py > new.py
-
-- Reinstates CapWords for methods and instance variables
-- Gets rid of triple single quotes
-- Eliminates triple quotes on single lines
-- Inserts extra spaces to improve readability
-- Fixes Doxygen (or doxypy) ugliness
-
-Does the following translations:
-
-ClassName.method_name(foo = bar) -> ClassName.methodName( foo=bar )
-
-Triple-single-quotes -> triple-double-quotes
-
-@param foo description -> foo: description
-@return description    -> returns: description
-@author me             -> author: me
-@todo(me)              -> TODO(me)
-
-Bugs/Limitations:
-
-- Hack to restore strings is ugly
-- Multiline strings get mangled
-- Comments are mangled (which is arguably the "right thing" to do, except
-  that, for example, the left hand sides of the above would get translated!)
-- Doesn't eliminate unnecessary backslashes
-- Has no opinion on tab size
-- complicated indented docstrings get flattened
-- We don't (yet) have a filter to generate Doxygen/Doxypy
-- Currently leaves indents on blank comment lines
-- May lead to namespace collisions (e.g. some_thing and someThing)
-
-Bob Lantz, rlantz@cs.stanford.edu
-1/24/2010
-"""
-
-import re, sys
-
-def fixUnderscoreTriplet( match ):
-   "Translate a matched triplet of the form a_b to aB."
-   triplet = match.group()
-   return triplet[ :-2 ] + triplet[ -1 ].capitalize()
-
-def reinstateCapWords( text ):
-   underscoreTriplet = re.compile( r'[A-Za-z0-9]_[A-Za-z0-9]' )
-   return underscoreTriplet.sub( fixUnderscoreTriplet, text )
- 
-def replaceTripleApostrophes( text ):
-   "Replace triple apostrophes with triple quotes."
-   return text.replace( "'''", '"""')
-
-def simplifyTripleQuotes( text ):
-   "Fix single-line doc strings."
-   r = re.compile( r'"""([^\"\n]+)"""' )
-   return r.sub( r'"\1"', text )
-   
-def insertExtraSpaces( text ):
-   "Insert extra spaces inside of parentheses and brackets/curly braces."
-   lparen = re.compile( r'\((?![\s\)])' )
-   text = lparen.sub( r'( ', text )
-   rparen = re.compile( r'([^\s\(])(?=\))' )
-   text = rparen.sub( r'\1 ', text)
-   # brackets
-   lbrack = re.compile( r'\[(?![\s\]])' )
-   text = lbrack.sub( r'[ ', text )
-   rbrack = re.compile( r'([^\s\[])(?=\])' )
-   text = rbrack.sub( r'\1 ', text)
-   # curly braces
-   lcurly = re.compile( r'\{(?![\s\}])' )
-   text = lcurly.sub( r'{ ', text )
-   rcurly = re.compile( r'([^\s\{])(?=\})' )
-   text = rcurly.sub( r'\1 ', text)   
-   return text
-   
-def fixDoxygen( text ):
-   """Translate @param foo to foo:, @return bar to returns: bar, and
-      @author me to author: me"""
-   param = re.compile( r'@param (\w+)' )
-   text = param.sub( r'\1:', text )
-   returns = re.compile( r'@return' )
-   text = returns.sub( r'returns:', text )
-   author = re.compile( r'@author' )
-   text = author.sub( r'author:', text)
-   # @todo -> TODO
-   text = text.replace( '@todo', 'TODO' )
-   return text
-
-def removeCommentFirstBlankLine( text ):
-   "Remove annoying blank lines after first line in comments."
-   line = re.compile( r'("""[^\n]*\n)\s*\n', re.MULTILINE )
-   return line.sub( r'\1', text )
-   
-def fixArgs( match, kwarg = re.compile( r'(\w+) = ' ) ):
-   "Replace foo = bar with foo=bar."
-   return kwarg.sub( r'\1=', match.group() )
-   
-def fixKeywords( text ):
-   "Change keyword argumentsfrom foo = bar to foo=bar."
-   args = re.compile( r'\(([^\)]+)\)', re.MULTILINE )
-   return args.sub( fixArgs, text )
-
-# Unfortunately, Python doesn't natively support balanced or recursive
-# regular expressions. We could use PyParsing, but that opens another can
-# of worms. For now, we just have a cheap hack to restore strings,
-# so we don't end up accidentally mangling things like messages, search strings,
-# and regular expressions.
-
-def lineIter( text ):
-   "Simple iterator over lines in text."
-   for line in text.splitlines(): yield line
-   
-def stringIter( strList ):
-   "Yield strings in strList."
-   for s in strList: yield s
-
-def restoreRegex( regex, old, new ):
-   "Find regexes in old and restore them into new."
-   oldStrs = regex.findall( old )
-   # Sanity check - count should be the same!
-   newStrs = regex.findall( new )
-   assert len( oldStrs ) == len( newStrs )
-   # Replace newStrs with oldStrs
-   siter = stringIter( oldStrs )
-   reps = lambda dummy: siter.next()
-   return regex.sub( reps, new )
-
-# This is a cheap hack, and it may not work 100%, since
-# it doesn't handle multiline strings.
-# However, it should be mostly harmless...
-   
-def restoreStrings( oldText, newText ):
-   "Restore strings from oldText into newText, returning result."
-   oldLines, newLines = lineIter( oldText ), lineIter( newText )
-   quoteStrings = re.compile( r'("[^"]*")' )
-   tickStrings = re.compile( r"('[^']*')" )
-   result = ''
-   # It would be nice if we could blast the whole file, but for
-   # now it seems to work line-by-line
-   for newLine in newLines:
-      oldLine = oldLines.next()
-      newLine = restoreRegex( quoteStrings, oldLine, newLine )
-      newLine = restoreRegex( tickStrings, oldLine, newLine )
-      result += newLine + '\n'
-   return result
-   
-# This might be slightly controversial, since it uses
-# three spaces to line up multiline comments. However,
-# I much prefer it. Limitations: if you have deeper
-# indents in comments, they will be eliminated. ;-(
-
-def fixComment( match, 
-   indentExp=re.compile( r'\n([ ]*)(?=[^/s])', re.MULTILINE ),
-   trailingQuotes=re.compile( r'\s+"""' ) ):
-   "Re-indent comment, and join trailing quotes."
-   originalIndent = match.group( 1 )
-   comment = match.group( 2 )
-   indent = '\n' + originalIndent
-   # Exception: leave unindented things unindented!
-   if len( originalIndent ) is not 0: indent += '   '
-   comment = indentExp.sub( indent, comment )
-   return originalIndent + trailingQuotes.sub( '"""', comment )
-   
-def fixCommentIndents( text ):
-   "Fix multiline comment indentation."
-   comments = re.compile( r'^([ ]*)("""[^"]*""")$', re.MULTILINE )
-   return comments.sub( fixComment, text )
- 
-def removeBogusLinefeeds( text ):
-   "Remove extra linefeeds at the end of single-line comments."
-   bogusLfs = re.compile( r'"([^"\n]*)\n"', re.MULTILINE )
-   return bogusLfs.sub( '"\1"', text)
-   
-def convertFromPep8( program ):
-   oldProgram = program
-   # Program text transforms
-   program = reinstateCapWords( program )
-   program = fixKeywords( program )
-   program = insertExtraSpaces( program )
-   # Undo string damage
-   program = restoreStrings( oldProgram, program )
-   # Docstring transforms
-   program = replaceTripleApostrophes( program )
-   program = simplifyTripleQuotes( program )
-   program = fixDoxygen( program )
-   program = fixCommentIndents( program )
-   program = removeBogusLinefeeds( program )
-   # Destructive transforms (these can delete lines)
-   program = removeCommentFirstBlankLine( program )
-   return program
-
-if __name__ == '__main__':
-   print convertFromPep8( sys.stdin.read() )
\ No newline at end of file
diff --git a/util/versioncheck.py b/util/versioncheck.py
deleted file mode 100644
index d9e5483..0000000
--- a/util/versioncheck.py
+++ /dev/null
@@ -1,24 +0,0 @@
-#!/usr/bin/python
-
-from subprocess import check_output as co
-from sys import exit
-
-# Actually run bin/mn rather than importing via python path
-version = 'Mininet ' + co( 'PYTHONPATH=. bin/mn --version', shell=True )
-version = version.strip()
-
-# Find all Mininet path references
-lines = co( "grep -or 'Mininet \w\.\w\.\w\w*' *", shell=True )
-
-error = False
-
-for line in lines.split( '\n' ):
-    if line and 'Binary' not in line:
-        fname, fversion = line.split( ':' )
-        if version != fversion:
-            print "%s: incorrect version '%s' (should be '%s')" % (
-                fname, fversion, version )
-            error = True
-
-if error:
-    exit( 1 )
diff --git a/util/vm/.bash_profile b/util/vm/.bash_profile
deleted file mode 100644
index 9935934..0000000
--- a/util/vm/.bash_profile
+++ /dev/null
@@ -1,24 +0,0 @@
-SSH_ENV="$HOME/.ssh/environment"
-
-function start_agent {
-     echo "Initialising new SSH agent..."
-     /usr/bin/ssh-agent | sed 's/^echo/#echo/' > "${SSH_ENV}"
-     echo succeeded
-     chmod 600 "${SSH_ENV}"
-     . "${SSH_ENV}" > /dev/null
-     /usr/bin/ssh-add;
-}
-
-# Source SSH settings, if applicable
-
-if [ -f "${SSH_ENV}" ]; then
-     . "${SSH_ENV}" > /dev/null
-     #ps ${SSH_AGENT_PID} doesn't work under cywgin
-     ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || {
-         start_agent;
-     }
-else
-     start_agent;
-fi
-
-source ~/.bashrc
diff --git a/util/vm/install-mininet-vm.sh b/util/vm/install-mininet-vm.sh
deleted file mode 100644
index 382945e..0000000
--- a/util/vm/install-mininet-vm.sh
+++ /dev/null
@@ -1,40 +0,0 @@
-#!/bin/bash
-
-# This script is intended to install Mininet into
-# a brand-new Ubuntu virtual machine,
-# to create a fully usable "tutorial" VM.
-set -e
-echo `whoami` ALL=NOPASSWD: ALL | sudo tee -a /etc/sudoers
-sudo sed -i -e 's/Default/#Default/' /etc/sudoers
-sudo sed -i -e 's/ubuntu/mininet-vm/' /etc/hostname
-sudo sed -i -e 's/ubuntu/mininet-vm/g' /etc/hosts
-sudo hostname `cat /etc/hostname`
-sudo sed -i -e 's/quiet splash/text/' /etc/default/grub
-sudo update-grub
-sudo sed -i -e 's/us.archive.ubuntu.com/mirrors.kernel.org/' \
-	/etc/apt/sources.list
-sudo apt-get update
-# Clean up vmware easy install junk if present
-if [ -e /etc/issue.backup ]; then
-    sudo mv /etc/issue.backup /etc/issue
-fi
-if [ -e /etc/rc.local.backup ]; then
-    sudo mv /etc/rc.local.backup /etc/rc.local
-fi
-# Install Mininet
-sudo apt-get -y install git-core openssh-server
-git clone git://github.com/mininet/mininet
-cd mininet
-cd
-time mininet/util/install.sh
-# Ignoring this since NOX classic is deprecated
-#if ! grep NOX_CORE_DIR .bashrc; then
-#  echo "export NOX_CORE_DIR=~/noxcore/build/src/" >> .bashrc
-#fi
-echo <<EOF
-You may need to reboot and then:
-sudo dpkg-reconfigure openvswitch-datapath-dkms
-sudo service openvswitch-switch start
-EOF
-
-