First commit
diff --git a/util/nox-patches/0001-OpenFlow-tutorial-port-nox-destiny.patch b/util/nox-patches/0001-OpenFlow-tutorial-port-nox-destiny.patch
new file mode 100644
index 0000000..881fc55
--- /dev/null
+++ b/util/nox-patches/0001-OpenFlow-tutorial-port-nox-destiny.patch
@@ -0,0 +1,298 @@
+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
+