Migrate L2 Switch dev docs to rst 60/44160/2
authorColin Dixon <colin@colindixon.com>
Wed, 17 Aug 2016 15:30:53 +0000 (11:30 -0400)
committerColin Dixon <colin@colindixon.com>
Wed, 17 Aug 2016 19:07:02 +0000 (19:07 +0000)
Change-Id: I968536fb90a1959d3c63645cfdc6ff57a7ff9245
Signed-off-by: Colin Dixon <colin@colindixon.com>
docs/developer-guide/l2switch-developer-guide.rst [new file with mode: 0644]
manuals/developer-guide/src/main/asciidoc/l2switch/l2switch-dev.adoc

diff --git a/docs/developer-guide/l2switch-developer-guide.rst b/docs/developer-guide/l2switch-developer-guide.rst
new file mode 100644 (file)
index 0000000..95a3807
--- /dev/null
@@ -0,0 +1,671 @@
+L2Switch Developer Guide
+========================
+
+Overview
+--------
+
+The L2Switch project provides Layer2 switch functionality.
+
+L2Switch Architecture
+---------------------
+
+-  Packet Handler
+
+   -  Decodes the packets coming to the controller and dispatches them
+      appropriately
+
+-  Loop Remover
+
+   -  Removes loops in the network
+
+-  Arp Handler
+
+   -  Handles the decoded ARP packets
+
+-  Address Tracker
+
+   -  Learns the Addresses (MAC and IP) of entities in the network
+
+-  Host Tracker
+
+   -  Tracks the locations of hosts in the network
+
+-  L2Switch Main
+
+   -  Installs flows on each switch based on network traffic
+
+Key APIs and Interfaces
+-----------------------
+
+-  Packet Handler
+
+-  Loop Remover
+
+-  Arp Handler
+
+-  Address Tracker
+
+-  Host Tracker
+
+-  L2Switch Main
+
+Packet Dispatcher
+~~~~~~~~~~~~~~~~~
+
+Classes
+^^^^^^^
+
+-  AbstractPacketDecoder
+
+   -  Defines the methods that all decoders must implement
+
+-  EthernetDecoder
+
+   -  The base decoder which decodes the packet into an Ethernet packet
+
+-  ArpDecoder, Ipv4Decoder, Ipv6Decoder
+
+   -  Decodes Ethernet packets into the either an ARP or IPv4 or IPv6
+      packet
+
+Further development
+^^^^^^^^^^^^^^^^^^^
+
+There is a need for more decoders. A developer can write
+
+-  A decoder for another EtherType, i.e. LLDP.
+
+-  A higher layer decoder for the body of the IPv4 packet or IPv6
+   packet, i.e. TCP and UDP.
+
+How to write a new decoder
+
+-  extends AbstractDecoder<A, B>
+
+   -  A refers to the notification that the new decoder consumes
+
+   -  B refers to the notification that the new decoder produces
+
+-  implements xPacketListener
+
+   -  The new decoder must specify which notification it is listening to
+
+-  canDecode method
+
+   -  This method should examine the consumed notification to see
+      whether the new decoder can decode the contents of the packet
+
+-  decode method
+
+   -  This method does the actual decoding of the packet
+
+Loop Remover
+~~~~~~~~~~~~
+
+Classes
+^^^^^^^
+
+-  **LoopRemoverModule**
+
+   -  Reads config subsystem value for *is-install-lldp-flow*
+
+      -  If *is-install-lldp-flow* is true, then an
+         **InitialFlowWriter** is created
+
+   -  Creates and initializes the other LoopRemover classes
+
+-  **InitialFlowWriter**
+
+   -  Only created when *is-install-lldp-flow* is true
+
+   -  Installs a flow, which forwards all LLDP packets to the
+      controller, on each switch
+
+-  **TopologyLinkDataChangeHandler**
+
+   -  Listens to data change events on the Topology tree
+
+   -  When these changes occur, it waits *graph-refresh-delay* seconds
+      and then tells **NetworkGraphImpl** to update
+
+   -  Writes an STP (Spanning Tree Protocol) status of "forwarding" or
+      "discarding" to each link in the Topology data tree
+
+      -  Forwarding links can forward packets.
+
+      -  Discarding links cannot forward packets.
+
+-  **NetworkGraphImpl**
+
+   -  Creates a loop-free graph of the network
+
+Configuration
+^^^^^^^^^^^^^
+
+-  graph-refresh-delay
+
+   -  Used in TopologyLinkDataChangeHandler
+
+   -  A higher value has the advantage of doing less graph updates, at
+      the potential cost of losing some packets because the graph didn’t
+      update immediately.
+
+   -  A lower value has the advantage of handling network topology
+      changes quicker, at the cost of doing more computation.
+
+-  is-install-lldp-flow
+
+   -  Used in LoopRemoverModule
+
+   -  "true" means a flow that sends all LLDP packets to the controller
+      will be installed on each switch
+
+   -  "false" means this flow will not be installed
+
+-  lldp-flow-table-id
+
+   -  The LLDP flow will be installed on the specified flow table of
+      each switch
+
+-  lldp-flow-priority
+
+   -  The LLDP flow will be installed with the specified priority
+
+-  lldp-flow-idle-timeout
+
+   -  The LLDP flow will timeout (removed from the switch) if the flow
+      doesn’t forward a packet for *x* seconds
+
+-  lldp-flow-hard-timeout
+
+   -  The LLDP flow will timeout (removed from the switch) after *x*
+      seconds, regardless of how many packets it is forwarding
+
+Further development
+^^^^^^^^^^^^^^^^^^^
+
+No suggestions at the moment.
+
+Validating changes to Loop Remover
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+STP Status information is added to the Inventory data tree.
+
+-  A status of "forwarding" means the link is active and packets are
+   flowing on it.
+
+-  A status of "discarding" means the link is inactive and packets are
+   not sent over it.
+
+The STP status of a link can be checked through a browser or a REST
+Client.
+
+::
+
+    http://10.194.126.91:8080/restconf/operational/opendaylight-inventory:nodes/node/openflow:1/node-connector/openflow:1:2
+
+The STP status should still be there after changes are made.
+
+Arp Handler
+~~~~~~~~~~~
+
+Classes
+^^^^^^^
+
+-  **ArpHandlerModule**
+
+   -  Reads config subsystem value for *is-proactive-flood-mode*
+
+      -  If *is-proactive-flood-mode* is true, then a
+         ProactiveFloodFlowWriter is created
+
+      -  If *is-proactive-flood-mode* is false, then an
+         InitialFlowWriter is created
+
+-  **ProactiveFloodFlowWriter**
+
+   -  Only created when *is-proactive-flood-mode* is true
+
+   -  Installs a flood flow on each switch. With this flood flow, a
+      packet that doesn’t match any other flows will be
+      flooded/broadcast from that switch.
+
+-  **InitialFlowWriter**
+
+   -  Only created when *is-proactive-flood-mode* is false
+
+   -  Installs a flow, which sends all ARP packets to the controller, on
+      each switch
+
+-  **ArpPacketHandler**
+
+   -  Only created when *is-proactive-flood-mode* is false
+
+   -  Handles and processes the controller’s incoming ARP packets
+
+   -  Uses **PacketDispatcher** to send the ARP packet back into the
+      network
+
+-  **PacketDispatcher**
+
+   -  Only created when *is-proactive-flood-mode* is false
+
+   -  Sends packets out to the network
+
+   -  Uses **InventoryReader** to determine which node-connector to a
+      send a packet on
+
+-  **InventoryReader**
+
+   -  Only created when *is-proactive-flood-mode* is false
+
+   -  Maintains a list of each switch’s node-connectors
+
+Configuration
+^^^^^^^^^^^^^
+
+-  is-proactive-flood-mode
+
+   -  "true" means that flood flows will be installed on each switch.
+      With this flood flow, each switch will flood a packet that doesn’t
+      match any other flows.
+
+      -  Advantage: Fewer packets are sent to the controller because
+         those packets are flooded to the network.
+
+      -  Disadvantage: A lot of network traffic is generated.
+
+   -  "false" means the previously mentioned flood flows will not be
+      installed. Instead an ARP flow will be installed on each switch
+      that sends all ARP packets to the controller.
+
+      -  Advantage: Less network traffic is generated.
+
+      -  Disadvantage: The controller handles more packets (ARP requests
+         & replies) and the ARP process takes longer than if there were
+         flood flows.
+
+-  flood-flow-table-id
+
+   -  The flood flow will be installed on the specified flow table of
+      each switch
+
+-  flood-flow-priority
+
+   -  The flood flow will be installed with the specified priority
+
+-  flood-flow-idle-timeout
+
+   -  The flood flow will timeout (removed from the switch) if the flow
+      doesn’t forward a packet for *x* seconds
+
+-  flood-flow-hard-timeout
+
+   -  The flood flow will timeout (removed from the switch) after *x*
+      seconds, regardless of how many packets it is forwarding
+
+-  arp-flow-table-id
+
+   -  The ARP flow will be installed on the specified flow table of each
+      switch
+
+-  arp-flow-priority
+
+   -  The ARP flow will be installed with the specified priority
+
+-  arp-flow-idle-timeout
+
+   -  The ARP flow will timeout (removed from the switch) if the flow
+      doesn’t forward a packet for *x* seconds
+
+-  arp-flow-hard-timeout
+
+   -  The ARP flow will timeout (removed from the switch) after
+      *arp-flow-hard-timeout* seconds, regardless of how many packets it
+      is forwarding
+
+Further development
+^^^^^^^^^^^^^^^^^^^
+
+The **ProactiveFloodFlowWriter** needs to be improved. It does have the
+advantage of having less traffic come to the controller; however, it
+generates too much network traffic.
+
+Address Tracker
+~~~~~~~~~~~~~~~
+
+Classes
+^^^^^^^
+
+-  AddressTrackerModule
+
+   -  Reads config subsystem value for *observe-addresses-from*
+
+   -  If *observe-addresses-from* contains "arp", then an
+      AddressObserverUsingArp is created
+
+   -  If *observe-addresses-from* contains "ipv4", then an
+      AddressObserverUsingIpv4 is created
+
+   -  If *observe-addresses-from* contains "ipv6", then an
+      AddressObserverUsingIpv6 is created
+
+-  AddressObserverUsingArp
+
+   -  Registers for ARP packet notifications
+
+   -  Uses **AddressObservationWriter** to write address observations
+      from ARP packets
+
+-  AddressObserverUsingIpv4
+
+   -  Registers for IPv4 packet notifications
+
+   -  Uses **AddressObservationWriter** to write address observations
+      from IPv4 packets
+
+-  AddressObserverUsingIpv6
+
+   -  Registers for IPv6 packet notifications
+
+   -  Uses **AddressObservationWriter** to write address observations
+      from IPv6 packets
+
+-  AddressObservationWriter
+
+   -  Writes new Address Observations to the Inventory data tree
+
+   -  Updates existing Address Observations with updated "last seen"
+      timestamps
+
+      -  Uses the *timestamp-update-intervval* configuration variable to
+         determine whether or not to update
+
+Configuration
+^^^^^^^^^^^^^
+
+-  timestamp-update-interval
+
+   -  A last-seen timestamp is associated with each address. This
+      last-seen timestamp will only be updated after
+      *timestamp-update-interval* milliseconds.
+
+   -  A higher value has the advantage of performing less writes to the
+      database.
+
+   -  A lower value has the advantage of knowing how fresh an address
+      is.
+
+-  observe-addresses-from
+
+   -  IP and MAC addresses can be observed/learned from ARP, IPv4, and
+      IPv6 packets. Set which packets to make these observations from.
+
+Further development
+^^^^^^^^^^^^^^^^^^^
+
+Further improvements can be made to the **AddressObservationWriter** so
+that it (1) doesn’t make any unnecessary writes to the DB and (2) is
+optimized for multi-threaded environments.
+
+Validating changes to Address Tracker
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Address Observations are added to the Inventory data tree.
+
+The Address Observations on a Node Connector can be checked through a
+browser or a REST Client.
+
+::
+
+    http://10.194.126.91:8080/restconf/operational/opendaylight-inventory:nodes/node/openflow:1/node-connector/openflow:1:1
+
+The Address Observations should still be there after changes.
+
+Developer’s Guide for Host Tracker
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Validationg changes to Host Tracker
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Host information is added to the Topology data tree.
+
+-  Host address
+
+-  Attachment point (link) to a node/switch
+
+This host information and attachment point information can be checked
+through a browser or a REST Client.
+
+::
+
+    http://10.194.126.91:8080/restconf/operational/network-topology:network-topology/topology/flow:1/
+
+Host information should still be there after changes.
+
+L2Switch Main
+~~~~~~~~~~~~~
+
+Classes
+^^^^^^^
+
+-  L2SwitchMainModule
+
+   -  Reads config subsystem value for *is-install-dropall-flow*
+
+      -  If *is-install-dropall-flow* is true, then an
+         **InitialFlowWriter** is created
+
+   -  Reads config subsystem value for *is-learning-only-mode*
+
+      -  If *is-learning-only-mode* is false, then a
+         **ReactiveFlowWriter** is created
+
+-  InitialFlowWriter
+
+   -  Only created when *is-install-dropall-flow* is true
+
+   -  Installs a flow, which drops all packets, on each switch. This
+      flow has low priority and means that packets that don’t match any
+      higher-priority flows will simply be dropped.
+
+-  ReactiveFlowWriter
+
+   -  Reacts to network traffic and installs MAC-to-MAC flows on
+      switches. These flows have matches based on MAC source and MAC
+      destination.
+
+   -  Uses **FlowWriterServiceImpl** to write these flows to the
+      switches
+
+-  FlowWriterService / FlowWriterServiceImpl
+
+   -  Writes flows to switches
+
+Configuration
+^^^^^^^^^^^^^
+
+-  is-install-dropall-flow
+
+   -  "true" means a drop-all flow will be installed on each switch, so
+      the default action will be to drop a packet instead of sending it
+      to the controller
+
+   -  "false" means this flow will not be installed
+
+-  dropall-flow-table-id
+
+   -  The dropall flow will be installed on the specified flow table of
+      each switch
+
+   -  This field is only relevant when "is-install-dropall-flow" is set
+      to "true"
+
+-  dropall-flow-priority
+
+   -  The dropall flow will be installed with the specified priority
+
+   -  This field is only relevant when "is-install-dropall-flow" is set
+      to "true"
+
+-  dropall-flow-idle-timeout
+
+   -  The dropall flow will timeout (removed from the switch) if the
+      flow doesn’t forward a packet for *x* seconds
+
+   -  This field is only relevant when "is-install-dropall-flow" is set
+      to "true"
+
+-  dropall-flow-hard-timeout
+
+   -  The dropall flow will timeout (removed from the switch) after *x*
+      seconds, regardless of how many packets it is forwarding
+
+   -  This field is only relevant when "is-install-dropall-flow" is set
+      to "true"
+
+-  is-learning-only-mode
+
+   -  "true" means that the L2Switch will only be learning addresses. No
+      additional flows to optimize network traffic will be installed.
+
+   -  "false" means that the L2Switch will react to network traffic and
+      install flows on the switches to optimize traffic. Currently,
+      MAC-to-MAC flows are installed.
+
+-  reactive-flow-table-id
+
+   -  The reactive flow will be installed on the specified flow table of
+      each switch
+
+   -  This field is only relevant when "is-learning-only-mode" is set to
+      "false"
+
+-  reactive-flow-priority
+
+   -  The reactive flow will be installed with the specified priority
+
+   -  This field is only relevant when "is-learning-only-mode" is set to
+      "false"
+
+-  reactive-flow-idle-timeout
+
+   -  The reactive flow will timeout (removed from the switch) if the
+      flow doesn’t forward a packet for *x* seconds
+
+   -  This field is only relevant when "is-learning-only-mode" is set to
+      "false"
+
+-  reactive-flow-hard-timeout
+
+   -  The reactive flow will timeout (removed from the switch) after *x*
+      seconds, regardless of how many packets it is forwarding
+
+   -  This field is only relevant when "is-learning-only-mode" is set to
+      "false"
+
+Further development
+^^^^^^^^^^^^^^^^^^^
+
+The **ReactiveFlowWriter** needs to be improved to install the
+MAC-to-MAC flows faster. For the first ping, the ARP request and reply
+are successful. However, then the ping packets are sent out. The first
+ping packet is dropped sometimes because the MAC-to-MAC flow isn’t
+installed quickly enough. The second, third, and following ping packets
+are successful though.
+
+API Reference Documentation
+---------------------------
+
+Further documentation can be found by checking out the L2Switch project.
+
+Checking out the L2Switch project
+---------------------------------
+
+::
+
+    git clone https://git.opendaylight.org/gerrit/p/l2switch.git
+
+The above command will create a directory called "l2switch" with the
+project.
+
+Testing your changes to the L2Switch project
+--------------------------------------------
+
+Running the L2Switch project
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+To run the base distribution, you can use the following command
+
+::
+
+    ./distribution/base/target/distributions-l2switch-base-0.1.0-SNAPSHOT-osgipackage/opendaylight/run.sh
+
+If you need additional resources, you can use these command line
+arguments:
+
+::
+
+    -Xms1024m -Xmx2048m -XX:PermSize=512m -XX:MaxPermSize=1024m'
+
+To run the karaf distribution, you can use the following command:
+
+::
+
+    ./distribution/karaf/target/assembly/bin/karaf
+
+Create a network using mininet
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+::
+
+    sudo mn --controller=remote,ip=<Controller IP> --topo=linear,3 --switch ovsk,protocols=OpenFlow13
+    sudo mn --controller=remote,ip=127.0.0.1 --topo=linear,3 --switch ovsk,protocols=OpenFlow13
+
+The above command will create a virtual network consisting of 3
+switches. Each switch will connect to the controller located at the
+specified IP, i.e. 127.0.0.1
+
+::
+
+    sudo mn --controller=remote,ip=127.0.0.1 --mac --topo=linear,3 --switch ovsk,protocols=OpenFlow13
+
+The above command has the "mac" option, which makes it easier to
+distinguish between Host MAC addresses and Switch MAC addresses.
+
+Generating network traffic using mininet
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+::
+
+    h1 ping h2
+
+The above command will cause host1 (h1) to ping host2 (h2)
+
+::
+
+    pingall
+
+*pingall* will cause each host to ping every other host.
+
+Miscellaneous mininet commands
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+::
+
+    link s1 s2 down
+
+This will bring the link between switch1 (s1) and switch2 (s2) down
+
+::
+
+    link s1 s2 up
+
+This will bring the link between switch1 (s1) and switch2 (s2) up
+
+::
+
+    link s1 h1 down
+
+This will bring the link between switch1 (s1) and host1 (h1) down
+
index efd627e3b4cc7b6f761f81f1678ed3edbc98e874..3fbc9deaa0cec19bb840ba6647d3e89ff706fda4 100644 (file)
@@ -1,323 +1,3 @@
 == L2Switch Developer Guide
 
