[doc] egress works with table on NetFPGA

This commit is contained in:
Nico Schottelius 2019-07-31 11:30:56 +02:00
parent 77d1f770c2
commit bcc039cb31
6 changed files with 233 additions and 59 deletions

View File

@ -4,3 +4,10 @@ Description of the theory/software/hardware that you designed.
% the architecture % the architecture
Maybe figures here? controller, Maybe figures here? controller,
\section{\label{Design:NetPFGA}NetFPGA}
Netpfga live,
Vivado
SDNET
xx k lines of supporting code

View File

@ -18,11 +18,27 @@ test framework openvswitch
\section{\label{Results:NetPFGA}NetFPGA} \section{\label{Results:NetPFGA}NetFPGA}
\subsection{\label{Results:NetPFGA:challenges}Challenges} General result: limited NAT64 is working, however
\subsection{\label{Results:NetPFGA:challenge-checksum}No Payload checksumming}
\subsection{\label{Results:NetPFGA:challenges}Other Challenges}
Many workarounds Many workarounds
Table size 63, table size 64, Table size 63, table size 64,
Table entries require arguments of all possible actions, not only used
one.
Compile time hours
Silent errors
Unclear errors: broken board
Due to the very fragile nature of the build framework from the
NetFPGA-Live repository,
Reproducibility:
\section{\label{Results:P4}P4} \section{\label{Results:P4}P4}

View File

