added action_profile example
This commit is contained in:
76
examples/action_profile/README.md
Normal file
76
examples/action_profile/README.md
Normal file
@@ -0,0 +1,76 @@
|
||||
# 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%)
|
||||
```
|
||||
Reference in New Issue
Block a user