Skip to content

Example #2 Calculator (Bmv2)

Sandor Laki edited this page Aug 24, 2022 · 5 revisions

Example #2 - Calculator

Source code: Calculator

Introduction

This exercise requires implementing a basic calculator using a custom protocol header written in P4. The header will contain an operation to perform (e.g., addition, subtraction) 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.

A skeleton P4 program named calc.p4 is located under [p4pi/tree/master/exercises/bmv2/calc](https://github.com/p4lang/p4pi/tree/master/exercises/bmv2/calc), and initially drops all packets. Your task is to extend it to properly implement the calculator logic.

Step 1: Setup and run the (incomplete) starter code

In this exercise you will use two machines: your laptop, and a Raspberry Pi, connected directly using a single Ethernet cable (strongly recommended). The cable should be connected from the laptop’s USB adapter to the Raspberry Pi’s Ethernet port (no adapter). We also provide a wifi connection option if you do not have an Ethernet cable and/or a USB adapter. However, your laptop will not be able to access the Internet through wifi.

The test sequence is the same through all parts of this exercise:

  1. Login to the raspberry Pi via SSH
ssh pi@[Raspberry Pi’s IP] 

Raspberry Pi’s IP should be the IP of the Ethernet port. The default password is raspberry.

[Wifi option]

  • Connect to P4Pi Access Point
    • Connect your laptop to the wireless access point called "p4pi". After that your laptop will get an IP address assigned by the DHCP service (from the default address pool 192.168.4.0/24).
  • SSH to P4Pi
  1. Compile the P4 program calc.p4 under TBD
p4c --target bmv2 --arch v1model --std p4-16 calc.p4    
  1. Run the compiled program.
sudo simple_switch –i 0@veth0 calc.json     
  1. Run the provided python script under TBD:
sudo python cal.py 
  1. 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, since the calculator program is not implemented, if you enter an equation, you should not be able to see the correct results and 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 available in TBD. 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
>

Solution

The solution is available in https://github.com/p4lang/p4pi/tree/master/exercises/bmv2/calc/solution

Clone this wiki locally