Skip to content

Latest commit

 

History

History
 
 

resubmit_recirculate

Simple Resubmit/Recirculate Example

+--+      +--+     ++-+
|h1+------+s1+-----+h2+
+--+      +-++     +--+

Introduction

In this example we show you two different programs, one that resubmit packets and another that does recirculate them. The main objective of this example is to show the differences between them.

Resubmit

We show by means of an example how resubmit can be used. The program sets the metadata field resubmit_meta.i to 0 and resubmits the packet until i is equal to ipv4.tos. Every time the packet is resubmitted it writes the ipv4.id to resubmit_register[i]. Finally it sends the packet using the normal ipv4_lpm table.

How to run

Start the topology:

sudo p4run --config resubmitApp.json

or

sudo python network_resubmit.py

Send one packet, with ToS set to 200:

mx h1
python send.py 10.0.1.2 200

By default, send.py transmits packets with Identification field set to 255.

To read the state of resubmit_register we can use the cli:

$ simple_switch_CLI --thrift-port 9090
RuntimeCmd: register_read resubmit_register
register index omitted, reading entire array
MyIngress.resubmit_register= 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0

Recirculate

For recirculate we also do something very simple just for the sake of showing the difference between resubmit and recirculate. You can see that the recirculate.p4 program is almost the same than the resubmit.p4 program, however we moved the logic to the egress block. This is because you can only tag a packet to be recirculated at the egress pipeline. This time the packet will be copied to the parser but it will keep all the modifications we have done to the header + deparsing state (so for example we can remove headers). This time in each iteration we will substract -1 to ipv4.id and save that to recirculate_register[i].

Start the topology:

sudo p4run --config recirculateApp.json

or

sudo python network_recirculate.py

Send one packet, with ToS set to 200:

mx h1
python send.py 10.0.1.2 200

By default, send.py transmits packets with Identification field set to 255.

To read the state of recirculate_register we can use the cli:

RuntimeCmd: register_read MyEgress.recirculate_register
register index omitted, reading entire array
MyEgress.recirculate_register= 255, 254, 253, 252, 251, 250, 249, 248, 247, 246, 245, 244, 243, 242, 241, 240, 239, 238, 237, 236, 235, 234, 233, 232, 231, 230, 229, 228, 227, 226, 225, 224, 223, 222, 221, 220, 219, 218, 217, 216, 215, 214, 213, 212, 211, 210, 209, 208, 207, 206, 205, 204, 203, 202, 201, 200, 199, 198, 197, 196, 195, 194, 193, 192, 191, 190, 189, 188, 187, 186, 185, 184, 183, 182, 181, 180, 179, 178, 177, 176, 175, 174, 173, 172, 171, 170, 169, 168, 167, 166, 165, 164, 163, 162, 161, 160, 159, 158, 157, 156, 155, 154, 153, 152, 151, 150, 149, 148, 147, 146, 145, 144, 143, 142, 141, 140, 139, 138, 137, 136, 135, 134, 133, 132, 131, 130, 129, 128, 127, 126, 125, 124, 123, 122, 121, 120, 119, 118, 117, 116, 115, 114, 113, 112, 111, 110, 109, 108, 107, 106, 105, 104, 103, 102, 101, 100, 99, 98, 97, 96, 95, 94, 93, 92, 91, 90, 89, 88, 87, 86, 85, 84, 83, 82, 81, 80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 70, 69, 68, 67, 66, 65, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0