In article #005 you learned how RARE/freeRouter is controlling a P4Emu/pcap dataplane. We also demonstrated that this setup could be integrated into real networks.
Requirement- Basic Linux/Unix knowledge
- Basic networking knowledge
| |
Overview
Though P4Emu/pcap can be used for SOHO and can handle nx1GE of traffic, this comes at a high CPU load cost and thus a higher power consumption.
Note |
---|
"Why write yet another software dataplane as freeRouter has already a working native software dataplane ?" The partial answer to the question raised in the previous article was: "decoupling control plane from the dataplane" We learned that P4Emu: - is able to understand the VERY same strict control message from freeRouter as it occurs with a P4 dataplane
- is able to switch packet emulating router.p4 using libpcap packet forwarding backend.
However, even though libpcap is a performant packet processing library, the kernel is still heavily sollicited and the higher the traffic rate is, the higher CPU workload becomes. |
Article objective
In this article we'll using freeRouter setup deployed in #005 and replace P4Emu/pcap's dataplane and replace it by P4Emu/dpdk dataplane.
...
Note |
---|
It is important to note that though its name implies, P4Emu/dpdk 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. However, in this precise case, packet processing is offloaded from the kernel to user space. The consequence is the ability with dpdk compatible NIC and driver, to reach tremendous traffic rate. DPDK is not available on all hardware, please refer to DPDK HCL. |
Diagram
[ #006 ] - Cookbook
Expand |
---|
title | Install your favorite operating system |
---|
|
In our example we will use the ubuntu focal as we need dpdk 19.11.1 (latest current version is 20.05.0)
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 | freeRouter launch with supplied p4-freerouter-hw.txt and p4-freerouter-sw.txt with a console prompt |
---|
| java -jar lib/rtr.jar routersc dpdk-focal-1-hw.txt dpdk-focal-1-sw.txt
info cfg.cfgInit.doInit:cfgInit.java:556 booting
info cfg.cfgInit.doInit:cfgInit.java:680 initializing hardware
info cfg.cfgInit.executeHWcommands:cfgInit.java:469 2:! cpu_port
info cfg.cfgInit.executeHWcommands:cfgInit.java:469 4:! freerouter control port for message
info cfg.cfgInit.executeHWcommands:cfgInit.java:469 6:! freerouter cli
info cfg.cfgInit.executeHWcommands:cfgInit.java:469 8:! launch a process called "veth0" that actually link to veth0b
info cfg.cfgInit.executeHWcommands:cfgInit.java:469 9:! cmd: ip link add veth0a type veth peer name veth0b
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
dpdk-freertr-1# |
|
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 |
---|
| root@focal-1:~# telnet 127.0.0.1 2323
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
welcome
line ready
dpdk-freerouter# |
|
...
Expand |
---|
title | Connectivity IPv4/IPv6 check for freeRouter |
---|
|
Code Block |
---|
language | bash |
---|
theme | Midnight |
---|
title | Ping IPv4 from freerouter -> LAN router gateway |
---|
| dpdk-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=100%, recv/sent/lost=5/5/0, rtt min/avg/max/total=1/1/1/6 |
Code Block |
---|
language | bash |
---|
theme | Midnight |
---|
title | Ping IPv4 from freerouter -> LAN server |
---|
| dpdk-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 |
Note |
---|
Please observe the 1st ICMP packet loss that triggered ARP learning for respectively 192.168.0.254 and 192.168.0.62. |
Code Block |
---|
language | bash |
---|
theme | Midnight |
---|
title | IPv4 arp check |
---|
| dpdk-freerouter#sh ipv4 arp sdn1
mac address time static
e03f.496d.1899 192.168.0.62 00:00:24 false <----- Host server
0024.d4a0.0cd3 192.168.0.254 00:00:24 false <----- LAN gateway |
Code Block |
---|
language | bash |
---|
theme | Midnight |
---|
title | Ping IPv6 from freerouter -> LAN router |
---|
| dpdk-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=1/1/2/1005 |
Code Block |
---|
language | bash |
---|
theme | Midnight |
---|
title | Ping IPv6 from freerouter -> Host server and SSH connection test |
---|
| dpdk-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/2/1006 |
Note |
---|
Please observe the 1st ICMP packet loss that triggered IPv6 neighbor discovery for respectively 2a01:e0a:159:2850::1 and 2a01:e0a:159:2850:e23f:49ff:fe6d:1899 |
Code Block |
---|
language | bash |
---|
theme | Midnight |
---|
title | IPv6 neighbor discovery check |
---|
| dpdk-freerouter#show ipv6 neighbors sdn1
mac address time static router
0024.d4a0.0cd3 2a01:e0a:159:2850::1 00:00:39 false false <----- LAN gateway
e03f.496d.1899 2a01:e0a:159:2850:e23f:49ff:fe6d:1899 00:00:39 false false <----- Host server
0024.d4a0.0cd3 fe80::224:d4ff:fea0:cd3 00:00:39 false false <----- Link local LAN gateway EUI64 IPv6 address
e03f.496d.1899 fe80::e23f:49ff:fe6d:1899 00:00:39 false false <----- Link local host server IPv6 address |
Code Block |
---|
language | bash |
---|
theme | Midnight |
---|
title | Initiate IPv4 ssh from freerouter -> LAN router gateway |
---|
| dpdk-freerouter#ssh 192.168.0.62 /vrf v1 /user my-nas
- connecting to 192.168.0.62 22
password: *******
- securing connection
Last login: Tue Jul 7 17:40:55 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% |
Code Block |
---|
language | bash |
---|
theme | Midnight |
---|
title | Initiate IPv6 ssh from freerouter -> LAN router gateway |
---|
| dpdk-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: Wed Jul 8 11:28:32 2020 from 192.168.0.131
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 P4Emu/dpdk we used a P4Emu/dpdk dataplane
- communication between freeRouter control plane and P4Emu/dpdk is ensured by pcapInt via veth pair [ veth0a - veth0b ]
- In this example the freeRouter with P4Emu/dpdk has only 1 dataplane interface that is bound to enp0s3 VM interface exposed to the local network as a bridged interface
...