Adding P4 cheat cheet and its latex source files. (#201)
This commit is contained in:
parent
e3ef4d14db
commit
7ff3af57fb
BIN
p4-cheat-sheet.pdf
Normal file
BIN
p4-cheat-sheet.pdf
Normal file
Binary file not shown.
220
utils/cheat_sheet_src/main.tex
Normal file
220
utils/cheat_sheet_src/main.tex
Normal file
@ -0,0 +1,220 @@
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
% P4 Cheat Sheet
|
||||
%
|
||||
% By P4.org
|
||||
%
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
|
||||
\documentclass{article}
|
||||
|
||||
\usepackage{fontspec}
|
||||
\setmainfont{Utopia}
|
||||
\setsansfont{Free Helvetian}
|
||||
\setmonofont{Liberation Mono}
|
||||
|
||||
\usepackage[landscape]{geometry}
|
||||
\usepackage{url}
|
||||
\usepackage{multicol}
|
||||
\usepackage{amsmath}
|
||||
\usepackage{amsfonts}
|
||||
\usepackage{tikz}
|
||||
\usetikzlibrary{shapes}
|
||||
\usetikzlibrary{decorations.pathmorphing}
|
||||
\usepackage{amsmath,amssymb}
|
||||
|
||||
\usepackage{colortbl}
|
||||
\usepackage{xcolor}
|
||||
\usepackage{mathtools}
|
||||
\usepackage{amsmath,amssymb}
|
||||
\usepackage{enumitem}
|
||||
|
||||
% Define Colors
|
||||
\usepackage{color}
|
||||
\definecolor{eclipseBlue}{RGB}{42,0.0,255}
|
||||
\definecolor{eclipseGreen}{RGB}{63,127,95}
|
||||
\definecolor{eclipsePurple}{RGB}{127,0,85}
|
||||
|
||||
\usepackage{listings}
|
||||
|
||||
% Define Language
|
||||
\lstdefinelanguage{p4}
|
||||
{
|
||||
% list of keywords
|
||||
morekeywords={
|
||||
action, apply, bit, bool, const, control, default, else, enum, error, extern, exit, false, header, if, in, inout, int, match_kind, package, parser, out, return, select, state, struct, switch, table, transition, true, tuple, typedef, varbit, verify, void,
|
||||
},
|
||||
sensitive=true, % keywords are case-sensitive
|
||||
morecomment=[l]{//}, % l is for line comment
|
||||
morecomment=[s]{/*}{*/}, % s is for start and end delimiter
|
||||
morestring=[b]" % defines that strings are enclosed in double quotes
|
||||
}
|
||||
|
||||
% Set Language
|
||||
\lstset{
|
||||
language={p4},
|
||||
basicstyle=\small\ttfamily, % Global Code Style
|
||||
captionpos=b, % Position of the Caption (t for top, b for bottom)
|
||||
extendedchars=true, % Allows 256 instead of 128 ASCII characters
|
||||
tabsize=2, % number of spaces indented when discovering a tab
|
||||
columns=fixed, % make all characters equal width
|
||||
keepspaces=true, % does not ignore spaces to fit width, convert tabs to spaces
|
||||
showstringspaces=false, % lets spaces in strings appear as real spaces
|
||||
breaklines=true, % wrap lines if they don't fit
|
||||
commentstyle=\color{eclipseBlue}, % style of comments
|
||||
keywordstyle=\color{eclipsePurple}, % style of keywords
|
||||
stringstyle=\color{eclipseGreen}, % style of strings
|
||||
}
|
||||
|
||||
\title{P4 Cheat Sheet}
|
||||
\usepackage[brazilian]{babel}
|
||||
|
||||
\advance\topmargin-.8in
|
||||
\advance\textheight3in
|
||||
\advance\textwidth3in
|
||||
\advance\oddsidemargin-1.5in
|
||||
\advance\evensidemargin-1.5in
|
||||
\parindent0pt
|
||||
\parskip2pt
|
||||
\newcommand{\hr}{\centerline{\rule{3.5in}{1pt}}}
|
||||
%\colorbox[HTML]{e4e4e4}{\makebox[\textwidth-2\fboxsep][l]{texto}
|
||||
\begin{document}
|
||||
|
||||
\begin{center}{\huge{\bf \textsf{P4 Language Cheat Sheet}}}\\[.5em]
|
||||
%{\large By P4.org}
|
||||
\end{center}
|
||||
\begin{multicols*}{3}
|
||||
|
||||
\tikzstyle{mybox} = [draw=black, fill=white, very thick,
|
||||
rectangle, rounded corners, inner sep=10pt, inner ysep=10pt]
|
||||
\tikzstyle{fancytitle} =[fill=black, text=white, font=\bfseries]
|
||||
\tikzstyle{mybox2} = [draw=black, fill=white, very thick, rectangle split,
|
||||
rectangle split parts=2,
|
||||
rounded corners, inner sep=10pt, inner ysep=10pt]
|
||||
\tikzstyle{fancytitle2} =[fill=black, text=white, font=\bfseries]
|
||||
|
||||
%------------ DATA TYPES ---------------
|
||||
\begin{tikzpicture}
|
||||
\node [mybox] (box){%
|
||||
\begin{minipage}{0.3\textwidth}
|
||||
\lstinputlisting{src/data_types.txt}
|
||||
\end{minipage}
|
||||
};
|
||||
\node[fancytitle, right=10pt] at (box.north west) {Basic Data Types};
|
||||
\end{tikzpicture}
|
||||
|
||||
%------------ P4 Parsing ---------------
|
||||
\begin{tikzpicture}
|
||||
\node [mybox] (box){%
|
||||
\begin{minipage}{0.3\textwidth}
|
||||
\lstinputlisting{src/parsers.txt}
|
||||
\end{minipage}
|
||||
};
|
||||
\node[fancytitle, right=10pt] at (box.north west) {Parsing};
|
||||
\end{tikzpicture}
|
||||
|
||||
%------------ Expressions ---------------------
|
||||
\begin{tikzpicture}
|
||||
\node [mybox] (box){%
|
||||
\begin{minipage}{0.3\textwidth}
|
||||
\lstinputlisting{src/expressions.txt}
|
||||
\end{minipage}
|
||||
};
|
||||
\node[fancytitle, right=10pt] at (box.north west) {Statements \& Expressions};
|
||||
\end{tikzpicture}
|
||||
|
||||
%------------ Actions ---------------------
|
||||
\begin{tikzpicture}
|
||||
\node [mybox] (box){%
|
||||
\begin{minipage}{0.3\textwidth}
|
||||
\lstinputlisting{src/actions.txt}
|
||||
\end{minipage}
|
||||
};
|
||||
\node[fancytitle, right=10pt] at (box.north west) {Actions};
|
||||
\end{tikzpicture}
|
||||
|
||||
%------------ Tables ---------------------
|
||||
\begin{tikzpicture}
|
||||
\node [mybox] (box){%
|
||||
\begin{minipage}{0.3\textwidth}
|
||||
\lstinputlisting{src/tables.txt}
|
||||
\end{minipage}
|
||||
};
|
||||
\node[fancytitle, right=10pt] at (box.north west) {Tables};
|
||||
\end{tikzpicture}
|
||||
|
||||
%------------ Control Flow ---------------------
|
||||
\begin{tikzpicture}
|
||||
\node [mybox] (box){%
|
||||
\begin{minipage}{0.3\textwidth}
|
||||
\lstinputlisting{src/control_flow.txt}
|
||||
\end{minipage}
|
||||
};
|
||||
\node[fancytitle, right=10pt] at (box.north west) {Control Flow};
|
||||
\end{tikzpicture}
|
||||
|
||||
%------------ Deparsing ---------------------
|
||||
\begin{tikzpicture}
|
||||
\node [mybox] (box){%
|
||||
\begin{minipage}{0.3\textwidth}
|
||||
\lstinputlisting{src/deparsing.txt}
|
||||
\end{minipage}
|
||||
};
|
||||
\node[fancytitle, right=10pt] at (box.north west) {Deparsing};
|
||||
\end{tikzpicture}
|
||||
|
||||
%------------ Header Stacks ---------------------
|
||||
\begin{tikzpicture}
|
||||
\node [mybox] (box){%
|
||||
\begin{minipage}{0.3\textwidth}
|
||||
\lstinputlisting{src/header_stack.txt}
|
||||
\end{minipage}
|
||||
};
|
||||
\node[fancytitle, right=10pt] at (box.north west) {Header Stacks};
|
||||
\end{tikzpicture}
|
||||
|
||||
%------------ Advanced Parsing ---------------------
|
||||
\begin{tikzpicture}
|
||||
\node [mybox] (box){%
|
||||
\begin{minipage}{0.3\textwidth}
|
||||
\lstinputlisting{src/adv_parsing.txt}
|
||||
\end{minipage}
|
||||
};
|
||||
\node[fancytitle, right=10pt] at (box.north west) {Advanced Parsing};
|
||||
\end{tikzpicture}
|
||||
|
||||
%------------ V1Model - Architecture ---------------------
|
||||
\begin{tikzpicture}
|
||||
\node [mybox] (box){%
|
||||
\begin{minipage}{0.3\textwidth}
|
||||
\lstinputlisting{src/architecture.txt}
|
||||
\end{minipage}
|
||||
};
|
||||
\node[fancytitle, right=10pt] at (box.north west) {V1Model - Architecture};
|
||||
\end{tikzpicture}
|
||||
|
||||
%------------ V1Model - Standard Metadata ---------------------
|
||||
\begin{tikzpicture}
|
||||
\node [mybox] (box){%
|
||||
\begin{minipage}{0.3\textwidth}
|
||||
\lstinputlisting{src/v1model_std_metadata.txt}
|
||||
\end{minipage}
|
||||
};
|
||||
\node[fancytitle, right=10pt] at (box.north west) {V1Model - Standard Metadata};
|
||||
\end{tikzpicture}
|
||||
|
||||
%------------ V1Model - Counter Externs ---------------------
|
||||
\begin{tikzpicture}
|
||||
\node [mybox] (box){%
|
||||
\begin{minipage}{0.3\textwidth}
|
||||
\lstinputlisting{src/counters.txt}
|
||||
\end{minipage}
|
||||
};
|
||||
\node[fancytitle, right=10pt] at (box.north west) {V1Model - Counters \& Registers};
|
||||
\end{tikzpicture}
|
||||
|
||||
|
||||
|
||||
\end{multicols*}
|
||||
\end{document}
|
||||
Contact GitHub API Training Shop Blog About
|
||||
© 2016 GitHub, Inc. Terms Privacy Security Status Help
|
28
utils/cheat_sheet_src/src/actions.txt
Normal file
28
utils/cheat_sheet_src/src/actions.txt
Normal file
@ -0,0 +1,28 @@
|
||||
// Inputs provided by control-plane
|
||||
action set_next_hop(bit<32> next_hop) {
|
||||
if (next_hop == 0) {
|
||||
metadata.next_hop = hdr.ipv4.dst;
|
||||
} else {
|
||||
metadata.next_hop = next_hop;
|
||||
}
|
||||
}
|
||||
|
||||
// Inputs provided by data-plane
|
||||
action swap_mac(inout bit<48> x,
|
||||
inout bit<48> y) {
|
||||
bit<48> tmp = x;
|
||||
x = y;
|
||||
y = tmp;
|
||||
}
|
||||
|
||||
// Inputs provided by control/data-plane
|
||||
action forward(in bit<9> p, bit<48> d) {
|
||||
standard_metadata.egress_spec = p;
|
||||
headers.ethernet.dstAddr = d;
|
||||
}
|
||||
|
||||
// Remove header from packet
|
||||
action decap_ip_ip() {
|
||||
hdr.ipv4 = hdr.inner_ipv4;
|
||||
hdr.inner_ipv4.setInvalid();
|
||||
}
|
23
utils/cheat_sheet_src/src/adv_parsing.txt
Normal file
23
utils/cheat_sheet_src/src/adv_parsing.txt
Normal file
@ -0,0 +1,23 @@
|
||||
// common defns for IPv4 and IPv6
|
||||
header ip46_t {
|
||||
bit<4> version;
|
||||
bit<4> reserved;
|
||||
}
|
||||
|
||||
// header stack parsing
|
||||
state parse_labels {
|
||||
packet.extract(hdr.labels.next);
|
||||
transition select(hdr.labels.last.bos) {
|
||||
0: parse_labels; // create loop
|
||||
1: guess_labels_payload;
|
||||
}
|
||||
}
|
||||
|
||||
// lookahead parsing
|
||||
state guess_labels_payload {
|
||||
transition select(packet.lookahead<ip46_t>().version) {
|
||||
4 : parse_inner_ipv4;
|
||||
6 : parse_inner_ipv6;
|
||||
default : parse_inner_ethernet;
|
||||
}
|
||||
}
|
46
utils/cheat_sheet_src/src/architecture.txt
Normal file
46
utils/cheat_sheet_src/src/architecture.txt
Normal file
@ -0,0 +1,46 @@
|
||||
// common externs
|
||||
extern void truncate(in bit<32> length);
|
||||
extern void resubmit<T>(in T x);
|
||||
extern void recirculate<T>(in T x);
|
||||
enum CloneType { I2E, E2I }
|
||||
extern void clone(in CloneType type,
|
||||
in bit<32> session);
|
||||
|
||||
// v1model pipeline elements
|
||||
parser Parser<H, M>(
|
||||
packet_in pkt,
|
||||
out H hdr,
|
||||
inout M meta,
|
||||
inout standard_metadata_t std_meta
|
||||
);
|
||||
control VerifyChecksum<H, M>(
|
||||
inout H hdr,
|
||||
inout M meta
|
||||
);
|
||||
control Ingress<H, M>(
|
||||
inout H hdr,
|
||||
inout M meta,
|
||||
inout standard_metadata_t std_meta
|
||||
);
|
||||
control Egress<H, M>(
|
||||
inout H hdr,
|
||||
inout M meta,
|
||||
inout standard_metadata_t std_meta
|
||||
);
|
||||
control ComputeChecksum<H, M>(
|
||||
inout H hdr,
|
||||
inout M meta
|
||||
);
|
||||
control Deparser<H>(
|
||||
packet_out b, in H hdr
|
||||
);
|
||||
|
||||
// v1model switch
|
||||
package V1Switch<H, M>(
|
||||
Parser<H, M> p,
|
||||
VerifyChecksum<H, M> vr,
|
||||
Ingress<H, M> ig,
|
||||
Egress<H, M> eg,
|
||||
ComputeChecksum<H, M> ck,
|
||||
Deparser<H> d
|
||||
);
|
15
utils/cheat_sheet_src/src/control_flow.txt
Normal file
15
utils/cheat_sheet_src/src/control_flow.txt
Normal file
@ -0,0 +1,15 @@
|
||||
apply {
|
||||
// branch on header validity
|
||||
if (hdr.ipv4.isValid()) {
|
||||
ipv4_lpm.apply();
|
||||
}
|
||||
// branch on table hit result
|
||||
if (local_ip_table.apply().hit) {
|
||||
send_to_cpu();
|
||||
}
|
||||
// branch on table action invocation
|
||||
switch (table1.apply().action_run) {
|
||||
action1: { table2.apply(); }
|
||||
action2: { table3.apply(); }
|
||||
}
|
||||
}
|
19
utils/cheat_sheet_src/src/counters.txt
Normal file
19
utils/cheat_sheet_src/src/counters.txt
Normal file
@ -0,0 +1,19 @@
|
||||
// counters
|
||||
counter(8192, CounterType.packets) c;
|
||||
|
||||
action count(bit<32> index) {
|
||||
//increment counter at index
|
||||
c.count(index);
|
||||
}
|
||||
|
||||
// registers
|
||||
register<bit<48>>(16384) r;
|
||||
|
||||
action ipg(out bit<48> ival, bit<32> x) {
|
||||
bit<48> last;
|
||||
bit<48> now;
|
||||
r.read(last, x);
|
||||
now = std_meta.ingress_global_timestamp;
|
||||
ival = now - last;
|
||||
r.write(x, now);
|
||||
}
|
22
utils/cheat_sheet_src/src/data_types.txt
Normal file
22
utils/cheat_sheet_src/src/data_types.txt
Normal file
@ -0,0 +1,22 @@
|
||||
// typedef: introduces alternate type name
|
||||
typedef bit<48> macAddr_t;
|
||||
typedef bit<32> ip4Addr_t;
|
||||
|
||||
// headers: ordered collection of members
|
||||
// operations test and set validity bits:
|
||||
// isValid(), setValid(), setInvalid()
|
||||
header ethernet_t {
|
||||
macAddr_t dstAddr;
|
||||
macAddr_t srcAddr;
|
||||
bit<16> type;
|
||||
}
|
||||
|
||||
// variable declaration and member access
|
||||
ethernet_t ethernet;
|
||||
macAddr_t src = ethernet.srcAddr;
|
||||
|
||||
// struct: unordered collection of members
|
||||
struct headers_t {
|
||||
ethernet_t ethernet;
|
||||
}
|
||||
|
9
utils/cheat_sheet_src/src/deparsing.txt
Normal file
9
utils/cheat_sheet_src/src/deparsing.txt
Normal file
@ -0,0 +1,9 @@
|
||||
// packet_out: extern for output packet
|
||||
extern packet_out {
|
||||
void emit<T>(in T hdr);
|
||||
}
|
||||
|
||||
apply {
|
||||
// insert headers into pkt if valid
|
||||
packet.emit(hdr.ethernet);
|
||||
}
|
13
utils/cheat_sheet_src/src/expressions.txt
Normal file
13
utils/cheat_sheet_src/src/expressions.txt
Normal file
@ -0,0 +1,13 @@
|
||||
// Local metadata declaration, assignment
|
||||
bit<16> tmp1; bit<16> tmp2;
|
||||
tmp1 = hdr.ethernet.type;
|
||||
|
||||
// bit slicing, concatenation
|
||||
tmp2 = tmp1[7:0] ++ tmp1[15:8];
|
||||
|
||||
// addition, subtraction, casts
|
||||
tmp2 = tmp1 + tmp1 - (bit<16>)tmp1[7:0];
|
||||
|
||||
// bitwise operators
|
||||
tmp2 = (~tmp1 & tmp1) | (tmp1 ^ tmp1);
|
||||
tmp2 = tmp1 << 3;
|
21
utils/cheat_sheet_src/src/header_stack.txt
Normal file
21
utils/cheat_sheet_src/src/header_stack.txt
Normal file
@ -0,0 +1,21 @@
|
||||
// header stack declaration
|
||||
header label_t {
|
||||
bit<20> label;
|
||||
bit bos;
|
||||
}
|
||||
struct header_t {
|
||||
label_t[10] labels;
|
||||
}
|
||||
header_t hdr;
|
||||
|
||||
// remove from header stack
|
||||
action pop_label() {
|
||||
hdr.labels.pop_front(1);
|
||||
}
|
||||
|
||||
// add to header stack
|
||||
action push_label(in bit<20> label) {
|
||||
hdr.labels.push_front(1);
|
||||
hdr.labels[0].setValid();
|
||||
hdr.labels[0] = { label, 0};
|
||||
}
|
22
utils/cheat_sheet_src/src/parsers.txt
Normal file
22
utils/cheat_sheet_src/src/parsers.txt
Normal file
@ -0,0 +1,22 @@
|
||||
// packet_in: extern for input packet
|
||||
extern packet_in {
|
||||
void extract<T>(out T hdr);
|
||||
void extract<T>(out T hdr,in bit<32> n);
|
||||
T lookahead<T>();
|
||||
void advance(in bit<32> n);
|
||||
bit<32> length();
|
||||
}
|
||||
|
||||
// parser: begins in special "start" state
|
||||
state start {
|
||||
transition parse_ethernet;
|
||||
}
|
||||
|
||||
// User-defined parser state
|
||||
state parse_ethernet {
|
||||
packet.extract(hdr.ethernet);
|
||||
transition select(hdr.ethernet.type) {
|
||||
0x800: parse_ipv4;
|
||||
default: accept;
|
||||
}
|
||||
}
|
16
utils/cheat_sheet_src/src/tables.txt
Normal file
16
utils/cheat_sheet_src/src/tables.txt
Normal file
@ -0,0 +1,16 @@
|
||||
table ipv4_lpm {
|
||||
key = {
|
||||
hdr.ipv4.dstAddr : lpm;
|
||||
// standard match kinds:
|
||||
// exact, ternary, lpm
|
||||
}
|
||||
// actions that can be invoked
|
||||
actions = {
|
||||
ipv4_forward;
|
||||
drop;
|
||||
NoAction;
|
||||
}
|
||||
// table properties
|
||||
size = 1024;
|
||||
default_action = NoAction();
|
||||
}
|
22
utils/cheat_sheet_src/src/v1model_std_metadata.txt
Normal file
22
utils/cheat_sheet_src/src/v1model_std_metadata.txt
Normal file
@ -0,0 +1,22 @@
|
||||
struct standard_metadata_t {
|
||||
bit<9> ingress_port;
|
||||
bit<9> egress_spec;
|
||||
bit<9> egress_port;
|
||||
bit<32> clone_spec;
|
||||
bit<32> instance_type;
|
||||
bit<1> drop;
|
||||
bit<16> recirculate_port;
|
||||
bit<32> packet_length;
|
||||
bit<32> enq_timestamp;
|
||||
bit<19> enq_qdepth;
|
||||
bit<32> deq_timedelta;
|
||||
bit<19> deq_qdepth;
|
||||
bit<48> ingress_global_timestamp;
|
||||
bit<48> egress_global_timestamp;
|
||||
bit<32> lf_field_list;
|
||||
bit<16> mcast_grp;
|
||||
bit<32> resubmit_flag;
|
||||
bit<16> egress_rid;
|
||||
bit<1> checksum_error;
|
||||
bit<32> recirculate_flag;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user