-
Notifications
You must be signed in to change notification settings - Fork 188
Control Plane
The BMv2 repository implements two different versions of the Simple Switch that have different control plane interfaces.
Target | Control Plane |
---|---|
simple_switch |
Thrift |
simple_switch_grpc |
P4Runtime , Thrift
|
The following table shows different methods to configure the Simple Switch that will be covered in more detail in the subsequent paragraphs. Thanks to the recent update of P4-Utils, P4Runtime is now available with a new control plane API. Notice that the APIs (i.e. SimpleSwitchThriftAPI
and SimpleSwitchP4RuntimeAPI
) are provided by P4-Utils, whereas the client (i.e. simple_switch_CLI
) it is directly implemented by BMv2.
Control Plane | Methods |
---|---|
Thrift |
SimpleSwitchThriftAPI , simple_switch_CLI
|
P4Runtime |
SimpleSwitchP4RuntimeAPI |
We can use the simple_switch_CLI
to configure the switch and populate match-action tables.
To get the switch client simply run:
simple_switch_CLI --thrift-port <port>
The client connect to the Thrift server running in each switch process. 9090
is the default port number but of course if you are running several devices on your machine, you will need to provide a different port for each. One client instance can only connect to one switch device.
The most used commands to modify table contents are the following.
-
table_set_default <table_name> <action_name> <action_parameters>
is used to set the default action (i.e. the action executed when no match is found) of a table. -
table_add <table_name> <action_name> <match_fields> => <action_parameters>
is used to set the action related to a specific match in a table.
For example if we have the following table:
action drop(){
// drops packet
mark_to_drop(standard_metadata);
}
action action_name(bit<8> action_parameter){
...
}
table table_name {
key = {
standard_metadata.ingress_port: exact;
}
actions = {
drop;
action_name;
}
}
table_set_default table_name drop
table_add table_name action_name 1 => 5
The first command would set the default action, and action parameters (none in this case) for table table_name
. Thus, when using the table_name
table if there is no match, the drop action will be called. In the second example command adds an entry that matches if the standard_metadata.ingress_port
is equal to 1 and executes the action action_name
with action_parameter
set to 5
.
You can also populate the table writing the commands directly in a text file and then feeding the client:
simple_switch_CLI --thrift-port <port> < command_file.txt
Alternatively, you can use the P4-Utils configuration file (i.e p4app.json
) to set a cli
configuration file for each switch. When creating the topology, or rebooting switches, P4-Utils will automatically use the file to populate and configure switches.
To set default client configuration files you need to define your switches like:
"switches": {
"s1": {
"cli_input": "<path_to_cli_commands_file>"
}
}
You can find all the documentation about p4app.json
in the official P4-Utils documentation.
You can find a wrapper of the Simple Switch Client as one of the features of P4-Utils. It is called SimpleSwitchThriftAPI
and basically allows the user to perform the same opertations but, instead of using text sent to the client, one can use the power of a scripting language such as Python. You can read more about this API here.
The P4 language consortium has recently defined P4Runtime, a control plane specification for controlling the data plane elements of a device defined or described by a P4 program. This new protocol aims at being the standard for P4 devices so that even control plane programs can be target-independent.
In response to this need, in the last update of P4-Utils a P4Runtime API was introduced. It is called SimpleSwitchP4RuntimeAPI
and was designed to provide methods similar, in functioning and naming, to those of SimpleSwitchThriftAPI
so that migrating from one to another is easier. You can read more about this API here.