@ -1,5 +1,6 @@
\chapter{\label{appendixA}Test descriptions} \chapter{\label{appendixA}Test descriptions}
\section{\label{chapterA:netpfga-setup}NetFPGA Setup}
Description of installation, commit of netpfga-live
\section{\label{chapterA:section1}NetFPGA NAT64 Test cases} \section{\label{chapterA:section1}NetFPGA NAT64 Test cases}
todo: add graphic of nsg <-> esprimo cabling todo: add graphic of nsg <-> esprimo cabling
@ -13,7 +14,24 @@ ip neigh add 10.0.0.42 lladdr f8:f2:1e:09:62:d1 dev enp2s0f0
\end{verbatim} \end{verbatim}
\subsection{Test 1: do IPv4 egress settings work} For all test cases the following network settings on esprimo:
\begin{verbatim}
12: enp2s0f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether f8:f2:1e:09:62:d0 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.42/24 scope global enp2s0f0
valid_lft forever preferred_lft forever
inet6 fe80::faf2:1eff:fe09:62d0/64 scope link
valid_lft forever preferred_lft forever
13: enp2s0f1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether f8:f2:1e:09:62:d1 brd ff:ff:ff:ff:ff:ff
inet6 2001:db8:42::42/64 scope global
valid_lft forever preferred_lft forever
inet6 fe80::faf2:1eff:fe09:62d1/64 scope link
valid_lft forever preferred_lft forever
\end{verbatim}
\subsection{Test 1: IPv4 egress settings work}
Scenario: simple egress port setting Scenario: simple egress port setting
Step 1: getting correct values for table entries from python: Step 1: getting correct values for table entries from python:
@ -74,7 +92,7 @@ root@ESPRIMO-P956:~# ip neigh add 10.0.0.4 lladdr f8:f2:1e:09:62:d1 dev enp2s0f0
Step 3: generating test packets, expecting 4 packets to show up on Step 3: generating test packets, expecting 4 packets to show up on
enp2s0f0: enp2s0f0:
\begin{tiny} %\tvb
\begin{verbatim} \begin{verbatim}
nico@ESPRIMO-P956:~$ sudo tcpdump -ni enp2s0f0 nico@ESPRIMO-P956:~$ sudo tcpdump -ni enp2s0f0
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
@ -84,11 +102,92 @@ listening on enp2s0f0, link-type EN10MB (Ethernet), capture size 262144 bytes
10:49:29.222340 IP 10.0.0.42 > 10.0.0.4: ICMP echo request, id 4440, seq 2, length 64 10:49:29.222340 IP 10.0.0.42 > 10.0.0.4: ICMP echo request, id 4440, seq 2, length 64
10:49:29.222418 IP 10.0.0.42 > 10.0.0.4: ICMP echo request, id 4440, seq 2, length 64 10:49:29.222418 IP 10.0.0.42 > 10.0.0.4: ICMP echo request, id 4440, seq 2, length 64
\end{verbatim} \end{verbatim}
\end{tiny} %\tve
Result: sucess Result: sucess
\subsection{Test 2: IPv6 egress}
Similar to the IPv4 setting before, just for IPv6.
Step 1: getting IP address values
\begin{verbatim}
>>> int(ipaddress.IPv6Address(u"2001:db8:42::4"))
42540766411362381960998550477184434180L
>>> int(ipaddress.IPv6Address(u"2001:db8:42::6"))
42540766411362381960998550477184434182L
>>> int(ipaddress.IPv6Address(u"2001:db8:42::42"))
42540766411362381960998550477184434242L
\end{verbatim}
Step 2: setting table entries
\begin{verbatim}
>> table_cam_add_entry realmain_v6_networks_0 realmain.set_egress_port 42540766411362381960998550477184434182 => 64 0 0 0 0
fields = [(u'hit', 1), (u'action_run', 3), (u'out_port', 8), (u'out_port', 8), (u'mac_addr', 48), (u'task', 16), (u'table_id', 16)]
action_name = TopPipe.realmain.set_egress_port
field_vals = [1, '64', '0', '0', '0', '0']
CAM_Init_ValidateContext() - done
WROTE 0x44020350 = 0x0006
WROTE 0x44020354 = 0x0000
WROTE 0x44020358 = 0x420000
WROTE 0x4402035c = 0x20010db8
WROTE 0x44020380 = 0x0000
WROTE 0x44020384 = 0x0000
WROTE 0x44020388 = 0x40000000
WROTE 0x4402038c = 0x0001
READ 0x44020344 = 0x0001
WROTE 0x44020340 = 0x0001
READ 0x44020344 = 0x0001
READ 0x44020344 = 0x0001
success
>> table_cam_add_entry realmain_v6_networks_0 realmain.set_egress_port 42540766411362381960998550477184434242 => 64 0 0 0 0
fields = [(u'hit', 1), (u'action_run', 3), (u'out_port', 8), (u'out_port', 8), (u'mac_addr', 48), (u'task', 16), (u'table_id', 16)]
action_name = TopPipe.realmain.set_egress_port
field_vals = [1, '64', '0', '0', '0', '0']
CAM_Init_ValidateContext() - done
WROTE 0x44020350 = 0x0042
WROTE 0x44020354 = 0x0000
WROTE 0x44020358 = 0x420000
WROTE 0x4402035c = 0x20010db8
WROTE 0x44020380 = 0x0000
WROTE 0x44020384 = 0x0000
WROTE 0x44020388 = 0x40000000
WROTE 0x4402038c = 0x0001
READ 0x44020344 = 0x0001
WROTE 0x44020340 = 0x0001
READ 0x44020344 = 0x0001
READ 0x44020344 = 0x0001
success
>>
\end{verbatim}
Step 3: setting neighbor entries
\begin{verbatim}
nico@ESPRIMO-P956:~$ sudo ip -6 neigh add 2001:db8:42::6 lladdr f8:f2:1e:09:62:d0 dev enp2s0f1
nico@ESPRIMO-P956:~$ sudo ip -6 neigh add 2001:db8:42::4 lladdr f8:f2:1e:09:62:d0 dev enp2s0f1
\end{verbatim}
Step 4: generating test packets
\begin{verbatim}
nico@ESPRIMO-P956:~$ ping6 -c2 2001:db8:42::6
PING 2001:db8:42::6(2001:db8:42::6) 56 data bytes
nico@ESPRIMO-P956:~$ sudo tcpdump -ni enp2s0f1
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on enp2s0f1, link-type EN10MB (Ethernet), capture size 262144 bytes
11:30:17.287577 IP6 2001:db8:42::42 > 2001:db8:42::6: ICMP6, echo request, seq 1, length 64
11:30:17.287599 IP6 2001:db8:42::42 > 2001:db8:42::6: ICMP6, echo request, seq 1, length 64
11:30:18.310178 IP6 2001:db8:42::42 > 2001:db8:42::6: ICMP6, echo request, seq 2, length 64
11:30:18.310258 IP6 2001:db8:42::42 > 2001:db8:42::6: ICMP6, echo request, seq 2, length 64
\end{verbatim}
Result: success, packet is seen twice.
\chapter{\label{appendixB}Appendix B?} \chapter{\label{appendixB}Appendix B?}

View File

