From 2bb0d474aef74d388f28b6562fea7f553d187116 Mon Sep 17 00:00:00 2001 From: Antonin Bas Date: Wed, 30 Sep 2015 17:18:34 -0700 Subject: [PATCH] first pass at README --- SIGCOMM_2015/README.md | 290 ++++++++++++++++++ .../images/source_routing_topology.png | Bin 0 -> 47482 bytes 2 files changed, 290 insertions(+) create mode 100644 SIGCOMM_2015/README.md create mode 100644 SIGCOMM_2015/resources/images/source_routing_topology.png diff --git a/SIGCOMM_2015/README.md b/SIGCOMM_2015/README.md new file mode 100644 index 0000000..2e76ff2 --- /dev/null +++ b/SIGCOMM_2015/README.md @@ -0,0 +1,290 @@ +# P4 SIGCOMM 2015 Tutorial + +The original webpage for the tutorial can be found +[here](http://conferences.sigcomm.org/sigcomm/2015/tutorial-p4.php) + +## Introduction + +This repository include 2 exercises we presented at SIGCOMM: *Source Routing* +and *Flowlet Switching*. Both exercises assume that you possess basic networking +knowledge and some familiarity with the P4 language. Please take a look at the +[P4 language spec] (http://p4.org/spec/) and at the example `simple_router` +target [on p4lang] +(https://github.com/p4lang/p4factory/tree/master/targets/simple_router/p4src). +*Source Routing* asks you to write a P4 program from scratch to implement a +custom source routing protocol. *Flowlet Switching* is more difficult: you will +start from a simple P4 routing program (with ECMP) and implement a version of +flowlet switching, which yields better load balancing for long-lived TCP flows. + +For both exercises, you will find a .tar.gz archive which contains the solution +files. + +## Obtaining required software + +To complete the exercises, you will need to clone 2 p4lang Github repositories +and install their dependencies. To clonde the repositories: + +- `git clone https://github.com/p4lang/behavioral-model.git bmv2` +- `git clone https://github.com/p4lang/p4c-bm.git p4c-bmv2` + +The first repository ([bmv2](https://github.com/p4lang/behavioral-model)) is the +second version of the behavioral model. It is a C++ software switch that will +behave according to your P4 program. The second repository +([p4c-bmv2](https://github.com/p4lang/p4c-bm)) is the compiler for the +behavioral model: it takes P4 program and output a JSON file which can be loaded +by the behavioral model. + +Each of these repositories come with dependencies. `p4c-bmv2` is a Python +repository and installing the required Python dependencies is very easy to do +using `pip`: `sudo pip install -r requirements.txt`. + +`bmv2` is a C++ repository and has more external dependencies. They are listed +in the +[README](https://github.com/p4lang/behavioral-model/blob/master/README.md). If +you are running Ubuntu 14.04+, the dependencies should be easy to install (you +can use the `install_deps.sh` script that comes with `bmv2`). Do not forget to +build the code once all the dependencies have been installed: + +- `./autogen.sh` +- `./configure` +- `make` + +## Before starting the exercises + +You need to tell us where you cloned the `bmv2` and `p4c-bm` repositories +:). Please update the values of the shell variables `BMV2_PATH` and +`P4C_BM_PATH` in the `env.sh` file - located in this directory. Note that if you +cloned both repositories in the same directory as this one (`tutorials`), you +will not need to change the value of the variables. + +That's all :) + +## Exercise 1: Source Routing + +Place yourself in the `source_routing` directory. + +In this problem, we will implement a very simple source routing protocol in +P4. We will call this protocol EasyRoute. You will be designing the P4 program +from scratch, although you are of course welcome to reuse code from other +targets in p4lang. To test your implementation, you will create a Mininet +network and send messages between hosts. We provide a skeleton program: +[source_routing/p4src/source_routing.p4] +(source_routing/p4src/source_routing.p4), you need to implement the parser and +the ingress control flow. + +### Description of the EasyRoute protocol + +The EasyRoute packets looks like this: + +``` +preamble (8 bytes) | num_valid (4 bytes) | port_1 (1 byte) | port_2 (1 byte) | +... | port_n (1 byte) | payload +``` + +The preamble is always set to 0. You can use this to distinguish the EasyRoute +packets from other packets (Ethernet frames) your switch may receive. We do not +guarantee that your P4 switch will exclusively receive EasyRoute packets. + +The num_valid field indicates the number of valid ports in the header. If your +EasyRoute packet is to traverse 3 switches, num_valid will initially be set to +3, and the port list will be 3 byte long. When a switch receives an EasyRoute +packet, the first port of the list is used to determine the outgoing port for +the packet. num_valid is then decremented by 1 and the first port is removed +from the list. + +We will use the EasyRoute protocol to send text messages. The payload will +therefore correspond to the text message we are sending. You do not have to +worry about the encoding of the text message. + +![Source Routing topology](resources/images/source_routing_topology.png) + +If I wish to send message "Hello" from h1 to h3, the EasyRoute packet will look +like this: + +- when it leaves h1: +`00000000 00000000 | 00000002 | 03 | 01 | Hello` + +- when it leaves sw1: +`00000000 00000000 | 00000001 | 01 | Hello` + +- when it leaves sw3: +`00000000 00000000 | 00000000 | Hello` + +Note that the last switch should not remove the EasyRoute header; otherwise the +application running in the end hosts won’t be able to handle incoming packets +properly. + +Your P4 implementation needs to adhere to the following requirements: + +1. **all non-EasyRoute packets should be dropped** +2. **if a switch receives an EasyRoute packet for which num_valid is 0, the +packet should be dropped** + +### A few hints + +1. in the start parse state, you can use `current()` to check if the packet is +an EasyRoute packet. A call to `current(0, 64)` will examine the first 64 bits +of the packet, **without shifting the packet pointer**. +2. do not forget that a table can match on the validity of a header. Furthermore +if a header is not valid, our software switch will set all its fields to 0. +3. a table can "match" on an empty key, which means the default action will +always be executed - if configured correctly by the runtime. Just omit the +"reads" attribute to achieve this. +4. you can remove a header with a call to `remove_header()` +5. when parsing the EasyRoute header, you do not have to parse the whole port +list. Actually P4 is currently missing language constructs needed to parse a +general Type-Length-Value style header[1](#myfootnote1), and hence +you’ll need to simply extract the first port of the list and ignore the rest +(including the payload). Also preamble, num_valid and the port number don't have +to all be placed in the same header type. +6. finally, we advise you to put all your logic in the ingress control flow and +leave the egress empty. You will not need more than 1 or 2 tables to implement +EasyRoute. + +1: Members of [P4.org](http://p4.org) are working +together to come up with language constructs needed to be able to parse +TLV-style headers soon. + +### Populating the tables + +Once your P4 code is ready (you can validate it easily by running `p4-validate` +on it), you need to think about populating the tables. We made it easy for you: +you just have to fill the commands.txt file with `bmv2` CLI commands. We think +that you only need to know 2 commands: + +- `table_set_default [action_data]`: this is used to +set the default action of a given table +- `table_add => [action_data]`: this +is used to add an entry to a table + +You can look at example commands in the `flowlet_switching` directory: +[flowlet_switching/commands.txt](flowlet_switching/commands.txt) and match them +with the corresponding P4 tables +[flowlet_switching/p4src/simple_router.p4] +(flowlet_switching/p4src/simple_router.p4). + +### Testing your code + +./run_demo.sh will compile your code and create the Mininet network described +above. It will also use commands.txt to configure each one of the switches. +Once the network is up and running, you should type the following in the Mininet +CLI: + +- `xterm h1` +- `xterm h3` + +This will open a terminal for you on h1 and h3. + +On h3 run: `./receive.py`. + +On h1 run: `./send.py h1 h3`. + +You should then be able to type messages on h1 and receive them on h3. The +`send.py` program finds the shortest path between h1 and h3 using Dijkstra, then +send correctly-formatted packets to h3 through s1 and s3. + +### Debugging your code + +.pcap files will be generated for every interface (9 files: 3 for each of the 3 +switches). You can look at the appropriate files and check that your packets are +being processed correctly. + +## Exercise 2: Implementing TCP flowlet switching + +Place yourself in the `source_routing` directory. + +### What is flowlet switching? + +Flowlet switching leverages the burstiness of TCP flows to achieve better load +balancing of TCP traffic. In this exercise, you will start from a program +that load-balances based on layer 4 flows: this is generally considered +"classic" ECMP. To do this, we compute a hash over the 5-tuple and use this +value to choose from a set of possible next hops. This means that all packets +belonging to the same flow (i.e. with the same 5-tuple) will be routed to +the same nexthop. You need to enhance this P4 code with additional logic to +implement flowlet switching. + +We suggest implementing flowlet switching as follows: + +1. Compute a crc16 hash over the regular TCP 5-tuple, using the +`modify_field_with_hash_based_offset()` P4 primitive. We already use this +primitive in the ECMP starter code, so take a look. This hash will identify each +TCP flow (note: we do not care about collisions in this case). + +2. For each flow, you need to store 2 things: a) a timestamp for the last +observed packet belonging to this flow and b) a flowlet_id. Flowlet switching +is very simple: for each packet which belongs to the flow, you need to update +the timestamp. Then, if the time delta between the last observed packet and the +current packet exceeds a certain timeout value (in our case, we suggest using +50ms), then the flowlet_id needs to be incremented. Note that in data centers +with mostly short, high-speed links, this timeout value will typically be much +smaller. With flowlet switching, packets belonging to the same TCP burst will +have the same flowlet_id, but packets in 2 different bursts (i.e. separated by a +timeout) will have a different flowlet_id. This also implies that we must +maintain some state for each TCP flow. To maintain state in P4, you will need to +use 'register' objects (look them up in the spec). In this case, you will need +to use two separate registers for each packet (one for the timestamp and one for +the flowlet_id). The software switch will generate a timestamp for each new +packet and store it in the metadata field +`intrinsic_metadata.ingress_global_timestamp`. This is a 32 bit value, expressed +in microseconds. You can read it in the ingress pipeline, but don't try to write +to it. + +3. Once you have obtained the flowlet_id, you can compute a new hash. This +time, the hash will include the 5-tuple AND the flowlet_id. You will use this +hash exactly like we used our hash in the starter code, as an offset into a +nexthop table. This part of the exercise actually mostly reuses the starter +code. Your changes to tables `ecmp_group` and `ecmp_nhop` should be minimal. + +### Running the starter code + +To compile and run the starter code, simply use `./run_demo.sh`. This time we +will not be using Mininet, we will instead generate simple TCP test packets and +send them individually to the switch to observe how it behaves. `run_demo.sh` +will start the switch and populate the tables using the CLI commands from +[flowlet_switching/commands.txt] (flowlet_switching/commands.txt). + +When the switch is running, you can send test packets with `sudo +./run_test.py`. Note that this script will take a few seconds to complete. The +tests sends a few hundred identical TCP packets through the switch, in bursts, +on port 3. If you take a look at commands.txt, you will see that each TCP packet +can either go out of port 1 or port 2, based on the result of the hash +computation. The script prints the list of outgoing ports. Since all packets are +identical and we are using "regular" ECMP, all the packets should come out of +the same port and you will see either a thousand "1"s or a thousand "2"s when +you run the test. If you were to alter the test script (example: modify the TTL +value of the input TCP packets), the output should randomly choose between port +1 and port 2. + +Note that the test script (and commands.txt) assume the following topology: + +``` + --------------------------------- nhop-0 10.0.1.1 + | 00:04:00:00:00:00 + 1 - 00:aa:bb:00:00:00 + | +-------- 3--sw + | + 2 - 00:aa:bb:00:00:01 + | + --------------------------------- nhop-1 10.0.2.1 + 00:04:00:00:00:01 +``` + +Both `nhop-0` and `nhop-1` have a path to `10.0.0.1`, which is the final +destination of our test packet. + +### What you need to do + +1. Update the provided [P4 program] (flowlet_switching/p4src/simple_router.p4) +to perform TCP flowlet switching. In our case, it requires adding 2 tables to +the ingress pipeline. Remember that you can omit the 'reads' attribute for a +table. In this case, providing you configure the default action of the table +correctly, the default action will always be performed. + +2. Update [commands.txt] (flowlet_switching/commands.txt) to configure your new +tables. + +3. Run the above test again. Observe how the list of ports alternate between 1 +and 2. You will need to edit the test script if you chose not to use a 50ms +(50,000 microseconds!) timeout for the flowlet_id. diff --git a/SIGCOMM_2015/resources/images/source_routing_topology.png b/SIGCOMM_2015/resources/images/source_routing_topology.png new file mode 100644 index 0000000000000000000000000000000000000000..cc71fca7979f002c5e291973b312fb9ede72b810 GIT binary patch literal 47482 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 JN@>%O{{ze-%$EQF literal 0 HcmV?d00001