-=== Overview
-The L2Switch project provides Layer2 switch functionality.
-
-=== L2Switch Architecture
-* Packet Handler
-  ** Decodes the packets coming to the controller and dispatches them appropriately
-* Loop Remover
-  ** Removes loops in the network
-* Arp Handler
-  ** Handles the decoded ARP packets
-* Address Tracker
-  ** Learns the Addresses (MAC and IP) of entities in the network
-* Host Tracker
-  ** Tracks the locations of hosts in the network
-* L2Switch Main
-  ** Installs flows on each switch based on network traffic
-
-=== Key APIs and Interfaces
-* Packet Handler
-* Loop Remover
-* Arp Handler
-* Address Tracker
-* Host Tracker
-* L2Switch Main
-
-==== Packet Dispatcher
-===== Classes
-* AbstractPacketDecoder
-  ** Defines the methods that all decoders must implement
-* EthernetDecoder
-  ** The base decoder which decodes the packet into an Ethernet packet
-* ArpDecoder, Ipv4Decoder, Ipv6Decoder
-  ** Decodes Ethernet packets into the either an ARP or IPv4 or IPv6 packet
-
-===== Further development
-There is a need for more decoders.  A developer can write
-
-* A decoder for another EtherType, i.e. LLDP.
-* A higher layer decoder for the body of the IPv4 packet or IPv6 packet, i.e. TCP and UDP.
-
-How to write a new decoder
-
-* extends AbstractDecoder<A, B>
-  ** A refers to the notification that the new decoder consumes
-  ** B refers to the notification that the new decoder produces
-* implements xPacketListener
-  ** The new decoder must specify which notification it is listening to
-* canDecode method
-  ** This method should examine the consumed notification to see whether the new decoder can decode the contents of the packet
-* decode method
-  ** This method does the actual decoding of the packet
-
-==== Loop Remover
-===== Classes
-* *LoopRemoverModule*
-  ** Reads config subsystem value for _is-install-lldp-flow_
-    *** If _is-install-lldp-flow_ is true, then an *InitialFlowWriter* is created
-  ** Creates and initializes the other LoopRemover classes
-* *InitialFlowWriter*
-  ** Only created when _is-install-lldp-flow_ is true
-  ** Installs a flow, which forwards all LLDP packets to the controller, on each switch
-* *TopologyLinkDataChangeHandler*
-  ** Listens to data change events on the Topology tree
-  ** When these changes occur, it waits _graph-refresh-delay_ seconds and then tells *NetworkGraphImpl* to update
-  ** Writes an STP (Spanning Tree Protocol) status of "forwarding" or "discarding" to each link in the Topology data tree
-    *** Forwarding links can forward packets.
-    *** Discarding links cannot forward packets.
-* *NetworkGraphImpl*
-  ** Creates a loop-free graph of the network
-
-===== Configuration
-* graph-refresh-delay
-  ** Used in TopologyLinkDataChangeHandler
-  ** A higher value has the advantage of doing less graph updates, at the potential cost of losing some packets because the graph didn't update immediately.
-  ** A lower value has the advantage of handling network topology changes quicker, at the cost of doing more computation.
-* is-install-lldp-flow
-  ** Used in LoopRemoverModule
-  ** "true" means a flow that sends all LLDP packets to the controller will be installed on each switch
-  ** "false" means this flow will not be installed
-* lldp-flow-table-id
-  ** The LLDP flow will be installed on the specified flow table of each switch
-* lldp-flow-priority
-  ** The LLDP flow will be installed with the specified priority
-* lldp-flow-idle-timeout
-  ** The LLDP flow will timeout (removed from the switch) if the flow doesn't forward a packet for _x_ seconds
-* lldp-flow-hard-timeout
-  ** The LLDP flow will timeout (removed from the switch) after _x_ seconds, regardless of how many packets it is forwarding
-
-===== Further development
-No suggestions at the moment.
-
-===== Validating changes to Loop Remover
-STP Status information is added to the Inventory data tree.
-
-* A status of "forwarding" means the link is active and packets are flowing on it.
-* A status of "discarding" means the link is inactive and packets are not sent over it.
-
-The STP status of a link can be checked through a browser or a REST Client.
-
- http://10.194.126.91:8080/restconf/operational/opendaylight-inventory:nodes/node/openflow:1/node-connector/openflow:1:2
-
-
-The STP status should still be there after changes are made.
-
-==== Arp Handler
-===== Classes
-* *ArpHandlerModule*
-  ** Reads config subsystem value for _is-proactive-flood-mode_
-    *** If _is-proactive-flood-mode_ is true, then a ProactiveFloodFlowWriter is created
-    *** If _is-proactive-flood-mode_ is false, then an InitialFlowWriter is created
-* *ProactiveFloodFlowWriter*
-  ** Only created when _is-proactive-flood-mode_ is true
-  ** Installs a flood flow on each switch.  With this flood flow, a packet that doesn't match any other flows will be flooded/broadcast from that switch.
-* *InitialFlowWriter*
-  ** Only created when _is-proactive-flood-mode_ is false
-  ** Installs a flow, which sends all ARP packets to the controller, on each switch
-* *ArpPacketHandler*
-  ** Only created when _is-proactive-flood-mode_ is false
-  ** Handles and processes the controller's incoming ARP packets
-  ** Uses *PacketDispatcher* to send the ARP packet back into the network
-* *PacketDispatcher*
-  ** Only created when _is-proactive-flood-mode_ is false
-  ** Sends packets out to the network
-  ** Uses *InventoryReader* to determine which node-connector to a send a packet on
-* *InventoryReader*
-  ** Only created when _is-proactive-flood-mode_ is false
-  ** Maintains a list of each switch's node-connectors
-
-===== Configuration
-* is-proactive-flood-mode
-  ** "true" means that flood flows will be installed on each switch.  With this flood flow, each switch will flood a packet that doesn't match any other flows.
-    *** Advantage: Fewer packets are sent to the controller because those packets are flooded to the network.
-    *** Disadvantage: A lot of network traffic is generated.
-  ** "false" means the previously mentioned flood flows will not be installed.  Instead an ARP flow will be installed on each switch that sends all ARP packets to the controller.
-    *** Advantage: Less network traffic is generated.
-    *** Disadvantage: The controller handles more packets (ARP requests & replies) and the ARP process takes longer than if there were flood flows.
-* flood-flow-table-id
-  ** The flood flow will be installed on the specified flow table of each switch
-* flood-flow-priority
-  ** The flood flow will be installed with the specified priority
-* flood-flow-idle-timeout
-  ** The flood flow will timeout (removed from the switch) if the flow doesn't forward a packet for _x_ seconds
-* flood-flow-hard-timeout
-  ** The flood flow will timeout (removed from the switch) after _x_ seconds, regardless of how many packets it is forwarding
-* arp-flow-table-id
-  ** The ARP flow will be installed on the specified flow table of each switch
-* arp-flow-priority
-  ** The ARP flow will be installed with the specified priority
-* arp-flow-idle-timeout
-  ** The ARP flow will timeout (removed from the switch) if the flow doesn't forward a packet for _x_ seconds
-* arp-flow-hard-timeout
-  ** The ARP flow will timeout (removed from the switch) after _arp-flow-hard-timeout_ seconds, regardless of how many packets it is forwarding
-
-===== Further development
-The *ProactiveFloodFlowWriter* needs to be improved.  It does have the advantage of having less traffic come to the controller; however, it generates too much network traffic.
-
-==== Address Tracker
-===== Classes
-* AddressTrackerModule
-  ** Reads config subsystem value for _observe-addresses-from_
-  ** If _observe-addresses-from_ contains "arp", then an AddressObserverUsingArp is created
-  ** If _observe-addresses-from_ contains "ipv4", then an AddressObserverUsingIpv4 is created
-  ** If _observe-addresses-from_ contains "ipv6", then an AddressObserverUsingIpv6 is created
-* AddressObserverUsingArp
-  ** Registers for ARP packet notifications
-  ** Uses *AddressObservationWriter* to write address observations from ARP packets
-* AddressObserverUsingIpv4
-  ** Registers for IPv4 packet notifications
-  ** Uses *AddressObservationWriter* to write address observations from IPv4 packets
-* AddressObserverUsingIpv6
-  ** Registers for IPv6 packet notifications
-  ** Uses *AddressObservationWriter* to write address observations from IPv6 packets
-* AddressObservationWriter
-  ** Writes new Address Observations to the Inventory data tree
-  ** Updates existing Address Observations with updated "last seen" timestamps
-    *** Uses the _timestamp-update-intervval_ configuration variable to determine whether or not to update
-
-===== Configuration
-* timestamp-update-interval
-  ** A last-seen timestamp is associated with each address.  This last-seen timestamp will only be updated after _timestamp-update-interval_ milliseconds.
-  ** A higher value has the advantage of performing less writes to the database.
-  ** A lower value has the advantage of knowing how fresh an address is.
-* observe-addresses-from
-  ** IP and MAC addresses can be observed/learned from ARP, IPv4, and IPv6 packets.  Set which packets to make these observations from.
-
-===== Further development
-Further improvements can be made to the *AddressObservationWriter* so that it (1) doesn't make any unnecessary writes to the DB and
-(2) is optimized for multi-threaded environments.
-
-===== Validating changes to Address Tracker
-Address Observations are added to the Inventory data tree.
-
-The Address Observations on a Node Connector can be checked through a browser or a REST Client.
-
- http://10.194.126.91:8080/restconf/operational/opendaylight-inventory:nodes/node/openflow:1/node-connector/openflow:1:1
-
-
-The Address Observations should still be there after changes.
-
-==== Developer's Guide for Host Tracker
-
-===== Validationg changes to Host Tracker
-Host information is added to the Topology data tree.
-
-* Host address
-* Attachment point (link) to a node/switch
-
-This host information and attachment point information can be checked through a browser or a REST Client.
-
- http://10.194.126.91:8080/restconf/operational/network-topology:network-topology/topology/flow:1/
-
-Host information should still be there after changes.
-
-==== L2Switch Main
-===== Classes
-* L2SwitchMainModule
-  ** Reads config subsystem value for _is-install-dropall-flow_
-    *** If _is-install-dropall-flow_ is true, then an *InitialFlowWriter* is created
-  ** Reads config subsystem value for _is-learning-only-mode_
-    *** If _is-learning-only-mode_ is false, then a *ReactiveFlowWriter* is created
-* InitialFlowWriter
-  ** Only created when _is-install-dropall-flow_ is true
-  ** Installs a flow, which drops all packets, on each switch.  This flow has low priority and means that packets that don't match any higher-priority flows will simply be dropped.
-* ReactiveFlowWriter
-  ** Reacts to network traffic and installs MAC-to-MAC flows on switches.  These flows have matches based on MAC source and MAC destination.
-  ** Uses *FlowWriterServiceImpl* to write these flows to the switches
-* FlowWriterService / FlowWriterServiceImpl
-  ** Writes flows to switches
-
-===== Configuration
-* is-install-dropall-flow
-  ** "true" means a drop-all flow will be installed on each switch, so the default action will be to drop a packet instead of sending it to the controller
-  ** "false" means this flow will not be installed
-* dropall-flow-table-id
-  ** The dropall flow will be installed on the specified flow table of each switch
-  ** This field is only relevant when "is-install-dropall-flow" is set to "true"
-* dropall-flow-priority
-  ** The dropall flow will be installed with the specified priority
-  ** This field is only relevant when "is-install-dropall-flow" is set to "true"
-* dropall-flow-idle-timeout
-  ** The dropall flow will timeout (removed from the switch) if the flow doesn't forward a packet for _x_ seconds
-  ** This field is only relevant when "is-install-dropall-flow" is set to "true"
-* dropall-flow-hard-timeout
-  ** The dropall flow will timeout (removed from the switch) after _x_ seconds, regardless of how many packets it is forwarding
-  ** This field is only relevant when "is-install-dropall-flow" is set to "true"
-* is-learning-only-mode
-  ** "true" means that the L2Switch will only be learning addresses.  No additional flows to optimize network traffic will be installed.
-  ** "false" means that the L2Switch will react to network traffic and install flows on the switches to optimize traffic.  Currently, MAC-to-MAC flows are installed.
-* reactive-flow-table-id
-  ** The reactive flow will be installed on the specified flow table of each switch
-  ** This field is only relevant when "is-learning-only-mode" is set to "false"
-* reactive-flow-priority
-  ** The reactive flow will be installed with the specified priority
-  ** This field is only relevant when "is-learning-only-mode" is set to "false"
-* reactive-flow-idle-timeout
-  ** The reactive flow will timeout (removed from the switch) if the flow doesn't forward a packet for _x_ seconds
-  ** This field is only relevant when "is-learning-only-mode" is set to "false"
-* reactive-flow-hard-timeout
-  ** The reactive flow will timeout (removed from the switch) after _x_ seconds, regardless of how many packets it is forwarding
-  ** This field is only relevant when "is-learning-only-mode" is set to "false"
-
-===== Further development
-The *ReactiveFlowWriter* needs to be improved to install the MAC-to-MAC flows faster.  For the first ping, the ARP request and reply are successful.
-However, then the ping packets are sent out.  The first ping packet is dropped sometimes because the MAC-to-MAC flow isn't installed quickly enough.
-The second, third, and following ping packets are successful though.
-
-=== API Reference Documentation
-Further documentation can be found by checking out the L2Switch project.
-
-=== Checking out the L2Switch project
- git clone https://git.opendaylight.org/gerrit/p/l2switch.git
-
-The above command will create a directory called "l2switch" with the project.
-
-=== Testing your changes to the L2Switch project
-==== Running the L2Switch project
-To run the base distribution, you can use the following command
-
- ./distribution/base/target/distributions-l2switch-base-0.1.0-SNAPSHOT-osgipackage/opendaylight/run.sh
-
-If you need additional resources, you can use these command line arguments:
-
- -Xms1024m -Xmx2048m -XX:PermSize=512m -XX:MaxPermSize=1024m'
-
-To run the karaf distribution, you can use the following command:
-
- ./distribution/karaf/target/assembly/bin/karaf
-
-==== Create a network using mininet
- sudo mn --controller=remote,ip=<Controller IP> --topo=linear,3 --switch ovsk,protocols=OpenFlow13
- sudo mn --controller=remote,ip=127.0.0.1 --topo=linear,3 --switch ovsk,protocols=OpenFlow13
-
-The above command will create a virtual network consisting of 3 switches.
-Each switch will connect to the controller located at the specified IP, i.e. 127.0.0.1
-
- sudo mn --controller=remote,ip=127.0.0.1 --mac --topo=linear,3 --switch ovsk,protocols=OpenFlow13
-
-The above command has the "mac" option, which makes it easier to distinguish between Host MAC addresses and Switch MAC addresses.
-
-==== Generating network traffic using mininet
- h1 ping h2
-
-The above command will cause host1 (h1) to ping host2 (h2)
-
- pingall
-
-'pingall' will cause each host to ping every other host.
-
-==== Miscellaneous mininet commands
- link s1 s2 down
-
-This will bring the link between switch1 (s1) and switch2 (s2) down
-
- link s1 s2 up
-
-This will bring the link between switch1 (s1) and switch2 (s2) up
-
- link s1 h1 down
-
-This will bring the link between switch1 (s1) and host1 (h1) down
-
+This content has been migrated to: http://docs.opendaylight.org/en/stable-boron/developer-guide/l2switch-developer-guide.html