From df2c52a37f56f83cbc7c65d4e36a92c56cbade44 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Sun, 18 Aug 2019 12:40:34 +0200 Subject: [PATCH] update all Signed-off-by: Nico Schottelius --- doc/Background.tex | 10 +- doc/Conclusion.tex | 11 + doc/Introduction.tex | 4 +- doc/Results.tex | 339 ++++++------------ doc/Thesis.pdf | Bin 1390238 -> 1394252 bytes doc/appendix.tex | 214 +++++++++++ doc/plan.org | 52 ++- ...01:db8:42::a00:2a-p2345-O10-t190-6-P1-run1 | 0 ...01:db8:42::a00:2a-p2345-O10-t190-6-P1-run2 | 0 ...8:42::a00:2a-p2345-O10-t190-6-P1-u-b0-run1 | 0 ...8:42::a00:2a-p2345-O10-t190-6-P1-u-b0-run2 | 0 ...1:db8:42::a00:2a-p2345-O10-t190-6-P10-run1 | 0 ...1:db8:42::a00:2a-p2345-O10-t190-6-P10-run2 | 0 ...:42::a00:2a-p2345-O10-t190-6-P10-u-b0-run1 | 0 ...:42::a00:2a-p2345-O10-t190-6-P10-u-b0-run2 | 0 ...1:db8:42::a00:2a-p2345-O10-t190-6-P20-run1 | 0 ...1:db8:42::a00:2a-p2345-O10-t190-6-P20-run2 | 0 ...:42::a00:2a-p2345-O10-t190-6-P20-u-b0-run1 | 0 ...:42::a00:2a-p2345-O10-t190-6-P20-u-b0-run2 | 0 ...1:db8:42::a00:2a-p2345-O10-t190-6-P50-run1 | 0 ...1:db8:42::a00:2a-p2345-O10-t190-6-P50-run2 | 0 ...:42::a00:2a-p2345-O10-t190-6-P50-u-b0-run1 | 0 ...rom-v4-c10.0.0.66-p2345-O10-t190-4-P1-run1 | 0 ...rom-v4-c10.0.0.66-p2345-O10-t190-4-P1-run2 | 0 ...rom-v4-c10.0.0.66-p2345-O10-t190-4-P1-run3 | 0 ...4-c10.0.0.66-p2345-O10-t190-4-P1-u-b0-run1 | 0 ...4-c10.0.0.66-p2345-O10-t190-4-P1-u-b0-run2 | 0 ...4-c10.0.0.66-p2345-O10-t190-4-P1-u-b0-run3 | 0 ...om-v4-c10.0.0.66-p2345-O10-t190-4-P10-run1 | 0 ...om-v4-c10.0.0.66-p2345-O10-t190-4-P10-run2 | 0 ...om-v4-c10.0.0.66-p2345-O10-t190-4-P10-run3 | 0 ...-c10.0.0.66-p2345-O10-t190-4-P10-u-b0-run1 | 0 ...-c10.0.0.66-p2345-O10-t190-4-P10-u-b0-run2 | 0 ...-c10.0.0.66-p2345-O10-t190-4-P10-u-b0-run3 | 0 ...om-v4-c10.0.0.66-p2345-O10-t190-4-P20-run1 | 0 ...om-v4-c10.0.0.66-p2345-O10-t190-4-P20-run2 | 0 ...om-v4-c10.0.0.66-p2345-O10-t190-4-P20-run3 | 0 ...-c10.0.0.66-p2345-O10-t190-4-P20-u-b0-run1 | 0 ...-c10.0.0.66-p2345-O10-t190-4-P20-u-b0-run2 | 0 ...-c10.0.0.66-p2345-O10-t190-4-P20-u-b0-run3 | 0 ...om-v4-c10.0.0.66-p2345-O10-t190-4-P50-run1 | 0 ...om-v4-c10.0.0.66-p2345-O10-t190-4-P50-run2 | 0 ...om-v4-c10.0.0.66-p2345-O10-t190-4-P50-run3 | 0 ...-c10.0.0.66-p2345-O10-t190-4-P50-u-b0-run1 | 0 ...-c10.0.0.66-p2345-O10-t190-4-P50-u-b0-run2 | 0 ...-c10.0.0.66-p2345-O10-t190-4-P50-u-b0-run3 | 0 46 files changed, 393 insertions(+), 237 deletions(-) rename iperf/{run5-netfpga => run5-netfpga-v6-to-v4}/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P1-run1 (100%) rename iperf/{run5-netfpga => run5-netfpga-v6-to-v4}/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P1-run2 (100%) rename iperf/{run5-netfpga => run5-netfpga-v6-to-v4}/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P1-u-b0-run1 (100%) rename iperf/{run5-netfpga => run5-netfpga-v6-to-v4}/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P1-u-b0-run2 (100%) rename iperf/{run5-netfpga => run5-netfpga-v6-to-v4}/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P10-run1 (100%) rename iperf/{run5-netfpga => run5-netfpga-v6-to-v4}/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P10-run2 (100%) rename iperf/{run5-netfpga => run5-netfpga-v6-to-v4}/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P10-u-b0-run1 (100%) rename iperf/{run5-netfpga => run5-netfpga-v6-to-v4}/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P10-u-b0-run2 (100%) rename iperf/{run5-netfpga => run5-netfpga-v6-to-v4}/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P20-run1 (100%) rename iperf/{run5-netfpga => run5-netfpga-v6-to-v4}/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P20-run2 (100%) rename iperf/{run5-netfpga => run5-netfpga-v6-to-v4}/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P20-u-b0-run1 (100%) rename iperf/{run5-netfpga => run5-netfpga-v6-to-v4}/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P20-u-b0-run2 (100%) rename iperf/{run5-netfpga => run5-netfpga-v6-to-v4}/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P50-run1 (100%) rename iperf/{run5-netfpga => run5-netfpga-v6-to-v4}/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P50-run2 (100%) rename iperf/{run5-netfpga => run5-netfpga-v6-to-v4}/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P50-u-b0-run1 (100%) rename iperf/{run6-netfpga => run6-netfpga-v4-to-v6}/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P1-run1 (100%) rename iperf/{run6-netfpga => run6-netfpga-v4-to-v6}/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P1-run2 (100%) rename iperf/{run6-netfpga => run6-netfpga-v4-to-v6}/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P1-run3 (100%) rename iperf/{run6-netfpga => run6-netfpga-v4-to-v6}/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P1-u-b0-run1 (100%) rename iperf/{run6-netfpga => run6-netfpga-v4-to-v6}/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P1-u-b0-run2 (100%) rename iperf/{run6-netfpga => run6-netfpga-v4-to-v6}/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P1-u-b0-run3 (100%) rename iperf/{run6-netfpga => run6-netfpga-v4-to-v6}/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P10-run1 (100%) rename iperf/{run6-netfpga => run6-netfpga-v4-to-v6}/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P10-run2 (100%) rename iperf/{run6-netfpga => run6-netfpga-v4-to-v6}/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P10-run3 (100%) rename iperf/{run6-netfpga => run6-netfpga-v4-to-v6}/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P10-u-b0-run1 (100%) rename iperf/{run6-netfpga => run6-netfpga-v4-to-v6}/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P10-u-b0-run2 (100%) rename iperf/{run6-netfpga => run6-netfpga-v4-to-v6}/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P10-u-b0-run3 (100%) rename iperf/{run6-netfpga => run6-netfpga-v4-to-v6}/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P20-run1 (100%) rename iperf/{run6-netfpga => run6-netfpga-v4-to-v6}/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P20-run2 (100%) rename iperf/{run6-netfpga => run6-netfpga-v4-to-v6}/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P20-run3 (100%) rename iperf/{run6-netfpga => run6-netfpga-v4-to-v6}/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P20-u-b0-run1 (100%) rename iperf/{run6-netfpga => run6-netfpga-v4-to-v6}/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P20-u-b0-run2 (100%) rename iperf/{run6-netfpga => run6-netfpga-v4-to-v6}/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P20-u-b0-run3 (100%) rename iperf/{run6-netfpga => run6-netfpga-v4-to-v6}/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P50-run1 (100%) rename iperf/{run6-netfpga => run6-netfpga-v4-to-v6}/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P50-run2 (100%) rename iperf/{run6-netfpga => run6-netfpga-v4-to-v6}/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P50-run3 (100%) rename iperf/{run6-netfpga => run6-netfpga-v4-to-v6}/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P50-u-b0-run1 (100%) rename iperf/{run6-netfpga => run6-netfpga-v4-to-v6}/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P50-u-b0-run2 (100%) rename iperf/{run6-netfpga => run6-netfpga-v4-to-v6}/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P50-u-b0-run3 (100%) diff --git a/doc/Background.tex b/doc/Background.tex index 12ad95c..a2cc1fa 100644 --- a/doc/Background.tex +++ b/doc/Background.tex @@ -9,14 +9,14 @@ bits that are parsed and then accessible in the (self) defined structures, also called headers. The general flow can be seen in figure \ref{fig:p4fromnsg}: a parser parses the incoming packet and prepares it for processing in the switching logic. Afterwards the -packets is output and deparsing of the parsed data might follow. +packets are output and deparsing of the parsed data might follow. In the context of NAT64 this is a very important feature: while the parser will read and parse in the ingress pipeline one protocol (f.i. IPv6), the deparser will output a different protocol (f.i. IPv4). \begin{figure}[h] \includegraphics[scale=0.9]{p4-from-nsg} \centering - \caption{P4 protocol independence, \cite{vanbever:_progr_networ_data_planes}} + \caption{P4 protocol independence~\cite{vanbever:_progr_networ_data_planes}} \label{fig:p4fromnsg} \end{figure} The \textit{target independence} is the second very powerful feature @@ -24,10 +24,12 @@ of P4: it allows code to be compiled to different targets. While in theory the P4 code should be completely target independent, in reality there are some modifications needed on a per-target basis and each target faces different restrictions. The challenges arising from this -are discussed in section \ref{conclusion:P4}. +are discussed in section \ref{results:p4}. As opposed to general purpose programming languages, P4 lacks some -features, most notably loops. However within its constraints, P4 can guarantee +features, most notably loops, floating point operations and the +modulo operator. +However within its constraints, P4 can guarantee operation at line speed, which general purpose programming languages cannot guarantee and also fail to achieve in reality (see section \ref{results:softwarenat64} for details). diff --git a/doc/Conclusion.tex b/doc/Conclusion.tex index 9c9e908..9fb66c1 100644 --- a/doc/Conclusion.tex +++ b/doc/Conclusion.tex @@ -52,3 +52,14 @@ technologie DNS64\cite{rfc6147} could also be implemented in P4, thus completing the translation mechanism. Proxies / higher level protocols could be next level + +Add helper in P4 to support checksum analysis a frequent problem and +helper +Allow ICMP6 option parsing: specify xtimes 64 bit blocks resulting in +an array + +Adding support for passing on meta information to controller: key or +table + +Support a meta language to define used types and/or export to popular languages. +Long term supporting python3 would be helpful. P4OS. diff --git a/doc/Introduction.tex b/doc/Introduction.tex index 39997d7..e7611cd 100644 --- a/doc/Introduction.tex +++ b/doc/Introduction.tex @@ -16,7 +16,9 @@ \chapter{\label{introduction}Introduction} In this chapter we give an introduction about the topic of the master -thesis, the motivation and problemes that we address. +thesis, the motivation and problemes that we address. We explain the +current state of IPv4 exhaustion and IPv6 adoption and describe how +it motivates our work to support ease transition to IPv6 networks. % ---------------------------------------------------------------------- \section{\label{introduction:ipv4ipv6}IPv4 exhaustion and IPv6 adoption} diff --git a/doc/Results.tex b/doc/Results.tex index 0699d74..36bf95a 100644 --- a/doc/Results.tex +++ b/doc/Results.tex @@ -12,7 +12,7 @@ objective of this thesis was to demonstrate the high speed capabilities of NAT64 in hardware, no benchmarks were performed on the P4 software implementation. % ---------------------------------------------------------------------- -\section{\label{results:p4}NAT64 Overview - FIXME: verify numbers} +\section{\label{results:p4}NAT64 Benchmarks - FIXME: explain numbers} We successfully implemented P4 code to realise NAT64\cite{schottelius:thesisrepo}. It contains parsers for all related protocols (ipv6, ipv4, udp, tcp, icmp, icmp6, ndp, @@ -24,47 +24,114 @@ Due to limitations in the P4 environment of the NetFPGA\cite{conclusion:netfpga} environment, the BMV2 implementation is more feature rich. Table \ref{tab:benchmark} summarises the achieved bandwidths of the NAT64 solutions. + + \begin{table}[htbp] \begin{center}\begin{minipage}{\textwidth} -\begin{tabular}{| c | c | c | c |} +\begin{tabular}{| c | c | c | c | c |} \hline -Solution & \multicolumn{3}{|c|}{Parallel connections} \\ - & 1 & 20 & 3 \\ +Implementation & \multicolumn{4}{|c|}{min/avg/max in Gbit/s} \\ \hline -Tayga & 3.02 & 3.28 & 2.85\\ +Tayga & 2.79 / 3.20 / 3.43 & 3.34 / 3.36 / 3.38 & 2.57 / 3.02 / 3.27 & +2.35 / 2.91 / 3.20 \\ \hline -Jool & 6.67 & 16.8 ?? & 20.5 udp?\\ +Jool & 8.22 / 8.22 / 8.22 & 8.21 / 8.21 / 8.22 & 8.21 / 8.23 / 8.25 +& 8.21 / 8.23 / 8.25\\ \hline -P4 / NetPFGA & 9.28 & 9.29 & 9.29\\ +P4 / NetPFGA & 9.28 / 9.28 / 9.29 & 9.28 / 9.28 / 9.29 & 9.28 / 9.28 +/ 9.29 & 9.28 / 9.28 / 9.29\\ +\hline +Parallel connections & 1 & 10 & 20 & 50 \\ \hline \end{tabular} \end{minipage} -\caption{NAT64 Benchmark (client: IPv6, server: IPv4), all results in Gbit/sec (\%loss)} +\caption{IPv6 to IPv4 TCP NAT64 Benchmark} \label{tab:benchmarkv6} \end{center} \end{table} + + During the benchmarks the client -- CPU usage \begin{table}[htbp] \begin{center}\begin{minipage}{\textwidth} -\begin{tabular}{| c | c | c | c |} +\begin{tabular}{| c | c | c | c | c |} \hline -Solution & \multicolumn{3}{|c|}{Parallel connections} \\ - & 1 & 20 & 3 \\ +Implementation & \multicolumn{4}{|c|}{min/avg/max in Gbit/s} \\ \hline -Tayga & 3.36 & 3.29 & 3.11 \\ +Tayga & 2.90 / 3.15 / 3.34 & 2.87 / 3.01 / 3.22 & +2.68 / 2.85 / 3.09 & 2.60 / 2.78 / 2.88 \\ \hline -Jool & 8.24 & 8.26 & 8.29\\ +Jool & 7.18 / 7.56 / 8.24 & 7.97 / 8.05 / 8.09 & +8.05 / 8.08 / 8.10 & 8.10 / 8.12 / 8.13 \\ \hline -P4 / NetPFGA & 9.28 & 9.29 & 9.29\\ +P4 / NetPFGA & 8.51 / 8.53 / 8.55 & 9.28 / 9.28 / 9.29 & 9.29 / 9.29 / +9.29 & 9.28 / 9.28 / 9.29 \\ +\hline +Parallel connections & 1 & 10 & 20 & 50 \\ \hline \end{tabular} \end{minipage} -\caption{NAT64 Benchmark (client: IPv4, server: IPv6), all results in Gbit/sec (\%loss)} +\caption{IPv4 to IPv6 TCP NAT64 Benchmark} \label{tab:benchmarkv4} \end{center} \end{table} +\begin{table}[htbp] +\begin{center}\begin{minipage}{\textwidth} +\begin{tabular}{| c | c | c | c | c |} +\hline +Implementation & \multicolumn{4}{|c|}{avg bandwidth in gbit/s / avg loss / + adjusted bandwith} \\ +\hline +Tayga & 8.02 / 70\% / 2.43 & 9.39 / 79\% / 1.97 & 15.43 / 86\% / 2.11 +& 19.27 / 91\% 1.73 \\ +\hline +Jool & 6.44 / 0\% / 6.41 & 6.37 / 2\% / 6.25 & +16.13 / 64\% / 5.75 & 20.83 / 71\% / 6.04 \\ +\hline +P4 / NetPFGA & 8.28 / 0\% / 8.28 & 9.26 / 0\% / 9.26 & +16.15 / 0\% / 16.15 & 15.8 / 0\% / 15.8 \\ +\hline +Parallel connections & 1 & 10 & 20 & 50 \\ +\hline +\end{tabular} +\end{minipage} +\caption{IPv6 to IPv4 UDP NAT64 Benchmark} +\label{tab:benchmarkv4} +\end{center} +\end{table} + + +\begin{table}[htbp] +\begin{center}\begin{minipage}{\textwidth} +\begin{tabular}{| c | c | c | c | c |} +\hline +Implementation & \multicolumn{4}{|c|}{avg bandwidth in gbit/s / avg loss / + adjusted bandwith} \\ +\hline +Tayga & 6.78 / 84\% / 1.06 & 9.58 / 90\% / 0.96 & +15.67 / 91\% / 1.41 & 20.77 / 95\% / 1.04 \\ +\hline +Jool & 4.53 / 0\% / 4.53 & 4.49 / 0\% / 4.49 & 13.26 / 0\% / 13.26 & +22.57 / 0\% / 22.57\\ +\hline +P4 / NetPFGA & 7.04 / 0\% / 7.04 & 9.58 / 0\% / 9.58 & +9.78 / 0\% / 9.78 & 14.37 / 0\% / 14.37\\ +\hline +Parallel connections & 1 & 10 & 20 & 50 \\ +\hline +\end{tabular} +\end{minipage} +\caption{IPv4 to IPv6 UDP NAT64 Benchmark} +\label{tab:benchmarkv4} +\end{center} +\end{table} + +UDP load generator hitting 100\% cpu at P20. +TCP confirmed. +Over bandwidth results + Feature comparison speed - sessions - eamt can act as host @@ -74,15 +141,17 @@ ping6 support ndp controller support +netpfga consistent % ---------------------------------------------------------------------- -\section{\label{Results:BMV2}BMV2} +\section{\label{Results:BMV2}BMV2 - FIXME: write better} The software implementation of P4 has most features, which is mostly due to the capability of checksumming the payload: Acting as a ``proper'' participant in NDP, requires the host to calculate checksums over the payload. -List of features: + +List of features BMV2 \cite{tab:p4bmv2features} \begin{table}[htbp] \begin{center}\begin{minipage}{\textwidth} @@ -144,6 +213,7 @@ Responds to icmp, icmp6 ndp \cite{rfc4861} arp +very easy to use Fully functional host Can compute checksums on its own. @@ -160,19 +230,9 @@ table entries. Jool and tayga are supported by -Trace files -\begin{verbatim} - create mode 100644 pcap/tcp-udp-delta-2019-07-17-1555-h1.pcap - create mode 100644 pcap/tcp-udp-delta-2019-07-17-1555-h3.pcap - create mode 100644 pcap/tcp-udp-delta-2019-07-17-1557-h1.pcap - create mode 100644 pcap/tcp-udp-delta-2019-07-17-1558-h3.pcap - - -\end{verbatim} - % ---------------------------------------------------------------------- -\section{\label{results:netpfga}NetFPGA} +\section{\label{results:netpfga}NetFPGA - FIXME: writing} The reduced feature set of the NetPFGA implementation is due to two factors: compile time. Between 2 to 6 hours per compile run. No payload checksum @@ -393,105 +453,28 @@ Renaming variables in the declaration of the parser or deparser lead to compilation errors. Function syntax is not supported. For this reason our implementation uses \texttt{\#define} statements instead of functions. - -\begin{verbatim} -*** DONE 2019-07-21: Proof of v6->v4 working delta based - CLOSED: [2019-07-21 Sun 12:30] -#+BEGIN_CENTER - pcap/tcp-udp-delta-from-v6-2019-07-21-0853-h1.pcap | Bin 0 -> 4252 bytes - pcap/tcp-udp-delta-from-v6-2019-07-21-0853-h3.pcap | Bin 0 -> 2544 bytes -#+END_CENTER - -\end{verbatim} - -\begin{verbatim} -**** DONE Testing v4->v6 tcp: ok (version 10.0) - CLOSED: [2019-08-04 Sun 09:15] -#+BEGIN_CENTER -nico@ESPRIMO-P956:~/master-thesis/bin$ ./socat-connect-tcp-v4 -+ echo from-v4-ok -+ socat - TCP:10.0.0.66:2345 -TCPv6-ok -nico@ESPRIMO-P956:~/master-thesis/bin$ ./socat-listen-tcp-v6 -from-v4-ok - -#+END_CENTER - -trace: -netfpga-nat64-2019-08-04-0907-enp2s0f0.pcap -netfpga-nat64-2019-08-04-0907-enp2s0f1.pcap - -**** DONE Testing v4->v6 udp: ok (version 10.1) -trace: - create mode 100644 pcap/netfpga-nat64-udp-2019-08-04-0913-enp2s0f0.pcap - create mode 100644 pcap/netfpga-nat64-udp-2019-08-04-0913-enp2s0f1.pcap - -\end{verbatim} - -\begin{verbatim} -*** DONE 2019-08-04: version 10.1/10.2: new maxpacketregion: v4->v6 works - CLOSED: [2019-08-04 Sun 19:42] -#+BEGIN_CENTER -nico@ESPRIMO-P956:~/master-thesis/bin$ ./init_ipv4_esprimo.sh -nico@ESPRIMO-P956:~/master-thesis/bin$ ./set_ipv4_neighbor.sh - -#+END_CENTER - -Test 20 first: - -- Does't work -> missed to add table entries -- Does work after setting table entries -- 300 works -- 1450 works -- 1500 does not work - -Proof: - - create mode 100644 pcap/netfpga-10.2-maxpacket-2019-08-04-1931-enp2s0f0.pcap - create mode 100644 pcap/netfpga-10.2-maxpacket-2019-08-04-1931-enp2s0f1.pcap - -\end{verbatim} - -\begin{verbatim} -*** DONE 2019-08-04: test v6 -> v4: works for 1420 - CLOSED: [2019-08-04 Sun 20:30] - -Proof: -#+BEGIN_CENTER - create mode 100644 pcap/netfpga-10.2-fromv6tov4-2019-08-04-1943-enp2s0f0.pcap - create mode 100644 pcap/netfpga-10.2-fromv6tov4-2019-08-04-1943-enp2s0f1.pcap - - -\end{verbatim} +FIXME: General result: limited NAT64 is working, however - - No Payload - checksumming - requires controller - - Hash funktion in Arbeit - - No NDP, no ARP - focused on key factors of NAT64 translation, - other features can be supported by controller - - + No Payload ; checksumming - requires controller +Hash funktion in Arbeit ; No NDP, no ARP - focused on key factors of NAT64 translation, +other features can be supported by controller Needed to debug internal parsing errors - debugging generated tcl code to debug impl1 error % ---------------------------------------------------------------------- -\section{\label{results:tayga}Tayga} +\section{\label{results:softwarenat64}Software NAT64 with Tayga and + Jool} +Both cpu bound. + During the benchmark cpu bound, single thread tayga: Single threaded +easy to use -% ---------------------------------------------------------------------- -\section{\label{results:jool}Jool} -kernel module - -100% cpu usage on 1 core for udp - +Jool kernel module +100\% cpu usage on 1 core for udp +0\% visible cpu usage for tcp, might be tcp offloading Integration with iptables - Requires routing % ---------------------------------------------------------------------- @@ -514,24 +497,7 @@ most often found in checksum problems. If frame checksum errors where displayed by tcpdump, usually the effective length of the packet was incorrect. - -NDP parsing problem - -checksumming a frequent problem and helper - - -IPv6: NDP: not easy to parse, as unknown number of following fields - -if things don't work, often a checksum problem. - -\begin{verbatim} -ipaddress.ip_network("2001:db8:61::/64") -IPv6Network(u'3230:3031:3a64:6238:3a36:313a:3a2f:3634/128') - -Fix: -from __future__ import unicode_literals - -\end{verbatim} +FIXMe: IPv6: NDP: not easy to parse, as unknown number of following fields The tooling around P4 is still fragile, encountered many bugs in the development.\cite{schottelius:github1675} @@ -539,107 +505,22 @@ in the development.\cite{schottelius:github1675} or missing features (\cite{schottelius:github745}, \cite{theojepsen:_get}) -Hitting expression bug +Hitting expression bug (FIXME: source) +1) Impossible to retrieve key from table: LPM: addr + mask -> addr and +mask might be used in controller -retrieving information from tables -\begin{verbatim} -Key and mask for matching destination is in table. We need this - information in the action. However this information is not exposed, so - we need to specify another parameter with the same information as in - the key(s). - - Log from slack: (2019-03-14) - - nico [1:55 PM] - If I use LPM for matching, can I easily get the network address from P4 or do I have to use a bitmask myself? In the latter case it is not exactly clear how to get the mask from the table - - Nate Foster [1:58 PM] - You want to retrieve the address in the packet? In a table? - And do you want to do the retrieving from the data plane or the control plane? (edited) - - nico [2:00 PM] - If I have a match in a table that matches on LPM, it can be any IP address in a network - For calculating the NAT64/NAT46 translation, I will need the base address, i.e. network address to do subtractions/additions - So it is fully data plane, what I would like to do - I'll commit sample code to show the use case more clearly - https://gitlab.ethz.ch/nicosc/master-thesis/blob/master/p4src/static-mapping.p4#L73 - GitLab - p4src/static-mapping.p4 · master · nicosc / master-thesis - gitlab.ethz.ch - So the action nat64_static() is used in the table v6_networks. - In v6_networks I use a match on `hdr.ipv6.dst_addr: lpm;` - What I would like to be able is to get the network address ; I can do that manually, if I have the mask - I can also re-inject this parameter by another action argument, but I'd assume that I can somewhere read this out from the table / match - - Nate Foster [2:15 PM] - To make sure I understand, in the data plane, you want to retrieve the address in the lpm pattern? (edited) - - nico [2:16 PM] - I want to retrieve the key - - Nate Foster [2:16 PM] - Wait. The value `hdr.ipv6.dst_addr` is the thing used in the match. - So you have that. - What you don’t have is the IPv6 address and mask put into the table by the control plane. - I assume you want the latter, right? - - nico [2:17 PM] - For example, if my matching key is 2001:db8::/32 and the real address is 2001:db8::f00, then I would like to retrieve 2001:db8:: and 32 from the table - exactly :slightly_smiling_face: - I can "fix" this by adding another argument, but it feels somewhat wrong to do that - Because the table already knows this information - - Nate Foster [2:26 PM] - I can’t think of a way other than the action parameter hack. - - nico [2:26 PM] - Oh, ok - Is it because the information is "lost in hardware"? - - Nate Foster [2:31 PM] - No you’re right that most implementations have the value in memory. And one can imagine a different table API that allowed one to retrieve it in the data plane. - But unless I am missing something obvious, P4 hides it… - -\end{verbatim} - -no meta information -\begin{verbatim} -Is there any meta information for "from which table was the action -called" available? My use case is having a debug action that sends -packets to the controller and I use it as a default_action in various -tables; however know I don't know anymore from which table the action -was called. Is there any kind of meta information which table called -me available? - -I could work around this by using if(! .. .hit) { my_action(table_id) -}, but it would not work with using default_action = ... - -\end{verbatim} - -type definitions separate - Code sharing (controller, switch) -\begin{verbatim} -*** DONE Synchronisation with the controller - - Double data type definition -> might differ - - TYPE_CPU for ethernet - - Port ingress offset (9 vs. 16 bit) - -\end{verbatim} +2) retrieving information from tables : no meta information, don't +know which table matched +3) type definitions separate Code sharing (controller, switch) No switch in actions, No conditional execution in actions +Not directly related to P4, but supporting scripts are usually written in python2, however python2 +handles unicode strings differently and thus effects like an IPv6 +address ``changing'' happen. \cite{appendix:p4:python2unicode}. P4os - reusable code -\begin{verbatim} -Not addressed so far: how to create re-usable code fragments that can -be plugged in easily. There could be a hypothetical "P4OS" that -manages code fragments. This might include, but not limited to -downloading (signed?) source code, managing dependencies similar to -Linux package management, handling updates, etc. - -\end{verbatim} - idomatic problem: Security issue: not checking checksums before diff --git a/doc/Thesis.pdf b/doc/Thesis.pdf index 2e6dc58967be7b04e8b6070a6b379dd73c88f7fc..4dcbe95582ab292a1f240dd7bd6c79df260c1644 100644 GIT binary patch delta 63824 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 delta 60113 zcmZs?V{m0#*e#qL+qP}&*tU}nJGSi|+wNE$+wK^hPSUZhj%|H?&UwFj>)yImt5%IQ z$C}UjH)_oBJnL7iX5P6*qBuAkcScYz3>_#=Yt3O-2G#$F;lx>LRdF4s?c9nJJ&2OO ziY$cs%*K#t4!|%H=Qn#n_&`@gO1hJT8vPVT zQ7HRF2A31@MJzdwG%7=lg05kEhz8G#5@|g0Q)WDo4$Da{DY|~4geo0O2OL}qCK=RB zx)md(o6M4Z*Q;8BgvUZol+?c{Z45n)^^KPNt9qaeD`de411u^vEv89mIci0mav>nB zkQE+KB=a1)OAdjG=}pW-IxapFr$xfx<}DQhZEGe~C;?HxAL4R zSvHCDWR-*zWkvVHci9nuBom*3N5hW?xWWoUo}ndObb^gEIf_!@4~hR8g^RyMUHRlr3L1H{cLgw#rJ;}JMwf3 z*u##WD!Zf88D0B{ZMnZ>vtBcYi+G3YK3J;K49>dXr7@*BNymN1>g{ z2;~sJp0$tQ*^f6pth}QO5cc|NK;VN%lTbCV@O;Brx4r~i@)vEyF#0Hvf?f*Htg%m8 zt3;{r7`vYKhUmzh5@r2%zIi=zS9njx!W7NJ(j>(<$=G~o-9fh{x&(TZhV=FK#7czQ zh{usaG1&*0lAN4{lxv-QJ%+b0WDFSo^xmP*Xpb%Ru)Y00S!GHTl3Md|d`=|wq}=)O zVC%sJd!r|f@S52B+h2c`is4Vc=Qi@HmY~ksena(^y(ZbJcDc4@8+F9BVySc znZqWUw14UaGj5b<&gFxQlNT$ji7d^-yf0;d&RN>PgxewHpF6MR)Z3YWE-t{i_x zQ<(D9Ub{0qMR{aMevkRMI>s0lp^PsKx}c<=h_BVz>o0^c!R&!hxIcs@XHVQwe=l;h z4TmrQLrhCigx=Kire-AD8e*Q@u^xw8a2_0w8hcq?U&I3({U(Twnh!@)0r$ zkxq<(3CYIJ#gj1;1wjYOT5~Ao!4158#ncaOt`{OWWEOOgmZQlUkC)2YK*(xGq7R}K zDf54AVEY}Il0M~7W;2L22H^MmnEnyuZVxy;1JhUCl9lCrZ+v|Z^Kj+Oh zQOs#QX@mwVNQ(pUl3Tzpyq>u=47lBoL`agRt<$=m=R;jSO3~YGk9=))Vy(Z#Hcm=A zO*1uSU*f)D(?Xh@OM8y!?Fv<2bJd6MBj|MN1-w9d8UcRWxA{Ts6!~kYc2HY0*f{9QClLqa`_8(@h_igIxKpV=*Y#~D=}N9zTcA}E z`lW111H|kDN4@myRce43v+vL&*S1%Fo@#-<6(p4l%6O&1_ym%C7N?Y7BU`$^dyu=B zj=~cCX*~v-#B*)T9LYxf8NMD05~{a7l-|3*u!(fnF3SORvm}<#$lQ>Y;!n>9&GOU` z@#0eJ5DM|EHDodkQ2tE+CORE)sY840kv=;BGpp-)mzPTYrE`I$!;HJC#6?3bmwk}Y zRpfEKV750|H)|fgx}AQv?Ds6#C4>56Hr=AaXLM}~O|rzEisb4ey;Ma6^(m*arFGcb zmud<24DUe@1$Oam8#rb+8LfmkZ|~CpeZu+4#PM_6wXCN{ev)XPhlJ=*an^wu(+2=- z!#Y00nEKHE-9L-N#E6BolWBA|lB$OMHJzTADRhdi(IiGs%5T~q;j-dJp{WP;8O3}= z&H90~#nHw!LvkrfHseLyq`7|;q?9^zLVHX`Czk?xGTfrlYa@$KS2g6rF=g=kxkV?a zu69cMryX{Wv5p=-!C5aniT);RTmg68u=eHFr6hQ>#EHV>j1G-MB3h(dxRT(m($4te zdEQaGwZ7KQ8spiD3!(pGq57x7c4wA5HG1LR#M3crP+>o_qn$&oFH-S-RLR2sT5 zPnqxle&X5EzI5<-ZvzZ{j{9C$2%k94ixh$&|31UAva(7{`ho5*2;v)LU}hrSLCcp6 z^8{&c6SVO+zD@UVFn9q#qX)2dIe!{tP02R~s^JO;PL?)o@V-24c-7x}9#w~ZTPw&b z!?B2sYXtRO8(`Wq9S%�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 Mg`Qqk6@>D?0D^7M`~Uy| diff --git a/doc/appendix.tex b/doc/appendix.tex index 404eb67..02f6af6 100644 --- a/doc/appendix.tex +++ b/doc/appendix.tex @@ -2324,6 +2324,92 @@ Proof of stuff working, reference for each stage / feature Stuff that needs to be cleaned up + +% ---------------------------------------------------------------------- +\subsection{P4/BMV NAT64 Delta based traces} +\begin{verbatim} +*** DONE 2019-07-21: Proof of v6->v4 working delta based + CLOSED: [2019-07-21 Sun 12:30] +#+BEGIN_CENTER + pcap/tcp-udp-delta-from-v6-2019-07-21-0853-h1.pcap | Bin 0 -> 4252 bytes + pcap/tcp-udp-delta-from-v6-2019-07-21-0853-h3.pcap | Bin 0 -> 2544 bytes +#+END_CENTER + +\end{verbatim} + + +\begin{verbatim} + create mode 100644 pcap/tcp-udp-delta-2019-07-17-1555-h1.pcap + create mode 100644 pcap/tcp-udp-delta-2019-07-17-1555-h3.pcap + create mode 100644 pcap/tcp-udp-delta-2019-07-17-1557-h1.pcap + create mode 100644 pcap/tcp-udp-delta-2019-07-17-1558-h3.pcap +\end{verbatim} + + +% ---------------------------------------------------------------------- +\subsection{P4/NetFPGA NAT64 Delta based traces} +\begin{verbatim} +**** DONE Testing v4->v6 tcp: ok (version 10.0) + CLOSED: [2019-08-04 Sun 09:15] +#+BEGIN_CENTER +nico@ESPRIMO-P956:~/master-thesis/bin$ ./socat-connect-tcp-v4 ++ echo from-v4-ok ++ socat - TCP:10.0.0.66:2345 +TCPv6-ok +nico@ESPRIMO-P956:~/master-thesis/bin$ ./socat-listen-tcp-v6 +from-v4-ok + +#+END_CENTER + +trace: +netfpga-nat64-2019-08-04-0907-enp2s0f0.pcap +netfpga-nat64-2019-08-04-0907-enp2s0f1.pcap + +**** DONE Testing v4->v6 udp: ok (version 10.1) +trace: + create mode 100644 pcap/netfpga-nat64-udp-2019-08-04-0913-enp2s0f0.pcap + create mode 100644 pcap/netfpga-nat64-udp-2019-08-04-0913-enp2s0f1.pcap + +\end{verbatim} + +Bigger packets +\begin{verbatim} +*** DONE 2019-08-04: version 10.1/10.2: new maxpacketregion: v4->v6 works + CLOSED: [2019-08-04 Sun 19:42] +#+BEGIN_CENTER +nico@ESPRIMO-P956:~/master-thesis/bin$ ./init_ipv4_esprimo.sh +nico@ESPRIMO-P956:~/master-thesis/bin$ ./set_ipv4_neighbor.sh + +#+END_CENTER + +Test 20 first: + +- Does't work -> missed to add table entries +- Does work after setting table entries +- 300 works +- 1450 works +- 1500 does not work + +Proof: + + create mode 100644 pcap/netfpga-10.2-maxpacket-2019-08-04-1931-enp2s0f0.pcap + create mode 100644 pcap/netfpga-10.2-maxpacket-2019-08-04-1931-enp2s0f1.pcap + +\end{verbatim} +\begin{verbatim} +*** DONE 2019-08-04: test v6 -> v4: works for 1420 + CLOSED: [2019-08-04 Sun 20:30] + +Proof: +#+BEGIN_CENTER + create mode 100644 pcap/netfpga-10.2-fromv6tov4-2019-08-04-1943-enp2s0f0.pcap + create mode 100644 pcap/netfpga-10.2-fromv6tov4-2019-08-04-1943-enp2s0f1.pcap + + +\end{verbatim} + +% ---------------------------------------------------------------------- + \section{Introduction} \subsection{\label{introduction:taskdescription}The Task} @@ -2362,6 +2448,134 @@ Describe your task. \end{verbatim} +% ---------------------------------------------------------------------- +\section{\label{appendix:p4}P4 notes} +% ---------------------------------------------------------------------- +\subsection{\label{appendix:p4:keyretrieval}Key retrieval chat log} +\begin{verbatim} +Key and mask for matching destination is in table. We need this + information in the action. However this information is not exposed, so + we need to specify another parameter with the same information as in + the key(s). + + Log from slack: (2019-03-14) + + nico [1:55 PM] + If I use LPM for matching, can I easily get the network address from P4 or do I have to use a bitmask myself? In the latter case it is not exactly clear how to get the mask from the table + + Nate Foster [1:58 PM] + You want to retrieve the address in the packet? In a table? + And do you want to do the retrieving from the data plane or the control plane? (edited) + + nico [2:00 PM] + If I have a match in a table that matches on LPM, it can be any IP address in a network + For calculating the NAT64/NAT46 translation, I will need the base address, i.e. network address to do subtractions/additions + So it is fully data plane, what I would like to do + I'll commit sample code to show the use case more clearly + https://gitlab.ethz.ch/nicosc/master-thesis/blob/master/p4src/static-mapping.p4#L73 + GitLab + p4src/static-mapping.p4 · master · nicosc / master-thesis + gitlab.ethz.ch + So the action nat64_static() is used in the table v6_networks. + In v6_networks I use a match on `hdr.ipv6.dst_addr: lpm;` + What I would like to be able is to get the network address ; I can do that manually, if I have the mask + I can also re-inject this parameter by another action argument, but I'd assume that I can somewhere read this out from the table / match + + Nate Foster [2:15 PM] + To make sure I understand, in the data plane, you want to retrieve the address in the lpm pattern? (edited) + + nico [2:16 PM] + I want to retrieve the key + + Nate Foster [2:16 PM] + Wait. The value `hdr.ipv6.dst_addr` is the thing used in the match. + So you have that. + What you don’t have is the IPv6 address and mask put into the table by the control plane. + I assume you want the latter, right? + + nico [2:17 PM] + For example, if my matching key is 2001:db8::/32 and the real address is 2001:db8::f00, then I would like to retrieve 2001:db8:: and 32 from the table + exactly :slightly_smiling_face: + I can "fix" this by adding another argument, but it feels somewhat wrong to do that + Because the table already knows this information + + Nate Foster [2:26 PM] + I can’t think of a way other than the action parameter hack. + + nico [2:26 PM] + Oh, ok + Is it because the information is "lost in hardware"? + + Nate Foster [2:31 PM] + No you’re right that most implementations have the value in memory. And one can imagine a different table API that allowed one to retrieve it in the data plane. + But unless I am missing something obvious, P4 hides it… + +\end{verbatim} + +% ---------------------------------------------------------------------- +\subsection{\label{appendix:p4:tableretrieval}Table retrieval problem} +\begin{verbatim} +Is there any meta information for "from which table was the action +called" available? My use case is having a debug action that sends +packets to the controller and I use it as a default_action in various +tables; however know I don't know anymore from which table the action +was called. Is there any kind of meta information which table called +me available? + +I could work around this by using if(! .. .hit) { my_action(table_id) +}, but it would not work with using default_action = ... + +\end{verbatim} + +\begin{verbatim} +Is there any meta information for "from which table was the action +called" available? My use case is having a debug action that sends +packets to the controller and I use it as a default_action in various +tables; however know I don't know anymore from which table the action +was called. Is there any kind of meta information which table called +me available? + +I could work around this by using if(! .. .hit) { my_action(table_id) +}, but it would not work with using default_action = ... + +\end{verbatim} +% ---------------------------------------------------------------------- +\subsection{\label{appendix:p4:datadefinition}Data definition + redundancy} +\begin{verbatim} +*** DONE Synchronisation with the controller + - Double data type definition -> might differ + - TYPE_CPU for ethernet + - Port ingress offset (9 vs. 16 bit) + +\end{verbatim} + +% ---------------------------------------------------------------------- +\subsection{\label{appendix:p4:python2unicode + }Python2 unicode issue} + +\begin{verbatim} +ipaddress.ip_network("2001:db8:61::/64") +IPv6Network(u'3230:3031:3a64:6238:3a36:313a:3a2f:3634/128') + +Fix: +from __future__ import unicode_literals + +\end{verbatim} +% ---------------------------------------------------------------------- +\subsection{\label{appendix:p4:p4os}P4 OS} + +\begin{verbatim} +Not addressed so far: how to create re-usable code fragments that can +be plugged in easily. There could be a hypothetical "P4OS" that +manages code fragments. This might include, but not limited to +downloading (signed?) source code, managing dependencies similar to +Linux package management, handling updates, etc. + +\end{verbatim} + + + %--------------------------------------------------------------------------------------------------------- \printnomenclature \abbrev{ARP}{Address resolution protocol} diff --git a/doc/plan.org b/doc/plan.org index 3718509..bf357fc 100644 --- a/doc/plan.org +++ b/doc/plan.org @@ -3372,7 +3372,6 @@ nico@ESPRIMO-P956:~/master-thesis/iperf/run7-jool$ ../../bin/benchmark-run.sh tayga 2001:db8:23::a00:2a 2345 - * TODO Thesis documentation ** Introduction *** Related work @@ -9345,10 +9344,57 @@ nico@nsg-System:~/projects/P4-NetFPGA/contrib-projects/sume-sdnet-switch/project | Introduction | 1 day | okayish | | Background | 1 day | okayish | | Design | 1-2 days | okayish | -| Results | 2-3 days | 2019-08-13 | -| Conclusion | 1 day | 2019-08-14 | +| Results | 2-3 days | okayish | +| Conclusion | 1 day | okayish | | Proof reading | 2-3 days | until 2019-08-17 | | SUM(max) | 12d | | +** Big steps +*** TODO Enhance Design section +*** TODO Write / describe results +*** TODO Fix smaller bugs +*** TODO Cleanup appendix +*** TODO Put figures and code into context +** Corrections v2 +*** TODO Perhaps you could place figure 1.3 and 1.4 next to each other (as subfigures). Would make it easier to see the differences. +*** DONE Will there be an overview section in 1? E.g., about the next chapters. + CLOSED: [2019-08-18 Sun 12:35] +*** DONE P 13: the packets is -> the packets are + CLOSED: [2019-08-18 Sun 12:36] +*** DONE P 13: missing references to other sections + CLOSED: [2019-08-18 Sun 12:37] +*** DONE P 13: perhaps mention some more missing features, e.g. floating point operations + CLOSED: [2019-08-18 Sun 12:38] +*** TODO P 13: detail, make sure that spacing around citations is consistent. I would use: text~\cite{...} +*** TODO P 13: missing closing parentheses after [13] +*** TODO P 14: figures 2.3 and 2.2 -> 2.2 and 2.3 +*** TODO P 14: why do you compare ARP and NDP to P4? +*** TODO P 15: missing reference +*** TODO P 15: the quote - perhaps put it in quotation marks. Instead of the footnote perhaps a bib entry? +*** TODO P 15: mtu vs. MTU (I would write MTU) +*** TODO P 16: missing reference +*** TODO P 16: tcp -> TCP +*** TODO P 17: the checksums for TCP and UDP is -> are +*** TODO P 17: I’m not sure if it is completely true that you cannot access the payload in the NetFPGA. It is perhaps just not yet implemented… +*** TODO P 18: missing closing parentheses +*** TODO P 18: missing references +*** TODO P 18: Perhaps the network design section should be moved out of the background section as it already contains ideas/discussion related to your implementation? +*** TODO P 21: on it own -> on its own +*** TODO P 21: the use of a control -> of a controller +*** TODO P 22+: passive -> active voice +*** TODO P 22: if you show code, make sure you also explain it in the text +*** TODO P 22: add quotation marks to the quote. Make sure you cite it in the same way as the previous quote +*** DONE P 23: perhaps move benchmark results to chapter 4? + CLOSED: [2019-08-17 Sat 15:01] +*** TODO P 25: missing reference +*** TODO P 25: explain/interpret the reported numbers +*** TODO P 25/26: personally, I would report things such as the BMV2 feature list (table 4.3) before the result section. Obviously these are „results” but not really e.g., measurements. +*** TODO P 28: this „crashes” -> these +*** TODO P 28: NetFGPA -> NetFPGA +*** TODO P 28: here you speak about the speed of your system that is nearly at the line rate of the NetFPGA but I’m not really sure if you previously introduced what the NetFPGA is capable of. Perhaps you could have a short section in the background section? +*** TODO P 29: Section 4.3.4: Although very interesting contentwise, the text could be a bit better structured/combined. Perhaps you can also adapt the title. Once again I’m not completely sure if the results section is the best place for this text. Perhaps you would need an additional chapter between design and results.General: +*** TODO I’m not a huge fan of placing the figures in the middle of ongoing text (sometimes even breaking ongoing sentences). I would rather place them e.g., at the top of the page. +*** TODO A lot of figure captions are quite pointless, e.g. „IPv6 Pseudo Header”. Try to extend them a bit. +*** TODO I know that the design section is probably not yet finished but it would be nice if it would be a bit longer. After all, this is your main work. * DONE Initial administration ** DONE Clarify PDF / form with Denise Spicher: free form description ** DONE Create task description to be handed in mystudies diff --git a/iperf/run5-netfpga/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P1-run1 b/iperf/run5-netfpga-v6-to-v4/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P1-run1 similarity index 100% rename from iperf/run5-netfpga/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P1-run1 rename to iperf/run5-netfpga-v6-to-v4/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P1-run1 diff --git a/iperf/run5-netfpga/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P1-run2 b/iperf/run5-netfpga-v6-to-v4/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P1-run2 similarity index 100% rename from iperf/run5-netfpga/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P1-run2 rename to iperf/run5-netfpga-v6-to-v4/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P1-run2 diff --git a/iperf/run5-netfpga/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P1-u-b0-run1 b/iperf/run5-netfpga-v6-to-v4/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P1-u-b0-run1 similarity index 100% rename from iperf/run5-netfpga/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P1-u-b0-run1 rename to iperf/run5-netfpga-v6-to-v4/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P1-u-b0-run1 diff --git a/iperf/run5-netfpga/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P1-u-b0-run2 b/iperf/run5-netfpga-v6-to-v4/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P1-u-b0-run2 similarity index 100% rename from iperf/run5-netfpga/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P1-u-b0-run2 rename to iperf/run5-netfpga-v6-to-v4/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P1-u-b0-run2 diff --git a/iperf/run5-netfpga/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P10-run1 b/iperf/run5-netfpga-v6-to-v4/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P10-run1 similarity index 100% rename from iperf/run5-netfpga/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P10-run1 rename to iperf/run5-netfpga-v6-to-v4/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P10-run1 diff --git a/iperf/run5-netfpga/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P10-run2 b/iperf/run5-netfpga-v6-to-v4/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P10-run2 similarity index 100% rename from iperf/run5-netfpga/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P10-run2 rename to iperf/run5-netfpga-v6-to-v4/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P10-run2 diff --git a/iperf/run5-netfpga/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P10-u-b0-run1 b/iperf/run5-netfpga-v6-to-v4/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P10-u-b0-run1 similarity index 100% rename from iperf/run5-netfpga/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P10-u-b0-run1 rename to iperf/run5-netfpga-v6-to-v4/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P10-u-b0-run1 diff --git a/iperf/run5-netfpga/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P10-u-b0-run2 b/iperf/run5-netfpga-v6-to-v4/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P10-u-b0-run2 similarity index 100% rename from iperf/run5-netfpga/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P10-u-b0-run2 rename to iperf/run5-netfpga-v6-to-v4/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P10-u-b0-run2 diff --git a/iperf/run5-netfpga/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P20-run1 b/iperf/run5-netfpga-v6-to-v4/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P20-run1 similarity index 100% rename from iperf/run5-netfpga/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P20-run1 rename to iperf/run5-netfpga-v6-to-v4/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P20-run1 diff --git a/iperf/run5-netfpga/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P20-run2 b/iperf/run5-netfpga-v6-to-v4/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P20-run2 similarity index 100% rename from iperf/run5-netfpga/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P20-run2 rename to iperf/run5-netfpga-v6-to-v4/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P20-run2 diff --git a/iperf/run5-netfpga/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P20-u-b0-run1 b/iperf/run5-netfpga-v6-to-v4/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P20-u-b0-run1 similarity index 100% rename from iperf/run5-netfpga/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P20-u-b0-run1 rename to iperf/run5-netfpga-v6-to-v4/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P20-u-b0-run1 diff --git a/iperf/run5-netfpga/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P20-u-b0-run2 b/iperf/run5-netfpga-v6-to-v4/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P20-u-b0-run2 similarity index 100% rename from iperf/run5-netfpga/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P20-u-b0-run2 rename to iperf/run5-netfpga-v6-to-v4/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P20-u-b0-run2 diff --git a/iperf/run5-netfpga/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P50-run1 b/iperf/run5-netfpga-v6-to-v4/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P50-run1 similarity index 100% rename from iperf/run5-netfpga/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P50-run1 rename to iperf/run5-netfpga-v6-to-v4/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P50-run1 diff --git a/iperf/run5-netfpga/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P50-run2 b/iperf/run5-netfpga-v6-to-v4/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P50-run2 similarity index 100% rename from iperf/run5-netfpga/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P50-run2 rename to iperf/run5-netfpga-v6-to-v4/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P50-run2 diff --git a/iperf/run5-netfpga/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P50-u-b0-run1 b/iperf/run5-netfpga-v6-to-v4/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P50-u-b0-run1 similarity index 100% rename from iperf/run5-netfpga/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P50-u-b0-run1 rename to iperf/run5-netfpga-v6-to-v4/iperf-netfpga-from-v6-c2001:db8:42::a00:2a-p2345-O10-t190-6-P50-u-b0-run1 diff --git a/iperf/run6-netfpga/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P1-run1 b/iperf/run6-netfpga-v4-to-v6/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P1-run1 similarity index 100% rename from iperf/run6-netfpga/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P1-run1 rename to iperf/run6-netfpga-v4-to-v6/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P1-run1 diff --git a/iperf/run6-netfpga/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P1-run2 b/iperf/run6-netfpga-v4-to-v6/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P1-run2 similarity index 100% rename from iperf/run6-netfpga/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P1-run2 rename to iperf/run6-netfpga-v4-to-v6/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P1-run2 diff --git a/iperf/run6-netfpga/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P1-run3 b/iperf/run6-netfpga-v4-to-v6/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P1-run3 similarity index 100% rename from iperf/run6-netfpga/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P1-run3 rename to iperf/run6-netfpga-v4-to-v6/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P1-run3 diff --git a/iperf/run6-netfpga/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P1-u-b0-run1 b/iperf/run6-netfpga-v4-to-v6/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P1-u-b0-run1 similarity index 100% rename from iperf/run6-netfpga/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P1-u-b0-run1 rename to iperf/run6-netfpga-v4-to-v6/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P1-u-b0-run1 diff --git a/iperf/run6-netfpga/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P1-u-b0-run2 b/iperf/run6-netfpga-v4-to-v6/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P1-u-b0-run2 similarity index 100% rename from iperf/run6-netfpga/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P1-u-b0-run2 rename to iperf/run6-netfpga-v4-to-v6/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P1-u-b0-run2 diff --git a/iperf/run6-netfpga/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P1-u-b0-run3 b/iperf/run6-netfpga-v4-to-v6/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P1-u-b0-run3 similarity index 100% rename from iperf/run6-netfpga/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P1-u-b0-run3 rename to iperf/run6-netfpga-v4-to-v6/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P1-u-b0-run3 diff --git a/iperf/run6-netfpga/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P10-run1 b/iperf/run6-netfpga-v4-to-v6/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P10-run1 similarity index 100% rename from iperf/run6-netfpga/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P10-run1 rename to iperf/run6-netfpga-v4-to-v6/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P10-run1 diff --git a/iperf/run6-netfpga/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P10-run2 b/iperf/run6-netfpga-v4-to-v6/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P10-run2 similarity index 100% rename from iperf/run6-netfpga/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P10-run2 rename to iperf/run6-netfpga-v4-to-v6/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P10-run2 diff --git a/iperf/run6-netfpga/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P10-run3 b/iperf/run6-netfpga-v4-to-v6/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P10-run3 similarity index 100% rename from iperf/run6-netfpga/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P10-run3 rename to iperf/run6-netfpga-v4-to-v6/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P10-run3 diff --git a/iperf/run6-netfpga/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P10-u-b0-run1 b/iperf/run6-netfpga-v4-to-v6/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P10-u-b0-run1 similarity index 100% rename from iperf/run6-netfpga/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P10-u-b0-run1 rename to iperf/run6-netfpga-v4-to-v6/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P10-u-b0-run1 diff --git a/iperf/run6-netfpga/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P10-u-b0-run2 b/iperf/run6-netfpga-v4-to-v6/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P10-u-b0-run2 similarity index 100% rename from iperf/run6-netfpga/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P10-u-b0-run2 rename to iperf/run6-netfpga-v4-to-v6/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P10-u-b0-run2 diff --git a/iperf/run6-netfpga/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P10-u-b0-run3 b/iperf/run6-netfpga-v4-to-v6/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P10-u-b0-run3 similarity index 100% rename from iperf/run6-netfpga/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P10-u-b0-run3 rename to iperf/run6-netfpga-v4-to-v6/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P10-u-b0-run3 diff --git a/iperf/run6-netfpga/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P20-run1 b/iperf/run6-netfpga-v4-to-v6/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P20-run1 similarity index 100% rename from iperf/run6-netfpga/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P20-run1 rename to iperf/run6-netfpga-v4-to-v6/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P20-run1 diff --git a/iperf/run6-netfpga/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P20-run2 b/iperf/run6-netfpga-v4-to-v6/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P20-run2 similarity index 100% rename from iperf/run6-netfpga/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P20-run2 rename to iperf/run6-netfpga-v4-to-v6/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P20-run2 diff --git a/iperf/run6-netfpga/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P20-run3 b/iperf/run6-netfpga-v4-to-v6/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P20-run3 similarity index 100% rename from iperf/run6-netfpga/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P20-run3 rename to iperf/run6-netfpga-v4-to-v6/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P20-run3 diff --git a/iperf/run6-netfpga/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P20-u-b0-run1 b/iperf/run6-netfpga-v4-to-v6/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P20-u-b0-run1 similarity index 100% rename from iperf/run6-netfpga/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P20-u-b0-run1 rename to iperf/run6-netfpga-v4-to-v6/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P20-u-b0-run1 diff --git a/iperf/run6-netfpga/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P20-u-b0-run2 b/iperf/run6-netfpga-v4-to-v6/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P20-u-b0-run2 similarity index 100% rename from iperf/run6-netfpga/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P20-u-b0-run2 rename to iperf/run6-netfpga-v4-to-v6/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P20-u-b0-run2 diff --git a/iperf/run6-netfpga/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P20-u-b0-run3 b/iperf/run6-netfpga-v4-to-v6/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P20-u-b0-run3 similarity index 100% rename from iperf/run6-netfpga/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P20-u-b0-run3 rename to iperf/run6-netfpga-v4-to-v6/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P20-u-b0-run3 diff --git a/iperf/run6-netfpga/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P50-run1 b/iperf/run6-netfpga-v4-to-v6/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P50-run1 similarity index 100% rename from iperf/run6-netfpga/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P50-run1 rename to iperf/run6-netfpga-v4-to-v6/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P50-run1 diff --git a/iperf/run6-netfpga/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P50-run2 b/iperf/run6-netfpga-v4-to-v6/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P50-run2 similarity index 100% rename from iperf/run6-netfpga/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P50-run2 rename to iperf/run6-netfpga-v4-to-v6/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P50-run2 diff --git a/iperf/run6-netfpga/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P50-run3 b/iperf/run6-netfpga-v4-to-v6/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P50-run3 similarity index 100% rename from iperf/run6-netfpga/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P50-run3 rename to iperf/run6-netfpga-v4-to-v6/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P50-run3 diff --git a/iperf/run6-netfpga/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P50-u-b0-run1 b/iperf/run6-netfpga-v4-to-v6/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P50-u-b0-run1 similarity index 100% rename from iperf/run6-netfpga/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P50-u-b0-run1 rename to iperf/run6-netfpga-v4-to-v6/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P50-u-b0-run1 diff --git a/iperf/run6-netfpga/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P50-u-b0-run2 b/iperf/run6-netfpga-v4-to-v6/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P50-u-b0-run2 similarity index 100% rename from iperf/run6-netfpga/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P50-u-b0-run2 rename to iperf/run6-netfpga-v4-to-v6/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P50-u-b0-run2 diff --git a/iperf/run6-netfpga/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P50-u-b0-run3 b/iperf/run6-netfpga-v4-to-v6/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P50-u-b0-run3 similarity index 100% rename from iperf/run6-netfpga/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P50-u-b0-run3 rename to iperf/run6-netfpga-v4-to-v6/iperf-netfpga-from-v4-c10.0.0.66-p2345-O10-t190-4-P50-u-b0-run3