I have a custom topology
custom.py and I wrote a
file.p4 file. The problem is that I don’t know how to use the
file.p4 into mininet with my topology.
For instance, in this github repository (tutorials/exercises/basic at master · p4lang/tutorials · GitHub) they use the
make run command to compile the p4 file, start the topology and configure all the hosts.
Thanks in advance!
Welcome to the forum @nickyy
Short answer: Use the same name as the present P4 file you find on each exercise’s folder. Take a look into the s*-runtime.json file for the rules too of course, they need to make sense with your new program.
Long answer: This is an assumption from checking the code of tutorials now, so I might be wrong in some details. I believe that when you use the comman
make for that exercise, the
Makefile will use the existing P4 file in each exercise’s root folder. In your case it will take
basic.p4, so you would need to have only 1 P4 file at that particular folder with, in principle, any name you want. The problem is that the exercise automates rule installation and
p4info usage by hardcoding the name of some files into runtime files. To start, check this code from utils/Makefile:
P4C_ARGS += --p4runtime-files $(BUILD_DIR)/$(basename $@).p4.p4info.txt
source = $(wildcard *.p4)
compiled_json := $(source:.p4=.json)
DEFAULT_PROG = $(wildcard *.p4)
DEFAULT_JSON = $(BUILD_DIR)/$(DEFAULT_PROG:.p4=.json)
# Define NO_P4 to start BMv2 without a program
run_args += -j $(DEFAULT_JSON)
And see this code from runtime files:
I can see that the
Makefile can detect any P4 file, the
p4info file and the P4 compiled file (which is also a json), no matter the name. As said, I believe the issue is related the runtime files and hardcoded
p4info filenames in the runtime files (when you have a custom filename for your P4). You can always modify those runtime files by changing
basic for your program’s name.
Sorry for the late response!!
Ok, forget about the tutorial’s example. If I wanted to execute p4 into mininet with my custom-made topology
custome.py and p4 file
custom.p4, what would I do?
I’ll try your “long answer” but I’m asking you this in case it is easier what I’m explaining to you above than the tutorial’s example.
I guess you have plenty of ways to do it. GitHub - nsg-ethz/p4-utils: Extension to Mininet that makes P4 networks easier to build has many of examples, you just have to follow the same principle as the repository authors do. Modify the main scripts and the main
Mininet py script.
You could base your examples in the Mininet Docker container that is used at GitHub - opennetworkinglab/ngsdn-tutorial: Hands-on tutorial to learn the building blocks of the Next-Gen SDN architecture. See the
Makefile, which shows how to run a Docker container with a
I believe the easiest is to modify an exercise of the P4 tutorial (but there might be a nicer and faster way to do it, not sure). This is because, in this way, it is easy to compile the P4 program, load the compiled P4 into the switches, automatically install rules and easy to test. The tutorial builds the scenario based on the
topology.json file. So if you can create a
topology.json file based on your custom.py, then you are good to go.
Let’s say you want to modify the basic exercise. In order to make it works:
- Modify the
basic.p4 code with your own.
- Move the hosts, switches and links from your
custom.py script. See the structure of the topology.json file. If you do not want to do that (I do not recommend it because it will take longer), you can modify
run_exercise.py and prevent it from reading
topology.json, and add your own
custom.py code to
run_exercise.py file. See the make_network method to learn how to add a particular host type, a P4 switch class or create a Mininet network. You can start from there to add your own method that adds your own
- Change the
s*-runtime.json files with the rules for your script, with the proper table names, actions and parameters. You need to do this for any Mininet example, unless you want to manually add the table rules.
I hope it helps.