CORD-433 Add virtual fabric to CiaB

Change-Id: I8fbea8c85f309a4c226951e0cde96a9b7394d6eb
diff --git a/scripts/cord-in-a-box.sh b/scripts/cord-in-a-box.sh
index 915eed4..bd9c997 100755
--- a/scripts/cord-in-a-box.sh
+++ b/scripts/cord-in-a-box.sh
@@ -11,6 +11,11 @@
 REPO_BRANCH="master"
 VERSION_STRING="CiaB development version"
 
+function add_box() {
+  vagrant box list | grep $1 | grep virtualbox || vagrant box add $1
+  vagrant box list | grep $1 | grep libvirt || vagrant mutate $1 libvirt --input-provider virtualbox
+}
+
 function cleanup_from_previous_test() {
   echo "## Cleanup ##"
 
@@ -60,8 +65,7 @@
   cd $CORDDIR/build
   vagrant plugin list | grep vagrant-libvirt || vagrant plugin install vagrant-libvirt --plugin-version 0.0.35
   vagrant plugin list | grep vagrant-mutate || vagrant plugin install vagrant-mutate
-  vagrant box list ubuntu/trusty64 | grep virtualbox || vagrant box add ubuntu/trusty64
-  vagrant box list ubuntu/trusty64 | grep libvirt || vagrant mutate ubuntu/trusty64 libvirt --input-provider virtualbox
+  add_box ubuntu/trusty64
 }
 
 function cloudlab_setup() {
@@ -126,25 +130,58 @@
   ssh prod "sudo chown -R maas:maas ~maas/.ssh"
 }
 
+function turn_off_learning () {
+  NET=$1
+  BRIDGE=`sudo virsh net-info $NET|grep "Bridge:"|awk '{print $2}'`
+  sudo brctl setageing $BRIDGE 0
+  sudo brctl stp $BRIDGE off
+}
+
+function leaf_spine_up() {
+  cd $CORDDIR/build
+
+  if [[ $FABRIC -ne 0 ]]
+  then
+      sudo su $USER -c "FABRIC=$FABRIC vagrant up leaf-1 leaf-2 spine-1 spine-2 --provider libvirt"
+  else
+      # Linux bridging seems to be having issues with two spine switches
+      sudo su $USER -c "FABRIC=$FABRIC vagrant up leaf-1 leaf-2 spine-1 --provider libvirt"
+  fi
+
+  # Turn off MAC learning on "links" -- i.e., bridges created by libvirt.
+  # Without this, sometimes packets are dropped because the bridges
+  # think they are not local -- this needs further investigation.
+  # A better solution might be to replace the bridges with UDP tunnels, but this
+  # is not supported with the version of libvirt available on Ubuntu 14.04.
+  turn_off_learning head-node-leaf-1
+  turn_off_learning compute-node-1-leaf-1
+  turn_off_learning compute-node-2-leaf-2
+  turn_off_learning compute-node-3-leaf-2
+  turn_off_learning leaf-1-spine-1
+  turn_off_learning leaf-1-spine-2
+  turn_off_learning leaf-2-spine-1
+  turn_off_learning leaf-2-spine-2
+}
+
 function add_compute_node() {
   echo add_compute_node: $1 $2
 
   cd $CORDDIR/build
   sudo su $USER -c "vagrant up $1 --provider libvirt"
 
-  # Change MAC address of bridge to match cord-pod service profile
-  # This change won't survive a reboot
-  BRIDGE=$( route -n | grep 10.6.1.0 | awk '{print $8}' )
-  sudo ifconfig $BRIDGE hw ether 02:42:0a:06:01:01
-
-  ip addr list | grep 10.6.1.129 || sudo ip address add 10.6.1.129 dev $BRIDGE
-  ip addr list | grep 10.6.1.193 || sudo ip address add 10.6.1.193 dev $BRIDGE
-
   # Set up power cycling for the compute node and wait for it to be provisioned
   ssh prod "cd /cord/build/ansible; ansible-playbook maas-provision.yml --extra-vars \"maas_user=maas vagrant_name=$2\""
 
   echo ""
-  echo "compute_node is fully provisioned!"
+  echo "$1 is fully provisioned!"
+}
+
+function initialize_fabric() {
+  echo "Initializing fabric"
+  ssh prod "cd /cord/build/platform-install; ansible-playbook -i /etc/maas/ansible/pod-inventory cord-refresh-fabric.yml"
+
+  echo "Fabric ping test"
+  ssh prod "cd /cord/build/platform-install; ansible-playbook -i /etc/maas/ansible/pod-inventory cord-fabric-pingtest.yml"
 }
 
 function run_e2e_test () {
@@ -168,11 +205,12 @@
 SETUP_ONLY=0
 DIAGNOSTICS=0
 CLEANUP=0
+FABRIC=0
 #By default, cord-in-a-box creates 1 compute node. If more than one compute is
 #needed, use -n option
 NUM_COMPUTE_NODES=1
 
-while getopts "b:cdhn:stv" opt; do
+while getopts "b:cdfhn:stv" opt; do
   case ${opt} in
     b ) GERRIT_BRANCHES+=("$OPTARG")
       ;;
