Andy Fingerhut c7f3139533
Add March 2021 VM based on Ubuntu 20.04 (#403)
* First draft of Ubuntu 20.04 Vagrantfile and scripts to install 2021-Mar
version of open source P4 development tools.

* Add more tracing output of what files have been installed at each step

* Don't do behavioral-model install_deps.sh before installing PI
This is an experiment to see if the end result will be able to run
tutorials basic exercise using Python3 only on an Ubuntu 20.04 system.
Just before this commit, `vagrant up` resulted in a system that failed
to run the basic exercise, because python3 failed to import
google.grpc (if I recall correctly -- it may have been a different
google.<something> Python3 module name).

* Add missing patch file

* Fix copy and paste mistake

* Add missing patch file

* Change how protobuf Python3 module files are installed

* Correct a few desktop icon file names, and add clean.sh script

* Enhance clean.sh script, and add README for manual steps in creating a VM

* Changes to try to always use Python3, never Python2, in tutorials

* Update README steps for preparing a VM

* More additions to README on steps to create a single file VM image

* Add empty-disk-block zeroing to clean.sh script

* Also install PTF

* Update versions of P4 dev tool source code to 2021-Apr-05
This includes a change to p4lang/PI that allows P4Runtime API clients
to send the shortest byte sequences necessary to encode integer
values, which I want for a PTF test that I have recently created.

* Update README for 2021-Apr-05 version of VM image

* Resolve Python 3 compatibility issues

Most of the Python 2 to 3 code translation changes
were automated with the 2to3 tool.

Signed-off-by: Radostin Stoyanov <rstoyanov@fedoraproject.org>

* Update commit SHAs for 4 p4lang repos to latest as of 2021-May-04

* Update Ubuntu 20.04 README.md for how I created 2021-May-04 version of VM

* mycontroller: Use Python 3 shebang line

Signed-off-by: Radostin Stoyanov <rstoyanov@fedoraproject.org>

* Update Ubuntu 20.04 README.md for how I created 2021-Jun-01 version of VM

* Update commit SHAs for 4 p4lang repos to latest as of 2021-Jul-07

* Update Ubuntu 20.04 README.md for how I created 2021-Jul-07 version of VM

* Update commit SHAs for 4 p4lang repos to latest as of 2021-Aug-01

* Update Ubuntu 20.04 README.md for how I created 2021-Aug-01 version of VM

* Update commit SHAs for 4 p4lang repos to latest as of 2021-Sep-07

* Update Ubuntu 20.04 README.md for how I created 2021-Sep-07 version of VM

Co-authored-by: Radostin Stoyanov <rstoyanov@fedoraproject.org>
2021-09-07 19:34:30 -07:00
..

Implementing a P4 Calculator

Introduction

The objective of this tutorial is to implement a basic calculator using a custom protocol header written in P4. The header will contain an operation to perform and two operands. When a switch receives a calculator packet header, it will execute the operation on the operands, and return the result to the sender.

Step 1: Run the (incomplete) starter code

The directory with this README also contains a skeleton P4 program, calc.p4, which initially drops all packets. Your job will be to extend it to properly implement the calculator logic.

As a first step, compile the incomplete calc.p4 and bring up a switch in Mininet to test its behavior.

  1. In your shell, run:

    make
    

    This will:

    • compile calc.p4, and

    • start a Mininet instance with one switches (s1) connected to two hosts (h1, h2).

    • The hosts are assigned IPs of 10.0.1.1 and 10.0.1.2.

  2. We've written a small Python-based driver program that will allow you to test your calculator. You can run the driver program directly from the Mininet command prompt:

mininet> h1 python calc.py 
> 
  1. The driver program will provide a new prompt, at which you can type basic expressions. The test harness will parse your expression, and prepare a packet with the corresponding operator and operands. It will then send a packet to the switch for evaluation. When the switch returns the result of the computation, the test program will print the result. However, because the calculator program is not implemented, you should see an error message.
> 1+1
Didn't receive response
>

Step 2: Implement Calculator

To implement the calculator, you will need to define a custom calculator header, and implement the switch logic to parse header, perform the requested operation, write the result in the header, and return the packet to the sender.

We will use the following header format:

         0                1                  2              3
  +----------------+----------------+----------------+---------------+
  |      P         |       4        |     Version    |     Op        |
  +----------------+----------------+----------------+---------------+
  |                              Operand A                           |
  +----------------+----------------+----------------+---------------+
  |                              Operand B                           |
  +----------------+----------------+----------------+---------------+
  |                              Result                              |
  +----------------+----------------+----------------+---------------+
  • P is an ASCII Letter 'P' (0x50)
  • 4 is an ASCII Letter '4' (0x34)
  • Version is currently 0.1 (0x01)
  • Op is an operation to Perform:
  • '+' (0x2b) Result = OperandA + OperandB
  • '-' (0x2d) Result = OperandA - OperandB
  • '&' (0x26) Result = OperandA & OperandB
  • '|' (0x7c) Result = OperandA | OperandB
  • '^' (0x5e) Result = OperandA ^ OperandB

We will assume that the calculator header is carried over Ethernet, and we will use the Ethernet type 0x1234 to indicate the presence of the header.

Given what you have learned so far, your task is to implement the P4 calculator program. There is no control plane logic, so you need only worry about the data plane implementation.

A working calculator implementation will parse the custom headers, execute the mathematical operation, write the result in the result field, and return the packet to the sender.

Step 3: Run your solution

Follow the instructions from Step 1. This time, you should see the correct result:

> 1+1
2
>