In this tutorial, you will learn how to setup and ONOS environment capable of communicating with P4Runtime enabled Tofino Based devices. The following set of instructions have been tested with the EdgeCore Wedge-100BF.
Requirements
- 1 or more Tofino based switches with Barefoot SDE <number> or later installed
- 1 server with the latest ONOS master downloaded. the version has to be 1.12-SNAPSHOT or later.
Prepare the switch
With the SDE and all necessary tools installed the switch process can be started.
<command to start switchd>
It's worth noting the --skip.p4 option that makes the switchd start with no P4 program deployed. The program will be later deployed through a specific call from ONOS.
Create a Pipeconf for your P4 program.
To Build a pipeconf for your p4 program and make ONOS capable of installing it on the device and controlling it you need to write an application containing at least two classes:
- implementation of Interpreter.java
- implementation of PiPipeconfFactory.java
Interpreter
The interpreter is what enables ONOS to understand the specific constructs of your P4 Program. For example the Interpreter enables the translation from Traffic treatments into P4 defined Actions.
You can see an example of an interpreter for the default.p4 program in the DefaultP4Interpreter.java class.
PiPipeconfFactory
The PiPipeconfFactory is where you piece together all the needed elements for ONOS to understand your P4 program.
You need:
- bmv2 generated json for your program. It cam be obtained through this command:
- P4Info for your program. It cane obtained through this command:
- Tofino.bin binary file
- Tofino context.json file
The last two files can be generated with a Barefoot SDE and the attached Tofino specific backend compiler. For more information write to carmelo@opennetworking.org, andrea@opennetworking.org, antonin@opennetworking.org
An example of a Pipeconf builder:
return DefaultPiPipeconf.builder() .withId(new PiPipeconfId(format(PIPECONF_ID_BASE, system))) .withPipelineModel(Bmv2PipelineModelParser.parse(jsonUrl)) .addBehaviour(PiPipelineInterpreter.class, DefaultP4Interpreter.class) .addBehaviour(Pipeliner.class, DefaultSingleTablePipeline.class) .addBehaviour(PortStatisticsDiscovery.class, DefaultP4PortStatisticsDiscovery.class) .addExtension(P4_INFO_TEXT, p4InfoUrl) .addExtension(BMV2_JSON, jsonUrl) .addExtension(TOFINO_BIN, tofinoUrl) .addExtension(TOFINO_CONTEXT_JSON, contextUrl) .build();
Run ONOS and bring a Pipeconf
Moving to the ONOS controller on the server, assuming you downloaded it and placed your pipeconf in it.
Run ONOS
You need to run it:
$ buck run onos-local -- clean debug
It's worth noting that this start ONOS in a single instance cluster. The command also build ONOS and purges any previous state. The debug option offers the possibility to attach the debugger on port 5005.
Login into the ONOS CLI
Having Started ONOS we need to login in it's CLI.
onos localhost
Start the Pipeconf
Having Started ONOS we need to start the pipeconf.
onos> app activate <pipeconf_app_name>
It's worth noting that this start ONOS in a single instance cluster. The command also build ONOS and purges any previous state. The debug option offers the possibility to attach the debugger on port 5005.
Start the Barefoot driver
Having Started ONOS we need to start the toxin drivers.
onos> app activate org.onosproject.drivers.barefoot
This command brings in all the needed applications to interact with the switch.
Verify the active applications
please type
apps -s -a
and verify that these app at least are active in your ONOS environment:
org.onosproject.generaldeviceprovider (General Device Provider)
org.onosproject.drivers (Default Drivers)
org.onosproject.protocols.grpc (gRPC Protocol Subsystem)
org.onosproject.protocols.p4runtime (P4Runtime Protocol Subsystem)
org.onosproject.p4runtime (P4Runtime Provider)
org.onosproject.drivers.p4runtime (P4Runtime Drivers)
org.onosproject.drivers.barefoot (Barefoot Drivers)
- your own pipeconf.
Build and push a configuration json
Having all the needed components in ONOS in place we can now tell ONOS about the device(s) and let the interaction begin.
First we need to create a .json file containing all the needed information such as IP/Port of the device, it's ports and the pipeconf we want to deploy.
{ "devices": { "device:<name>": { "generalprovider": { "p4runtime": { "ip": "<ip>", "port": "<port>", "deviceId": <id_of_device> } }, "piPipeconf": { "piPipeconfId": "<name of your pipeconf>" }, "ports": { <ports of }, "basic": { "name": "<freindly_name>", "latitude": 41, "driver": "tofino", "longitude": -107 } }
A working example is in $ONOS_ROOT/tools/test/topos/tofino-demo-simple.json. Change the IP both in the DeviceId at the top and in the devices array. The port number by default on gRPC is 50051, so unless you made any changes to that leave it as is.
Please not that you need to add the driver as "tofino" and the the piPipeconfId as the name of you pipeconf.
Upload the configuration you just wrote to the instance of ONOS you are running:
$ curl -X POST -H "content-type:application/json" http://localhost:8181/onos/v1/network/configuration -d @<path_to_your_json_configuration_file> --user onos:rocks
or
<your_machine>~$ onos-netcfg localhost <path_to_your_json_configuration_file>
Check if the device is present in ONOS:
onos> devices
Configure ports on the device
The last step to perform is to configure the ports on the switch.
Please repeat the following command for all the ports that you need on your device. This needs to be done after having pushed the pipeline config.
bf-sde> pm bf-sde.pm> show bf-sde.pm> port-add 1/0 100G NONE bf-sde.pm> port-enb 1/0
Use
At this point if everything went smoothly you should be able to push rules defined with PiCriterion and PiInstruction according to the P4 program deployed on the device.