...
- VMWare P4 XDP project
- ELTE T4P4S project
Requirement- Basic Linux/Unix knowledge
- Basic networking knowledge
| |
Overview
However, XDP model was not complete enough in order to compile router.p4 and we could not generate the corresponding kernel bypass code with ELTE T4P4S based on BMv2 V1Model.p4. (A GitHub issue is still pending). In that context, Csaba freeRouter lead developer decided to develop P4Emu a software dataplane that has the particularity to:
...
Note |
---|
One would ask: Why write yet another software dataplane as freeRouter has already a working native software dataplane. This is a very good and valid question. The answer boils down in: "decoupling control plane from the dataplane" We will see in subsequent article how P4Emu unlock new valid uses cases. |
Article objective
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.
Note |
---|
It is important to note that though its name is P4Emu implies, P4Emu is not emulating V1Model. P4Emu is emulating router.p4 packet processing logic and uses a packet forwarding library to effectively transmit packets at specific ingress port to the right egress port defined by freeRouter control plane message. |
Diagram
[ #005 ] - Cookbook
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 | Launch freeRouter control plane alongside P4Emu/pcap dataplane |
---|
|
Code Block |
---|
language | bash |
---|
theme | Midnight |
---|
title | Setup bf_switchd 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 p4-freerouter-hw.txt and p4-freerouter-sw.txt with a console prompt |
---|
| java -jar lib/rtr.jar routersc etc/p4-freerouter-hw.txt etc/p4-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
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::
... |
|
Verification
Expand |
---|
title | Check telnet access for freerouter@2323 |
---|
|
Code Block |
---|
language | bash |
---|
theme | Midnight |
---|
title | FreeRouter telnet access from Virtualbox VM guest via port 2323 |
---|
| telnet localhost 2323
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
welcome
line ready
freerouter# |
|
...
Expand |
---|
title | Connectivity IPv4/IPv6 check for freeRouter |
---|
|
Code Block |
---|
language | bash |
---|
theme | Midnight |
---|
title | Ping IPv4 from freerouter -> LAN router gateway |
---|
| p4-freerouter#ping 192.168.0.254 /vrf v1
pinging 192.168.0.254, src=null, cnt=5, len=64, tim=1000, ttl=255, tos=0, sweep=false
.!!!!
result=80%, recv/sent/lost=4/5/1, rtt min/avg/max/total=1/1/2/1011 |
Code Block |
---|
language | bash |
---|
theme | Midnight |
---|
title | Ping IPv4 from freerouter -> LAN server |
---|
| p4-freerouter#ping 192.168.0.62 /vrf v1
pinging 192.168.0.62, src=null, cnt=5, len=64, tim=1000, ttl=255, tos=0, sweep=false
.!!!!
result=80%, recv/sent/lost=4/5/1, rtt min/avg/max/total=1/1/2/1005 |
Code Block |
---|
language | bash |
---|
theme | Midnight |
---|
title | IPv4 arp check |
---|
| p4-freerouter#sh ipv4 arp sdn1
mac address time static
e03f.496d.1899 192.168.0.62 00:00:57 false <----- Host server
0024.d4a0.0cd3 192.168.0.254 00:00:57 false <----- LAN gateway |
Code Block |
---|
language | bash |
---|
theme | Midnight |
---|
title | Ping IPv6 from freerouter -> LAN router |
---|
| p4-freerouter#ping 2a01:e0a:159:2850::1 /vrf v1
pinging 2a01:e0a:159:2850::1, src=null, cnt=5, len=64, tim=1000, ttl=255, tos=0, sweep=false
.!!!!
result=80%, recv/sent/lost=4/5/1, rtt min/avg/max/total=0/1/2/1004
|
Code Block |
---|
language | bash |
---|
theme | Midnight |
---|
title | Ping IPv6 from freerouter -> Host server and SSH connection test |
---|
| p4-freerouter#ping 2a01:e0a:159:2850:e23f:49ff:fe6d:1899 /vrf v1
pinging 2a01:e0a:159:2850:e23f:49ff:fe6d:1899, src=null, cnt=5, len=64, tim=1000, ttl=255, tos=0, sweep=false
.!!!!
result=80%, recv/sent/lost=4/5/1, rtt min/avg/max/total=1/1/1/1006
|
Code Block |
---|
language | bash |
---|
theme | Midnight |
---|
title | IPv6 neighbor discovery check |
---|
| p4-freerouter#show ipv6 neighbors sdn1
mac address time static router
0024.d4a0.0cd3 2a01:e0a:159:2850::1 00:00:53 false false
e03f.496d.1899 2a01:e0a:159:2850:e23f:49ff:fe6d:1899 00:00:53 false false
0024.d4a0.0cd3 fe80::224:d4ff:fea0:cd3 00:00:53 false false
e03f.496d.1899 fe80::e23f:49ff:fe6d:1899 00:00:53 false false |
Code Block |
---|
language | bash |
---|
theme | Midnight |
---|
title | Initiate IPv4 ssh from freerouter -> LAN router gateway |
---|
| p4-freerouter#ssh 192.168.0.62 /vrf v1 /user my-nas
- connecting to 192.168.0.62 22
password: *******
- securing connection
Last login: Mon Jul 6 15:05:38 2020 from 192.168.0.77
FreeBSD 11.3-RELEASE-p9 (FreeNAS.amd64) #0 r325575+588899735f7(HEAD): Mon Jun 1 15:04:31 EDT 2020
FreeNAS (c) 2009-2020, The FreeNAS Development Team
All rights reserved.
FreeNAS is released under the modified BSD license.
For more information, documentation, help or support, go here:
http://freenas.org
Welcome to FreeNAS
MY-NAS% |
Code Block |
---|
language | bash |
---|
theme | Midnight |
---|
title | Initiate IPv6 ssh from freerouter -> LAN router gateway |
---|
| p4-freerouter#ssh 2a01:e0a:159:2850:e23f:49ff:fe6d:1899 /vrf v1 /user my-nas
- connecting to 2a01:e0a:159:2850:e23f:49ff:fe6d:1899 22
password: *******
- securing connection
Last login: Tue Jul 7 16:01:54 2020 from 2a01:e0a:159:2850::666
FreeBSD 11.3-RELEASE-p9 (FreeNAS.amd64) #0 r325575+588899735f7(HEAD): Mon Jun 1 15:04:31 EDT 2020
FreeNAS (c) 2009-2020, The FreeNAS Development Team
All rights reserved.
FreeNAS is released under the modified BSD license.
For more information, documentation, help or support, go here:
http://freenas.org
Welcome to FreeNAS
MY-NAS% |
|
Conclusion
In this article you:
- 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
...