OpenFlow Protocol

This section describes match, instructions and actions defined in the OpenFlow protocol.


There are a variety of conditions that can be specified to match, and it grows each time OpenFlow is updated. OpenFlow 1.0 had 12 types but in OpenFlow 1.3 as many as 40 types of conditions are defined.

For details of individual matches, please refer to the OpenFlow specification. This section gives a brief description of the Match field in OpenFlow 1.3.

Match field name Explanation
in_port Port number of receiving port
in_phy_port Physical port number of receiving port
metadata Metadata used to pass information between tables
eth_dst Destination MAC address of Ethernet
eth_src Source MAC address of Ethernet
eth_type Frame type of Ethernet
vlan_vid VLAN ID
vlan_pcp VLAN PCP
ip_dscp IP DSCP
ip_ecn IP ECN
ip_proto Protocol type of IP
ipv4_src Source IP address of IPv4
ipv4_dst Destination IP address of IPv4
tcp_src Source port number of TCP
tcp_dst Destination port number of TCP
udp_src Source port number of UDP
udp_dst Destination port number of UDP
sctp_src Source port number of SCTP
sctp_dst Destination port number of SCTP
icmpv4_type Type of ICMP
icmpv4_code Code of ICMP
arp_op Opcode of ARP
arp_spa Source IP address of ARP
arp_tpa Target IP address of ARP
arp_sha Source MAC address of ARP
arp_tha Target MAC address of ARP
ipv6_src Source IP address of IPv6
ipv6_dst Destination IP address of IPv6
ipv6_flabel Flow label of IPv6
icmpv6_type Type of ICMPv6
icmpv6_code Code of ICMPv6
ipv6_nd_target Target address of IPv6 neighbor discovery
ipv6_nd_sll Source link-layer address of IPv6 neighbor discovery
ipv6_nd_tll Target link-layer address of IPv6 neighbor discovery
mpls_label MPLS label
mpls_tc MPLS traffic class (TC)
mpls_bos MPLS BoS bit
pbb_isid I-SID of 802.1ah PBB
tunnel_id Metadata about logical port
ipv6_exthdr Pseudo-field of extension header of IPv6

Depending on fields such as the MAC address and IP address, you can further specify the mask.


The instruction is intended to define what happens when a packet corresponding to the match is received. The following types are defined.

Instruction Explanation
Goto Table (Required)

In OpenFlow 1.1 and later, multiple flow tables are supported. Using GotoTable, you can take over the process of matching packets to a flow table you specify. For example, you can set flow entry such as “Add a VLAN-ID200 to packets received on port 1 and send it to table 2”.

The table ID you specify must be a value greater than the current table ID.

Write Metadata (Optional) Set the metadata that can be referenced in the following table.
Write Actions (Required) Add an action that is specified in the current set of actions. If same type of action has been set already, it is replaced with the new action.
Apply Actions (Optional) Immediately apply the specified action without changing the action set.
Clear Actions (Optional) Delete all actions in the current action set.
Meter (Optional) Apply the packet to the meter you specify.

The following classes corresponding to each instruction are implemented in Ryu.

  • OFPInstructionGotoTable
  • OFPInstructionWriteMetadata
  • OFPInstructionActions
  • OFPInstructionMeter

Write/Apply/Clear Actions is grouped into OPFInstructionActions and is selected at the time of instantiation.


Support for Write Actions is said to be essential, but at the current time it is not supported in Open vSwitch. Apply Actions is supported, so you need to use it instead.


The OFPActionOutput class is used to specify packet forwarding to be used in Packet-Out and Flow Mod messages. Specify the maximum data size (max_len) to be transmitted to the controller and the destination in the constructor arguments. For the destination, other than the physical port number of the switch, some defined value can be used.

Value Explanation
OFPP_IN_PORT Forwarded to the receive port
OFPP_TABLE Applied to the first flow table.
OFPP_NORMAL Forwarded by the L2/L3 switch function
OFPP_FLOOD Flooded to all physical ports of the VLAN except blocked ports and receiving ports
OFPP_ALL Forwarded to all physical ports except receiving ports
OFPP_CONTROLLER Sent to the controller as a Packet-In message.
OFPP_LOCAL Indicates a local port of the switch
OFPP_ANY Meant to be used as a wild card when you select a port using Flow Mod (delete) or Stats Requests messages, and it’s not used in packet forwarding.

When you specify 0 for max_len, binary data of packet is not attached to the Packet-In message. If OFPCML_NO_BUFFER is specified, the entire packet is attached to the Packet-In message without buffering the packet on the OpenFlow switch.