From 7ff3af57fb191f8802421d21d90af41f91c57a4c Mon Sep 17 00:00:00 2001 From: sibanez12 Date: Fri, 5 Oct 2018 12:52:35 -0700 Subject: [PATCH] Adding P4 cheat cheet and its latex source files. (#201) --- p4-cheat-sheet.pdf | Bin 0 -> 34052 bytes utils/cheat_sheet_src/main.tex | 220 ++++++++++++++++++ utils/cheat_sheet_src/src/actions.txt | 28 +++ utils/cheat_sheet_src/src/adv_parsing.txt | 23 ++ utils/cheat_sheet_src/src/architecture.txt | 46 ++++ utils/cheat_sheet_src/src/control_flow.txt | 15 ++ utils/cheat_sheet_src/src/counters.txt | 19 ++ utils/cheat_sheet_src/src/data_types.txt | 22 ++ utils/cheat_sheet_src/src/deparsing.txt | 9 + utils/cheat_sheet_src/src/expressions.txt | 13 ++ utils/cheat_sheet_src/src/header_stack.txt | 21 ++ utils/cheat_sheet_src/src/parsers.txt | 22 ++ utils/cheat_sheet_src/src/tables.txt | 16 ++ .../src/v1model_std_metadata.txt | 22 ++ 14 files changed, 476 insertions(+) create mode 100644 p4-cheat-sheet.pdf create mode 100644 utils/cheat_sheet_src/main.tex create mode 100644 utils/cheat_sheet_src/src/actions.txt create mode 100644 utils/cheat_sheet_src/src/adv_parsing.txt create mode 100644 utils/cheat_sheet_src/src/architecture.txt create mode 100644 utils/cheat_sheet_src/src/control_flow.txt create mode 100644 utils/cheat_sheet_src/src/counters.txt create mode 100644 utils/cheat_sheet_src/src/data_types.txt create mode 100644 utils/cheat_sheet_src/src/deparsing.txt create mode 100644 utils/cheat_sheet_src/src/expressions.txt create mode 100644 utils/cheat_sheet_src/src/header_stack.txt create mode 100644 utils/cheat_sheet_src/src/parsers.txt create mode 100644 utils/cheat_sheet_src/src/tables.txt create mode 100644 utils/cheat_sheet_src/src/v1model_std_metadata.txt diff --git a/p4-cheat-sheet.pdf b/p4-cheat-sheet.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d6eae7f6dc4f6785a25647d2e3e20fa96f75bd47 GIT binary patch literal 34052 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 HcjE#8Au^y) literal 0 HcmV?d00001 diff --git a/utils/cheat_sheet_src/main.tex b/utils/cheat_sheet_src/main.tex new file mode 100644 index 0000000..f9db04c --- /dev/null +++ b/utils/cheat_sheet_src/main.tex @@ -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 \ No newline at end of file diff --git a/utils/cheat_sheet_src/src/actions.txt b/utils/cheat_sheet_src/src/actions.txt new file mode 100644 index 0000000..63801a7 --- /dev/null +++ b/utils/cheat_sheet_src/src/actions.txt @@ -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(); +} diff --git a/utils/cheat_sheet_src/src/adv_parsing.txt b/utils/cheat_sheet_src/src/adv_parsing.txt new file mode 100644 index 0000000..2b1167b --- /dev/null +++ b/utils/cheat_sheet_src/src/adv_parsing.txt @@ -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().version) { + 4 : parse_inner_ipv4; + 6 : parse_inner_ipv6; + default : parse_inner_ethernet; + } +} diff --git a/utils/cheat_sheet_src/src/architecture.txt b/utils/cheat_sheet_src/src/architecture.txt new file mode 100644 index 0000000..5fb4010 --- /dev/null +++ b/utils/cheat_sheet_src/src/architecture.txt @@ -0,0 +1,46 @@ +// common externs +extern void truncate(in bit<32> length); +extern void resubmit(in T x); +extern void recirculate(in T x); +enum CloneType { I2E, E2I } +extern void clone(in CloneType type, + in bit<32> session); + +// v1model pipeline elements +parser Parser( + packet_in pkt, + out H hdr, + inout M meta, + inout standard_metadata_t std_meta +); +control VerifyChecksum( + inout H hdr, + inout M meta +); +control Ingress( + inout H hdr, + inout M meta, + inout standard_metadata_t std_meta +); +control Egress( + inout H hdr, + inout M meta, + inout standard_metadata_t std_meta +); +control ComputeChecksum( + inout H hdr, + inout M meta +); +control Deparser( + packet_out b, in H hdr +); + +// v1model switch +package V1Switch( + Parser p, + VerifyChecksum vr, + Ingress ig, + Egress eg, + ComputeChecksum ck, + Deparser d +); diff --git a/utils/cheat_sheet_src/src/control_flow.txt b/utils/cheat_sheet_src/src/control_flow.txt new file mode 100644 index 0000000..95d83e2 --- /dev/null +++ b/utils/cheat_sheet_src/src/control_flow.txt @@ -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(); } + } +} \ No newline at end of file diff --git a/utils/cheat_sheet_src/src/counters.txt b/utils/cheat_sheet_src/src/counters.txt new file mode 100644 index 0000000..1583eea --- /dev/null +++ b/utils/cheat_sheet_src/src/counters.txt @@ -0,0 +1,19 @@ +// counters +counter(8192, CounterType.packets) c; + +action count(bit<32> index) { + //increment counter at index + c.count(index); +} + +// registers +register>(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); +} diff --git a/utils/cheat_sheet_src/src/data_types.txt b/utils/cheat_sheet_src/src/data_types.txt new file mode 100644 index 0000000..7029d02 --- /dev/null +++ b/utils/cheat_sheet_src/src/data_types.txt @@ -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; +} + diff --git a/utils/cheat_sheet_src/src/deparsing.txt b/utils/cheat_sheet_src/src/deparsing.txt new file mode 100644 index 0000000..f6468dc --- /dev/null +++ b/utils/cheat_sheet_src/src/deparsing.txt @@ -0,0 +1,9 @@ +// packet_out: extern for output packet +extern packet_out { + void emit(in T hdr); +} + +apply { + // insert headers into pkt if valid + packet.emit(hdr.ethernet); +} \ No newline at end of file diff --git a/utils/cheat_sheet_src/src/expressions.txt b/utils/cheat_sheet_src/src/expressions.txt new file mode 100644 index 0000000..5c1688d --- /dev/null +++ b/utils/cheat_sheet_src/src/expressions.txt @@ -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; \ No newline at end of file diff --git a/utils/cheat_sheet_src/src/header_stack.txt b/utils/cheat_sheet_src/src/header_stack.txt new file mode 100644 index 0000000..85328f9 --- /dev/null +++ b/utils/cheat_sheet_src/src/header_stack.txt @@ -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}; +} diff --git a/utils/cheat_sheet_src/src/parsers.txt b/utils/cheat_sheet_src/src/parsers.txt new file mode 100644 index 0000000..8fbe6ed --- /dev/null +++ b/utils/cheat_sheet_src/src/parsers.txt @@ -0,0 +1,22 @@ +// packet_in: extern for input packet +extern packet_in { + void extract(out T hdr); + void extract(out T hdr,in bit<32> n); + T lookahead(); + 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; + } +} \ No newline at end of file diff --git a/utils/cheat_sheet_src/src/tables.txt b/utils/cheat_sheet_src/src/tables.txt new file mode 100644 index 0000000..c7df56e --- /dev/null +++ b/utils/cheat_sheet_src/src/tables.txt @@ -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(); +} \ No newline at end of file diff --git a/utils/cheat_sheet_src/src/v1model_std_metadata.txt b/utils/cheat_sheet_src/src/v1model_std_metadata.txt new file mode 100644 index 0000000..5b10226 --- /dev/null +++ b/utils/cheat_sheet_src/src/v1model_std_metadata.txt @@ -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; +} \ No newline at end of file