Copyright © 2012 Nicira, Inc.

Licensed under the Apache License, Version 2.0 (the ``License''); you may not use this file except in compliance with the License.  You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an ``AS IS'' BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the specific language governing permissions and limitations under the License.

TITLE
*****

This manual is for PROGRAM, version VERSION.

Introduction
************

Open vSwitch is an Ethernet switch implemented in software.  It is well suited to environments that call for basic switching features such as VLANs and bonding.  However, Open vSwitch is built as a platform to open up network forwarding to programmatic extension, so it really shines in environments that demand fast, flexible control over the network.

Open vSwitch is most often deployed today as a purely software switch, that is, on computers without hardware specialized for packet switching.  In this class of uses, Open vSwitch most often runs on virtual server hosts, to forward virtual machine network traffic to and from a physical network.  Virtualization is not a requirement: Open vSwitch can also forward traffic among physical interfaces in a ``bare metal'' environment.

Open vSwitch is designed and internally layered to be amenable for use within special-purpose switch hardware, and a number of network hardware manufacturers have used it for that purpose.  This allows Open vSwitch to control high-performance hardware switches as well as software switches, although hardware is inherently less flexible than software.

Open vSwitch runs on top of a wide variety of hardware, operating systems, and hypervisors, and it has been integrated with multiple cloud management systems.  Please refer to other Open vSwitch and vendor documentation for details.

Architecture
============

This section describes the components of Open vSwitch at a high-level and how they interact with each other and with components not part of Open vSwitch.

The most important component of Open vSwitch is the virtual switch daemon, ovs-vswitchd.  This daemon implements Open vSwitch core switching and programmability functions.  In a software switch, this daemon is a ``soft real-time'' component that handles the first packet of each new flow that enters the network.  In a hardware switch, it instead configures the hardware's packet processing features.

The virtual switch daemon has two important external interfaces.  The first of these speaks a protocol called OVSDB to the second major Open vSwitch daemon, the ovsdb-server database server.  This daemon's configuration database tracks typically slowly changing management plane state, such as the set of configured switches and their ports.  The database server can also talk to controllers on remote servers over the same OVSDB protocol.

ovs-vswitchd's other major external interface is the control plane interface.  This interface allows controllers on remote servers to directly control the treatment of packets that arrive on the switches configured in the database.  Control can be reactive, with the controller deciding what should be done for each new flow as it arrives at the switch, or proactive, with the controller specifying in advance the treatment of every packet that might happen to arrive, or some combination.  Open vSwitch uses the OpenFlow protocol for this control plane interface.

Open vSwitch also includes a number of utility programs. ovs-vsctl is an interactive command-line interface to ovsdb-server for configuring and querying Open vSwitch configuration.  It is also used heavily in shell scripts that integrate Open vSwitch with hypervisor and cloud management systems.

ovs-ofctl is a command-line tool that speaks the OpenFlow protocol.  Unlike ovs-vsctl, which is often used in production, it is most useful for troubleshooting and prototyping.  We will often use it in examples in this book.

ovs-appctl is a command-line tool to send commands to ovs-vswitchd and ovsdb-server.  It is occasionally useful for special purposes, especially in testing and debugging.

* Test setups. ** Physical ** Virtual ** Nested virtual ** Dummy-based. ** test-vm based

* Test techniques. ** ofproto/trace

* Introduction to OpenFlow. * Packet processing pipeline. ** The ``normal'' action's pipeline.

* Management plane. ** Ports and interfaces. ** Bonding. *** How to use through OpenFlow, and limitations. *** Future directions. *** How to emulate with OpenFlow? ** VLANs. *** Interaction with OpenFlow. ** MAC learning. *** Reading and flushing the MAC learning table. *** Preventing MAC learning. *** Interaction with bonding. *** ** Mirrors. *** Limitations with OpenFlow. *** How to emulate with OpenFlow (avoiding duplicates). ** Spanning tree. *** Limitations for nonstandard setups. ** CFM *** Tradeoffs. *** Caveats. ** Policing. ** QoS.

* Control plane programming techniques. ** Resubmit. ** Registers. *** NAND gate. ** Local controller.

* Proactive control plane programming. ** Resubmit. *** Firewall with ingress and egress rules. **** Handling IP fragments. ** Learning. *** A MAC-learning switch. **** Reading and flushing the MAC learning table. **** Monitoring changes to the MAC learning table. *** Stateful firewall. ** VXLAN control plane. ** Routing. ** Spoof prevention. *** IPv6. ** PVLAN.

* Reactive control plane programming? ** In-band control as example?

* In-band control. ** How it works. ** Limitations. ** Rolling your own.

* Optimization. ** Separate tables. *** Tables with a single type of flow (see learning). ** Minimizing types of flows. ** Minimizing lookups. ** Minimizing flow table changes. *** Avoiding timeouts.