Bonding links using LACP
The Link Aggregation Control Protocol (LACP) project within OpenDaylight implements the LACP.
It will be used to auto-discover and aggregate links between the known OpenDaylight network and external equipment such as LACP capable endpoints or switches. Using LACP will increase the resilience of the link(s) and will aggregate the bandwidth.
LACP protocol was first released as an IEEE Ethernet specification 802.3ad, but later moved to Bridging and Management Group as an 802.1AX specification.
The LACP module will listen for LACP control packets that are generated from legacy switches (non-OpenFlow enabled).
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 their website:
https://github.com/mininet/mininet/wiki/Mininet-VM-Images
Note
OvS users:
You must use a version of OvS superior or equal to 2.1 so it can handle group tables. If you previously downloaded a Mininet-VM, you could create a new VM using its disk, and then update the OvS version within Mininet. Perform the update within mininet
; you'll have to run the following commands:$ cd /home/mininet/mininet/util
$ ./install.sh -V 2.3.1
This script will try updating your packages, but this operation can fail. If it does, run the command yourself then re-execute the script:$ sudo apt-get update --fix-missing
Then rerun the install script. After a couple of minutes, the new version of OvS should be installed:mininet@mininet-vm:~$ sudo ovs-vsctl show 1077578e-f495-46a1-a96b-441223e7cc22 ovs_version: "2.3.1"
This recipe will be presented using a Mininet-VM with OvS 2.3.1.
In order to use LACP, you have to ensure that legacy (non-OpenFlow) switches are configured with the LACP mode active with a long timeout to allow the LACP plugin to respond to its messages.
The sample code for this recipe is available at:
https://github.com/jgoodyear/OpenDaylightCookbook/tree/master/chapter1/chapter1-recipe5
How to do it...
Perform the following steps:
- Start your 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 enable LACP functionality:
opendaylight-user@root>feature:install odl-lacp-ui
It might take a few minutes to complete the installation.
- Creating a network using Mininet:
- Log in to Mininet-VM using:
Username
:mininet
Password
:mininet
- Create the topology:
In order to do so, use the following command:
mininet@mininet-vm:~$ sudo mn --controller=remote,ip=${CONTROLLER_IP} --topo=linear,1 --switch ovsk,protocols=OpenFlow13
This command will create a virtual network containing one switch, connected to ${CONTROLLER_IP}
.
We will end up with one OpenFlow node in the opendaylight-inventory
:
- Type:
GET
- Headers:
Authorization: Basic YWRtaW46YWRtaW4=
- URL:
http://localhost:8080/restconf/operational/opendaylight-inventory:nodes
This request will return the following:
--[cut]- { "id": "openflow:1", --[cut]-- }
- Open a new terminal to access your Mininet instance and verify that the flow entry handling LACP packets is installed:
mininet@mininet-vm:~$ sudo ovs-ofctl -O OpenFlow13 dump-flows s1 OFPST_FLOW reply (OF1.3) (xid=0x2): cookie=0x3000000000000003, duration=185.98s, table=0, n_packets=0, n_bytes=0, priority=5,dl_dst=01:80:c2:00:00:02,dl_type=0x8809 actions=CONTROLLER:65535
The flow is using ether type 0x8809
, which is the one defined for LACP.
- From the Mininet CLI, let's add a new link between switch1 (
s1
) and host1 (h1
), and then aggregate the two links. The Mininet CLI is where you ended up after creating the topology in step 3:
mininet> py net.addLink(s1, net.get('h1')) <mininet.link.Link object at 0x7fe1fa0f17d0> mininet> py s1.attach('s1-eth2')
- Configure host1 (
h1
) to act as your legacy switch. To do that, we will create a bond interface with mode type set to LACP. In order to do so, we need to create a new file under/etc/mobprobe.d
in your Mininet instance.
Use the terminal window opened at step 4 to access this directory and create a file bonding.conf
with this content:
alias bond0 bonding options bonding mode=4
mode=4
refers to LACP, and by default the timeout is set to be long.
- Using the Mininet CLI, let's create and configure the bond interface and add both physical interfaces of
host
,h1-eth0
, andh1-eth
, as members of the bound interface. Then set the interface up:
mininet> py net.get('h1').cmd('modprobe bonding') mininet> py net.get('h1').cmd('ip link add bond0 type bond') mininet> py net.get('h1').cmd('ip link set bond0 address ${MAC_ADDRESS}') mininet> py net.get('h1').cmd('ip link set h1-eth0 down') mininet> py net.get('h1').cmd('ip link set h1-eth0 master bond0') mininet> py net.get('h1').cmd('ip link set h1-eth1 down') mininet> py net.get('h1').cmd('ip link set h1-eth1 master bond0') mininet> py net.get('h1').cmd('ip link set bond0 up')
Make sure to change ${MAC_ADDRESS}
with an appropriate MAC address.
Once the created bond0
interface is up, host1
will send LACP packets to switch1. OpenDaylight LACP's module will create the link aggregation group on the switch1 (s1
).
To visualize the bound interface, you can use the following command:
mininet> py net.get('h1').cmd('cat /proc/net/bonding/bond0')
- Finally, let's look at the switch1 table; there should be a new entry within the group table with
type=select
:
mininet@mininet-vm:~$ sudo ovs-ofctl -O Openflow13 dump-groups s1 OFPST_GROUP_DESC reply (OF1.3) (xid=0x2): group_id=41238,type=select,bucket=weight:0,actions=output:1,bucket=weight:0,actions=output:2 group_id=48742,type=all,bucket=weight:0,actions=drop
Let's focus on the first entry: the flow type is select, which means that the packets are processed by a single bucket in the group as well as have two buckets assigned with the same weight. Each bucket represents a given port on the switch, port 1 (s1-eth1
) and 2 (s1-eth2
) respectively, in this example.
- To apply link aggregation group on switches, flows should define the
group_id
of the established group table entry, which in our case isgroup_id=41238
. The flow presented here is for the ARP Ethernet frame (dl_type = 0x0806
):
sudo ovs-ofctl -O Openflow13 add-flow s1 dl_type=0x0806,dl_src=SRC_MAC,dl_dst=DST_MAC,actions=group:60169
How it works...
It leverages the OpenFlowPlugin project providing the basic communication channel between OpenFlow capable switches and OpenDaylight. The LCAP project implements the Link Aggregation Control Protocol as a service in MD-SAL. Using the packet processing service, it will receive and process LACP packets. Based on a periodic state machine, it will define whether or not to maintain an aggregation.