Merge into master from pull request #153:
Resolve #152 (https://github.com/floodlight/oftest/pull/153)
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 0000000..ddb15e7
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,196 @@
+# How Can I Contribute?
+
+We're always willing to accept good pull requests (PRs). In case you're stuck for ideas on where to start, here are some ideas to get you started.
+
+## Add Missing Test Cases
+
+We welcome any patch that adds a missing test (or improves an existing one, for that matter). In this regard, while they make for heavy reading, the [OpenFlow Specifications](https://www.opennetworking.org/sdn-resources/onf-specifications/openflow) are likely the best places to start. Once you have an idea of a test you'd like to implement just check the [Adding Your Own Test Cases][#Adding Your Own Test Cases] section below.
+
+## Bug Fixes
+
+Humans will inevitably write buggy software. If you spot a bug in either a test cases or another element of the framework then either [submit a fix](https://github.com/floodlight/oftest/pulls) or [file a bug](https://github.com/floodlight/oftest/issues).
+
+## Add New Features
+
+Need to modify OFTest to fit a personal need or business requirement? Great! If you think it'll be useful to anyone else then submit a PR for review.
+
+## Documentation & Other Changes
+
+Using OFTest in a unique way? Finding OFTest difficult to set up and wanting to help others avoid your issues? Finding yourself annoyed by a typo in some code/documentation? Submit a pull request!
+
+---
+
+# Making Changes
+
+## Adding or Modifying Tests
+
+OFTest itself uses the `unittest` library, which is part of the Python Standard Library. This means there are some requirements for tests written for OFTest:
+
+ * Each new test case should be its own class.
+ * All tests must inherit from `unittest.TestCase` or an existing test. Most tests will inherit from `oftest.base_tests.SimpleDataPlane`.
+ * Tests must also provide a `runTest` function, which will act as the main routine for all test cases. This is also how OFTest discovers tests.
+ * Tests should use the `unittest` assert cases, defined [here](https://docs.python.org/2/library/unittest.html#assert-methods), as they provide more information to the user about issues that standard the standard `assert`.
+ * Tests may provide a `setUp` and/or `tearDown` function. These will be automatically called by the test framework before/after calling `runTest` respectively. If overriding an existing test be sure to call the super class' `setUp` or `tearDown` functions.
+
+We suggest you look at `basic.py` as a starting point for writing new tests. It's also worth noting these conventions:
+
+ * The first line of the doc string for a file and for a test class is displayed in the list command. Please keep it clear and under 50 characters.
+
+### Coding Style
+
+OFTest uses the Python Standard Style Guide, or [PEP-8](http://www.python.org/dev/peps/pep-0008/). Please ensure all changes abide by this standard.
+
+In addition, when adding new tests, the test file names should be lowercase with underscores and short, meaningful names. Test case class names should be CamelCased and use similarly short, meaningful names.
+
+## Documentation
+
+Any additional documentation added to the repository should be in [GitHub-flavored Markdown](https://help.github.com/articles/github-flavored-markdown/).
+
+---
+
+# Architecture
+
+The directory structure is currently:
+
+ <oftest>
+ `
+ |-- oft
+ |-- docs
+ |-- src
+ | `-- python
+ | `-- oftest
+ |-- tests
+ | `-- test cases for OpenFlow 1.0
+ |-- tests-1.x
+ | `-- test cases for a specific version
+ `-- tools
+
+## Base Test Types
+
+Once installed the components of OFTest are available via import of submodules of `oftest`. Typically, new tests will be written as subclasses of one of the two following tests:
+
+ * The basic protocol test, `SimpleProtocol`, is used for tests that require only communication with the switch over the controller interface
+ * The basic dataplane test, `SimpleDataPlane` is used for tests that require both communication with the switch and the ability to send/receive packets to/from OpenFlow ports.
+
+SimpleProtocol and SimpleDataPlane are defined in `oftest/base_tests.py`.
+
+### Simple Protocol
+
+The essential object provided by inheritance from `SimpleProtocol` (and from `SimpleDataPlane` which is a subclass of `SimpleProtocol`) is `self.controller`. The `setUp` routine ensures a connection has been made to the SUT prior to returning. Thus, in `runTest` you can send messages across the control interface simply by invoking methods of this control object. These may be sent unacknowledged or done as transactions (which are based on the XID in the OpenFlow header):
+
+ import oftest.base_tests as base_tests
+
+ class MyTest(basic.SimpleProtocol):
+ ... # Inside your runTest:
+ self.controller.message_send(msg) # Unacknowledged
+ self.controller.transact(request) # Transaction based on XID
+
+### SimpleDataPlane
+
+`SimpleDataPlane` inherits from `SimpleProtocol`, so you get the controller object as well as the dataplane object, `self.dataplane`.
+
+Sending packets into the switch is done with the `send` member:
+
+ import basic
+
+ class MyDPTest(basic.SimpleDataPlane):
+ ... # Inside your runTest:
+ pkt = simple_tcp_packet()
+ self.dataplane.send(port, str(pkt))
+
+Packets can be received in the following ways:
+
+ * Non-blocking poll:
+
+ (port, pkt, timestamp) = self.dataplane.poll()
+
+ * Blocking poll:
+
+ (port, pkt, timestamp) = self.dataplane.poll(timeout=1)
+
+ For the calls to poll, you may specify a port number in which case only packets received on that port will be returned.
+
+ (port, pkt, timestamp) = self.dataplane.poll(port_number=2, timeout=1)
+
+ * Register a handler:
+
+ self.dataplane.register(handler)
+
+### DataPlaneOnly
+
+Occasionally, it is convenient to be able to send a packet into a switch without connecting to the controller. The DataPlaneOnly class is the parent that allows you to do this. It instantiates a dataplane, but not a controller object. The classes `PacketOnly` and `PacketOnlyTagged` inherit from `DataPlaneOnly` and send packets into the switch.
+
+## Messages
+
+The OpenFlow protocol is represented by a collection of objects inside the `oftest.message` module. In general, each message has its own class. All messages have a header member and data members specific to the message. Certain variable length data is treated specially and is described (TBD).
+
+Here are some examples:
+
+ import oftest.message as message
+ ...
+ request = message.echo_request()
+
+`request` is now an `echo_request` object and can be sent via `self.controller`.transact for example.
+
+ msg = message.packet_out()
+
+`msg` is now a packet_out object. `msg.data` holds the variable length packet data.
+
+ msg.data = str(some_packet_data)
+
+This brings us to one of the important variable length data members, the action list. Each action type has its own class. The action list is also a class with an `add` method which takes an action object.
+
+ import oftest.action as action
+ ...
+ act = action.action_output() # Create a new output action object
+ act.port = egress_port # Set the action's parameter(s)
+ msg.actions.add(act) # The packet out message has an action list member
+
+Another key data class is the match object. TBD: Fill this out.
+
+TBD: Add information about stats objects.
+
+## Packets
+
+OFTest uses [Scapy](http://www.secdev.org/projects/scapy/) for managing packet data, although you may not need to use it directly. In the example below, we use the function `simple_tcp_packet` from `testutils.py` to generate a packet. The the parse function `packet_to_flow_match` is called to generate a flow match based on the packet.
+
+ from testutils import *
+ import oftest.parse as parse
+ import ofp
+ ...
+ pkt = simple_tcp_packet()
+ match = parse.packet_to_flow_match(pkt)
+ match.wildcards &= ~ofp.OFPFW_IN_PORT
+
+This introduces the low level module `ofp`. This provides the base definitions from which OpenFlow messages are inherited and basic OpenFlow defines such as `OFPFW_IN_PORT`. Most enums defined in `openflow.h` are available in this module.
+
+---
+
+# Tips & Tricks
+
+## Making Your Tests Configurable
+
+As described in the [README](README.md#passing-parameters-to-tests), you can test for these parameters by importing `testutils.py` and using the function:
+
+ my_key1 = testutils.test_param_get(self.config, 'key1')
+
+The `config` parameter is the global configuration structure copied into the base tests cases (and usually available in each test file). The routine returns `None` if the key was not assigned in the command line; otherwise it returns the value assigned (`17` in this example).
+
+Note that any test may look at these parameters, so use some care in choosing your parameter keys.
+
+## Adding Support for a New Platform
+
+As described in the [README](README.md#platforms), OFTest provides a method for specifying how packets should be sent/received to/from the switch. The "config files" that enable this are known as "platforms".
+
+You can add your own platform, say `gp104`, by adding a file `gp104.py` to the
+`platforms` directory. This file should define the function `platform_config_update`. This can be enabled using the `--platform=gp104` parameter on the command line. You can also use the `--platform-dir` option to change which directory is searched.
+
+IMPORTANT: The file should define a function `platform_config_update` which takes a configuration dictionary as an argument and updates it for the current run. In particular, it should set up `config["port_map"]` with the proper map from OpenFlow port numbers to OpenFlow interface names.
+
+## Troubleshooting
+
+Normally, all debug output goes to the file `oft.log` in the current directory. You can force the output to appear on the terminal (and set the most verbose debug level) with these parameters added to the oft command:
+
+ --verbose --log-file=[path/to/logfile]
+
+---
diff --git a/DEVELOPING b/DEVELOPING
deleted file mode 100644
index f4383dc..0000000
--- a/DEVELOPING
+++ /dev/null
@@ -1,78 +0,0 @@
-Overview
-++++++++
-
- The directory structure is currently:
-
- <oftest>
- `
- |-- oft
- |-- doc
- |-- src
- | `-- python
- | `-- oftest
- |-- tests
- | `-- test cases
- `-- tools
- `-- pylibopenflow
-
- The tools directory is what processes the OpenFlow header
- files to produce Python classes representing OpenFlow messages.
- The results are placed in src/python/oftest and currently
- include:
-
- message.py: The main API providing OF message classes
- error.py: Subclasses for error messages
- action.py: Subclasses for action specification
- cstruct.py: Direct representation of C structures in Python
- class_maps.py: Addition info about C structures
-
- In addition, the following Python files are present in
- src/python/oftest:
-
- controller.py: The controller representation
- dataplane.py: The dataplane representation
- action_list.py: Action list class
- netutils.py: e.g., set promisc on sockets
- ofutils.py: Utilities related to OpenFlow messages
- oft_assert.py: Test framework level assertion
- testutils.py: Test utilities
- base_tests.py: Base test classes
-
-Adding Your Own Test Cases
-++++++++++++++++++++++++++
-
- Check the online tutorial:
- http://openflow.org/wk/index.php/OFTestTutorial
-
- It's suggested to use basic.py as example code for writing new tests.
-
- You can:
-
- * Add cases to an existing file
- * Add a new file
-
- If you add cases to an existing file, each case should be its own
- class. It must inherit from unittest.TestCase or one of its
- derivatives. Most tests will inherit from oftest.base_tests.SimpleDataPlane.
-
- CONVENTIONS:
-
- The first line of the doc string for a file and for a test class is
- displayed in the list command. Please keep it clear and under 50
- characters.
-
-Submitting Patches
-++++++++++++++++++
-
- Send a pull request on GitHub to floodlight/oftest.
-
-To Do
-+++++
-
- * Need to have an overview of the components of the test, how they
- connect and how they are managed by the test framework.
- * See the Regression Test component on trac:
- http://www.openflowswitch.org/bugs/openflow
- http://www.openflowswitch.org/bugs/openflow/query?component=Regression+test+suite
-
- * Make the framework work with OF versions other than 1.0?
diff --git a/README b/README
deleted file mode 100644
index b5f810a..0000000
--- a/README
+++ /dev/null
@@ -1,196 +0,0 @@
-OpenFlow Testing Framework
-July, 2010
-Last updated January 2013
-
-Copyright (c) 2010 The Board of Trustees of The Leland Stanford
-Junior University
-
-License
-+++++++
-
- The software included with this distribution is subject to the
- OpenFlow Switching License as given in the included file LICENSE.
- Details are also available at:
-
- http://www.openflow.org/wp/legal
-
- Other software referenced in this distribution is subject to its
- respective license.
-
-Introduction
-++++++++++++
-
- This test framework is meant to exercise a candidate OpenFlow
- switch (the device/switch under test, DUT or SUT). It provides a
- connection like a controller to which the switch connects and it
- controls data plane ports, sending and receiving packets, which
- should be connected to the switch.
-
- For information on writing new tests or making improvements to
- the test framework see the file DEVELOPING.
-
-Getting OFTest
-++++++++++++++
-
- You can check out OFTest with git with the following command:
-
- git clone git://github.com/floodlight/oftest
-
-Quick Start
-+++++++++++
-
- You need to have Python and Scapy installed on your system.
- See 'Pre-requisites' below.
-
- Make sure your switch is running and trying to connect to a
- controller on the machine where you're running oft (normally port
- 6653). See below regarding run_switch.py for a script that starts
- up a software switch on the test host.
-
- Currently, switches must be running version 1.0 of OpenFlow.
-
- # git clone git://github.com/floodlight/oftest
- # cd oftest
- Make sure the switch you want to test is running --
- see (4) below for the reference switch example.
- # ./oft --list
- # sudo ./oft basic.Echo
- # sudo ./oft --verbose --log-file=""
- # sudo ./oft basic -i 1@veth1 -i 2@veth3
-
-Longer Start
-++++++++++++
-
- 1. Pre-requisites:
- * An OF switch instance to test (see 4 below)
- * Root privilege on host running oft
- * Switch running OpenFlow 1.0 and attempting to connect
- to a controller on the machine running oft.
- * Python 2.5 or 2.6. You can run platforms using eth interfaces
- with Python 2.4. Python 2.7 may work.
- * oftest checked out (called <oftest> here)
- * scapy installed: http://www.secdev.org/projects/scapy/
- 'sudo apt-get install scapy' should work on Debian.
- * pypcap installed: http://code.google.com/p/pypcap/ (optional)
- 'sudo apt-get install python-pypcap' should work on Debian.
- Tests using VLAN tags may fail without pypcap.
- * tcpdump installed (optional, but scapy will complain if it's
- not there)
- * Doxygen and doxypy for document generation (optional)
- * lint for source checking (optional)
-
- 2. Start the switch to test
- The switch must be running and actively attempting to
- connect to a controller on the test host at the port number
- used by oft (6653 by default, or specified as --port=<n> as
- an argument to oft).
-
- If you're new to the test environment and want to check its
- sanity, you can do the following. This requires that
- your host kernel supports virtual ethernet interfaces. This
- is best done in a window separate from where you will run oft.
-
- 4A. Check out openflow (preferably at the same level as oftest):
- git clone git://openflowswitch.org/openflow.git
- 4B. cd openflow; ./boot.sh; ./configure; make
- 4C. cd ../oftest
- 4D. Run the switch startup script:
- sudo ./run_switch.py; Now you can run oft (see below).
- 4F. Use --help to see command line switches. If you use a port
- number other than the default, make sure you use the same
- one for the switch as for oft.
- 4E. Use control-C to terminate the switch daemons.
- 4F. To clean up the virtual ethernet interfaces, use
- sudo rmmod veth
-
- New tools allow you to run an OVS instance as well. See
- oftest/tools/ovs-ctl. You will need to install a version of
- openvswitch. See http://openvswitch.org/.
-
- 3. Run oft (requires sudo to control the dataplane)
- cd <oftest>
- sudo ./oft --help
-
-Important Notes
-+++++++++++++++
-
- 1. If you're running into issues with transactions, and it appears that
- OpenFlow messages aren't quite right, start by looking at any length
- fields in the packets. You can use wireshark on the loopback interface
- as well as the dataplane ethernet interfaces.
-
- 2. If tests dealing with VLANs fail unexpectedly then try installing
- pypcap (see Longer Start above).
-
-Platforms
-+++++++++
-
- The "platform" is a configuration file (written in Python) that
- tells OFTest how to send packets to and receive packets from the
- dataplane of the switch.
-
- The default platform uses Linux ethernet interfaces and is configured with
- the -i option. Pass the option as "-i ofport@interface", for example
- "-i 1@eth1". If no -i options are given the the default configuration
- uses veths and is compatible with the refrence switch.
-
- You can add your own platform, say gp104, by adding a file gp104.py to the
- platforms directory that defines the function platform_config_update and then
- use the parameter --platform=gp104 on the command line. You can also use the
- --platform-dir option to change which directory is searched.
-
- IMPORTANT: That file should define a function platform_config_update which
- takes a configuration dictionary as an argument and updates it for the
- current run. In particular, it should set up config["port_map"] with
- the proper map from OF port numbers to OF interface names.
-
-Helpful Note: Recovering From Crash
-+++++++++++++++++++++++++++++++++++
-
- If the test script, oft, becomes unresponsive, you may find that
- ^C does not break out of the script. In this case you have two
- options:
-
- * Use ^Z to interrupt the script and return to the shell prompt.
- * Start another terminal window to the same machine.
-
- In either case, you then need to kill the process that is hung.
- Use the following commands:
-
- me@host> ps aux | grep oft
- root 4 0.0 S< Jul07 0:00 [ksoftirqd/0]
- ...
- root 14066 3.2 Tl 09:27 0:00 python ./oft ...
- me 14074 0.0 R+ 09:28 0:00 grep oft
-
- me@host> sudo kill -9 14066
-
- where 14066 is the process ID of the hung process. (Replace it
- with the PID for your process.)
-
- This is still preliminary work and there are bugs in the framework
- that need to be ironed out. Please report any issues to
- dtalayco@stanford.edu.
-
-Using CentOS/RHEL
-+++++++++++++++++
-
- CentOS/RHEL have two challenges: they are very tied to Python 2.4
- (and Scapy requires Python 2.5 for its latest version) and they
- require a kernel upgrade to use veth pairs for local platform
- testing.
-
- If you only need to control eth interfaces for a remote platform,
- you can use CentOS/RHEL without major disruption. The key is to
- download scapy-1.2 from the following link:
-
- wget http://hg.secdev.org/scapy/raw-file/v1.2.0.2/scapy.py
-
- See: http://www.dirk-loss.de/scapy-doc/installation.html#installing-scapy-v1-2
- for more info.
-
- Copy scapy.py to /usr/lib/python2.4/site-packages
-
- If you hit an error related to importing scapy.all, you just need
- to change the import to refer to scapy (not scapy.all). See
- examples in parse.py for example.
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..8790d26
--- /dev/null
+++ b/README.md
@@ -0,0 +1,155 @@
+OFTest OpenFlow Testing Framework
+
+---
+
+# Introduction
+
+OFTest is a Python based OpenFlow switch test framework and collection of test cases. It is based on unittest, which is included in the standard Python distribution.
+
+This document is meant to provide an introduction to the framework, discuss the basics of running tests and to provide examples of how to add tests.
+
+For information on writing new tests or making improvements to the test framework see the file [DEVELOPING](DEVELOPING.md).
+
+---
+
+# How It Works
+
+OFTest is meant to exercise a candidate OpenFlow switch (henceforth the device under test (DUT) or switch under test (SUT)). Below is the "horseshoe" disagram for OFTest that demonstrates the interaction between OFTest and SUT.
+
+![OFTest Architecture](docs/images/oftest_arch.png)
+
+As you can see, the SUT is in the middle. The test fixture, the OFTest server, connects to both the control plane and the data plane of the SUT. It coordinates OpenFlow commands with data plane stimulus and monitoring.
+
+Some additional info on OFTest:
+
+ * OFTests starts with the very basics of OpenFlow, but provides a framework for development of more complicated tests.
+ * It was used as the primary vehicle for validating OpenFlow 1.1 (see the `oft-1.1` branch in the Git repository).
+ * A prototype implementation of an OpenFlow 1.1 switch, OFPS, was implemented in the same framework as OFTest (also in the `oft-1.1` branch).
+
+---
+
+# Getting OFTest
+
+You can check out OFTest with git with the following command:
+
+ git clone git://github.com/floodlight/oftest
+
+---
+
+# Quick Start
+
+You need to have Python and Scapy installed on your system. See 'Pre-requisites' below.
+
+Make sure your switch is running and trying to connect to a controller on the machine where you're running oft (normally port `6653`).
+
+ cd oftest
+ ./oft --list
+ sudo ./oft basic.Echo
+ sudo ./oft --verbose --log-file=""
+ sudo ./oft basic -i 1@veth1 -i 2@veth3
+
+---
+
+# Extending OFTest
+
+We welcome any kind of patch. Send all patches as pull requests to `floodlight/oftest`. We recommend you check out the [CONTRIBUTING.md] document for ideas and requirements around patches.
+
+---
+
+# Longer Start
+
+## Configure Pre-requisites
+
+The following software is required to run OFTest:
+
+ * Python 2.7
+ * Scapy
+ * pypcap (optional - VLAN tests will fail without this)
+ * tcpdump (optional - Scapy will complain if it's missing)
+ * Doxygen and doxypy (optional - for documentation generation)
+ * PyLint (optional - for source checking)
+
+Most of these can be installed using your package manager. For example:
+
+ sudo yum install python # for RHEL-based distros
+ sudo apt-get install scapy # for Debian-based distros
+
+You will also need an OpenFlow-compliant switch instance to test. This switch must be running OpenFlow 1.0+ and attempting to connect to a controller on the machine running `oft`.
+
+Finally root/sudo privilege is required on the host, in order to run `oft`.
+
+## Start the Switch
+
+The switch must be running and actively attempting to connect to a controller on the test host at the port number used by oft (`6653` by default, or specified as `--port=<n>` as an argument to oft).
+
+If you're new to the test environment and want to check its sanity, you can do the following. This requires that your host kernel supports virtual Ethernet interfaces. This is best done in a window separate from where you will run oft.
+
+ 1. Check out OpenFlow (preferably at the same level as oftest):
+
+ git clone git://openflowswitch.org/openflow.git
+
+ 2. Build OpenFlow:
+
+ cd openflow
+ ./boot.sh
+ ./configure; make
+ cd ../oftest
+
+ 4. Run the switch startup script:
+
+ sudo ./run_switch.py
+
+## Run OFTest
+
+Now you can run `oft` (see below). Use `--help` to see command line switches.
+
+ cd <oftest>
+ sudo ./oft --help
+
+If you use a port number other than the default, make sure you use the same one for the switch as for oft. For example, to run the `basic` collection of tests:
+
+ sudo ./oft basic -i 1@veth1 -i 2@veth3
+
+Once you're finished, use `Ctrl-C` to terminate the switch daemons. To clean up the virtual ethernet interfaces, use:
+
+ sudo rmmod veth
+
+New tools allow you to run an OVS instance as well. See `oftest/tools/ovs-ctl`. You will need to install a version of [Open vSwitch](http://openvswitch.org/) for this to work.
+
+---
+
+# Configuring OFTest
+
+## Platforms
+
+The "platform" is a configuration file (written in Python) that tells OFTest how to send packets to and receive packets from the dataplane of the switch.
+
+### `eth`
+
+The default platform, `eth`, uses Linux Ethernet interfaces and is configured with the `-i` option (or `--interface`). Pass the option as `-i ofport@interface`, for example `-i 1@eth1`. If no `-i` options are given the the default configuration uses vEths for backwards-compatibility with the original OpenFlow reference switch.
+
+### `remote`
+
+Another common platform, `remote`, provides support for testing of switches on a different host. This can be useful for cases where interfaces are not available on one host (i.e. they're not bound to a Linux interface driver) or where OFTest cannot run on the same host (unsupported OS, missing software, etc.).
+
+This can be enable by modifying the `platforms/remote.py` file to point to 4 NICs on the host running OFTest, like so:
+
+ remote_port_map = {
+ 23 : "eth2", # OpenFlow port 23 of the switch is connected to physical port on the server eth2
+ 24 : "eth3", # OpenFlow port 24 of the switch is connected to physical port on the server eth3
+ 25 : "eth4",
+ 26 : "eth5"
+ }
+
+## Passing Parameters to Tests
+
+There is a facility for passing test-specific parameters into tests that works as follows. On the command line, give the parameter
+
+ --test-params="key1=17;key2=True"
+
+Currently the keys used control whether VLAN tagged packets are used and whether VLAN tag stripping should be included as an action. These parameters include:
+
+ vid=N: Use tagged packets with VLAN id of N
+ strip_vlan=bool: If True, add the strip VLAN tag action to the packet test
+
+---
diff --git a/STYLE b/STYLE
deleted file mode 100644
index 358805a..0000000
--- a/STYLE
+++ /dev/null
@@ -1,10 +0,0 @@
-OFTest Coding Style
--------------------
-
-See the Python standard style guide, PEP-8: http://www.python.org/dev/peps/pep-0008/.
-
-Some important style points:
- - Test file names should be lowercase with underscores and short. Test case
- class names are CamelCased.
- - Any additional documentation added to the repository should be in plain text
- or Markdown.
diff --git a/Detailed_Testing_Methodology.txt b/docs/Detailed_Testing_Methodology.txt
similarity index 100%
rename from Detailed_Testing_Methodology.txt
rename to docs/Detailed_Testing_Methodology.txt
diff --git a/doc/Doxyfile b/docs/Doxyfile
similarity index 100%
rename from doc/Doxyfile
rename to docs/Doxyfile
diff --git a/doc/flow_query_test_plan.txt b/docs/flow_query_test_plan.txt
similarity index 100%
rename from doc/flow_query_test_plan.txt
rename to docs/flow_query_test_plan.txt
diff --git a/docs/images/oftest_arch.png b/docs/images/oftest_arch.png
new file mode 100644
index 0000000..e752d1b
--- /dev/null
+++ b/docs/images/oftest_arch.png
Binary files differ