Merge "fixing LISP flow mapping addr format table"
authorColin Dixon <colin@colindixon.com>
Sat, 13 Feb 2016 20:09:45 +0000 (20:09 +0000)
committerGerrit Code Review <gerrit@opendaylight.org>
Sat, 13 Feb 2016 20:09:45 +0000 (20:09 +0000)
57 files changed:
manuals/developer-guide/pom.xml
manuals/developer-guide/src/main/asciidoc/armoury/odl-armoury-dev.adoc
manuals/developer-guide/src/main/asciidoc/bk-developers-guide.adoc
manuals/developer-guide/src/main/asciidoc/controller/websocket-notifications.adoc
manuals/developer-guide/src/main/asciidoc/nemo/odl-nemo-engine-dev.adoc [new file with mode: 0644]
manuals/developer-guide/src/main/asciidoc/netide/netide-developer-guide.adoc [new file with mode: 0644]
manuals/developer-guide/src/main/asciidoc/openflowplugin/odl-ofp-developer-guide.adoc [new file with mode: 0644]
manuals/developer-guide/src/main/asciidoc/openflowplugin/odl-ofp-sequence-diagram.adoc [new file with mode: 0644]
manuals/developer-guide/src/main/asciidoc/ovsdb/ovsdb-developer.adoc
manuals/developer-guide/src/main/asciidoc/ovsdb/ovsdb-hwvtep-developer.adoc [new file with mode: 0644]
manuals/developer-guide/src/main/asciidoc/ovsdb/ovsdb-sfc-developer.adoc [new file with mode: 0644]
manuals/developer-guide/src/main/asciidoc/sxp/odl-sxp-dev.adoc
manuals/developer-guide/src/main/asciidoc/yang-push/odl-yang-push-dev.adoc [new file with mode: 0644]
manuals/developer-guide/src/main/resources/images/openflowplugin/odl-ofp-add-flow.png [new file with mode: 0644]
manuals/developer-guide/src/main/resources/images/openflowplugin/odl-ofp-handshake.png [new file with mode: 0644]
manuals/developer-guide/src/main/resources/images/openflowplugin/odl-ofp-session-establishment.jpg [new file with mode: 0644]
manuals/getting-started-guide/pom.xml
manuals/getting-started-guide/src/main/asciidoc/general_installation.adoc
manuals/getting-started-guide/src/main/asciidoc/ovsdb/ovsdb-hwvtep-install.adoc [new file with mode: 0644]
manuals/getting-started-guide/src/main/asciidoc/ovsdb/ovsdb-install.adoc
manuals/getting-started-guide/src/main/asciidoc/ovsdb/ovsdb-openstack-install.adoc
manuals/getting-started-guide/src/main/asciidoc/ovsdb/ovsdb-sfc-install.adoc [new file with mode: 0644]
manuals/getting-started-guide/src/main/asciidoc/vtn/vtn-install.adoc
manuals/howto-openstack/pom.xml
manuals/pom.xml
manuals/readme/pom.xml
manuals/user-guide/pom.xml
manuals/user-guide/src/main/asciidoc/armoury/odl-armoury-user.adoc
manuals/user-guide/src/main/asciidoc/bk-user-guide.adoc
manuals/user-guide/src/main/asciidoc/nemo/odl-nemo-engine-user.adoc [new file with mode: 0644]
manuals/user-guide/src/main/asciidoc/netide/odl-netide-user-guide.adoc [new file with mode: 0644]
manuals/user-guide/src/main/asciidoc/openflowplugin/odl-ofp-coverage.adoc [new file with mode: 0644]
manuals/user-guide/src/main/asciidoc/openflowplugin/odl-ofp-end-to-end-flows.adoc [new file with mode: 0644]
manuals/user-guide/src/main/asciidoc/openflowplugin/odl-ofp-end-to-end-groups.adoc [new file with mode: 0644]
manuals/user-guide/src/main/asciidoc/openflowplugin/odl-ofp-end-to-end-inventory.adoc [new file with mode: 0644]
manuals/user-guide/src/main/asciidoc/openflowplugin/odl-ofp-end-to-end-meters.adoc [new file with mode: 0644]
manuals/user-guide/src/main/asciidoc/openflowplugin/odl-ofp-end-to-end-topology.adoc [new file with mode: 0644]
manuals/user-guide/src/main/asciidoc/openflowplugin/odl-ofp-example-flows.adoc [new file with mode: 0644]
manuals/user-guide/src/main/asciidoc/openflowplugin/odl-ofp-openflowplugin-user.adoc [new file with mode: 0644]
manuals/user-guide/src/main/asciidoc/openflowplugin/odl-ofp-overview-and-architecture.adoc [new file with mode: 0644]
manuals/user-guide/src/main/asciidoc/openflowplugin/odl-ofp-overview-architecture.adoc [new file with mode: 0644]
manuals/user-guide/src/main/asciidoc/openflowplugin/odl-ofp-restconf-postman.adoc [new file with mode: 0644]
manuals/user-guide/src/main/asciidoc/openflowplugin/odl-ofp-running-controller-with-the-new-of-plugin.adoc [new file with mode: 0644]
manuals/user-guide/src/main/asciidoc/openflowplugin/odl-ofp-statistics.adoc [new file with mode: 0644]
manuals/user-guide/src/main/asciidoc/openflowplugin/odl-ofp-test-environment.adoc [new file with mode: 0644]
manuals/user-guide/src/main/asciidoc/openflowplugin/odl-ofp-test-provider-flows.adoc [new file with mode: 0644]
manuals/user-guide/src/main/asciidoc/openflowplugin/odl-ofp-test-provider-groups.adoc [new file with mode: 0644]
manuals/user-guide/src/main/asciidoc/openflowplugin/odl-ofp-test-provider-meters.adoc [new file with mode: 0644]
manuals/user-guide/src/main/asciidoc/openflowplugin/odl-ofp-test-provider-topology.adoc [new file with mode: 0644]
manuals/user-guide/src/main/asciidoc/openflowplugin/odl-ofp-user-guide.adoc [new file with mode: 0644]
manuals/user-guide/src/main/asciidoc/sxp/odl-sxp-user.adoc
manuals/user-guide/src/main/asciidoc/vtn/VTN_OpenStack_Support-user.adoc
manuals/user-guide/src/main/asciidoc/yang-push/odl-yang-push-user.adoc [new file with mode: 0644]
manuals/user-guide/src/main/resources/images/openflowplugin/host-only-vbox.png [new file with mode: 0644]
manuals/user-guide/src/main/resources/images/openflowplugin/plugin_design.jpg [new file with mode: 0644]
manuals/user-guide/src/main/resources/images/plugin_design.jpg [new file with mode: 0644]
pom.xml

index 5940ee72819142f4c5affe0f1ab93c42562a13b9..043459be93a2415be4b6d4d9c3116cc263da4c3d 100644 (file)
@@ -4,7 +4,7 @@
   <parent>
     <groupId>org.opendaylight.docs</groupId>
     <artifactId>manuals</artifactId>
-    <version>0.2.0-SNAPSHOT</version>
+    <version>0.3.0-SNAPSHOT</version>
     <relativePath>../pom.xml</relativePath>
   </parent>
   <modelVersion>4.0.0</modelVersion>
index 8b2672605af290f8eadd14668cf15d441a8b07fa..e84b13d1e0e64fc90c87fd186f04964d92ae8c5f 100644 (file)
@@ -18,5 +18,8 @@ TBD: A description of Armoury Catalog API.
 ==== Armoury Workload Manager API
 TBD: A description of Armoury Workload Manager API.
 
+==== Armoury Driver Registry API
+TBD: A description of Armoury Driver Registry API.
+
 === API Reference Documentation
 TBD: Provide links to JavaDoc, REST API documentation, etc.
index 9e68b9bcbee02f468a6e58e0273fe7f752c1167e..4f7d7691a0c4505463575df372251e50070b4795 100644 (file)
@@ -76,12 +76,18 @@ include::controller/netconf/odl-netconf-dev.adoc[]
 
 include::nic/nic-dev.adoc[]
 
+include::nemo/odl-nemo-engine-dev.adoc[]
+
+include::netide/netide-developer-guide.adoc[]
+
 include::neutron/neutron.adoc[]
 
 include::sdninterfaceapp/odl-sdninterfaceapp-all-dev.adoc[]
 
 include::openflowjava/odl-openflowjava-protocol-dev.adoc[]
 
+include::openflowplugin/odl-ofp-developer-guide.adoc[]
+
 include::opflex/agent-ovs-dev.adoc[]
 
 include::opflex/genie-dev.adoc[]
@@ -115,6 +121,8 @@ include::vtn/vtn-dev.adoc[]
 
 include::yangtools/yangtools.adoc[]
 
+include::yang-push/odl-yang-push-dev.adoc[YANG-PUSH]
+
 :numbered!:
 
 ///////
index fb1a8ca72647be635b80e3a7457b400f91ee5270..083dd96da07e0abcb652ad6416d3e5a0d826aa70 100644 (file)
@@ -113,16 +113,14 @@ Notifications are always in XML format and look like this:
         <data-change-event>
             <path xmlns:meae="http://netconfcentral.org/ns/toaster">/meae:toaster</path>
             <operation>updated</operation>
+            <data>
+               <!-- updated data -->
+            </data>
         </data-change-event>
     </data-changed-notification>
 </notification>
 ----
 
-NOTE: Notifications never contain data. They only contain information
-      about the path that was changed and what kind of operation
-      executed on that path. If you need data you should execute a
-      RESTCONF GET request on the path that was changed.
-
 ==== Example use case
 
 The typical use case is listening to data change events to update web
diff --git a/manuals/developer-guide/src/main/asciidoc/nemo/odl-nemo-engine-dev.adoc b/manuals/developer-guide/src/main/asciidoc/nemo/odl-nemo-engine-dev.adoc
new file mode 100644 (file)
index 0000000..f524d7d
--- /dev/null
@@ -0,0 +1,19 @@
+== NEtwork MOdeling (NEMO)
+
+=== Overview
+TBD: Overview of the NEMO feature, what logical functionality it
+provides and why you might use it as a developer.
+
+=== NEMO Architecture
+TBD: NEMO components and how they work together.
+Also include information about how the feature integrates with
+OpenDaylight and architecture.
+
+=== Key APIs and Interfaces
+TBD: Document the key things a user would want to use.
+
+==== NEMO Intent API
+TBD: A description of NEMO Intent API.
+
+=== API Reference Documentation
+TBD: Provide links to JavaDoc, REST API documentation, etc.
diff --git a/manuals/developer-guide/src/main/asciidoc/netide/netide-developer-guide.adoc b/manuals/developer-guide/src/main/asciidoc/netide/netide-developer-guide.adoc
new file mode 100644 (file)
index 0000000..8ea1baa
--- /dev/null
@@ -0,0 +1,28 @@
+== NetIDE Developer Guide ==
+
+=== Overview ===
+The NetIDE Network Engine enables portability and cooperation inside a single 
+network by using a client/server multi-controller architecture. Separate 
+“Client SDN Controllers” host the various SDN Applications with their access 
+to the actual physical network abstracted and coordinated through a single 
+“Server SDN Controller”, in this instance OpenDaylight. This allows 
+applications written for Ryu/Floodlight/Pyretic to execute on OpenDaylight 
+managed infrastructure.
+
+The "Network Engine" is modular by design:
+. An OpenDaylight plugin, "shim", sends/receives messages to/from subscribed SDN Client Controllers. This consumes the ODL Openflow Plugin
+. An initial suite of SDN Client Controller "Backends": Floodlight, Ryu, Pyretic. Further controllers may be added over time as the engine is extensible.
+
+=== How to develop with the NetIDE project ===
+
+The NetIDE packages can be added as dependencies in Maven projects by putting the
+following code in the _pom.xml_ file.
+
+    <dependency>
+        <groupId>org.opendaylight.netide</groupId>
+        <artifactId>api</artifactId>
+        <version>${NETIDE_VERSION}</version>
+    </dependency>
+
+The current stable version for NetIDE is `0.1.0-Beryllium`.
+
diff --git a/manuals/developer-guide/src/main/asciidoc/openflowplugin/odl-ofp-developer-guide.adoc b/manuals/developer-guide/src/main/asciidoc/openflowplugin/odl-ofp-developer-guide.adoc
new file mode 100644 (file)
index 0000000..b889957
--- /dev/null
@@ -0,0 +1,49 @@
+[[openflow-plugin-project-developer-guide]]
+== OpenFlow Plugin Project Developer Guide
+
+This section covers topics which are developer specific and which have not been
+covered in the user guide. Please see the Lithium OpenFlow plugin user
+guide first.
+
+It can be found on https://www.opendaylight.org/downloads[the OpenDaylight software download page].
+
+include::odl-ofp-sequence-diagram.adoc[]
+
+// include::odl-ofp-config-subsystem.adoc[]
+
+// include::odl-ofp-message-spy.adoc[]
+
+// * OpenDaylight_OpenFlow_Plugin:Backlog:Extensibility[Extensibility Framework]
+
+// include::odl-ofp-yang-models.adoc[]
+
+// include::odl-ofp-feature-tree.adoc[]
+
+// include::odl-ofp-wiring-up-notifications.adoc[]
+
+=== Message Order Preservation
+
+While the Helium release of OpenFlow Plugin relied on queues to ensure messages were delivered in order, subsequent releases instead ensure that all the messages from a given device are delivered using the same thread and thus message order is guaranteed without queues. The OpenFlow plugin allocates a number of threads equal to twice the number of processor cores on machine it is run, e.g., 8 threads if the machine has 4 cores.
+
+NOTE:
+While each device is assigned to one thread, multiple devices can be assigned to the same thread.
+
+// == Tutorial / How-To
+
+// missing content
+
+// * OpenDaylight_OpenFlow_Plugin::Build_Instructions[Build Instructions]
+
+// * OpenDaylight_OpenFlow_Plugin::MininetFromScratch[Mininet from scratch]
+
+// * OpenDaylight_OpenFlow_Plugin::Mininet with multiple controllers[Mininet with multiple controllers]
+
+// * OpenDaylight_OpenFlow_Plugin:Coding_Hints[Coding hints]
+
+// * OpenDaylight_OpenFlow_Plugin::Wiring up Notifications[Wiring up Notifications]
+
+// * OpenDaylight_OpenFlow_Plugin::Python_test_scripts[Python test-scripts]
+
+// * OpenDaylight_OpenFlow_Plugin:Robot_Framework_Tests[Setup robot testing environment]
+
+// * OpenDaylight_OpenFlow_Plugin::LiProposal_dev_setup[Lithium proposal - dev setup]
diff --git a/manuals/developer-guide/src/main/asciidoc/openflowplugin/odl-ofp-sequence-diagram.adoc b/manuals/developer-guide/src/main/asciidoc/openflowplugin/odl-ofp-sequence-diagram.adoc
new file mode 100644 (file)
index 0000000..4c54f56
--- /dev/null
@@ -0,0 +1,101 @@
+=== Event Sequences
+
+==== Session Establishment
+
+The <<_openflow_protocol_library_developer_guide,OpenFlow Protocol Library>> provides interface *SwitchConnectionHandler* which contains method _onSwitchConnected_ (step 1). This event is raised in the OpenFlow Protocol Library when an OpenFlow device connects to OpenDaylight and caught in the *ConnectionManagerImpl* class in the OpenFlow plugin.
+
+There the plugin creates a new instance of the *ConnectionContextImpl* class (step 1.1) and also instances of *HandshakeManagerImpl* (which uses *HandshakeListenerImpl*) and *ConnectionReadyListenerImpl*. *ConnectionReadyListenerImpl* contains method _onConnectionReady()_ which is called when connection is prepared. This method starts the handshake with the OpenFlow device (switch) from the OpenFlow plugin side. Then handshake can be also started from device side. In this case method _shake()_ from *HandshakeManagerImpl* is called (steps 1.1.1 and 2).
+
+The handshake consists of an exchange of HELLO messages in addition to an exchange of device features (steps 2.1. and 3). The handshake is completed by *HandshakeManagerImpl*. After receiving device features, the *HandshakeListenerImpl* is notifed via the _onHanshakeSuccessfull()_ method. After this, the device features, node id and connection state are stored in a *ConnectionContext* and the method _deviceConnected()_ of *DeviceManagerImpl* is called.
+
+When _deviceConnected()_ is called, it does the following:
+
+. creates a new transaction chain (step 4.1)
+. creates a new instance of *DeviceContext* (step 4.2.2) 
+. initializes the device context: the static context of device is populated by calling _createDeviceFeaturesForOF<version>()_ to populate table, group, meter features and port descriptions (step 4.2.1 and 4.2.1.1)
+. creates an instance of *RequestContext* for each type of feature
+
+When the OpenFlow device responds to these requests (step 4.2.1.1) with multipart replies (step 5) they are processed and stored to MD-SAL operational datastore. The  _createDeviceFeaturesForOF<version>()_ method returns a *Future* which is processed in the callback (step 5.1) (part of _initializeDeviceContext()_ in the _deviceConnected()_ method) by calling the method _onDeviceCtxLevelUp()_ from *StatisticsManager* (step 5.1.1).
+
+The call to _createDeviceFeaturesForOF<version>()_:
+. creates a new instance of *StatisticsContextImpl* (step 5.1.1.1).
+
+. calls _gatherDynamicStatistics()_ on that instance which returns a *Future* which will produce a value when done
+.. this method calls methods to get dynamic data (flows, tables, groups) from the device (step 5.1.1.2, 5.1.1.2.1, 5.1.1.2.1.1)
+.. if everything works, this data is also stored in the MD-SAL operational datastore
+
+If the *Future* is successful, it is processed (step 6.1.1) in a callback in *StatisticsManagerImpl* which:
+
+. schedules the next time to poll the device for statistics
+. sets the device state to synchronized (step 6.1.1.2)
+. calls _onDeviceContextLevelUp()_ in *RpcManagerImpl*
+
+The _onDeviceContextLevelUp()_ call:
+
+. creates a new instance of *RequestContextImpl* 
+. registers implementation for supported services
+. calls _onDeviceContextLevelUp()_ in *DeviceManagerImpl* (step 6.1.1.2.1.2) which causes the information about the new device be be written to the MD-SAL operational datastore (step 6.1.1.2.2)
+
+image::openflowplugin/odl-ofp-session-establishment.jpg[SessionEstablishment,title="Session establishment", width="500"]
+
+// ===== Message Lifecycle Diagram
+
+// image::openflowplugin/odl-ofp-message-lifecycle.jpg[MessageLifecycle,title="MessageLifecycle",width="500"]
+
+==== Handshake
+
+The first thing that happens when an OpenFlow device connects to OpenDaylight is that the OpenFlow plugin gathers basic information about the device and establishes agreement on key facts like the version of OpenFlow which will be used. This process is called the handshake.
+
+The handshake starts with HELLO message which can be sent either by the OpenFlow device or the OpenFlow plugin. After this, there are several scenarios which can happen:
+
+. if the first HELLO message contains a _version bitmap_, it is possible to determine if there is a common version of OpenFlow or not:
+.. if there is a single common version use it and the *VERSION IS SETTLED*
+.. if there are more than one common versions, use the highest (newest) protocol and the *VERSION IS SETTLED*
+.. if there are no common versions, the device is *DISCONNECTED*
+. if the first HELLO message does not contain a _version bitmap_, then STEB-BY-STEP negotiation is used
+. if second (or more) HELLO message is received, then STEP-BY-STEP negotiation is used
+
+===== STEP-BY-STEP negotiation:
+
+* if last version proposed by the OpenFlow plugin is the same as the version received from the OpenFlow device, then the *VERSION IS SETTLED*
+* if the version received in the current HELLO message from the device is the same as from previous then negotiation has failed and the device is *DISCONNECTED*
+* if the last version from the device is greater than the last version proposed from the plugin, wait for the next HELLO message in the hope that it will advertise support for a lower version
+* if the last version from the device is is less than the last version proposed from the plugin:
+** propose the highest version the plugin supports that is less than or equal to the version received from the device and wait for the next HELLO message
+** if if the plugin doesn't support a lower version, the device is *DISCONNECTED*
+
+After selecting of version we can say that the *VERSION IS SETTLED* and the OpenFlow plugin can ask device for its features. At this point handshake ends.
+
+image::openflowplugin/odl-ofp-handshake.png[Handshake process,title="Handshake process",width="500"]
+
+// ====== Sequence Diagram
+
+// image::openflowplugin/odl-ofp-of10-switch-handshake-sequence.png[Core Code,title="Core Code",width="500"]
+
+
+// image::openflowplugin/odl-ofp-message-order-preservation.jpg[MessageOrderPreservation,title="MessageOrderPreservation",width="500"]
+
+
+==== Adding a Flow
+
+There are two ways to add a flow in in the OpenFlow plugin: adding it to the MD-SAL config datastore or calling an RPC. Both of these can either be done using the native MD-SAL interfaces or using RESTCONF. This discussion focuses on calling the RPC.
+
+If user send flow via REST interface (step 1) it will cause that _invokeRpc()_ is called on *RpcBroker*. The *RpcBroker* then looks for an appropriate implementation of the interface. In the case of the OpenFlow plugin, this is the _addFlow()_ method of *SalFlowServiceImpl* (step 1.1). The same thing happens if the RPC is called directly from the native MD-SAL interfaces.
+
+The _addFlow()_ method then
+
+. calls the _commitEntry()_ method (step 2) from the OpenFlow Protocol Library which is responsible for sending the flow to the device
+. creates a new *RequestContext* by calling _createRequestContext()_ (step 3)
+. creates a callback to handle any events that happen because of sending the flow to the device
+
+The callback method is triggered when a barrier reply message (step 2.1) is received from the device indicating that the flow was either installed or an appropriate error message was sent. If the flow was successfully sent to the device, the RPC result is set to success (step 5). // *SalFlowService* contains inside method _addFlow()_ other callback which caught notification from callback for barrier message.
+
+At this point, no information pertaining to the flow has been added to the MD-SAL operational datastore. That is accomplished by the periodic gathering of statistics from OpenFlow devices.
+
+The *StatisticsContext* for each given OpenFlow device periodically polls it using _gatherStatistics()_ of *StatisticsGatheringUtil* which issues an OpenFlow OFPT_MULTIPART_REQUEST - OFPMP_FLOW. The response to this request (step 7) is processed in *StatisticsGatheringUtil* class where flow data is written to the MD-SAL operational datastore via the _writeToTransaction()_ method of *DeviceContext*.
+
+image::openflowplugin/odl-ofp-add-flow.png[Add flow,title="Add flow",width="500"]
+
+// ===== Generic Notification Sequence Diagram
+
+// image::openflowplugin/odl-ofp-generic-notification.png[Generic notification,title="Generic notification",width="500"]
index bb8955b05164be1cf05acc63744bf4c4db2b33d8..5aa2fc2bde753f5e67b63bdce8ceeb6a0dc187ef 100644 (file)
@@ -2,3 +2,8 @@
 include::ovsdb-southbound-developer.adoc[]
 
 include::ovsdb-openstack-developer.adoc[]
+
+include::ovsdb-sfc-developer.adoc[]
+
+include::ovsdb-hwvtep-developer.adoc[]
+
diff --git a/manuals/developer-guide/src/main/asciidoc/ovsdb/ovsdb-hwvtep-developer.adoc b/manuals/developer-guide/src/main/asciidoc/ovsdb/ovsdb-hwvtep-developer.adoc
new file mode 100644 (file)
index 0000000..990e3ce
--- /dev/null
@@ -0,0 +1,10 @@
+== OVSDB Hardware VTEP Developer Guide
+
+=== Overview
+
+TBD
+
+=== OVSDB Hardware VTEP Architecture
+
+TBD
+
diff --git a/manuals/developer-guide/src/main/asciidoc/ovsdb/ovsdb-sfc-developer.adoc b/manuals/developer-guide/src/main/asciidoc/ovsdb/ovsdb-sfc-developer.adoc
new file mode 100644 (file)
index 0000000..6a7abf3
--- /dev/null
@@ -0,0 +1,10 @@
+== OVSDB Service Function Chaining Developer Guide
+
+=== Overview
+
+TBD
+
+=== OVSDB Hardware VTEP Architecture
+
+TBD
+
index ad59f4d51866c6b673c005245a306e78b5c943f1..b5027f0e51166afd0f2aebf146e26e01d061c21e 100644 (file)
@@ -1,7 +1,7 @@
 == SXP Developer Guide
 
 === Overview
-SXP (Source-Group Tag eXchange Protocol) project is an effort to enhance OpenDaylight platform with IP-SGT (IP Address to Source Group Tag) bindings that can be learned from connected SXP-aware network nodes. The current implementation supports SXP protocol version 4 according to the Smith, Kandula - SXP https://tools.ietf.org/html/draft-smith-kandula-sxp-02[IETF draft]. All protocol legacy versions 1-3 are supported as well. Additionally, version 4 adds bidirectional connection type as an extension of a unidirectional one.
+SXP (Source-Group Tag eXchange Protocol) project is an effort to enhance OpenDaylight platform with IP-SGT (IP Address to Source Group Tag) bindings that can be learned from connected SXP-aware network nodes. The current implementation supports SXP protocol version 4 according to the Smith, Kandula - SXP https://tools.ietf.org/html/draft-smith-kandula-sxp-04[IETF draft] and grouping of peers and creating filters based on ACL/Prefix-list syntax for filtering outbound and inbound IP-SGT bindings. All protocol legacy versions 1-3 are supported as well. Additionally, version 4 adds bidirectional connection type as an extension of a unidirectional one.
 
 === SXP Architecture
 The SXP Server manages all connected clients in separate threads and a common SXP protocol agreement is used between connected peers. Each SXP network peer is modelled with its pertaining class, e.g., SXP Server represents the SXP Speaker, SXP Listener the Client. The server program creates the ServerSocket object on a specified port and waits until a client starts up and requests connect on the IP address and port of the server. The client program opens a Socket that is connected to the server running on the specified host IP address and port.
@@ -18,6 +18,8 @@ The IP-SGT Manager also contains RPCs that can be used by other OpenDaylight plu
 
 The SXP Binding Dispatcher represents a selector that will decides how many data from the SXP-database will be sent and when. It is responsible for message content composition based on maximum message length.
 
+The SXP Binding Filters handles filtering of outcoming and incoming IP-SGT bindings according to BGP filtering using ACL and Prefix List syntax for specifiing filter.
+
 === Key APIs and Interfaces
 As this project is fairly small, it provides only few features that install and
 provide all APIs and implementations for this project.
@@ -37,4 +39,4 @@ Main logic and core features
 
 === API Reference Documentation
 https://wiki.opendaylight.org/images/9/91/SXP_Restconf_Interface_and_Dynamic_Tree.pdf[RESTCONF Interface and Dynamic Tree]
