Documentation outline for l2switch. 68/19268/1
authorAlexander Fan <railor33@gmail.com>
Wed, 29 Apr 2015 00:08:03 +0000 (17:08 -0700)
committerAlexander Fan <railor33@gmail.com>
Wed, 29 Apr 2015 00:08:03 +0000 (17:08 -0700)
Change-Id: I7c26b986fc85f2324b7de5348b599c9f57e34bd8
Signed-off-by: Alexander Fan <railor33@gmail.com>
manuals/developer-guide/src/main/asciidoc/bk-developers-guide.adoc
manuals/developer-guide/src/main/asciidoc/l2switch/l2switch-dev.adoc [new file with mode: 0644]
manuals/user-guide/src/main/asciidoc/bk-user-guide.adoc
manuals/user-guide/src/main/asciidoc/l2switch/l2switch-user.adoc [new file with mode: 0644]

index 8012fd687d922a408f3ccfddb0995549f07626a2..8a5be7f8831c968aabc378746a5e8e7006e238c7 100644 (file)
@@ -50,6 +50,8 @@ include::iotdm/iotdm-dev.adoc[]
 
 include::lacp/lacp-dev.adoc[]
 
+include::l2switch/l2switch-dev.adoc[]
+
 include::nic/nic-model-dev.adoc[]
 
 include::neutron/neutron.adoc[]
diff --git a/manuals/developer-guide/src/main/asciidoc/l2switch/l2switch-dev.adoc b/manuals/developer-guide/src/main/asciidoc/l2switch/l2switch-dev.adoc
new file mode 100644 (file)
index 0000000..efd627e
--- /dev/null
@@ -0,0 +1,323 @@
+== 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 5b5b00e8e6d50c815e2bc08434946705bd5dde5c..b368ea181dd263aaffb5096111823787509bf761 100644 (file)
@@ -30,6 +30,8 @@ include::bgpcep/odl-bgpcep-bgp-all-user.adoc[BGP]
 
 include::bgpcep/odl-bgpcep-pcep-all-user.adoc[PCEP]
 
+include::l2switch/l2switch-user.adoc[]
+
 include::sdninterfaceapp/odl-sdninterfaceapp-all-user.adoc[ODL-SDNi]
 
 include::sfc/sfc.adoc[Service Function Chain]
diff --git a/manuals/user-guide/src/main/asciidoc/l2switch/l2switch-user.adoc b/manuals/user-guide/src/main/asciidoc/l2switch/l2switch-user.adoc
new file mode 100644 (file)
index 0000000..8eca51e
--- /dev/null
@@ -0,0 +1,214 @@
+== L2Switch User 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
+
+=== Configuring L2Switch
+This sections below give details about the configuration settings for the components that can be configured.
+
+The base distribution configuration files are located in distribution/base/target/distributions-l2switch-base-0.1.0-SNAPSHOT-osgipackage/opendaylight/configuration/initial
+
+The karaf distribution configuration files are located in distribution/karaf/target/assembly/etc/opendaylight/karaf
+
+=== Configuring Loop Remover
+* 52-loopremover.xml
+  ** is-install-lldp-flow
+    *** "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
+    *** This field is only relevant when "is-install-lldp-flow" is set to "true"
+  ** lldp-flow-priority
+    *** The LLDP flow will be installed with the specified priority
+    *** This field is only relevant when "is-install-lldp-flow" is set to "true"
+  ** lldp-flow-idle-timeout
+    *** The LLDP 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-lldp-flow" is set to "true"
+  ** lldp-flow-hard-timeout
+    *** The LLDP 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-lldp-flow" is set to "true"
+  ** graph-refresh-delay
+    *** A graph of the network is maintained and gets updated as network elements go up/down (i.e. links go up/down and switches go up/down)
+    *** After a network element going up/down, it waits _graph-refresh-delay_ seconds before recomputing the graph
+    *** 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.
+
+=== Configuring Arp Handler
+* 54-arphandler.xml
+  ** 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
+    *** This field is only relevant when "is-proactive-flood-mode" is set to "true"
+  ** flood-flow-priority
+    *** The flood flow will be installed with the specified priority
+    *** This field is only relevant when "is-proactive-flood-mode" is set to "true"
+  ** flood-flow-idle-timeout
+    *** The flood 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-proactive-flood-mode" is set to "true"
+  ** flood-flow-hard-timeout
+    *** The flood 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-proactive-flood-mode" is set to "true"
+  ** arp-flow-table-id
+    *** The ARP flow will be installed on the specified flow table of each switch
+    *** This field is only relevant when "is-proactive-flood-mode" is set to "false"
+  ** arp-flow-priority
+    *** The ARP flow will be installed with the specified priority
+    *** This field is only relevant when "is-proactive-flood-mode" is set to "false"
+  ** arp-flow-idle-timeout
+    *** The ARP 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-proactive-flood-mode" is set to "false"
+  ** 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
+    *** This field is only relevant when "is-proactive-flood-mode" is set to "false"
+
+=== Configuring Address Tracker
+* 56-addresstracker.xml
+  ** 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.
+
+=== Configuring L2Switch Main
+* 58-l2switchmain.xml
+  ** 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"
+
+=== Running the L2Switch project
+
+==== Check out the project using git
+ git clone https://git.opendaylight.org/gerrit/p/l2switch.git
+
+The above command will create a directory called "l2switch" with the project.
+
+==== Run the distribution
+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.
+
+=== Checking Address Observations
+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
+
+.Address Observations
+image::l2switch-address-observations.png["AddressObservations image",width=500]
+
+=== Checking Hosts
+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/
+
+.Hosts
+image::l2switch-hosts.png["Hosts image",width=500]
+
+=== Checking STP status of each link
+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
+
+.STP status
+image::l2switch-stp-status.png["STPStatus image",width=500]
+
+=== 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
+