This P4 programm provides GTP.v1 encapsulation/decapsulation/steering for ICMP and UDP traffic. Furthermore you can get hop latency via postcard telemetry from each node of the network.
The folder/files contain:
Graph: contains the workflows of each part of the P4 piplenies, e.i., parser, ingress pipeline, egress pipeline, etc.Include: contains the P4 program files. The P4 filemain.p4defines the "total pipeline" and the files contained inIncludefolder specifies: headers, parser, tables, etc.Command files: These files contain a set of flow rules for configuring a P4 switch loaded with GTPV1-P4 pipeline. More in detail these three files are referred to a specified network topology.Parsing_INT_pkt: is a python script for parsing a report packet and send the telemetry infortaions, contained in the packet, to Grafana.Simpe_network_topology: is a python script for creating a mininet network.Write_entries_scan: is a python script for creating flow rules.
This table is redundant, because it's steer the traffic. In other word, the table_encap_gtp and the table_decap_gtp have actions that are able to apply the GTP encap/decap and forward the traffic to a certain port. The table0 have an action that simply forward a pkt from an input port to a certain aotput port. This table was introduced in the pipeline bacause during the development phase of the P4 program I used iperf3 as a traffic generator, without this table the iperf3 "management pkt" are not forwarded from the client to the server. In other word the iperf3 connection fails. When I moved the GTPV1-P4 pipeline in a real enviroment I removed the table0 from the pipeline and the real traffic generated in my real network is succesfully GTP encapsulated/decapsulated/steered.
Copy the file Simpe_network_topology in the folder behavioral-model/mininet.
To run the mininet topology populated with BMv2 switches that have as a pipeline GTPV1-P4:
sudo python Simpe_network_topology.py --behavioral-exe ../targets/simple_switch/simple_switch --json ../main.json --num-host 4
After running this command, you get a network topology formed by 3 bmv2 switches, A,B,C, connected in series. In the network are 4 hosts, h1,h2,h3,h4, where h1,h2 are attached to A, h3 is attached to B and h4 is attached to C.
To configure/inspect the flow rules in each switch by hand, you have to access the switch via Simple_switch_CLI, provided by behavioral model, e.g.,
sudo Simple_switch_CLI --thrift-port portNumber
Once you accessed the switch via CLI you are able to configure the flow rules in each table via the commands provided by the CLI, e.g. table_add.
To load a set of flow rules in a switch from a file you can use:
sudo Simple_switch_CLI --thrift-port portNumber < .../Commands_s1.txt
The Command files, in this repository, are written taking into account:
h1 -> h4, the switchAprovides GTP encap,Bprovides GTP steering ,Cprovides GTP decap.h2 -> h3, the switchAprovides GTP encap,Bprovides GTP decap- the switch
Asend the postcard telemetry related to the flowh1 -> h4, identified as a flow 1, andh2 -> h3identified as a flow 2. - the switch
Bsend the postcard telemetry related to the flowh1 -> h4, identified as a flow 1.
To run a single BMv2 switch with GTPV1-P4 pipeline:
sudo ./simple_switch -i 0@<iface0> -i 1@<iface1> ../main.json
To configure/inspect the flow rules in each switch by hand, you have to access the switch via Simple_switch_CLI, provided by behavioral model, e.g.,
sudo Simple_switch_CLI --thrift-port portNumber
Once you accessed the switch via CLI you are able to configure the flow rules in each table via the commands provided by the CLI, e.g. table_add.
To load a set of flow rules in a switch from a file you can use:
sudo Simple_switch_CLI --thrift-port portNumber < .../Commands_s1.txt