-
+https://wiki.opendaylight.org/images/6/6e/SXP_Specification_and_Architecture_v03.pdf[Specification and Architecture]
diff --git a/manuals/developer-guide/src/main/asciidoc/yang-push/odl-yang-push-dev.adoc b/manuals/developer-guide/src/main/asciidoc/yang-push/odl-yang-push-dev.adoc
new file mode 100644 (file)
index 0000000..be5256c
--- /dev/null
@@ -0,0 +1,69 @@
+== YANG-PUSH Developer Guide
+
+=== Overview
+The YANG PUBSUB project allows subscriptions to be placed on
+targeted subtrees of YANG datastores residing on remote devices.
+Changes in YANG objects within the remote subtree can be pushed
+to an OpenDaylight controller as specified without a requiring
+the controller to make a continuous set of fetch requests.
+
+==== YANG-PUSH capabilities available
+
+This module contains the base code which embodies the intent of YANG-PUSH requirements for subscription as defined in {i2rs-pub-sub-requirements} [https://datatracker.ietf.org/doc/draft-ietf-i2rs-pub-sub-requirements/].   The mechanism for delivering on these YANG-PUSH requirements over Netconf transport is defined in {netconf-yang-push} [netconf-yang-push: https://tools.ietf.org/html/draft-ietf-netconf-yang-push-00].  
+
+Note that in the current release, not all capabilities of draft-ietf-netconf-yang-push are realized.   Currently only implemented is *create-subscription* RPC support from ietf-datastore-push@2015-10-15.yang; and this will be for periodic subscriptions only.  There of course is intent to provide much additional functionality in future OpenDaylight releases.
+
+==== Future YANG-PUSH capabilities
+
+Over time, the intent is to flesh out more robust capabilities which will allow OpenDaylight applications to subscribe to YANG-PUSH compliant devices.  Capabilities for future releases will include:
+
+Support for subscription change/delete:
+*modify-subscription* rpc support for all mountpoint devices or particular mountpoint device
+*delete-subscription* rpc support for all mountpoint devices or particular mountpoint device
+
+Support for static subscriptions:
+This will enable the receipt of subscription updates pushed from publishing devices where no signaling from the controller has been used to establish the subscriptions.
+
+Support for additional transports:
+NETCONF is not the only transport of interest to OpenDaylight or the subscribed devices.  Over time this code will support Restconf and HTTP/2 transport requirements defined in {netconf-restconf-yang-push} [https://tools.ietf.org/html/draft-voit-netconf-restconf-yang-push-01]
+
+
+=== YANG-PUSH Architecture
+
+The code architecture of Yang push consists of two main elements
+
+YANGPUSH Provider
+YANGPUSH Listener
+
+YANGPUSH Provider receives create-subscription requests from applications and then establishes/registers the corresponding listener which will receive information pushed by a publisher.  In addition, YANGPUSH Provider also invokes an augmented OpenDaylight create-subscription RPC which enables applications to register for notification as per rfc5277. This augmentation adds periodic time period (duration) and subscription-id values to the existing RPC parameters. The Java package supporting this capability is “org.opendaylight.yangpush.impl”. Below class supports the YANGPUSH Provider capability:
+
+(1) YangpushDomProvider
+The Binding Independent version. It uses a neutral data Document Object Model format for data and API calls, which is independent of any generated Java language bindings from the YANG model.
+
+
+The YANGPUSH Listener accepts update notifications from a device after they have been de-encapsulated from the NETCONF transport.  The YANGPUSH Listener then passes these updates to MD-SAL.  This function is implemented via the YangpushDOMNotificationListener class within the “org.opendaylight.yangpush.listner” Java package.
+
+=== Key APIs and Interfaces
+
+==== YangpushDomProvider
+
+Central to this is onSessionInitiated  which acquires the Document Object Model format based versions of MD-SAL services, including the MountPoint service and RPCs.  Via these acquired services, invoke registerDataChangeListener over in YangpushDOMNotificationListener.
+
+==== YangpushDOMNotificationListener
+This API handles instances of a received Push Updates which are inbound to the listener and places these in MD-SAL.   Key classes in include:
+
+onPushUpdate
+Converts and validates the encoding of the pushed subscription update. If the subscription exists and is active, calls updateDataStoreForPushUpdate so that the information can be put in MD-SAL. Finally logs the pushed subscription update as well as some additional context information.
+
+updateDataStoreForPushUpdate
+Used to put the published information into MD-SAL.  This pushed information will also include elements such as the subscription-id, the identity of the publisher, the time of the update, the incoming encoding type, and the pushed YANG subtree information.
+
+YangpushDOMNotificationListener
+Starts the listener tracking a new Subscription ID from a particular publisher.
+
+
+=== API Reference Documentation
+Javadocs are generated while creating mvn:site
+and they are located in target/ directory in each module.
+
+
diff --git a/manuals/developer-guide/src/main/resources/images/openflowplugin/odl-ofp-add-flow.png b/manuals/developer-guide/src/main/resources/images/openflowplugin/odl-ofp-add-flow.png
new file mode 100644 (file)
index 0000000..ffc50c2
Binary files /dev/null and b/manuals/developer-guide/src/main/resources/images/openflowplugin/odl-ofp-add-flow.png differ
diff --git a/manuals/developer-guide/src/main/resources/images/openflowplugin/odl-ofp-handshake.png b/manuals/developer-guide/src/main/resources/images/openflowplugin/odl-ofp-handshake.png
new file mode 100644 (file)
index 0000000..998e44c
Binary files /dev/null and b/manuals/developer-guide/src/main/resources/images/openflowplugin/odl-ofp-handshake.png differ
diff --git a/manuals/developer-guide/src/main/resources/images/openflowplugin/odl-ofp-session-establishment.jpg b/manuals/developer-guide/src/main/resources/images/openflowplugin/odl-ofp-session-establishment.jpg
new file mode 100644 (file)
index 0000000..13b797e
Binary files /dev/null and b/manuals/developer-guide/src/main/resources/images/openflowplugin/odl-ofp-session-establishment.jpg differ
index f8b3ea87543bd4c6fb142f4870dcc10c5981d47d..2bce06cd1fb5d6cd00a24c96cb3860cc90d18bfd 100644 (file)
@@ -4,7 +4,7 @@
   <parent>
     <groupId>org.opendaylight.docs</groupId>
     <artifactId>manuals</artifactId>
-    <version>0.2.0-SNAPSHOT</version>
+    <version>0.3.0-SNAPSHOT</version>
     <relativePath>../pom.xml</relativePath>
   </parent>
   <modelVersion>4.0.0</modelVersion>
index f3b900297e6fe7833640ed85e4eb9dd82e307718..a8f2300be8d8f1db29fe18bce283022f46168d75 100755 (executable)
@@ -1,6 +1,6 @@
-== Getting and Installing OpenDaylight Lithium
+== Getting and Installing OpenDaylight
 
-=== Downloading and installing OpenDaylight Lithium
+=== Downloading and installing OpenDaylight
 The default distribution can be found on the OpenDaylight software
 download page: http://www.opendaylight.org/software/downloads
 
diff --git a/manuals/getting-started-guide/src/main/asciidoc/ovsdb/ovsdb-hwvtep-install.adoc b/manuals/getting-started-guide/src/main/asciidoc/ovsdb/ovsdb-hwvtep-install.adoc
new file mode 100644 (file)
index 0000000..30d9b7f
--- /dev/null
@@ -0,0 +1,38 @@
+== OVSDB NetVirt Hardware VTEP Installation Guide
+
+=== Overview
+
+TBD
+
+=== Preparing for Installation
+Follow the instructions in <<_getting_and_installing_opendaylight,Getting and Installing OpenDaylight>>.
+
+=== Installing OVSDB NetVirt Hardware VTEP
+Install the required features with the following command:
+-----
+feature:install odl-ovsdb-netvirt-hwvtep
+-----
+
+==== Sample output from the Karaf console
+----
+TBD
+----
+
+=== Verifying your Installation
+To verify that the installation was successful, use the following command in karaf and check that there
+are no error logs relating to odl-ovsdb-netvirt-hwvtep
+-----
+log:display
+-----
+
+==== Troubleshooting
+
+TBD
+
+=== Uninstalling OVSDB NetVirt Hardware VTEP
+. Shutdown the karaf instance: 
++
+-----
+system:shutdown
+-----
+. Remove what is in the /data folder of the OpenDaylight Distribution.
index 39aaeeb84f019451de4f75120bcf7cc253cf2c78..576872e7eec4aeda7be3c90b376a5ee8f044c410 100644 (file)
@@ -1,2 +1,7 @@
 
 include::ovsdb-openstack-install.adoc[]
+
+include::ovsdb-sfc-install.adoc[]
+
+include::ovsdb-hwvtep-install.adoc[]
+
index 449c1c68c24e91d81f862db8a41ab73fd43d70f3..5ac4c8c8293641e92735b138e9cd8a078ceb2422 100644 (file)
@@ -9,21 +9,14 @@ For information on OVS, see http://openvswitch.org/[Open vSwitch].
 With OpenStack within the SDN context, controllers and applications interact using two channels: OpenFlow and OVSDB. OpenFlow addresses the forwarding-side of the OVS functionality. OVSDB, on the other hand, addresses the management-plane.
 A simple and concise overview of Open Virtual Switch Database (OVSDB) is available at: http://networkstatic.net/getting-started-ovsdb/
 
-=== Pre Requisites for Installing OVSDB OpenStack
-* JRE 1.7+
-* A distribution of OpenDaylight
-
 === Preparing for Installation
-. Download a copy of the latest OpenDaylight release in a Pre-Build archive of your choosing.
-http://www.opendaylight.org/software/downloads[Download OpenDaylight]
-
+Follow the instructions in <<_getting_and_installing_opendaylight,Getting and Installing OpenDaylight>>.
 
 === Installing OVSDB OpenStack
-. Extract the OpenDaylight distribution somewhere.
-. Navigate to the /bin/ directory
-. Execute the karaf binary file, that should bring up the OpenDaylight console
-. Install the required features with these commands:
+Install the required features with the following command:
+-----
 feature:install odl-ovsdb-openstack
+-----
 
 ==== Sample output from the Karaf console
 ----
@@ -41,8 +34,11 @@ OpenDaylight :: OVSDB :: OpenStack Network Virtual
 ----
 
 === Verifying your Installation
-To verify that the installation was successful, use the log:display command in karaf and check that there are no errors
+To verify that the installation was successful, use the following command in karaf and check that there are no errors
 logs relating to odl-ovsdb-openstack.
+-----
+log:display
+-----
 
 ==== Troubleshooting
 There is no easy way to troubleshoot an installation of odl-ovsdb-openstack. Perhaps a combination of
@@ -50,5 +46,9 @@ log:display | grep -i ovsdb in karaf, Open vSwitch commands (ovs-vsctl) and Open
 explain everything.
 
 === Uninstalling OVSDB OpenStack
-. Shutdown the karaf instance: system:shutdown
+. Shutdown the karaf instance:
++
+-----
+system:shutdown
+-----
 . Remove what is in the /data folder of the OpenDaylight Distribution.
diff --git a/manuals/getting-started-guide/src/main/asciidoc/ovsdb/ovsdb-sfc-install.adoc b/manuals/getting-started-guide/src/main/asciidoc/ovsdb/ovsdb-sfc-install.adoc
new file mode 100644 (file)
index 0000000..1f8c490
--- /dev/null
@@ -0,0 +1,37 @@
+== OVSDB Service Function Chaining Installation Guide
+
+=== Overview
+
+TBD
+
+=== Preparing for Installation
+Follow the instructions in <<_getting_and_installing_opendaylight,Getting and Installing OpenDaylight>>.
+
+=== Installing OVSDB Service Function Chaining
+Install the required features with the following command:
+-----
+feature:install odl-ovsdb-sfc-ui
+-----
+
+==== Sample output from the Karaf console
+----
+TBD
+----
+
+=== Verifying your Installation
+To verify that the installation was successful, use the following command in karaf and check that there are
+no error logs relating to odl-ovsdb-sfc
+-----
+log:display
+-----
+==== Troubleshooting
+
+TBD
+
+=== Uninstalling OVSDB Service Function Chaining
+. Shutdown the karaf instance: 
++
+-----
+system:shutdown
+-----
+. Remove what is in the /data folder of the OpenDaylight Distribution.
index 8ccd1b08cf722b068d48ec9f9e10909da3595b81..9968a3cf5515b5f6512987c22e43b3e231913cbe 100644 (file)
@@ -28,7 +28,7 @@ The VTN Coordinator is an external application that provides a REST interface fo
 
 ===== Running the Karaf distribution
 
-Follow the instructions in <<_getting_and_installing_opendaylight_lithium,Getting and Installing OpenDaylight>>.
+Follow the instructions in <<_getting_and_installing_opendaylight,Getting and Installing OpenDaylight>>.
 
 ==== VTN Coordinator
 
@@ -114,4 +114,4 @@ The response should be like this, but version might differ:
 
   /usr/local/vtn/bin/vtn_stop
 
-  Remove the usr/local/vtn folder
\ No newline at end of file
+  Remove the usr/local/vtn folder
index 6a02e0469c8961d72753b5639728a8a85fbe8538..22b9b9ec9a40a94468551ec78f561efa1b8cf76b 100644 (file)
@@ -4,7 +4,7 @@
   <parent>
     <groupId>org.opendaylight.docs</groupId>
     <artifactId>manuals</artifactId>
-    <version>0.2.0-SNAPSHOT</version>
+    <version>0.3.0-SNAPSHOT</version>
     <relativePath>../pom.xml</relativePath>
   </parent>
   <modelVersion>4.0.0</modelVersion>
index 3a845ddb99d674433df6ec795336437a00cef35b..eb8f2d530af42a6fd321d6d9c09e4b252708118e 100644 (file)
@@ -4,13 +4,13 @@
   <parent>
     <groupId>org.opendaylight.docs</groupId>
     <artifactId>root</artifactId>
-    <version>0.2.0-SNAPSHOT</version>
+    <version>0.3.0-SNAPSHOT</version>
     <relativePath>../pom.xml</relativePath>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <groupId>org.opendaylight.docs</groupId>
   <artifactId>manuals</artifactId>
-  <version>0.2.0-SNAPSHOT</version>
+  <version>0.3.0-SNAPSHOT</version>
   <name>OpenDaylight Docs - Manuals</name>
   <packaging>pom</packaging>
   <scm>
index 779ab3bde6a227a07d5c5a492b4e022f70a91399..bfcb76f67f82be526f1fe00a79a1a4a5eeedc06b 100644 (file)
@@ -4,7 +4,7 @@
   <parent>
     <groupId>org.opendaylight.docs</groupId>
     <artifactId>manuals</artifactId>
-    <version>0.2.0-SNAPSHOT</version>
+    <version>0.3.0-SNAPSHOT</version>
     <relativePath>../pom.xml</relativePath>
   </parent>
   <modelVersion>4.0.0</modelVersion>
index 55c777ad38e6a3c15cdf67a43ffd1bda95b4261e..5fc0cc1f1cbbf9df4fe6b861c0d94f6c5cb9f597 100644 (file)
@@ -4,7 +4,7 @@
   <parent>
     <groupId>org.opendaylight.docs</groupId>
     <artifactId>manuals</artifactId>
-    <version>0.2.0-SNAPSHOT</version>
+    <version>0.3.0-SNAPSHOT</version>
     <relativePath>../pom.xml</relativePath>
   </parent>
   <modelVersion>4.0.0</modelVersion>
index bfd1c7028cf6671193c0c840d81fb650f8125bc1..c8907e6a86a2a08cdc641bfd72438d9259dec8f8 100644 (file)
@@ -4,13 +4,28 @@ and contains contains configuration, administration, and management
 sections for the feature.
 
 === Overview
-TBD: An overview of the Armoury feature and the use case and the
-audience who will use the feature.
+Just as compute needs to make requests to the controller to get networking
+resources in order to provide its services, so too does the controller
+sometimes need to make requests of the workload manager to get compute
+resources and/or network function (NF) (physical or virtual) orchestration
+to provide its services.
 
 === Armoury Architecture
-TBD: Information about Armoury components and how they work together.
-Also include information about how the feature integrates with
-OpenDaylight.
+There are mainly three components :
+
+* *Armoury Catalog*
+A registry or catalog of the necessary information (images, metadata, templatized
+day 0 config, how to communicate with the NF, etc) to describe the NF to the
+workload manager and/or network function (NF) (physical or virtual) orchestration.
+
+* *Armoury Workload Manager*
+The most minimal possible API to allow applications to request that the workload
+manager start/stop/etc the NF and some information from the workload manager/nf
+orchestrator about the state of the NF.
+
+* *Armoury Driver Registry*
+Example Drivers to talk to various workload managers (OpenStack/Meseophere/Docker/
+Kubernetes/etc).
 
 === Armoury Catalog
 The NF Catalog contains metadata describing a NF.
@@ -25,13 +40,24 @@ for using Armoury Catalog.
 === Armoury Workload Manager
 The Workload Manager defines RPCs to manage instances.
 
-=== Configuring Armoury Workload Manager
+==== Configuring Armoury Workload Manager
 TBD: Describe how to configure Armoury Workload Manager after installation.
 
-=== Administering Armoury Workload Manager
+==== Administering Armoury Workload Manager
 TBD: Include related command reference or operations
 for using Armoury Workload Manager.
 
+=== Armoury Driver Registry
+The Driver Registry Describes the driver that is used to talk with the
+workload manager (OpenStack/Meseophere/Docker/Kubernetes/etc).
+
+==== Configuring Armoury Driver Registry
+TBD: Describe how to configure Armoury Driver Registry.
+
+==== Administering Armoury Driver Registry
+TBD: Include related command reference or operations
+for using Driver Registry.
+
 === Tutorials
 Below are tutorials for Armoury.
 
@@ -66,3 +92,19 @@ TBD: Include any topology requirement for the use case.
 
 ===== Instructions
 TBD: Step by step procedure for using Armoury Workload Manager.
+
+==== Using Armoury Driver Registry
+TBD: State the purpose of tutorial
+
+===== Overview
+TBD: An overview of the Armoury Driver Registry tutorial
+
+===== Prerequisites
+TBD: Provide any prerequisite information, assumed knowledge, or environment
+required to execute the use case.
+
+===== Target Environment
+TBD: Include any topology requirement for the use case.
+
+===== Instructions
+TBD: Step by step procedure for using Armoury Driver Registry.
\ No newline at end of file
index ecef9e35d456fb6165425700fc421e147504dd86..5865de4df83b6cb4d6876414b613ecb99f32aa64 100644 (file)
@@ -50,10 +50,16 @@ include::lacp/lacp-user.adoc[LACP]
 
 include::lfm/lispflowmapping-msmr-user.adoc[LISP flow mapping]
 
+include::nemo/odl-nemo-engine-user.adoc[NEMO]
+
+include::netide/odl-netide-user-guide.adoc[NetIDE]
+
 include::nic/nic-user.adoc[NIC]
 
 include::sdninterfaceapp/odl-sdninterfaceapp-all-user.adoc[ODL-SDNi]
 
+include::openflowplugin/odl-ofp-user-guide.adoc[OpenFlow Plugin]
+
 include::opflex/agent-ovs-user.adoc[]
 
 include::bgpcep/odl-bgpcep-pcep-all-user.adoc[PCEP]
@@ -79,3 +85,5 @@ include::usc/odl-usc-channel-user.adoc[USC]
 include::vtn/vtn-user.adoc[]
 
 include::controller/netconf/odl-netconf-user.adoc[]
+
+include::yang-push/odl-yang-push-user.adoc[YANG-PUSH]
diff --git a/manuals/user-guide/src/main/asciidoc/nemo/odl-nemo-engine-user.adoc b/manuals/user-guide/src/main/asciidoc/nemo/odl-nemo-engine-user.adoc
new file mode 100644 (file)
index 0000000..5ae979a
--- /dev/null
@@ -0,0 +1,39 @@
+== NEtwork MOdeling (NEMO)
+This section describes how to use the NEMO feature in OpenDaylight
+and contains contains configuration, administration, and management
+sections for the feature.
+
+=== Overview
+TBD: An overview of the NEMO feature and the use case and the
+audience who will use the feature.
+
+=== NEMO Engine Architecture
+TBD: Information about NEMO Engine components and how they work together.
+Also include information about how the feature integrates with
+OpenDaylight.
+
+=== Configuring NEMO Engine
+TBD: Describe how to configure the NEMO Engine after installation.
+
+=== Administering or Managing NEMO Engine
+TBD: Include related command reference or  operations
+for using the NEMO Engine.
+
+=== Tutorials
+Below are tutorials for NEMO Engine.
+
+==== Using NEMO Engine
+TBD: State the purpose of tutorial
+
+===== Overview
+TBD: An overview of the NEMO tutorial
+
+===== Prerequisites
+TBD: Provide any prerequisite information, assumed knowledge, or environment
+required to execute the use case.
+
+===== Target Environment
+TBD: Include any topology requirement for the use case.
+
+===== Instructions
+TBD: Step by step procedure for using NEMO Engine.
diff --git a/manuals/user-guide/src/main/asciidoc/netide/odl-netide-user-guide.adoc b/manuals/user-guide/src/main/asciidoc/netide/odl-netide-user-guide.adoc
new file mode 100644 (file)
index 0000000..1f13e1c
--- /dev/null
@@ -0,0 +1,19 @@
+== NetIDE User Guide
+
+=== Overview
+OpenDaylight's NetIDE project allows users to run SDN applications written for different 
+SDN controllers eg, Floodlight, Ryu on top of OpenDaylight managed infrastructure.
+
+=== NetIDE API
+==== Architecture and Design
+The NetIDE engine follows the ONF's proposed Client/Server SDN Application architecture
+
+==== Core
+The NetIDE Core is a message based system that allows for the exchange of messages between
+OpenDaylight and subscribed Client SDN Controllers
+
+==== Configuration
+Below are the configuration items which can be edited, including their default values.
+
+
+
diff --git a/manuals/user-guide/src/main/asciidoc/openflowplugin/odl-ofp-coverage.adoc b/manuals/user-guide/src/main/asciidoc/openflowplugin/odl-ofp-coverage.adoc
new file mode 100644 (file)
index 0000000..bb6fc55
--- /dev/null
@@ -0,0 +1,22 @@
+===== Intro
+
+This page is to catalog the things that have been tested and confirmed
+to work:
+
+===== Coverage
+Coverage has been moved to a link:https://docs.google.com/spreadsheet/ccc?key=0AtpUuSEP8OyMdHNTZjBoM0VjOE9BcGhHMzk3N19uamc&usp=sharing%23gid=2#gid=0[GoogleDoc Spreadshee]
+
+===== OF 1.3 Considerations
+
+The baseline model is a OF 1.3 model, and the coverage tables primarily
+deal with OF 1.3. However for OF 1.0, we have a column to indicate
+either N/A if it doesn't apply, or whether its been confirmed working.
+
+===== OF 1.0 Considerations
+
+OF 1.0 is being considered as a switch with:
+* 1 Table
+* 0 Groups
+* 0 Meters
+* 1 Instruction (Apply Actions)
+* and a limited vocabulary of matches and actions.
diff --git a/manuals/user-guide/src/main/asciidoc/openflowplugin/odl-ofp-end-to-end-flows.adoc b/manuals/user-guide/src/main/asciidoc/openflowplugin/odl-ofp-end-to-end-flows.adoc
new file mode 100644 (file)
index 0000000..e33c90c
--- /dev/null
@@ -0,0 +1,827 @@
+[[instructions]]
+===== Instructions
+
+[[learn-end-to-end-for-inventory]]
+====== Learn End to End for Inventory
+<<odl-ofp-end-to-end-inventory_introduction-introduction,End to End Inventory>>
+
+[[check-inventory]]
+====== Check inventory
+
+* Run mininet with support for OF 1.3 as described in
+<<odl-ofp-end-to-end-inventory_introduction-introduction,End to End Inventory>>
+* Make sure you see the openflow:1 node come up as described in
+<<odl-ofp-end-to-end-inventory_introduction-introduction,End to End Inventory>>
+
+[[flow-strategy]]
+====== Flow Strategy
+
+Current way to flush a flow to switch looks like this:
+
+1.  Create MD-SAL modeled flow and commit it into dataStore using two
+phase commit https://wiki.opendaylight.org/view/OpenDaylight_Controller:MD-SAL:FAQ[MD-SAL FAQ]
+2.  FRM gets notified and invokes corresponding rpc (addFlow) on
+particular service provider (if suitable provider for given node
+registered)
+3.  The provider (plugin in this case) transforms MD-SAL modeled flow
+into OF-API modeled flow
+4.  OF-API modeled flow is then flushed into OFLibrary
+5.  OFLibrary encodes flow into particular version of wire protocol and
+sends it to particular switch
+6.  Check on mininet side if flow is set
+
+[[push-your-flow]]
+====== Push your flow
+
+* With PostMan:
+** Set headers:
+*** Content-Type: application/xml   
+*** Accept: application/xml
+*** Authentication
+** Use URL: "http://<controller IP>:8181/restconf/config/opendaylight-inventory:nodes/node/openflow:1/table/0/flow/1"
+** PUT
+** Use Body:
+
+[source,xml]
+---------------------------------------------------------
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<flow xmlns="urn:opendaylight:flow:inventory">
+    <priority>2</priority>
+    <flow-name>Foo</flow-name>
+    <match>
+        <ethernet-match>
+            <ethernet-type>
+                <type>2048</type>
+            </ethernet-type>
+        </ethernet-match>
+        <ipv4-destination>10.0.10.2/24</ipv4-destination>
+    </match>
+    <id>1</id>
+    <table_id>0</table_id>
+    <instructions>
+        <instruction>
+            <order>0</order>
+            <apply-actions>
+                <action>
+                   <order>0</order>
+                   <dec-nw-ttl/>
+                </action>
+            </apply-actions>
+        </instruction>
+    </instructions>
+</flow>
+---------------------------------------------------------
+
+**Note*: If you want to try a different flow id or a different table,
+make sure the URL and the body stay in sync. For example, if you wanted
+to try: table 2 flow 20 you'd change the URL to: 
+
+"http://<controller
+IP>:8181/restconf/config/opendaylight-inventory:nodes/node/openflow:1/table/2/flow/20"
+
+but you would also need to update the 20 and 2 in the body of the XML.
+
+Other caveat, we have a known bug with updates, so please only write to
+a given flow id and table id on a given node once at this time until we
+resolve it. Or you can use the DELETE method with the same URL in
+PostMan to delete the flow information on switch and controller cache.
+
+[[check-for-your-flow-on-the-switch]]
+====== Check for your flow on the switch
+
+* See your flow on your mininet:
+
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------
+mininet@mininet-vm:~$ sudo ovs-ofctl -O OpenFlow13 dump-flows s1
+OFPST_FLOW reply (OF1.3) (xid=0x2):
+cookie=0x0, duration=7.325s, table=0, n_packets=0, n_bytes=0, idle_timeout=300, hard_timeout=600, send_flow_rem priority=2,ip,nw_dst=10.0.10.0/24 actions=dec_ttl
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------
+
+If you want to see the above information from the mininet prompt - use
+"sh" instead of "sudo" i.e. use "sh ovs-ofctl -O OpenFlow13 dump-flows
+s1".
+
+[[check-for-your-flow-in-the-controller-config-via-restconf]]
+====== Check for your flow in the controller config via RESTCONF
+
+* See your configured flow in POSTMAN with
+** URL http://<controller
+IP>:8181/restconf/operational/opendaylight-inventory:nodes/node/openflow:1/table/0/
+** GET
+** You no longer need to set Accept header
+
+Return Response:
+
+[source,json]
+---------------
+{
+  "flow-node-inventory:table": [
+    {
+      "flow-node-inventory:id": 0,
+      "flow-node-inventory:flow": [
+        {
+          "flow-node-inventory:priority": 1,
+          "flow-node-inventory:id": "10b1a23c-5299-4f7b-83d6-563bab472754",
+          "flow-node-inventory:table_id": 0,
+          "flow-node-inventory:hard-timeout": 0,
+          "flow-node-inventory:idle-timeout": 0,
+          "flow-node-inventory:instructions": {
+            "flow-node-inventory:instruction": [
+              {
+                "flow-node-inventory:apply-actions": {
+                  "flow-node-inventory:action": [
+                    {
+                      "flow-node-inventory:output-action": {
+                        "flow-node-inventory:output-node-connector": "openflow:1:1"
+                      },
+                      "flow-node-inventory:order": 0
+                    }
+                  ]
+                },
+                "flow-node-inventory:order": 0
+              }
+            ]
+          },
+          "flow-node-inventory:match": {
+            "flow-node-inventory:ethernet-match": {
+              "flow-node-inventory:ethernet-type": {
+                "flow-node-inventory:type": 2048
+              }
+            },
+            "flow-node-inventory:ipv4-destination": "10.0.0.2"
+          },
+          "flow-node-inventory:cookie": 0
+        },
+        {
+          "flow-node-inventory:priority": 1,
+          "flow-node-inventory:id": "020bf359-1299-4da6-b4f7-368bd83b5841",
+          "flow-node-inventory:table_id": 0,
+          "flow-node-inventory:hard-timeout": 0,
+          "flow-node-inventory:idle-timeout": 0,
+          "flow-node-inventory:instructions": {
+            "flow-node-inventory:instruction": [
+              {
+                "flow-node-inventory:apply-actions": {
+                  "flow-node-inventory:action": [
+                    {
+                      "flow-node-inventory:output-action": {
+                        "flow-node-inventory:output-node-connector": "openflow:1:1"
+                      },
+                      "flow-node-inventory:order": 0
+                    }
+                  ]
+                },
+                "flow-node-inventory:order": 0
+              }
+            ]
+          },
+          "flow-node-inventory:match": {
+            "flow-node-inventory:ethernet-match": {
+              "flow-node-inventory:ethernet-type": {
+                "flow-node-inventory:type": 2048
+              }
+            },
+            "flow-node-inventory:ipv4-destination": "10.0.0.1"
+          },
+          "flow-node-inventory:cookie": 0
+        },
+        {
+          "flow-node-inventory:priority": 1,
+          "flow-node-inventory:id": "42172bfc-9142-4a92-9e90-ee62529b1e85",
+          "flow-node-inventory:table_id": 0,
+          "flow-node-inventory:hard-timeout": 0,
+          "flow-node-inventory:idle-timeout": 0,
+          "flow-node-inventory:instructions": {
+            "flow-node-inventory:instruction": [
+              {
+                "flow-node-inventory:apply-actions": {
+                  "flow-node-inventory:action": [
+                    {
+                      "flow-node-inventory:output-action": {
+                        "flow-node-inventory:output-node-connector": "openflow:1:1"
+                      },
+                      "flow-node-inventory:order": 0
+                    }
+                  ]
+                },
+                "flow-node-inventory:order": 0
+              }
+            ]
+          },
+          "flow-node-inventory:match": {
+            "flow-node-inventory:ethernet-match": {
+              "flow-node-inventory:ethernet-type": {
+                "flow-node-inventory:type": 2048
+              }
+            },
+            "flow-node-inventory:ipv4-destination": "10.0.0.3"
+          },
+          "flow-node-inventory:cookie": 0
+        },
+        {
+          "flow-node-inventory:priority": 1,
+          "flow-node-inventory:id": "99bf566e-89f3-4c6f-ae9e-e26012ceb1e4",
+          "flow-node-inventory:table_id": 0,
+          "flow-node-inventory:hard-timeout": 0,
+          "flow-node-inventory:idle-timeout": 0,
+          "flow-node-inventory:instructions": {
+            "flow-node-inventory:instruction": [
+              {
+                "flow-node-inventory:apply-actions": {
+                  "flow-node-inventory:action": [
+                    {
+                      "flow-node-inventory:output-action": {
+                        "flow-node-inventory:output-node-connector": "openflow:1:1"
+                      },
+                      "flow-node-inventory:order": 0
+                    }
+                  ]
+                },
+                "flow-node-inventory:order": 0
+              }
+            ]
+          },
+          "flow-node-inventory:match": {
+            "flow-node-inventory:ethernet-match": {
+              "flow-node-inventory:ethernet-type": {
+                "flow-node-inventory:type": 2048
+              }
+            },
+            "flow-node-inventory:ipv4-destination": "10.0.0.4"
+          },
+          "flow-node-inventory:cookie": 0
+        },
+        {
+          "flow-node-inventory:priority": 1,
+          "flow-node-inventory:id": "019dcc2e-5b4f-44f0-90cc-de490294b862",
+          "flow-node-inventory:table_id": 0,
+          "flow-node-inventory:hard-timeout": 0,
+          "flow-node-inventory:idle-timeout": 0,
+          "flow-node-inventory:instructions": {
+            "flow-node-inventory:instruction": [
+              {
+                "flow-node-inventory:apply-actions": {
+                  "flow-node-inventory:action": [
+                    {
+                      "flow-node-inventory:output-action": {
+                        "flow-node-inventory:output-node-connector": "openflow:1:2"
+                      },
+                      "flow-node-inventory:order": 0
+                    }
+                  ]
+                },
+                "flow-node-inventory:order": 0
+              }
+            ]
+          },
+          "flow-node-inventory:match": {
+            "flow-node-inventory:ethernet-match": {
+              "flow-node-inventory:ethernet-type": {
+                "flow-node-inventory:type": 2048
+              }
+            },
+            "flow-node-inventory:ipv4-destination": "10.0.0.5"
+          },
+          "flow-node-inventory:cookie": 0
+        },
+        {
+          "flow-node-inventory:priority": 1,
+          "flow-node-inventory:id": "968cf81e-3f16-42f1-8b16-d01ff719c63c",
+          "flow-node-inventory:table_id": 0,
+          "flow-node-inventory:hard-timeout": 0,
+          "flow-node-inventory:idle-timeout": 0,
+          "flow-node-inventory:instructions": {
+            "flow-node-inventory:instruction": [
+              {
+                "flow-node-inventory:apply-actions": {
+                  "flow-node-inventory:action": [
+                    {
+                      "flow-node-inventory:output-action": {
+                        "flow-node-inventory:output-node-connector": "openflow:1:2"
+                      },
+                      "flow-node-inventory:order": 0
+                    }
+                  ]
+                },
+                "flow-node-inventory:order": 0
+              }
+            ]
+          },
+          "flow-node-inventory:match": {
+            "flow-node-inventory:ethernet-match": {
+              "flow-node-inventory:ethernet-type": {
+                "flow-node-inventory:type": 2048
+              }
+            },
+            "flow-node-inventory:ipv4-destination": "10.0.0.8"
+          },
+          "flow-node-inventory:cookie": 0
+        },
+        {
+          "flow-node-inventory:priority": 1,
+          "flow-node-inventory:id": "1c14ea3c-9dcc-4434-b566-7e99033ea252",
+          "flow-node-inventory:table_id": 0,
+          "flow-node-inventory:hard-timeout": 0,
+          "flow-node-inventory:idle-timeout": 0,
+          "flow-node-inventory:instructions": {
+            "flow-node-inventory:instruction": [
+              {
+                "flow-node-inventory:apply-actions": {
+                  "flow-node-inventory:action": [
+                    {
+                      "flow-node-inventory:output-action": {
+                        "flow-node-inventory:output-node-connector": "openflow:1:2"
+                      },
+                      "flow-node-inventory:order": 0
+                    }
+                  ]
+                },
+                "flow-node-inventory:order": 0
+              }
+            ]
+          },
+          "flow-node-inventory:match": {
+            "flow-node-inventory:ethernet-match": {
+              "flow-node-inventory:ethernet-type": {
+                "flow-node-inventory:type": 2048
+              }
+            },
+            "flow-node-inventory:ipv4-destination": "10.0.0.6"
+          },
+          "flow-node-inventory:cookie": 0
+        },
+        {
+          "flow-node-inventory:priority": 1,
+          "flow-node-inventory:id": "ed9deeb2-be8f-4b84-bcd8-9d12049383d6",
+          "flow-node-inventory:table_id": 0,
+          "flow-node-inventory:hard-timeout": 0,
+          "flow-node-inventory:idle-timeout": 0,
+          "flow-node-inventory:instructions": {
+            "flow-node-inventory:instruction": [
+              {
+                "flow-node-inventory:apply-actions": {
+                  "flow-node-inventory:action": [
+                    {
+                      "flow-node-inventory:output-action": {
+                        "flow-node-inventory:output-node-connector": "openflow:1:2"
+                      },
+                      "flow-node-inventory:order": 0
+                    }
+                  ]
+                },
+                "flow-node-inventory:order": 0
+              }
+            ]
+          },
+          "flow-node-inventory:match": {
+            "flow-node-inventory:ethernet-match": {
+              "flow-node-inventory:ethernet-type": {
+                "flow-node-inventory:type": 2048
+              }
+            },
+            "flow-node-inventory:ipv4-destination": "10.0.0.7"
+          },
+          "flow-node-inventory:cookie": 0
+        }
+      ]
+    }
+  ]
+}
+
+
+---------------
+
+[[look-for-your-flow-stats-in-the-controller-operational-data-via-restconf]]
+====== Look for your flow stats in the controller operational data via
+RESTCONF
+
+* See your operational flow stats in POSTMAN with
+** URL "http://<controller
+IP>:8181/restconf/operational/opendaylight-inventory:nodes/node/openflow:1/table/0/"
+** GET
+
+Return Response:
+
+[source,json]
+---------------------
+
+{
+  "flow-node-inventory:table": [
+    {
+      "flow-node-inventory:id": 0,
+      "flow-node-inventory:flow": [
+        {
+          "flow-node-inventory:id": "10b1a23c-5299-4f7b-83d6-563bab472754",
+          "opendaylight-flow-statistics:flow-statistics": {
+            "opendaylight-flow-statistics:cookie": 0,
+            "opendaylight-flow-statistics:duration": {
+              "opendaylight-flow-statistics:nanosecond": 886000000,
+              "opendaylight-flow-statistics:second": 2707
+            },
+            "opendaylight-flow-statistics:hard-timeout": 0,
+            "opendaylight-flow-statistics:byte-count": 784,
+            "opendaylight-flow-statistics:match": {
+              "opendaylight-flow-statistics:ethernet-match": {
+                "opendaylight-flow-statistics:ethernet-type": {
+                  "opendaylight-flow-statistics:type": 2048
+                }
+              },
+              "opendaylight-flow-statistics:ipv4-destination": "10.0.0.2/32"
+            },
+            "opendaylight-flow-statistics:priority": 1,
+            "opendaylight-flow-statistics:packet-count": 8,
+            "opendaylight-flow-statistics:table_id": 0,
+            "opendaylight-flow-statistics:idle-timeout": 0,
+            "opendaylight-flow-statistics:instructions": {
+              "opendaylight-flow-statistics:instruction": [
+                {
+                  "opendaylight-flow-statistics:order": 0,
+                  "opendaylight-flow-statistics:apply-actions": {
+                    "opendaylight-flow-statistics:action": [
+                      {
+                        "opendaylight-flow-statistics:order": 0,
+                        "opendaylight-flow-statistics:output-action": {
+                          "opendaylight-flow-statistics:output-node-connector": "1",
+                          "opendaylight-flow-statistics:max-length": 0
+                        }
+                      }
+                    ]
+                  }
+                }
+              ]
+            }
+          }
+        },
+        {
+          "flow-node-inventory:id": "020bf359-1299-4da6-b4f7-368bd83b5841",
+          "opendaylight-flow-statistics:flow-statistics": {
+            "opendaylight-flow-statistics:cookie": 0,
+            "opendaylight-flow-statistics:duration": {
+              "opendaylight-flow-statistics:nanosecond": 826000000,
+              "opendaylight-flow-statistics:second": 2711
+            },
+            "opendaylight-flow-statistics:hard-timeout": 0,
+            "opendaylight-flow-statistics:byte-count": 1568,
+            "opendaylight-flow-statistics:match": {
+              "opendaylight-flow-statistics:ethernet-match": {
+                "opendaylight-flow-statistics:ethernet-type": {
+                  "opendaylight-flow-statistics:type": 2048
+                }
+              },
+              "opendaylight-flow-statistics:ipv4-destination": "10.0.0.1/32"
+            },
+            "opendaylight-flow-statistics:priority": 1,
+            "opendaylight-flow-statistics:packet-count": 16,
+            "opendaylight-flow-statistics:table_id": 0,
+            "opendaylight-flow-statistics:idle-timeout": 0,
+            "opendaylight-flow-statistics:instructions": {
+              "opendaylight-flow-statistics:instruction": [
+                {
+                  "opendaylight-flow-statistics:order": 0,
+                  "opendaylight-flow-statistics:apply-actions": {
+                    "opendaylight-flow-statistics:action": [
+                      {
+                        "opendaylight-flow-statistics:order": 0,
+                        "opendaylight-flow-statistics:output-action": {
+                          "opendaylight-flow-statistics:output-node-connector": "1",
+                          "opendaylight-flow-statistics:max-length": 0
+                        }
+                      }
+                    ]
+                  }
+                }
+              ]
+            }
+          }
+        },
+        {
+          "flow-node-inventory:id": "42172bfc-9142-4a92-9e90-ee62529b1e85",
+          "opendaylight-flow-statistics:flow-statistics": {
+            "opendaylight-flow-statistics:cookie": 0,
+            "opendaylight-flow-statistics:duration": {
+              "opendaylight-flow-statistics:nanosecond": 548000000,
+              "opendaylight-flow-statistics:second": 2708
+            },
+            "opendaylight-flow-statistics:hard-timeout": 0,
+            "opendaylight-flow-statistics:byte-count": 784,
+            "opendaylight-flow-statistics:match": {
+              "opendaylight-flow-statistics:ethernet-match": {
+                "opendaylight-flow-statistics:ethernet-type": {
+                  "opendaylight-flow-statistics:type": 2048
+                }
+              },
+              "opendaylight-flow-statistics:ipv4-destination": "10.0.0.3/32"
+            },
+            "opendaylight-flow-statistics:priority": 1,
+            "opendaylight-flow-statistics:packet-count": 8,
+            "opendaylight-flow-statistics:table_id": 0,
+            "opendaylight-flow-statistics:idle-timeout": 0,
+            "opendaylight-flow-statistics:instructions": {
+              "opendaylight-flow-statistics:instruction": [
+                {
+                  "opendaylight-flow-statistics:order": 0,
+                  "opendaylight-flow-statistics:apply-actions": {
+                    "opendaylight-flow-statistics:action": [
+                      {
+                        "opendaylight-flow-statistics:order": 0,
+                        "opendaylight-flow-statistics:output-action": {
+                          "opendaylight-flow-statistics:output-node-connector": "1",
+                          "opendaylight-flow-statistics:max-length": 0
+                        }
+                      }
+                    ]
+                  }
+                }
+              ]
+            }
+          }
+        },
+        {
+          "flow-node-inventory:id": "99bf566e-89f3-4c6f-ae9e-e26012ceb1e4",
+          "opendaylight-flow-statistics:flow-statistics": {
+            "opendaylight-flow-statistics:cookie": 0,
+            "opendaylight-flow-statistics:duration": {
+              "opendaylight-flow-statistics:nanosecond": 296000000,
+              "opendaylight-flow-statistics:second": 2710
+            },
+            "opendaylight-flow-statistics:hard-timeout": 0,
+            "opendaylight-flow-statistics:byte-count": 1274,
+            "opendaylight-flow-statistics:match": {
+              "opendaylight-flow-statistics:ethernet-match": {
+                "opendaylight-flow-statistics:ethernet-type": {
+                  "opendaylight-flow-statistics:type": 2048
+                }
+              },
+              "opendaylight-flow-statistics:ipv4-destination": "10.0.0.4/32"
+            },
+            "opendaylight-flow-statistics:priority": 1,
+            "opendaylight-flow-statistics:packet-count": 13,
+            "opendaylight-flow-statistics:table_id": 0,
+            "opendaylight-flow-statistics:idle-timeout": 0,
+            "opendaylight-flow-statistics:instructions": {
+              "opendaylight-flow-statistics:instruction": [
+                {
+                  "opendaylight-flow-statistics:order": 0,
+                  "opendaylight-flow-statistics:apply-actions": {
+                    "opendaylight-flow-statistics:action": [
+                      {
+                        "opendaylight-flow-statistics:order": 0,
+                        "opendaylight-flow-statistics:output-action": {
+                          "opendaylight-flow-statistics:output-node-connector": "1",
+                          "opendaylight-flow-statistics:max-length": 0
+                        }
+                      }
+                    ]
+                  }
+                }
+              ]
+            }
+          }
+        },
+        {
+          "flow-node-inventory:id": "019dcc2e-5b4f-44f0-90cc-de490294b862",
+          "opendaylight-flow-statistics:flow-statistics": {
+            "opendaylight-flow-statistics:cookie": 0,
+            "opendaylight-flow-statistics:duration": {
+              "opendaylight-flow-statistics:nanosecond": 392000000,
+              "opendaylight-flow-statistics:second": 2711
+            },
+            "opendaylight-flow-statistics:hard-timeout": 0,
+            "opendaylight-flow-statistics:byte-count": 1470,
+            "opendaylight-flow-statistics:match": {
+              "opendaylight-flow-statistics:ethernet-match": {
+                "opendaylight-flow-statistics:ethernet-type": {
+                  "opendaylight-flow-statistics:type": 2048
+                }
+              },
+              "opendaylight-flow-statistics:ipv4-destination": "10.0.0.5/32"
+            },
+            "opendaylight-flow-statistics:priority": 1,
+            "opendaylight-flow-statistics:packet-count": 15,
+            "opendaylight-flow-statistics:table_id": 0,
+            "opendaylight-flow-statistics:idle-timeout": 0,
+            "opendaylight-flow-statistics:instructions": {
+              "opendaylight-flow-statistics:instruction": [
+                {
+                  "opendaylight-flow-statistics:order": 0,
+                  "opendaylight-flow-statistics:apply-actions": {
+                    "opendaylight-flow-statistics:action": [
+                      {
+                        "opendaylight-flow-statistics:order": 0,
+                        "opendaylight-flow-statistics:output-action": {
+                          "opendaylight-flow-statistics:output-node-connector": "2",
+                          "opendaylight-flow-statistics:max-length": 0
+                        }
+                      }
+                    ]
+                  }
+                }
+              ]
+            }
+          }
+        },
+        {
+          "flow-node-inventory:id": "968cf81e-3f16-42f1-8b16-d01ff719c63c",
+          "opendaylight-flow-statistics:flow-statistics": {
+            "opendaylight-flow-statistics:cookie": 0,
+            "opendaylight-flow-statistics:duration": {
+              "opendaylight-flow-statistics:nanosecond": 344000000,
+              "opendaylight-flow-statistics:second": 2707
+            },
+            "opendaylight-flow-statistics:hard-timeout": 0,
+            "opendaylight-flow-statistics:byte-count": 784,
+            "opendaylight-flow-statistics:match": {
+              "opendaylight-flow-statistics:ethernet-match": {
+                "opendaylight-flow-statistics:ethernet-type": {
+                  "opendaylight-flow-statistics:type": 2048
+                }
+              },
+              "opendaylight-flow-statistics:ipv4-destination": "10.0.0.8/32"
+            },
+            "opendaylight-flow-statistics:priority": 1,
+            "opendaylight-flow-statistics:packet-count": 8,
+            "opendaylight-flow-statistics:table_id": 0,
+            "opendaylight-flow-statistics:idle-timeout": 0,
+            "opendaylight-flow-statistics:instructions": {
+              "opendaylight-flow-statistics:instruction": [
+                {
+                  "opendaylight-flow-statistics:order": 0,
+                  "opendaylight-flow-statistics:apply-actions": {
+                    "opendaylight-flow-statistics:action": [
+                      {
+                        "opendaylight-flow-statistics:order": 0,
+                        "opendaylight-flow-statistics:output-action": {
+                          "opendaylight-flow-statistics:output-node-connector": "2",
+                          "opendaylight-flow-statistics:max-length": 0
+                        }
+                      }
+                    ]
+                  }
+                }
+              ]
+            }
+          }
+        },
+        {
+          "flow-node-inventory:id": "ed9deeb2-be8f-4b84-bcd8-9d12049383d6",
+          "opendaylight-flow-statistics:flow-statistics": {
+            "opendaylight-flow-statistics:cookie": 0,
+            "opendaylight-flow-statistics:duration": {
+              "opendaylight-flow-statistics:nanosecond": 577000000,
+              "opendaylight-flow-statistics:second": 2706
+            },
+            "opendaylight-flow-statistics:hard-timeout": 0,
+            "opendaylight-flow-statistics:byte-count": 784,
+            "opendaylight-flow-statistics:match": {
+              "opendaylight-flow-statistics:ethernet-match": {
+                "opendaylight-flow-statistics:ethernet-type": {
+                  "opendaylight-flow-statistics:type": 2048
+                }
+              },
+              "opendaylight-flow-statistics:ipv4-destination": "10.0.0.7/32"
+            },
+            "opendaylight-flow-statistics:priority": 1,
+            "opendaylight-flow-statistics:packet-count": 8,
+            "opendaylight-flow-statistics:table_id": 0,
+            "opendaylight-flow-statistics:idle-timeout": 0,
+            "opendaylight-flow-statistics:instructions": {
+              "opendaylight-flow-statistics:instruction": [
+                {
+                  "opendaylight-flow-statistics:order": 0,
+                  "opendaylight-flow-statistics:apply-actions": {
+                    "opendaylight-flow-statistics:action": [
+                      {
+                        "opendaylight-flow-statistics:order": 0,
+                        "opendaylight-flow-statistics:output-action": {
+                          "opendaylight-flow-statistics:output-node-connector": "2",
+                          "opendaylight-flow-statistics:max-length": 0
+                        }
+                      }
+                    ]
+                  }
+                }
+              ]
+            }
+          }
+        },
+        {
+          "flow-node-inventory:id": "1c14ea3c-9dcc-4434-b566-7e99033ea252",
+          "opendaylight-flow-statistics:flow-statistics": {
+            "opendaylight-flow-statistics:cookie": 0,
+            "opendaylight-flow-statistics:duration": {
+              "opendaylight-flow-statistics:nanosecond": 659000000,
+              "opendaylight-flow-statistics:second": 2705
+            },
+            "opendaylight-flow-statistics:hard-timeout": 0,
+            "opendaylight-flow-statistics:byte-count": 784,
+            "opendaylight-flow-statistics:match": {
+              "opendaylight-flow-statistics:ethernet-match": {
+                "opendaylight-flow-statistics:ethernet-type": {
+                  "opendaylight-flow-statistics:type": 2048
+                }
+              },
+              "opendaylight-flow-statistics:ipv4-destination": "10.0.0.6/32"
+            },
+            "opendaylight-flow-statistics:priority": 1,
+            "opendaylight-flow-statistics:packet-count": 8,
+            "opendaylight-flow-statistics:table_id": 0,
+            "opendaylight-flow-statistics:idle-timeout": 0,
+            "opendaylight-flow-statistics:instructions": {
+              "opendaylight-flow-statistics:instruction": [
+                {
+                  "opendaylight-flow-statistics:order": 0,
+                  "opendaylight-flow-statistics:apply-actions": {
+                    "opendaylight-flow-statistics:action": [
+                      {
+                        "opendaylight-flow-statistics:order": 0,
+                        "opendaylight-flow-statistics:output-action": {
+                          "opendaylight-flow-statistics:output-node-connector": "2",
+                          "opendaylight-flow-statistics:max-length": 0
+                        }
+                      }
+                    ]
+                  }
+                }
+              ]
+            }
+          }
+        }
+      ],
+      "opendaylight-flow-table-statistics:flow-table-statistics": {
+        "opendaylight-flow-table-statistics:active-flows": 8,
+        "opendaylight-flow-table-statistics:packets-matched": 97683,
+        "opendaylight-flow-table-statistics:packets-looked-up": 101772
+      }
+    }
+  ]
+}
+
+---------------------
+
+[[discovering-and-testing-new-flow-types]]
+===== Discovering and testing new Flow Types
+
+Currently, the openflowplugin has a test-provider that allows you to
+push various flows through the system from the OSGI command line. Once
+those flows have been pushed through, you can see them as examples and
+then use them to see in the config what a particular flow example looks
+like.
+
+[[using-addmdflow]]
+====== Using addMDFlow
+
+From the
+
+--------------------------------------------------------------------------------------------------------------------
+cd openflowplugin/distribution/base/target/distributions-openflowplugin-base-0.0.1-SNAPSHOT-osgipackage/opendaylight
+./run.sh
+--------------------------------------------------------------------------------------------------------------------
+
+Point your mininet at the controller as described above.
+
+once you can see your node (probably openflow:1 if you've been following
+along) in the inventory, at the OSGI command line try running:
+
+-----------------------
+addMDFlow openflow:1 f#
+-----------------------
+
+Where # is a number between 1 and 80. This will create one of 80
+possible flows. You can go confirm they were created on the switch.
+
+Once you've done that, use
+
+* GET
+* Accept: application/xml
+* URL:
+"http://192.168.195.157:8181/restconf/config/opendaylight-inventory:nodes/node/openflow:1/table/2/"
+
+To see a full listing of the flows in table 2 (where they will be put).
+If you want to see a particular flow, look at
+
+* URL:
+"http://192.168.195.157:8181/restconf/config/opendaylight-inventory:nodes/node/openflow:1/table/2/flow/#"
+
+Where # is 123 + the f# you used. So for example, for f22, your url
+would be
+
+* URL:
+"http://192.168.195.157:8181/restconf/config/opendaylight-inventory:nodes/node/openflow:1/table/2/flow/145"
+
+Note: You may have to trim out some of the sections like that contain
+bitfields and binary types that are not correctly modeled.
+
+Note: Before attempting to PUT a flow you have created via addMDFlow,
+please change its URL and body to, for example, use table 1 instead of
+table 2 or another Flow Id, so you don't collide.
+
+Note: There are several test command providers and the one handling
+flows is *OpenflowpluginTestCommandProvider*. Methods, which can be use
+as *commands in OSGI-console* have prefix '_'.
+
+[[example-flows]]
+===== Example Flows
+
+Examples for XML for various flow matches, instructions & actions can be
+found in following section
+<<odl-ofp-example-flows_overview,here>>
diff --git a/manuals/user-guide/src/main/asciidoc/openflowplugin/odl-ofp-end-to-end-groups.adoc b/manuals/user-guide/src/main/asciidoc/openflowplugin/odl-ofp-end-to-end-groups.adoc
new file mode 100644 (file)
index 0000000..b928b34
--- /dev/null
@@ -0,0 +1,157 @@
+[[note]]
+===== NOTE
+
+Groups are NOT SUPPORTED in current (2.0.0) version of
+http://www.openvswitch.org/download[openvswitch]. See
+
+* http://openvswitch.org/releases/NEWS-2.0.0
+* http://comments.gmane.org/gmane.linux.network.openvswitch.general/3251
+
+For testing group feature please use for example <<odl-ofp-end-to-end-inventory_introduction-introduction,
+CPQD>> virtual switch.
+
+===== Instructions
+====== Learn End to End for Inventory
+
+<<odl-ofp-end-to-end-inventory_introduction-introduction,End to End Inventory>>
+
+====== Check inventory
+
+Run CPqD with support for OF 1.3 as described in <<odl-ofp-end-to-end-inventory_introduction-introduction,End to End Inventory>>
+
+Make sure you see the openflow:1 node come up as described in <<odl-ofp-end-to-end-inventory_introduction-introduction,End to End Inventory>>
+
+====== Group Strategy
+
+Current way to flush a group to switch looks like this: 
+
+. create MD-SAL modeled group and commit it into dataStore using two phase commit
+. FRM gets notified and invokes corresponding rpc (addGroup) on particular service provider (if suitable provider for given node registered)
+. the provider (plugin in this case) transforms MD-SAL modeled group into OF-API modeled group
+. OF-API modeled group is then flushed into OFLibrary
+. OFLibrary encodes group into particular version of wire protocol and sends it to particular switch
+. check on CPqD if group is installed
+
+====== Push your Group
+
+* With PostMan:
+** Set
+*** Content-Type: application/xml
+*** Accept: application/xml
+** Use URL: "http://<ip-address>:8080/restconf/config/opendaylight-inventory:nodes/node/openflow:1/group/1"
+** PUT
+** Use Body:
+
+[source,xml]
+-----
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<group xmlns="urn:opendaylight:flow:inventory">
+    <group-type>group-all</group-type>
+    <buckets>
+        <bucket>
+            <action>
+                <pop-vlan-action/>
+                <order>0</order>
+            </action>
+            <bucket-id>12</bucket-id>
+            <watch_group>14</watch_group>
+            <watch_port>1234</watch_port>
+        </bucket>
+        <bucket>
+            <action>
+                <set-field>
+                    <ipv4-source>100.1.1.1</ipv4-source>
+                </set-field>
+                <order>0</order>
+            </action>
+            <action>
+                <set-field>
+                    <ipv4-destination>200.71.9.5210</ipv4-destination>
+                </set-field>
+                <order>1</order>
+            </action>
+            <bucket-id>13</bucket-id>
+            <watch_group>14</watch_group>
+            <watch_port>1234</watch_port>
+        </bucket>
+    </buckets>
+    <barrier>false</barrier>
+    <group-name>Foo</group-name>
+    <group-id>1</group-id>
+</group>
+-----
+
+NOTE: If you want to try a different group id, make sure the URL and the body stay in sync. For example, if you wanted to try: group-id 20 you'd change the URL to "http://<ip-address>:8080/restconf/config/opendaylight-inventory:nodes/node/openflow:1/group/20" but you would also need to update the <group-id>20</group-id> in the body to match.
+
+NOTE: <ip-address> :Provide the IP Address of the machine on which the controller is running.
+
+
+====== Check for your group on the switch
+
+* See your group on your cpqd switch:
+
+----
+COMMAND: sudo dpctl tcp:127.0.0.1:6000 stats-group
+
+SENDING:
+stat_req{type="grp", flags="0x0", group="all"}
+
+
+RECEIVED:
+stat_repl{type="grp", flags="0x0", stats=[
+{group="1", ref_cnt="0", pkt_cnt="0", byte_cnt="0", cntrs=[{pkt_cnt="0", byte_cnt="0"}, {pkt_cnt="0", byte_cnt="0"}]}]}
+----
+
+====== Check for your group in the controller config via RESTCONF
+
+* See your configured group in POSTMAN with
+** URL http://<ip-address>:8080/restconf/config/opendaylight-inventory:nodes/node/openflow:1/group/1
+** GET
+** You should no longer need to set Accept
+** Note: <ip-address> :Provide the IP Address of the machine on which the controller is running.
+
+====== Look for your group stats in the controller operational data via RESTCONF
+
+* See your operational group stats in POSTMAN with
+** URL http://<ip-address>:8080/restconf/operational/opendaylight-inventory:nodes/node/openflow:1/group/1
+** GET
+** Note: <ip-address> :Provide the IP Address of the machine on which the controller is running.
+
+===== Discovering and testing Group Types
+
+Currently, the openflowplugin has a test-provider that allows you to push various groups through the system from the OSGI command line. Once those groups have been pushed through, you can see them as examples and then use them to see in the config what a particular group example looks like.
+
+===== Using addGroup
+
+From the
+
+----
+cd openflowplugin/distribution/base/target/distributions-openflowplugin-base-0.0.1-SNAPSHOT-osgipackage/opendaylight
+./run.sh
+----
+
+Point your CPqD at the controller as described above.
+
+once you can see your node (probably openflow:1 if you've been following along) in the inventory, at the OSGI command line try running:
+
+----
+addGroup openflow:1
+----
+
+This will install a group in the switch. You can check whether the group is installed or not.
+
+Once you've done that, use
+
+* GET
+* Accept: application/xml
+* URL: "http://<ip-address>:8080/restconf/config/opendaylight-inventory:nodes/node/openflow:1/group/1"
+** Note: <ip-address> :Provide the IP Address of the machine on which the controller is running.
+
+NOTE: Before attempting to PUT a group you have created via addGroup, please change its URL and body to, for example, use group 1 instead of group 2 or another Group Id, so that they don't collide.
+
+NOTE: There are several test command providers and the one handling groups is OpenflowpluginGroupTestCommandProvider. Methods, which can be use as commands in OSGI-console have prefix '_'.
+
+
+===== Example Group
+
+Examples for XML for various Group Types can be found in the test-scripts bundle of the plugin code with names g1.xml, g2.xml and g3.xml. 
\ No newline at end of file
diff --git a/manuals/user-guide/src/main/asciidoc/openflowplugin/odl-ofp-end-to-end-inventory.adoc b/manuals/user-guide/src/main/asciidoc/openflowplugin/odl-ofp-end-to-end-inventory.adoc
new file mode 100644 (file)
index 0000000..a5c4303
--- /dev/null
@@ -0,0 +1,72 @@
+[[odl-ofp-end-to-end-inventory_introduction-introduction]]
+===== Introduction
+
+The purpose of this page is to walk you through how to see the Inventory
+Manager working end to end with the openflowplugin using OpenFlow 1.3.
+
+Basically, you will learn how to:
+
+1.  Run the Base/Virtualization/Service provider Edition with the new
+openflowplugin:
+OpenDaylight_OpenFlow_Plugin::Running_controller_with_the_new_OF_plugin[Running
+the controller with the new OpenFlow Plugin]
+2.  Start mininet to use OF 1.3:
+OpenDaylight_OpenFlow_Plugin::Test_Environment[OpenFlow 1.3 Enabled
+Software Switches / Environment]
+3.  Use RESTCONF to see the nodes appear in inventory.
+
+[[odl-ofp-end-to-end-flows_restconf-for-inventory]]
+===== Restconf for Inventory
+
+The REST url for listing all the nodes is:
+
+------------------------------------------------------------------------
+http://localhost:8181/restconf/operational/opendaylight-inventory:nodes/
+------------------------------------------------------------------------
+
+You will need to set the Accept header:
+
+-----------------------
+Accept: application/xml
+-----------------------
+
+You will also need to use HTTP Basic Auth with username: admin password:
+admin.
+
+Alternately, if you have a node's id you can address it as
+
+---------------------------------------------------------------------------------
+http://localhost:8181/restconf/operational/opendaylight-inventory:nodes/node/<id>
+---------------------------------------------------------------------------------
+
+for example
+
+---------------------------------------------------------------------------------------
+http://localhost:8181/restconf/operational/opendaylight-inventory:nodes/node/openflow:1
+---------------------------------------------------------------------------------------
+
+[[odl-ofp-end-to-end-flows_how-to-hit-restconf-with-postman]]
+====== How to hit RestConf with Postman
+
+https://chrome.google.com/webstore/detail/postman-rest-client/fdmmgilgnpjigdojojpjoooidkmcomcm?hl=en[Install
+Postman for Chrome]
+
+In the chrome browser bar enter
+
+--------------
+chrome://apps/
+--------------
+
+And click on Postman.
+
+Enter the URL. Click on the Headers button on the far right. Enter the
+Accept: header. Click on the Basic Auth Tab at the top and setup the
+username and password. Send.
+
+[[odl-ofp-end-to-end-flows_known-bug]]
+===== Known Bug
+
+If you have not had any switches come up, and though no children for
+http://localhost:8080/restconf/datastore/opendaylight-inventory:nodes/
+and exception will be thrown. I'm pretty sure I know how to fix this
+bug, just need to get to it :)
diff --git a/manuals/user-guide/src/main/asciidoc/openflowplugin/odl-ofp-end-to-end-meters.adoc b/manuals/user-guide/src/main/asciidoc/openflowplugin/odl-ofp-end-to-end-meters.adoc
new file mode 100644 (file)
index 0000000..852949c
--- /dev/null
@@ -0,0 +1,164 @@
+
+===== Instructions
+
+
+====== Learn End to End for Inventory
+
+* <<odl-ofp-end-to-end-inventory_introduction-introduction,End to End Inventory>>
+
+====== Check inventory
+
+* Run mininet with support for OF 1.3 as described in
+<<odl-ofp-end-to-end-inventory_introduction-introduction,End to End Inventory>>
+* Make sure you see the openflow:1 node come up as described in
+<<odl-ofp-end-to-end-inventory_introduction-introduction,End to End Inventory>>
+
+[[meter-strategy]]
+====== Meter Strategy
+
+Current way to flush a meter to switch looks like this: 
+
+. create MD-SAL modeled flow and commit it into dataStore using two
+phase commit
+. FRM gets notified and invokes corresponding rpc (addMeter) on
+particular service provider (if suitable provider for given node
+registered)
+. the provider (plugin in this case) transforms MD-SAL modeled meter
+into OF-API modeled meter
+. OF-API modeled meter is then flushed into OFLibrary
+. OFLibrary encodes meter into particular version of wire protocol and
+sends it to particular switch
+. check on mininet side if meter is installed
+
+[[push-your-meter]]
+====== Push your Meter
+
+* Using PostMan:
+** Set Request Headers
+*** Content-Type: application/xml
+*** Accept: application/xml
+** Use URL:
+"http://:8080/restconf/config/opendaylight-inventory:nodes/node/openflow:1/meter/1"
+** Method:PUT
+** Request Body:
+
+[source, xml]
+--------------------------------------------------------------
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<meter xmlns="urn:opendaylight:flow:inventory">
+    <container-name>abcd</container-name>
+    <flags>meter-burst</flags>
+    <meter-band-headers>
+        <meter-band-header>
+            <band-burst-size>444</band-burst-size>
+            <band-id>0</band-id>
+            <band-rate>234</band-rate>
+            <dscp-remark-burst-size>5</dscp-remark-burst-size>
+            <dscp-remark-rate>12</dscp-remark-rate>
+            <prec_level>1</prec_level>
+            <meter-band-types>
+                <flags>ofpmbt-dscp-remark</flags>
+            </meter-band-types>
+        </meter-band-header>
+    </meter-band-headers>
+    <meter-id>1</meter-id>
+    <meter-name>Foo</meter-name>
+</meter>
+--------------------------------------------------------------
+
+NOTE: If you want to try a different meter id, make sure the URL
+and the body stay in sync. For example, if you wanted to try: meter-id
+20 you'd change the URL to "http://:8080/restconf/config/opendaylight-inventory:nodes/node/openflow:1/meter/20" but you would also need to update the 20 in the body to match.
+
+NOTE: :Provide the IP Address of the machine on which the
+controller is running.
+
+[[check-for-your-meter-on-the-switch]]
+==== Check for your meter on the switch
+
+* See your meter on your CPqD switch:
+
+----------------------------------------------------------------------------------------------------------------------------------------------
+COMMAND: $ sudo dpctl tcp:127.0.0.1:6000 meter-config
+
+SENDING:
+stat_req{type="mconf", flags="0x0"{meter_id= ffffffff"}
+
+
+RECEIVED:
+stat_repl{type="mconf", flags="0x0", stats=[{meter= c"", flags="4", bands=[{type = dscp_remark, rate="12", burst_size="5", prec_level="1"}]}]}
+----------------------------------------------------------------------------------------------------------------------------------------------
+
+[[check-for-your-meter-in-the-controller-config-via-restconf]]
+====== Check for your meter in the controller config via RESTCONF
+
+* See your configured flow in POSTMAN with
+** URL
+"http://:8080/restconf/config/opendaylight-inventory:nodes/node/openflow:1/meter/1"
+** Method: GET
+** You should no longer need to set Request Headers for Accept
+** Note: :Provide the IP Address of the machine on which the controller
+is running.
+
+[[look-for-your-meter-stats-in-the-controller-operational-data-via-restconf]]
+====== Look for your meter stats in the controller operational data via RESTCONF
+
+* See your operational meter stats in POSTMAN with
+** URL
+"http://:8080/restconfig/operational/opendaylight-inventory:nodes/node/openflow:1/meter/1"
+** Method: GET
+** Note: :Provide the IP Address of the machine on which the controller
+is running.
+
+[[discovering-and-testing-meter-types]]
+===== Discovering and testing Meter Types
+
+Currently, the openflowplugin has a test-provider that allows you to
+push various meters through the system from the OSGI command line. Once
+those meters have been pushed through, you can see them as examples and
+then use them to see in the config what a particular meter example looks
+like.
+
+[[using-addmeter]]
+====== Using addMeter
+
+From the
+
+--------------------------------------------------------------------------------------------------------------------
+cd openflowplugin/distribution/base/target/distributions-openflowplugin-base-0.0.1-SNAPSHOT-osgipackage/opendaylight
+./run.sh
+--------------------------------------------------------------------------------------------------------------------
+
+Point your CPqD at the controller as described above.
+
+Once you can see your CPqD connected to the controller, at the OSGI
+command line try running:
+
+-------------------
+addMeter openflow:1
+-------------------
+
+Once you've done that, use
+
+* GET
+* Accept: application/xml
+* URL:
+"http://:8080/restconf/config/opendaylight-inventory:nodes/node/openflow:1/meter/12"
+** Note: :Provide the IP Address of the machine on which the controller
+is running.
+
+NOTE: Before attempting to PUT a meter you have created via addMeter,
+please change its URL and body to, for example, use meter 1 instead of
+meter 2 or another Meter Id, so you don't collide.
+
+NOTE: There are several test command providers and the one handling
+Meter is *OpenflowpluginMeterTestCommandProvider*. Methods, which can be
+used as *commands in OSGI-console* have prefix '_'. Examples: addMeter,
+modifyMeter and removeMeter.
+
+[[example-meter]]
+===== Example Meter
+
+Examples for XML for various Meter Types can be found in the
+test-scripts bundle of the plugin code with names m1.xml, m2.xml and
+m3.xml.
diff --git a/manuals/user-guide/src/main/asciidoc/openflowplugin/odl-ofp-end-to-end-topology.adoc b/manuals/user-guide/src/main/asciidoc/openflowplugin/odl-ofp-end-to-end-topology.adoc
new file mode 100644 (file)
index 0000000..4c421a1
--- /dev/null
@@ -0,0 +1,61 @@
+[[introduction]]
+===== Introduction
+
+The purpose of this page is to walk you through how to see the Topology
+Manager working end to end with the openflowplugin using OpenFlow 1.3.
+
+Basically, you will learn how to:
+
+1.  Run the Base/Virtualization/Service provider Edition with the new
+openflowplugin:
+<<odl-ofp-running-controller-with-the-new-of-plugin_top,Running the controller with the new OpenFlow Plugin>>
+2.  Start mininet to use OF 1.3:
+<<odl-ofp-test-environment_top,OpenFlow 1.3 Enabled Software Switches / Environment>>
+3.  Use RESTCONF to see the topology information.
+
+[[restconf-for-topology]]
+===== Restconf for Topology
+
+The REST url for listing all the nodes is:
+
+-----------------------------------------------------------------------------
+http://localhost:8080/restconf/operational/network-topology:network-topology/
+-----------------------------------------------------------------------------
+
+You will need to set the Accept header:
+
+-----------------------
+Accept: application/xml
+-----------------------
+
+You will also need to use HTTP Basic Auth with username: admin password:
+admin.
+
+Alternately, if you have a node's id you can address it as
+
+------------------------------------------------------------------------------------------
+http://localhost:8080/restconf/operational/network-topology:network-topology/topology/<id>
+------------------------------------------------------------------------------------------
+
+for example
+
+---------------------------------------------------------------------------------------------
+http://localhost:8080/restconf/operational/network-topology:network-topology/topology/flow:1/
+---------------------------------------------------------------------------------------------
+
+[[how-to-hit-restconf-with-postman]]
+====== How to hit RestConf with Postman
+
+Install https://chrome.google.com/webstore/detail/postman-rest-client/fdmmgilgnpjigdojojpjoooidkmcomcm?hl=en[postman] for Chrome
+
+In the chrome browser bar enter
+
+--------------
+chrome://apps/
+--------------
+
+And click on Postman.
+
+Enter the URL. Click on the Headers button on the far right. Enter the
+Accept: header. Click on the Basic Auth Tab at the top and setup the
+username and password. Send.
diff --git a/manuals/user-guide/src/main/asciidoc/openflowplugin/odl-ofp-example-flows.adoc b/manuals/user-guide/src/main/asciidoc/openflowplugin/odl-ofp-example-flows.adoc
new file mode 100644 (file)
index 0000000..44601ef
--- /dev/null
@@ -0,0 +1,1771 @@
+[[odl-ofp-example-flows_overview]]
+==== Overview
+
+The flow examples on this page are tested to work with OVS.
+
+Use, for example, POSTMAN with the following parameters:
+
+---------------------------------------------------------------------------------------------------------------------
+PUT http://<ctrl-addr>:8080/restconf/config/opendaylight-inventory:nodes/node/<Node-id>/table/<Table-#>/flow/<Flow-#>
+
+- Accept: application/xml
+- Content-Type: application/xml
+---------------------------------------------------------------------------------------------------------------------
+
+For example:
+
+-------------------------------------------------------------------------------------------------------
+PUT http://localhost:8080/restconf/config/opendaylight-inventory:nodes/node/openflow:1/table/2/flow/127
+-------------------------------------------------------------------------------------------------------
+
+Make sure that the Table-# and Flow-# in the URL and in the XML match.
+
+The format of the flow-programming XML is determined by by the grouping
+'flow' in the opendaylight-flow-types yang model: MISSING LINK.
+
+[[match-examples]]
+==== Match Examples
+
+The format of the XML that describes OpenFlow matches is determined by
+the opendaylight-match-types yang model: .
+
+The RESTCONF documentation for the match-types yang model can be found
+at
+https://jenkins.opendaylight.org/controller/job/controller-merge/lastSuccessfulBuild/artifact/opendaylight/md-sal/model/model-flow-base/target/site/models/opendaylight-match-types.html[opendaylight-match-types.html]
+
+[[ipv4-dest-address]]
+===== IPv4 Dest Address
+
+* Flow=124, Table=2, Priority=2,
+Instructions=\{Apply_Actions=\{dec_nw_ttl}},
+match=\{ipv4_destination_address=10.0.1.1/24}
+* Note that ethernet-type MUST be 2048 (0x800)
+
+[source,xml]
+--------------------------------------------------------
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<flow xmlns="urn:opendaylight:flow:inventory">
+    <strict>false</strict>
+    <instructions>
+        <instruction>
+            <order>0</order>
+            <apply-actions>
+                <action>
+                    <order>0</order>
+                    <dec-nw-ttl/>
+                </action>
+            </apply-actions>
+        </instruction>
+    </instructions>
+    <table_id>2</table_id>
+    <id>124</id>
+    <cookie_mask>255</cookie_mask>
+    <installHw>false</installHw>
+    <match>
+        <ethernet-match>
+            <ethernet-type>
+                <type>2048</type>
+            </ethernet-type>
+        </ethernet-match>
+        <ipv4-destination>10.0.1.1/24</ipv4-destination>
+    </match>
+    <hard-timeout>12</hard-timeout>
+    <cookie>1</cookie>
+    <idle-timeout>34</idle-timeout>
+    <flow-name>FooXf1</flow-name>
+    <priority>2</priority>
+    <barrier>false</barrier>
+</flow>
+--------------------------------------------------------
+
+[[ethernet-src-address]]
+===== Ethernet Src Address
+
+* Flow=126, Table=2, Priority=2, Instructions=\{Apply_Actions=\{drop}},
+match=\{ethernet-source=00:00:00:00:00:01}
+
+[source,xml]
+------------------------------------------------------
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<flow xmlns="urn:opendaylight:flow:inventory">
+    <strict>false</strict>
+    <instructions>
+        <instruction>
+            <order>0</order>
+            <apply-actions>
+                <action>
+                    <order>0</order>
+                    <drop-action/>
+                </action>
+            </apply-actions>
+        </instruction>
+    </instructions>
+    <table_id>2</table_id>
+    <id>126</id>
+    <cookie_mask>255</cookie_mask>
+    <installHw>false</installHw>
+    <match>
+        <ethernet-match>
+            <ethernet-source>
+                <address>00:00:00:00:00:01</address>
+            </ethernet-source>
+        </ethernet-match>
+    </match>
+    <hard-timeout>12</hard-timeout>
+    <cookie>3</cookie>
+    <idle-timeout>34</idle-timeout>
+    <flow-name>FooXf3</flow-name>
+    <priority>2</priority>
+    <barrier>false</barrier>
+</flow>
+------------------------------------------------------
+
+[[ethernet-src-dest-addresses-ethernet-type]]
+===== Ethernet Src & Dest Addresses, Ethernet Type
+
+* Flow=127, Table=2, Priority=2, Instructions=\{Apply_Actions=\{drop}},
+match=\{ethernet-source=00:00:00:00:23:ae,
+ethernet-destination=ff:ff:ff:ff:ff:ff, ethernet-type=45}
+
+[source,xml]
+------------------------------------------------------
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<flow xmlns="urn:opendaylight:flow:inventory">
+    <strict>false</strict>
+    <instructions>
+        <instruction>
+            <order>0</order>
+            <apply-actions>
+                <action>
+                    <order>0</order>
+                    <dec-mpls-ttl/>
+                </action>
+            </apply-actions>
+        </instruction>
+    </instructions>
+    <table_id>2</table_id>
+    <id>127</id>
+    <cookie_mask>255</cookie_mask>
+    <installHw>false</installHw>
+    <match>
+        <ethernet-match>
+            <ethernet-type>
+                <type>45</type>
+            </ethernet-type>
+            <ethernet-destination>
+                <address>ff:ff:ff:ff:ff:ff</address>
+            </ethernet-destination>
+            <ethernet-source>
+                <address>00:00:00:00:23:ae</address>
+            </ethernet-source>
+        </ethernet-match>
+    </match>
+    <hard-timeout>12</hard-timeout>
+    <cookie>4</cookie>
+    <idle-timeout>34</idle-timeout>
+    <flow-name>FooXf4</flow-name>
+    <priority>2</priority>
+    <barrier>false</barrier>
+</flow>
+------------------------------------------------------
+
+[[ethernet-src-dest-addresses-ipv4-src-dest-addresses-input-port]]
+===== Ethernet Src & Dest Addresses, IPv4 Src & Dest Addresses, Input Port
+
+* Note that ethernet-type MUST be 34887 (0x8847)
+
+[source,xml]
+--------------------------------------------------------
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<flow xmlns="urn:opendaylight:flow:inventory">
+    <strict>false</strict>
+    <instructions>
+        <instruction>
+            <order>0</order>
+            <apply-actions>
+                <action>
+                    <order>0</order>
+                    <dec-mpls-ttl/>
+                </action>
+            </apply-actions>
+        </instruction>
+    </instructions>
+    <table_id>2</table_id>
+    <id>128</id>
+    <cookie_mask>255</cookie_mask>
+    <match>
+        <ethernet-match>
+            <ethernet-type>
+                <type>34887</type>
+            </ethernet-type>
+            <ethernet-destination>
+                <address>ff:ff:ff:ff:ff:ff</address>
+            </ethernet-destination>
+            <ethernet-source>
+                <address>00:00:00:00:23:ae</address>
+            </ethernet-source>
+        </ethernet-match>
+        <ipv4-source>10.1.2.3/24</ipv4-source>
+        <ipv4-destination>20.4.5.6/16</ipv4-destination>
+        <in-port>0</in-port>
+    </match>
+    <hard-timeout>12</hard-timeout>
+    <cookie>5</cookie>
+    <idle-timeout>34</idle-timeout>
+    <flow-name>FooXf5</flow-name>
+    <priority>2</priority>
+    <barrier>false</barrier>
+</flow>
+--------------------------------------------------------
+
+[[ethernet-src-dest-addresses-ipv4-src-dest-addresses-ip-protocol-ip-dscp-ip-ecn-input-port]]
+===== Ethernet Src & Dest Addresses, IPv4 Src & Dest Addresses, IP
+Protocol #, IP DSCP, IP ECN, Input Port
+
+* Note that ethernet-type MUST be 2048 (0x800)
+
+[source,xml]
+--------------------------------------------------------
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<flow xmlns="urn:opendaylight:flow:inventory">
+    <strict>false</strict>
+    <instructions>
+        <instruction>
+            <order>0</order>
+            <apply-actions>
+                <action>
+                    <order>0</order>
+                    <dec-nw-ttl/>
+                </action>
+            </apply-actions>
+        </instruction>
+    </instructions>
+    <table_id>2</table_id>
+    <id>130</id>
+    <cookie_mask>255</cookie_mask>
+    <match>
+        <ethernet-match>
+            <ethernet-type>
+                <type>2048</type>
+            </ethernet-type>
+            <ethernet-destination>
+                <address>ff:ff:ff:ff:ff:aa</address>
+            </ethernet-destination>
+            <ethernet-source>
+                <address>00:00:00:11:23:ae</address>
+            </ethernet-source>
+        </ethernet-match>
+        <ipv4-source>10.1.2.3/24</ipv4-source>
+        <ipv4-destination>20.4.5.6/16</ipv4-destination>
+        <ip-match>
+            <ip-protocol>56</ip-protocol>
+            <ip-dscp>15</ip-dscp>
+            <ip-ecn>1</ip-ecn>
+        </ip-match>
+        <in-port>0</in-port>
+    </match>
+    <hard-timeout>12000</hard-timeout>
+    <cookie>7</cookie>
+    <idle-timeout>12000</idle-timeout>
+    <flow-name>FooXf7</flow-name>
+    <priority>2</priority>
+    <barrier>false</barrier>
+</flow>
+--------------------------------------------------------
+
+[[ethernet-src-dest-addresses-ipv4-src-dest-addresses-tcp-src-dest-ports-ip-dscp-ip-ecn-input-port]]
+===== Ethernet Src & Dest Addresses, IPv4 Src & Dest Addresses, TCP Src &
+Dest Ports, IP DSCP, IP ECN, Input Port
+
+* Note that ethernet-type MUST be 2048 (0x800)
+* Note that IP Protocol Type MUST be 6
+
+[source,xml]
+-----------------------------------------------------------
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<flow xmlns="urn:opendaylight:flow:inventory">
+    <strict>false</strict>
+    <instructions>
+        <instruction>
+            <order>0</order>
+            <apply-actions>
+                <action>
+                    <order>0</order>
+                    <dec-nw-ttl/>
+                </action>
+            </apply-actions>
+        </instruction>
+    </instructions>
+    <table_id>2</table_id>
+    <id>131</id>
+    <cookie_mask>255</cookie_mask>
+    <match>
+        <ethernet-match>
+            <ethernet-type>
+                <type>2048</type>
+            </ethernet-type>
+            <ethernet-destination>
+                <address>ff:ff:29:01:19:61</address>
+            </ethernet-destination>
+            <ethernet-source>
+                <address>00:00:00:11:23:ae</address>
+            </ethernet-source>
+        </ethernet-match>
+        <ipv4-source>17.1.2.3/8</ipv4-source>
+        <ipv4-destination>172.168.5.6/16</ipv4-destination>
+        <ip-match>
+            <ip-protocol>6</ip-protocol>
+            <ip-dscp>2</ip-dscp>
+            <ip-ecn>2</ip-ecn>
+        </ip-match>
+        <tcp-source-port>25364</tcp-source-port>
+        <tcp-destination-port>8080</tcp-destination-port>
+        <in-port>0</in-port>
+    </match>
+    <hard-timeout>1200</hard-timeout>
+    <cookie>8</cookie>
+    <idle-timeout>3400</idle-timeout>
+    <flow-name>FooXf8</flow-name>
+    <priority>2</priority>
+    <barrier>false</barrier>
+</flow>
+-----------------------------------------------------------
+
+[[ethernet-src-dest-addresses-ipv4-src-dest-addresses-udp-src-dest-ports-ip-dscp-ip-ecn-input-port]]
+===== Ethernet Src & Dest Addresses, IPv4 Src & Dest Addresses, UDP Src &
+Dest Ports, IP DSCP, IP ECN, Input Port
+
+* Note that ethernet-type MUST be 2048 (0x800)
+* Note that IP Protocol Type MUST be 17
+
+[source,xml]
+-----------------------------------------------------------
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<flow xmlns="urn:opendaylight:flow:inventory">
+    <strict>false</strict>
+    <instructions>
+        <instruction>
+            <order>0</order>
+            <apply-actions>
+                <action>
+                    <order>0</order>
+                    <dec-nw-ttl/>
+                </action>
+            </apply-actions>
+        </instruction>
+    </instructions>
+    <table_id>2</table_id>
+    <id>132</id>
+    <cookie_mask>255</cookie_mask>
+    <match>
+        <ethernet-match>
+            <ethernet-type>
+                <type>2048</type>
+            </ethernet-type>
+            <ethernet-destination>
+                <address>20:14:29:01:19:61</address>
+            </ethernet-destination>
+            <ethernet-source>
+                <address>00:00:00:11:23:ae</address>
+            </ethernet-source>
+        </ethernet-match>
+        <ipv4-source>19.1.2.3/10</ipv4-source>
+        <ipv4-destination>172.168.5.6/18</ipv4-destination>
+        <ip-match>
+            <ip-protocol>17</ip-protocol>
+            <ip-dscp>8</ip-dscp>
+            <ip-ecn>3</ip-ecn>
+        </ip-match>
+        <udp-source-port>25364</udp-source-port>
+        <udp-destination-port>8080</udp-destination-port>
+        <in-port>0</in-port>
+    </match>
+    <hard-timeout>1200</hard-timeout>
+    <cookie>9</cookie>
+    <idle-timeout>3400</idle-timeout>
+    <flow-name>FooXf9</flow-name>
+    <priority>2</priority>
+    <barrier>false</barrier>
+-----------------------------------------------------------
+
+[[ethernet-src-dest-addresses-ipv4-src-dest-addresses-icmpv4-type-code-ip-dscp-ip-ecn-input-port]]
+===== Ethernet Src & Dest Addresses, IPv4 Src & Dest Addresses, ICMPv4
+Type & Code, IP DSCP, IP ECN, Input Port
+
+* Note that ethernet-type MUST be 2048 (0x800)
+* Note that IP Protocol Type MUST be 1
+
+[source,xml]
+-----------------------------------------------------------
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<flow xmlns="urn:opendaylight:flow:inventory">
+    <strict>false</strict>
+    <instructions>
+        <instruction>
+            <order>0</order>
+            <apply-actions>
+                <action>
+                    <order>0</order>
+                    <dec-nw-ttl/>
+                </action>
+            </apply-actions>
+        </instruction>
+    </instructions>
+    <table_id>2</table_id>
+    <id>134</id>
+    <cookie_mask>255</cookie_mask>
+    <match>
+        <ethernet-match>
+            <ethernet-type>
+                <type>2048</type>
+            </ethernet-type>
+            <ethernet-destination>
+                <address>ff:ff:29:01:19:61</address>
+            </ethernet-destination>
+            <ethernet-source>
+                <address>00:00:00:11:23:ae</address>
+            </ethernet-source>
+        </ethernet-match>
+        <ipv4-source>17.1.2.3/8</ipv4-source>
+        <ipv4-destination>172.168.5.6/16</ipv4-destination>
+        <ip-match>
+            <ip-protocol>1</ip-protocol>
+            <ip-dscp>27</ip-dscp>
+            <ip-ecn>3</ip-ecn>
+        </ip-match>
+        <icmpv4-match>
+            <icmpv4-type>6</icmpv4-type>
+            <icmpv4-code>3</icmpv4-code>
+        </icmpv4-match>
+        <in-port>0</in-port>
+    </match>
+    <hard-timeout>1200</hard-timeout>
+    <cookie>11</cookie>
+    <idle-timeout>3400</idle-timeout>
+    <flow-name>FooXf11</flow-name>
+    <priority>2</priority>
+</flow>
+-----------------------------------------------------------
+
+[[ethernet-src-dest-addresses-arp-operation-arp-src-target-transport-addresses-arp-src-target-hw-addresses]]
+===== Ethernet Src & Dest Addresses, ARP Operation, ARP Src & Target
+Transport Addresses, ARP Src & Target Hw Addresses
+
+* Note that ethernet-type MUST be 2054 (0x806)
+
+[source,xml]
+--------------------------------------------------------------------------------
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<flow xmlns="urn:opendaylight:flow:inventory">
+    <strict>false</strict>
+    <instructions>
+        <instruction>
+            <order>0</order>
+            <apply-actions>
+                <action>
+                    <order>0</order>
+                    <dec-nw-ttl/>
+                </action>
+                <action>
+                    <order>1</order>
+                    <dec-mpls-ttl/>
+                </action>
+            </apply-actions>
+        </instruction>
+    </instructions>
+    <table_id>2</table_id>
+    <id>137</id>
+    <cookie_mask>255</cookie_mask>
+    <match>
+        <ethernet-match>
+            <ethernet-type>
+                <type>2054</type>
+            </ethernet-type>
+            <ethernet-destination>
+                <address>ff:ff:ff:ff:FF:ff</address>
+            </ethernet-destination>
+            <ethernet-source>
+                <address>00:00:FC:01:23:ae</address>
+            </ethernet-source>
+        </ethernet-match>
+        <arp-op>1</arp-op>
+        <arp-source-transport-address>192.168.4.1</arp-source-transport-address>
+        <arp-target-transport-address>10.21.22.23</arp-target-transport-address>
+        <arp-source-hardware-address>
+            <address>12:34:56:78:98:AB</address>
+        </arp-source-hardware-address>
+        <arp-target-hardware-address>
+            <address>FE:DC:BA:98:76:54</address>
+        </arp-target-hardware-address>
+    </match>
+    <hard-timeout>12</hard-timeout>
+    <cookie>14</cookie>
+    <idle-timeout>34</idle-timeout>
+    <flow-name>FooXf14</flow-name>
+    <priority>2</priority>
+    <barrier>false</barrier>
+--------------------------------------------------------------------------------
+
+[[ethernet-src-dest-addresses-ethernet-type-vlan-id-vlan-pcp]]
+===== Ethernet Src & Dest Addresses, Ethernet Type, VLAN ID, VLAN PCP
+
+[source,xml]
+-------------------------------------------------------
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<flow xmlns="urn:opendaylight:flow:inventory">
+    <strict>false</strict>
+    <instructions>
+        <instruction>
+            <order>0</order>
+            <apply-actions>
+                <action>
+                    <order>0</order>
+                    <dec-nw-ttl/>
+                </action>
+            </apply-actions>
+        </instruction>
+    </instructions>
+    <table_id>2</table_id>
+    <id>138</id>
+    <cookie_mask>255</cookie_mask>
+    <match>
+        <ethernet-match>
+            <ethernet-type>
+                <type>2048</type>
+            </ethernet-type>
+            <ethernet-destination>
+                <address>ff:ff:29:01:19:61</address>
+            </ethernet-destination>
+            <ethernet-source>
+                <address>00:00:00:11:23:ae</address>
+            </ethernet-source>
+        </ethernet-match>
+        <vlan-match>
+            <vlan-id>
+                <vlan-id>78</vlan-id>
+                <vlan-id-present>true</vlan-id-present>
+            </vlan-id>
+            <vlan-pcp>3</vlan-pcp>
+      </vlan-match>
+    </match>
+    <hard-timeout>1200</hard-timeout>
+    <cookie>15</cookie>
+    <idle-timeout>3400</idle-timeout>
+    <flow-name>FooXf15</flow-name>
+    <priority>2</priority>
+    <barrier>false</barrier>
+</flow>
+-------------------------------------------------------
+
+[[ethernet-src-dest-addresses-mpls-label-mpls-tc-mpls-bos]]
+===== Ethernet Src & Dest Addresses, MPLS Label, MPLS TC, MPLS BoS
+
+[source,xml]
+------------------------------------------------------
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<flow xmlns="urn:opendaylight:flow:inventory">
+    <flow-name>FooXf17</flow-name>
+    <id>140</id>
+    <cookie_mask>255</cookie_mask>
+    <cookie>17</cookie>
+    <hard-timeout>1200</hard-timeout>
+    <idle-timeout>3400</idle-timeout>
+    <priority>2</priority>
+    <table_id>2</table_id>
+    <strict>false</strict>
+    <instructions>
+        <instruction>
+            <order>0</order>
+            <apply-actions>
+                <action>
+                    <order>0</order>
+                    <dec-nw-ttl/>
+                </action>
+            </apply-actions>
+        </instruction>
+    </instructions>
+    <match>
+        <ethernet-match>
+            <ethernet-type>
+                <type>34887</type>
+            </ethernet-type>
+            <ethernet-destination>
+                <address>ff:ff:29:01:19:61</address>
+            </ethernet-destination>
+            <ethernet-source>
+                <address>00:00:00:11:23:ae</address>
+            </ethernet-source>
+        </ethernet-match>
+        <protocol-match-fields>
+            <mpls-label>567</mpls-label>
+            <mpls-tc>3</mpls-tc>
+            <mpls-bos>1</mpls-bos>
+        </protocol-match-fields>
+    </match>
+</flow>
+------------------------------------------------------
+
+[[ipv6-src-dest-addresses]]
+===== IPv6 Src & Dest Addresses
+
+* Note that ethernet-type MUST be 34525
+
+[source,xml]
+------------------------------------------------------------------------------
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<flow xmlns="urn:opendaylight:flow:inventory">
+    <strict>false</strict>
+    <flow-name>FooXf18</flow-name>
+    <id>141</id>
+    <cookie_mask>255</cookie_mask>
+    <cookie>18</cookie>
+    <table_id>2</table_id>
+    <priority>2</priority>
+    <hard-timeout>1200</hard-timeout>
+    <idle-timeout>3400</idle-timeout>
+    <installHw>false</installHw>
+    <instructions>
+        <instruction>
+            <order>0</order>
+            <apply-actions>
+                <action>
+                    <order>0</order>
+                    <dec-nw-ttl/>
+                </action>
+            </apply-actions>
+        </instruction>
+    </instructions>
+    <match>
+        <ethernet-match>
+            <ethernet-type>
+                <type>34525</type>
+            </ethernet-type>
+        </ethernet-match>
+        <ipv6-source>fe80::2acf:e9ff:fe21:6431/128</ipv6-source>
+        <ipv6-destination>aabb:1234:2acf:e9ff::fe21:6431/64</ipv6-destination>
+    </match>
+</flow>
+------------------------------------------------------------------------------
+
+[[metadata]]
+===== Metadata
+
+[source,xml]
+------------------------------------------------------
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<flow xmlns="urn:opendaylight:flow:inventory">
+    <strict>false</strict>
+    <flow-name>FooXf19</flow-name>
+    <id>142</id>
+    <cookie_mask>255</cookie_mask>
+    <cookie>19</cookie>
+    <table_id>2</table_id>
+    <priority>1</priority>
+    <hard-timeout>1200</hard-timeout>
+    <idle-timeout>3400</idle-timeout>
+    <installHw>false</installHw>
+    <instructions>
+        <instruction>
+            <order>0</order>
+            <apply-actions>
+                <action>
+                    <order>0</order>
+                    <dec-nw-ttl/>
+                </action>
+            </apply-actions>
+        </instruction>
+    </instructions>
+    <match>
+        <metadata>
+            <metadata>12345</metadata>
+        </metadata>
+    </match>
+</flow>
+------------------------------------------------------
+
+[[metadata-metadata-mask]]
+===== Metadata, Metadata Mask
+
+[source,xml]
+------------------------------------------------------
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<flow xmlns="urn:opendaylight:flow:inventory">
+    <strict>false</strict>
+    <flow-name>FooXf20</flow-name>
+    <id>143</id>
+    <cookie_mask>255</cookie_mask>
+    <cookie>20</cookie>
+    <table_id>2</table_id>
+    <priority>2</priority>
+    <hard-timeout>1200</hard-timeout>
+    <idle-timeout>3400</idle-timeout>
+    <installHw>false</installHw>
+    <instructions>
+        <instruction>
+            <order>0</order>
+            <apply-actions>
+                <action>
+                    <order>0</order>
+                    <dec-nw-ttl/>
+                </action>
+            </apply-actions>
+        </instruction>
+    </instructions>
+    <match>
+        <metadata>
+            <metadata>12345</metadata>
+            <metadata-mask>//FF</metadata-mask>
+        </metadata>
+    </match>
+</flow>
+------------------------------------------------------
+
+[[ipv6-src-dest-addresses-metadata-ip-dscp-ip-ecn-udp-src-dest-ports]]
+===== IPv6 Src & Dest Addresses, Metadata, IP DSCP, IP ECN, UDP Src & Dest Ports
+
+* Note that ethernet-type MUST be 34525
+
+[source,xml]
+-----------------------------------------------------------------------------
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<flow xmlns="urn:opendaylight:flow:inventory">
+    <strict>false</strict>
+    <flow-name>FooXf21</flow-name>
+    <id>144</id>
+    <cookie_mask>255</cookie_mask>
+    <cookie>21</cookie>
+    <table_id>2</table_id>
+    <priority>2</priority>
+    <hard-timeout>1200</hard-timeout>
+    <idle-timeout>3400</idle-timeout>
+    <installHw>false</installHw>
+    <instructions>
+        <instruction>
+            <order>0</order>
+            <apply-actions>
+                <action>
+                    <order>0</order>
+                    <dec-nw-ttl/>
+                </action>
+            </apply-actions>
+        </instruction>
+    </instructions>
+    <match>
+        <ethernet-match>
+            <ethernet-type>
+                <type>34525</type>
+            </ethernet-type>
+        </ethernet-match>
+        <ipv6-source>1234:5678:9ABC:DEF0:FDCD:A987:6543:210F/76</ipv6-source>
+        <ipv6-destination>fe80::2acf:e9ff:fe21:6431/128</ipv6-destination>
+        <metadata>
+            <metadata>12345</metadata>
+        </metadata>
+        <ip-match>
+            <ip-protocol>17</ip-protocol>
+            <ip-dscp>8</ip-dscp>
+            <ip-ecn>3</ip-ecn>
+        </ip-match>
+        <udp-source-port>25364</udp-source-port>
+        <udp-destination-port>8080</udp-destination-port>
+    </match>
+</flow>
+-----------------------------------------------------------------------------
+
+[[ipv6-src-dest-addresses-metadata-ip-dscp-ip-ecn-tcp-src-dest-ports]]
+===== IPv6 Src & Dest Addresses, Metadata, IP DSCP, IP ECN, TCP Src & Dest Ports
+
+* Note that ethernet-type MUST be 34525
+* Note that IP Protocol MUST be 6
+
+[source,xml]
+-----------------------------------------------------------------------------
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<flow xmlns="urn:opendaylight:flow:inventory">
+    <strict>false</strict>
+    <flow-name>FooXf22</flow-name>
+    <id>145</id>
+    <cookie_mask>255</cookie_mask>
+    <cookie>22</cookie>
+    <table_id>2</table_id>
+    <priority>2</priority>
+    <hard-timeout>1200</hard-timeout>
+    <idle-timeout>3400</idle-timeout>
+    <installHw>false</installHw>
+    <instructions>
+        <instruction>
+            <order>0</order>
+            <apply-actions>
+                <action>
+                    <order>0</order>
+                    <dec-nw-ttl/>
+                </action>
+            </apply-actions>
+        </instruction>
+    </instructions>
+    <match>
+        <ethernet-match>
+            <ethernet-type>
+                <type>34525</type>
+            </ethernet-type>
+        </ethernet-match>
+        <ipv6-source>1234:5678:9ABC:DEF0:FDCD:A987:6543:210F/76</ipv6-source>
+        <ipv6-destination>fe80:2acf:e9ff:fe21::6431/94</ipv6-destination>
+        <metadata>
+            <metadata>12345</metadata>
+        </metadata>
+        <ip-match>
+            <ip-protocol>6</ip-protocol>
+            <ip-dscp>60</ip-dscp>
+            <ip-ecn>3</ip-ecn>
+        </ip-match>
+        <tcp-source-port>183</tcp-source-port>
+        <tcp-destination-port>8080</tcp-destination-port>
+    </match>
+</flow>
+-----------------------------------------------------------------------------
+
+[[ipv6-src-dest-addresses-metadata-ip-dscp-ip-ecn-tcp-src-dest-ports-ipv6-label]]
+===== IPv6 Src & Dest Addresses, Metadata, IP DSCP, IP ECN, TCP Src & Dest Ports, IPv6 Label
+
+* Note that ethernet-type MUST be 34525
+* Note that IP Protocol MUST be 6
+
+[source,xml]
+-----------------------------------------------------------------------------
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<flow xmlns="urn:opendaylight:flow:inventory">
+    <strict>false</strict>
+    <flow-name>FooXf23</flow-name>
+    <id>146</id>
+    <cookie_mask>255</cookie_mask>
+    <cookie>23</cookie>
+    <table_id>2</table_id>
+    <priority>2</priority>
+    <hard-timeout>1200</hard-timeout>
+    <idle-timeout>3400</idle-timeout>
+    <installHw>false</installHw>
+    <instructions>
+        <instruction>
+            <order>0</order>
+            <apply-actions>
+                <action>
+                    <order>0</order>
+                    <dec-nw-ttl/>
+                </action>
+            </apply-actions>
+        </instruction>
+    </instructions>
+    <match>
+        <ethernet-match>
+            <ethernet-type>
+                <type>34525</type>
+            </ethernet-type>
+        </ethernet-match>
+        <ipv6-source>1234:5678:9ABC:DEF0:FDCD:A987:6543:210F/76</ipv6-source>
+        <ipv6-destination>fe80:2acf:e9ff:fe21::6431/94</ipv6-destination>
+        <metadata>
+            <metadata>12345</metadata>
+        </metadata>
+        <ipv6-label>
+            <ipv6-flabel>33</ipv6-flabel>
+        </ipv6-label>
+        <ip-match>
+            <ip-protocol>6</ip-protocol>
+            <ip-dscp>60</ip-dscp>
+            <ip-ecn>3</ip-ecn>
+        </ip-match>
+        <tcp-source-port>183</tcp-source-port>
+        <tcp-destination-port>8080</tcp-destination-port>
+    </match>
+</flow>
+-----------------------------------------------------------------------------
+
+[[tunnel-id]]
+===== Tunnel ID
+
+[source,xml]
+------------------------------------------------------
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<flow xmlns="urn:opendaylight:flow:inventory">
+    <strict>false</strict>
+    <flow-name>FooXf24</flow-name>
+    <id>147</id>
+    <cookie_mask>255</cookie_mask>
+    <cookie>24</cookie>
+    <table_id>2</table_id>
+    <priority>2</priority>
+    <hard-timeout>1200</hard-timeout>
+    <idle-timeout>3400</idle-timeout>
+    <installHw>false</installHw>
+    <instructions>
+        <instruction>
+            <order>0</order>
+            <apply-actions>
+                <action>
+                    <order>0</order>
+                    <dec-nw-ttl/>
+                </action>
+            </apply-actions>
+        </instruction>
+    </instructions>
+    <match>
+        <tunnel>
+            <tunnel-id>2591</tunnel-id>
+        </tunnel>
+    </match>
+</flow>
+------------------------------------------------------
+
+[[ipv6-src-dest-addresses-metadata-ip-dscp-ip-ecn-icmpv6-type-code-ipv6-label]]
+===== IPv6 Src & Dest Addresses, Metadata, IP DSCP, IP ECN, ICMPv6 Type & Code, IPv6 Label
+
+* Note that ethernet-type MUST be 34525
+* Note that IP Protocol MUST be 58
+
+[source,xml]
+-----------------------------------------------------------------------------
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<flow xmlns="urn:opendaylight:flow:inventory">
+    <strict>false</strict>
+    <flow-name>FooXf25</flow-name>
+    <id>148</id>
+    <cookie_mask>255</cookie_mask>
+    <cookie>25</cookie>
+    <table_id>2</table_id>
+    <priority>2</priority>
+    <hard-timeout>1200</hard-timeout>
+    <idle-timeout>3400</idle-timeout>
+    <installHw>false</installHw>
+    <instructions>
+        <instruction>
+            <order>0</order>
+            <apply-actions>
+                <action>
+                    <order>0</order>
+                    <dec-nw-ttl/>
+                </action>
+            </apply-actions>
+        </instruction>
+    </instructions>
+    <match>
+        <ethernet-match>
+            <ethernet-type>
+                <type>34525</type>
+            </ethernet-type>
+        </ethernet-match>
+        <ipv6-source>1234:5678:9ABC:DEF0:FDCD:A987:6543:210F/76</ipv6-source>
+        <ipv6-destination>fe80:2acf:e9ff:fe21::6431/94</ipv6-destination>
+        <metadata>
+            <metadata>12345</metadata>
+        </metadata>
+        <ipv6-label>
+            <ipv6-flabel>33</ipv6-flabel>
+        </ipv6-label>
+        <ip-match>
+            <ip-protocol>58</ip-protocol>
+            <ip-dscp>60</ip-dscp>
+            <ip-ecn>3</ip-ecn>
+        </ip-match>
+        <icmpv6-match>
+            <icmpv6-type>6</icmpv6-type>
+            <icmpv6-code>3</icmpv6-code>
+        </icmpv6-match>
+    </match>
+</flow>
+-----------------------------------------------------------------------------
+
+[[ipv6-src-dest-addresses-metadata-ip-dscp-ip-ecn-tcp-src-dst-ports-ipv6-label-ipv6-ext-header]]
+===== IPv6 Src & Dest Addresses, Metadata, IP DSCP, IP ECN, TCP Src & Dst Ports, IPv6 Label, IPv6 Ext Header
+
+* Note that ethernet-type MUST be 34525
+* Note that IP Protocol MUST be 58
+
+[source,xml]
+-----------------------------------------------------------------------------
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<flow xmlns="urn:opendaylight:flow:inventory">
+    <strict>false</strict>
+    <flow-name>FooXf27</flow-name>
+    <id>150</id>
+    <cookie_mask>255</cookie_mask>
+    <cookie>27</cookie>
+    <table_id>2</table_id>
+    <priority>2</priority>
+    <hard-timeout>1200</hard-timeout>
+    <idle-timeout>3400</idle-timeout>
+    <installHw>false</installHw>
+    <instructions>
+        <instruction>
+            <order>0</order>
+            <apply-actions>
+                <action>
+                    <order>0</order>
+                    <dec-nw-ttl/>
+                </action>
+            </apply-actions>
+        </instruction>
+    </instructions>
+    <match>
+        <ethernet-match>
+            <ethernet-type>
+                <type>34525</type>
+            </ethernet-type>
+        </ethernet-match>
+        <ipv6-source>1234:5678:9ABC:DEF0:FDCD:A987:6543:210F/76</ipv6-source>
+        <ipv6-destination>fe80:2acf:e9ff:fe21::6431/94</ipv6-destination>
+        <metadata>
+            <metadata>12345</metadata>
+        </metadata>
+        <ipv6-label>
+            <ipv6-flabel>33</ipv6-flabel>
+        </ipv6-label>
+        <ipv6-ext-header>
+            <ipv6-exthdr>0</ipv6-exthdr>
+        </ipv6-ext-header>
+        <ip-match>
+            <ip-protocol>6</ip-protocol>
+            <ip-dscp>60</ip-dscp>
+            <ip-ecn>3</ip-ecn>
+        </ip-match>
+        <tcp-source-port>183</tcp-source-port>
+        <tcp-destination-port>8080</tcp-destination-port>
+    </match>
+</flow>
+-----------------------------------------------------------------------------
+
+[[actions]]
+==== Actions
+
+The format of the XML that describes OpenFlow actions is determined by
+the opendaylight-action-types yang model: .
+
+The RESTCONF documentation for the match-types yang model can be found
+at
+https://jenkins.opendaylight.org/controller/job/controller-merge/lastSuccessfulBuild/artifact/opendaylight/md-sal/model/model-flow-base/target/site/models/opendaylight-action-types.html[opendaylight-action-types.html]
+
+[[apply-actions]]
+===== Apply Actions
+
+[[output-to-table]]
+====== Output to TABLE
+
+[source,xml]
+-----------------------------------------------------------------------------
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<flow xmlns="urn:opendaylight:flow:inventory">
+    <strict>false</strict>
+    <flow-name>FooXf101</flow-name>
+    <id>256</id>
+    <cookie_mask>255</cookie_mask>
+    <cookie>101</cookie>
+    <table_id>2</table_id>
+    <priority>2</priority>
+    <hard-timeout>1200</hard-timeout>
+    <idle-timeout>3400</idle-timeout>
+    <installHw>false</installHw>
+    <instructions>
+        <instruction>
+            <order>0</order>
+            <apply-actions>
+                <action>
+                    <order>0</order>
+                    <output-action>
+                        <output-node-connector>TABLE</output-node-connector>
+                        <max-length>60</max-length>
+                    </output-action>
+                </action>
+            </apply-actions>
+        </instruction>
+    </instructions>
+    <match>
+        <ethernet-match>
+            <ethernet-type>
+                <type>34525</type>
+            </ethernet-type>
+        </ethernet-match>
+        <ipv6-source>1234:5678:9ABC:DEF0:FDCD:A987:6543:210F/76</ipv6-source>
+        <ipv6-destination>fe80:2acf:e9ff:fe21::6431/94</ipv6-destination>
+        <metadata>
+            <metadata>12345</metadata>
+        </metadata>
+        <ip-match>
+            <ip-protocol>6</ip-protocol>
+            <ip-dscp>60</ip-dscp>
+            <ip-ecn>3</ip-ecn>
+        </ip-match>
+        <tcp-source-port>183</tcp-source-port>
+        <tcp-destination-port>8080</tcp-destination-port>
+    </match>
+</flow>
+-----------------------------------------------------------------------------
+
+[[output-to-inport]]
+====== Output to INPORT
+
+[source,xml]
+-----------------------------------------------------------------------------
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<flow xmlns="urn:opendaylight:flow:inventory">
+    <strict>false</strict>
+    <flow-name>FooXf102</flow-name>
+    <id>257</id>
+    <cookie_mask>255</cookie_mask>
+    <cookie>102</cookie>
+    <table_id>2</table_id>
+    <priority>2</priority>
+    <hard-timeout>1200</hard-timeout>
+    <idle-timeout>3400</idle-timeout>
+    <installHw>false</installHw>
+    <instructions>
+        <instruction>
+            <order>0</order>
+            <apply-actions>
+                <action>
+                    <order>0</order>
+                    <output-action>
+                        <output-node-connector>INPORT</output-node-connector>
+                        <max-length>60</max-length>
+                    </output-action>
+                </action>
+7            </apply-actions>
+        </instruction>
+    </instructions>
+    <match>
+        <ethernet-match>
+            <ethernet-type>
+                <type>2048</type>
+            </ethernet-type>
+            <ethernet-destination>
+                <address>ff:ff:29:01:19:61</address>
+            </ethernet-destination>
+            <ethernet-source>
+                <address>00:00:00:11:23:ae</address>
+            </ethernet-source>
+        </ethernet-match>
+        <ipv4-source>17.1.2.3/8</ipv4-source>
+        <ipv4-destination>172.168.5.6/16</ipv4-destination>
+        <ip-match>
+            <ip-protocol>6</ip-protocol>
+            <ip-dscp>2</ip-dscp>
+            <ip-ecn>2</ip-ecn>
+        </ip-match>
+        <tcp-source-port>25364</tcp-source-port>
+        <tcp-destination-port>8080</tcp-destination-port>
+    </match>
+</flow>
+-----------------------------------------------------------------------------
+
+[[output-to-physical-port]]
+====== Output to Physical Port
+
+[source,xml]
+------------------------------------------------------------------------
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<flow xmlns="urn:opendaylight:flow:inventory">
+    <strict>false</strict>
+    <flow-name>FooXf103</flow-name>
+    <id>258</id>
+    <cookie_mask>255</cookie_mask>
+    <cookie>103</cookie>
+    <table_id>2</table_id>
+    <priority>2</priority>
+    <hard-timeout>1200</hard-timeout>
+    <idle-timeout>3400</idle-timeout>
+    <installHw>false</installHw>
+    <instructions>
+        <instruction>
+            <order>0</order>
+            <apply-actions>
+                <action>
+                    <order>0</order>
+                    <output-action>
+                        <output-node-connector>1</output-node-connector>
+                        <max-length>60</max-length>
+                    </output-action>
+                </action>
+            </apply-actions>
+        </instruction>
+    </instructions>
+    <match>
+        <ethernet-match>
+            <ethernet-type>
+                <type>2048</type>
+            </ethernet-type>
+            <ethernet-destination>
+                <address>ff:ff:29:01:19:61</address>
+            </ethernet-destination>
+            <ethernet-source>
+                <address>00:00:00:11:23:ae</address>
+            </ethernet-source>
+        </ethernet-match>
+        <ipv4-source>17.1.2.3/8</ipv4-source>
+        <ipv4-destination>172.168.5.6/16</ipv4-destination>
+        <ip-match>
+            <ip-protocol>6</ip-protocol>
+            <ip-dscp>2</ip-dscp>
+            <ip-ecn>2</ip-ecn>
+        </ip-match>
+        <tcp-source-port>25364</tcp-source-port>
+        <tcp-destination-port>8080</tcp-destination-port>
+    </match>
+</flow>
+------------------------------------------------------------------------
+
+[[output-to-local]]
+====== Output to LOCAL
+
+[source,xml]
+-----------------------------------------------------------------------------
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<flow xmlns="urn:opendaylight:flow:inventory">
+    <strict>false</strict>
+    <flow-name>FooXf104</flow-name>
+    <id>259</id>
+    <cookie_mask>255</cookie_mask>
+    <cookie>104</cookie>
+    <table_id>2</table_id>
+    <priority>2</priority>
+    <hard-timeout>1200</hard-timeout>
+    <idle-timeout>3400</idle-timeout>
+    <installHw>false</installHw>
+    <instructions>
+        <instruction>
+            <order>0</order>
+            <apply-actions>
+                <action>
+                    <order>0</order>
+                    <output-action>
+                        <output-node-connector>LOCAL</output-node-connector>
+                        <max-length>60</max-length>
+                    </output-action>
+                </action>
+            </apply-actions>
+        </instruction>
+    </instructions>
+    <match>
+        <ethernet-match>
+            <ethernet-type>
+                <type>34525</type>
+            </ethernet-type>
+        </ethernet-match>
+        <ipv6-source>1234:5678:9ABC:DEF0:FDCD:A987:6543:210F/76</ipv6-source>
+        <ipv6-destination>fe80:2acf:e9ff:fe21::6431/94</ipv6-destination>
+        <metadata>
+            <metadata>12345</metadata>
+        </metadata>
+        <ip-match>
+            <ip-protocol>6</ip-protocol>
+            <ip-dscp>60</ip-dscp>
+            <ip-ecn>3</ip-ecn>
+        </ip-match>
+        <tcp-source-port>183</tcp-source-port>
+        <tcp-destination-port>8080</tcp-destination-port>
+    </match>
+</flow>
+-----------------------------------------------------------------------------
+
+[[output-to-normal]]
+====== Output to NORMAL
+
+[source,xml]
+-----------------------------------------------------------------------------
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<flow xmlns="urn:opendaylight:flow:inventory">
+    <strict>false</strict>
+    <flow-name>FooXf105</flow-name>
+    <id>260</id>
+    <cookie_mask>255</cookie_mask>
+    <cookie>105</cookie>
+    <table_id>2</table_id>
+    <priority>2</priority>
+    <hard-timeout>1200</hard-timeout>
+    <idle-timeout>3400</idle-timeout>
+    <installHw>false</installHw>
+    <instructions>
+        <instruction>
+            <order>0</order>
+            <apply-actions>
+                <action>
+                    <order>0</order>
+                    <output-action>
+                        <output-node-connector>NORMAL</output-node-connector>
+                        <max-length>60</max-length>
+                    </output-action>
+                </action>
+            </apply-actions>
+        </instruction>
+    </instructions>
+    <match>
+        <ethernet-match>
+            <ethernet-type>
+                <type>34525</type>
+            </ethernet-type>
+        </ethernet-match>
+        <ipv6-source>1234:5678:9ABC:DEF0:FDCD:A987:6543:210F/84</ipv6-source>
+        <ipv6-destination>fe80:2acf:e9ff:fe21::6431/90</ipv6-destination>
+        <metadata>
+            <metadata>12345</metadata>
+        </metadata>
+        <ip-match>
+            <ip-protocol>6</ip-protocol>
+            <ip-dscp>45</ip-dscp>
+            <ip-ecn>2</ip-ecn>
+        </ip-match>
+        <tcp-source-port>20345</tcp-source-port>
+        <tcp-destination-port>80</tcp-destination-port>
+    </match>
+</flow>
+-----------------------------------------------------------------------------
+
+[[output-to-flood]]
+====== Output to FLOOD
+
+[source,xml]
+------------------------------------------------------------------------------
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<flow xmlns="urn:opendaylight:flow:inventory">
+    <strict>false</strict>
+    <flow-name>FooXf106</flow-name>
+    <id>261</id>
+    <cookie_mask>255</cookie_mask>
+    <cookie>106</cookie>
+    <table_id>2</table_id>
+    <priority>2</priority>
+    <hard-timeout>1200</hard-timeout>
+    <idle-timeout>3400</idle-timeout>
+    <installHw>false</installHw>
+    <instructions>
+        <instruction>
+            <order>0</order>
+            <apply-actions>
+                <action>
+                    <order>0</order>
+                    <output-action>
+                        <output-node-connector>FLOOD</output-node-connector>
+                        <max-length>60</max-length>
+                    </output-action>
+                </action>
+            </apply-actions>
+        </instruction>
+    </instructions>
+    <match>
+        <ethernet-match>
+            <ethernet-type>
+                <type>34525</type>
+            </ethernet-type>
+        </ethernet-match>
+        <ipv6-source>1234:5678:9ABC:DEF0:FDCD:A987:6543:210F/100</ipv6-source>
+        <ipv6-destination>fe80:2acf:e9ff:fe21::6431/67</ipv6-destination>
+        <metadata>
+            <metadata>12345</metadata>
+        </metadata>
+        <ip-match>
+            <ip-protocol>6</ip-protocol>
+            <ip-dscp>45</ip-dscp>
+            <ip-ecn>2</ip-ecn>
+        </ip-match>
+        <tcp-source-port>20345</tcp-source-port>
+        <tcp-destination-port>80</tcp-destination-port>
+    </match>
+</flow>
+------------------------------------------------------------------------------
+
+[[output-to-all]]
+====== Output to ALL
+
+[source,xml]
+--------------------------------------------------------------------------
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<flow xmlns="urn:opendaylight:flow:inventory">
+    <strict>false</strict>
+    <flow-name>FooXf107</flow-name>
+    <id>262</id>
+    <cookie_mask>255</cookie_mask>
+    <cookie>107</cookie>
+    <table_id>2</table_id>
+    <priority>2</priority>
+    <hard-timeout>1200</hard-timeout>
+    <idle-timeout>3400</idle-timeout>
+    <installHw>false</installHw>
+    <instructions>
+        <instruction>
+            <order>0</order>
+            <apply-actions>
+                <action>
+                    <order>0</order>
+                    <output-action>
+                        <output-node-connector>ALL</output-node-connector>
+                        <max-length>60</max-length>
+                    </output-action>
+                </action>
+            </apply-actions>
+        </instruction>
+    </instructions>
+    <match>
+        <ethernet-match>
+            <ethernet-type>
+                <type>2048</type>
+            </ethernet-type>
+            <ethernet-destination>
+                <address>20:14:29:01:19:61</address>
+            </ethernet-destination>
+            <ethernet-source>
+                <address>00:00:00:11:23:ae</address>
+            </ethernet-source>
+        </ethernet-match>
+        <ipv4-source>19.1.2.3/10</ipv4-source>
+        <ipv4-destination>172.168.5.6/18</ipv4-destination>
+        <ip-match>
+            <ip-protocol>17</ip-protocol>
+            <ip-dscp>8</ip-dscp>
+            <ip-ecn>3</ip-ecn>
+        </ip-match>
+        <udp-source-port>25364</udp-source-port>
+        <udp-destination-port>8080</udp-destination-port>
+        <in-port>0</in-port>
+    </match>
+</flow>
+--------------------------------------------------------------------------
+
+[[output-to-controller]]
+====== Output to CONTROLLER
+
+[source,xml]
+---------------------------------------------------------------------------------
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<flow xmlns="urn:opendaylight:flow:inventory">
+    <strict>false</strict>
+    <flow-name>FooXf108</flow-name>
+    <id>263</id>
+    <cookie_mask>255</cookie_mask>
+    <cookie>108</cookie>
+    <table_id>2</table_id>
+    <priority>2</priority>
+    <hard-timeout>1200</hard-timeout>
+    <idle-timeout>3400</idle-timeout>
+    <installHw>false</installHw>
+    <instructions>
+        <instruction>
+            <order>0</order>
+            <apply-actions>
+                <action>
+                    <order>0</order>
+                    <output-action>
+                        <output-node-connector>CONTROLLER</output-node-connector>
+                        <max-length>60</max-length>
+                    </output-action>
+                </action>
+            </apply-actions>
+        </instruction>
+    </instructions>
+    <match>
+        <ethernet-match>
+            <ethernet-type>
+                <type>2048</type>
+            </ethernet-type>
+            <ethernet-destination>
+                <address>20:14:29:01:19:61</address>
+            </ethernet-destination>
+            <ethernet-source>
+                <address>00:00:00:11:23:ae</address>
+            </ethernet-source>
+        </ethernet-match>
+        <ipv4-source>19.1.2.3/10</ipv4-source>
+        <ipv4-destination>172.168.5.6/18</ipv4-destination>
+        <ip-match>
+            <ip-protocol>17</ip-protocol>
+            <ip-dscp>8</ip-dscp>
+            <ip-ecn>3</ip-ecn>
+        </ip-match>
+        <udp-source-port>25364</udp-source-port>
+        <udp-destination-port>8080</udp-destination-port>
+        <in-port>0</in-port>
+    </match>
+</flow>
+---------------------------------------------------------------------------------
+
+[[output-to-any]]
+====== Output to ANY
+
+[source,xml]
+--------------------------------------------------------------------------
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<flow xmlns="urn:opendaylight:flow:inventory">
+    <strict>false</strict>
+    <flow-name>FooXf109</flow-name>
+    <id>264</id>
+    <cookie_mask>255</cookie_mask>
+    <cookie>109</cookie>
+    <table_id>2</table_id>
+    <priority>2</priority>
+    <hard-timeout>1200</hard-timeout>
+    <idle-timeout>3400</idle-timeout>
+    <installHw>false</installHw>
+    <instructions>
+        <instruction>
+            <order>0</order>
+            <apply-actions>
+                <action>
+                    <order>0</order>
+                    <output-action>
+                        <output-node-connector>ANY</output-node-connector>
+                        <max-length>60</max-length>
+                    </output-action>
+                </action>
+            </apply-actions>
+        </instruction>
+    </instructions>
+    <match>
+        <ethernet-match>
+            <ethernet-type>
+                <type>2048</type>
+            </ethernet-type>
+            <ethernet-destination>
+                <address>20:14:29:01:19:61</address>
+            </ethernet-destination>
+            <ethernet-source>
+                <address>00:00:00:11:23:ae</address>
+            </ethernet-source>
+        </ethernet-match>
+        <ipv4-source>19.1.2.3/10</ipv4-source>
+        <ipv4-destination>172.168.5.6/18</ipv4-destination>
+        <ip-match>
+            <ip-protocol>17</ip-protocol>
+            <ip-dscp>8</ip-dscp>
+            <ip-ecn>3</ip-ecn>
+        </ip-match>
+        <udp-source-port>25364</udp-source-port>
+        <udp-destination-port>8080</udp-destination-port>
+        <in-port>0</in-port>
+    </match>
+</flow>
+--------------------------------------------------------------------------
+
+[[push-vlan]]
+====== Push VLAN
+
+[source,xml]
+-----
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<flow xmlns="urn:opendaylight:flow:inventory">
+   <strict>false</strict>
+   <instructions>
+       <instruction>
+           <order>0</order>
+           <apply-actions>
+              <action>
+                 <push-vlan-action>
+                     <ethernet-type>33024</ethernet-type>
+                 </push-vlan-action>
+                 <order>0</order>
+              </action>
+               <action>
+                   <set-field>
+                       <vlan-match>
+                            <vlan-id>
+                                <vlan-id>79</vlan-id>
+                                <vlan-id-present>true</vlan-id-present>
+                            </vlan-id>
+                       </vlan-match>
+                   </set-field>
+                   <order>1</order>
+               </action>
+               <action>
+                   <output-action>
+                       <output-node-connector>5</output-node-connector>
+                   </output-action>
+                   <order>2</order>
+               </action>
+           </apply-actions>
+       </instruction>
+   </instructions>
+   <table_id>0</table_id>
+   <id>31</id>
+   <match>
+       <ethernet-match>
+           <ethernet-type>
+               <type>2048</type>
+           </ethernet-type>
+           <ethernet-destination>
+               <address>FF:FF:29:01:19:61</address>
+           </ethernet-destination>
+           <ethernet-source>
+               <address>00:00:00:11:23:AE</address>
+           </ethernet-source>
+       </ethernet-match>
+     <in-port>1</in-port>
+   </match>
+   <flow-name>vlan_flow</flow-name>
+   <priority>2</priority>
+</flow>
+-----
+
+[[push-mpls]]
+====== Push MPLS
+
+[source,xml]
+------------------------------------------------------------------------
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<flow 
+    xmlns="urn:opendaylight:flow:inventory">
+    <flow-name>push-mpls-action</flow-name>
+    <instructions>
+        <instruction>
+            <order>3</order>
+            <apply-actions>
+                <action>
+                    <push-mpls-action>
+                        <ethernet-type>34887</ethernet-type>
+                    </push-mpls-action>
+                    <order>0</order>
+                </action>
+                <action>
+                    <set-field>
+                        <protocol-match-fields>
+                            <mpls-label>27</mpls-label>
+                        </protocol-match-fields>
+                    </set-field>
+                    <order>1</order>
+                </action>
+                <action>
+                    <output-action>
+                        <output-node-connector>2</output-node-connector>
+                    </output-action>
+                    <order>2</order>
+                </action>
+            </apply-actions>
+        </instruction>
+    </instructions>
+    <strict>false</strict>
+    <id>100</id>
+    <match>
+        <ethernet-match>
+            <ethernet-type>
+                <type>2048</type>
+            </ethernet-type>
+        </ethernet-match>
+        <in-port>1</in-port>
+        <ipv4-destination>10.0.0.4/32</ipv4-destination>
+    </match>
+    <idle-timeout>0</idle-timeout>
+    <cookie_mask>255</cookie_mask>
+    <cookie>401</cookie>
+    <priority>8</priority>
+    <hard-timeout>0</hard-timeout>
+    <installHw>false</installHw>
+    <table_id>0</table_id>
+</flow>
+------------------------------------------------------------------------
+
+[[swap-mpls]]
+====== Swap MPLS
+
+* Note that ethernet-type MUST be 34887
+
+[source,xml]
+------------------------------------------------------------------------
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<flow 
+    xmlns="urn:opendaylight:flow:inventory">
+    <flow-name>push-mpls-action</flow-name>
+    <instructions>
+        <instruction>
+            <order>2</order>
+            <apply-actions>
+                <action>
+                    <set-field>
+                        <protocol-match-fields>
+                            <mpls-label>37</mpls-label>
+                        </protocol-match-fields>
+                    </set-field>
+                    <order>1</order>
+                </action>
+                <action>
+                    <output-action>
+                        <output-node-connector>2</output-node-connector>
+                    </output-action>
+                    <order>2</order>
+                </action>
+            </apply-actions>
+        </instruction>
+    </instructions>
+    <strict>false</strict>
+    <id>101</id>
+    <match>
+        <ethernet-match>
+            <ethernet-type>
+                <type>34887</type>
+            </ethernet-type>
+        </ethernet-match>
+        <in-port>1</in-port>
+        <protocol-match-fields>
+            <mpls-label>27</mpls-label>
+        </protocol-match-fields>
+    </match>
+    <idle-timeout>0</idle-timeout>
+    <cookie_mask>255</cookie_mask>
+    <cookie>401</cookie>
+    <priority>8</priority>
+    <hard-timeout>0</hard-timeout>
+    <installHw>false</installHw>
+    <table_id>0</table_id>
+</flow>
+------------------------------------------------------------------------
+
+[[pop-mpls]]
+====== Pop MPLS
+
+* Note that ethernet-type MUST be 34887
+* Issue with OVS 2.1
+http://git.openvswitch.org/cgi-bin/gitweb.cgi?p=openvswitch;a=commitdiff;h=b3f2fc93e3f357f8d05a92f53ec253339a40887f[OVS
+fix]
+
+[source,xml]
+------------------------------------------------------------------------
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<flow 
+    xmlns="urn:opendaylight:flow:inventory">
+    <flow-name>FooXf10</flow-name>
+    <instructions>
+        <instruction>
+            <order>0</order>
+            <apply-actions>
+                <action>
+                    <pop-mpls-action>
+                        <ethernet-type>2048</ethernet-type>
+                    </pop-mpls-action>
+                    <order>1</order>
+                </action>
+                <action>
+                    <output-action>
+                        <output-node-connector>2</output-node-connector>
+                        <max-length>60</max-length>
+                    </output-action>
+                    <order>2</order>
+                </action>
+            </apply-actions>
+        </instruction>
+    </instructions>
+    <id>11</id>
+    <strict>false</strict>
+    <match>
+        <ethernet-match>
+            <ethernet-type>
+                <type>34887</type>
+            </ethernet-type>
+        </ethernet-match>
+        <in-port>1</in-port>
+        <protocol-match-fields>
+            <mpls-label>37</mpls-label>
+        </protocol-match-fields>
+    </match>
+    <idle-timeout>0</idle-timeout>
+    <cookie>889</cookie>
+    <cookie_mask>255</cookie_mask>
+    <installHw>false</installHw>
+    <hard-timeout>0</hard-timeout>
+    <priority>10</priority>
+    <table_id>0</table_id>
+</flow>
+------------------------------------------------------------------------
diff --git a/manuals/user-guide/src/main/asciidoc/openflowplugin/odl-ofp-openflowplugin-user.adoc b/manuals/user-guide/src/main/asciidoc/openflowplugin/odl-ofp-openflowplugin-user.adoc
new file mode 100644 (file)
index 0000000..c074fe5
--- /dev/null
@@ -0,0 +1,25 @@
+== OpenFlow Plugin
+
+include::odl-ofp-overview-architecture.adoc[]
+
+include::odl-ofp-coverage.adoc[]
+
+include::odl-ofp-running-controller-with-the-new-of-plugin.adoc[]
+
+include::odl-ofp-test-environment.adoc[]
+
+include::odl-ofp-restconf-postman.adoc[]
+
+include::odl-ofp-end-to-end-inventory.adoc[]
+
+include::odl-ofp-end-to-end-topology.adoc[]
+
+include::odl-ofp-end-to-end-flows.adoc[]
+
+include::odl-ofp-end-to-end-groups.adoc[]
+
+include::odl-ofp-end-to-end-meters.adoc[]
+
+include::odl-ofp-statistics.adoc[]
+
+include::odl-ofp-of13-enabled-wireshark.adoc[]
diff --git a/manuals/user-guide/src/main/asciidoc/openflowplugin/odl-ofp-overview-and-architecture.adoc b/manuals/user-guide/src/main/asciidoc/openflowplugin/odl-ofp-overview-and-architecture.adoc
new file mode 100644 (file)
index 0000000..eea58ba
--- /dev/null
@@ -0,0 +1,59 @@
+===== Overview
+
+OpenFlow is a vendor-neutral standard communications interface defined
+to enable interaction between the control and forwarding layers of an
+SDN architecture. The OpenFlow plugin project intends to develop a
+plugin to support implementations of the OpenFlow specification as it
+develops and evolves. Specifically the project has developed a plugin
+aiming to support OpenFlow 1.0 and 1.3.x. It can be extended to add
+support for subsequent OpenFlow specifications. The plugin is based on
+the Model Driven Service Abstraction Layer (MD-SAL) architecture
+(https://wiki.opendaylight.org/view/OpenDaylight_Controller:MD-SAL).
+This new OpenFlow 1.0/1.3 MD-SAL based plugin is distinct from the old
+OpenFlow 1.0 plugin which was based on the API driven SAL (AD-SAL)
+architecture.
+
+
+===== Scope
+
+* Southbound plugin and integration of OpenFlow 1.0/1.3.x library
+project
+* Ongoing support and integration of the OpenFlow specification
+* The plugin should be implemented in an easily extensibile manner
+* Protocol verification activities will be performed on supported
+OpenFlow specifications
+
+===== Architecture and Design
+
+====== Functionality
+
+OpenFlow 1.3 Plugin will support the following functionality
+
+* Connection Handling
+* Session Management
+* State Management.
+* Error Handling.
+* Mapping function(Infrastructure to OF structures).
+* Connection establishment will be handled by OpenFlow library using
+opensource netty.io library.
+* Message handling(Ex: Packet in).
+* Event handling and propagation to upper layers.
+* Plugin will support both MD-SAL and Hard SAL.
+* Will be backward compatible with OF 1.0.
+
+*Activities in OF plugin module*
+
+* New OF plugin bundle will support both OF 1.0 and OF 1.3.
+* Integration with OpenFlow library.
+* Integration with corresponding MD-SAL infrastructure.
+* Hard SAL will be supported as adapter on top of MD-SAL plugin.
+* OF 1.3 and OF 1.0 plugin will be integrated as single bundle.
+
+
+====== Design
+
+*Overall Architecture*
+
+.overal architecture
+image::openflowplugin/plugin_design.jpg[Overal architecture,389, 289]
+    
diff --git a/manuals/user-guide/src/main/asciidoc/openflowplugin/odl-ofp-overview-architecture.adoc b/manuals/user-guide/src/main/asciidoc/openflowplugin/odl-ofp-overview-architecture.adoc
new file mode 100644 (file)
index 0000000..b466698
--- /dev/null
@@ -0,0 +1,62 @@
+[[overview]]
+=== Overview
+
+OpenFlow is a vendor-neutral standard communications interface defined
+to enable interaction between the control and forwarding layers of an
+SDN architecture. The OpenFlow plugin project intends to develop a
+plugin to support implementations of the OpenFlow specification as it
+develops and evolves. Specifically the project has developed a plugin
+aiming to support OpenFlow 1.0 and 1.3.x. It can be extended to add
+support for subsequent OpenFlow specifications. The plugin is based on
+the Model Driven Service Abstraction Layer (MD-SAL) architecture
+(https://wiki.opendaylight.org/view/OpenDaylight_Controller:MD-SAL).
+This new OpenFlow 1.0/1.3 MD-SAL based plugin is distinct from the old
+OpenFlow 1.0 plugin which was based on the API driven SAL (AD-SAL)
+architecture.
+
+[[scope]]
+==== Scope
+
+* Southbound plugin and integration of OpenFlow 1.0/1.3.x library
+project
+* Ongoing support and integration of the OpenFlow specification
+* The plugin should be implemented in an easily extensibile manner
+* Protocol verification activities will be performed on supported
+OpenFlow specifications
+
+[[architecture-and-design]]
+==== Architecture and Design
+
+[[functionality]]
+===== Functionality
+
+OpenFlow 1.3 Plugin will support the following functionality
+
+* Connection Handling
+* Session Management
+* State Management.
+* Error Handling.
+* Mapping function(Infrastructure to OF structures).
+* Connection establishment will be handled by OpenFlow library using
+opensource netty.io library.
+* Message handling(Ex: Packet in).
+* Event handling and propagation to upper layers.
+* Plugin will support both MD-SAL and Hard SAL.
+* Will be backward compatible with OF 1.0.
+
+[[activities-in-of-plugin-module]]
+===== Activities in OF plugin module
+
+* OF plugin bundle supports both OF 1.0 and OF 1.3.
+* Integration with OpenFlow library.
+* Integration with corresponding MD-SAL infrastructure.
+* AD-SAL supported as adapter on top of MD-SAL plugin.
+* OF 1.3 and OF 1.0 plugin will be integrated as single bundle.
+
+[[design]]
+==== Design
+
+[[overall-architecture]]
+===== Overall Architecture
+
+image:openflowplugin/Plugin_design.jpg[Plugin Design,title="Plugin Design", width= 500]
diff --git a/manuals/user-guide/src/main/asciidoc/openflowplugin/odl-ofp-restconf-postman.adoc b/manuals/user-guide/src/main/asciidoc/openflowplugin/odl-ofp-restconf-postman.adoc
new file mode 100644 (file)
index 0000000..d5bc422
--- /dev/null
@@ -0,0 +1,21 @@
+
+[[how-to-hit-restconf-with-postman]]
+=== How to hit RestConf with Postman
+
+Postman is a useful Chrome app which can be used to test REST APIs.
+
+https://chrome.google.com/webstore/detail/postman-rest-client/fdmmgilgnpjigdojojpjoooidkmcomcm?hl=en[Install
+Postman for Chrome]
+
+In the chrome browser bar enter
+
+--------------
+chrome://apps/
+--------------
+
+And click on Postman.
+
+Enter the URL. Click on the Headers button on the far right. Enter the
+Accept: header. Click on the Basic Auth Tab at the top and setup the
+username and password. Send.
+
diff --git a/manuals/user-guide/src/main/asciidoc/openflowplugin/odl-ofp-running-controller-with-the-new-of-plugin.adoc b/manuals/user-guide/src/main/asciidoc/openflowplugin/odl-ofp-running-controller-with-the-new-of-plugin.adoc
new file mode 100644 (file)
index 0000000..8033aeb
--- /dev/null
@@ -0,0 +1,180 @@
+===== Opendaylight Controller Plugin Options
+
+[[odl-ofp-running-controller-with-the-new-of-plugin_top]]
+* Run OpenDaylight controller with the new OpenFlow 1.0/1.3 plugin
+
+There are 2 ways. In integration project the plugin version is
+controlled by startup parameter. Or there is distribution build
+available directly in openflowplugin project.
+
+1.  use *integration* project
+* download and unzip latest build from
+https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/org/opendaylight/integration/distribution-karaf/0.2.2-SNAPSHOT/
++
+  cd <extracted directory>/bin
+  ./karaf 
++
+* or clone and build *integration* project:
++
+ git clone https://git.opendaylight.org/gerrit/p/integration.git
+ cd integration/distributions/extra/karaf
+ mvn clean install
+ cd ./target/assembly/bin
++
+* and finally run
++
+ ./karaf
++
+2.  use *openflowplugin* project
+* download and unzip latest build from
+https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/org/opendaylight/openflowplugin/openflowplugin-karaf/0.1.0-SNAPSHOT/
++
+  cd <extracted directory>/bin
+  ./karaf
++
+* or clone and build *openflowplugin* project:
++
+  git clone https://git.opendaylight.org/gerrit/p/openflowplugin.git
+  cd openflowplugin
+  mvn clean install
+  cd ./distribution/karaf/target/assembly/bin/
++  
+* or build whole distribution localy from folder distribution/karaf
+
+ mvn clean install -DskipTests
+
+
+* and run
++
+    ./karaf
++
+
+
+*How to start*
+
+There are all helium features (from features-openflowplugin) duplicated into features-openflowplugin-li. The duplicates got suffix '-li' and provide Lithium codebase functionality.
+
+These are most used:
+
+*    odl-openflowplugin-app-lldp-speaker-li
+*    odl-openflowplugin-flow-services-rest-li
+*    odl-openflowplugin-drop-test-li
+
+In case topology is required then the first one should be installed.
+
+ feature:install odl-openflowplugin-app-lldp-speaker-li
+
+The Li-southbound currently provides:
+
+*    flow management
+*    group management
+*    meter management
+*    statistics polling
+
+*What to log*
+
+In order to see really low level messages enter these in karaf console:
+
+ log:set TRACE org.opendaylight.openflowplugin.openflow.md.core
+ log:set TRACE org.opendaylight.openflowplugin.impl
+
+*How enable topology*
+
+In order for topology to work (fill dataStore/operational with links) there must be LLDP responses delivered back to controller. This requires table-miss-entries. Table-miss-entry is a flow in table.id=0 with low priority, empty match and one output action = send to controller. Having this flow installed on every node will enable for gathering and exporting links between nodes into dataStore/operational. This is done if you use for example l2 switch application.
+
+[source, xml]
+----
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<flow xmlns="urn:opendaylight:flow:inventory">
+   <barrier>false</barrier>
+   <cookie>54</cookie>
+   <flags>SEND_FLOW_REM</flags>
+   <flow-name>FooXf54</flow-name>
+   <hard-timeout>0</hard-timeout>
+   <id>4242</id>
+   <idle-timeout>0</idle-timeout>
+   <installHw>false</installHw>
+   <instructions>
+       <instruction>
+           <apply-actions>
+               <action>
+                   <output-action>
+                       <max-length>65535</max-length>
+                       <output-node-connector>CONTROLLER</output-node-connector>
+                   </output-action>
+                   <order>0</order>
+               </action>
+           </apply-actions>
+           <order>0</order>
+       </instruction>
+   </instructions>
+   <match/>
+   <priority>0</priority>
+   <strict>false</strict>
+   <table_id>0</table_id>
+</flow>
+----
+
+*Enable RESTCONF and Controller GUI*
+
+If you want to use RESTCONF with openflowplugin project, you have to
+install _odl-restconf_ feature to enable that. To install _odl-restconf_
+feature run the following command
+
+-----------------------------------
+karaf#>feature:install odl-restconf
+-----------------------------------
+
+If you want to access the Controller GUI, you have to install
+_odl-dlux-core_ feature to enable that. Run following command to install
+it
+
+------------------------------------
+karaf#>feature:install odl-dlux-core
+------------------------------------
+
+Once you enable the feature, access the Controller GUI using following
+URL
+
+-------------------------------------------
+http://<controller-ip>:8181/dlux/index.html
+-------------------------------------------
+
+
+*Run OpenDaylight controller with the old OpenFlow 1.0-only (old) plugin*
+
+There are 2 ways. In integration project the plugin version is
+controlled by startup parameter. Or there is distribution build
+available directly in controller project.
+
+1.  use *integration/distributions/base* project
+* use the instructions from
+OpenDaylight_OpenFlow_Plugin::Running_controller_with_the_new_OF_plugin#To_run_the_OpenDaylight_controller_with_the_new_OpenFlow_1.0/1.3_(new)_plugin[
+1.0/1.3 plugin], but skip the plugin version parameter:
++
+--------
+./run.sh
+--------
++
+
+2.  use *controller/distribution/opendaylight* project
+* download and unzip latest build from
+https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/org/opendaylight/controller/distribution.opendaylight/
+
++
+  cd opendaylight
++
+* or clone and build *controller* project:
++
+  git clone https://git.opendaylight.org/gerrit/p/controller.git
+  cd controller/opendaylight/distribution/opendaylight
+  mvn clean install
+  cd target/distribution.opendaylight-osgipackage/opendaylight
++
+* and finally run (there is no version specific option, because the
++
+1.0/1.3 (new) plugin is not available here at all)
++
+
+
+*Give it a minute to come up :)*
diff --git a/manuals/user-guide/src/main/asciidoc/openflowplugin/odl-ofp-statistics.adoc b/manuals/user-guide/src/main/asciidoc/openflowplugin/odl-ofp-statistics.adoc
new file mode 100644 (file)
index 0000000..a0c97d8
--- /dev/null
@@ -0,0 +1,131 @@
+[[overview]]
+===== Overview
+
+This page contains high level detail about the statistics collection
+mechanism in new OpenFlow plugin.
+
+[[statistics-collection-in-new-openflow-plugin]]
+====== Statistics collection in new OpenFlow plugin
+
+New OpenFlow plugin collects following statistics from OpenFlow enabled node(switch): 
+
+. Individual Flow Statistics
+. Aggregate Flow Statistics
+. Flow Table Statistics
+. Port Statistics
+. Group Description
+. Group Statistics
+. Meter Configuration
+. Meter Statistics
+. Queue Statistics
+. Node Description
+. Flow Table Features
+. Port Description
+. Group Features
+. Meter Features
+
+At a high level statistics collection mechanism is divided into
+following three parts
+
+. Statistics related
+https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=tree;f=opendaylight/md-sal/model/model-flow-statistics;h=3488133625ccf18d023bc59aa35c38e922b17d8d;hb=HEAD[YANG
+models, service APIs and notification interfaces] are defined in the
+MD-SAL.
+
+. Service APIs (RPCs) defined in yang models are implemented by
+OpenFlow plugin. Notification interfaces are wired up by OpenFlow plugin
+to MD-SAL.
+
+. Statistics Manager Module: This module use service APIs implemented by OpenFlow
+plugin to send statistics requests to all the connected OpenFlow enabled
+nodes. Module also implements notification interfaces to receive
+statistics response from nodes. Once it receives statistics response, it
+augment all the statistics data to the relevant element of the node
+(like node-connector, flow, table,group, meter) and store it in MD-SAL
+operational data store.
+
+[[details-of-statistics-collection]]
+====== Details of statistics collection
+
+* Current implementation collects above mentioned statistics (except
+10-14) at a periodic interval of 15 seconds.
+* Statistics mentioned in 10 to 14 are only fetched when any node
+connects to the controller because these statistics are just static
+details about the respective elements.
+* Whenever any new element is added to node (like flow, group, meter,
+queue) it sends statistics request immediately to fetch the latest
+statistics and store it in the operational data store.
+* Whenever any element is deleted from the node, it immediately remove
+the relevant statistics from operational data store.
+* Statistics data are augmented to their respective element stored in
+the configuration data store. E.g Controller installed flows are stored
+in configuration data store. Whenever Statistics Manager receive
+statistics data related to these flow, it search the corresponding flow
+in the configuration data store and augment statistics in the
+corresponding location in operational data store. Similar approach is
+used for other elements of the node.
+* Statistics Manager stores flow statistics as an unaccounted flow
+statistics in operational data store if there is no corresponding flow
+exist in configuration data store. ID format of unaccounted flow
+statistics is as follows - [#UF$TABLE**Unaccounted-flow-count - e.g
+#UF$TABLE*2*1].
+* All the unaccounted flows will be cleaned up periodically after every
+two cycle of flow statistics collection, given that there is no update
+for these flows in the last two cycles.
+* Statistics Manager only entertains statistics response for the request
+sent by itself. User can write its own statistics collector using the
+statistics service APIs and notification defined in yang models, it
+won't effect the functioning of Statistics Manager.
+* OpenFlow 1.0 don't have concept of Meter and Group, so Statistics
+Manager don't send any group & meter related statistics request to
+OpenFlow 1.0 enabled switch.
+
+[[restconf-uris-to-access-statistics-of-various-node-elements]]
+====== RESTCONF Uris to access statistics of various node elements
+
+* Aggregate Flow Statistics & Flow Table Statistics
+
+------------------------------------------------------------------------------------------------------------------
+GET  http://<controller-ip>:8080/restconf/operational/opendaylight-inventory:nodes/node/{node-id}/table/{table-id}
+------------------------------------------------------------------------------------------------------------------
+
+* Individual Flow Statistics from specific table
+
+---------------------------------------------------------------------------------------------------------------------------------
+GET  http://<controller-ip>:8080/restconf/operational/opendaylight-inventory:nodes/node/{node-id}/table/{table-id}/flow/{flow-id}
+---------------------------------------------------------------------------------------------------------------------------------
+
+* Group Features & Meter Features Statistics
+
+-------------------------------------------------------------------------------------------------
+GET  http://<controller-ip>:8080/restconf/operational/opendaylight-inventory:nodes/node/{node-id}
+-------------------------------------------------------------------------------------------------
+
+* Group Description & Group Statistics
+
+------------------------------------------------------------------------------------------------------------------
+GET  http://<controller-ip>:8080/restconf/operational/opendaylight-inventory:nodes/node/{node-id}/group/{group-id}
+------------------------------------------------------------------------------------------------------------------
+
+* Meter Configuration & Meter Statistics
+
+------------------------------------------------------------------------------------------------------------------
+GET  http://<controller-ip>:8080/restconf/operational/opendaylight-inventory:nodes/node/{node-id}/meter/{meter-id}
+------------------------------------------------------------------------------------------------------------------
+
+* Node Connector Statistics
+
+------------------------------------------------------------------------------------------------------------------------------------
+GET  http://<controller-ip>:8080/restconf/operational/opendaylight-inventory:nodes/node/{node-id}/node-connector/{node-connector-id}
+------------------------------------------------------------------------------------------------------------------------------------
+
+* Queue Statistics
+
+-----------------------------------------------------------------------------------------------------------------------------------------------------
+GET  http://<controller-ip>:8080/restconf/operational/opendaylight-inventory:nodes/node/{node-id}/node-connector/{node-connector-id}/queue/{queue-id}
+-----------------------------------------------------------------------------------------------------------------------------------------------------
+
+[[bugs]]
+====== Bugs
+
+For more details and queuries, please send mail to openflowplugin-dev@lists.opendaylight.org or avishnoi@in.ibm.com If you want to report any bug in statistics collection, please use https://bugs.opendaylight.org[bugzilla].
diff --git a/manuals/user-guide/src/main/asciidoc/openflowplugin/odl-ofp-test-environment.adoc b/manuals/user-guide/src/main/asciidoc/openflowplugin/odl-ofp-test-environment.adoc
new file mode 100644 (file)
index 0000000..8d98bcb
--- /dev/null
@@ -0,0 +1,175 @@
+[[odl-ofp-test-environment_top]]
+===== Getting Mininet with OF 1.3
+
+https://www.dropbox.com/s/dbf9a372elqs1s1/mininet-of-1.3.zip[Download
+Mininet VM Upgraded to OF 1.3] (or the
+https://www.dropbox.com/s/t66vqfqx57a7nhk/mininet-2.1.0-of1.3.zip[newer
+mininet-2.1.0 with OVS-2.0] that works with VMware Player. For using
+this on VirtualBox, import this to VMware Player and then export the
+.vmdk ) or you could build one yourself
+Openflow Protocol Library:OpenVirtualSwitch[Instructions for setting up
+Mininet with OF 1.3].
+
+====== Installing under VirtualBox
+
+.configuring a host-only adapter
+image::openflowplugin/host-only-vbox.png[configuring a host-only adapter,400,335]
+
+For whatever reason, at least on the Mac, NATed interfaces in VirtualBox
+don't actually seem to allow for connections from the host to the VM.
+Instead, you need to configure a host-only network and set it up. Do
+this by:
+
+* Go to the VM's settings in VirtualBox then to network and add a second
+adapter attached to "Host-only Adapter" (see the screenshot to the
+right)
+* Edit the /etc/network/interfaces file to configure the adapter
+properly by adding these two lines
+
+--------------------
+auto eth1
+iface eth1 inet dhcp
+--------------------
+
+* Reboot the VM
+
+At this point you should have two interfaces one which gives you NATed
+access to the internet and another that gives you access between your
+mac and the VMs. At least for me, the NATed interface gets a 10.0.2.x
+address and the the host-only interface gets a 192.168.56.x address.
+
+====== Your simplest choice: Use Vagrant
+
+https://www.virtualbox.org/[Download Virtual Box] and install it
+http://www.vagrantup.com/[Download Vagrant] and install it
+
+-----------------------------------------------
+cd openflowplugin/vagrant/mininet-2.1.0-of-1.3/
+vagrant up
+vagrant ssh
+-----------------------------------------------
+
+This will leave you sshed into a fully provisioned Ubuntu Trusty box
+with mininet-2.1.0 and OVS 2.0 patches to work with OF 1.3.
+
+===== Setup CPqD Openflow 1.3 Soft Switch
+
+Latest version of Openvswitch (v2.0.0) doesn't support all the openflow
+1.3 features, e.g group multipart statistics request. Alternate options
+is CPqD Openflow 1.3 soft switch, It supports most of the openflow 1.3
+features.
+
+* You can setup the switch as per the instructions given on the
+following URL
+
+https://github.com/CPqD/ofsoftswitch13[`https://github.com/CPqD/ofsoftswitch13`]
+
+* Fire following command to start the switch
+
+Start the datapath :
+
+---------------------------------------------------------------------------------------
+$ sudo udatapath/ofdatapath --datapath-id=<dpid> --interfaces=<if-list> ptcp:<port>
+ e.g $ sudo udatapath/ofdatapath --datapath-id=000000000001 --interfaces=ethX ptcp:6680
+---------------------------------------------------------------------------------------
+
+ethX should not be associated with ip address and ipv6 should be
+disabled on it. If you are installing the switch on your local machine,
+you can use following command (for Ubuntu) to create virtual interface.
+
+---------------------------------------------------------------------
+ip link add link ethX address 00:19:d1:29:d2:58 macvlan0 type macvlan
+---------------------------------------------------------------------
+
+ethX - Any existing interface.
+
+Or if you are using mininet VM for installing this switch, you can
+simply add one more adaptor to your VM.
+
+Start Openflow protocol agent:
+
+-------------------------------------------------------------------------------
+$secchan/ofprotocol tcp:<switch-host>:<switch-port> tcp:<ctrl-host>:<ctrl-port>
+ e.g $secchan/ofprotocol tcp:127.0.0.1:6680 tcp:127.0.0.1:6653
+-------------------------------------------------------------------------------
+
+[[commands-to-add-entries-to-various-tables-of-the-switch]]
+====== Commands to add entries to various tables of the switch
+
+* Add meter
+
+----------------------------------------------------------------------------------------
+$utilities/dpctl tcp:<switch-host>:<switch-port> meter-mod cmd=add,meter=1 drop:rate=50 
+----------------------------------------------------------------------------------------
+
+* Add Groups
+
+----------------------------------------------------------------------
+$utilities/dpctl tcp:127.0.0.1:6680 group-mod cmd=add,type=all,group=1
+----------------------------------------------------------------------
+
+-----------------------------------------------------------------------------------------
+$utilities/dpctl tcp:127.0.0.1:6680 group-mod cmd=add,type=sel,group=2 weight=10 output:1
+-----------------------------------------------------------------------------------------
+
+* Create queue
+
+--------------------------------------------------------------------------------------------------
+$utilities/dpctl tcp:<ip>:<switch port> queue-mod <port-number> <queue-number> <minimum-bandwidth>
+  e.g - $utilities/dpctl tcp:127.0.0.1:6680 queue-mod 1 1 23
+--------------------------------------------------------------------------------------------------
+
+"dpctl" --help is not very intuitive, so please keep adding any new
+command you figured out while your experiment with the switch.
+
+[[using-the-built-in-wireshark]]
+====== Using the built-in Wireshark
+
+Mininet comes with pre-installed Wireshark, but for some reason it does
+not include the Openflow protocol dissector. You may want to get and
+install it in the _/.wireshark/plugins/_ directory.
+
+First login to your mininet VM
+
+-------------------------------------
+ ssh mininet@<your mininet vm ip> -X 
+-------------------------------------
+
+The -X option in ssh will enable x-session over ssh so that the
+wireshark window can be shown on your host machine's display. when
+prompted, enter the password (mininet).
+
+From the mininet vm shell, set the wireshark capture privileges
+(http://wiki.wireshark.org/CaptureSetup/CapturePrivileges):
+
+----------------------------------------------------------------
+sudo chgrp mininet /usr/bin/dumpcap
+sudo chmod 754 /usr/bin/dumpcap
+sudo setcap 'CAP_NET_RAW+eip CAP_NET_ADMIN+eip' /usr/bin/dumpcap
+----------------------------------------------------------------
+
+Finally, start wireshark:
+
+-----------
+ wireshark 
+-----------
+
+The wireshark window should show up.
+
+To see only Openflow packets, you may want to apply the following filter
+in the Filter window:
+
+------------------------------------------
+ tcp.port == 6633 and tcp.flags.push == 1 
+------------------------------------------
+
+Start the capture on _any_ port.
+
+[[running-mininet-with-of-1.3]]
+===== Running Mininet with OF 1.3
+
+From within the Mininet VM, run:
+
+--------------------------------------------------------------------------------------------------------------------
+ sudo mn --topo single,3  --controller 'remote,ip=<your controller ip>,port=6653' --switch ovsk,protocols=OpenFlow13
+--------------------------------------------------------------------------------------------------------------------
diff --git a/manuals/user-guide/src/main/asciidoc/openflowplugin/odl-ofp-test-provider-flows.adoc b/manuals/user-guide/src/main/asciidoc/openflowplugin/odl-ofp-test-provider-flows.adoc
new file mode 100644 (file)
index 0000000..268b952
--- /dev/null
@@ -0,0 +1,57 @@
+[[odl-ofp-test-provider-flows_test-provider]]
+==== Flows : Test Provider
+
+Currently, the openflowplugin has a test-provider that allows you to
+push various flows through the system from the OSGI command line. Once
+those flows have been pushed through, you can see them as examples and
+then use them to see in the config what a particular flow example looks
+like.
+
+===== AddFlow : addMDFlow
+
+Run the controller by executing:
+
+--------------------------------------------------------------------------------------------------------------------
+cd openflowplugin/distribution/base/target/distributions-openflowplugin-base-0.0.1-SNAPSHOT-osgipackage/opendaylight
+./run.sh
+--------------------------------------------------------------------------------------------------------------------
+
+Point your mininet to the controller by giving the parameters
+--controller=remote,ip=.
+
+Once you see your node (probably openflow:1 if you've been following
+along) in the inventory, at the OSGI command line try running:
+
+-----------------------
+addMDFlow openflow:1 f#
+-----------------------
+
+Where # is a number between 1 and 80 and openflow:1 is the of the
+switch. This will create one of 80 possible flows. You can confirm that
+they were created on the switch.
+
+===== RemoveFlow : removeMDFlow
+
+Similar to addMDFlow, from the controller OSGi prompt, while your switch
+is connected to the controller, try running:
+
+--------------------------
+removeMDFlow openflow:1 f#
+--------------------------
+
+where # is a number between 1 and 80 and openflow:1 is the of the
+switch. The flow to be deleted should have same flowid and Nodeid as
+used for flow add.
+
+===== ModifyFlow : modifyMDFlow
+
+Similar to addMDFlow, from the controller OSGi prompt, while your switch
+is connected to the controller, try running:
+
+--------------------------
+modifyMDFlow openflow:1 f#
+--------------------------
+
+where # is a number between 1 and 80 and openflow:1 is the of the
+switch. The flow to be deleted should have same flowid and Nodeid as
+used for flow add.
diff --git a/manuals/user-guide/src/main/asciidoc/openflowplugin/odl-ofp-test-provider-groups.adoc b/manuals/user-guide/src/main/asciidoc/openflowplugin/odl-ofp-test-provider-groups.adoc
new file mode 100644 (file)
index 0000000..b2ad40d
--- /dev/null
@@ -0,0 +1,77 @@
+[[odl-ofp-test-provider-groups_test-provider]]
+==== Group : Test Provider
+
+Currently, the openflowplugin has a test-provider that allows you to
+push various flows through the system from the OSGI command line. Once
+those flows have been pushed through, you can see them as examples and
+then use them to see in the config what a particular flow example looks
+like.
+
+[[addgroup-addgroup]]
+===== AddGroup : addGroup
+
+Run the controller by executing:
+
+--------------------------------------------------------------------------------------------------------------------
+cd openflowplugin/distribution/base/target/distributions-openflowplugin-base-0.0.1-SNAPSHOT-osgipackage/opendaylight
+./run.sh
+--------------------------------------------------------------------------------------------------------------------
+
+Point your mininet to the controller by giving the parameters
+--controller=remote,ip=.
+
+Once you see your node (probably openflow:1 if you've been following
+along) in the inventory, at the OSGI command line try running:
+
+-------------------------
+addGroup openflow:1 a# g#
+-------------------------
+
+Where # is a number between 1 and 4 for grouptype(g#) and 1 and 28 for
+actiontype(a#). You can confirm that they were created on the switch.
+
+[[removegroup-removegroup]]
+===== RemoveGroup : removeGroup
+
+Run the controller by executing:
+
+--------------------------------------------------------------------------------------------------------------------
+cd openflowplugin/distribution/base/target/distributions-openflowplugin-base-0.0.1-SNAPSHOT-osgipackage/opendaylight
+./run.sh
+--------------------------------------------------------------------------------------------------------------------
+
+Point your mininet at the controller as described above.
+
+Once you see your node (probably openflow:1 if you've been following
+along) in the inventory, at the OSGI command line try running:
+
+----------------------------
+removeGroup openflow:1 a# g#
+----------------------------
+
+Where # is a number between 1 and 4 for grouptype(g#) and 1 and 28 for
+actiontype(a#). GroupId should be same as that used for adding the flow.
+You can confirm that it was removed from the switch.
+
+[[modifygroup-modifygroup]]
+===== ModifyGroup : modifyGroup
+
+Run the controller by executing:
+
+--------------------------------------------------------------------------------------------------------------------
+cd openflowplugin/distribution/base/target/distributions-openflowplugin-base-0.0.1-SNAPSHOT-osgipackage/opendaylight
+./run.sh
+--------------------------------------------------------------------------------------------------------------------
+
+Point your mininet at the controller as described above.
+
+Once you see your node (probably openflow:1 if you've been following
+along) in the inventory, at the OSGI command line try running:
+
+----------------------------
+modifyGroup openflow:1 a# g#
+----------------------------
+
+Where # is a number between 1 and 4 for grouptype(g#) and 1 and 28 for
+actiontype(a#). GroupId should be same as that used for adding the flow.
+You can confirm that it was modified on the switch.
diff --git a/manuals/user-guide/src/main/asciidoc/openflowplugin/odl-ofp-test-provider-meters.adoc b/manuals/user-guide/src/main/asciidoc/openflowplugin/odl-ofp-test-provider-meters.adoc
new file mode 100644 (file)
index 0000000..01632aa
--- /dev/null
@@ -0,0 +1,73 @@
+[[odl-ofp-test-provider-meters_test-provider]]
+==== Meters : Test Provider
+
+Currently, the openflowplugin has a test-provider that allows you to
+push various flows through the system from the OSGI command line. Once
+those flows have been pushed through, you can see them as examples and
+then use them to see in the config what a particular flow example looks
+like.
+
+===== AddMeter : addMeter
+
+Run the controller by executing:
+
+--------------------------------------------------------------------------------------------------------------------
+cd openflowplugin/distribution/base/target/distributions-openflowplugin-base-0.0.1-SNAPSHOT-osgipackage/opendaylight
+./run.sh
+--------------------------------------------------------------------------------------------------------------------
+
+Point your mininet to the controller by giving the parameters
+--controller=remote,ip=.
+
+Once you see your node (probably openflow:1 if you've been following
+along) in the inventory, at the OSGI command line try running:
+
+-------------------
+addMeter openflow:1
+-------------------
+
+You can now confirm that meter has been created on the switch.
+
+===== RemoveMeter : removeMeter
+
+Run the controller by executing:
+
+--------------------------------------------------------------------------------------------------------------------
+cd openflowplugin/distribution/base/target/distributions-openflowplugin-base-0.0.1-SNAPSHOT-osgipackage/opendaylight
+./run.sh
+--------------------------------------------------------------------------------------------------------------------
+
+Point your mininet to the controller by giving the parameters
+--controller=remote,ip=.
+
+Once you see your node (probably openflow:1 if you've been following
+along) in the inventory, at the OSGI command line try running:
+
+----------------------
+removeMeter openflow:1
+----------------------
+
+The CLI takes care of using the same meterId and nodeId as used for
+meter add. You can confirm that it was removed from the switch.
+
+===== ModifyMeter : modifyMeter
+
+Run the controller by executing:
+
+--------------------------------------------------------------------------------------------------------------------
+cd openflowplugin/distribution/base/target/distributions-openflowplugin-base-0.0.1-SNAPSHOT-osgipackage/opendaylight
+./run.sh
+--------------------------------------------------------------------------------------------------------------------
+
+Point your mininet to the controller by giving the parameters
+--controller=remote,ip=.
+
+Once you see your node (probably openflow:1 if you've been following
+along) in the inventory, at the OSGI command line try running:
+
+----------------------
+modifyMeter openflow:1
+----------------------
+
+The CLI takes care of using the same meterId and nodeId as used for
+meter add. You can confirm that it was modified on the switch.
diff --git a/manuals/user-guide/src/main/asciidoc/openflowplugin/odl-ofp-test-provider-topology.adoc b/manuals/user-guide/src/main/asciidoc/openflowplugin/odl-ofp-test-provider-topology.adoc
new file mode 100644 (file)
index 0000000..6680946
--- /dev/null
@@ -0,0 +1,51 @@
+[[odl-ofp-test-provider-topoogy_test-provider]]
+==== Topology : Notification
+
+Currently, the openflowplugin has a test-provider that allows you to get
+notifications for the topology related events like Link-Discovered ,
+Link-Removed events.
+
+===== Link Discovered Event : Testing
+
+Run the controller by executing:
+
+--------------------------------------------------------------------------------------------------------------------
+cd openflowplugin/distribution/base/target/distributions-openflowplugin-base-0.0.1-SNAPSHOT-osgipackage/opendaylight
+./run.sh
+--------------------------------------------------------------------------------------------------------------------
+
+Point your mininet to the controller by giving the parameters
+--controller=remote,ip=. Once the controller is connected to the switch,
+Link-Discovered event can be tested by initially configuring the
+specific flows on the switch. For Link Discovered event either
+table-miss flow or LLDP ether-type flow can be configured.
+
+Configuring Table-Miss flow using OpenflowpluginTestCommandProvider
+
+------------------------
+addMDFlow Openflow:1 fTM
+------------------------
+
+as per this
+OpenDaylight_OpenFlow_Plugin:Test_Provider#Flows_:_Test_Provider[link].
+'fTM' is the table-miss scenario here.
+
+Once the table-miss flow is configured through above command, we can see
+the Link-Discovered event in the debug logs on the controller console.
+
+Configuring LLDP ether-type flow using OpenflowpluginTestCommandProvider
+
+------------------------------------
+addMDFlow Openflow:1 0(table-id) f81
+------------------------------------
+
+You can confirm that they were created on the switch.
+
+Once the LLDP ether-type flow is configured through above command, we
+can see the Link-Discovered event in the debug logs on the controller
+console.
+
+===== Link Removed Event : Testing
+
+Having configured either table-miss or lldp ether-type flow on switch,
+once the switch is disconnected we see the Link-Removed event
diff --git a/manuals/user-guide/src/main/asciidoc/openflowplugin/odl-ofp-user-guide.adoc b/manuals/user-guide/src/main/asciidoc/openflowplugin/odl-ofp-user-guide.adoc
new file mode 100644 (file)
index 0000000..49ec906
--- /dev/null
@@ -0,0 +1,70 @@
+== OpenFlow Plugin Project User Guide
+
+=== Overview and Architecture
+
+==== Overview and Architecture
+include::odl-ofp-overview-and-architecture.adoc[]
+
+==== Coverage
+include::odl-ofp-coverage.adoc[]
+
+=== Tutorial / How-To
+
+==== Running the controller with the new OpenFlow Plugin
+include::odl-ofp-running-controller-with-the-new-of-plugin.adoc[]
+
+==== OpenFlow 1.3 Enabled Software Switches / Environment
+include::odl-ofp-test-environment.adoc[]
+
+==== End to End Inventory
+include::odl-ofp-end-to-end-inventory.adoc[]
+
+==== End to End Flows
+include::odl-ofp-end-to-end-flows.adoc[]
+
+==== End to End Topology
+include::odl-ofp-end-to-end-topology.adoc[]
+
+==== End to End Groups
+include::odl-ofp-end-to-end-groups.adoc[]
+
+==== End to End Meters
+include::odl-ofp-end-to-end-meters.adoc[]
+
+==== Statistics
+include::odl-ofp-statistics.adoc[]
+
+=== Web / Graphical Interface
+In the Hydrogen & Helium release, the current Web UI does not support
+the new OpenFlow 1.3 constructs such as groups, meters, new fields in
+the flows, multiple flow tables, etc.
+
+=== Command Line Interface
+The following is not exactly CLI - just a set of test commands which can
+be executed on the OSGI console testing various features in OpenFlow 1.3
+spec.
+
+* <<odl-ofp-test-provider-flows_test-provider,OSGI Console Test Provider Commands: Flows>>
+* <<odl-ofp-test-provider-groups_test-provider,OSGI Console Test Provider Commands: Groups>>
+* <<odl-ofp-test-provider-meters_test-provider,OSGI Console Test Provider Commands: Meters>>
+* <<odl-ofp-test-provider-topoogy_test-provider,OSGI Console Test Provider Commands: Topology Events>>
+
+include::odl-ofp-test-provider-flows.adoc[]
+include::odl-ofp-test-provider-groups.adoc[]
+include::odl-ofp-test-provider-meters.adoc[]
+include::odl-ofp-test-provider-topology.adoc[]
+
+
+=== Programmatic Interface
+The API is documented in the model documentation under the section
+OpenFlow Services at:
+
+* https://wiki.opendaylight.org/view/OpenDaylight_Controller:Config:Model_Reference[Models Documentation (OpenFlow Services Section)]
+
+=== Example flows
+include::odl-ofp-example-flows.adoc[]
+
+=== Opendaylight OpenFlow Plugin: Troubleshooting
+empty section
+
+
index c57e14226a9c71b23335f1dd38a1fe258bd7cba7..c4454efefe1f350a3bb3402f5a9290fd3152c54a 100644 (file)
@@ -1,7 +1,7 @@
 == SXP User Guide
 
 === Overview
-SXP (Source-Group Tag eXchange Protocol) project is an effort to enhance OpenDaylight platform with IP-SGT (IP Address to Source Group Tag) bindings that can be learned from connected SXP-aware network nodes. The current implementation supports SXP protocol version 4 according to the Smith, Kandula - SXP https://tools.ietf.org/html/draft-smith-kandula-sxp-02[IETF draft]. All protocol legacy versions 1-3 are supported as well. Additionally, version 4 adds bidirectional connection type as an extension of a unidirectional one.
+SXP (Source-Group Tag eXchange Protocol) project is an effort to enhance OpenDaylight platform with IP-SGT (IP Address to Source Group Tag) bindings that can be learned from connected SXP-aware network nodes. The current implementation supports SXP protocol version 4 according to the Smith, Kandula - SXP https://tools.ietf.org/html/draft-smith-kandula-sxp-04[IETF draft] and grouping of peers and creating filters based on ACL/Prefix-list syntax for filtering outbound and inbound IP-SGT bindings. All protocol legacy versions 1-3 are supported as well. Additionally, version 4 adds bidirectional connection type as an extension of a unidirectional one.
 
 === SXP Architecture
 The SXP Server manages all connected clients in separate threads and a common SXP protocol agreement is used between connected peers. Each SXP network peer is modelled with its pertaining class, e.g., SXP Server represents the SXP Speaker, SXP Listener the Client. The server program creates the ServerSocket object on a specified port and waits until a client starts up and requests connect on the IP address and port of the server. The client program opens a Socket that is connected to the server running on the specified host IP address and port.
@@ -18,6 +18,8 @@ The IP-SGT Manager also contains RPCs that can be used by other OpenDaylight plu
 
 The SXP Binding Dispatcher represents a selector that will decides how many data from the SXP-database will be sent and when. It is responsible for message content composition based on maximum message length.
 
+The SXP Binding Filters handles filtering of outcoming and incoming IP-SGT bindings according to BGP filtering using ACL and Prefix List syntax for specifiing filter.
+
 === Configuring SXP
 The OpenDaylight Karaf distribution comes pre-configured with baseline SXP
 configuration.
@@ -157,6 +159,8 @@ OpenDaylight can aggregate the binding information from many devices and communi
 
 OpenDaylight can relay the binding information from one network element to others. Changes in group membership can be propagated more readily through a centralized model. For example, in a security application a particular host (e.g., user or IP Address) may be found to be acting suspiciously or violating established security policies. The defined response is to put the host into a different source group for remediation actions such as a lower quality of service, restricted access to critical servers, or special routing conditions to ensure deeper security enforcement (e.g., redirecting the host’s traffic through an IPS with very restrictive policies). Updated group membership for this host needs to be communicated to multiple network elements as soon as possible; a very efficient and effective method of propagation can be performed using OpenDaylight as a centralized point for relaying the information.
 
+OpenDayLight can create filters for exporting and recieving IP-SGTT bindings used on specific peer groups, thus can provide more complex maintaining of policy groups.
+
 Although the IP-SGT binding is only one specific piece of information, and although SXP is implemented widely in a single vendor’s equipment, bringing the ability of OpenDaylight to process and distribute the bindings, is a very specific immediate useful implementation of policy groups. It would go a long way to develop both the usefulness of OpenDaylight and of policy groups.
 
 
index 18835d577f7badc857756baa12dc178a2dd5a441..ce8df8f51651ff2fe34daa8e73641e6524cc7c67 100644 (file)
@@ -242,23 +242,119 @@ NOVNCPROXY_URL="http://<CONTROLLER_NODE_IP_ADDRESS>:6080/vnc_auto.html" #Add Con
 VNCSERVER_LISTEN=$HOST_IP
 VNCSERVER_PROXYCLIENT_ADDRESS=$VNCSERVER_LISTEN
 
+====== Devstack Kilo_Liberty Control Node
+[source]
+#IP Details
+HOST_IP=<CONTROL_NODE_MANAGEMENT_IF_IP_ADDRESS> #Please Add The Control Node IP Address in this line
+SERVICE_HOST=$HOST_IP
+LOGFILE=stack.sh.log
+SCREEN_LOGDIR=/opt/stack/data/log
+LOG_COLOR=False
+disable_service n-net
+enable_service q-svc
+enable_service q-agt
+enable_service q-meta
+disable_service q-l3
+enable_service n-cpu
+enable_service q-dhcp
+enable_service n-cauth
+enable_service neutron
+enable_service tempest
+ADMIN_PASSWORD=labstack
+MYSQL_PASSWORD=supersecret
+RABBIT_PASSWORD=supersecret
+SERVICE_PASSWORD=supersecret
+SERVICE_TOKEN=supersecrettoken
+ENABLE_TENANT_TUNNELS=True
+NEUTRON_CREATE_INITIAL_NETWORKS=False
+#enable_plugin networking-odl http://git.openstack.org/openstack/networking-odl stable/kilo # Please uncomment this line if you
+want to use stable/kilo branch
+#enable_plugin networking-odl http://git.openstack.org/openstack/networking-odl stable/liberty # Please uncomment this line if you
+want to use stable/liberty branch
+ODL_MODE=externalodl
+ODL_MGR_IP=<ODL_IP_ADDRESS> # Please Add the ODL IP Address in this line
+ODL_PORT=8080
+ODL_USERNAME=admin
+ODL_PASSWORD=admin
+OVS_PHYSICAL_BRIDGE=br-int
+Q_OVS_USE_VETH=True
+Q_ML2_TENANT_NETWORK_TYPE=local
+VNCSERVER_PROXYCLIENT_ADDRESS=$SERVICE_HOST
+VNCSERVER_LISTEN=0.0.0.0
+MYSQL_HOST=$SERVICE_HOST
+RABBIT_HOST=$SERVICE_HOST
+GLANCE_HOSTPORT=$SERVICE_HOST:9292
+KEYSTONE_AUTH_HOST=$SERVICE_HOST
+KEYSTONE_SERVICE_HOST=$SERVICE_HOST
+[[post-config|/etc/neutron/plugins/ml2/ml2_conf.ini]]
+[agent]
+minimize_polling=True
+
+====== Devstack Kilo_Liberty Compute Node
+[source]
+#IP Details
+HOST_IP=<COMPUTE_NODE_IP_ADDRESS>
+SERVICE_HOST=<CONTROL_NODE_IP_ADDRESS>
+LOGFILE=stack.sh.log
+SCREEN_LOGDIR=/opt/stack/data/log
+LOG_COLOR=False
+RECLONE=yes # Make it "no" after stacking successfully the first time
+#OFFLINE=True # Uncomment this after stacking successfully the first time
+disable_all_services
+enable_service n-cpu
+NOVA_VNC_ENABLED=True
+ADMIN_PASSWORD=labstack
+MYSQL_PASSWORD=supersecret
+RABBIT_PASSWORD=supersecret
+SERVICE_PASSWORD=supersecret
+SERVICE_TOKEN=supersecrettoken
+ENABLE_TENANT_TUNNELS=True
+NEUTRON_CREATE_INITIAL_NETWORKS=False
+#enable_plugin networking-odl http://git.openstack.org/openstack/networking-odl stable/kilo # Please uncomment this line if you
+want to use stable/kilo branch
+#enable_plugin networking-odl http://git.openstack.org/openstack/networking-odl stable/liberty # Please uncomment this line if you
+want to use stable/liberty branch
+ODL_MODE=compute
+ODL_MGR_IP=<ODL_IP_ADDRESS> # Please Add the ODL IP Address in this line
+ODL_PORT=8080
+ODL_USERNAME=admin
+ODL_PASSWORD=admin
+OVS_PHYSICAL_BRIDGE=br-int
+VNCSERVER_PROXYCLIENT_ADDRESS=$HOST_IP
+VNCSERVER_LISTEN=0.0.0.0
+MYSQL_HOST=$SERVICE_HOST
+RABBIT_HOST=$SERVICE_HOST
+GLANCE_HOSTPORT=$SERVICE_HOST:9292
+KEYSTONE_AUTH_HOST=$SERVICE_HOST
+KEYSTONE_SERVICE_HOST=$SERVICE_HOST
+[[post-config|/etc/neutron/plugins/ml2/ml2_conf.ini]]
+[agent]
+minimize_polling=True
+
 NOTE:
    We have to comment OFFLINE=TRUE in local.conf files, this will make all the installations to happen automatically.
    RECLONE=yes only when we set up the DevStack environment from scratch.
 
 =====  Get Devstack (All nodes)
-Install git application using
-
-
-sudo apt-get install git
-get devstack
-git clone https://git.openstack.org/openstack-dev/devstack;
-
-Switch to stable/Juno Version branch
+* Install git application using
+** sudo apt-get install git
+* Get devstack
+** git clone https://git.openstack.org/openstack-dev/devstack;
+* Switch to stable/Juno Version branch
+** cd devstack
+** git checkout stable/juno
 
+NOTE:
+   If you want to use stable/kilo Version branch, Please execute the below command in devstack folder
+   
+   
+   git checkout stable/kilo
 
-cd devstack
-git checkout stable/juno
+NOTE:
+   If you want to use stable/liberty Version branch, Please execute the below command in devstack folder
+   
+   
+   git checkout stable/liberty
 
 ===== Stack Control Node
 
@@ -266,7 +362,8 @@ git checkout stable/juno
 
   cd devstack in the controller node
 
-* Copy the contents of local.conf (devstack control node)  and save it as "local.conf" in the devstack.
+* Copy the contents of local.conf for juno (devstack control node) from <<_devstack_control,DevStack Control>>  and save it as "local.conf" in the "devstack".
+* Copy the contents of local.conf for kilo and liberty (devstack control node) from <<_devstack_kilo_liberty_control_node,Devstack Kilo_Liberty Control Node>> and save it as "local.conf" in the "devstack".
 * Please modify the IP Address values as required.
 * Stack the node
 
@@ -282,7 +379,8 @@ git checkout stable/juno
 
   cd devstack in the controller node
 
-* Copy the contents of local.conf (devstack compute node)  and save it as local.conf in the 'devstack'''.
+* Copy the contents of local.conf for juno (devstack compute node) from <<_devstack_compute,DevStack Compute>> and save it as "local.conf" in the "devstack".
+* Copy the contents of local.conf file for kilo and liberty (devstack compute node) from <<_devstack_kilo_liberty_compute_node,Devstack Kilo_Liberty Compute Node>> and save it as "local.conf" in the "devstack".
 * Please modify the IP Address values as required.
 * Stack the node
 
@@ -293,6 +391,7 @@ git checkout stable/juno
 * stack.sh prints out This is your host ip: <COMPUTE_NODE_IP_ADDRESS>
 * Execute the command 'sudo ovs-vsctl show' in the control node terminal and verify if the bridge 'br-int'  is created.
 * The output of the ovs-vsctl show will be similar to the one seen in control node.
+
 ===== Additional Verifications
 * Please visit the OpenDaylight DLUX GUI after stacking all the nodes, http://<ODL_IP_ADDRESS>:8181/dlux/index.html. The switches, topology and the ports that are currently read can be validated.
 
diff --git a/manuals/user-guide/src/main/asciidoc/yang-push/odl-yang-push-user.adoc b/manuals/user-guide/src/main/asciidoc/yang-push/odl-yang-push-user.adoc
new file mode 100644 (file)
index 0000000..50fbcfb
--- /dev/null
@@ -0,0 +1,93 @@
+== YANG-PUSH
+This section describes how to use the YANG-PUSH feature in OpenDaylight
+and contains contains configuration, administration, and management
+sections for the feature.
+
+=== Overview
+YANG PUBSUB project allows applications to place subscriptions upon targeted subtrees of YANG datastores residing on remote devices. Changes in YANG objects within the remote subtree can be pushed to an OpenDaylight MD-SAL and to the application as specified without a requiring the controller to make a continuous set of fetch requests.
+
+==== YANG-PUSH capabilities available
+
+This module contains the base code which embodies the intent of YANG-PUSH requirements for subscription as defined in {i2rs-pub-sub-requirements} [https://datatracker.ietf.org/doc/draft-ietf-i2rs-pub-sub-requirements/].   The mechanism for delivering on these YANG-PUSH requirements over Netconf transport is defined in {netconf-yang-push} [netconf-yang-push: https://tools.ietf.org/html/draft-ietf-netconf-yang-push-00].  
+
+Note that in the current release, not all capabilities of draft-ietf-netconf-yang-push are realized.   Currently only implemented is *create-subscription* RPC support from ietf-datastore-push@2015-10-15.yang; and this will be for periodic subscriptions only.  There of course is intent to provide much additional functionality in future OpenDaylight releases.
+
+==== Future YANG-PUSH capabilities
+
+Over time, the intent is to flesh out more robust capabilities which will allow OpenDaylight applications to subscribe to YANG-PUSH compliant devices.  Capabilities for future releases will include:
+
+Support for subscription change/delete:
+*modify-subscription* rpc support for all mountpoint devices or particular mountpoint device
+*delete-subscription* rpc support for all mountpoint devices or particular mountpoint device
+
+Support for static subscriptions:
+This will enable the receipt of subscription updates pushed from publishing devices where no signaling from the controller has been used to establish the subscriptions.
+
+Support for additional transports:
+NETCONF is not the only transport of interest to OpenDaylight or the subscribed devices.  Over time this code will support Restconf and HTTP/2 transport requirements defined in {netconf-restconf-yang-push} [https://tools.ietf.org/html/draft-voit-netconf-restconf-yang-push-01]
+
+
+=== YANG-PUSH Architecture
+The code architecture of Yang push consists of two main elements
+
+YANGPUSH Provider
+YANGPUSH Listener
+
+YANGPUSH Provider receives create-subscription requests from applications and then establishes/registers the corresponding listener which will receive information pushed by a publisher.  In addition, YANGPUSH Provider also invokes an augmented OpenDaylight create-subscription RPC which enables applications to register for notification as per rfc5277. This augmentation adds periodic time period (duration) and subscription-id values to the existing RPC parameters. The Java package supporting this capability is “org.opendaylight.yangpush.impl”. YangpushDomProvider is the class which supports this YANGPUSH Provider capability. 
+
+The YANGPUSH Listener accepts update notifications from a device after they have been de-encapsulated from the NETCONF transport.  The YANGPUSH Listener then passes these updates to MD-SAL.  This function is implemented via the YangpushDOMNotificationListener class within the “org.opendaylight.yangpush.listner” Java package.  Applications should monitor MD-SAL for the availability of newly pushed subscription updates.
+
+=== YANG-PUSH Catalog
+The NF Catalog contains metadata describing a NF.
+
+==== Configuring YANG-PUSH Catalog
+TBD: Describe how to configure YANG-PUSH Catalog after installation.
+
+==== Administering YANG-PUSH Catalog
+TBD: Include related command reference or operations
+for using YANG-PUSH Catalog.
+
+=== YANG-PUSH Workload Manager
+The Workload Manager defines RPCs to manage instances.
+
+=== Configuring YANG-PUSH Workload Manager
+TBD: Describe how to configure YANG-PUSH Workload Manager after installation.
+
+=== Administering YANG-PUSH Workload Manager
+TBD: Include related command reference or operations
+for using YANG-PUSH Workload Manager.
+
+=== Tutorials
+Below are tutorials for YANG-PUSH.
+
+==== Using YANG-PUSH Catalog
+TBD: State the purpose of tutorial
+
+===== Overview
+TBD: An overview of the YANG-PUSH Catalog tutorial
+
+===== Prerequisites
+TBD: Provide any prerequisite information, assumed knowledge, or environment
+required to execute the use case.
+
+===== Target Environment
+There are no topology requirement for using YANG-PUSH.  A single node able interact as per https://tools.ietf.org/html/draft-ietf-netconf-yang-push-00 is sufficient to use this capability.
+
+===== Instructions
+TBD: Step by step procedure for using YANG-PUSH Catalog.
+
+==== Using YANG-PUSH Workload Manager
+TBD: State the purpose of tutorial
+
+===== Overview
+TBD: An overview of the YANG-PUSH Workload Manager tutorial
+
+===== Prerequisites
+TBD: Provide any prerequisite information, assumed knowledge, or environment
+required to execute the use case.
+
+===== Target Environment
+TBD: Include any topology requirement for the use case.
+
+===== Instructions
+TBD: Step by step procedure for using YANG-PUSH Workload Manager.
\ No newline at end of file
diff --git a/manuals/user-guide/src/main/resources/images/openflowplugin/host-only-vbox.png b/manuals/user-guide/src/main/resources/images/openflowplugin/host-only-vbox.png
new file mode 100644 (file)
index 0000000..646c15b
Binary files /dev/null and b/manuals/user-guide/src/main/resources/images/openflowplugin/host-only-vbox.png differ
diff --git a/manuals/user-guide/src/main/resources/images/openflowplugin/plugin_design.jpg b/manuals/user-guide/src/main/resources/images/openflowplugin/plugin_design.jpg
new file mode 100644 (file)
index 0000000..6a42d0d
Binary files /dev/null and b/manuals/user-guide/src/main/resources/images/openflowplugin/plugin_design.jpg differ
diff --git a/manuals/user-guide/src/main/resources/images/plugin_design.jpg b/manuals/user-guide/src/main/resources/images/plugin_design.jpg
new file mode 100644 (file)
index 0000000..6a42d0d
Binary files /dev/null and b/manuals/user-guide/src/main/resources/images/plugin_design.jpg differ
diff --git a/pom.xml b/pom.xml
index ad83c9a6f18c2aab80027dcaa084de73a6fed81c..3f80d5bc9db2f7f235f031c5f2516acd98e2b5b6 100644 (file)
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
   <modelVersion>4.0.0</modelVersion>
   <groupId>org.opendaylight.docs</groupId>
   <artifactId>root</artifactId>
-  <version>0.2.0-SNAPSHOT</version>
+  <version>0.3.0-SNAPSHOT</version>
   <name>docs</name> <!-- Used by Sonar to set project name -->
   <packaging>pom</packaging>
   <url>${sitedeploy}</url>