@@ -180,12 +218,15 @@
       ;;
     d ) DIAGNOSTICS=1
       ;;
+    f ) FABRIC=1
+      ;;
     h ) echo "Usage:"
       echo "    $0                install OpenStack and prep XOS and ONOS VMs [default]"
       echo "    $0 -b <project:changeset/revision>  checkout a changesets from gerrit. Can"
       echo "                      be used multiple times."
       echo "    $0 -c             cleanup from previous test"
       echo "    $0 -d             run diagnostic collector"
+      echo "    $0 -f             use ONOS fabric (EXPERIMENTAL)"
       echo "    $0 -h             display this help message"
       echo "    $0 -n #           number of compute nodes to setup. Currently max 2 nodes can be supported"
       echo "    $0 -s             run initial setup phase only (don't start building CORD)"
@@ -230,22 +271,25 @@
 
 install_head_node
 set_up_maas_user
+leaf_spine_up
 
-#Limiting the maximum number of compute nodes that can be supported to 2. If
-#more than 2 compute nodes are needed, this script need to be enhanced to set
-#the environment variable NUM_COMPUTE_NODES before invoking the Vagrant commands
-if [[ $NUM_COMPUTE_NODES -gt 2 ]]
+if [[ $NUM_COMPUTE_NODES -gt 3 ]]
 then
-   echo "currently max only two compute nodes can be supported..."
-   NUM_COMPUTE_NODES=2
+   echo "currently max only three compute nodes can be supported..."
+   NUM_COMPUTE_NODES=3
 fi
 
 for i in `seq 1 $NUM_COMPUTE_NODES`;
 do
    echo adding the compute node: compute-node-$i
-   add_compute_node compute_node-$i build_compute_node-$i
+   add_compute_node compute-node-$i build_compute-node-$i
 done
 
+if [[ $FABRIC -ne 0 ]]
+then
+  initialize_fabric
+fi
+
 if [[ $RUN_TEST -eq 1 ]]
 then
   run_e2e_test
