[[PageOutline]] This page describes how to write [http://www.protogeni.net/trac/protogeni/wiki/RSpecSchema2 GENI compliant] Openflow rspecs. These new rspecs are supported by FOAM, the new Openflow AM. This page also provides instructions and how to convert Expedient rspecs to the new form of rspecs. For a detailed explanation of the tags and attributes look at [wiki:HowTo/WriteOFv3Rspecs/Spec this specification page]. = Openflow Slivers = In an Openflow Aggregate, an experimenter can control how the packets are forwarded within the network, using a custom controller running in an external compute resource. In the general case an Openflow Aggregate consists of Openflow-enabled devices(e.g. switches) which forward packets based on instructions received by the controllers. The traffic of an Openflow network can be sliced, using matching rules on the traversing packets. A set of rules that describes part of the passing traffic is called a ''flowspace''. A flowspace can be defined based on the datapath ids (aka dpids) and ports that the packets are going through, and/or based on their headers. Datapath is a virtual network device that is controlled using the Openflow protocol and can forward packets. So for example a switch running an Openflow compatible firmware might be a datapath. More details about how Openflow works and about which fields of the packet headers can be used in flowspaces can be found in the [http://www.openflow.org/documents/openflow-spec-v1.0.0.pdf Openflow Spec 1.0.0] and in the [http://www.openflow.org/ Openflow website]. For example a sliver on an Openflow network might request for : ''"All packets coming in port 5 on datapath 15, and have a source IP address in subnet 10.10.10.0/24."''' = Writing FOAM request rspecs = The best way to understand and write FOAM rspecs is by looking at example rspecs. Keep in mind that the rspec is merely a structured representation of flowspaces that describe the traffic that an experiment wants to control. This [https://openflow.stanford.edu/display/FOAM/rspec example rspec], is a complete example. Here there is also a list of simpler example rspecs : * [attachment:of_one_match.rspec Rspec with only one match element] * [Rspec with multiple match elements] * [Rspec with two groups] In essence your rspec should: 1. start with the and the tags : {{{ #!xml }}} 2. Specify where your controller is running. E.g.: {{{ #!xml }}} 3. Organize the datapaths that are relevant to this sliver within groups. The best way to construct the elements is by copying them from the advertisement rspecs. E.g if [attachment:ad-sample.rspec this] is the advertisement rspec, and you want : * ports 7 and 20 of datapath with dpid 06:a4:00:12:e2:b8:a5:d0 * ports 50 and 71 of datapath with dpid 06:af:00:24:a8:c4:b9:00 Then you can construct a group that looks like : {{{ #!xml }}} 4. Specify your flowspace. E.g. if you want for the above group to get all traffic that is sourced or destined to the IP subnet 10.1.1.0/24 and uses tcp port 80, then you will need two tags, one to match the packets that are sourced from that subnet and one to match the packets that are destined to that subnet. Keep in mind that your flowspace is the union of the traffic that is described by each {{{ #!xml }}} Done! The complete rspec looks like : {{{ #!xml }}} = FOAM and Expedient rspecs = Although the FOAM and the Expedient