Connecting OpenFlow switches
OpenFlow is a vendor-neutral, standard communications interface defined to enable the interaction between the control and forwarding channels of an SDN architecture. The OpenFlowPlugin project intends to support implementations of the OpenFlow specification as it evolves. It currently supports OpenFlow versions 1.0 and 1.3.2. In addition, to support the core OpenFlow specification, OpenDaylight Beryllium also includes preliminary support for the table type patterns and OF-CONFIG specifications.
The OpenFlow southbound plugin currently provides the following components:
- Flow management
- Group management
- Meter management
- Statistics polling
Let's connect an OpenFlow switch to OpenDaylight.
Getting ready
This recipe requires an OpenFlow switch. If you don't have any, you can use a Mininet-VM with OvS installed. You can download Mininet-VM from the following website:
https://github.com/mininet/mininet/wiki/Mininet-VM-Images
Any version should work.
The following recipe will be presented using a Mininet-VM with OvS 2.0.2.
How to do it...
Perform the following steps:
- Start the OpenDaylight distribution using the
karaf
script. Using this script will give you access to the Karaf CLI:
$ ./bin/karaf
- Install the user-facing feature responsible for pulling in all dependencies needed to connect an OpenFlow switch:
opendaylight-user@root>feature:install odl-openflowplugin-all
It might take a minute or so to complete the installation.
- Connect an OpenFlow switch to OpenDaylight.
As mentioned in the Getting ready section, we will use Mininet-VM as our OpenFlow switch as this VM runs an instance of OpenVSwitch:
- Log in to Mininet-VM using:
Username
:mininet
Password
:mininet
- Let's create a bridge:
mininet@mininet-vm:~$ sudo ovs-vsctl add-br br0
- Now let's connect OpenDaylight as the controller of
br0
:
mininet@mininet-vm:~$ sudo ovs-vsctl set-controller br0 tcp: ${CONTROLLER_IP}:6633
- Let's look at our topology:
mininet@mininet-vm:~$ sudo ovs-vsctl show 0b8ed0aa-67ac-4405-af13-70249a7e8a96 Bridge "br0" Controller "tcp: ${CONTROLLER_IP}:6633" is_connected: true Port "br0" Interface "br0" type: internal ovs_version: "2.0.2"
${CONTROLLER_IP}
is the IP address of the host running OpenDaylight.
We're establishing a TCP connection. For a more secure connection, we could use TLS protocol; however, this will not be included in this book as this is beyond the scope of the book.
- Have a look at the created OpenFlow node.
Once the OpenFlow switch is connected, send the following request to get information regarding the switch:
- Type:
GET
- Headers:
Authorization: Basic YWRtaW46YWRtaW4=
- URL:
http://localhost:8181/restconf/operational/opendaylight-inventory:nodes/
This will list all the nodes under the opendaylight-inventory
subtree of MD-SAL that stores OpenFlow switch information. As we connected our first switch, we should have only one node there. It will contain all the information that the OpenFlow switch has, including its tables, its ports, flow statistics, and so on.
How it works...
Once the feature is installed, OpenDaylight is listening to connections on port 6633
and 6640
. Setting up the controller on the OpenFlow-capable switch will immediately trigger a callback on OpenDaylight. It will create the communication pipeline between the switch and OpenDaylight so they can communicate in a scalable and non-blocking way.