77 lines
2.8 KiB
Markdown
77 lines
2.8 KiB
Markdown
# Action Profile
|
|
|
|
## Description
|
|
|
|
This example gives a skeleton ECMP implementation, using an action profile. A P4
|
|
action profile is mapped to an indirect table in bmv2. More precisely, in our
|
|
case, the P4 objects `ecmp_group` and `ecmp_action_profile` are mapped to one
|
|
bmv2 indirect match table. This has the limitation that sharing action profiles
|
|
between P4 tables is not supported in bmv2.
|
|
|
|
### Running the demo
|
|
|
|
As always, you can start the switch with `./run_switch.sh` (and wait until
|
|
`READY` is displayed). We program the dataplane with the following CLI commands
|
|
(from [commands.txt] (commands.txt)):
|
|
|
|
```
|
|
01. table_indirect_create_group ecmp_group
|
|
02. table_indirect_create_member ecmp_group _nop
|
|
03. table_indirect_create_member ecmp_group set_ecmp_nexthop 1
|
|
04. table_indirect_create_member ecmp_group set_ecmp_nexthop 2
|
|
05. table_indirect_create_member ecmp_group set_ecmp_nexthop 3
|
|
06. table_indirect_add_member_to_group ecmp_group 1 0
|
|
07. table_indirect_add_member_to_group ecmp_group 3 0
|
|
08. table_indirect_set_default ecmp_group 0
|
|
09. table_indirect_add_with_group ecmp_group 10.0.0.1 => 0
|
|
10. table_dump ecmp_group
|
|
```
|
|
|
|
These commands do the following:
|
|
|
|
01. create a group, which receives group handle 0
|
|
02. create a member with action _nop and no action data (member handle 0)
|
|
03. create a member with action set_ecmp_nexthop and action data port=1 (member handle 1)
|
|
04. create a member with action set_ecmp_nexthop and action data port=2 (member handle 2)
|
|
05. create a member with action set_ecmp_nexthop and action data port=3 (member handle 3)
|
|
06. add member 1 to group 0
|
|
07. add member 3 to group 0
|
|
08. set member 0 (_nop) has the default for table ecmp_group
|
|
09. add an entry to table ecmp_group, which maps destination IPv4 address
|
|
10.0.0.1 to group 0 (which includes members 1 and 3)
|
|
10. simply dump the table
|
|
|
|
These commands are sent automatically when you run `./run_switch.sh`. The last
|
|
command should display the following information:
|
|
|
|
```
|
|
ecmp_group:
|
|
0: 0a000001 => group(0)
|
|
members:
|
|
0: _nop -
|
|
1: set_ecmp_nexthop - 1,
|
|
2: set_ecmp_nexthop - 2,
|
|
3: set_ecmp_nexthop - 3,
|
|
4: set_ecmp_nexthop - 4,
|
|
groups:
|
|
0: { 1, 3, }
|
|
```
|
|
|
|
When we send a packet to the switch (on any port) with destination address
|
|
10.0.0.1, the egress port will be set to either 1 or 3. This is because we only
|
|
added members 1 and 3 to the group. Which port / member is used for a given
|
|
packet is determined by computing a hash over the IP source address and the IP
|
|
protocol number. See the P4 program for more details.
|
|
|
|
After starting the switch, run `sudo python send_and_count.py`. This Python
|
|
script will send 200 packets to the switch and count the pakcets coming out of
|
|
ports 2 and 3. The two numbers should be almost the same:
|
|
|
|
```
|
|
Sending 200 packets on port 0
|
|
port 1: 106 packets (53%)
|
|
port 2: 0 packets (0%)
|
|
port 3: 94 packets (47%)
|
|
port 4: 0 packets (0%)
|
|
```
|