diff --git a/doc/Design.tex b/doc/Design.tex index ce3b8a2..48f8ed9 100644 --- a/doc/Design.tex +++ b/doc/Design.tex @@ -251,6 +251,12 @@ highest degree of flexibility, as it provides support for individual entries based on table entries and LPM table entries. % ---------------------------------------------------------------------- \section{\label{design:statefulnat64}Stateful NAT64} +\begin{figure}[h] + \includegraphics[scale=0.5]{p4switch-stateful} + \centering + \caption{Stateful NAT64 with P4} + \label{fig:p4switchstateful} +\end{figure} Similar to stateless NAT64, the design of stateful NAT64 depends on the features of the individual implementation. As pointed out in section \ref{background:transition:statefulnat64}, stateful NAT64 is very @@ -261,7 +267,9 @@ to solve this problem: \begin{itemize} \item For P4/BMV2 and P4/NetPFGA a python controller handles packets that don't have a table entry, sets the table entry in the P4 switch - and inserts the original packet afterwards back into the switch. + and inserts the original packet afterwards back into the + switch. Figure \ref{fig:p4switchstateful} shows the flow of a packet + with stateful translation in detail. \item With tayga we rely on the Linux kernel NAT44 capabilities \item Jool implements its own stateful mechanism based on port ranges diff --git a/doc/Thesis.pdf b/doc/Thesis.pdf index e641291..de82161 100644 Binary files a/doc/Thesis.pdf and b/doc/Thesis.pdf differ diff --git a/doc/graphviz/p4switch-stateful.dot b/doc/graphviz/p4switch-stateful.dot new file mode 100644 index 0000000..5dbec72 --- /dev/null +++ b/doc/graphviz/p4switch-stateful.dot @@ -0,0 +1,59 @@ +digraph G { + rankdir="TB"; + + v4host [ shape="box" label="IPv4 Host" ]; + v6host [ shape="box" label="IPv6 Host" ]; + rank=same; + + + parser [ label="Parser"]; + deparser [ label="Deparser"]; + translation [ label="Translation"]; + mismatch [ label="Table mismatch"]; + v4packet [ label="IPv6 Packet"]; + v4packet2 [ label="IPv4 Packet"]; + v6packet [ label="IPv6 Packet"]; + tableentry [ label="Create table entry" ]; + tablematch [ label="Table match" ]; + + reinject [ label="Reinject packet" ]; + controller [ label="Controller reads packet" ] + + deparser [ label="Deparser"]; + deparser2 [ label="Deparser"]; + + subgraph cluster_nat64 { + label="P4 Switch"; + + parser; + v4packet; + deparser; + mismatch; + tablematch; + translation; + deparser2; + + } + + subgraph cluster_p4controller { + label="P4 Controller"; + + controller; + tableentry; + reinject; + } + + v6host->v6packet->parser; + parser->v4packet; + v4packet->mismatch [ label="1." ]; + mismatch->deparser->controller; + controller->tableentry->reinject; + reinject->parser; + + v4packet->tablematch [ label="2." ]; + tablematch->translation->deparser2; + + deparser2->v4packet2->v4host; + + +}