From 4fe435fa87f424ff2ce7c6c452d03b4b6bc1bdbf Mon Sep 17 00:00:00 2001 From: Andy Fingerhut Date: Sat, 1 Apr 2023 14:44:00 -0400 Subject: [PATCH 1/4] Define action parameters declared as data-plane-writable --- p4-16/spec/P4-16-spec.mdk | 76 ++++++++++++++++++++++++++++++++------- 1 file changed, 64 insertions(+), 12 deletions(-) diff --git a/p4-16/spec/P4-16-spec.mdk b/p4-16/spec/P4-16-spec.mdk index 35e84e3996..9ff7b6f67f 100644 --- a/p4-16/spec/P4-16-spec.mdk +++ b/p4-16/spec/P4-16-spec.mdk @@ -6187,10 +6187,11 @@ starting with actions. Actions are code fragments that can read and write the data being processed. Actions may contain data values that can be written by the -control plane and read by the data plane. Actions are the main -construct by which the control plane can dynamically influence the -behavior of the data plane. Figure [#fig-actions] shows the abstract -model of an `action`. +control plane and read by the data plane. Actions may also contain +data values that are initialized by the control plane, and read and +written by the data plane. Actions are the main construct by which the +control plane can dynamically influence the behavior of the data +plane. Figure [#fig-actions] shows the abstract model of an `action`. ~ Begin P4Grammar [INCLUDE=grammar.mdk:actionDeclaration] @@ -6199,23 +6200,71 @@ model of an `action`. Syntactically actions resemble functions with no return value. Actions may be declared within a control block; in this case they can only be used within instances of that control block. +Actions may also be declared at the top level of a P4 program. -The following example shows an action declaration: +The following examples show action declarations: ~ Begin P4Example action Forward_a(out bit<9> outputPort, bit<9> port) { outputPort = port; } + +action Forward_with_count(out bit<9> outputPort, bit<9> port, rmw bit<32> count) { + outputPort = port; + count = count + 1; +} ~ End P4Example -Action parameters may not have `extern` types. Action parameters that -have no direction (e.g., `port` in the previous example) indicate -"action data." All such parameters must appear at the end of the -parameter list. When used in a match-action table (see Section -[#sec-table-action-list]), these parameters will be provided by the -table entries (e.g., as specified by the control plane, the -`default_action` table property, or the `entries` table +Action parameters may not have `extern` types. + +Action parameters that have no direction (e.g., `port` in the previous +examples) indicate "action data" that is read-only in the data plane. +When used in a match-action table (see Section +[#sec-table-action-list]), the values of these parameters will be +provided by the table entries (e.g., as specified by the control +plane, the `default_action` table property, or the `entries` table property). +Consider action `a1` with parameter `p1` that is declared +directionless. Then: + ++ There is an independent value of `p1` for each table entry that has + `a1` as its action. ++ `p1` may not be assigned a value in the body of `a1`. ++ If `p1` is passed as an argument to another action `a2` + corresponding to parameter `p2` of action `a2`, then `p2` must have + direction `in`, or be directionless. ++ Similarly if `p1` is passed as an argument to an extern function or + extern method `f1` as parameter `p2`: `p2` must have direction `in`, + or be directionless. + +Action parameters declared with `rmw` before them (e.g., `count` in +the action `Forward_with_count`) indicate action data that can be +modified in the P4 code. The initial value of these parameters will +be provided by the table entries (e.g. as specified by the control +plane, the `default_action` table property, or the `entries` table +property), but after that its value may be modified by the action when +the action is invoked. + +Consider action `a1` with parameter `p1` that is declared `rmw`. +Then: + ++ There is separate storage for holding a value of `p1` for each table + entry that has `a1` as its action. ++ `p1` may be assigned a value in the body of `a1`, perhaps multiple + times. ++ If `p1` is passed as an argument to another action `a2` + corresponding to parameter `p2` of action `a2`, then `p2` may be + directionless, or have any direction, but it is an error if `p2` is + declared `rmw`. ++ If `p1` is passed as an argument to an extern function or extern + method `f1` as parameter `p2`, then `p2` may be directionless, or + have any direction. + +All parameters that are either directionless or declared `rmw` must +appear after any parameters with a direction. Directionless +parameters and those declared `rmw` can appear in any order relative +to each other. + The body of an action consists of a sequence of statements and declarations. No `table`, `control`, or `parser` applications can appear within actions. @@ -6235,6 +6284,9 @@ Actions can be executed in two ways: parameters. In this case, the directionless parameters behave like `in` parameters. +Actions with parameters declared as `rmw` may not be executed +explicitly, only implicitly. + ## Tables { #sec-tables } ~ Figure { #fig-maudataflow; caption: "Match-Action Unit Dataflow." } From 01ae9510bd5022e9b5b72a41779d2fdc783b5808 Mon Sep 17 00:00:00 2001 From: Andy Fingerhut Date: Sat, 1 Apr 2023 16:24:54 -0400 Subject: [PATCH 2/4] Update figure describing P4 actions --- p4-16/spec/P4-16-spec.mdk | 2 +- p4-16/spec/figs/P4-actions.drawio | 75 ++++++++++++++++++++++++++ p4-16/spec/figs/P4-actions.drawio.png | Bin 0 -> 37109 bytes 3 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 p4-16/spec/figs/P4-actions.drawio create mode 100644 p4-16/spec/figs/P4-actions.drawio.png diff --git a/p4-16/spec/P4-16-spec.mdk b/p4-16/spec/P4-16-spec.mdk index 9ff7b6f67f..ccdac5faf0 100644 --- a/p4-16/spec/P4-16-spec.mdk +++ b/p4-16/spec/P4-16-spec.mdk @@ -6183,7 +6183,7 @@ starting with actions. ~ Figure { #fig-actions; caption: "Actions contain code and data. The code is in the P4 program, while the data is provided in the table entries, typically populated by the control plane. Other parameters are bound by the data plane." } ![actions] ~ -[actions]: figs/actions.png { width: 8cm; page-align: here } +[actions]: figs/P4-actions.drawio.png { width: 10cm; page-align: here } Actions are code fragments that can read and write the data being processed. Actions may contain data values that can be written by the diff --git a/p4-16/spec/figs/P4-actions.drawio b/p4-16/spec/figs/P4-actions.drawio new file mode 100644 index 0000000000..a41cc7d736 --- /dev/null +++ b/p4-16/spec/figs/P4-actions.drawio @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/p4-16/spec/figs/P4-actions.drawio.png b/p4-16/spec/figs/P4-actions.drawio.png new file mode 100644 index 0000000000000000000000000000000000000000..40f8edaffb0a0483863293bc393e1871bae4b9ce GIT binary patch literal 37109 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 literal 0 HcmV?d00001 From a494a8a83ef35da70add744f96ea85d24bff27c4 Mon Sep 17 00:00:00 2001 From: Andy Fingerhut Date: Sat, 1 Apr 2023 21:14:54 -0400 Subject: [PATCH 3/4] Rename P4-actions.drawio.png to P4-actions.png, and remove embedded drawio file I think that the embedded drawio format file inside the .png file may cause problems for Madoko or TeX when processing it. --- p4-16/spec/P4-16-spec.mdk | 2 +- .../{P4-actions.drawio.png => P4-actions.png} | Bin 37109 -> 25789 bytes 2 files changed, 1 insertion(+), 1 deletion(-) rename p4-16/spec/figs/{P4-actions.drawio.png => P4-actions.png} (69%) diff --git a/p4-16/spec/P4-16-spec.mdk b/p4-16/spec/P4-16-spec.mdk index ccdac5faf0..7fce8808de 100644 --- a/p4-16/spec/P4-16-spec.mdk +++ b/p4-16/spec/P4-16-spec.mdk @@ -6183,7 +6183,7 @@ starting with actions. ~ Figure { #fig-actions; caption: "Actions contain code and data. The code is in the P4 program, while the data is provided in the table entries, typically populated by the control plane. Other parameters are bound by the data plane." } ![actions] ~ -[actions]: figs/P4-actions.drawio.png { width: 10cm; page-align: here } +[actions]: figs/P4-actions.png { width: 10cm; page-align: here } Actions are code fragments that can read and write the data being processed. Actions may contain data values that can be written by the diff --git a/p4-16/spec/figs/P4-actions.drawio.png b/p4-16/spec/figs/P4-actions.png similarity index 69% rename from p4-16/spec/figs/P4-actions.drawio.png rename to p4-16/spec/figs/P4-actions.png index 40f8edaffb0a0483863293bc393e1871bae4b9ce..2ada130b544ea5343ed60dd578b2cd58deefb590 100644 GIT binary patch delta 13 UcmeymkZJEp#t8(Qmx_Pc{Ox_&SbiRtiJ`XP$rpyi!+W!pht51s|%D9O{swB?`T`Dv1i7=KZW>+=yV zukqh?-n!kl{cmu4GM~rdm3Vg%VLInszu)$ID1LD9{<&tdf8$9^xlJJ#!YFS13H zCT96=+ijyIHO}wmLYGd`bP{7k$l_7UIl(*n`9mX2JR~x}l$4ZTKtM;X?jkZ$Jsm#s zp8wDp#r;>ldofJ?>}68zjys**KF)&q^jR7z(S^6V+rH!LKEpd*;CBYPV3J`Nsm3+c$Qu#p;B$Y_4H;MrB}ty0PE0THG;@;VNh7JGF7xv{^h*@wgq%I&+agD)1}Y&G`RK#MpidVjQCtO zweit46$1cMt$$K3b%n~on2TIwa)DZE7`)RX=|=m;ght6Q zjnfRcNzw#h!dzuzq^#A%r9RdG#WAvFp!nvQfFjwNm@*qE9aBa)p$$0%OyqLr6-!da ziGd0G9<984K#5dNpKDciP7{*ufCA7As3-Q2&6ibztvA8`UmInP3Noa1*#&NJ%L}L_Mp1w>A z5HZAT&s(0~>z#V%U_CW_0R6I>yPdW-==R-?xynIL4{Ug6r@efq>ftRrbZilG3lV-q z8JC<%GmB|6kBJz8T34jH};>;qXH>VlE z#cZ+|95J%X<2p7|y!l&$M1H=|Pw_Q*dSucVC0kP26ZY2och>Ub=-u|#gR-|CbW6^<+dg(| zZ|+x}HPRT_-D^;6r>$G!@h5sz-QeL&@vr40?WcOWjdI=2cN9UuGc`owP7?+^pOK&B z%4c@V7b1&PbZaVTjMs7o$vH`rq0l}R?a-z+0yD`o?FZM?QyyZyUm}nz{#Syy1z~o^ zwwdFyJ&_O-e`aBcX)NYqYBPu zyaR$&zk|eoZXG?XcPa90qfc2t-SR`lg+>0S8W=W+3)RG4nQU)udsSm?WGVG|0(Jx8 zFFPG`PY%a8u9fa)jcaM-S)`SkS9Ec+%fM92r06~#L$V#WVcTR5D?LV)z!y1q9;xIp zRQ`8|xOGF=%F4@QuJjm^Pvwk0mWh5*=npG#>%PKPSsV)%V-+|14@g{`k&+!)x(t&4 zmOf+EF+*{tK*{4!AcK_Q2#HpMQGNdyT9wUitS1^-(g6kb|1%stC_%_3hg6ND*=jJ` zW46TXiKIc}7Ah+}uW!n1md6Z;@oQ@*^|2|>(-=D7KMmQ2dyqH<=MUw8bGNMG&T)!7 zgE%SkxhYU7f(@!!iZ*nd(pLcvhbhK`)Q2dx&rs)&t4>Feu~jL)HDN~6aAcKlspP*% z82fWBb?B}5mQwsd$hLko6O(CVme%u(tO|wdA+l5|#e>WW7_ z_N$|=bTAwI3-kYjIhYOpMeg_T$*qe?NOCnt4~lrobw>{eWuBTi;`^6c=7=Q78s4}M z=BbG%;lKHz20kuQ`S&#j0m3eSZe(keeXsR=nSU)@(x*H804@~%YZSf1p%$wgO`U+W zo0?lzMazJP1pg?qiq*VBF$W%VS0%>~^sCcx`8f|iFe}^skxZK89o#*9g}^7wlJnjm zgZe83edux6tiv+t0RGD-mVB03e49dW!&iQrKVsUMANn1VKaFExUYB)n8TvLsykFLV zun4z^?UwZUTE!=8v=-N8ejdf&bPVSbw@Sl&pN! zR^(R=AbgG>Ec494!9MU%=syEu9UfGj72idg_SQG3HmcNH{_Iu1&<(y;A0BH2{`2?0 K(?8n3hW`UgIKBY@ From cafacf8621a5bc3db69b7d3fe9c9ccbe8ccd3311 Mon Sep 17 00:00:00 2001 From: Andy Fingerhut Date: Sun, 2 Apr 2023 02:37:33 -0400 Subject: [PATCH 4/4] Add README to p4-16/spec/figs directory with notes on figures --- p4-16/spec/figs/README.md | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 p4-16/spec/figs/README.md diff --git a/p4-16/spec/figs/README.md b/p4-16/spec/figs/README.md new file mode 100644 index 0000000000..dab35c8959 --- /dev/null +++ b/p4-16/spec/figs/README.md @@ -0,0 +1,28 @@ +# Notes on drawing files + +The web site: + ++ https://draw.io + +which may redirect to: + ++ https://app.diagrams.net + +has a free web application for editing figures, similar in style to +Visio, Omnigraffle, and the drawing capabilities of Powerpoint. + +If you use it to create a drawing, it is good to save the source file +of the drawing. I believe the default format used is called an +"mxfile", which looks a lot like an XML file with a particular schema. + +To include an image in a Madoko document, PNG format is a reasonable +choice. To create a PNG file of a drawing, select the menu item + ++ File -> Export As -> PNG... + +Another window appears when you choose that item. It includes several +options, one of which is "Include a copy of my diagram" with a check +box before it. I have found that at least on an Ubuntu 20.04 Linux +system with Madoko and TeX software installed using the +`setup-for-ubuntu-linux.sh` script, if you create a PNG file with that +box checked, running TeX will fail with an error message.