ONE/RTR setup
Contents
Overview
This tutorial shows how to setup a topology with an re-encapsulating LISP tunnel router (RTR) with a single interface used as an ingress and egress.
Prerequisites
- Ubuntu host with bridge-utils and ethtool installed
- OpenDaylight Beryllium
Topology
Setup
This section explains how to build VPP lite and walks through the host, vpp and ODL configs
Build VPP lite
Assuming this is done in a vagrant vm:
cd /vpp export PLATFORM=vpp_lite make build
More details on vpp-lite and other alternative builds can be found in the alternative builds section.
Host
Install bridge-utils and ethtool if needed:
sudo apt-get install bridge-utils ethtool
Create namespaces and set up client, vpp and ODL interfaces.
#!/usr/bin/env bash
# path to vpp executable and configurations folder
VPP_LITE_BIN=/vpp/build-root/install-vpp_lite_debug-native/vpp/bin/vpp
VPP_LITE_CONF=/etc/vpp/lite/
pkill vpp
# delete previous incarnations if they exist
ip netns exec xtr-rtr-ns ifconfig vppbr1 down
ip netns exec xtr-rtr-ns brctl delbr vppbr1
ip link del dev vpp1 &> /dev/null
ip link del dev vpp2 &> /dev/null
ip link del dev xtr_rtr1 &> /dev/null
ip link del dev xtr_rtr2 &> /dev/null
ip link del dev xtr_rtr3 &> /dev/null
ip link del dev odl &> /dev/null
ip netns del vpp-ns1 &> /dev/null
ip netns del vpp-ns2 &> /dev/null
ip netns del xtr-rtr-ns &> /dev/null
if [ "$1" == "clean" ] ; then
exit 0
fi
if [ ! -e ${VPP_LITE_BIN} ] ; then
echo "VPP binary not found: $VPP_LITE_BIN"
exit 1
fi
ip netns add vpp-ns1
ip netns add vpp-ns2
ip netns add xtr-rtr-ns
ip link add veth_xtr_rtr1 type veth peer name xtr_rtr1
ip link add veth_xtr_rtr2 type veth peer name xtr_rtr2
ip link add veth_xtr_rtr3 type veth peer name xtr_rtr3
ip link add veth_odl type veth peer name odl
ip link set dev xtr_rtr1 up
ip link set dev xtr_rtr2 up
ip link set dev xtr_rtr3 up
ip link set dev odl up
ip link set dev veth_xtr_rtr1 up netns xtr-rtr-ns
ip link set dev veth_xtr_rtr2 up netns xtr-rtr-ns
ip link set dev veth_xtr_rtr3 up netns xtr-rtr-ns
ip link set dev veth_odl up netns xtr-rtr-ns
ip netns exec xtr-rtr-ns brctl addbr vppbr1
ip netns exec xtr-rtr-ns brctl addif vppbr1 veth_xtr_rtr1
ip netns exec xtr-rtr-ns brctl addif vppbr1 veth_xtr_rtr2
ip netns exec xtr-rtr-ns brctl addif vppbr1 veth_xtr_rtr3
ip netns exec xtr-rtr-ns brctl addif vppbr1 veth_odl
ip netns exec xtr-rtr-ns ifconfig vppbr1 up
ip link add veth_vpp1 type veth peer name vpp1
ip link set dev vpp1 up
ip link set dev veth_vpp1 up netns vpp-ns1
ip netns exec vpp-ns1 \
bash -c "
ip link set dev lo up
ip addr add 6.0.2.2/24 dev veth_vpp1
ip route add 6.0.4.0/24 via 6.0.2.1
"
ip link add veth_vpp2 type veth peer name vpp2
ip link set dev vpp2 up
ip link set dev veth_vpp2 up netns vpp-ns2
ip netns exec vpp-ns2 \
bash -c "
ip link set dev lo up
ip addr add 6.0.4.4/24 dev veth_vpp2
ip route add 6.0.2.0/24 via 6.0.4.1
"
ifconfig odl 6.0.3.100/24
ethtool --offload odl rx off tx off
sudo ${VPP_LITE_BIN} \
unix { log /var/log/vpp/vpp1.log cli-listen \
localhost:5002 full-coredump \
exec ${VPP_LITE_CONF}/rtr-simple/vpp1.config } \
api-trace { on } chroot {prefix xtr1}
sudo ${VPP_LITE_BIN} \
unix { log /var/log/vpp/vpp2.log cli-listen \
localhost:5003 full-coredump \
exec ${VPP_LITE_CONF}/rtr-simple/vpp2.config } \
api-trace { on } chroot {prefix xtr2}
sudo ${VPP_LITE_BIN} \
unix { log /var/log/vpp/rtr.log cli-listen \
localhost:5004 full-coredump \
exec ${VPP_LITE_CONF}/rtr-simple/rtr.config } \
api-trace { on } chroot {prefix rtr}
vpp1 config
create host-interface name vpp1 set int state host-vpp1 up set int ip address host-vpp1 6.0.2.1/24 create host-interface name xtr_rtr1 set int state host-xtr_rtr1 up set int ip address host-xtr_rtr1 6.0.3.1/24 lisp enable lisp map-resolver add 6.0.3.100 lisp locator-set add ls1 iface host-xtr_rtr1 p 1 w 1 lisp eid-table add eid 6.0.2.0/24 locator-set ls1
vpp2 config
create host-interface name vpp2 set int state host-vpp2 up set int ip address host-vpp2 6.0.4.1/24 create host-interface name xtr_rtr3 set int state host-xtr_rtr3 up set int ip address host-xtr_rtr3 6.0.3.2/24 lisp enable lisp map-resolver add 6.0.3.100 lisp locator-set add ls1 iface host-xtr_rtr3 p 1 w 1 lisp eid-table add eid 6.0.4.0/24 locator-set ls1
rtr config
create host-interface name xtr_rtr2 set int state host-xtr_rtr2 up set int ip address host-xtr_rtr2 6.0.3.3/24 lisp enable lisp locator-set add ls1 iface host-xtr_rtr2 p 1 w 1 lisp pitr ls ls1 lisp remote-mapping deid 6.0.0.0/16 action send-map-request lisp map-resolver add 6.0.3.100
ODL Map-Server/Resolver
Steps to install and configure ODL, assuming the SR1 tar archive is downloaded:
Install and configure ODL
wget https://nexus.opendaylight.org/content/repositories/opendaylight.release/org/opendaylight/integration/distribution-karaf/0.4.1-Beryllium-SR1/distribution-karaf-0.4.1-Beryllium-SR1.tar.gz tar xzf distribution-karaf-0.4.1-Beryllium-SR1.tar.gz cd distribution-karaf-0.4.1-Beryllium-SR1/
ODL configuration
In order to get RTR to be working correctly you need to have following line in config file
etc/custom.properties:
lisp.elpPolicy = replace
And then run ODL with:
cd bin ./karaf
To install LispFlowMapping Map-Server/Resolver, in the karaf console type:
feature:install odl-lispflowmapping-msmr
Give it some time to load all bundles. You can check progress with log:tail and exit from the log with Ctrl-C
Add necessary mappings to ODL
Prepare two json files with the mappings to be inserted elp1.json and elp2.json shown below:
elp1.json
{
"input": {
"mapping-record": {
"recordTtl": 1440,
"action": "NoAction",
"authoritative": true,
"eid": {
"address-type": "ietf-lisp-address-types:ipv4-prefix-afi",
"ipv4-prefix": "6.0.2.0/24"
},
"LocatorRecord": [
{
"locator-id": "ELP",
"priority": 1,
"weight": 1,
"multicastPriority": 255,
"multicastWeight": 0,
"localLocator": true,
"rlocProbed": false,
"routed": false,
"rloc": {
"address-type": "ietf-lisp-address-types:explicit-locator-path-lcaf",
"explicit-locator-path": {
"hop": [
{
"hop-id": "Hop 1",
"address": "6.0.3.3",
"lrs-bits": "lookup rloc-probe strict"
},
{
"hop-id": "Hop 2",
"address": "6.0.3.1",
"lrs-bits": "lookup strict"
}
]
}
}
}
]
}
}
}
elp2.json
{
"input": {
"mapping-record": {
"recordTtl": 1440,
"action": "NoAction",
"authoritative": true,
"eid": {
"address-type": "ietf-lisp-address-types:ipv4-prefix-afi",
"ipv4-prefix": "6.0.4.0/24"
},
"LocatorRecord": [
{
"locator-id": "ELP",
"priority": 1,
"weight": 1,
"multicastPriority": 255,
"multicastWeight": 0,
"localLocator": true,
"rlocProbed": false,
"routed": false,
"rloc": {
"address-type": "ietf-lisp-address-types:explicit-locator-path-lcaf",
"explicit-locator-path": {
"hop": [
{
"hop-id": "Hop 1",
"address": "6.0.3.3",
"lrs-bits": "lookup rloc-probe strict"
},
{
"hop-id": "Hop 2",
"address": "6.0.3.2",
"lrs-bits": "lookup strict"
}
]
}
}
}
]
}
}
}
Test
To test this you can simply send an ICMP request from the client interface using following command:
ip netns exec vpp-ns1 ping 6.0.4.4
Traffic and control plane message exchanges can be checked with a wireshark listening on the odl interface.