diff --git a/scripts/install.sh b/scripts/install.sh
new file mode 100755
index 0000000..9f29807
--- /dev/null
+++ b/scripts/install.sh
@@ -0,0 +1,800 @@
+#!/usr/bin/env bash
+
+# Mininet install script for Ubuntu (and Debian Wheezy+)
+# Brandon Heller (brandonh@stanford.edu)
+
+# Fail on error
+set -e
+
+# Fail on unset var usage
+set -o nounset
+
+# Get directory containing mininet folder
+MININET_DIR="$( cd -P "$( dirname "${BASH_SOURCE[0]}" )/../.." && pwd -P )"
+
+# Set up build directory, which by default is the working directory
+#  unless the working directory is a subdirectory of mininet, 
+#  in which case we use the directory containing mininet
+BUILD_DIR="$(pwd -P)"
+case $BUILD_DIR in
+  $MININET_DIR/*) BUILD_DIR=$MININET_DIR;; # currect directory is a subdirectory
+  *) BUILD_DIR=$BUILD_DIR;;
+esac
+
+# 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
+fi
+test -e /etc/fedora-release && DIST="Fedora"
+if [ "$DIST" = "Fedora" ]; then
+    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
+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
+
+KERNEL_NAME=`uname -r`
+KERNEL_HEADERS=kernel-headers-${KERNEL_NAME}
+
+if ! echo $DIST | egrep 'Ubuntu|Debian|Fedora'; then
+    echo "Install.sh currently only supports Ubuntu, Debian and Fedora."
+    exit 1
+fi
+
+# More distribution info
+DIST_LC=`echo $DIST | tr [A-Z] [a-z]` # as lower case
+
+
+# Determine whether version $1 >= version $2
+# usage: if version_ge 1.20 1.2.3; then echo "true!"; fi
+function version_ge {
+    # sort -V sorts by *version number*
+    latest=`printf "$1\n$2" | sort -V | tail -1`
+    # If $1 is latest version, then $1 >= $2
+    [ "$1" == "$latest" ]
+}
+
+
+# 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_TAG=v$OVS_RELEASE
+
+OF13_SWITCH_REV=${OF13_SWITCH_REV:-""}
+
+
+function kernel {
+    echo "Install Mininet-compatible kernel if necessary"
+    sudo apt-get update
+    if ! $install linux-image-$KERNEL_NAME; then
+        echo "Could not install linux-image-$KERNEL_NAME"
+        echo "Skipping - assuming installed kernel is OK."
+    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 $HOME/linux-headers-* $HOME/linux-image-*
+}
+
+# Install Mininet deps
+function mn_deps {
+    echo "Installing Mininet dependencies"
+    if [ "$DIST" = "Fedora" ]; then
+        $install gcc make socat psmisc xterm openssh-clients iperf \
+            iproute telnet python-setuptools libcgroup-tools \
+            ethtool help2man pyflakes pylint python-pep8
+    else
+        $install gcc make socat psmisc xterm ssh iperf iproute telnet \
+            python-setuptools cgroup-bin ethtool help2man \
+            pyflakes pylint pep8
+    fi
+
+    echo "Installing Mininet core"
+    pushd $MININET_DIR/mininet
+    sudo make install
+    popd
+}
+
+# Install Mininet developer dependencies
+function mn_dev {
+    echo "Installing Mininet developer dependencies"
+    $install doxygen doxypy texlive-fonts-recommended
+    if ! $install doxygen-latex; then
+        echo "doxygen-latex not needed"
+    fi
+}
+
+# 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
+function of {
+    echo "Installing OpenFlow reference implementation..."
+    cd $BUILD_DIR
+    $install autoconf automake libtool make gcc
+    if [ "$DIST" = "Fedora" ]; then
+        $install git pkgconfig glibc-devel
+    else
+        $install git-core autotools-dev pkg-config libc6-dev
+    fi
+    git clone git://openflowswitch.org/openflow.git
+    cd $BUILD_DIR/openflow
+
+    # Patch controller to handle more than 16 switches
+    patch -p1 < $MININET_DIR/mininet/util/openflow-patches/controller.patch
+
+    # Resume the install:
+    ./boot.sh
+    ./configure
+    make
+    sudo make install
+    cd $BUILD_DIR
+}
+
+function of13 {
+    echo "Installing OpenFlow 1.3 soft switch implementation..."
+    cd $BUILD_DIR/
+    $install  git-core autoconf automake autotools-dev pkg-config \
+        make gcc g++ libtool libc6-dev cmake libpcap-dev libxerces-c2-dev  \
+        unzip libpcre3-dev flex bison libboost-dev
+
+    if [ ! -d "ofsoftswitch13" ]; then
+        git clone https://github.com/CPqD/ofsoftswitch13.git
+        if [[ -n "$OF13_SWITCH_REV" ]]; then
+            cd ofsoftswitch13
+            git checkout ${OF13_SWITCH_REV}
+            cd ..
+        fi
+    fi
+
+    # Install netbee
+    if [ "$DIST" = "Ubuntu" ] && version_ge $RELEASE 14.04; then
+        NBEESRC="nbeesrc-feb-24-2015"
+        NBEEDIR="netbee"
+    else
+        NBEESRC="nbeesrc-jan-10-2013"
+        NBEEDIR="nbeesrc-jan-10-2013"
+    fi
+
+    NBEEURL=${NBEEURL:-http://www.nbee.org/download/}
+    wget -nc ${NBEEURL}${NBEESRC}.zip
+    unzip ${NBEESRC}.zip
+    cd ${NBEEDIR}/src
+    cmake .
+    make
+    cd $BUILD_DIR/
+    sudo cp ${NBEEDIR}/bin/libn*.so /usr/local/lib
+    sudo ldconfig
+    sudo cp -R ${NBEEDIR}/include/ /usr/
+
+    # Resume the install:
+    cd $BUILD_DIR/ofsoftswitch13
+    ./boot.sh
+    ./configure
+    make
+    sudo make install
+    cd $BUILD_DIR
+}
+
+
+function install_wireshark {
+    if ! which wireshark; then
+        echo "Installing Wireshark"
+        if [ "$DIST" = "Fedora" ]; then
+            $install wireshark wireshark-gnome
+        else
+            $install wireshark tshark
+        fi
+    fi
+
+    # Copy coloring rules: OF is white-on-blue:
+    echo "Optionally installing wireshark color filters"
+    mkdir -p $HOME/.wireshark
+    cp -n $MININET_DIR/mininet/util/colorfilters $HOME/.wireshark
+
+    echo "Checking Wireshark version"
+    WSVER=`wireshark -v | egrep -o '[0-9\.]+' | head -1`
+    if version_ge $WSVER 1.12; then
+        echo "Wireshark version $WSVER >= 1.12 - returning"
+        return
+    fi
+
+    echo "Cloning LoxiGen and building openflow.lua dissector"
+    cd $BUILD_DIR
+    git clone https://github.com/floodlight/loxigen.git
+    cd loxigen
+    make wireshark
+
+    # Copy into plugin directory
+    # libwireshark0/ on 11.04; libwireshark1/ on later
+    WSDIR=`find /usr/lib -type d -name 'libwireshark*' | head -1`
+    WSPLUGDIR=$WSDIR/plugins/
+    PLUGIN=loxi_output/wireshark/openflow.lua
+    sudo cp $PLUGIN $WSPLUGDIR
+    echo "Copied openflow plugin $PLUGIN to $WSPLUGDIR"
+
+    cd $BUILD_DIR
+}
+
+
+# Install Open vSwitch specific version Ubuntu package
+function ubuntuOvs {
+    echo "Creating and Installing Open vSwitch packages..."
+
+    OVS_SRC=$BUILD_DIR/openvswitch
+    OVS_TARBALL_LOC=http://openvswitch.org/releases
+
+    if ! echo "$DIST" | egrep "Ubuntu|Debian" > /dev/null; then
+        echo "OS must be Ubuntu or Debian"
+        $cd BUILD_DIR
+        return
+    fi
+    if [ "$DIST" = "Ubuntu" ] && ! version_ge $RELEASE 12.04; then
+        echo "Ubuntu version must be >= 12.04"
+        cd $BUILD_DIR
+        return
+    fi
+    if [ "$DIST" = "Debian" ] && ! version_ge $RELEASE 7.0; then
+        echo "Debian version must be >= 7.0"
+        cd $BUILD_DIR
+        return
+    fi
+
+    rm -rf $OVS_SRC
+    mkdir -p $OVS_SRC
+    cd $OVS_SRC
+
+    if wget $OVS_TARBALL_LOC/openvswitch-$OVS_RELEASE.tar.gz 2> /dev/null; then
+        tar xzf openvswitch-$OVS_RELEASE.tar.gz
+    else
+        echo "Failed to find OVS at $OVS_TARBALL_LOC/openvswitch-$OVS_RELEASE.tar.gz"
+        cd $BUILD_DIR
+        return
+    fi
+
+    # Remove any old packages
+    $remove openvswitch-common openvswitch-datapath-dkms openvswitch-controller \
+            openvswitch-pki openvswitch-switch
+
+    # Get build deps
+    $install build-essential fakeroot debhelper autoconf automake libssl-dev \
+             pkg-config bzip2 openssl python-all procps python-qt4 \
+             python-zopeinterface python-twisted-conch dkms
+
+    # Build OVS
+    cd $BUILD_DIR/openvswitch/openvswitch-$OVS_RELEASE
+            DEB_BUILD_OPTIONS='parallel=2 nocheck' fakeroot debian/rules binary
+    cd ..
+    $pkginst openvswitch-common_$OVS_RELEASE*.deb openvswitch-datapath-dkms_$OVS_RELEASE*.deb \
+             openvswitch-pki_$OVS_RELEASE*.deb openvswitch-switch_$OVS_RELEASE*.deb
+    if $pkginst openvswitch-controller_$OVS_RELEASE*.deb; then
+        echo "Ignoring error installing openvswitch-controller"
+    fi
+
+    modinfo openvswitch
+    sudo ovs-vsctl show
+    # Switch can run on its own, but
+    # Mininet should control the controller
+    # This appears to only be an issue on Ubuntu/Debian
+    if sudo service openvswitch-controller stop; then
+        echo "Stopped running controller"
+    fi
+    if [ -e /etc/init.d/openvswitch-controller ]; then
+        sudo update-rc.d openvswitch-controller disable
+    fi
+}
+
+
+# Install Open vSwitch
+
+function ovs {
+    echo "Installing Open vSwitch..."
+
+    if [ "$DIST" == "Fedora" ]; then
+        $install openvswitch openvswitch-controller
+        return
+    fi
+
+    if [ "$DIST" = "Ubuntu" ] && ! version_ge $RELEASE 14.04; then
+        # Older Ubuntu versions need openvswitch-datapath/-dkms
+        # Manually installing openvswitch-datapath may be necessary
+        # for manually built kernel .debs using Debian's defective kernel
+        # packaging, which doesn't yield usable headers.
+        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
+    fi
+
+    $install openvswitch-switch
+    if $install openvswitch-controller; then
+        # Switch can run on its own, but
+        # Mininet should control the controller
+        # This appears to only be an issue on Ubuntu/Debian
+        if sudo service openvswitch-controller stop; then
+            echo "Stopped running controller"
+        fi
+        if [ -e /etc/init.d/openvswitch-controller ]; then
+            sudo update-rc.d openvswitch-controller disable
+        fi
+    else
+        echo "Attempting to install openvswitch-testcontroller"
+        if ! $install openvswitch-testcontroller; then
+            echo "Failed - skipping openvswitch-testcontroller"
+        fi
+    fi
+
+}
+
+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"
+}
+
+function ivs {
+    echo "Installing Indigo Virtual Switch..."
+
+    IVS_SRC=$BUILD_DIR/ivs
+
+    # Install dependencies
+    $install git pkg-config gcc make libnl-3-dev libnl-route-3-dev libnl-genl-3-dev
+
+    # Install IVS from source
+    cd $BUILD_DIR
+    git clone git://github.com/floodlight/ivs $IVS_SRC --recursive
+    cd $IVS_SRC
+    make
+    sudo make install
+}
+
+# Install RYU
+function ryu {
+    echo "Installing RYU..."
+
+    # install Ryu dependencies"
+    $install autoconf automake g++ libtool python make
+    if [ "$DIST" = "Ubuntu" ]; then
+        $install libxml2 libxslt-dev python-pip python-dev
+        sudo pip install gevent
+    elif [ "$DIST" = "Debian" ]; then
+        $install libxml2 libxslt-dev python-pip python-dev
+        sudo pip install gevent
+    fi
+
+    # if needed, update python-six
+    SIX_VER=`pip show six | grep Version | awk '{print $2}'`
+    if version_ge 1.7.0 $SIX_VER; then
+        echo "Installing python-six version 1.7.0..."
+        sudo pip install -I six==1.7.0
+    fi
+    # fetch RYU
+    cd $BUILD_DIR/
+    git clone git://github.com/osrg/ryu.git ryu
+    cd ryu
+
+    # install ryu
+    sudo python ./setup.py install
+
+    # Add symbolic link to /usr/bin
+    sudo ln -s ./bin/ryu-manager /usr/local/bin/ryu-manager
+}
+
+# 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 $BUILD_DIR/
+    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 $MININET_DIR/mininet/util/nox-patches/*tutorial-port-nox-destiny*.patch
+    if [ "$DIST" = "Ubuntu" ] && version_ge $RELEASE 12.04; then
+        git am $MININET_DIR/mininet/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=$BUILD_DIR/noxcore/build/src|' ~/.bashrc
+
+    # To verify this install:
+    #cd ~/noxcore/build/src
+    #./nox_core -v -i ptcp:
+}
+
+# Install NOX Classic/Zaku for OpenFlow 1.3
+function nox13 {
+    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
+
+    # Fetch NOX destiny
+    cd $BUILD_DIR/
+    git clone https://github.com/CPqD/nox13oflib.git
+    cd nox13oflib
+
+    # Build
+    ./boot.sh
+    mkdir build
+    cd build
+    ../configure
+    make -j3
+    #make check
+
+    # To verify this install:
+    #cd ~/nox13oflib/build/src
+    #./nox_core -v -i ptcp:
+}
+
+
+# "Install" POX
+function pox {
+    echo "Installing POX into $BUILD_DIR/pox..."
+    cd $BUILD_DIR
+    git clone https://github.com/noxrepo/pox.git
+}
+
+# Install OFtest
+function oftest {
+    echo "Installing oftest..."
+
+    # Install deps:
+    $install tcpdump python-scapy
+
+    # Install oftest:
+    cd $BUILD_DIR/
+    git clone git://github.com/floodlight/oftest
+}
+
+# Install cbench
+function cbench {
+    echo "Installing cbench..."
+
+    if [ "$DIST" = "Fedora" ]; then
+        $install net-snmp-devel libpcap-devel libconfig-devel
+    else
+        $install libsnmp-dev libpcap-dev libconfig-dev
+    fi
+    cd $BUILD_DIR/
+    git clone git://gitosis.stanford.edu/oflops.git
+    cd oflops
+    sh boot.sh || true # possible error in autoreconf, so run twice
+    sh boot.sh
+    ./configure --with-openflow-src-dir=$BUILD_DIR/openflow
+    make
+    sudo make install || true # make install fails; force past this
+}
+
+function vm_other {
+    echo "Doing other Mininet VM setup tasks..."
+
+    # Remove avahi-daemon, which may cause unwanted discovery packets to be
+    # sent during tests, near link status changes:
+    echo "Removing avahi-daemon"
+    $remove avahi-daemon
+
+    # was: Disable IPv6.  Add to /etc/modprobe.d/blacklist:
+    #echo "Attempting to disable IPv6"
+    #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"
+    echo "Disabling IPv6"
+    # Disable IPv6
+    if ! grep 'disable_ipv6' /etc/sysctl.conf; then
+        echo 'Disabling IPv6'
+        echo '
+# Mininet: disable IPv6
+net.ipv6.conf.all.disable_ipv6 = 1
+net.ipv6.conf.default.disable_ipv6 = 1
+net.ipv6.conf.lo.disable_ipv6 = 1' | sudo tee -a /etc/sysctl.conf > /dev/null
+    fi
+    # Since the above doesn't disable neighbor discovery, also do this:
+    if ! grep 'ipv6.disable' /etc/default/grub; then
+        sudo sed -i -e \
+        's/GRUB_CMDLINE_LINUX_DEFAULT="/GRUB_CMDLINE_LINUX_DEFAULT="ipv6.disable=1 /' \
+        /etc/default/grub
+        sudo update-grub
+    fi
+    # Disabling IPv6 breaks X11 forwarding via ssh
+    line='AddressFamily inet'
+    file='/etc/ssh/sshd_config'
+    echo "Adding $line to $file"
+    if ! grep "$line" $file > /dev/null; then
+        echo "$line" | sudo tee -a $file > /dev/null
+    fi
+
+    # Enable command auto completion using sudo; modify ~/.bashrc:
+    sed -i -e 's|# for examples$|&\ncomplete -cf sudo|' ~/.bashrc
+
+    # Install tcpdump, cmd-line packet dump tool.  Also install gitk,
+    # a graphical git history viewer.
+    $install tcpdump gitk
+
+    # Install common text editors
+    $install vim nano emacs
+
+    # Install NTP
+    $install ntp
+
+    # Install vconfig for VLAN example
+    if [ "$DIST" = "Fedora" ]; then
+        $install vconfig
+    else
+        $install vlan
+    fi
+
+    # 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..."
+    set +o nounset
+    if [ -z "$OVS_KMODS" ]; then
+      echo "OVS_KMODS not set. Aborting."
+    else
+      sudo cp $OVS_KMODS $DRIVERS_DIR
+      sudo depmod -a ${KERNEL_NAME}
+    fi
+    set -o nounset
+}
+
+function all {
+    if [ "$DIST" = "Fedora" ]; then
+        printf "\nFedora 18+ support (still work in progress):\n"
+        printf " * Fedora 18+ has kernel 3.10 RPMS in the updates repositories\n"
+        printf " * Fedora 18+ has openvswitch 1.10 RPMS in the updates repositories\n"
+        printf " * the install.sh script options [-bfnpvw] should work.\n"
+        printf " * for a basic setup just try:\n"
+        printf "       install.sh -fnpv\n\n"
+        exit 3
+    fi
+    echo "Installing all packages except for -eix (doxypy, ivs, nox-classic)..."
+    kernel
+    mn_deps
+    # Skip mn_dev (doxypy/texlive/fonts/etc.) because it's huge
+    # mn_dev
+    of
+    install_wireshark
+    ovs
+    # We may add ivs once it's more mature
+    # ivs
+    # NOX-classic is deprecated, but you can install it manually if desired.
+    # nox
+    pox
+    oftest
+    cbench
+    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 apt-get autoremove
+    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"
+
+    # Note: you can shrink the .vmdk in vmware using
+    # vmware-vdiskmanager -k *.vmdk
+    echo "Zeroing out disk blocks for efficient compaction..."
+    time sudo dd if=/dev/zero of=/tmp/zero bs=1M
+    sync ; sleep 1 ; sync ; sudo rm -f /tmp/zero
+
+}
+
+function usage {
+    printf '\nUsage: %s [-abcdfhikmnprtvVwxy03]\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 11.10+\n' >&2
+    printf '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 -- ' -e: install Mininet d(E)veloper dependencies\n' >&2
+    printf -- ' -f: install Open(F)low\n' >&2
+    printf -- ' -h: print this (H)elp message\n' >&2
+    printf -- ' -i: install (I)ndigo Virtual Switch\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 -- ' -p: install (P)OX OpenFlow Controller\n' >&2
+    printf -- ' -r: remove existing Open vSwitch packages\n' >&2
+    printf -- ' -s <dir>: place dependency (S)ource/build trees in <dir>\n' >&2
+    printf -- ' -t: complete o(T)her Mininet VM setup tasks\n' >&2
+    printf -- ' -v: install Open (V)switch\n' >&2
+    printf -- ' -V <version>: install a particular version of Open (V)switch on Ubuntu\n' >&2
+    printf -- ' -w: install OpenFlow (W)ireshark dissector\n' >&2
+    printf -- ' -y: install R(y)u Controller\n' >&2
+    printf -- ' -x: install NO(X) Classic OpenFlow controller\n' >&2
+    printf -- ' -0: (default) -0[fx] installs OpenFlow 1.0 versions\n' >&2
+    printf -- ' -3: -3[fx] installs OpenFlow 1.3 versions\n' >&2
+    exit 2
+}
+
+OF_VERSION=1.0
+
+if [ $# -eq 0 ]
+then
+    all
+else
+    while getopts 'abcdefhikmnprs:tvV:wxy03' OPTION
+    do
+      case $OPTION in
+      a)    all;;
+      b)    cbench;;
+      c)    kernel_clean;;
+      d)    vm_clean;;
+      e)    mn_dev;;
+      f)    case $OF_VERSION in
+            1.0) of;;
+            1.3) of13;;
+            *)  echo "Invalid OpenFlow version $OF_VERSION";;
+            esac;;
+      h)    usage;;
+      i)    ivs;;
+      k)    kernel;;
+      m)    modprobe;;
+      n)    mn_deps;;
+      p)    pox;;
+      r)    remove_ovs;;
+      s)    mkdir -p $OPTARG; # ensure the directory is created
+            BUILD_DIR="$( cd -P "$OPTARG" && pwd )"; # get the full path
+            echo "Dependency installation directory: $BUILD_DIR";;
+      t)    vm_other;;
+      v)    ovs;;
+      V)    OVS_RELEASE=$OPTARG;
+            ubuntuOvs;;
+      w)    install_wireshark;;
+      x)    case $OF_VERSION in
+            1.0) nox;;
+            1.3) nox13;;
+            *)  echo "Invalid OpenFlow version $OF_VERSION";;
+            esac;;
+      y)    ryu;;
+      0)    OF_VERSION=1.0;;
+      3)    OF_VERSION=1.3;;
+      ?)    usage;;
+      esac
+    done
+    shift $(($OPTIND - 1))
+fi