In article #003 and #004 you learned how RARE/freeRouter is controlling a P4 dataplane (BMv2 or TOFINO virtual model). We also demonstrated that this setup could be integrated into real networks. However, these P4 dataplanes are not suitable for day to day real operation as it have inherent software limitations. While freeRouter native software dataplane presents the advantage to get the entire feature set and is sufficient to handle a home network traffic load, we investigated a way to improve dataplane performance. In that context we considered to study:
...
In this article we'll using freeRouter setup deployed in #004 and replace bf_switchd providing freeRouter INTEL/BAREFOOT TOFINO's dataplane by P4Emu/pcap.
...
Expand |
---|
title | Install your favorite operating system |
---|
|
In our example we will use the same debian stable image (buster) installed as a VirtualBox VM as in #002.
and we add a bridge network interface to or laptop RJ45 connection.
|
...
Expand |
---|
title | Create configuration files for router: freerouter |
---|
|
FreeRouter uses 2 configuration files in order to run, let's write these configuration files for R1 in ~/freeRouter/etc Code Block |
---|
language | bash |
---|
theme | Midnight |
---|
title | freeRouter hardware configuration file: p4pcap-freerouter-hw.txt |
---|
| int eth0 eth 0000.1111.00fb 127.0.0.1 22710 127.0.0.1 22709
tcp2vrf 2323 v1 23
tcp2vrf 9080 v1 9080 |
Code Block |
---|
language | bash |
---|
theme | Midnight |
---|
title | freeRouter software configuration file: p4pcap-freerouter-sw.txt |
---|
| hostname pcap-freerouter
buggy
!
vrf definition v1
exit
!
interface ethernet0
description freerouter@P4_CPU_PORT[veth251]
no shutdown
no log-link-change
exit
!
interface sdn1
description freerouter@sdn1[enp0s3]
mtu 9000
vrf forwarding v1
ipv4 address 192.168.0.131 255.255.255.0
ipv6 address 2a01:e0a:159:2850::666 ffff:ffff:ffff:ffff::
ipv6 enable
no shutdown
no log-link-change
exit
!
!
!
!
!
!
!
!
!
!
!
!
!
!
server telnet tel
security protocol telnet
no exec authorization
no login authentication
vrf v1
exit
!
server p4lang p4
export-vrf v1 1
export-port sdn1 1 0
interconnect ethernet0
vrf v1
exit
!
end
|
|
...
Expand |
---|
title | Launch freeRouter control plane alongside P4Emu/pcap dataplane |
---|
|
Code Block |
---|
language | bash |
---|
theme | Midnight |
---|
title | Setup P4Emu dataplane communication channel via veth pair and interface adjustment (disable IPv6 at VM guest level, MTU 10240, disable TCP offload etc.) |
---|
| echo 1 > /proc/sys/net/ipv6/conf/all/disable_ipv6
echo 1 > /proc/sys/net/ipv6/conf/default/disable_ipv6
ip link add veth251 type veth peer name veth250
ip link set veth250 up
ip link set veth251 up
ifconfig enp0s3 promisc
ifconfig veth250 promisc
ifconfig veth251 promisc
ip link set dev veth250 up mtu 10240
ip link set dev veth251 up mtu 10240
ip link set dev enp0s3 up mtu 10240
export TOE_OPTIONS="rx tx sg tso ufo gso gro lro rxvlan txvlan rxhash"
for TOE_OPTION in $TOE_OPTIONS; do
/sbin/ethtool --offload veth250 "$TOE_OPTION" off &> /dev/null
/sbin/ethtool --offload veth251 "$TOE_OPTION" off &> /dev/null
/sbin/ethtool --offload enp0s3 "$TOE_OPTION" off &> /dev/null
done |
Code Block |
---|
language | bash |
---|
theme | Midnight |
---|
title | freeRouter launch with supplied p4pcap-freerouter-hw.txt and p4pcap-freerouter-sw.txt with a console prompt |
---|
| java -jar lib/rtr.jar routersc etc/p4pcap-freerouter-hw.txt etc/p4pcap-freerouter-sw.txt
info cfg.cfgInit.doInit:cfgInit.java:556 booting
info cfg.cfgInit.doInit:cfgInit.java:680 initializing hardware
info cfg.cfgInit.doInit:cfgInit.java:687 applying defaults
info cfg.cfgInit.doInit:cfgInit.java:695 applying configuration
info cfg.cfgInit.doInit:cfgInit.java:721 done
welcome
line ready
pcap-freerouter# |
Code Block |
---|
language | bash |
---|
theme | Midnight |
---|
title | launch freeRouter pcapInt in order to stitch control plane and P4Emu/pcap dataplane communication |
---|
| cd ~/freeRouter/bin
./pcapInt.bin veth251 22709 127.0.0.1 22710 127.0.0.1
binded to local port 127.0.0.1 22709.
will send to 127.0.0.1 22710.
pcap version: libpcap version 1.8.1
opening interface veth251 with pcap1.x api
serving others
> |
Code Block |
---|
language | bash |
---|
theme | Midnight |
---|
title | Launch P4Emu/pcap software dataplane |
---|
| sudo ./p4emu.bin 127.0.0.1 9080 0 veth250 enp0s3
cpu port is #0 of 2...
pcap version: libpcap version 1.8.1
connecting 127.0.0.1 9080.
opening interface veth250.
opening interface enp0s3.
rx: 'myaddr4' 'add' '224.0.0.0' '4' '0' '1' ''
rx: 'myaddr4' 'add' '255.255.255.255' '32' '0' '1' ''
rx: 'myaddr6' 'add' 'ff00::' '8' '0' '1' ''
rx: 'myaddr4' 'add' '192.168.0.0' '24' '-1' '1' ''
rx: 'myaddr4' 'add' '192.168.0.131' '32' '-1' '1' ''
rx: 'myaddr6' 'add' '2a01:e0a:159:2850::' '64' '-1' '1' ''
rx: 'myaddr6' 'add' '2a01:e0a:159:2850::666' '128' '-1' '1' ''
rx: 'myaddr6' 'add' 'fe80::' '64' '-1' '1' ''
rx: 'mylabel4' 'add' '615589' '1' ''
rx: 'mylabel6' 'add' '1036348' '1' ''
rx: 'state' '1' '1' '0' ''
rx: 'mtu' '1' '9000' ''
rx: 'portvrf' 'add' '1' '1' ''
rx: 'keepalive' ''
rx: 'keepalive' ''
rx: 'neigh6' 'add' '11120' 'fe80::224:d4ff:fea0:cd3' '00:24:d4:a0:0c:d3' '1' '00:72:3e:18:1b:6f' '1' ''
rx: 'keepalive' ''
rx: 'keepalive' ''
rx: 'keepalive' ''
rx: 'neigh4' 'add' '29738' '192.168.0.254' '00:24:d4:a0:0c:d3' '1' '00:72:3e:18:1b:6f' '1' ''
rx: 'keepalive' ''
rx: 'neigh4' 'add' '40470' '192.168.0.62' 'e0:3f:49:6d:18:99' '1' '00:72:3e:18:1b:6f' '1' ''
rx: 'keepalive' ''
rx: 'keepalive' ''
rx: 'keepalive' ''
rx: 'keepalive' ''
rx: 'keepalive' ''
rx: 'neigh6' 'add' '45820' '2a01:e0a:159:2850:e23f:49ff:fe6d:1899' 'e0:3f:49:6d:18:99' '1' '00:72:3e:18:1b:6f' '1' ''
rx: 'keepalive' ''
rx: 'neigh6' 'add' '49055' 'fe80::e23f:49ff:fe6d:1899' 'e0:3f:49:6d:18:99' '1' '00:72:3e:18:1b:6f' '1' ''
rx: 'neigh6' 'add' '33334' '2a01:e0a:159:2850::
... |
|
...
- had a demonstration of how to integrate freeRouter into a local area network (Similar to article #002)
- However instead of using bmv2 or TOFINO we used a P4Emu/pcap dataplane
- communication between freeRouter control plane and P4Emu/pcap is ensured by pcapInt via veth pair [ veth250 - veth251 ]
- In this example the freeRouter with P4Emu/pcap has only 1 dataplane interface that is bound to enp0s3 VM interface exposed to the local network as a bridged interface
...