@ -7267,7 +7267,7 @@ success
*** DONE 2019-07-28: ping6 test for getting packet: failure *** DONE 2019-07-28: ping6 test for getting packet: failure
CLOSED: [2019-07-28 Sun 12:43] CLOSED: [2019-07-28 Sun 12:43]
*** TODO 2019-07-28: !!!!!!! NETPFGA PORT MAPPINGS *** TODO 2019-07-28: *NETPFGA PORT MAPPINGS*
nf_port_map = { nf_port_map = {
"nf0":0b00000001, "nf0":0b00000001,
"nf1":0b00000100, "nf1":0b00000100,
@ -7283,8 +7283,6 @@ nf_port_map = {
| port 1 | 0b00000100 | 4 | | | port 1 | 0b00000100 | 4 | |
| port 2 | 0b00010000 | 16 | esprimo enp2s0f0 | | port 2 | 0b00010000 | 16 | esprimo enp2s0f0 |
| port 3 | 0b01000000 | 64 | esprimo enp2s0f1 | | port 3 | 0b01000000 | 64 | esprimo enp2s0f1 |
| | | | |
*** DONE 2019-07-28: testing with port = 64 (first or last in theory): LAST! WORKS! *** DONE 2019-07-28: testing with port = 64 (first or last in theory): LAST! WORKS!
CLOSED: [2019-07-28 Sun 13:19] CLOSED: [2019-07-28 Sun 13:19]
#+BEGIN_CENTER #+BEGIN_CENTER
@ -8064,7 +8062,8 @@ listening on enp2s0f1, link-type EN10MB (Ethernet), capture size 262144 bytes
- eth1 on nsg: seeing ipv4 and ipv6 - eth1 on nsg: seeing ipv4 and ipv6
- eth1 on nsg: seeing icmp (ipv4) - eth1 on nsg: seeing icmp (ipv4)
- enp2s0f0 SEES icmp6! - enp2s0f0 SEES icmp6!
*** TODO 2019-07-29: test table entries for moving to different port *** DONE 2019-07-29: test table entries for moving to different port
CLOSED: [2019-07-31 Wed 10:04]
#+BEGIN_CENTER #+BEGIN_CENTER
>> table_cam_add_entry realmain_dummy_table_for_netpfga_0 realmain.set_egress_port 34525 => 64 >> table_cam_add_entry realmain_dummy_table_for_netpfga_0 realmain.set_egress_port 34525 => 64
fields = [(u'hit', 1), (u'action_run', 2), (u'out_port', 8)] fields = [(u'hit', 1), (u'action_run', 2), (u'out_port', 8)]
@ -8092,6 +8091,60 @@ It works!!!!!
*** DONE 2019-07-29: documentation: `portland.sty' not found: removed include *** DONE 2019-07-29: documentation: `portland.sty' not found: removed include
CLOSED: [2019-07-29 Mon 20:27] CLOSED: [2019-07-29 Mon 20:27]
*** TODO 2019-07-31: Test final NAT64 code: v6 egress
#+BEGIN_CENTER
>>> int(ipaddress.IPv6Address(u"2001:db8:42::70b4"))
42540766411362381960998550477184463028L
>>> int(ipaddress.IPv6Address(u"2001:db8:42::6"))
42540766411362381960998550477184434182L
>>> int(ipaddress.IPv4Address(u"10.0.0.42"))
167772202
>>> int(ipaddress.IPv4Address(u"10.0.0.42"))
167772202
>> table_cam_add_entry realmain_v4_networks_0 realmain.set_egress_port 167772202 => 16 0 0 0 0
fields = [(u'hit', 1), (u'action_run', 3), (u'out_port', 8), (u'out_port', 8), (u'mac_addr', 48), (u'task', 16), (u'table_id', 16)]
action_name = TopPipe.realmain.set_egress_port
field_vals = [1, '16', '0', '0', '0', '0']
CAM_Init_ValidateContext() - done
WROTE 0x44020250 = 0xa00002a
WROTE 0x44020280 = 0x0000
WROTE 0x44020284 = 0x0000
WROTE 0x44020288 = 0x10000000
WROTE 0x4402028c = 0x0001
READ 0x44020244 = 0x0001
WROTE 0x44020240 = 0x0001
READ 0x44020244 = 0x0001
READ 0x44020244 = 0x0001
success
>>
>>> int(ipaddress.IPv4Address(u"10.0.0.4"))
167772164
>> table_cam_add_entry realmain_v4_networks_0 realmain.set_egress_port 167772164 => 16 0 0 0 0
fields = [(u'hit', 1), (u'action_run', 3), (u'out_port', 8), (u'out_port', 8), (u'mac_addr', 48), (u'task', 16), (u'table_id', 16)]
action_name = TopPipe.realmain.set_egress_port
field_vals = [1, '16', '0', '0', '0', '0']
CAM_Init_ValidateContext() - done
WROTE 0x44020250 = 0xa000004
WROTE 0x44020280 = 0x0000
WROTE 0x44020284 = 0x0000
WROTE 0x44020288 = 0x10000000
WROTE 0x4402028c = 0x0001
READ 0x44020244 = 0x0001
WROTE 0x44020240 = 0x0001
READ 0x44020244 = 0x0001
READ 0x44020244 = 0x0001
success
>>
#+END_CENTER
*** 2019-07-31: reading about \verb vs. \texttt
- probably want \verb, but cannot use in \newcommand
** The NetPFGA saga ** The NetPFGA saga
Problems encountered: Problems encountered:
- The logfile for a compile run is 10k+ lines - The logfile for a compile run is 10k+ lines

View File

@ -74,7 +74,6 @@ control RealMain(
#include "netpfga_nat64.p4" #include "netpfga_nat64.p4"
} }
} }

View File

@ -2,61 +2,61 @@ bool apply_v6networks = false;
bool apply_v4networks = false; bool apply_v4networks = false;
if(hdr.ipv6.isValid()) { if(hdr.ipv6.isValid()) {
apply_v6networks = true; apply_v6networks = true;
if(nat64.apply().hit) { /* generic / static nat64 done */ if(nat64.apply().hit) { /* generic / static nat64 done */
if(hdr.icmp6.isValid()) { if(hdr.icmp6.isValid()) {
nat64_icmp6_generic(); nat64_icmp6_generic();
if(hdr.icmp6.type == ICMP6_ECHO_REPLY) { if(hdr.icmp6.type == ICMP6_ECHO_REPLY) {
hdr.icmp.type = ICMP_ECHO_REPLY; hdr.icmp.type = ICMP_ECHO_REPLY;
hdr.icmp.code = 0; hdr.icmp.code = 0;
}
if(hdr.icmp6.type == ICMP6_ECHO_REQUEST) {
hdr.icmp.type = ICMP_ECHO_REQUEST;
hdr.icmp.code = 0;
}
}
if(hdr.udp.isValid()) {
delta_udp_from_v6_to_v4
}
if(hdr.tcp.isValid()) {
delta_tcp_from_v6_to_v4
}
apply_v4networks = false;
apply_v6networks = true;
} }
} else if(hdr.ipv4.isValid()) { if(hdr.icmp6.type == ICMP6_ECHO_REQUEST) {
apply_v4networks = true; hdr.icmp.type = ICMP_ECHO_REQUEST;
hdr.icmp.code = 0;
if(nat46.apply().hit) {
if(hdr.icmp.isValid()) {
nat46_icmp_generic();
if(hdr.icmp.type == ICMP_ECHO_REPLY) {
hdr.icmp6.type = ICMP6_ECHO_REPLY;
}
if(hdr.icmp.type == ICMP_ECHO_REQUEST) {
hdr.icmp6.type = ICMP6_ECHO_REQUEST;
}
}
if(hdr.udp.isValid()) {
delta_udp_from_v4_to_v6
}
if(hdr.tcp.isValid()) {
delta_tcp_from_v4_to_v6
}
apply_v4networks = true;
apply_v6networks = false;
} }
} }
if(apply_v4networks == true) { if(hdr.udp.isValid()) {
v4_networks.apply(); delta_udp_from_v6_to_v4
} }
if(apply_v6networks == true) { if(hdr.tcp.isValid()) {
v6_networks.apply(); delta_tcp_from_v6_to_v4
} }
apply_v4networks = false;
apply_v6networks = true;
}
} else if(hdr.ipv4.isValid()) {
apply_v4networks = true;
if(nat46.apply().hit) {
if(hdr.icmp.isValid()) {
nat46_icmp_generic();
if(hdr.icmp.type == ICMP_ECHO_REPLY) {
hdr.icmp6.type = ICMP6_ECHO_REPLY;
}
if(hdr.icmp.type == ICMP_ECHO_REQUEST) {
hdr.icmp6.type = ICMP6_ECHO_REQUEST;
}
}
if(hdr.udp.isValid()) {
delta_udp_from_v4_to_v6
}
if(hdr.tcp.isValid()) {
delta_tcp_from_v4_to_v6
}
apply_v4networks = true;
apply_v6networks = false;
}
}
if(apply_v4networks == true) {
v4_networks.apply();
}
if(apply_v6networks == true) {
v6_networks.apply();
}