Ryu Readthedocs Io en Latest
Ryu Readthedocs Io en Latest
Release 4.34
1 Getting Started 3
1.1 What’s Ryu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.2 Quick Start . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.3 Optional Requirements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.4 Prerequisites . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.5 Support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
3 Configuration 499
3.1 Setup TLS Connection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 499
3.2 Topology Viewer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 500
4 Tests 503
4.1 Testing VRRP Module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 503
4.2 Testing OF-config support with LINC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 507
i
Python Module Index 587
Index 589
ii
ryu Documentation, Release 4.34
Contents:
Contents 1
ryu Documentation, Release 4.34
2 Contents
CHAPTER 1
Getting Started
If you want to write your Ryu application, have a look at Writing ryu application document. After writing your
application, just type:
% ryu-manager yourapp.py
3
ryu Documentation, Release 4.34
1.4 Prerequisites
If you got some error messages at the installation stage, please confirm dependencies for building the required Python
packages.
On Ubuntu(16.04 LTS or later):
1.5 Support
If you want to manage network gear (switches, routers, etc) your own way, you just need to write your own Ryu
application. Your application tells Ryu how you want to manage the gear. Then Ryu configures the gear by using
OpenFlow protocol, etc.
Writing Ryu applications is easy. They’re just Python scripts.
Here we show a Ryu application that makes an OpenFlow switch work as a dumb layer 2 switch.
Open a text editor and create a new file with the following content:
class L2Switch(app_manager.RyuApp):
def __init__(self, *args, **kwargs):
super(L2Switch, self).__init__(*args, **kwargs)
Ryu applications are just Python scripts so you can save the file with any name, any extension, and any place you want.
Let’s name the file ’l2.py’ in your home directory.
This application does nothing useful yet, however it’s a complete Ryu application. In fact, you can run this Ryu
application:
% ryu-manager ~/l2.py
loading app /Users/fujita/l2.py
instantiating app /Users/fujita/l2.py
5
ryu Documentation, Release 4.34
All you have to do is define a new subclass of RyuApp to run your Python script as a Ryu application.
Next let’s add some functionality that sends a received packet to all the ports.
class L2Switch(app_manager.RyuApp):
OFP_VERSIONS = [ofproto_v1_0.OFP_VERSION]
@set_ev_cls(ofp_event.EventOFPPacketIn, MAIN_DISPATCHER)
def packet_in_handler(self, ev):
msg = ev.msg
dp = msg.datapath
ofp = dp.ofproto
ofp_parser = dp.ofproto_parser
actions = [ofp_parser.OFPActionOutput(ofp.OFPP_FLOOD)]
data = None
if msg.buffer_id == ofp.OFP_NO_BUFFER:
data = msg.data
out = ofp_parser.OFPPacketOut(
datapath=dp, buffer_id=msg.buffer_id, in_port=msg.in_port,
actions=actions, data = data)
dp.send_msg(out)
A new method ’packet_in_handler’ is added to the L2Switch class. This is called when Ryu receives an OpenFlow
packet_in message. The trick is the ’set_ev_cls’ decorator. This decorator tells Ryu when the decorated function
should be called.
The first argument of the decorator indicates which type of event this function should be called for. As you might
expect, every time Ryu gets a packet_in message, this function is called.
The second argument indicates the state of the switch. You probably want to ignore packet_in messages before the
negotiation between Ryu and the switch is finished. Using ’MAIN_DISPATCHER’ as the second argument means
this function is called only after the negotiation completes.
Next let’s look at the first half of the ’packet_in_handler’ function.
• ev.msg is an object that represents a packet_in data structure.
• msg.dp is an object that represents a datapath (switch).
• dp.ofproto and dp.ofproto_parser are objects that represent the OpenFlow protocol that Ryu and the switch
negotiated.
Ready for the second half.
• OFPActionOutput class is used with a packet_out message to specify a switch port that you want to send the
packet out of. This application uses the OFPP_FLOOD flag to indicate that the packet should be sent out on all
ports.
• OFPPacketOut class is used to build a packet_out message.
• If you call Datapath class’s send_msg method with a OpenFlow message class object, Ryu builds and sends the
on-wire data format to the switch.
There, you finished implementing your first Ryu application. You are ready to run a Ryu application that does some-
thing useful.
Is a dumb L2 switch is too dumb? You want to implement a learning L2 switch? Move to the next step. You can learn
from the existing Ryu applications at ryu/app directory and integrated tests directory.
2.2.1 Executables
bin/ryu-manager
ryu.base.app_manager
ryu.controller.controller
ryu.controller.dpset
Manage switches.
Planned to be replaced by ryu/topology.
ryu.controller.ofp_event
ryu.controller.ofp_handler
ryu.ofproto.ofproto_v1_0
ryu.ofproto.ofproto_v1_0_parser
ryu.ofproto.ofproto_v1_2
ryu.ofproto.ofproto_v1_2_parser
ryu.ofproto.ofproto_v1_3
ryu.ofproto.ofproto_v1_3_parser
ryu.ofproto.ofproto_v1_4
ryu.ofproto.ofproto_v1_4_parser
ryu.ofproto.ofproto_v1_5
ryu.ofproto.ofproto_v1_5_parser
ryu.app.cbench
A dumb OpenFlow 1.0 responder for benchmarking the controller framework. Intended to be used with oflops cbench.
ryu.app.simple_switch
ryu.topology
2.2.6 Libraries
ryu.lib.packet
ryu.lib.ovs
ryu.lib.of_config
OF-Config implementation.
ryu.lib.netconf
ryu.lib.xflow
ryu.contrib.ovs
ryu.contrib.oslo.config
Oslo configuration library. Used for ryu-manager’s command-line options and configuration files.
ryu.contrib.ncclient
Ryu applications are single-threaded entities which implement various functionalities in Ryu. Events are messages
between them.
Ryu applications send asynchronous events to each other. Besides that, there are some Ryu-internal event sources
which are not Ryu applications. One of examples of such event sources is OpenFlow controller. While an event can
currently contain arbitrary python objects, it’s discouraged to pass complex objects (eg. unpickleable objects) between
Ryu applications.
Each Ryu application has a receive queue for events. The queue is FIFO and preserves the order of events. Each Ryu
application has a thread for event processing. The thread keeps draining the receive queue by dequeueing an event
and calling the appropritate event handler for the event type. Because the event handler is called in the context of the
event processing thread, it should be careful when blocking. While an event handler is blocked, no further events for
the Ryu application will be processed.
There are kinds of events which are used to implement synchronous inter-application calls between Ryu applications.
While such requests uses the same machinary as ordinary events, their replies are put on a queue dedicated to the
transaction to avoid deadlock.
While threads and queues is currently implemented with eventlet/greenlet, a direct use of them in a Ryu application is
strongly discouraged.
Contexts
Contexts are ordinary python objects shared among Ryu applications. The use of contexts are discouraged for new
code.
A Ryu application is a python module which defines a subclass of ryu.base.app_manager.RyuApp. If two or more
such classes are defined in a module, the first one (by name order) will be picked by app_manager. Ryu application is
singleton: only single instance of a given Ryu application is supported.
A Ryu application can register itself to listen for specific events using ryu.controller.handler.set_ev_cls decorator.
A Ryu application can raise events by calling appropriate ryu.base.app_manager.RyuApp’s methods like send_event
or send_event_to_observers.
An event class describes a Ryu event generated in the system. By convention, event class names are prefixed by
"Event". Events are generated either by the core part of Ryu or Ryu applications. A Ryu application can register its
interest for a specific type of event by providing a handler method using ryu.controller.handler.set_ev_cls decorator.
ryu.controller.ofp_event module exports event classes which describe receptions of OpenFlow messages from con-
nected switches. By convention, they are named as ryu.controller.ofp_event.EventOFPxxxx where xxxx is the name
of the corresponding OpenFlow message. For example, EventOFPPacketIn for packet-in message. The OpenFlow
controller part of Ryu automatically decodes OpenFlow messages received from switches and send these events to
Ryu applications which expressed an interest using ryu.controller.handler.set_ev_cls. OpenFlow event classes are
subclasses of the following class.
class ryu.controller.ofp_event.EventOFPMsgBase(msg)
The base class of OpenFlow event class.
OpenFlow event classes have at least the following attributes.
Attribute Description
msg An object which describes the corresponding OpenFlow message.
msg.datapath A ryu.controller.controller.Datapath instance which describes an OpenFlow switch from
which we received this OpenFlow message.
timestamp Timestamp when Datapath instance generated this event.
The msg object has some more additional members whose values are extracted from the original OpenFlow
message.
See OpenFlow protocol API Reference for more info about OpenFlow messages.
2.3.6 ryu.base.app_manager.RyuApp
2.3.7 ryu.controller.handler.set_ev_cls
ryu.controller.handler.set_ev_cls(ev_cls, dispatchers=None)
A decorator for Ryu application to declare an event handler.
Decorated method will become an event handler. ev_cls is an event class whose instances this RyuApp wants
to receive. dispatchers argument specifies one of the following negotiation phases (or a list of them) for which
events should be generated for this handler. Note that, in case an event changes the phase, the phase before the
change is used to check the interest.
2.3.8 ryu.controller.controller.Datapath
Attribute Description
id 64-bit OpenFlow Datapath ID. Only available for
ryu.controller.handler.MAIN_DISPATCHER phase.
ofproto A module which exports OpenFlow definitions, mainly constants
appeared in the specification, for the negotiated OpenFlow version.
For example, ryu.ofproto.ofproto_v1_0 for OpenFlow 1.0.
ofproto_parser A module which exports OpenFlow wire message encoder and
decoder for the negotiated OpenFlow version. For example,
ryu.ofproto.ofproto_v1_0_parser for OpenFlow 1.0.
ofproto_parser.OFPxxxx(datapath,...) A callable to prepare an OpenFlow message for the given switch. It
can be sent with Datapath.send_msg later. xxxx is a name of the
message. For example OFPFlowMod for flow-mod message.
Arguemnts depend on the message.
set_xid(self, msg) Generate an OpenFlow XID and put it in msg.xid.
send_msg(self, msg) Queue an OpenFlow message to send to the corresponding switch.
If msg.xid is None, set_xid is automatically called on the message
before queueing.
send_packet_out deprecated
send_flow_mod deprecated
send_flow_del deprecated
send_delete_all_flows deprecated
send_barrier Queue an OpenFlow barrier message to send to the switch.
send_nxt_set_flow_format deprecated
is_reserved_port deprecated
2.3.9 ryu.controller.event.EventBase
class ryu.controller.event.EventBase
The base of all event classes.
A Ryu application can define its own event type by creating a subclass.
2.3.10 ryu.controller.event.EventRequestBase
class ryu.controller.event.EventRequestBase
The base class for synchronous request for RyuApp.send_request.
2.3.11 ryu.controller.event.EventReplyBase
class ryu.controller.event.EventReplyBase(dst)
The base class for synchronous request reply for RyuApp.send_reply.
2.3.12 ryu.controller.ofp_event.EventOFPStateChange
class ryu.controller.ofp_event.EventOFPStateChange(dp)
An event class for negotiation phase change notification.
An instance of this class is sent to observer after changing the negotiation phase. An instance has at least the
following attributes.
Attribute Description
datapath ryu.controller.controller.Datapath instance of the switch
2.3.13 ryu.controller.ofp_event.EventOFPPortStateChange
Attribute Description
datapath ryu.controller.controller.Datapath instance of the switch
reason one of OFPPR_*
port_no Port number which state was changed
2.3.14 ryu.controller.dpset.EventDP
Attribute Description
dp A ryu.controller.controller.Datapath instance of the switch
enter True when the switch connected to our controller. False for disconnect.
ports A list of port instances.
2.3.15 ryu.controller.dpset.EventPortAdd
Attribute Description
dp A ryu.controller.controller.Datapath instance of the switch
port port number
2.3.16 ryu.controller.dpset.EventPortDelete
Attribute Description
dp A ryu.controller.controller.Datapath instance of the switch
port port number
2.3.17 ryu.controller.dpset.EventPortModify
Attribute Description
dp A ryu.controller.controller.Datapath instance of the switch
port port number
2.3.18 ryu.controller.network.EventNetworkPort
This event is generated when a port is introduced to or removed from a network by the REST API. An instance
has at least the following attributes.
Attribute Description
network_id Network ID
dpid OpenFlow Datapath ID of the switch to which the port belongs.
port_no OpenFlow port number of the port
add_del True for adding a port. False for removing a port.
2.3.19 ryu.controller.network.EventNetworkDel
class ryu.controller.network.EventNetworkDel(network_id)
An event class for network deletion.
This event is generated when a network is deleted by the REST API. An instance has at least the following
attributes.
Attribute Description
network_id Network ID
2.3.20 ryu.controller.network.EventMacAddress
Attribute Description
network_id Network ID
dpid OpenFlow Datapath ID of the switch to which the port belongs.
port_no OpenFlow port number of the port
mac_address The old MAC address of the port if add_del is False. Otherwise the new MAC address.
add_del False if this event is a result of a port removal. Otherwise True.
2.3.21 ryu.controller.tunnels.EventTunnelKeyAdd
Attribute Description
network_id Network ID
tunnel_key Tunnel Key
2.3.22 ryu.controller.tunnels.EventTunnelKeyDel
Attribute Description
network_id Network ID
tunnel_key Tunnel Key
2.3.23 ryu.controller.tunnels.EventTunnelPort
Attribute Description
dpid OpenFlow Datapath ID
port_no OpenFlow port number
remote_dpid OpenFlow port number of the tunnel peer
add_del True for adding a tunnel. False for removal.
2.4 Library
Introduction
Ryu packet library helps you to parse and build various protocol packets. dpkt is the popular library for the same
purpose, however it is not designed to handle protocols that are interleaved; vlan, mpls, gre, etc. So we implemented
our own packet library.
Network Addresses
Unless otherwise specified, MAC/IPv4/IPv6 addresses are specified using human readable strings for this library. For
example, ’08:60:6e:7f:74:e7’, ’192.0.2.1’, ’fe80::a60:6eff:fe7f:74e7’.
Parsing Packet
First, let’s look at how we can use the library to parse the received packets in a handler for OFPPacketIn messages.
@handler.set_ev_cls(ofp_event.EventOFPPacketIn, handler.MAIN_DISPATCHER)
def packet_in_handler(self, ev):
pkt = packet.Packet(array.array('B', ev.msg.data))
for p in pkt.protocols:
print p
You can create a Packet class instance with the received raw data. Then the packet library parses the data and creates
protocol class instances included the data. The packet class ’protocols’ has the protocol class instances.
If a TCP packet is received, something like the following is printed:
<ryu.lib.packet.ethernet.ethernet object at 0x107a5d790>
<ryu.lib.packet.vlan.vlan object at 0x107a5d7d0>
<ryu.lib.packet.ipv4.ipv4 object at 0x107a5d810>
<ryu.lib.packet.tcp.tcp object at 0x107a5d850>
You can access to a specific protocol class instance by using the packet class iterator. Let’s try to check VLAN id if
VLAN is used:
from ryu.lib.packet import packet
@handler.set_ev_cls(ofp_event.EventOFPPacketIn, handler.MAIN_DISPATCHER)
def packet_in_handler(self, ev):
pkt = packet.Packet(array.array('B', ev.msg.data))
for p in pkt:
print p.protocol_name, p
if p.protocol_name == 'vlan':
print 'vid = ', p.vid
Building Packet
You need to create protocol class instances that you want to send, add them to a packet class instance via add_protocol
method, and then call serialize method. You have the raw data to send. The following example is building an arp
packet.
from ryu.ofproto import ether
from ryu.lib.packet import ethernet, arp, packet
e = ethernet.ethernet(dst='ff:ff:ff:ff:ff:ff',
src='08:60:6e:7f:74:e7',
(continues on next page)
2.4. Library 17
ryu Documentation, Release 4.34
Packet class
Argument Descrpition
dict_ A dictionary which describes the parameters. For example, {"Param1": 100,
"Param2": 200}
decode_string (Optional) specify how to decode strings. The default is base64. This argument is
used only for attributes which don’t have explicit type annotations in _TYPE class
attribute.
additional_args (Optional) Additional kwargs for constructor.
get_protocol(protocol)
Returns the firstly found protocol that matches to the specified protocol.
get_protocols(protocol)
Returns a list of protocols that matches to the specified protocol.
serialize()
Encode a packet and store the resulted bytearray in self.data.
class ryu.lib.packet.stream_parser.StreamParser
Streaming parser base class.
An instance of a subclass of this class is used to extract messages from a raw byte stream.
It’s designed to be used for data read from a transport which doesn’t preserve message boundaries. A typical
example of such a transport is TCP.
exception TooSmallException
parse(data)
Tries to extract messages from a raw byte stream.
The data argument would be python bytes newly read from the input stream.
Returns an ordered list of extracted messages. It can be an empty list.
The rest of data which doesn’t produce a complete message is kept internally and will be used when more
data is come. I.e. next time this method is called again.
try_parse(q)
Try to extract a message from the given bytes.
This is an override point for subclasses.
This method tries to extract a message from bytes given by the argument.
Raises TooSmallException if the given data is not enough to extract a complete message but there’s still a
chance to extract a message if more data is come later.
List of the sub-classes:
• ryu.lib.packet.bgp.StreamParser
class ryu.lib.packet.packet_base.PacketBase
A base class for a protocol (ethernet, ipv4, ...) header.
classmethod get_packet_type(type_)
Per-protocol dict-like get method.
Provided for convenience of protocol implementers. Internal use only.
classmethod parser(buf )
Decode a protocol header.
This method is used only when decoding a packet.
Decode a protocol header at offset 0 in bytearray buf. Returns the following three objects.
• An object to describe the decoded header.
• A packet_base.PacketBase subclass appropriate for the rest of the packet. None when the rest of the
packet should be considered as raw payload.
• The rest of packet.
2.4. Library 19
ryu Documentation, Release 4.34
ARP
classmethod parser(buf )
Decode a protocol header.
This method is used only when decoding a packet.
Decode a protocol header at offset 0 in bytearray buf. Returns the following three objects.
• An object to describe the decoded header.
• A packet_base.PacketBase subclass appropriate for the rest of the packet. None when the rest of the
packet should be considered as raw payload.
• The rest of packet.
serialize(payload, prev)
Encode a protocol header.
This method is used only when encoding a packet.
Encode a protocol header. Returns a bytearray which contains the header.
payload is the rest of the packet which will immediately follow this header.
prev is a packet_base.PacketBase subclass for the outer protocol header. prev is None if the current header
is the outer-most. For example, prev is ipv4 or ipv6 for tcp.serialize.
ryu.lib.packet.arp.arp_ip(opcode, src_mac, src_ip, dst_mac, dst_ip)
A convenient wrapper for IPv4 ARP for Ethernet.
This is an equivalent of the following code.
arp(ARP_HW_TYPE_ETHERNET, ether.ETH_TYPE_IP, 6, 4, opcode, src_mac, src_ip, dst_mac,
dst_ip)
BFD
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Vers | Diag |Sta|P|F|C|A|D|M| Detect Mult | Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| My Discriminator |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Your Discriminator |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Desired Min TX Interval |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Required Min RX Interval |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Required Min Echo RX Interval |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Auth Type | Auth Len | Auth Key ID | Password... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Auth Type | Auth Len | Auth Key ID | Reserved |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Sequence Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Auth Key/Digest... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
(continues on next page)
2.4. Library 21
ryu Documentation, Release 4.34
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Auth Type | Auth Len | Auth Key ID | Reserved |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Sequence Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Auth Key/Hash... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
class ryu.lib.packet.bfd.BFDAuth(auth_len=None)
Base class of BFD (RFC 5880) Authentication Section
An instance has the following attributes at least. Most of them are same to the on-wire counterparts but in host
byte order.
Attribute Description
auth_type The authentication type in use.
auth_len The length, in bytes, of the authentication section, including the auth_type and auth_len
fields.
classmethod parser_hdr(buf )
Parser for common part of authentication section.
serialize_hdr()
Serialization function for common part of authentication section.
class ryu.lib.packet.bfd.KeyedMD5(auth_key_id, seq, auth_key=None, digest=None,
auth_len=None)
BFD (RFC 5880) Keyed MD5 Authentication Section class
An instance has the following attributes. Most of them are same to the on-wire counterparts but in host byte
order.
Attribute Description
auth_type (Fixed) The authentication type in use.
auth_key_id The authentication Key ID in use.
seq The sequence number for this packet. This value is incremented occasionally.
auth_key The shared MD5 key for this packet.
digest (Optional) The 16-byte MD5 digest for the packet.
auth_len (Fixed) The length of the authentication section is 24 bytes.
authenticate(prev, auth_keys=None)
Authenticate the MD5 digest for this packet.
This method can be invoked only when self.digest is defined.
Returns a boolean indicates whether the digest can be authenticated by the correspondent Auth Key or not.
prev is a bfd instance for the BFD Control header which this authentication section belongs to. It’s
necessary to be assigned because an MD5 digest must be calculated over the entire BFD Control packet.
auth_keys is a dictionary of authentication key chain which key is an integer of Auth Key ID and value
is a string of Auth Key.
serialize(payload, prev)
Encode a Keyed MD5 Authentication Section.
This method is used only when encoding an BFD Control packet.
payload is the rest of the packet which will immediately follow this section.
prev is a bfd instance for the BFD Control header which this authentication section belongs to. It’s
necessary to be assigned because an MD5 digest must be calculated over the entire BFD Control packet.
class ryu.lib.packet.bfd.KeyedSHA1(auth_key_id, seq, auth_key=None, auth_hash=None,
auth_len=None)
BFD (RFC 5880) Keyed SHA1 Authentication Section class
An instance has the following attributes. Most of them are same to the on-wire counterparts but in host byte
order.
Attribute Description
auth_type (Fixed) The authentication type in use.
auth_key_id The authentication Key ID in use.
seq The sequence number for this packet. This value is incremented occasionally.
auth_key The shared SHA1 key for this packet.
auth_hash (Optional) The 20-byte SHA1 hash for the packet.
auth_len (Fixed) The length of the authentication section is 28 bytes.
authenticate(prev, auth_keys=None)
Authenticate the SHA1 hash for this packet.
This method can be invoked only when self.auth_hash is defined.
Returns a boolean indicates whether the hash can be authenticated by the correspondent Auth Key or not.
prev is a bfd instance for the BFD Control header which this authentication section belongs to. It’s
necessary to be assigned because an SHA1 hash must be calculated over the entire BFD Control packet.
auth_keys is a dictionary of authentication key chain which key is an integer of Auth Key ID and value
is a string of Auth Key.
serialize(payload, prev)
Encode a Keyed SHA1 Authentication Section.
This method is used only when encoding an BFD Control packet.
payload is the rest of the packet which will immediately follow this section.
prev is a bfd instance for the BFD Control header which this authentication section belongs to. It’s
necessary to be assigned because an SHA1 hash must be calculated over the entire BFD Control packet.
class ryu.lib.packet.bfd.MeticulousKeyedMD5(auth_key_id, seq, auth_key=None, di-
gest=None, auth_len=None)
BFD (RFC 5880) Meticulous Keyed MD5 Authentication Section class
All methods of this class are inherited from KeyedMD5.
An instance has the following attributes. Most of them are same to the on-wire counterparts but in host byte
order.
2.4. Library 23
ryu Documentation, Release 4.34
Attribute Description
auth_type (Fixed) The authentication type in use.
auth_key_id The authentication Key ID in use.
seq The sequence number for this packet. This value is incremented for each successive packet
transmitted for a session.
auth_key The shared MD5 key for this packet.
digest (Optional) The 16-byte MD5 digest for the packet.
auth_len (Fixed) The length of the authentication section is 24 bytes.
Attribute Description
auth_type (Fixed) The authentication type in use.
auth_key_id The authentication Key ID in use.
seq The sequence number for this packet. This value is incremented for each successive packet
transmitted for a session.
auth_key The shared SHA1 key for this packet.
auth_hash (Optional) The 20-byte SHA1 hash for the packet.
auth_len (Fixed) The length of the authentication section is 28 bytes.
Attribute Description
auth_type (Fixed) The authentication type in use.
auth_key_id The authentication Key ID in use.
password The simple password in use on this session. The password is a binary string, and MUST be
from 1 to 16 bytes in length.
auth_len The length, in bytes, of the authentication section, including the auth_type and
auth_len fields.
authenticate(prev=None, auth_keys=None)
Authenticate the password for this packet.
This method can be invoked only when self.password is defined.
Returns a boolean indicates whether the password can be authenticated or not.
prev is a bfd instance for the BFD Control header. It’s not necessary for authenticating the Simple
Password.
auth_keys is a dictionary of authentication key chain which key is an integer of Auth Key ID and value
is a string of Password.
serialize(payload, prev)
Encode a Simple Password Authentication Section.
payload is the rest of the packet which will immediately follow this section.
prev is a bfd instance for the BFD Control header. It’s not necessary for encoding only the Simple
Password section.
class ryu.lib.packet.bfd.bfd(ver=1, diag=0, state=0, flags=0, detect_mult=0,
my_discr=0, your_discr=0, desired_min_tx_interval=0, re-
quired_min_rx_interval=0, required_min_echo_rx_interval=0,
auth_cls=None, length=None)
BFD (RFC 5880) Control packet encoder/decoder class.
The serialized packet would looks like the ones described in the following sections.
• RFC 5880 Generic BFD Control Packet Format
An instance has the following attributes at least. Most of them are same to the on-wire counterparts but in host
byte order.
__init__ takes the corresponding args in this order.
Attribute Description
ver The version number of the protocol. This class implements protocol
version 1.
diag A diagnostic code specifying the local system’s reason for the last
change in session state.
state The current BFD session state as seen by the transmitting system.
flags Bitmap of the following flags.
BFD_FLAG_POLL
BFD_FLAG_FINAL
BFD_FLAG_CTRL_PLANE_INDEP
BFD_FLAG_AUTH_PRESENT
BFD_FLAG_DEMAND
BFD_FLAG_MULTIPOINT
authenticate(*args, **kwargs)
Authenticate this packet.
Returns a boolean indicates whether the packet can be authenticated or not.
Returns False if the Authentication Present (A) is not set in the flag of this packet.
Returns False if the Authentication Section for this packet is not present.
2.4. Library 25
ryu Documentation, Release 4.34
For the description of the arguemnts of this method, refer to the authentication method of the Authentica-
tion Section classes.
pack()
Encode a BFD Control packet without authentication section.
classmethod parser(buf )
Decode a protocol header.
This method is used only when decoding a packet.
Decode a protocol header at offset 0 in bytearray buf. Returns the following three objects.
• An object to describe the decoded header.
• A packet_base.PacketBase subclass appropriate for the rest of the packet. None when the rest of the
packet should be considered as raw payload.
• The rest of packet.
serialize(payload, prev)
Encode a protocol header.
This method is used only when encoding a packet.
Encode a protocol header. Returns a bytearray which contains the header.
payload is the rest of the packet which will immediately follow this header.
prev is a packet_base.PacketBase subclass for the outer protocol header. prev is None if the current header
is the outer-most. For example, prev is ipv4 or ipv6 for tcp.serialize.
BGP
class ryu.lib.packet.bgp.BGPEvpnMacMobilityExtendedCommunity(**kwargs)
MAC Mobility Extended Community
class ryu.lib.packet.bgp.BGPFlowSpecRedirectCommunity(**kwargs)
Flow Specification Traffic Filtering Actions for Redirect.
Attribute Description
as_number Autonomous System number.
local_administrator Local Administrator.
class ryu.lib.packet.bgp.BGPFlowSpecTPIDActionCommunity(**kwargs)
Flow Specification TPID Actions.
At- Description
tribute
actions Bit representation of actions. Supported actions are TI(inner TPID action) and
TO(outer TPID action).
tpid_1 TPID used by TI.
tpid_2 TPID used by TO.
class ryu.lib.packet.bgp.BGPFlowSpecTrafficActionCommunity(**kwargs)
Flow Specification Traffic Filtering Actions for Traffic Action.
Attribute Description
action Apply action. The supported action are SAMPLE and TERMINAL.
class ryu.lib.packet.bgp.BGPFlowSpecTrafficMarkingCommunity(**kwargs)
Flow Specification Traffic Filtering Actions for Traffic Marking.
Attribute Description
dscp Differentiated Services Code Point.
class ryu.lib.packet.bgp.BGPFlowSpecTrafficRateCommunity(**kwargs)
Flow Specification Traffic Filtering Actions for Traffic Rate.
Attribute Description
as_number Autonomous System number.
rate_info rate information.
class ryu.lib.packet.bgp.BGPFlowSpecVlanActionCommunity(**kwargs)
Flow Specification Vlan Actions.
At- Description
tribute
ac- Bit representation of actions. Supported actions are POP, PUSH, SWAP, REWRITE_INNER,
tions_1 REWRITE_OUTER.
ac- Same as actions_1.
tions_2
vlan_1 VLAN ID used by actions_1.
cos_1 Class of Service used by actions_1.
vlan_2 VLAN ID used by actions_2.
cos_2 Class of Service used by actions_2.
2.4. Library 27
ryu Documentation, Release 4.34
Attribute Description
marker Marker field. Ignored when encoding.
len Length field. Ignored when encoding.
type Type field.
classmethod parser(buf )
Decode a protocol header.
This method is used only when decoding a packet.
Decode a protocol header at offset 0 in bytearray buf. Returns the following three objects.
• An object to describe the decoded header.
• A packet_base.PacketBase subclass appropriate for the rest of the packet. None when the rest of the
packet should be considered as raw payload.
• The rest of packet.
class ryu.lib.packet.bgp.BGPMessage(marker=None, len_=None, type_=None)
Base class for BGP-4 messages.
An instance has the following attributes at least. Most of them are same to the on-wire counterparts but in host
byte order. __init__ takes the corresponding args in this order.
Attribute Description
marker Marker field. Ignored when encoding.
len Length field. Ignored when encoding.
type Type field. one of BGP_MSG_* constants.
classmethod parser(buf )
Decode a protocol header.
This method is used only when decoding a packet.
Decode a protocol header at offset 0 in bytearray buf. Returns the following three objects.
• An object to describe the decoded header.
• A packet_base.PacketBase subclass appropriate for the rest of the packet. None when the rest of the
packet should be considered as raw payload.
• The rest of packet.
serialize(payload=None, prev=None)
Encode a protocol header.
This method is used only when encoding a packet.
Encode a protocol header. Returns a bytearray which contains the header.
payload is the rest of the packet which will immediately follow this header.
prev is a packet_base.PacketBase subclass for the outer protocol header. prev is None if the current header
is the outer-most. For example, prev is ipv4 or ipv6 for tcp.serialize.
Attribute Description
marker Marker field. Ignored when encoding.
len Length field. Ignored when encoding.
type Type field.
error_code Error code field.
error_subcode Error subcode field.
data Data field.
classmethod parser(buf )
Decode a protocol header.
This method is used only when decoding a packet.
Decode a protocol header at offset 0 in bytearray buf. Returns the following three objects.
• An object to describe the decoded header.
• A packet_base.PacketBase subclass appropriate for the rest of the packet. None when the rest of the
packet should be considered as raw payload.
• The rest of packet.
class ryu.lib.packet.bgp.BGPOpen(my_as, bgp_identifier, type_=1, opt_param_len=0,
opt_param=None, version=4, hold_time=0, len_=None,
marker=None)
BGP-4 OPEN Message encoder/decoder class.
An instance has the following attributes at least. Most of them are same to the on-wire counterparts but in host
byte order. __init__ takes the corresponding args in this order.
Attribute Description
marker Marker field. Ignored when encoding.
len Length field. Ignored when encoding.
type Type field.
version Version field.
my_as My Autonomous System field. 2 octet unsigned integer.
hold_time Hold Time field. 2 octet unsigned integer.
bgp_identifier BGP Identifier field. An IPv4 address. For example, ’192.0.2.1’
opt_param_len Optional Parameters Length field. Ignored when encoding.
opt_param Optional Parameters field. A list of BGPOptParam instances. The default is [].
classmethod parser(buf )
Decode a protocol header.
This method is used only when decoding a packet.
Decode a protocol header at offset 0 in bytearray buf. Returns the following three objects.
• An object to describe the decoded header.
• A packet_base.PacketBase subclass appropriate for the rest of the packet. None when the rest of the
packet should be considered as raw payload.
2.4. Library 29
ryu Documentation, Release 4.34
Argument Descrpition
dict_ A dictionary which describes the parameters. For example, {"Param1": 100,
"Param2": 200}
decode_string (Optional) specify how to decode strings. The default is base64. This argument is
used only for attributes which don’t have explicit type annotations in _TYPE class
attribute.
additional_args (Optional) Additional kwargs for constructor.
Attribute Description
marker Marker field. Ignored when encoding.
len Length field. Ignored when encoding.
type Type field.
afi Address Family Identifier
safi Subsequent Address Family Identifier
classmethod parser(buf )
Decode a protocol header.
This method is used only when decoding a packet.
Decode a protocol header at offset 0 in bytearray buf. Returns the following three objects.
• An object to describe the decoded header.
• A packet_base.PacketBase subclass appropriate for the rest of the packet. None when the rest of the
packet should be considered as raw payload.
• The rest of packet.
class ryu.lib.packet.bgp.BGPUpdate(type_=2, withdrawn_routes_len=None, with-
drawn_routes=None, total_path_attribute_len=None,
path_attributes=None, nlri=None, len_=None,
marker=None)
BGP-4 UPDATE Message encoder/decoder class.
An instance has the following attributes at least. Most of them are same to the on-wire counterparts but in host
byte order. __init__ takes the corresponding args in this order.
Attribute Description
marker Marker field. Ignored when encoding.
len Length field. Ignored when encoding.
type Type field.
withdrawn_routes_len Withdrawn Routes Length field. Ignored when encoding.
withdrawn_routes Withdrawn Routes field. A list of BGPWithdrawnRoute instances. The default is
[].
total_path_attribute_len Total Path Attribute Length field. Ignored when encoding.
path_attributes Path Attributes field. A list of BGPPathAttribute instances. The default is [].
nlri Network Layer Reachability Information field. A list of BGPNLRI instances.
The default is [].
classmethod parser(buf )
Decode a protocol header.
This method is used only when decoding a packet.
Decode a protocol header at offset 0 in bytearray buf. Returns the following three objects.
• An object to describe the decoded header.
• A packet_base.PacketBase subclass appropriate for the rest of the packet. None when the rest of the
packet should be considered as raw payload.
• The rest of packet.
exception ryu.lib.packet.bgp.BadBgpId(data=”)
Error to indicate incorrect BGP Identifier.
RFC says: If the BGP Identifier field of the OPEN message is syntactically incorrect, then the Error Subcode
MUST be set to Bad BGP Identifier. Syntactic correctness means that the BGP Identifier field represents a valid
unicast IP host address.
exception ryu.lib.packet.bgp.BadLen(msg_type_code, message_length)
exception ryu.lib.packet.bgp.BadMsg(msg_type)
Error to indicate un-recognized message type.
RFC says: If the Type field of the message header is not recognized, then the Error Subcode MUST be set to
Bad Message Type. The Data field MUST contain the erroneous Type field.
exception ryu.lib.packet.bgp.BadNotification(data=”)
exception ryu.lib.packet.bgp.BadPeerAs(data=”)
Error to indicate open message has incorrect AS number.
RFC says: If the Autonomous System field of the OPEN message is unacceptable, then the Error Subcode
MUST be set to Bad Peer AS. The determination of acceptable Autonomous System numbers is configure peer
AS.
exception ryu.lib.packet.bgp.BgpExc(data=”)
Base bgp exception.
CODE = 0
BGP error code.
SEND_ERROR = True
Flag if set indicates Notification message should be sent to peer.
SUB_CODE = 0
BGP error sub-code.
2.4. Library 31
ryu Documentation, Release 4.34
exception ryu.lib.packet.bgp.CollisionResolution(data=”)
Error to indicate Connection Collision Resolution.
RFC says: If a BGP speaker decides to send a NOTIFICATION message with the Error Code Cease as a result of
the collision resolution procedure (as described in [BGP-4]), then the subcode SHOULD be set to "Connection
Collision Resolution".
exception ryu.lib.packet.bgp.ConnRejected(data=”)
Error to indicate Connection Rejected.
RFC says: If a BGP speaker decides to disallow a BGP connection (e.g., the peer is not configured locally) after
the speaker accepts a transport protocol connection, then the BGP speaker SHOULD send a NOTIFICATION
message with the Error Code Cease and the Error Subcode "Connection Rejected".
class ryu.lib.packet.bgp.EvpnASBasedEsi(as_number, local_disc, type_=None)
AS based ESI value
This type indicates an Autonomous System(AS)-based ESI Value that can be auto-generated or configured by
the operator.
class ryu.lib.packet.bgp.EvpnArbitraryEsi(value, type_=None)
Arbitrary 9-octet ESI value
This type indicates an arbitrary 9-octet ESI value, which is managed and configured by the operator.
class ryu.lib.packet.bgp.EvpnEsi(type_=None)
Ethernet Segment Identifier
The supported ESI Types:
• EvpnEsi.ARBITRARY indicates EvpnArbitraryEsi.
• EvpnEsi.LACP indicates EvpnLACPEsi.
• EvpnEsi.L2_BRIDGE indicates EvpnL2BridgeEsi.
• EvpnEsi.MAC_BASED indicates EvpnMacBasedEsi.
• EvpnEsi.ROUTER_ID indicates EvpnRouterIDEsi.
• EvpnEsi.AS_BASED indicates EvpnASBasedEsi.
class ryu.lib.packet.bgp.EvpnEthernetAutoDiscoveryNLRI(route_dist, esi,
ethernet_tag_id,
mpls_label=None,
vni=None, label=None,
type_=None, length=None)
Ethernet A-D route type specific EVPN NLRI
class ryu.lib.packet.bgp.EvpnEthernetSegmentNLRI(route_dist, esi, ip_addr,
ip_addr_len=None, type_=None,
length=None)
Ethernet Segment route type specific EVPN NLRI
class ryu.lib.packet.bgp.EvpnInclusiveMulticastEthernetTagNLRI(route_dist, eth-
ernet_tag_id,
ip_addr,
ip_addr_len=None,
type_=None,
length=None)
Inclusive Multicast Ethernet Tag route type specific EVPN NLRI
2.4. Library 33
ryu Documentation, Release 4.34
Attribute Description
LF Last fragment
FF First fragment
ISF Is a fragment
DF Don’t fragment
Example:
2.4. Library 35
ryu Documentation, Release 4.34
Keyword Description
< Less than comparison between data and value.
<= Less than or equal to comparison between data and value.
> Greater than comparison between data and value.
>= Greater than or equal to comparison between data and value.
== Equality between data and value. This operator can be omitted.
The following keywords can be used when the operator type is Bitmask.
Keyword Description
!= Not equal operation.
== Exact match operation if specified. Otherwise partial match operation.
+ Used for the summation of bitmask values. (e.g., SYN+ACK)
You can combine the multiple conditions with the following operators.
Keyword Description
| Logical OR operation
& Logical AND operation
Attribute Description
LF Last fragment
FF First fragment
ISF Is a fragment
Note: For dst_prefix and src_prefix, you can give "offset" value like this: 2001::2/128/32.
At this case, offset is 32. offset can be omitted, then offset is treated as 0.
2.4. Library 37
ryu Documentation, Release 4.34
2.4. Library 39
ryu Documentation, Release 4.34
class ryu.lib.packet.bgp.PmsiTunnelIdUnknown(value)
Unknown route type specific _PmsiTunnelId
class ryu.lib.packet.bgp.RouteTargetMembershipNLRI(origin_as, route_target)
Route Target Membership NLRI.
Route Target membership NLRI is advertised in BGP UPDATE messages using the MP_REACH_NLRI and
MP_UNREACH_NLRI attributes.
exception ryu.lib.packet.bgp.RoutingLoop(data=”)
class ryu.lib.packet.bgp.StreamParser
Streaming parser for BGP-4 messages.
This is a subclass of ryu.lib.packet.stream_parser.StreamParser. Its parse method returns a list of BGPMessage
subclass instances.
try_parse(data)
Try to extract a message from the given bytes.
This is an override point for subclasses.
This method tries to extract a message from bytes given by the argument.
Raises TooSmallException if the given data is not enough to extract a complete message but there’s still a
chance to extract a message if more data is come later.
exception ryu.lib.packet.bgp.UnRegWellKnowAttr(data=”)
exception ryu.lib.packet.bgp.UnacceptableHoldTime(data=”)
Error to indicate Unacceptable Hold Time in open message.
RFC says: If the Hold Time field of the OPEN message is unacceptable, then the Error Subcode MUST be set
to Unacceptable Hold Time.
exception ryu.lib.packet.bgp.UnsupportedOptParam(data=”)
Error to indicate unsupported optional parameters.
RFC says: If one of the Optional Parameters in the OPEN message is not recognized, then the Error Subcode
MUST be set to Unsupported Optional Parameters.
exception ryu.lib.packet.bgp.UnsupportedVersion(locally_support_version)
Error to indicate unsupport bgp version number.
RFC says: If the version number in the Version field of the received OPEN message is not supported, then the
Error Subcode MUST be set to Unsupported Version Number. The Data field is a 2-octet unsigned integer,
which indicates the largest, locally-supported version number less than the version the remote BGP peer bid (as
indicated in the received OPEN message), or if the smallest, locally-supported version number is greater than
the version the remote BGP peer bid, then the smallest, locally- supported version number.
BMP
2.4. Library 41
ryu Documentation, Release 4.34
Attribute Description
version Version. this packet lib defines BMP ver. 3
len Length field. Ignored when encoding.
type Type field. one of BMP_MSG_ constants.
info One or more piece of information encoded as a TLV
classmethod parser(buf )
Decode a protocol header.
This method is used only when decoding a packet.
Decode a protocol header at offset 0 in bytearray buf. Returns the following three objects.
• An object to describe the decoded header.
• A packet_base.PacketBase subclass appropriate for the rest of the packet. None when the rest of the
packet should be considered as raw payload.
• The rest of packet.
class ryu.lib.packet.bmp.BMPMessage(type_, len_=None, version=3)
Base class for BGP Monitoring Protocol messages.
An instance has the following attributes at least. Most of them are same to the on-wire counterparts but in host
byte order. __init__ takes the corresponding args in this order.
Attribute Description
version Version. this packet lib defines BMP ver. 3
len Length field. Ignored when encoding.
type Type field. one of BMP_MSG_ constants.
classmethod parser(buf )
Decode a protocol header.
This method is used only when decoding a packet.
Decode a protocol header at offset 0 in bytearray buf. Returns the following three objects.
• An object to describe the decoded header.
• A packet_base.PacketBase subclass appropriate for the rest of the packet. None when the rest of the
packet should be considered as raw payload.
• The rest of packet.
serialize()
Encode a protocol header.
This method is used only when encoding a packet.
Encode a protocol header. Returns a bytearray which contains the header.
payload is the rest of the packet which will immediately follow this header.
prev is a packet_base.PacketBase subclass for the outer protocol header. prev is None if the current header
is the outer-most. For example, prev is ipv4 or ipv6 for tcp.serialize.
Attribute Description
version Version. this packet lib defines BMP ver. 3
len Length field. Ignored when encoding.
type Type field. one of BMP_MSG_ constants.
reason Reason indicates why the session was closed.
data vary by the reason.
classmethod parser(buf )
Decode a protocol header.
This method is used only when decoding a packet.
Decode a protocol header at offset 0 in bytearray buf. Returns the following three objects.
• An object to describe the decoded header.
• A packet_base.PacketBase subclass appropriate for the rest of the packet. None when the rest of the
packet should be considered as raw payload.
• The rest of packet.
class ryu.lib.packet.bmp.BMPPeerMessage(peer_type, is_post_policy, peer_distinguisher,
peer_address, peer_as, peer_bgp_id, times-
tamp, version=3, type_=None, len_=None,
is_adj_rib_out=False)
BMP Message with Per Peer Header
Following BMP Messages contain Per Peer Header after Common BMP Header.
• BMP_MSG_TYPE_ROUTE_MONITRING
• BMP_MSG_TYPE_STATISTICS_REPORT
• BMP_MSG_PEER_UP_NOTIFICATION
Attribute Description
version Version. this packet lib defines BMP ver. 3
len Length field. Ignored when encoding.
type Type field. one of BMP_MSG_ constants.
peer_type The type of the peer.
is_post_policy Indicate the message reflects the post-policy
is_adj_rib_out Indicate the message reflects Adj-RIB-Out (defaults to Adj-RIB-In)
peer_distinguisher Use for L3VPN router which can have multiple instance.
peer_address The remote IP address associated with the TCP session.
peer_as The Autonomous System number of the peer.
peer_bgp_id The BGP Identifier of the peer
timestamp The time when the encapsulated routes were received.
classmethod parser(buf )
Decode a protocol header.
2.4. Library 43
ryu Documentation, Release 4.34
Attribute Description
version Version. this packet lib defines BMP ver. 3
len Length field. Ignored when encoding.
type Type field. one of BMP_MSG_ constants.
peer_type The type of the peer.
peer_flags Provide more information about the peer.
peer_distinguisher Use for L3VPN router which can have multiple instance.
peer_address The remote IP address associated with the TCP session.
peer_as The Autonomous System number of the peer.
peer_bgp_id The BGP Identifier of the peer
timestamp The time when the encapsulated routes were received.
local_address The local IP address associated with the peering TCP session.
local_port The local port number associated with the peering TCP session.
remote_port The remote port number associated with the peering TCP session.
sent_open_message The full OPEN message transmitted by the monitored router to its peer.
received_open_message The full OPEN message received by the monitored router from its peer.
classmethod parser(buf )
Decode a protocol header.
This method is used only when decoding a packet.
Decode a protocol header at offset 0 in bytearray buf. Returns the following three objects.
• An object to describe the decoded header.
• A packet_base.PacketBase subclass appropriate for the rest of the packet. None when the rest of the
packet should be considered as raw payload.
• The rest of packet.
class ryu.lib.packet.bmp.BMPRouteMonitoring(bgp_update, peer_type, is_post_policy,
peer_distinguisher, peer_address, peer_as,
peer_bgp_id, timestamp, version=3,
type_=0, len_=None, is_adj_rib_out=False)
BMP Route Monitoring Message
Attribute Description
version Version. this packet lib defines BMP ver. 3
len Length field. Ignored when encoding.
type Type field. one of BMP_MSG_ constants.
peer_type The type of the peer.
peer_flags Provide more information about the peer.
peer_distinguisher Use for L3VPN router which can have multiple instance.
peer_address The remote IP address associated with the TCP session.
peer_as The Autonomous System number of the peer.
peer_bgp_id The BGP Identifier of the peer
timestamp The time when the encapsulated routes were received.
bgp_update BGP Update PDU
classmethod parser(buf )
Decode a protocol header.
This method is used only when decoding a packet.
Decode a protocol header at offset 0 in bytearray buf. Returns the following three objects.
• An object to describe the decoded header.
• A packet_base.PacketBase subclass appropriate for the rest of the packet. None when the rest of the
packet should be considered as raw payload.
• The rest of packet.
class ryu.lib.packet.bmp.BMPStatisticsReport(stats, peer_type, is_post_policy,
peer_distinguisher, peer_address,
peer_as, peer_bgp_id, timestamp,
version=3, type_=1, len_=None,
is_adj_rib_out=False)
BMP Statistics Report Message
Attribute Description
version Version. this packet lib defines BMP ver. 3
len Length field. Ignored when encoding.
type Type field. one of BMP_MSG_ constants.
peer_type The type of the peer.
peer_flags Provide more information about the peer.
peer_distinguisher Use for L3VPN router which can have multiple instance.
peer_address The remote IP address associated with the TCP session.
peer_as The Autonomous System number of the peer.
peer_bgp_id The BGP Identifier of the peer
timestamp The time when the encapsulated routes were received.
stats Statistics (one or more stats encoded as a TLV)
classmethod parser(buf )
Decode a protocol header.
This method is used only when decoding a packet.
Decode a protocol header at offset 0 in bytearray buf. Returns the following three objects.
• An object to describe the decoded header.
2.4. Library 45
ryu Documentation, Release 4.34
• A packet_base.PacketBase subclass appropriate for the rest of the packet. None when the rest of the
packet should be considered as raw payload.
• The rest of packet.
class ryu.lib.packet.bmp.BMPTermination(info, type_=5, len_=None, version=3)
BMP Termination Message
Attribute Description
version Version. this packet lib defines BMP ver. 3
len Length field. Ignored when encoding.
type Type field. one of BMP_MSG_ constants.
info One or more piece of information encoded as a TLV
classmethod parser(buf )
Decode a protocol header.
This method is used only when decoding a packet.
Decode a protocol header at offset 0 in bytearray buf. Returns the following three objects.
• An object to describe the decoded header.
• A packet_base.PacketBase subclass appropriate for the rest of the packet. None when the rest of the
packet should be considered as raw payload.
• The rest of packet.
BPDU
Structure Octet
Protocol Identifier = 0000 0000 0000 0000 1-2
Protocol Version Identifier = 0000 0000 3
BPDU Type = 0000 0000 4
Flags 5
6 - 13
Root Identifier
include - priority system ID extension
MAC address
26 - 27
Port Identifier
include - priority port number
Message Age 28 - 29
Max Age 30 - 31
Hello Time 32 - 33
Forward Delay 34 - 35
Structure Octet
Protocol Identifier = 0000 0000 0000 0000 1-2
Protocol Version Identifier = 0000 0000 3
BPDU Type = 1000 0000 4
2.4. Library 47
ryu Documentation, Release 4.34
Structure Octet
Protocol Identifier = 0000 0000 0000 0000 1-2
Protocol Version Identifier = 0000 0010 3
BPDU Type = 0000 0010 4
Flags 5
6 - 13
Root Identifier
include - priority system ID extension
MAC address
26 - 27
Port Identifier
include - priority port number
Message Age 28 - 29
Max Age 30 - 31
Hello Time 32 - 33
Forward Delay 34 - 35
Version 1 Length = 0000 0000 36
Attribute Description
flags
Bit 1: Topology Change flag
Bits 2 through 7: unused and take the value 0
Bit 8: Topology Change Acknowledgment flag
classmethod parser(buf )
Decode a protocol header.
This method is used only when decoding a packet.
Decode a protocol header at offset 0 in bytearray buf. Returns the following three objects.
• An object to describe the decoded header.
• A packet_base.PacketBase subclass appropriate for the rest of the packet. None when the rest of the
packet should be considered as raw payload.
• The rest of packet.
serialize(payload, prev)
Encode a protocol header.
This method is used only when encoding a packet.
Encode a protocol header. Returns a bytearray which contains the header.
payload is the rest of the packet which will immediately follow this header.
prev is a packet_base.PacketBase subclass for the outer protocol header. prev is None if the current header
is the outer-most. For example, prev is ipv4 or ipv6 for tcp.serialize.
class ryu.lib.packet.bpdu.RstBPDUs(flags=0, root_priority=32768,
root_system_id_extension=0,
root_mac_address=’00:00:00:00:00:00’,
root_path_cost=0, bridge_priority=32768,
bridge_system_id_extension=0,
bridge_mac_address=’00:00:00:00:00:00’,
port_priority=128, port_number=0, message_age=0,
max_age=20, hello_time=2, forward_delay=15)
Rapid Spanning Tree BPDUs(RST BPDUs, IEEE 802.1D) header encoder/decoder class.
An instance has the following attributes at least. Most of them are same to the on-wire counterparts but in host
byte order. __init__ takes the corresponding args in this order.
2.4. Library 49
ryu Documentation, Release 4.34
Attribute Description
flags
Bit 1: Topology Change flag
Bit 2: Proposal flag
Bits 3 and 4: Port Role
Bit 5: Learning flag
Bit 6: Forwarding flag
Bit 7: Agreement flag
Bit 8: Topology Change Acknowledgment flag
classmethod parser(buf )
Decode a protocol header.
This method is used only when decoding a packet.
Decode a protocol header at offset 0 in bytearray buf. Returns the following three objects.
• An object to describe the decoded header.
• A packet_base.PacketBase subclass appropriate for the rest of the packet. None when the rest of the
packet should be considered as raw payload.
• The rest of packet.
serialize(payload, prev)
Encode a protocol header.
This method is used only when encoding a packet.
Encode a protocol header. Returns a bytearray which contains the header.
payload is the rest of the packet which will immediately follow this header.
prev is a packet_base.PacketBase subclass for the outer protocol header. prev is None if the current header
is the outer-most. For example, prev is ipv4 or ipv6 for tcp.serialize.
class ryu.lib.packet.bpdu.TopologyChangeNotificationBPDUs
Topology Change Notification BPDUs(IEEE 802.1D) header encoder/decoder class.
classmethod parser(buf )
Decode a protocol header.
This method is used only when decoding a packet.
Decode a protocol header at offset 0 in bytearray buf. Returns the following three objects.
• An object to describe the decoded header.
• A packet_base.PacketBase subclass appropriate for the rest of the packet. None when the rest of the
packet should be considered as raw payload.
• The rest of packet.
class ryu.lib.packet.bpdu.bpdu
Bridge Protocol Data Unit(BPDU) header encoder/decoder base class.
classmethod parser(buf )
Decode a protocol header.
This method is used only when decoding a packet.
Decode a protocol header at offset 0 in bytearray buf. Returns the following three objects.
• An object to describe the decoded header.
• A packet_base.PacketBase subclass appropriate for the rest of the packet. None when the rest of the
packet should be considered as raw payload.
• The rest of packet.
serialize(payload, prev)
Encode a protocol header.
This method is used only when encoding a packet.
Encode a protocol header. Returns a bytearray which contains the header.
payload is the rest of the packet which will immediately follow this header.
prev is a packet_base.PacketBase subclass for the outer protocol header. prev is None if the current header
is the outer-most. For example, prev is ipv4 or ipv6 for tcp.serialize.
CFM
2.4. Library 51
ryu Documentation, Release 4.34
Attribute Description
md_lv Maintenance Domain Level.
version The protocol version number.
rdi RDI bit.
interval CCM Interval.The default is 4 (1 frame/s)
seq_num Sequence Number.
mep_id Maintenance association End Point Identifier.
md_name_format Maintenance Domain Name Format. The default is 4 (Character string)
md_name_length Maintenance Domain Name Length. (0 means automatically-calculate when
encoding.)
md_name Maintenance Domain Name.
short_ma_name_format Short MA Name Format. The default is 2 (Character string)
short_ma_name_length Short MA Name Format Length. (0 means automatically-calculate when
encoding.)
short_ma_name Short MA Name.
tlvs TLVs.
class ryu.lib.packet.cfm.cfm(op=None)
CFM (Connectivity Fault Management) Protocol header class.
http://standards.ieee.org/getieee802/download/802.1ag-2007.pdf
OpCode Field range assignments
An instance has the following attributes at least. Most of them are same to the on-wire counterparts but in host
byte order. __init__ takes the corresponding args in this order.
Attribute Description
op CFM PDU
classmethod parser(buf )
Decode a protocol header.
This method is used only when decoding a packet.
Decode a protocol header at offset 0 in bytearray buf. Returns the following three objects.
• An object to describe the decoded header.
• A packet_base.PacketBase subclass appropriate for the rest of the packet. None when the rest of the
packet should be considered as raw payload.
• The rest of packet.
serialize(payload, prev)
Encode a protocol header.
This method is used only when encoding a packet.
Encode a protocol header. Returns a bytearray which contains the header.
payload is the rest of the packet which will immediately follow this header.
prev is a packet_base.PacketBase subclass for the outer protocol header. prev is None if the current header
is the outer-most. For example, prev is ipv4 or ipv6 for tcp.serialize.
class ryu.lib.packet.cfm.data_tlv(length=0, data_value=b”)
CFM (IEEE Std 802.1ag-2007) Data TLV encoder/decoder class.
This is used with ryu.lib.packet.cfm.cfm.
An instance has the following attributes at least. Most of them are same to the on-wire counterparts but in host
byte order. __init__ takes the corresponding args in this order.
Attribute Description
length Length of Value field. (0 means automatically-calculate when encoding)
data_value Bit pattern of any of n octets.(n = length)
Attribute Description
length Length of Value field. (0 means automatically-calculate when encoding.)
interface_status Interface Status.The default is 1 (isUp)
Attribute Description
md_lv Maintenance Domain Level.
version The protocol version number.
use_fdb_only UseFDBonly bit.
transaction_id LTM Transaction Identifier.
ttl LTM TTL.
ltm_orig_addr Original MAC Address.
ltm_targ_addr Target MAC Address.
tlvs TLVs.
2.4. Library 53
ryu Documentation, Release 4.34
Attribute Description
version The protocol version number.
use_fdb_only UseFDBonly bit.
fwd_yes FwdYes bit.
terminal_mep TerminalMep bit.
transaction_id LTR Transaction Identifier.
ttl Reply TTL.
relay_action Relay Action.The default is 1 (RlyHit)
tlvs TLVs.
Attribute Description
md_lv Maintenance Domain Level.
version The protocol version number.
transaction_id Loopback Transaction Identifier.
tlvs TLVs.
Attribute Description
md_lv Maintenance Domain Level.
version The protocol version number.
transaction_id Loopback Transaction Identifier.
tlvs TLVs.
An instance has the following attributes at least. Most of them are same to the on-wire counterparts but in host
byte order. __init__ takes the corresponding args in this order.
Attribute Description
length Length of Value field. (0 means automatically-calculate when encoding.)
egress_id_ui Egress Identifier of Unique ID.
egress_id_mac Egress Identifier of MAC address.
Attribute Description
length Length of Value field. (0 means automatically-calculate when encoding.)
last_egress_id_ui Last Egress Identifier of Unique ID.
last_egress_id_mac Last Egress Identifier of MAC address.
next_egress_id_ui Next Egress Identifier of Unique ID.
next_egress_id_mac Next Egress Identifier of MAC address.
Attribute Description
length Length of Value field. (0 means automatically-calculate when encoding.)
oui Organizationally Unique Identifier.
subtype Subtype.
value Value.(optional)
Attribute Description
length Length of Value field. (0 means automatically-calculate when encoding.)
port_status Port Status.The default is 1 (psUp)
2.4. Library 55
ryu Documentation, Release 4.34
Attribute Description
length Length of Value field. (0 means automatically-calculate when encoding.)
action Egress Action.The default is 1 (EgrOK)
mac_address Egress MAC Address.
port_id_length Egress PortID Length. (0 means automatically-calculate when encoding.)
port_id_subtype Egress PortID Subtype.
port_id Egress PortID.
Attribute Description
length Length of Value field. (0 means automatically-calculate when encoding.)
action Ingress Action.The default is 1 (IngOK)
mac_address Ingress MAC Address.
port_id_length Ingress PortID Length. (0 means automatically-calculate when encoding.)
port_id_subtype Ingress PortID Subtype.
port_id Ingress PortID.
Attribute Description
length Length of Value field. (0 means automatically-calculate when encoding.)
chassis_id_length Chassis ID Length. (0 means automatically-calculate when encoding.)
chassis_id_subtype Chassis ID Subtype. The default is 4 (Mac Address)
chassis_id Chassis ID.
ma_domain_length Management Address Domain Length. (0 means automatically-calculate when
encoding.)
ma_domain Management Address Domain.
ma_length Management Address Length. (0 means automatically-calculate when encoding.)
ma Management Address.
DHCP
Attribute Description
op Message op code / message type. 1 = BOOTREQUEST, 2 = BOOTREPLY
htype Hardware address type (e.g. ’1’ = 10mb ethernet).
hlen Hardware address length (e.g. ’6’ = 10mb ethernet).
hops Client sets to zero, optionally used by relay agent when booting via a relay agent.
xid Transaction ID, a random number chosen by the client, used by the client and serverto associate
messages and responses between a client and a server.
secs Filled in by client, seconds elapsed since client began address acquisition or renewal process.
flags Flags.
ciaddr Client IP address; only filled in if client is in BOUND, RENEW or REBINDING state and can
respond to ARP requests.
yiaddr ’your’ (client) IP address.
siaddr IP address of next server to use in bootstrap; returned in DHCPOFFER, DHCPACK by server.
giaddr Relay agent IP address, used in booting via a relay agent.
chaddr Client hardware address.
sname Optional server host name, null terminated string.
boot_file Boot file name, null terminated string; "generic" name or null in DHCPDISCOVER, fully
qualified directory-path name in DHCPOFFER.
options Optional parameters field (’DHCP message type’ option must be included in every DHCP
message).
classmethod parser(buf )
Decode a protocol header.
This method is used only when decoding a packet.
Decode a protocol header at offset 0 in bytearray buf. Returns the following three objects.
2.4. Library 57
ryu Documentation, Release 4.34
Attribute Description
tag Option type. (except for the ’magic cookie’, ’pad option’ and ’end option’.)
value Option’s value. (set the value that has been converted to hexadecimal.)
length Option’s value length. (calculated automatically from the length of value.)
Attribute Description
option_list ’end option’ and ’pad option’ are added automatically after the option class is stored in
array.
options_len Option’s byte length. (’magic cookie’, ’end option’ and ’pad option’ length including.)
magic_cookie The first four octets contain the decimal values 99, 130, 83 and 99.
DHCP6
There are two relay agent messages, which share the following format:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| msg_type | hop_count | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| |
| link_address |
| |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-|
| | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| |
| peer_address |
| |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-|
| | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
. .
. options (variable number and length) .... .
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Attribute Description
msg_type Identifies the DHCP message type
transac- For unrelayed messages only: the transaction ID for this message exchange.
tion_id
hop_count For relayed messages only: number of relay agents that have relayed this message.
link_address For relayed messages only: a global or site-local address that will be used by the server to
identify the link on which the client is located.
peer_addressFor relayed messages only: the address of the client or relay agent from which the message to
be relayed was received.
options Options carried in this message
classmethod parser(buf )
Decode a protocol header.
This method is used only when decoding a packet.
2.4. Library 59
ryu Documentation, Release 4.34
Decode a protocol header at offset 0 in bytearray buf. Returns the following three objects.
• An object to describe the decoded header.
• A packet_base.PacketBase subclass appropriate for the rest of the packet. None when the rest of the
packet should be considered as raw payload.
• The rest of packet.
serialize(payload=None, prev=None)
Encode a protocol header.
This method is used only when encoding a packet.
Encode a protocol header. Returns a bytearray which contains the header.
payload is the rest of the packet which will immediately follow this header.
prev is a packet_base.PacketBase subclass for the outer protocol header. prev is None if the current header
is the outer-most. For example, prev is ipv4 or ipv6 for tcp.serialize.
class ryu.lib.packet.dhcp6.option(code, data, length=0)
DHCP (RFC 3315) options encoder/decoder class.
This is used with ryu.lib.packet.dhcp6.dhcp6.options.
An instance has the following attributes at least. Most of them are same to the on-wire counterparts but in host
byte order. __init__ takes the corresponding args in this order.
The format of DHCP options is:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| option-code | option-len |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| option-data |
| (option-len octets) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Attribute Description
option-code An unsigned integer identifying the specific option type carried in this option.
option-len An unsigned integer giving the length of the option-data field in this option in octets.
option-data The data for the option; the format of this data depends on the definition of the option.
Ethernet
classmethod get_packet_type(type_)
Override method for the ethernet IEEE802.3 Length/Type field (self.ethertype).
If the value of Length/Type field is less than or equal to 1500 decimal(05DC hexadecimal), it means Length
interpretation and be passed to the LLC sublayer.
classmethod parser(buf )
Decode a protocol header.
This method is used only when decoding a packet.
Decode a protocol header at offset 0 in bytearray buf. Returns the following three objects.
• An object to describe the decoded header.
• A packet_base.PacketBase subclass appropriate for the rest of the packet. None when the rest of the
packet should be considered as raw payload.
• The rest of packet.
serialize(payload, prev)
Encode a protocol header.
This method is used only when encoding a packet.
Encode a protocol header. Returns a bytearray which contains the header.
payload is the rest of the packet which will immediately follow this header.
prev is a packet_base.PacketBase subclass for the outer protocol header. prev is None if the current header
is the outer-most. For example, prev is ipv4 or ipv6 for tcp.serialize.
Geneve
2.4. Library 61
ryu Documentation, Release 4.34
Attribute Description
version Version.
opt_len The length of the options fields.
flags Flag field for OAM packet and Critical options present.
protocol Protocol Type field. The Protocol Type is defined as "ETHER TYPES".
vni Identifier for unique element of virtual network.
options List of Option* instance.
classmethod parser(buf )
Decode a protocol header.
This method is used only when decoding a packet.
Decode a protocol header at offset 0 in bytearray buf. Returns the following three objects.
• An object to describe the decoded header.
• A packet_base.PacketBase subclass appropriate for the rest of the packet. None when the rest of the
packet should be considered as raw payload.
• The rest of packet.
serialize(payload=None, prev=None)
Encode a protocol header.
This method is used only when encoding a packet.
Encode a protocol header. Returns a bytearray which contains the header.
payload is the rest of the packet which will immediately follow this header.
prev is a packet_base.PacketBase subclass for the outer protocol header. prev is None if the current header
is the outer-most. For example, prev is ipv4 or ipv6 for tcp.serialize.
GRE
At- Description
tribute
version Version.
protocol Protocol Type field. The Protocol Type is defined as "ETHER TYPES".
check- Checksum field(optional). When you set a value other than None, this field will be automatically
sum calculated.
key Key field(optional) This field is intended to be used for identifying an individual traffic flow
within a tunnel.
vsid Virtual Subnet ID field(optional) This field is a 24-bit value that is used to identify the NVGRE-
based Virtual Layer 2 Network.
flow_id FlowID field(optional) This field is an 8-bit value that is used to provide per-flow entropy for
flows in the same VSID.
seq_numberSequence Number field(optional)
classmethod parser(buf )
Decode a protocol header.
This method is used only when decoding a packet.
Decode a protocol header at offset 0 in bytearray buf. Returns the following three objects.
• An object to describe the decoded header.
• A packet_base.PacketBase subclass appropriate for the rest of the packet. None when the rest of the
packet should be considered as raw payload.
• The rest of packet.
serialize(payload=None, prev=None)
Encode a protocol header.
This method is used only when encoding a packet.
Encode a protocol header. Returns a bytearray which contains the header.
payload is the rest of the packet which will immediately follow this header.
prev is a packet_base.PacketBase subclass for the outer protocol header. prev is None if the current header
is the outer-most. For example, prev is ipv4 or ipv6 for tcp.serialize.
ryu.lib.packet.gre.nvgre(version=0, vsid=0, flow_id=0)
Generate instance of GRE class with information for NVGRE (RFC7637).
Parameters
• version – Version.
• vsid – Virtual Subnet ID.
• flow_id – FlowID.
Returns Instance of GRE class with information for NVGRE.
ICMP
Attribute Description
data_len data length
data Internet Header + leading octets of original datagram
2.4. Library 63
ryu Documentation, Release 4.34
[RFC1191] reserves bits for the "Next-Hop MTU" field. [RFC4884] introduced 8-bit data length attribute.
Attribute Description
data_len data length
mtu Next-Hop MTU
NOTE: This field is required when icmp code is 4
code 4 = fragmentation needed and DF set
data Internet Header + leading octets of original datagram
Attribute Description
id Identifier
seq Sequence Number
data Internet Header + 64 bits of Original Data Datagram
Attribute Description
type Type
code Code
csum CheckSum (0 means automatically-calculate when encoding)
data Payload. Either a bytearray, or ryu.lib.packet.icmp.echo or ryu.lib.packet.icmp.dest_unreach
or ryu.lib.packet.icmp.TimeExceeded object NOTE for icmp.echo: This includes "unused" 16
bits and the following "Internet Header + 64 bits of Original Data Datagram" of the ICMP
header. NOTE for icmp.dest_unreach and icmp.TimeExceeded: This includes "unused" 8 or
24 bits and the following "Internet Header + leading octets of original datagram" of the
original packet.
classmethod parser(buf )
Decode a protocol header.
This method is used only when decoding a packet.
Decode a protocol header at offset 0 in bytearray buf. Returns the following three objects.
• An object to describe the decoded header.
• A packet_base.PacketBase subclass appropriate for the rest of the packet. None when the rest of the
packet should be considered as raw payload.
• The rest of packet.
serialize(payload, prev)
Encode a protocol header.
This method is used only when encoding a packet.
ICMPv6
Attribute Description
id Identifier
seq Sequence Number
data Data
Attribute Description
type_ Type
code Code
csum CheckSum (0 means automatically-calculate when encoding)
data Payload.
ryu.lib.packet.icmpv6.echo object, ryu.lib.packet.icmpv6.nd_neighbor object,
ryu.lib.packet.icmpv6.nd_router_solicit object, ryu.lib.packet.icmpv6.nd_router_advert
object, ryu.lib.packet.icmpv6.mld object, or a bytearray.
classmethod parser(buf )
Decode a protocol header.
This method is used only when decoding a packet.
Decode a protocol header at offset 0 in bytearray buf. Returns the following three objects.
• An object to describe the decoded header.
• A packet_base.PacketBase subclass appropriate for the rest of the packet. None when the rest of the
packet should be considered as raw payload.
• The rest of packet.
serialize(payload, prev)
Encode a protocol header.
This method is used only when encoding a packet.
Encode a protocol header. Returns a bytearray which contains the header.
payload is the rest of the packet which will immediately follow this header.
2.4. Library 65
ryu Documentation, Release 4.34
prev is a packet_base.PacketBase subclass for the outer protocol header. prev is None if the current header
is the outer-most. For example, prev is ipv4 or ipv6 for tcp.serialize.
class ryu.lib.packet.icmpv6.mld(maxresp=0, address=’::’)
ICMPv6 sub encoder/decoder class for MLD Lister Query, MLD Listener Report, and MLD Listener Done
messages. (RFC 2710)
http://www.ietf.org/rfc/rfc2710.txt
This is used with ryu.lib.packet.icmpv6.icmpv6.
An instance has the following attributes at least. Most of them are same to the on-wire counterparts but in host
byte order. __init__ takes the corresponding args in this order.
Attribute Description
maxresp max response time in millisecond. it is meaningful only in Query Message.
address a group address value.
Attribute Description
maxresp max response time in millisecond. it is meaningful only in Query Message.
address a group address value.
s_flg when set to 1, routers suppress the timer process.
qrv robustness variable for a querier.
qqic an interval time for a querier in unit of seconds.
num a number of the multicast servers.
srcs a list of IPv6 addresses of the multicast servers.
Attribute Description
record_num a number of the group records.
records a list of ryu.lib.packet.icmpv6.mldv2_report_group. None if no records.
An instance has the following attributes at least. Most of them are same to the on-wire counterparts but in host
byte order. __init__ takes the corresponding args in this order.
Attribute Description
type_ a group record type for v3.
aux_len the length of the auxiliary data in 32-bit words.
num a number of the multicast servers.
address a group address value.
srcs a list of IPv6 addresses of the multicast servers.
aux the auxiliary data.
Attribute Description
res R,S,O Flags for Neighbor Advertisement. The 3 MSBs of "Reserved" field for Neighbor
Solicitation.
dst Target Address
option a derived object of ryu.lib.packet.icmpv6.nd_option or a bytearray. None if no options.
class ryu.lib.packet.icmpv6.nd_option_mtu(mtu=1500)
ICMPv6 sub encoder/decoder class for Neighbor discovery MTU Option. (RFC 4861)
This is used with ryu.lib.packet.icmpv6.nd_router_advert.
An instance has the following attributes at least. Most of them are same to the on-wire counterparts but in host
byte order. __init__ takes the corresponding args in this order.
Attribute Description
mtu MTU.
Attribute Description
length length of the option. (0 means automatically-calculate when encoding)
pl Prefix Length.
res1 L,A,R* Flags for Prefix Information.
val_l Valid Lifetime.
pre_l Preferred Lifetime.
res2 This field is unused. It MUST be initialized to zero.
prefix An IP address or a prefix of an IP address.
2.4. Library 67
ryu Documentation, Release 4.34
Attribute Description
length length of the option. (0 means automatically-calculate when encoding)
hw_src Link-Layer Address. NOTE: If the address is longer than 6 octets this contains the first
6 octets in the address. This implementation assumes the address has at least 6 octets.
data A bytearray which contains the rest of Link-Layer Address and padding. When encoding
a packet, it’s user’s responsibility to provide necessary padding for 8-octets alignment
required by the protocol.
Attribute Description
length length of the option. (0 means automatically-calculate when encoding)
hw_src Link-Layer Address. NOTE: If the address is longer than 6 octets this contains the first
6 octets in the address. This implementation assumes the address has at least 6 octets.
data A bytearray which contains the rest of Link-Layer Address and padding. When encoding
a packet, it’s user’s responsibility to provide necessary padding for 8-octets alignment
required by the protocol.
Attribute Description
ch_l Cur Hop Limit.
res M,O Flags for Router Advertisement.
rou_l Router Lifetime.
rea_t Reachable Time.
ret_t Retrans Timer.
options List of a derived object of ryu.lib.packet.icmpv6.nd_option or a bytearray. None if no
options.
Attribute Description
res This field is unused. It MUST be initialized to zero.
option a derived object of ryu.lib.packet.icmpv6.nd_option or a bytearray. None if no options.
IGMP
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Version| Type | Unused | Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Group Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Max Resp Time | Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Group Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type = 0x11 | Max Resp Code | Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Group Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Resv |S| QRV | QQIC | Number of Sources (N) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Address [1] |
+- -+
| Source Address [2] |
+- . -+
. . .
. . .
+- -+
| Source Address [N] |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2.4. Library 69
ryu Documentation, Release 4.34
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type = 0x22 | Reserved | Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Reserved | Number of Group Records (M) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
. .
. Group Record [1] .
. .
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
. .
. Group Record [2] .
. .
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| . |
. . .
| . |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
. .
. Group Record [M] .
. .
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Record Type | Aux Data Len | Number of Sources (N) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Multicast Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Address [1] |
+- -+
| Source Address [2] |
+- -+
. . .
. . .
. . .
+- -+
| Source Address [N] |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
. .
. Auxiliary Data .
. .
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
http://www.ietf.org/rfc/rfc1112.txt
http://www.ietf.org/rfc/rfc2236.txt
An instance has the following attributes at least. Most of them are same to the on-wire counterparts but in host
byte order. __init__ takes the corresponding args in this order.
Attribute Description
msgtype a message type for v2, or a combination of version and a message type for v1.
maxresp max response time in unit of 1/10 second. it is meaningful only in Query Message.
csum a check sum value. 0 means automatically-calculate when encoding.
address a group address value.
classmethod parser(buf )
Decode a protocol header.
This method is used only when decoding a packet.
Decode a protocol header at offset 0 in bytearray buf. Returns the following three objects.
• An object to describe the decoded header.
• A packet_base.PacketBase subclass appropriate for the rest of the packet. None when the rest of the
packet should be considered as raw payload.
• The rest of packet.
serialize(payload, prev)
Encode a protocol header.
This method is used only when encoding a packet.
Encode a protocol header. Returns a bytearray which contains the header.
payload is the rest of the packet which will immediately follow this header.
prev is a packet_base.PacketBase subclass for the outer protocol header. prev is None if the current header
is the outer-most. For example, prev is ipv4 or ipv6 for tcp.serialize.
class ryu.lib.packet.igmp.igmpv3_query(msgtype=17, maxresp=100, csum=0, ad-
dress=’0.0.0.0’, s_flg=0, qrv=2, qqic=0, num=0,
srcs=None)
Internet Group Management Protocol(IGMP, RFC 3376) Membership Query message encoder/decoder class.
http://www.ietf.org/rfc/rfc3376.txt
An instance has the following attributes at least. Most of them are same to the on-wire counterparts but in host
byte order. __init__ takes the corresponding args in this order.
Attribute Description
msgtype a message type for v3.
maxresp max response time in unit of 1/10 second.
csum a check sum value. 0 means automatically-calculate when encoding.
address a group address value.
s_flg when set to 1, routers suppress the timer process.
qrv robustness variable for a querier.
qqic an interval time for a querier in unit of seconds.
num a number of the multicast servers.
srcs a list of IPv4 addresses of the multicast servers.
2.4. Library 71
ryu Documentation, Release 4.34
classmethod parser(buf )
Decode a protocol header.
This method is used only when decoding a packet.
Decode a protocol header at offset 0 in bytearray buf. Returns the following three objects.
• An object to describe the decoded header.
• A packet_base.PacketBase subclass appropriate for the rest of the packet. None when the rest of the
packet should be considered as raw payload.
• The rest of packet.
serialize(payload, prev)
Encode a protocol header.
This method is used only when encoding a packet.
Encode a protocol header. Returns a bytearray which contains the header.
payload is the rest of the packet which will immediately follow this header.
prev is a packet_base.PacketBase subclass for the outer protocol header. prev is None if the current header
is the outer-most. For example, prev is ipv4 or ipv6 for tcp.serialize.
class ryu.lib.packet.igmp.igmpv3_report(msgtype=34, csum=0, record_num=0,
records=None)
Internet Group Management Protocol(IGMP, RFC 3376) Membership Report message encoder/decoder class.
http://www.ietf.org/rfc/rfc3376.txt
An instance has the following attributes at least. Most of them are same to the on-wire counterparts but in host
byte order. __init__ takes the corresponding args in this order.
Attribute Description
msgtype a message type for v3.
csum a check sum value. 0 means automatically-calculate when encoding.
record_num a number of the group records.
records a list of ryu.lib.packet.igmp.igmpv3_report_group. None if no records.
classmethod parser(buf )
Decode a protocol header.
This method is used only when decoding a packet.
Decode a protocol header at offset 0 in bytearray buf. Returns the following three objects.
• An object to describe the decoded header.
• A packet_base.PacketBase subclass appropriate for the rest of the packet. None when the rest of the
packet should be considered as raw payload.
• The rest of packet.
serialize(payload, prev)
Encode a protocol header.
This method is used only when encoding a packet.
Encode a protocol header. Returns a bytearray which contains the header.
payload is the rest of the packet which will immediately follow this header.
prev is a packet_base.PacketBase subclass for the outer protocol header. prev is None if the current header
is the outer-most. For example, prev is ipv4 or ipv6 for tcp.serialize.
class ryu.lib.packet.igmp.igmpv3_report_group(type_=0, aux_len=0, num=0, ad-
dress=’0.0.0.0’, srcs=None, aux=None)
Internet Group Management Protocol(IGMP, RFC 3376) Membership Report Group Record message en-
coder/decoder class.
http://www.ietf.org/rfc/rfc3376.txt
This is used with ryu.lib.packet.igmp.igmpv3_report.
An instance has the following attributes at least. Most of them are same to the on-wire counterparts but in host
byte order. __init__ takes the corresponding args in this order.
Attribute Description
type_ a group record type for v3.
aux_len the length of the auxiliary data.
num a number of the multicast servers.
address a group address value.
srcs a list of IPv4 addresses of the multicast servers.
aux the auxiliary data.
IPv4
classmethod parser(buf )
Decode a protocol header.
2.4. Library 73
ryu Documentation, Release 4.34
IPv6
Attribute Description
nxt Next Header
size the length of the Authentication Header in 64-bit words, subtracting 1.
spi security parameters index.
seq sequence number.
data authentication data.
Attribute Description
nxt Next Header
size the length of the destination header, not include the first 8 octet.
data IPv6 options.
An instance has the following attributes at least. Most of them are same to the on-wire counterparts but in host
byte order. __init__ takes the corresponding args in this order.
Attribute Description
nxt Next Header
offset offset, in 8-octet units, relative to the start of the fragmentable part of the original packet.
more 1 means more fragments follow; 0 means last fragment.
id_ packet identification value.
class ryu.lib.packet.ipv6.header(nxt)
extension header abstract class.
class ryu.lib.packet.ipv6.hop_opts(nxt=6, size=0, data=None)
IPv6 (RFC 2460) Hop-by-Hop Options header encoder/decoder class.
This is used with ryu.lib.packet.ipv6.ipv6.
An instance has the following attributes at least. Most of them are same to the on-wire counterparts but in host
byte order. __init__ takes the corresponding args in this order.
Attribute Description
nxt Next Header
size the length of the Hop-by-Hop Options header, not include the first 8 octet.
data IPv6 options.
classmethod parser(buf )
Decode a protocol header.
This method is used only when decoding a packet.
Decode a protocol header at offset 0 in bytearray buf. Returns the following three objects.
• An object to describe the decoded header.
2.4. Library 75
ryu Documentation, Release 4.34
• A packet_base.PacketBase subclass appropriate for the rest of the packet. None when the rest of the
packet should be considered as raw payload.
• The rest of packet.
serialize(payload, prev)
Encode a protocol header.
This method is used only when encoding a packet.
Encode a protocol header. Returns a bytearray which contains the header.
payload is the rest of the packet which will immediately follow this header.
prev is a packet_base.PacketBase subclass for the outer protocol header. prev is None if the current header
is the outer-most. For example, prev is ipv4 or ipv6 for tcp.serialize.
class ryu.lib.packet.ipv6.opt_header(nxt, size, data)
an abstract class for Hop-by-Hop Options header and destination header.
class ryu.lib.packet.ipv6.option(type_=0, len_=-1, data=None)
IPv6 (RFC 2460) Options header encoder/decoder class.
This is used with ryu.lib.packet.ipv6.hop_opts or ryu.lib.packet.ipv6.dst_opts.
An instance has the following attributes at least. Most of them are same to the on-wire counterparts but in host
byte order. __init__ takes the corresponding args in this order.
Attribute Description
type_ option type.
len_ the length of data. -1 if type_ is 0.
data an option value. None if len_ is 0 or -1.
class ryu.lib.packet.ipv6.routing(nxt)
An IPv6 Routing Header decoder class. This class has only the parser method.
IPv6 Routing Header types.
http://www.iana.org/assignments/ipv6-parameters/ipv6-parameters.xhtml
Attribute Description
nxt Next Header
size The length of the Routing header, not include the first 8 octet. (0 means automatically-calculate
when encoding)
type Identifies the particular Routing header variant.
seg Number of route segments remaining.
cmpi Number of prefix octets from segments 1 through n-1.
cmpe Number of prefix octets from segment n.
pad Number of octets that are used for padding after Address[n] at the end of the SRH.
adrs Vector of addresses, numbered 1 to n.
LLC
Control field:
Information transfer command/response (I-format PDU):
1 2 3 4 5 6 7 8 9 10-16
+---+---+---+---+---+---+---+---+-----+------+
| 0 | N(S) | P/F | N(R) |
+---+---+---+---+---+---+---+---+-----+------+
2.4. Library 77
ryu Documentation, Release 4.34
1 2 3 4 5 6 7 8 9 10-16
+---+---+---+---+---+---+---+---+-----+------+
| 1 0 | S S | 0 0 0 0 | P/F | N(R) |
+---+---+---+---+---+---+---+---+-----+------+
1 2 3 4 5 6 7 8
+---+---+----+---+-----+---+----+---+
| 1 1 | M1 M1 | P/F | M2 M2 M2 |
+---+---+----+---+-----+---+----+---+
Attribute Description
send_sequence_number sender send sequence number
pf_bit poll/final bit
receive_sequence_number sender receive sequence number
Attribute Description
supervisory_function supervisory function bit
pf_bit poll/final bit
receive_sequence_number sender receive sequence number
Attribute Description
modifier_function1 modifier function bit
pf_bit poll/final bit
modifier_function2 modifier function bit
Attribute Description
dsap_addr Destination service access point address field includes I/G bit at least significant bit.
ssap_addr Source service access point address field includes C/R bit at least significant bit.
control Control field [16 bits for formats that include sequence numbering, and 8 bits for formats that
do not]. Either ryu.lib.packet.llc.ControlFormatI or ryu.lib.packet.llc.ControlFormatS or
ryu.lib.packet.llc.ControlFormatU object.
classmethod parser(buf )
Decode a protocol header.
This method is used only when decoding a packet.
Decode a protocol header at offset 0 in bytearray buf. Returns the following three objects.
• An object to describe the decoded header.
• A packet_base.PacketBase subclass appropriate for the rest of the packet. None when the rest of the
packet should be considered as raw payload.
• The rest of packet.
serialize(payload, prev)
Encode a protocol header.
This method is used only when encoding a packet.
Encode a protocol header. Returns a bytearray which contains the header.
payload is the rest of the packet which will immediately follow this header.
prev is a packet_base.PacketBase subclass for the outer protocol header. prev is None if the current header
is the outer-most. For example, prev is ipv4 or ipv6 for tcp.serialize.
LLDP
2.4. Library 79
ryu Documentation, Release 4.34
LLDPDU format:
------------------------------------------------------------------------
| Chassis ID | Port ID | TTL | optional TLV | ... | optional TLV | End |
------------------------------------------------------------------------
Chasis ID, Port ID, TTL, End are mandatory optional TLV may be inserted in any order
class ryu.lib.packet.lldp.ChassisID(buf=None, *args, **kwargs)
Chassis ID TLV encoder/decoder class
Attribute Description
buf Binary data to parse.
subtype Subtype.
chassis_id Chassis id corresponding to subtype.
Attribute Description
buf Binary data to parse.
Attribute Description
buf Binary data to parse.
addr_subtype Address type.
addr Device address.
intf_subtype Interface type.
intf_num Interface number.
oid Object ID.
Attribute Description
buf Binary data to parse.
oui Organizationally unique ID.
subtype Organizationally defined subtype.
info Organizationally defined information string.
Attribute Description
buf Binary data to parse.
port_description Port description.
Attribute Description
buf Binary data to parse.
subtype Subtype.
port_id Port ID corresponding to subtype.
Attribute Description
buf Binary data to parse.
system_cap System Capabilities.
enabled_cap Enabled Capabilities.
Attribute Description
buf Binary data to parse.
system_description System description.
Attribute Description
buf Binary data to parse.
system_name System name.
Attribute Description
buf Binary data to parse.
ttl Time To Live.
class ryu.lib.packet.lldp.lldp(tlvs)
LLDPDU encoder/decoder class.
An instance has the following attributes at least.
Attribute Description
tlvs List of TLV instance.
classmethod parser(buf )
Decode a protocol header.
This method is used only when decoding a packet.
Decode a protocol header at offset 0 in bytearray buf. Returns the following three objects.
• An object to describe the decoded header.
2.4. Library 81
ryu Documentation, Release 4.34
• A packet_base.PacketBase subclass appropriate for the rest of the packet. None when the rest of the
packet should be considered as raw payload.
• The rest of packet.
serialize(payload, prev)
Encode a protocol header.
This method is used only when encoding a packet.
Encode a protocol header. Returns a bytearray which contains the header.
payload is the rest of the packet which will immediately follow this header.
prev is a packet_base.PacketBase subclass for the outer protocol header. prev is None if the current header
is the outer-most. For example, prev is ipv4 or ipv6 for tcp.serialize.
MPLS
ryu.lib.packet.mpls.label_from_bin(buf )
Converts binary representation label to integer.
Parameters buf – Binary representation of label.
Returns MPLS Label and BoS bit.
ryu.lib.packet.mpls.label_to_bin(mpls_label, is_bos=True)
Converts integer label to binary representation.
Parameters
• mpls_label – MPLS Label.
• is_bos – BoS bit.
Returns Binary representation of label.
class ryu.lib.packet.mpls.mpls(label=0, exp=0, bsb=1, ttl=255)
MPLS (RFC 3032) header encoder/decoder class.
NOTE: When decoding, this implementation assumes that the inner protocol is IPv4.
An instance has the following attributes at least. Most of them are same to the on-wire counterparts but in host
byte order. __init__ takes the corresponding args in this order.
Attribute Description
label Label Value
exp Experimental Use
bsb Bottom of Stack
ttl Time To Live
classmethod parser(buf )
Decode a protocol header.
This method is used only when decoding a packet.
Decode a protocol header at offset 0 in bytearray buf. Returns the following three objects.
• An object to describe the decoded header.
• A packet_base.PacketBase subclass appropriate for the rest of the packet. None when the rest of the
packet should be considered as raw payload.
OpenFlow
At- Description
tribute
datap- A ryu.ofproto.ofproto_protocol.ProtocolDesc instance for this message or None if OpenFlow pro-
ath tocol version is unsupported version.
ver- OpenFlow protocol version
sion
msg_type Type of OpenFlow message
msg_len Length of the message
xid Transaction id
body OpenFlow body data
Note: "datapath" attribute is different from ryu.controller.controller.Datapath. So you can not use "datapath"
attribute to send OpenFlow messages. For example, "datapath" attribute does not have send_msg method.
class ryu.lib.packet.openflow.openflow(msg)
OpenFlow message encoder/decoder class.
An instance has the following attributes at least.
At- Description
tribute
msg An instance of OpenFlow message (see OpenFlow protocol API Reference) or an instance of OF-
PUnparseableMsg if failed to parse packet as OpenFlow message.
classmethod parser(buf )
Decode a protocol header.
This method is used only when decoding a packet.
Decode a protocol header at offset 0 in bytearray buf. Returns the following three objects.
• An object to describe the decoded header.
2.4. Library 83
ryu Documentation, Release 4.34
• A packet_base.PacketBase subclass appropriate for the rest of the packet. None when the rest of the
packet should be considered as raw payload.
• The rest of packet.
serialize(_payload, _prev)
Encode a protocol header.
This method is used only when encoding a packet.
Encode a protocol header. Returns a bytearray which contains the header.
payload is the rest of the packet which will immediately follow this header.
prev is a packet_base.PacketBase subclass for the outer protocol header. prev is None if the current header
is the outer-most. For example, prev is ipv4 or ipv6 for tcp.serialize.
OSPF
classmethod parser(buf )
Decode a protocol header.
This method is used only when decoding a packet.
Decode a protocol header at offset 0 in bytearray buf. Returns the following three objects.
• An object to describe the decoded header.
• A packet_base.PacketBase subclass appropriate for the rest of the packet. None when the rest of the
packet should be considered as raw payload.
• The rest of packet.
class ryu.lib.packet.ospf.OSPFHello(length=None, router_id=’0.0.0.0’, area_id=’0.0.0.0’,
au_type=1, authentication=0, checksum=None,
version=2, mask=’0.0.0.0’, hello_interval=10,
options=0, priority=1, dead_interval=40, desig-
nated_router=’0.0.0.0’, backup_router=’0.0.0.0’,
neighbors=None)
classmethod parser(buf )
Decode a protocol header.
This method is used only when decoding a packet.
Decode a protocol header at offset 0 in bytearray buf. Returns the following three objects.
• An object to describe the decoded header.
• A packet_base.PacketBase subclass appropriate for the rest of the packet. None when the rest of the
packet should be considered as raw payload.
• The rest of packet.
classmethod parser(buf )
Decode a protocol header.
This method is used only when decoding a packet.
Decode a protocol header at offset 0 in bytearray buf. Returns the following three objects.
• An object to describe the decoded header.
• A packet_base.PacketBase subclass appropriate for the rest of the packet. None when the rest of the
packet should be considered as raw payload.
• The rest of packet.
class ryu.lib.packet.ospf.OSPFLSReq(length=None, router_id=’0.0.0.0’, area_id=’0.0.0.0’,
au_type=1, authentication=0, checksum=None, ver-
sion=2, lsa_requests=None)
classmethod parser(buf )
Decode a protocol header.
This method is used only when decoding a packet.
Decode a protocol header at offset 0 in bytearray buf. Returns the following three objects.
• An object to describe the decoded header.
• A packet_base.PacketBase subclass appropriate for the rest of the packet. None when the rest of the
packet should be considered as raw payload.
• The rest of packet.
class ryu.lib.packet.ospf.OSPFLSUpd(length=None, router_id=’0.0.0.0’, area_id=’0.0.0.0’,
au_type=1, authentication=0, checksum=None, ver-
sion=2, lsas=None)
classmethod parser(buf )
Decode a protocol header.
This method is used only when decoding a packet.
Decode a protocol header at offset 0 in bytearray buf. Returns the following three objects.
• An object to describe the decoded header.
• A packet_base.PacketBase subclass appropriate for the rest of the packet. None when the rest of the
packet should be considered as raw payload.
• The rest of packet.
class ryu.lib.packet.ospf.OSPFMessage(type_, length=None, router_id=’0.0.0.0’,
area_id=’0.0.0.0’, au_type=1, authentication=0,
checksum=None, version=2)
Base class for OSPF version 2 messages.
classmethod parser(buf )
Decode a protocol header.
This method is used only when decoding a packet.
Decode a protocol header at offset 0 in bytearray buf. Returns the following three objects.
2.4. Library 85
ryu Documentation, Release 4.34
PBB
Attribute Description
pcp Priority Code Point
dei Drop Eligible Indication
uca Use Customer Address
sid Service Instance ID
classmethod parser(buf )
Decode a protocol header.
This method is used only when decoding a packet.
Decode a protocol header at offset 0 in bytearray buf. Returns the following three objects.
• An object to describe the decoded header.
• A packet_base.PacketBase subclass appropriate for the rest of the packet. None when the rest of the
packet should be considered as raw payload.
• The rest of packet.
serialize(payload, prev)
Encode a protocol header.
This method is used only when encoding a packet.
Encode a protocol header. Returns a bytearray which contains the header.
payload is the rest of the packet which will immediately follow this header.
prev is a packet_base.PacketBase subclass for the outer protocol header. prev is None if the current header
is the outer-most. For example, prev is ipv4 or ipv6 for tcp.serialize.
SCTP
class ryu.lib.packet.sctp.cause_cookie_while_shutdown(length=0)
Stream Control Transmission Protocol (SCTP) sub encoder/decoder class for Cookie Received While Shutting
Down (RFC 4960).
This class is used with the following.
• ryu.lib.packet.sctp.chunk_abort
• ryu.lib.packet.sctp.chunk_error
An instance has the following attributes at least. Most of them are same to the on-wire counterparts but in host
byte order. __init__ takes the corresponding args in this order.
Attribute Description
length length of this cause containing this header. (0 means automatically-calculate when encoding)
class ryu.lib.packet.sctp.cause_invalid_param(length=0)
Stream Control Transmission Protocol (SCTP) sub encoder/decoder class for Invalid Mandatory Parameter
(RFC 4960).
This class is used with the following.
• ryu.lib.packet.sctp.chunk_abort
• ryu.lib.packet.sctp.chunk_error
An instance has the following attributes at least. Most of them are same to the on-wire counterparts but in host
byte order. __init__ takes the corresponding args in this order.
Attribute Description
length length of this cause containing this header. (0 means automatically-calculate when encoding)
Attribute Description
value stream id.
length length of this cause containing this header. (0 means automatically-calculate when encoding)
2.4. Library 87
ryu Documentation, Release 4.34
• ryu.lib.packet.sctp.chunk_error
An instance has the following attributes at least. Most of them are same to the on-wire counterparts but in host
byte order. __init__ takes the corresponding args in this order.
Attribute Description
types a list of missing params.
num Number of missing params. (0 means automatically-calculate when encoding)
length length of this cause containing this header. (0 means automatically-calculate when encoding)
Attribute Description
value the TSN of the DATA chunk received with no user data field.
length length of this cause containing this header. (0 means automatically-calculate when encoding)
class ryu.lib.packet.sctp.cause_out_of_resource(length=0)
Stream Control Transmission Protocol (SCTP) sub encoder/decoder class for Out of Resource (RFC 4960).
This class is used with the following.
• ryu.lib.packet.sctp.chunk_abort
• ryu.lib.packet.sctp.chunk_error
An instance has the following attributes at least. Most of them are same to the on-wire counterparts but in host
byte order. __init__ takes the corresponding args in this order.
Attribute Description
length length of this cause containing this header. (0 means automatically-calculate when encoding)
Attribute Description
value Additional Information.
length length of this cause containing this header. (0 means automatically-calculate when encoding)
Attribute Description
value New Address TLVs.
length length of this cause containing this header. (0 means automatically-calculate when encoding)
Attribute Description
value Measure of Staleness.
length length of this cause containing this header. (0 means automatically-calculate when encoding)
Attribute Description
value Unrecognized Chunk.
length length of this cause containing this header. (0 means automatically-calculate when encoding)
2.4. Library 89
ryu Documentation, Release 4.34
An instance has the following attributes at least. Most of them are same to the on-wire counterparts but in host
byte order. __init__ takes the corresponding args in this order.
Attribute Description
value Unrecognized Parameter.
length length of this cause containing this header. (0 means automatically-calculate when encoding)
Attribute Description
value Unresolvable Address. one of follows:
ryu.lib.packet.sctp.param_host_addr,
ryu.lib.packet.sctp.param_ipv4, or
ryu.lib.packet.sctp.param_ipv6.
length length of this cause containing this header. (0 means automatically-calculate when encoding)
Attribute Description
value Upper Layer Abort Reason.
length length of this cause containing this header. (0 means automatically-calculate when encoding)
Attribute Description
tflag ’0’ means the Verification tag is normal. ’1’ means the Verification tag is copy of the sender.
length length of this chunk containing this header. (0 means automatically-calculate when encoding)
causes a list of derived classes of ryu.lib.packet.sctp.causes.
Attribute Description
flags set to ’0’. this field will be ignored.
length length of this chunk containing this header. (0 means automatically-calculate when encoding)
Attribute Description
flags set to ’0’. this field will be ignored.
length length of this chunk containing this header. (0 means automatically-calculate when encoding)
cookie cookie data.
Attribute Description
flags set to ’0’. this field will be ignored.
length length of this chunk containing this header. (0 means automatically-calculate when encoding)
low_tsn the lowest TSN.
2.4. Library 91
ryu Documentation, Release 4.34
Attribute Description
unordered if set to ’1’, the receiver ignores the sequence number.
begin if set to ’1’, this chunk is the first fragment.
end if set to ’1’, this chunk is the last fragment.
length length of this chunk containing this header. (0 means automatically-calculate when
encoding)
tsn Transmission Sequence Number.
sid stream id.
seq the sequence number.
payload_id application specified protocol id. ’0’ means that no application id is identified.
payload_data user data.
Attribute Description
flags set to ’0’. this field will be ignored.
length length of this chunk containing this header. (0 means automatically-calculate when encoding)
low_tsn the lowest TSN.
Attribute Description
flags set to ’0’. this field will be ignored.
length length of this chunk containing this header. (0 means automatically-calculate when encoding)
causes a list of derived classes of ryu.lib.packet.sctp.causes.
Attribute Description
flags set to ’0’. this field will be ignored.
length length of this chunk containing this header. (0 means automatically-calculate when encoding)
info ryu.lib.packet.sctp.param_heartbeat.
Attribute Description
flags set to ’0’. this field will be ignored.
length length of this chunk containing this header. (0 means automatically-calculate when encoding)
info ryu.lib.packet.sctp.param_heartbeat.
Attribute Description
flags set to ’0’. this field will be ignored.
length length of this chunk containing this header. (0 means automatically-calculate when encoding)
init_tag the tag that be used as Verification Tag.
a_rwnd Advertised Receiver Window Credit.
os number of outbound streams.
mis number of inbound streams.
i_tsn Transmission Sequence Number that the sender will use.
params Optional/Variable-Length Parameters.
a list of derived classes of ryu.lib.packet.sctp.param.
2.4. Library 93
ryu Documentation, Release 4.34
Attribute Description
flags set to ’0’. this field will be ignored.
length length of this chunk containing this header. (0 means automatically-calculate when encoding)
init_tag the tag that be used as Verification Tag.
a_rwnd Advertised Receiver Window Credit.
os number of outbound streams.
mis number of inbound streams.
i_tsn Transmission Sequence Number that the sender will use.
params Optional/Variable-Length Parameters.
a list of derived classes of ryu.lib.packet.sctp.param.
Attribute Description
flags set to ’0’. this field will be ignored.
length length of this chunk containing this header. (0 means automatically-calculate when
encoding)
tsn_ack TSN of the last DATA chunk received in sequence before a gap.
a_rwnd Advertised Receiver Window Credit.
gapack_num number of Gap Ack blocks.
duptsn_num number of duplicate TSNs.
gapacks a list of Gap Ack blocks. one block is made of a list with the start offset and the end offset
from tsn_ack. e.g.) gapacks = [[2, 3], [10, 12], [19, 21]]
duptsns a list of duplicate TSN.
Attribute Description
flags set to ’0’. this field will be ignored.
length length of this chunk containing this header. (0 means automatically-calculate when encoding)
tsn_ack TSN of the last DATA chunk received in sequence before a gap.
Attribute Description
flags set to ’0’. this field will be ignored.
length length of this chunk containing this header. (0 means automatically-calculate when encoding)
Attribute Description
tflag ’0’ means the Verification tag is normal. ’1’ means the Verification tag is copy of the sender.
length length of this chunk containing this header. (0 means automatically-calculate when encoding)
Attribute Description
value Suggested Cookie Life-Span Increment (msec).
length length of this param containing this header. (0 means automatically-calculate when encoding)
Attribute Description
value set to None.
length length of this param containing this header. (0 means automatically-calculate when encoding)
2.4. Library 95
ryu Documentation, Release 4.34
Attribute Description
value the sender-specific heartbeat information.
length length of this param containing this header. (0 means automatically-calculate when encoding)
Attribute Description
value a host name that ends with null terminator.
length length of this param containing this header. (0 means automatically-calculate when encoding)
Attribute Description
value IPv4 address of the sending endpoint.
length length of this param containing this header. (0 means automatically-calculate when encoding)
An instance has the following attributes at least. Most of them are same to the on-wire counterparts but in host
byte order. __init__ takes the corresponding args in this order.
Attribute Description
value IPv6 address of the sending endpoint.
length length of this param containing this header. (0 means automatically-calculate when encoding)
Attribute Description
value the state cookie. see Section 5.1.3 in RFC 4960.
length length of this param containing this header. (0 means automatically-calculate when encoding)
Attribute Description
value a list of parameter types. odd cases pad with 0x0000.
length length of this param containing this header. (0 means automatically-calculate when encoding)
Attribute Description
value the unrecognized parameter in the INIT chunk.
length length of this param containing this header. (0 means automatically-calculate when encoding)
2.4. Library 97
ryu Documentation, Release 4.34
Attribute Description
src_port Source Port
dst_port Destination Port
vtag Verification Tag
csum Checksum (0 means automatically-calculate when encoding)
chunks a list of derived classes of ryu.lib.packet.sctp.chunk.
classmethod parser(buf )
Decode a protocol header.
This method is used only when decoding a packet.
Decode a protocol header at offset 0 in bytearray buf. Returns the following three objects.
• An object to describe the decoded header.
• A packet_base.PacketBase subclass appropriate for the rest of the packet. None when the rest of the
packet should be considered as raw payload.
• The rest of packet.
serialize(payload, prev)
Encode a protocol header.
This method is used only when encoding a packet.
Encode a protocol header. Returns a bytearray which contains the header.
payload is the rest of the packet which will immediately follow this header.
prev is a packet_base.PacketBase subclass for the outer protocol header. prev is None if the current header
is the outer-most. For example, prev is ipv4 or ipv6 for tcp.serialize.
Slow
7 6 5 4 3 2 1 0
EXPR DFLT DIST CLCT SYNC AGGR TMO ACT
ACT bit 0. about the activity control value with regard to this link.
TMO bit 1. about the timeout control value with regard to this link.
AGGR bit 2. about how the system regards this link from the point of view of the aggregation.
SYNC bit 3. about how the system regards this link from the point of view of the synchronization.
CLCT bit 4. about collecting of incoming frames.
DIST bit 5. about distributing of outgoing frames.
DFLT bit 6. about the opposite system information which the system use.
EXPR bit 7. about the expire state of the system.
2.4. Library 99
ryu Documentation, Release 4.34
An instance has the following attributes at least. Most of them are same to the on-wire counterparts but in host
byte order. __init__ takes the corresponding args in this order.
Attribute Description
version LACP version. This parameter must be set to
LACP_VERSION_NUMBER(i.e. 1).
actor_system_priority The priority assigned to this System.
actor_system The Actor’s System ID, encoded as a MAC address.
actor_key The operational Key value assigned to the port by the Actor.
actor_port_priority The priority assigned to this port.
actor_port The port number assigned to the port by the Actor.
actor_state_activity
about the activity control value with regard to this link.
LACP_STATE_ACTIVE(1)
LACP_STATE_PASSIVE(0)
actor_state_timeout
about the timeout control value with regard to this link.
LACP_STATE_SHORT_TIMEOUT(1)
LACP_STATE_LONG_TIMEOUT(0)
actor_state_aggregation
about how the system regards this link from the point of view of the
aggregation.
LACP_STATE_AGGREGATEABLE(1)
LACP_STATE_INDIVIDUAL(0)
actor_state_synchronization
about how the system regards this link from the point of view of the
synchronization.
LACP_STATE_IN_SYNC(1)
LACP_STATE_OUT_OF_SYNC(0)
actor_state_collecting
about collecting of incoming frames.
LACP_STATE_COLLECTING_ENABLED(1)
LACP_STATE_COLLECTING_DISABLED(0)
actor_state_distributing
about distributing of outgoing frames.
LACP_STATE_DISTRIBUTING_ENABLED(1)
LACP_STATE_DISTRIBUTING_DISABLED(0)
actor_state_defaulted
about the Partner information which the the Actor use.
LACP_STATE_DEFAULTED_PARTNER(1)
LACP_STATE_OPERATIONAL_PARTNER(0)
actor_state_expired
about the state of the Actor.
LACP_STATE_EXPIRED(1)
LACP_STATE_NOT_EXPIRED(0)
partner_system_priority The priority assigned to the Partner System.
partner_system The Partner’s System ID, encoded as a MAC address.
partner_key The operational Key value assigned to the port by the Partner.
partner_port_priority The priority assigned to this port by the Partner.
partner_port The port number assigned to the port by the Partner.
partner_state_activity See actor_state_activity.
partner_state_timeout See actor_state_timeout.
partner_state_aggregation See actor_state_aggregation.
partner_state_synchronization See actor_state_synchronization.
partner_state_collecting See actor_state_collecting.
partner_state_distributing See actor_state_distributing.
partner_state_defaulted See actor_state_defaulted.
partner_state_expired See actor_state_expired.
collector_max_delay the maximum time that the Frame Collector may delay.
classmethod parser(buf )
Decode a protocol header.
This method is used only when decoding a packet.
Decode a protocol header at offset 0 in bytearray buf. Returns the following three objects.
• An object to describe the decoded header.
• A packet_base.PacketBase subclass appropriate for the rest of the packet. None when the rest of the
packet should be considered as raw payload.
• The rest of packet.
serialize(payload, prev)
Encode a protocol header.
This method is used only when encoding a packet.
Encode a protocol header. Returns a bytearray which contains the header.
payload is the rest of the packet which will immediately follow this header.
prev is a packet_base.PacketBase subclass for the outer protocol header. prev is None if the current header
is the outer-most. For example, prev is ipv4 or ipv6 for tcp.serialize.
class ryu.lib.packet.slow.slow
Slow Protocol header decoder class. This class has only the parser method.
http://standards.ieee.org/getieee802/download/802.3-2012_section5.pdf
Slow Protocols Subtypes
classmethod parser(buf )
Decode a protocol header.
This method is used only when decoding a packet.
Decode a protocol header at offset 0 in bytearray buf. Returns the following three objects.
• An object to describe the decoded header.
• A packet_base.PacketBase subclass appropriate for the rest of the packet. None when the rest of the
packet should be considered as raw payload.
• The rest of packet.
TCP
An instance has the following attributes at least. Most of them are same to the on-wire counterparts but in host
byte order. __init__ takes the corresponding args in this order.
Attribute Description
src_port Source Port
dst_port Destination Port
seq Sequence Number
ack Acknowledgement Number
offset Data Offset (0 means automatically-calculate when encoding)
bits Control Bits
window_size Window
csum Checksum (0 means automatically-calculate when encoding)
urgent Urgent Pointer
option List of TCPOption sub-classes or an bytearray containing options. None if no options.
has_flags(*flags)
Check if flags are set on this packet.
returns boolean if all passed flags is set
Example:
classmethod parser(buf )
Decode a protocol header.
This method is used only when decoding a packet.
Decode a protocol header at offset 0 in bytearray buf. Returns the following three objects.
• An object to describe the decoded header.
• A packet_base.PacketBase subclass appropriate for the rest of the packet. None when the rest of the
packet should be considered as raw payload.
• The rest of packet.
serialize(payload, prev)
Encode a protocol header.
This method is used only when encoding a packet.
Encode a protocol header. Returns a bytearray which contains the header.
payload is the rest of the packet which will immediately follow this header.
prev is a packet_base.PacketBase subclass for the outer protocol header. prev is None if the current header
is the outer-most. For example, prev is ipv4 or ipv6 for tcp.serialize.
UDP
Attribute Description
src_port Source Port
dst_port Destination Port
total_length Length (0 means automatically-calculate when encoding)
csum Checksum (0 means automatically-calculate when encoding)
VLAN
Attribute Description
pcp Priority Code Point
cfi Canonical Format Indicator. In a case to be used as B-TAG, this field means DEI(Drop Eligible
Indication).
vid VLAN Identifier
ethertype EtherType
classmethod get_packet_type(type_)
Per-protocol dict-like get method.
Provided for convenience of protocol implementers. Internal use only.
Attribute Description
pcp Priority Code Point
cfi Canonical Format Indicator
vid VLAN Identifier
ethertype EtherType
classmethod get_packet_type(type_)
Override method for the Length/Type field (self.ethertype). The Length/Type field means Length or Type
interpretation, same as ethernet IEEE802.3. If the value of Length/Type field is less than or equal to 1500
decimal(05DC hexadecimal), it means Length interpretation and be passed to the LLC sublayer.
VRRP
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Version| Type | Virtual Rtr ID| Priority | Count IP Addrs|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Auth Type | Adver Int | Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| IP Address (1) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| . |
| . |
| . |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| IP Address (n) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Authentication Data (1) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Authentication Data (2) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| IPv4 Fields or IPv6 Fields |
... ...
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Version| Type | Virtual Rtr ID| Priority |Count IPvX Addr|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|(rsvd) | Max Adver Int | Checksum |
(continues on next page)
Attribute Description
version Version
type Type
vrid Virtual Rtr ID (VRID)
priority Priority
count_ip Count IPvX Addr. Calculated automatically when encoding.
max_adver_int Maximum Advertisement Interval (Max Adver Int)
checksum Checksum. Calculated automatically when encoding.
ip_addresses IPvX Address(es). A python list of IP addresses.
auth_type Authentication Type (only for VRRPv2)
auth_data Authentication Data (only for VRRPv2)
create_packet(primary_ip_address, vlan_id=None)
Prepare a VRRP packet.
Returns a newly created ryu.lib.packet.packet.Packet object with appropriate protocol header objects added
by add_protocol(). It’s caller’s responsibility to serialize(). The serialized packet would looks like the ones
described in the following sections.
• RFC 3768 5.1. VRRP Packet Format
• RFC 5798 5.1. VRRP Packet Format
Argument Description
primary_ip_address Source IP address
vlan_id VLAN ID. None for no VLAN.
classmethod parser(buf )
Decode a protocol header.
This method is used only when decoding a packet.
Decode a protocol header at offset 0 in bytearray buf. Returns the following three objects.
Decode a protocol header at offset 0 in bytearray buf. Returns the following three objects.
• An object to describe the decoded header.
• A packet_base.PacketBase subclass appropriate for the rest of the packet. None when the rest of the
packet should be considered as raw payload.
• The rest of packet.
VXLAN
ryu.lib.packet.vxlan.vni_from_bin(buf )
Converts binary representation VNI to integer.
Parameters buf – binary representation of VNI.
Returns VNI integer.
ryu.lib.packet.vxlan.vni_to_bin(vni)
Converts integer VNI to binary representation.
Parameters vni – integer of VNI
Returns binary representation of VNI.
class ryu.lib.packet.vxlan.vxlan(vni)
VXLAN (RFC 7348) header encoder/decoder class.
An instance has the following attributes at least. Most of them are same to the on-wire counterparts but in host
byte order. __init__ takes the corresponding args in this order.
Attribute Description
vni VXLAN Network Identifier
classmethod parser(buf )
Decode a protocol header.
This method is used only when decoding a packet.
Decode a protocol header at offset 0 in bytearray buf. Returns the following three objects.
• An object to describe the decoded header.
• A packet_base.PacketBase subclass appropriate for the rest of the packet. None when the rest of the
packet should be considered as raw payload.
• The rest of packet.
serialize(payload, prev)
Encode a protocol header.
This method is used only when encoding a packet.
Encode a protocol header. Returns a bytearray which contains the header.
payload is the rest of the packet which will immediately follow this header.
prev is a packet_base.PacketBase subclass for the outer protocol header. prev is None if the current header
is the outer-most. For example, prev is ipv4 or ipv6 for tcp.serialize.
Zebra
At- Description
tribute
length Total packet length including this header. The minimum length is 3 bytes for version 0 messages, 6
bytes for version 1/2 messages and 8 bytes for version 3 messages.
ver- Version number of the Zebra protocol message. To instantiate messages with other than the default
sion version, version must be specified.
vrf_id VRF ID for the route contained in message. Not present in version 0/1/2 messages in the on-wire
structure, and always 0 for theses version.
com- Zebra Protocol command, which denotes message type.
mand
body Messages body. An instance of subclass of _ZebraMessageBody named like "Zebra + <message
name>" (e.g., ZebraHello). Or None if message does not contain any body.
Note: To instantiate Zebra messages, command can be omitted when the valid body is specified.
>>> zebra.ZebraMessage(command=zebra.ZEBRA_INTERFACE_ADD)
ZebraMessage(body=None,command=1,length=None,version=3,vrf_id=0)
classmethod parser(buf )
Decode a protocol header.
This method is used only when decoding a packet.
Decode a protocol header at offset 0 in bytearray buf. Returns the following three objects.
Introduction
Ryu PCAP file library helps you to read/write PCAP file which file format are described in The Wireshark Wiki.
For loading the packet data containing in PCAP files, you can use pcaplib.Reader.
class ryu.lib.pcaplib.Reader(file_obj)
PCAP file reader
Argument Description
file_obj File object which reading PCAP file in binary mode
Example of usage:
frame_count = 0
# iterate pcaplib.Reader that yields (timestamp, packet_data)
# in the PCAP file
for ts, buf in pcaplib.Reader(open('test.pcap', 'rb')):
frame_count += 1
pkt = packet.Packet(buf)
print("%d, %f, %s" % (frame_count, ts, pkt))
For dumping the packet data which your RyuApp received, you can use pcaplib.Writer.
class ryu.lib.pcaplib.Writer(file_obj, snaplen=65535, network=1)
PCAP file writer
Argument Description
file_obj File object which writing PCAP file in binary mode
snaplen Max length of captured packets (in octets)
network Data link type. (e.g. 1 for Ethernet, see tcpdump.org for details)
Example of usage:
...
from ryu.lib import pcaplib
class SimpleSwitch13(app_manager.RyuApp):
OFP_VERSIONS = [ofproto_v1_3.OFP_VERSION]
...
@set_ev_cls(ofp_event.EventOFPPacketIn, MAIN_DISPATCHER)
def _packet_in_handler(self, ev):
# Dump the packet data into PCAP file
self.pcap_writer.write_pkt(ev.msg.data)
...
XML schema files for NETCONF and OFConfig are stolen from LINC whose licence is Apache 2.0. It supports only
part of OFConfig so that its schema files are (intentionally) limited such that operation attributes are allowed only in
several limited places. Once our library is tested with other OFConfig switches, the schema files should be updated to
allow operation attribute in more places.
References
• NETCONF ietf,
• NETCONF ietf wiki,
• OF-Config spec,
• ncclient,
• ncclient repo,
• LINC git repo
Introduction
Ryu BGP speaker library helps you to enable your code to speak BGP protocol. The library supports IPv4, IPv4
MPLS-labeled VPN, IPv6 MPLS-labeled VPN and L2VPN EVPN address families.
Example
The following simple code creates a BGP instance with AS number 64512 and Router ID 10.0.0.1. It tries to establish a
bgp session with a peer (its IP is 192.168.177.32 and the AS number is 64513). The instance advertizes some prefixes.
import eventlet
def dump_remote_best_path_change(event):
print 'the best path changed:', event.remote_as, event.prefix,\
event.nexthop, event.is_withdraw
if __name__ == "__main__":
speaker = BGPSpeaker(as_number=64512, router_id='10.0.0.1',
best_path_change_handler=dump_remote_best_path_change,
peer_down_handler=detect_peer_down)
speaker.neighbor_add('192.168.177.32', 64513)
# uncomment the below line if the speaker needs to talk with a bmp server.
# speaker.bmp_server_add('192.168.177.2', 11019)
count = 1
while True:
eventlet.sleep(30)
prefix = '10.20.' + str(count) + '.0/24'
print "add a new prefix", prefix
speaker.prefix_add(prefix)
count += 1
if count == 4:
speaker.shutdown()
break
BGPSpeaker class
pref_filter = PrefixFilter('192.168.103.0/30',
PrefixFilter.POLICY_PERMIT)
attribute_map = AttributeMap([pref_filter],
AttributeMap.ATTR_LOCAL_PREF, 250)
speaker.attribute_map_set('192.168.50.102', [attribute_map])
bmp_server_add(address, port)
This method registers a new BMP (BGP monitoring Protocol) server. The BGP speaker starts to send BMP
messages to the server. Currently, only one BMP server can be registered.
address specifies the IP address of a BMP server.
port specifies the listen port number of a BMP server.
bmp_server_del(address, port)
This method unregister the registered BMP server.
address specifies the IP address of a BMP server.
port specifies the listen port number of a BMP server.
mac_mobility specifies an optional integer sequence number to use in a MAC Mobility extended com-
munity field. The special value ’-1’ can be used to set the STATIC flag with a 0-value sequence number.
evpn_prefix_del(route_type, route_dist, esi=0, ethernet_tag_id=None, mac_addr=None,
ip_addr=None, ip_prefix=None)
This method deletes an advertised EVPN route.
route_type specifies one of the EVPN route type name.
route_dist specifies a route distinguisher value.
esi is an value to specify the Ethernet Segment Identifier.
ethernet_tag_id specifies the Ethernet Tag ID.
mac_addr specifies a MAC address to advertise.
ip_addr specifies an IPv4 or IPv6 address to advertise.
ip_prefix specifies an IPv4 or IPv6 prefix to advertise.
flowspec_prefix_add(flowspec_family, rules, route_dist=None, actions=None)
This method adds a new Flow Specification prefix to be advertised.
flowspec_family specifies one of the flowspec family name. This parameter must be one of the
following.
• FLOWSPEC_FAMILY_IPV4 = ’ipv4fs’
• FLOWSPEC_FAMILY_IPV6 = ’ipv6fs’
• FLOWSPEC_FAMILY_VPNV4 = ’vpnv4fs’
• FLOWSPEC_FAMILY_VPNV6 = ’vpnv6fs’
• FLOWSPEC_FAMILY_L2VPN = ’l2vpnfs’
rules specifies NLRIs of Flow Specification as a dictionary type value. For the supported NLRI types
and arguments, see from_user() method of the following classes.
• ryu.lib.packet.bgp.FlowSpecIPv4NLRI
• ryu.lib.packet.bgp.FlowSpecIPv6NLRI
• ryu.lib.packet.bgp.FlowSpecVPNv4NLRI
• ryu.lib.packet.bgp.FlowSpecVPNv6NLRI
• ryu.lib.packet.bgp.FlowSpecL2VPNNLRI
route_dist specifies a route distinguisher value. This parameter is required only if flowspec_family is
one of the following address family.
• FLOWSPEC_FAMILY_VPNV4 = ’vpnv4fs’
• FLOWSPEC_FAMILY_VPNV6 = ’vpnv6fs’
• FLOWSPEC_FAMILY_L2VPN = ’l2vpnfs’
actions specifies Traffic Filtering Actions of Flow Specification as a dictionary type value. The keys
are "ACTION_NAME" for each action class and values are used for the arguments to that class. For the
supported "ACTION_NAME" and arguments, see the following table.
Example(IPv4):
Example(VPNv4):
in_filter_get(address)
This method gets in-bound filters of the specified neighbor.
address specifies the IP address of the neighbor.
Returns a list object containing an instance of Filter sub-class
in_filter_set(address, filters)
This method sets in-bound filters to a neighbor.
address specifies the IP address of the neighbor
filters specifies filter list applied before advertised paths are imported to the global rib. All the items
in the list must be an instance of Filter sub-class.
neighbor_add(address, remote_as, remote_port=179, enable_ipv4=True, enable_ipv6=False,
enable_vpnv4=False, enable_vpnv6=False, enable_evpn=False, en-
able_ipv4fs=False, enable_ipv6fs=False, enable_vpnv4fs=False, en-
able_vpnv6fs=False, enable_l2vpnfs=False, enable_enhanced_refresh=False,
enable_four_octet_as_number=True, next_hop=None, password=None,
multi_exit_disc=None, site_of_origins=None, is_route_server_client=False,
is_route_reflector_client=False, is_next_hop_self=False, local_address=None,
local_port=None, local_as=None, connect_mode=’both’)
This method registers a new neighbor. The BGP speaker tries to establish a bgp session with the peer
(accepts a connection from the peer and also tries to connect to it).
address specifies the IP address of the peer. It must be the string representation of an IP address. Only
IPv4 is supported now.
remote_as specifies the AS number of the peer. It must be an integer between 1 and 65535.
remote_port specifies the TCP port number of the peer.
enable_ipv4 enables IPv4 address family for this neighbor.
enable_ipv6 enables IPv6 address family for this neighbor.
enable_vpnv4 enables VPNv4 address family for this neighbor.
enable_vpnv6 enables VPNv6 address family for this neighbor.
enable_evpn enables Ethernet VPN address family for this neighbor.
enable_ipv4fs enables IPv4 Flow Specification address family for this neighbor.
enable_ipv6fs enables IPv6 Flow Specification address family for this neighbor.
enable_vpnv4fs enables VPNv4 Flow Specification address family for this neighbor.
enable_vpnv6fs enables VPNv6 Flow Specification address family for this neighbor.
enable_l2vpnfs enables L2VPN Flow Specification address family for this neighbor.
enable_enhanced_refresh enables Enhanced Route Refresh for this neighbor.
enable_four_octet_as_number enables Four-Octet AS Number capability for this neighbor.
next_hop specifies the next hop IP address. If not specified, host’s ip address to access to a peer is used.
password is used for the MD5 authentication if it’s specified. By default, the MD5 authentication is
disabled.
multi_exit_disc specifies multi exit discriminator (MED) value as an int type value. If omitted,
MED is not sent to the neighbor.
site_of_origins specifies site_of_origin values. This parameter must be a list of string.
neighbors_get(format=’json’)
This method returns a list of the BGP neighbors.
format specifies the format of the response. This parameter must be one of the following.
• ’json’ (default)
• ’cli’
out_filter_get(address)
This method gets out-filter setting from the specified neighbor.
address specifies the IP address of the peer.
Returns a list object containing an instance of Filter sub-class
out_filter_set(address, filters)
This method sets out-filter to neighbor.
address specifies the IP address of the peer.
filters specifies a filter list to filter the path advertisement. The contents must be an instance of Filter
sub-class
If you want to define out-filter that send only a particular prefix to neighbor, filters can be created as
follows:
p = PrefixFilter('10.5.111.0/24',
policy=PrefixFilter.POLICY_PERMIT)
all = PrefixFilter('0.0.0.0/0',
policy=PrefixFilter.POLICY_DENY)
self.bgpspeaker.out_filter_set(neighbor_address, pList)
• ’json’ (default)
• ’cli’
shutdown()
Shutdown BGP speaker
vrf_add(route_dist, import_rts, export_rts, site_of_origins=None, route_family=’ipv4’,
multi_exit_disc=None)
This method adds a new vrf used for VPN.
route_dist specifies a route distinguisher value.
import_rts specifies a list of route targets to be imported.
export_rts specifies a list of route targets to be exported.
site_of_origins specifies site_of_origin values. This parameter must be a list of string.
route_family specifies route family of the VRF. This parameter must be one of the following.
• RF_VPN_V4 (default) = ’ipv4’
• RF_VPN_V6 = ’ipv6’
• RF_L2_EVPN = ’evpn’
• RF_VPNV4_FLOWSPEC = ’ipv4fs’
• RF_VPNV6_FLOWSPEC = ’ipv6fs’
• RF_L2VPN_FLOWSPEC = ’l2vpnfs’
multi_exit_disc specifies multi exit discriminator (MED) value. It must be an integer.
vrf_del(route_dist)
This method deletes the existing vrf.
route_dist specifies a route distinguisher value.
vrfs_get(subcommand=’routes’, route_dist=None, route_family=’all’, format=’json’)
This method returns the existing vrfs.
subcommand specifies one of the following.
• ’routes’: shows routes present for vrf
• ’summary’: shows configuration and summary of vrf
route_dist specifies a route distinguisher value. If route_family is not ’all’, this value must be speci-
fied.
route_family specifies route family of the VRF. This parameter must be one of the following.
• RF_VPN_V4 = ’ipv4’
• RF_VPN_V6 = ’ipv6’
• RF_L2_EVPN = ’evpn’
• ’all’ (default)
format specifies the format of the response. This parameter must be one of the following.
• ’json’ (default)
• ’cli’
Attribute Description
remote_as The AS number of a peer that caused this change
route_dist None in the case of IPv4 or IPv6 family
prefix A prefix was changed
nexthop The nexthop of the changed prefix
label MPLS label for VPNv4, VPNv6 or EVPN prefix
path An instance of info_base.base.Path subclass
is_withdraw True if this prefix has gone otherwise False
prefix_filter = PrefixFilter('10.5.111.0/24',
policy=PrefixFilter.POLICY_PERMIT)
Attribute Description
prefix A prefix used for this filter
policy One of the following values.
PrefixFilter.POLICY.PERMIT
PrefixFilter.POLICY_DENY
p = PrefixFilter('10.5.111.0/24',
policy=PrefixFilter.POLICY_DENY,
ge=26, le=28)
Prefixes which match 10.5.111.0/24 and its length matches from 26 to 28 will be filtered. When this filter is
used as an out-filter, it will stop sending the path to neighbor because of POLICY_DENY. When this filter is
used as in-filter, it will stop importing the path to the global rib because of POLICY_DENY. If you specify
POLICY_PERMIT, the path is sent to neighbor or imported to the global rib.
If you don’t want to send prefixes 10.5.111.64/26 and 10.5.111.32/27 and 10.5.111.16/28, and allow to send
other 10.5.111.0’s prefixes, you can do it by specifying as follows:
p = PrefixFilter('10.5.111.0/24',
policy=PrefixFilter.POLICY_DENY,
ge=26, le=28).
clone()
This method clones PrefixFilter object.
Returns PrefixFilter object that has the same values with the original one.
evaluate(path)
This method evaluates the prefix.
Returns this object’s policy and the result of matching. If the specified prefix matches this object’s prefix
and ge and le condition, this method returns True as the matching result.
path specifies the path that has prefix.
class ryu.services.protocols.bgp.info_base.base.ASPathFilter(as_number, pol-
icy)
Used to specify a prefix for AS_PATH attribute.
We can create ASPathFilter object as follows:
as_path_filter = ASPathFilter(65000,policy=ASPathFilter.TOP)
Attribute Description
as_number A AS number used for this filter
policy One of the following values.
ASPathFilter.POLICY_TOP
ASPathFilter.POLICY_END
ASPathFilter.POLICY_INCLUDE
ASPathFilter.POLICY_NOT_INCLUDE
Policy Description
POLICY_TOP Filter checks if the specified AS number is at the top of AS_PATH attribute.
POLICY_END Filter checks is the specified AS number is at the last of AS_PATH attribute.
POLICY_INCLUDE Filter checks if specified AS number exists in AS_PATH attribute.
POLICY_NOT_INCLUDE Opposite to POLICY_INCLUDE.
clone()
This method clones ASPathFilter object.
Returns ASPathFilter object that has the same values with the original one.
evaluate(path)
This method evaluates as_path list.
Returns this object’s policy and the result of matching. If the specified AS number matches this object’s
AS number according to the policy, this method returns True as the matching result.
path specifies the path.
class ryu.services.protocols.bgp.info_base.base.AttributeMap(filters, attr_type,
attr_value)
This class is used to specify an attribute to add if the path matches filters. We can create AttributeMap object as
follows:
pref_filter = PrefixFilter('192.168.103.0/30',
PrefixFilter.POLICY_PERMIT)
speaker.attribute_map_set('192.168.50.102', [attribute_map])
AttributeMap.ATTR_LOCAL_PREF means that 250 is set as a local preference value if nlri in the path matches
pref_filter.
ASPathFilter is also available as a filter. ASPathFilter checks if AS_PATH attribute in the path matches AS
number in the filter.
Attribute Description
filters A list of filter. Each object should be a Filter class or its sub-class
attr_type A type of attribute to map on filters. Currently AttributeMap.ATTR_LOCAL_PREF is avail-
able.
attr_value A attribute value
clone()
This method clones AttributeMap object.
Returns AttributeMap object that has the same values with the original one.
evaluate(path)
This method evaluates attributes of the path.
Returns the cause and result of matching. Both cause and result are returned from filters that this object
contains.
path specifies the path.
Introduction
Ryu MRT file library helps you to read/write MRT (Multi-Threaded Routing Toolkit) Routing Information Export
Format [RFC6396].
For loading the routing information contained in MRT files, you can use mrtlib.Reader.
class ryu.lib.mrtlib.Reader(f )
MRT format file reader.
Argument Description
f File object which reading MRT format file in binary mode.
Example of Usage:
import bz2
from ryu.lib import mrtlib
count = 0
(continues on next page)
For dumping the routing information which your RyuApp generated, you can use mrtlib.Writer.
class ryu.lib.mrtlib.Writer(f )
MRT format file writer.
Argument Description
f File object which writing MRT format file in binary mode.
Example of usage:
import bz2
import time
from ryu.lib import mrtlib
from ryu.lib.packet import bgp
mrt_writer = mrtlib.Writer(
bz2.BZ2File('rib.YYYYMMDD.hhmm.bz2', 'wb'))
rib_entry = mrtlib.MrtRibEntry(
peer_index=0,
originated_time=int(time.time()),
bgp_attributes=[bgp.BGPPathAttributeOrigin(0)])
message = mrtlib.TableDump2RibIPv4UnicastMrtMessage(
seq_num=0,
prefix=prefix,
rib_entries=[rib_entry])
record = mrtlib.TableDump2MrtRecord(
message=message)
mrt_writer.write(record)
Path: ryu.services.protocols.ovsdb
Introduction
Ryu OVSDB Manager library allows your code to interact with devices speaking the OVSDB protocol. This enables
your code to perform remote management of the devices and react to topology changes on them.
Please note this library will spawn a server listening on the port 6640 (the IANA registered for OVSDB protocol), but
does not initiate connections from controller side. Then, to make your devices connect to Ryu, you need to tell the
controller IP address and port to your devices.
Also this library identifies the devices by "system-id" which should be unique, persistent identifier among all devices
connecting to a single controller. Please make sure "system-id" is configured before connecting.
Example
The following logs all new OVSDB connections in "handle_new_ovsdb_connection" and also provides the API "cre-
ate_port" for creating a port on a bridge.
import uuid
class MyApp(app_manager.RyuApp):
@set_ev_cls(ovsdb_event.EventNewOVSDBConnection)
def handle_new_ovsdb_connection(self, ev):
system_id = ev.system_id
address = ev.client.address
self.logger.info(
'New OVSDB connection from system-id=%s, address=%s',
system_id, address)
if rep.status != 'success':
self.logger.error('Error creating port %s on bridge %s: %s',
name, bridge, rep.status)
return None
return rep.insert_uuids[new_port_uuid]
Path: ryu.lib.ovs
Similar to the OVSDB Manager library, this library enables your application to speak the OVSDB protocol (RFC7047),
but differ from the OVSDB Manager library, this library will initiate connections from controller side as ovs-vsctl
command does. Please make sure that your devices are listening on either the Unix domain socket or TCP/SSL port
before calling the APIs of this library.
# Show current configuration
$ ovs-vsctl get-manager
Basic Usage
1. Instantiate ryu.lib.ovs.vsctl.VSCtl.
2. Construct commands with ryu.lib.ovs.vsctl.VSCtlCommand. The syntax is almost the same as ovs-
vsctl command.
3. Execute commands via ryu.lib.ovs.vsctl.VSCtl.run_command.
Example
OVSDB_ADDR = 'tcp:127.0.0.1:6640'
ovs_vsctl = vsctl.VSCtl(OVSDB_ADDR)
(continues on next page)
# Equivalent to
# $ ovs-vsctl show
command = vsctl.VSCtlCommand('show')
ovs_vsctl.run_command([command])
print(command)
# >>> VSCtlCommand(args=[],command='show',options=[],result='830d781f-c3c8-4b4f-837e-
˓→106e1b33d058\n ovs_version: "2.8.90"\n')
# Equivalent to
# $ ovs-vsctl list Port s1-eth1
command = vsctl.VSCtlCommand('list', ('Port', 's1-eth1'))
ovs_vsctl.run_command([command])
print(command)
# >>> VSCtlCommand(args=('Port', 's1-eth1'),command='list',options=[],result=[<ovs.db.
˓→idl.Row object at 0x7f525fb682e8>])
print(command.result[0].name)
# >>> s1-eth1
API Reference
ryu.lib.ovs.vsctl
Option Description
--may-exist Does nothing when the given port already exists. The supported commands are add-port
and add-bond.
--fake-ifaceCreates a port as a fake interface. The supported command is add-bond.
--must-existRaises exception if the given port does not exist. The supported command is del-port.
--with-ifaceTakes effect to the interface which has the same name. The supported command is
del-port.
--if-exists Ignores exception when not found. The supported command is get.
ryu.lib.ovs.vsctl.valid_ovsdb_addr(addr)
Returns True if the given addr is valid OVSDB server address, otherwise False.
The valid formats are:
• unix:file
• tcp:ip:port
• ssl:ip:port
If ip is IPv6 address, wrap ip with brackets (e.g., ssl:[::1]:6640).
Parameters addr – str value of OVSDB server address.
Returns True if valid, otherwise False.
ryu.lib.ovs.bridge
del_controller()
Deletes the configured OpenFlow controller address.
This method is corresponding to the following ovs-vsctl command:
del_port(port_name)
Deletes a port on OVS instance.
This method is corresponding to the following ovs-vsctl command:
del_qos(port_name)
Deletes the Qos rule on the given port.
delete_port(port_name)
Deletes a port on the OVS instance.
This method is corresponding to the following ovs-vsctl command:
find_db_attributes(table, *conditions)
Lists records satisfying ’conditions’ in ’table’.
This method is corresponding to the following ovs-vsctl command:
Note: Currently, only ’=’ condition is supported. To support other condition is TODO.
get_controller()
Gets the configured OpenFlow controller address.
This method is corresponding to the following ovs-vsctl command:
get_datapath_id()
Gets Datapath ID of OVS instance.
This method is corresponding to the following ovs-vsctl command:
get_ofport(port_name)
Gets the OpenFlow port number.
This method is corresponding to the following ovs-vsctl command:
get_port_name_list()
Gets a list of all ports on OVS instance.
This method is corresponding to the following ovs-vsctl command:
get_vif_ports()
Returns a VIF object for each VIF port
init()
Validates the given ovsdb_addr and connects to OVS instance.
If failed to connect to OVS instance or the given datapath_id does not match with the Datapath ID of
the connected OVS instance, raises ryu.lib.ovs.bridge.OVSBridgeNotFound exception.
list_db_attributes(table, record=None)
Lists ’record’ (or all records) in ’table’.
This method is corresponding to the following ovs-vsctl command:
run_command(commands)
Executes the given commands and sends OVSDB messages.
commands must be a list of ryu.lib.ovs.vsctl.VSCtlCommand.
The given timeout and exception when instantiation will be used to call ryu.lib.ovs.vsctl.
VSCtl.run_command.
set_controller(controllers)
Sets the OpenFlow controller address.
This method is corresponding to the following ovs-vsctl command:
class ryu.ofproto.ofproto_parser.MsgBase(datapath)
This is a base class for OpenFlow message classes.
An instance of this class has at least the following attributes.
Attribute Description
datapath A ryu.controller.controller.Datapath instance for this message
version OpenFlow protocol version
msg_type Type of OpenFlow message
msg_len Length of the message
xid Transaction id
buf Raw data
_TYPE
_TYPE class attribute is used to annotate types of attributes.
This type information is used to find an appropriate conversion for a JSON style dictionary.
Currently the following types are implemented.
Type Descrption
ascii US-ASCII
utf-8 UTF-8
Example:
_TYPE = {
'ascii': [
'hw_addr',
],
'utf-8': [
'name',
]
}
Argument Descrpition
dict_ A dictionary which describes the parameters. For example, {"Param1": 100,
"Param2": 200}
decode_string (Optional) specify how to decode strings. The default is base64. This argument is
used only for attributes which don’t have explicit type annotations in _TYPE class
attribute.
additional_args (Optional) Additional kwargs for constructor.
to_jsondict(encode_string=<function b64encode>)
This method returns a JSON style dict to describe this object.
The returned dict is compatible with json.dumps() and json.loads().
Suppose ClassName object inherits StringifyMixin. For an object like the following:
ClassName(Param1=100, Param2=200)
Argument Description
encode_string (Optional) specify how to encode attributes which has python ’str’ type. The default
is base64. This argument is used only for attributes which don’t have explicit type
annotations in _TYPE class attribute.
Functions
ryu.ofproto.ofproto_parser.ofp_msg_from_jsondict(dp, jsondict)
This function instanticates an appropriate OpenFlow message class from the given JSON style dictionary. The
objects created by following two code fragments are equivalent.
Code A:
Code B:
o = dp.ofproto_parser.OFPSetConfig(flags=0, miss_send_len=128)
Argument Description
dp An instance of ryu.controller.Datapath.
jsondict A JSON style dict.
Controller-to-Switch Messages
Handshake
class ryu.ofproto.ofproto_v1_0_parser.OFPFeaturesRequest(datapath)
Features request message
The controller sends a feature request to the switch upon session establishment.
This message is handled by the Ryu framework, so the Ryu application do not need to process this typically.
Example:
req = ofp_parser.OFPFeaturesRequest(datapath)
datapath.send_msg(req)
JSON Example:
{
"OFPFeaturesRequest": {}
}
Attribute Description
datapath_id Datapath unique ID.
n_buffers Max packets buffered at once.
n_tables Number of tables supported by datapath.
capabilities Bitmap of capabilities flag.
OFPC_FLOW_STATS
OFPC_TABLE_STATS
OFPC_PORT_STATS
OFPC_STP
OFPC_RESERVED
OFPC_IP_REASM
OFPC_QUEUE_STATS
OFPC_ARP_MATCH_IP
Example:
@set_ev_cls(ofp_event.EventOFPSwitchFeatures, CONFIG_DISPATCHER)
def switch_features_handler(self, ev):
msg = ev.msg
JSON Example:
{
"OFPSwitchFeatures": {
"actions": 2115,
"capabilities": 169,
"datapath_id": 1095522080376,
"n_buffers": 0,
"n_tables": 255,
"ports": {
"6": {
"OFPPhyPort": {
"advertised": 640,
"config": 0,
"curr": 648,
"hw_addr": "f2:0b:a4:7d:f8:ea",
"name": "Port6",
"peer": 648,
"port_no": 6,
"state": 2,
"supported": 648
}
},
"7": {
"OFPPhyPort": {
"advertised": 640,
"config": 0,
"curr": 648,
"hw_addr": "f2:0b:a4:d0:3f:70",
"name": "Port7",
"peer": 648,
"port_no": 7,
"state": 16,
"supported": 648
}
}
}
}
}
Switch Configuration
Attribute Description
flags One of the following configuration flags.
OFPC_FRAG_NORMAL
OFPC_FRAG_DROP
OFPC_FRAG_REASM
OFPC_FRAG_MASK
Example:
def send_set_config(self, datapath):
ofp = datapath.ofproto
ofp_parser = datapath.ofproto_parser
class ryu.ofproto.ofproto_v1_0_parser.OFPGetConfigRequest(datapath)
Get config request message
The controller sends a get config request to query configuration parameters in the switch.
Example:
def send_get_config_request(self, datapath):
ofp_parser = datapath.ofproto_parser
req = ofp_parser.OFPGetConfigRequest(datapath)
datapath.send_msg(req)
class ryu.ofproto.ofproto_v1_0_parser.OFPGetConfigReply(datapath)
Get config reply message
The switch responds to a configuration request with a get config reply message.
Attribute Description
flags One of the following configuration flags.
OFPC_FRAG_NORMAL
OFPC_FRAG_DROP
OFPC_FRAG_REASM
OFPC_FRAG_MASK
Example:
@set_ev_cls(ofp_event.EventOFPGetConfigReply, MAIN_DISPATCHER)
def get_config_reply_handler(self, ev):
msg = ev.msg
(continues on next page)
if msg.flags == ofp.OFPC_FRAG_NORMAL:
flags = 'NORMAL'
elif msg.flags == ofp.OFPC_FRAG_DROP:
flags = 'DROP'
elif msg.flags == ofp.OFPC_FRAG_REASM:
flags = 'REASM'
elif msg.flags == ofp.OFPC_FRAG_MASK:
flags = 'MASK'
else:
flags = 'unknown'
self.logger.debug('OFPGetConfigReply received: '
'flags=%s miss_send_len=%d',
flags, msg.miss_send_len)
Attribute Description
match Instance of OFPMatch.
cookie Opaque controller-issued identifier.
command One of the following values.
OFPFC_ADD
OFPFC_MODIFY
OFPFC_MODIFY_STRICT
OFPFC_DELETE
OFPFC_DELETE_STRICT
OFPFF_SEND_FLOW_REM
OFPFF_CHECK_OVERLAP
OFPFF_EMERG
Example:
match = ofp_parser.OFPMatch(in_port=1)
cookie = 0
command = ofp.OFPFC_ADD
idle_timeout = hard_timeout = 0
priority = 32768
buffer_id = 0xffffffff
out_port = ofproto.OFPP_NONE
flags = 0
actions = [ofp_parser.OFPActionOutput(ofp.OFPP_NORMAL, 0)]
req = ofp_parser.OFPFlowMod(
datapath, match, cookie, command, idle_timeout, hard_timeout,
priority, buffer_id, out_port, flags, actions)
datapath.send_msg(req)
JSON Example:
{
"OFPFlowMod": {
"actions": [
{
(continues on next page)
Attribute Description
port_no Port number to modify.
hw_addr The hardware address that must be the
same as hw_addr of OFPPhyPort of
OFPSwitchFeatures.
config Bitmap of configuration flags.
OFPPC_PORT_DOWN
OFPPC_NO_STP
OFPPC_NO_RECV
OFPPC_NO_RECV_STP
OFPPC_NO_FLOOD
OFPPC_NO_FWD
OFPPC_NO_PACKET_IN
OFPPF_10MB_HD
OFPPF_10MB_FD
OFPPF_100MB_HD
OFPPF_100MB_FD
OFPPF_1GB_HD
OFPPF_1GB_FD
OFPPF_10GB_FD
OFPPF_COPPER
OFPPF_FIBER
OFPPF_AUTONEG
OFPPF_PAUSE
OFPPF_PAUSE_ASYM
Example:
port_no = 3
hw_addr = 'fa:c8:e8:76:1d:7e'
config = 0
mask = (ofp.OFPPC_PORT_DOWN | ofp.OFPPC_NO_RECV |
ofp.OFPPC_NO_FWD | ofp.OFPPC_NO_PACKET_IN)
advertise = (ofp.OFPPF_10MB_HD | ofp.OFPPF_100MB_FD |
ofp.OFPPF_1GB_FD | ofp.OFPPF_COPPER |
ofp.OFPPF_AUTONEG | ofp.OFPPF_PAUSE |
ofp.OFPPF_PAUSE_ASYM)
req = ofp_parser.OFPPortMod(datapath, port_no, hw_addr, config,
mask, advertise)
datapath.send_msg(req)
Attribute Description
port Port to be queried. Should refer to a valid physical port (i.e. < OFPP_MAX).
Example:
def send_queue_get_config_request(self, datapath):
ofp = datapath.ofproto
ofp_parser = datapath.ofproto_parser
req = ofp_parser.OFPQueueGetConfigRequest(datapath,
ofp.OFPP_NONE)
datapath.send_msg(req)
class ryu.ofproto.ofproto_v1_0_parser.OFPQueueGetConfigReply(datapath)
Queue configuration reply message
The switch responds with this message to a queue configuration request.
Attribute Description
port Port to be queried.
queues List of OFPPacketQueue instance.
Example:
@set_ev_cls(ofp_event.EventOFPQueueGetConfigReply, MAIN_DISPATCHER)
def queue_get_config_reply_handler(self, ev):
msg = ev.msg
Attribute Description
flags Zero (none yet defined in the spec).
Example:
def send_desc_stats_request(self, datapath):
ofp_parser = datapath.ofproto_parser
req = ofp_parser.OFPDescStatsRequest(datapath)
datapath.send_msg(req)
class ryu.ofproto.ofproto_v1_0_parser.OFPDescStatsReply(datapath)
Description statistics reply message
The switch responds with a stats reply that include this message to a description statistics request.
Attribute Description
mfr_desc Manufacturer description.
hw_desc Hardware description.
sw_desc Software description.
serial_num Serial number.
dp_desc Human readable description of datapath.
Example:
@set_ev_cls(ofp_event.EventOFPDescStatsReply, MAIN_DISPATCHER)
def desc_stats_reply_handler(self, ev):
msg = ev.msg
ofp = msg.datapath.ofproto
body = ev.msg.body
At- Description
tribute
flags Zero (none yet defined in the spec).
match Instance of OFPMatch.
table_id ID of table to read (from ofp_table_stats), 0xff for all tables or 0xfe for emergency.
out_port Require matching entries to include this as an output port. A value of OFPP_NONE indicates no
restriction.
Example:
def send_flow_stats_request(self, datapath):
ofp = datapath.ofproto
ofp_parser = datapath.ofproto_parser
match = ofp_parser.OFPMatch(in_port=1)
table_id = 0xff
out_port = ofp.OFPP_NONE
req = ofp_parser.OFPFlowStatsRequest(
datapath, 0, match, table_id, out_port)
datapath.send_msg(req)
class ryu.ofproto.ofproto_v1_0_parser.OFPFlowStatsReply(datapath)
Individual flow statistics reply message
The switch responds with a stats reply that include this message to an individual flow statistics request.
Attribute Description
table_id ID of table flow came from.
match Instance of OFPMatch.
duration_sec Time flow has been alive in seconds.
duration_nsec Time flow has been alive in nanoseconds beyond duration_sec.
priority Priority of the entry. Only meaningful when this is not an exact-match entry.
idle_timeout Number of seconds idle before expiration.
hard_timeout Number of seconds before expiration.
cookie Opaque controller-issued identifier.
packet_count Number of packets in flow.
byte_count Number of bytes in flow.
actions List of OFPAction* instance
Example:
@set_ev_cls(ofp_event.EventOFPFlowStatsReply, MAIN_DISPATCHER)
def flow_stats_reply_handler(self, ev):
msg = ev.msg
ofp = msg.datapath.ofproto
body = ev.msg.body
flows = []
for stat in body:
flows.append('table_id=%s match=%s '
'duration_sec=%d duration_nsec=%d '
'priority=%d '
'idle_timeout=%d hard_timeout=%d '
'cookie=%d packet_count=%d byte_count=%d '
'actions=%s' %
(stat.table_id, stat.match,
stat.duration_sec, stat.duration_nsec,
stat.priority,
stat.idle_timeout, stat.hard_timeout,
stat.cookie, stat.packet_count, stat.byte_count,
stat.actions))
self.logger.debug('FlowStats: %s', flows)
At- Description
tribute
flags Zero (none yet defined in the spec).
match Fields to match.
table_id ID of table to read (from ofp_table_stats) 0xff for all tables or 0xfe for emergency.
out_port Require matching entries to include this as an output port. A value of OFPP_NONE indicates no
restriction.
Example:
cookie = cookie_mask = 0
match = ofp_parser.OFPMatch(in_port=1)
req = ofp_parser.OFPAggregateStatsRequest(
datapath, 0, match, 0xff, ofp.OFPP_NONE)
datapath.send_msg(req)
class ryu.ofproto.ofproto_v1_0_parser.OFPAggregateStatsReply(datapath)
Aggregate flow statistics reply message
The switch responds with a stats reply that include this message to an aggregate flow statistics request.
Attribute Description
packet_count Number of packets in flows.
byte_count Number of bytes in flows.
flow_count Number of flows.
Example:
@set_ev_cls(ofp_event.EventOFPAggregateStatsReply, MAIN_DISPATCHER)
def aggregate_stats_reply_handler(self, ev):
msg = ev.msg
ofp = msg.datapath.ofproto
body = ev.msg.body
Attribute Description
flags Zero (none yet defined in the spec).
Example:
req = ofp_parser.OFPTableStatsRequest(datapath)
datapath.send_msg(req)
class ryu.ofproto.ofproto_v1_0_parser.OFPTableStatsReply(datapath)
Table statistics reply message
The switch responds with a stats reply that include this message to a table statistics request.
Attribute Description
table_id ID of table.
name table name.
wildcards Bitmap of OFPFW_* wildcards that are supported by the table.
max_entries Max number of entries supported
active_count Number of active entries
lookup_count Number of packets looked up in table
matched_count Number of packets that hit table
Example:
@set_ev_cls(ofp_event.EventOFPTableStatsReply, MAIN_DISPATCHER)
def stats_reply_handler(self, ev):
msg = ev.msg
ofp = msg.datapath.ofproto
body = ev.msg.body
tables = []
for stat in body:
tables.append('table_id=%d name=%s wildcards=0x%02x '
'max_entries=%d active_count=%d '
'lookup_count=%d matched_count=%d' %
(stat.table_id, stat.name, stat.wildcards,
stat.max_entries, stat.active_count,
stat.lookup_count, stat.matched_count))
self.logger.debug('TableStats: %s', tables)
Attribute Description
flags Zero (none yet defined in the spec).
port_no Port number to read (OFPP_NONE to all ports).
Example:
class ryu.ofproto.ofproto_v1_0_parser.OFPPortStatsReply(datapath)
Port statistics reply message
The switch responds with a stats reply that include this message to a port statistics request.
Attribute Description
port_no Port number.
rx_packets Number of received packets.
tx_packets Number of transmitted packets.
rx_bytes Number of received bytes.
tx_bytes Number of transmitted bytes.
rx_dropped Number of packets dropped by RX.
tx_dropped Number of packets dropped by TX.
rx_errors Number of receive errors.
tx_errors Number of transmit errors.
rx_frame_err Number of frame alignment errors.
rx_over_err Number of packet with RX overrun.
rx_crc_err Number of CRC errors.
collisions Number of collisions.
Example:
@set_ev_cls(ofp_event.EventOFPPortStatsReply, MAIN_DISPATCHER)
def port_stats_reply_handler(self, ev):
msg = ev.msg
ofp = msg.datapath.ofproto
body = ev.msg.body
ports = []
for stat in body:
ports.append('port_no=%d '
'rx_packets=%d tx_packets=%d '
'rx_bytes=%d tx_bytes=%d '
'rx_dropped=%d tx_dropped=%d '
'rx_errors=%d tx_errors=%d '
'rx_frame_err=%d rx_over_err=%d rx_crc_err=%d '
'collisions=%d' %
(stat.port_no,
stat.rx_packets, stat.tx_packets,
stat.rx_bytes, stat.tx_bytes,
stat.rx_dropped, stat.tx_dropped,
stat.rx_errors, stat.tx_errors,
stat.rx_frame_err, stat.rx_over_err,
stat.rx_crc_err, stat.collisions))
self.logger.debug('PortStats: %s', ports)
Attribute Description
flags Zero (none yet defined in the spec)
port_no Port number to read (All ports if OFPT_ALL).
queue_id ID of queue to read (All queues if OFPQ_ALL).
Example:
class ryu.ofproto.ofproto_v1_0_parser.OFPQueueStatsReply(datapath)
Queue statistics reply message
The switch responds with a stats reply that include this message to an aggregate flow statistics request.
Attribute Description
port_no Port number.
queue_id ID of queue.
tx_bytes Number of transmitted bytes.
tx_packets Number of transmitted packets.
tx_errors Number of packets dropped due to overrun.
Example:
@set_ev_cls(ofp_event.EventOFPQueueStatsReply, MAIN_DISPATCHER)
def stats_reply_handler(self, ev):
msg = ev.msg
ofp = msg.datapath.ofproto
body = ev.msg.body
queues = []
for stat in body:
queues.append('port_no=%d queue_id=%d '
'tx_bytes=%d tx_packets=%d tx_errors=%d ' %
(stat.port_no, stat.queue_id,
stat.tx_bytes, stat.tx_packets, stat.tx_errors))
self.logger.debug('QueueStats: %s', queues)
Attribute Description
buffer_id ID assigned by datapath (0xffffffff if none).
in_port Packet’s input port (OFPP_NONE if none).
actions ist of OFPAction* instance.
data Packet data of a binary type value or an instances of packet.Packet.
Example:
buffer_id = 0xffffffff
in_port = ofp.OFPP_NONE
actions = [ofp_parser.OFPActionOutput(ofp.OFPP_FLOOD, 0)]
req = ofp_parser.OFPPacketOut(datapath, buffer_id,
in_port, actions)
datapath.send_msg(req)
JSON Example:
{
"OFPPacketOut": {
"actions": [
{
"OFPActionOutput": {
"max_len": 65535,
"port": 65532
}
}
],
"buffer_id": 4294967295,
"data":
˓→"8guk0D9w8gukffjqCABFAABU+BoAAP8Br4sKAAABCgAAAggAAgj3YAAAMdYCAAAAAACrjS0xAAAAABAREhMUFRYXGBkaG
˓→",
"in_port": 65533
}
}
Barrier Message
class ryu.ofproto.ofproto_v1_0_parser.OFPBarrierRequest(datapath)
Barrier request message
The controller sends this message to ensure message dependencies have been met or receive notifications for
completed operations.
Example:
req = ofp_parser.OFPBarrierRequest(datapath)
datapath.send_msg(req)
class ryu.ofproto.ofproto_v1_0_parser.OFPBarrierReply(datapath)
Barrier reply message
The switch responds with this message to a barrier request.
Example:
@set_ev_cls(ofp_event.EventOFPBarrierReply, MAIN_DISPATCHER)
def barrier_reply_handler(self, ev):
self.logger.debug('OFPBarrierReply received')
Asynchronous Messages
Packet-In Message
Attribute Description
buffer_id ID assigned by datapath.
total_len Full length of frame.
in_port Port on which frame was received.
reason Reason packet is being sent.
OFPR_NO_MATCH
OFPR_ACTION
OFPR_INVALID_TTL
Example:
@set_ev_cls(ofp_event.EventOFPPacketIn, MAIN_DISPATCHER)
def packet_in_handler(self, ev):
msg = ev.msg
dp = msg.datapath
ofp = dp.ofproto
if msg.reason == ofp.OFPR_NO_MATCH:
reason = 'NO MATCH'
elif msg.reason == ofp.OFPR_ACTION:
reason = 'ACTION'
elif msg.reason == ofp.OFPR_INVALID_TTL:
reason = 'INVALID TTL'
else:
reason = 'unknown'
JSON Example:
{
"OFPPacketIn": {
"buffer_id": 2,
"data": "////////8gukffjqCAYAAQgABgQAAfILpH346goAAAEAAAAAAAAKAAAD",
"in_port": 99,
"reason": 1,
"total_len": 42
}
}
class ryu.ofproto.ofproto_v1_0_parser.OFPFlowRemoved(datapath)
Flow removed message
When flow entries time out or are deleted, the switch notifies controller with this message.
Attribute Description
match Instance of OFPMatch.
cookie Opaque controller-issued identifier.
priority Priority level of flow entry.
reason One of the following values.
OFPRR_IDLE_TIMEOUT
OFPRR_HARD_TIMEOUT
OFPRR_DELETE
Example:
@set_ev_cls(ofp_event.EventOFPFlowRemoved, MAIN_DISPATCHER)
def flow_removed_handler(self, ev):
msg = ev.msg
dp = msg.datapath
ofp = dp.ofproto
if msg.reason == ofp.OFPRR_IDLE_TIMEOUT:
reason = 'IDLE TIMEOUT'
elif msg.reason == ofp.OFPRR_HARD_TIMEOUT:
reason = 'HARD TIMEOUT'
elif msg.reason == ofp.OFPRR_DELETE:
(continues on next page)
Attribute Description
reason One of the following values.
OFPPR_ADD
OFPPR_DELETE
OFPPR_MODIFY
Example:
@set_ev_cls(ofp_event.EventOFPPortStatus, MAIN_DISPATCHER)
def port_status_handler(self, ev):
msg = ev.msg
dp = msg.datapath
ofp = dp.ofproto
if msg.reason == ofp.OFPPR_ADD:
reason = 'ADD'
elif msg.reason == ofp.OFPPR_DELETE:
reason = 'DELETE'
elif msg.reason == ofp.OFPPR_MODIFY:
reason = 'MODIFY'
else:
reason = 'unknown'
Error Message
Attribute Description
type High level type of error
code Details depending on the type
data Variable length data depending on the type and code
Type Code
OFPET_HELLO_FAILED OFPHFC_*
OFPET_BAD_REQUEST OFPBRC_*
OFPET_BAD_ACTION OFPBAC_*
OFPET_FLOW_MOD_FAILED OFPFMFC_*
OFPET_PORT_MOD_FAILED OFPPMFC_*
OFPET_QUEUE_OP_FAILED OFPQOFC_*
Example:
@set_ev_cls(ofp_event.EventOFPErrorMsg,
[HANDSHAKE_DISPATCHER, CONFIG_DISPATCHER, MAIN_DISPATCHER])
def error_msg_handler(self, ev):
msg = ev.msg
Symmetric Messages
Hello
class ryu.ofproto.ofproto_v1_0_parser.OFPHello(datapath)
Hello message
When connection is started, the hello message is exchanged between a switch and a controller.
This message is handled by the Ryu framework, so the Ryu application do not need to process this typically.
Echo Request
Attribute Description
data An arbitrary length data.
Example:
Echo Reply
Attribute Description
data An arbitrary length data.
Example:
@set_ev_cls(ofp_event.EventOFPEchoReply,
[HANDSHAKE_DISPATCHER, CONFIG_DISPATCHER, MAIN_DISPATCHER])
def echo_reply_handler(self, ev):
self.logger.debug('OFPEchoReply received: data=%s',
utils.hex_array(ev.msg.data))
Vendor
class ryu.ofproto.ofproto_v1_0_parser.OFPVendor(datapath)
Vendor message
The controller send this message to send the vendor-specific information to a switch.
Port Structures
class ryu.ofproto.ofproto_v1_0_parser.OFPPhyPort
Description of a port
Attribute Description
port_no Port number and it uniquely identifies a port within a
switch.
hw_addr MAC address for the port.
name Null-terminated string containing a human-readable
name for the interface.
config Bitmap of port configration flags.
OFPPC_PORT_DOWN
OFPPC_NO_STP
OFPPC_NO_RECV
OFPPC_NO_RECV_STP
OFPPC_NO_FLOOD
OFPPC_NO_FWD
OFPPC_NO_PACKET_IN
OFPPS_LINK_DOWN
OFPPS_STP_LISTEN
OFPPS_STP_LEARN
OFPPS_STP_FORWARD
OFPPS_STP_BLOCK
OFPPS_STP_MASK
Attribute Description
wildcards Wildcard fields.
(match fields) For the available match fields, please refer to the following.
Example:
>>> # compose
>>> match = parser.OFPMatch(
... in_port=1,
... dl_type=0x0800,
... dl_src='aa:bb:cc:dd:ee:ff',
... nw_src='192.168.0.1')
>>> # query
>>> if 'nw_src' in match:
... print match['nw_src']
...
'192.168.0.1'
Action Structures
Attribute Description
port Output port.
max_len Max length to send to controller.
Note:: The reason of this magic number (0xffe5) is because there is no good constant in of1.0. The same value
as OFPCML_MAX of of1.2 and of1.3 is used.
class ryu.ofproto.ofproto_v1_0_parser.OFPActionVlanVid(vlan_vid)
Set the 802.1q VLAN id action
This action indicates the 802.1q VLAN id to be set.
Attribute Description
vlan_vid VLAN id.
class ryu.ofproto.ofproto_v1_0_parser.OFPActionVlanPcp(vlan_pcp)
Set the 802.1q priority action
This action indicates the 802.1q priority to be set.
Attribute Description
vlan_pcp VLAN priority.
class ryu.ofproto.ofproto_v1_0_parser.OFPActionStripVlan
Strip the 802.1q header action
This action indicates the 802.1q priority to be striped.
class ryu.ofproto.ofproto_v1_0_parser.OFPActionDlAddr(dl_addr)
class ryu.ofproto.ofproto_v1_0_parser.OFPActionSetDlSrc(dl_addr)
Set the ethernet source address action
This action indicates the ethernet source address to be set.
Attribute Description
dl_addr Ethernet address.
class ryu.ofproto.ofproto_v1_0_parser.OFPActionSetDlDst(dl_addr)
Set the ethernet destination address action
This action indicates the ethernet destination address to be set.
Attribute Description
dl_addr Ethernet address.
class ryu.ofproto.ofproto_v1_0_parser.OFPActionNwAddr(nw_addr)
class ryu.ofproto.ofproto_v1_0_parser.OFPActionSetNwSrc(nw_addr)
Set the IP source address action
This action indicates the IP source address to be set.
Attribute Description
nw_addr IP address.
class ryu.ofproto.ofproto_v1_0_parser.OFPActionSetNwDst(nw_addr)
Set the IP destination address action
This action indicates the IP destination address to be set.
Attribute Description
nw_addr IP address.
class ryu.ofproto.ofproto_v1_0_parser.OFPActionSetNwTos(tos)
Set the IP ToS action
Attribute Description
tos IP ToS (DSCP field, 6 bits).
class ryu.ofproto.ofproto_v1_0_parser.OFPActionTpPort(tp)
class ryu.ofproto.ofproto_v1_0_parser.OFPActionSetTpSrc(tp)
Set the TCP/UDP source port action
This action indicates the TCP/UDP source port to be set.
Attribute Description
tp TCP/UDP port.
class ryu.ofproto.ofproto_v1_0_parser.OFPActionSetTpDst(tp)
Set the TCP/UDP destination port action
This action indicates the TCP/UDP destination port to be set.
Attribute Description
tp TCP/UDP port.
Attribute Description
port Port that queue belongs.
queue_id Where to enqueue the packets.
class ryu.ofproto.ofproto_v1_0_parser.OFPActionVendor(vendor=None)
Vendor action
This action is an extensible action for the vendor.
Controller-to-Switch Messages
Handshake
class ryu.ofproto.ofproto_v1_2_parser.OFPFeaturesRequest(datapath)
Features request message
The controller sends a feature request to the switch upon session establishment.
This message is handled by the Ryu framework, so the Ryu application do not need to process this typically.
Example:
req = ofp_parser.OFPFeaturesRequest(datapath)
datapath.send_msg(req)
JSON Example:
{
"OFPFeaturesRequest": {}
}
@set_ev_cls(ofp_event.EventOFPSwitchFeatures, CONFIG_DISPATCHER)
def switch_features_handler(self, ev):
msg = ev.msg
JSON Example:
{
"OFPSwitchFeatures": {
"capabilities": 79,
"datapath_id": 9210263729383,
"n_buffers": 0,
"n_tables": 255,
"ports": {
"6": {
"OFPPort": {
"advertised": 10240,
"config": 0,
"curr": 10248,
"curr_speed": 5000,
"hw_addr": "f2:0b:a4:7d:f8:ea",
"max_speed": 5000,
"name": "Port6",
"peer": 10248,
"port_no": 6,
"state": 4,
"supported": 10248
}
(continues on next page)
Switch Configuration
Attribute Description
flags One of the following configuration flags.
OFPC_FRAG_NORMAL
OFPC_FRAG_DROP
OFPC_FRAG_REASM
OFPC_FRAG_MASK
OFPC_INVALID_TTL_TO_CONTROLLER
Example:
def send_set_config(self, datapath):
ofp = datapath.ofproto
ofp_parser = datapath.ofproto_parser
JSON Example:
{
"OFPSetConfig": {
(continues on next page)
class ryu.ofproto.ofproto_v1_2_parser.OFPGetConfigRequest(datapath)
Get config request message
The controller sends a get config request to query configuration parameters in the switch.
Example:
req = ofp_parser.OFPGetConfigRequest(datapath)
datapath.send_msg(req)
JSON Example:
{
"OFPGetConfigRequest": {}
}
Attribute Description
flags One of the following configuration flags.
OFPC_FRAG_NORMAL
OFPC_FRAG_DROP
OFPC_FRAG_REASM
OFPC_FRAG_MASK
OFPC_INVALID_TTL_TO_CONTROLLER
Example:
@set_ev_cls(ofp_event.EventOFPGetConfigReply, MAIN_DISPATCHER)
def get_config_reply_handler(self, ev):
msg = ev.msg
dp = msg.datapath
ofp = dp.ofproto
if msg.flags == ofp.OFPC_FRAG_NORMAL:
flags = 'NORMAL'
elif msg.flags == ofp.OFPC_FRAG_DROP:
flags = 'DROP'
elif msg.flags == ofp.OFPC_FRAG_REASM:
(continues on next page)
JSON Example:
{
"OFPGetConfigReply": {
"flags": 0,
"miss_send_len": 128
}
}
Attribute Description
table_id ID of the table (OFPTT_ALL indicates all tables)
config Bitmap of the following flags.
OFPTC_TABLE_MISS_CONTROLLER
OFPTC_TABLE_MISS_CONTINUE
OFPTC_TABLE_MISS_DROP
OFPTC_TABLE_MISS_MASK
Example:
def send_table_mod(self, datapath):
ofp = datapath.ofproto
ofp_parser = datapath.ofproto_parser
JSON Example:
{
"OFPTableMod": {
"config": 0,
"table_id": 255
(continues on next page)
Attribute Description
cookie Opaque controller-issued identifier
cookie_mask Mask used to restrict the cookie bits that must
match when the command is OPFFC_MODIFY* or
OFPFC_DELETE*
table_id ID of the table to put the flow in
command One of the following values.
OFPFC_ADD
OFPFC_MODIFY
OFPFC_MODIFY_STRICT
OFPFC_DELETE
OFPFC_DELETE_STRICT
OFPFF_SEND_FLOW_REM
OFPFF_CHECK_OVERLAP
OFPFF_RESET_COUNTS
Example:
def send_flow_mod(self, datapath):
ofp = datapath.ofproto
(continues on next page)
cookie = cookie_mask = 0
table_id = 0
idle_timeout = hard_timeout = 0
priority = 32768
buffer_id = ofp.OFP_NO_BUFFER
match = ofp_parser.OFPMatch(in_port=1, eth_dst='ff:ff:ff:ff:ff:ff')
actions = [ofp_parser.OFPActionOutput(ofp.OFPP_NORMAL, 0)]
inst = [ofp_parser.OFPInstructionActions(ofp.OFPIT_APPLY_ACTIONS,
actions)]
req = ofp_parser.OFPFlowMod(datapath, cookie, cookie_mask,
table_id, ofp.OFPFC_ADD,
idle_timeout, hard_timeout,
priority, buffer_id,
ofp.OFPP_ANY, ofp.OFPG_ANY,
ofp.OFPFF_SEND_FLOW_REM,
match, inst)
datapath.send_msg(req)
JSON Example:
{
"OFPFlowMod": {
"buffer_id": 65535,
"command": 0,
"cookie": 0,
"cookie_mask": 0,
"flags": 0,
"hard_timeout": 0,
"idle_timeout": 0,
"instructions": [
{
"OFPInstructionActions": {
"actions": [
{
"OFPActionSetField": {
"field": {
"OXMTlv": {
"field": "vlan_vid",
"mask": null,
"value": 258
}
},
"len": 16,
"type": 25
}
},
{
"OFPActionOutput": {
"len": 16,
"max_len": 65535,
"port": 6,
"type": 0
}
}
],
(continues on next page)
{
"OFPFlowMod": {
"buffer_id": 65535,
"command": 0,
"cookie": 0,
"cookie_mask": 0,
"flags": 0,
"hard_timeout": 0,
(continues on next page)
Attribute Description
command One of the following values.
OFPGC_ADD
OFPGC_MODIFY
OFPGC_DELETE
OFPGT_ALL
OFPGT_SELECT
OFPGT_INDIRECT
OFPGT_FF
port = 1
max_len = 2000
actions = [ofp_parser.OFPActionOutput(port, max_len)]
weight = 100
watch_port = 0
watch_group = 0
buckets = [ofp_parser.OFPBucket(weight, watch_port, watch_group,
actions)]
group_id = 1
req = ofp_parser.OFPGroupMod(datapath, ofp.OFPGC_ADD,
ofp.OFPGT_SELECT, group_id, buckets)
datapath.send_msg(req)
JSON Example:
{
"OFPGroupMod": {
"buckets": [
{
"OFPBucket": {
"actions": [
{
"OFPActionOutput": {
"len": 16,
"max_len": 65535,
"port": 2,
"type": 0
}
(continues on next page)
Attribute Description
port_no Port number to modify
hw_addr The hardware address that must be the same as
hw_addr of OFPPort of OFPSwitchFeatures
config Bitmap of configuration flags.
OFPPC_PORT_DOWN
OFPPC_NO_RECV
OFPPC_NO_FWD
OFPPC_NO_PACKET_IN
OFPPF_10MB_HD
OFPPF_10MB_FD
OFPPF_100MB_HD
OFPPF_100MB_FD
OFPPF_1GB_HD
OFPPF_1GB_FD
OFPPF_10GB_FD
OFPPF_40GB_FD
OFPPF_100GB_FD
OFPPF_1TB_FD
OFPPF_OTHER
OFPPF_COPPER
OFPPF_FIBER
OFPPF_AUTONEG
OFPPF_PAUSE
OFPPF_PAUSE_ASYM
Example:
port_no = 3
hw_addr = 'fa:c8:e8:76:1d:7e'
config = 0
mask = (ofp.OFPPC_PORT_DOWN | ofp.OFPPC_NO_RECV |
ofp.OFPPC_NO_FWD | ofp.OFPPC_NO_PACKET_IN)
advertise = (ofp.OFPPF_10MB_HD | ofp.OFPPF_100MB_FD |
ofp.OFPPF_1GB_FD | ofp.OFPPF_COPPER |
ofp.OFPPF_AUTONEG | ofp.OFPPF_PAUSE |
ofp.OFPPF_PAUSE_ASYM)
req = ofp_parser.OFPPortMod(datapath, port_no, hw_addr, config,
mask, advertise)
datapath.send_msg(req)
JSON Example:
{
"OFPPortMod": {
"advertise": 4096,
"config": 0,
"hw_addr": "00-11-00-00-11-11",
"mask": 0,
"port_no": 1
}
}
Attribute Description
flags Zero (none yet defined in the spec)
Example:
req = ofp_parser.OFPDescStatsRequest(datapath)
datapath.send_msg(req)
JSON Example:
{
"OFPDescStatsRequest": {
"flags": 0
}
}
class ryu.ofproto.ofproto_v1_2_parser.OFPDescStats
Description statistics reply message
The switch responds with a stats reply that include this message to a description statistics request.
Attribute Description
mfr_desc Manufacturer description
hw_desc Hardware description
sw_desc Software description
serial_num Serial number
dp_desc Human readable description of datapath
Example:
@set_ev_cls(ofp_event.EventOFPStatsReply, MAIN_DISPATCHER)
def stats_reply_handler(self, ev):
msg = ev.msg
(continues on next page)
if msg.type == ofp.OFPST_DESC:
self.desc_stats_reply_handler(body)
JSON Example:
{
"OFPStatsReply": {
"body": {
"OFPDescStats": {
"dp_desc": "dp",
"hw_desc": "hw",
"mfr_desc": "mfr",
"serial_num": "serial",
"sw_desc": "sw"
}
},
"flags": 0,
"type": 0
}
}
Attribute Description
table_id ID of table to read
out_port Require matching entries to include this as an output port
out_group Require matching entries to include this as an output group
cookie Require matching entries to contain this cookie value
cookie_mask Mask used to restrict the cookie bits that must match
match Instance of OFPMatch
flags Zero (none yet defined in the spec)
Example:
def send_flow_stats_request(self, datapath):
ofp = datapath.ofproto
ofp_parser = datapath.ofproto_parser
(continues on next page)
cookie = cookie_mask = 0
match = ofp_parser.OFPMatch(in_port=1)
req = ofp_parser.OFPFlowStatsRequest(datapath,
ofp.OFPTT_ALL,
ofp.OFPP_ANY, ofp.OFPG_ANY,
cookie, cookie_mask, match)
datapath.send_msg(req)
JSON Example:
{
"OFPFlowStatsRequest": {
"cookie": 0,
"cookie_mask": 0,
"flags": 0,
"match": {
"OFPMatch": {
"length": 4,
"oxm_fields": [],
"type": 1
}
},
"out_group": 4294967295,
"out_port": 4294967295,
"table_id": 0
}
}
Attribute Description
table_id ID of table flow came from
duration_sec Time flow has been alive in seconds
duration_nsec Time flow has been alive in nanoseconds beyond duration_sec
priority Priority of the entry
idle_timeout Number of seconds idle before expiration
hard_timeout Number of seconds before expiration
cookie Opaque controller-issued identifier
packet_count Number of packets in flow
byte_count Number of bytes in flow
match Instance of OFPMatch
instructions list of OFPInstruction* instance
Example:
@set_ev_cls(ofp_event.EventOFPStatsReply, MAIN_DISPATCHER)
def stats_reply_handler(self, ev):
msg = ev.msg
ofp = msg.datapath.ofproto
body = ev.msg.body
if msg.type == ofp.OFPST_FLOW:
self.flow_stats_reply_handler(body)
JSON Example:
{
"OFPStatsReply": {
"body": [
{
"OFPFlowStats": {
"byte_count": 0,
"cookie": 0,
"duration_nsec": 115277000,
"duration_sec": 358,
"hard_timeout": 0,
"idle_timeout": 0,
"instructions": [],
"length": 56,
"match": {
"OFPMatch": {
"length": 4,
"oxm_fields": [],
"type": 1
}
},
"packet_count": 0,
"priority": 65535,
"table_id": 0
}
},
{
"OFPFlowStats": {
"byte_count": 0,
"cookie": 0,
(continues on next page)
class ryu.ofproto.ofproto_v1_2_parser.OFPAggregateStatsRequest(datapath,
table_id=255,
out_port=4294967295,
out_group=4294967295,
cookie=0,
cookie_mask=0,
match=None,
flags=0)
Aggregate flow statistics request message
The controller uses this message to query aggregate flow statictics.
Attribute Description
table_id ID of table to read
out_port Require matching entries to include this as an output port
out_group Require matching entries to include this as an output group
cookie Require matching entries to contain this cookie value
cookie_mask Mask used to restrict the cookie bits that must match
match Instance of OFPMatch
flags Zero (none yet defined in the spec)
Example:
cookie = cookie_mask = 0
match = ofp_parser.OFPMatch(in_port=1)
req = ofp_parser.OFPAggregateStatsRequest(datapath, 0,
ofp.OFPTT_ALL,
ofp.OFPP_ANY,
ofp.OFPG_ANY,
cookie, cookie_mask,
match)
datapath.send_msg(req)
JSON Example:
{
"OFPAggregateStatsRequest": {
"cookie": 0,
"cookie_mask": 0,
"flags": 0,
"match": {
"OFPMatch": {
"length": 4,
"oxm_fields": [],
"type": 1
}
},
"out_group": 4294967295,
"out_port": 4294967295,
"table_id": 255
}
}
class ryu.ofproto.ofproto_v1_2_parser.OFPAggregateStatsReply
Aggregate flow statistics reply message
The switch responds with a stats reply that include this message to an aggregate flow statistics request.
Attribute Description
packet_count Number of packets in flows
byte_count Number of bytes in flows
flow_count Number of flows
Example:
@set_ev_cls(ofp_event.EventOFPStatsReply, MAIN_DISPATCHER)
def stats_reply_handler(self, ev):
msg = ev.msg
ofp = msg.datapath.ofproto
body = ev.msg.body
if msg.type == ofp.OFPST_AGGREGATE:
self.aggregate_stats_reply_handler(body)
JSON Example:
{
"OFPStatsReply": {
"body": {
"OFPAggregateStatsReply": {
"byte_count": 574,
"flow_count": 6,
"packet_count": 7
}
(continues on next page)
Attribute Description
flags Zero (none yet defined in the spec)
Example:
req = ofp_parser.OFPTableStatsRequest(datapath)
datapath.send_msg(req)
JSON Example:
{
"OFPTableStatsRequest": {
"flags": 0
}
}
class ryu.ofproto.ofproto_v1_2_parser.OFPTableStats
Table statistics reply message
The switch responds with a stats reply that include this message to a table statistics request.
Attribute Description
table_id ID of table
name table name
match Bitmap of (1 << OFPXMT_*) that indicate the fields the table can match on
wildcards Bitmap of (1 << OFPXMT_*) wildcards that are supported by the table
write_actions Bitmap of OFPAT_* that are supported by the table with OFPIT_WRITE_ACTIONS
apply_actions Bitmap of OFPAT_* that are supported by the table with OFPIT_APPLY_ACTIONS
write_setfields Bitmap of (1 << OFPXMT_*) header fields that can be set with OF-
PIT_WRITE_ACTIONS
apply_setfields Bitmap of (1 << OFPXMT_*) header fields that can be set with OF-
PIT_APPLY_ACTIONS
meta- Bits of metadata table can match
data_match
metadata_write Bits of metadata table can write
instructions Bitmap of OFPIT_* values supported
config Bitmap of OFPTC_* values
max_entries Max number of entries supported
active_count Number of active entries
lookup_count Number of packets looked up in table
matched_count Number of packets that hit table
Example:
@set_ev_cls(ofp_event.EventOFPStatsReply, MAIN_DISPATCHER)
def stats_reply_handler(self, ev):
msg = ev.msg
ofp = msg.datapath.ofproto
body = ev.msg.body
if msg.type == ofp.OFPST_TABLE:
self.table_stats_reply_handler(body)
class ryu.ofproto.ofproto_v1_2_parser.OFPPortStatsRequest(datapath,
port_no=4294967295,
flags=0)
Port statistics request message
The controller uses this message to query information about ports statistics.
Attribute Description
port_no Port number to read (OFPP_ANY to all ports)
flags Zero (none yet defined in the spec)
Example:
JSON Example:
{
"OFPPortStatsRequest": {
"flags": 0,
"port_no": 4294967295
}
}
class ryu.ofproto.ofproto_v1_2_parser.OFPPortStats
Port statistics reply message
The switch responds with a stats reply that include this message to a port statistics request.
Attribute Description
port_no Port number
rx_packets Number of received packets
tx_packets Number of transmitted packets
rx_bytes Number of received bytes
tx_bytes Number of transmitted bytes
rx_dropped Number of packets dropped by RX
tx_dropped Number of packets dropped by TX
rx_errors Number of receive errors
tx_errors Number of transmit errors
rx_frame_err Number of frame alignment errors
rx_over_err Number of packet with RX overrun
rx_crc_err Number of CRC errors
collisions Number of collisions
Example:
@set_ev_cls(ofp_event.EventOFPStatsReply, MAIN_DISPATCHER)
def stats_reply_handler(self, ev):
msg = ev.msg
ofp = msg.datapath.ofproto
body = ev.msg.body
if msg.type == ofp.OFPST_PORT:
self.port_stats_reply_handler(body)
JSON Example:
{
"OFPStatsReply": {
"body": [
{
"OFPPortStats": {
"collisions": 0,
"port_no": 7,
"rx_bytes": 0,
"rx_crc_err": 0,
"rx_dropped": 0,
"rx_errors": 0,
"rx_frame_err": 0,
"rx_over_err": 0,
"rx_packets": 0,
"tx_bytes": 336,
"tx_dropped": 0,
"tx_errors": 0,
"tx_packets": 4
}
},
{
"OFPPortStats": {
"collisions": 0,
"port_no": 6,
"rx_bytes": 336,
"rx_crc_err": 0,
"rx_dropped": 0,
"rx_errors": 0,
"rx_frame_err": 0,
"rx_over_err": 0,
"rx_packets": 4,
"tx_bytes": 336,
"tx_dropped": 0,
"tx_errors": 0,
"tx_packets": 4
}
}
],
"flags": 0,
"type": 4
}
}
class ryu.ofproto.ofproto_v1_2_parser.OFPQueueStatsRequest(datapath,
port_no=4294967295,
queue_id=4294967295,
flags=0)
Queue statistics request message
The controller uses this message to query queue statictics.
Attribute Description
port_no Port number to read
queue_id ID of queue to read
flags Zero (none yet defined in the spec)
Example:
def send_queue_stats_request(self, datapath):
ofp = datapath.ofproto
ofp_parser = datapath.ofproto_parser
JSON Example:
{
"OFPQueueStatsRequest": {
"flags": 0,
"port_no": 4294967295,
"queue_id": 4294967295
}
}
class ryu.ofproto.ofproto_v1_2_parser.OFPQueueStats
Queue statistics reply message
The switch responds with a stats reply that include this message to an aggregate flow statistics request.
Attribute Description
port_no Port number
queue_id ID of queue
tx_bytes Number of transmitted bytes
tx_packets Number of transmitted packets
tx_errors Number of packets dropped due to overrun
Example:
@set_ev_cls(ofp_event.EventOFPStatsReply, MAIN_DISPATCHER)
def stats_reply_handler(self, ev):
msg = ev.msg
ofp = msg.datapath.ofproto
body = ev.msg.body
if msg.type == ofp.OFPST_QUEUE:
self.queue_stats_reply_handler(body)
JSON Example:
{
"OFPStatsReply": {
"body": [
{
"OFPQueueStats": {
"port_no": 7,
"queue_id": 1,
"tx_bytes": 0,
"tx_errors": 0,
"tx_packets": 0
}
},
{
"OFPQueueStats": {
"port_no": 6,
"queue_id": 1,
"tx_bytes": 0,
"tx_errors": 0,
"tx_packets": 0
}
},
{
"OFPQueueStats": {
"port_no": 7,
"queue_id": 2,
"tx_bytes": 0,
"tx_errors": 0,
"tx_packets": 0
}
}
],
"flags": 0,
"type": 5
}
}
class ryu.ofproto.ofproto_v1_2_parser.OFPGroupStatsRequest(datapath,
group_id=4294967292,
flags=0)
Group statistics request message
The controller uses this message to query statistics of one or more groups.
Attribute Description
group_id ID of group to read (OFPG_ALL to all groups)
flags Zero (none yet defined in the spec)
Example:
Attribute Description
group_id Group identifier
ref_count Number of flows or groups that directly forward to this group
packet_count Number of packets processed by group
byte_count Number of bytes processed by group
bucket_counters List of OFPBucketCounter instance
Example:
@set_ev_cls(ofp_event.EventOFPStatsReply, MAIN_DISPATCHER)
def stats_reply_handler(self, ev):
msg = ev.msg
ofp = msg.datapath.ofproto
body = ev.msg.body
if msg.type == ofp.OFPST_GROUP:
self.group_stats_reply_handler(body)
class ryu.ofproto.ofproto_v1_2_parser.OFPGroupDescStatsRequest(datapath,
flags=0)
Group description request message
The controller uses this message to list the set of groups on a switch.
Attribute Description
flags Zero (none yet defined in the spec)
Example:
req = ofp_parser.OFPGroupDescStatsRequest(datapath)
datapath.send_msg(req)
JSON Example:
{
"OFPGroupDescStatsRequest": {
"flags": 0
}
}
Attribute Description
type One of OFPGT_*
group_id Group identifier
buckets List of OFPBucket instance
if msg.type == ofp.OFPST_GROUP_DESC:
self.group_desc_stats_reply_handler(body)
JSON Example:
{
"OFPStatsReply": {
"body": [
{
"OFPGroupDescStats": {
"buckets": [
{
"OFPBucket": {
"actions": [
{
(continues on next page)
class ryu.ofproto.ofproto_v1_2_parser.OFPGroupFeaturesStatsRequest(datapath,
flags=0)
Group features request message
The controller uses this message to list the capabilities of groups on a switch.
Attribute Description
flags Zero (none yet defined in the spec)
Example:
req = ofp_parser.OFPGroupFeaturesStatsRequest(datapath)
datapath.send_msg(req)
JSON Example:
{
"OFPGroupFeaturesStatsRequest": {
"flags": 0
}
}
Attribute Description
types Bitmap of OFPGT_* values supported
capabilities Bitmap of OFPGFC_* capability supported
max_groups Maximum number of groups for each type
actions Bitmaps of OFPAT_* that are supported
Example:
@set_ev_cls(ofp_event.EventOFPStatsReply, MAIN_DISPATCHER)
def stats_reply_handler(self, ev):
msg = ev.msg
ofp = msg.datapath.ofproto
body = ev.msg.body
if msg.type == ofp.OFPST_GROUP_FEATURES:
self.group_features_stats_reply_handler(body)
JSON Example:
{
"OFPStatsReply": {
"body": {
"OFPGroupFeaturesStats": {
"actions": [
67082241,
67082241,
67082241,
67082241
],
"capabilities": 5,
"length": 40,
"max_groups": [
16777216,
16777216,
16777216,
16777216
],
"types": 15
}
},
"flags": 0,
"type": 8
}
}
Attribute Description
port Port to be queried (OFPP_ANY to all configured queues)
Example:
JSON Example:
{
"OFPQueueGetConfigRequest": {
"port": 4294967295
}
}
class ryu.ofproto.ofproto_v1_2_parser.OFPQueueGetConfigReply(datapath,
port=None,
queues=None)
Queue configuration reply message
The switch responds with this message to a queue configuration request.
Attribute Description
port Port which was queried
queues list of OFPPacketQueue instance
Example:
@set_ev_cls(ofp_event.EventOFPQueueGetConfigReply, MAIN_DISPATCHER)
def queue_get_config_reply_handler(self, ev):
msg = ev.msg
JSON Example:
{
"OFPQueueGetConfigReply": {
"port": 4294967295,
"queues": [
{
"OFPPacketQueue": {
"len": 48,
(continues on next page)
Packet-Out Message
Attribute Description
buffer_id ID assigned by datapath (OFP_NO_BUFFER if none)
in_port Packet’s input port or OFPP_CONTROLLER
actions list of OpenFlow action class
data Packet data of a binary type value or an instances of packet.Packet.
Example:
JSON Example:
{
"OFPPacketOut": {
"actions": [
{
"OFPActionOutput": {
"len": 16,
"max_len": 65535,
"port": 4294967292,
"type": 0
}
}
],
"actions_len": 16,
"buffer_id": 4294967295,
"data":
˓→"8guk0D9w8gukffjqCABFAABU+BoAAP8Br4sKAAABCgAAAggAAgj3YAAAMdYCAAAAAACrjS0xAAAAABAREhMUFRYXGBkaG
˓→",
"in_port": 4294967293
}
}
Barrier Message
class ryu.ofproto.ofproto_v1_2_parser.OFPBarrierRequest(datapath)
Barrier request message
The controller sends this message to ensure message dependencies have been met or receive notifications for
completed operations.
Example:
req = ofp_parser.OFPBarrierRequest(datapath)
datapath.send_msg(req)
JSON Example:
{
"OFPBarrierRequest": {}
}
class ryu.ofproto.ofproto_v1_2_parser.OFPBarrierReply(datapath)
Barrier reply message
The switch responds with this message to a barrier request.
Example:
@set_ev_cls(ofp_event.EventOFPBarrierReply, MAIN_DISPATCHER)
def barrier_reply_handler(self, ev):
self.logger.debug('OFPBarrierReply received')
JSON Example:
{
"OFPBarrierReply": {}
}
Attribute Description
role One of the following values.
OFPCR_ROLE_NOCHANGE
OFPCR_ROLE_EQUAL
OFPCR_ROLE_MASTER
OFPCR_ROLE_SLAVE
Example:
def send_role_request(self, datapath):
ofp = datapath.ofproto
ofp_parser = datapath.ofproto_parser
JSON Example:
{
"OFPRoleRequest": {
"generation_id": 17294086455919964160,
"role": 2
(continues on next page)
Attribute Description
role One of the following values.
OFPCR_ROLE_NOCHANGE
OFPCR_ROLE_EQUAL
OFPCR_ROLE_MASTER
OFPCR_ROLE_SLAVE
Example:
@set_ev_cls(ofp_event.EventOFPRoleReply, MAIN_DISPATCHER)
def role_reply_handler(self, ev):
msg = ev.msg
dp = msg.datapath
ofp = dp.ofproto
if msg.role == ofp.OFPCR_ROLE_NOCHANGE:
role = 'NOCHANGE'
elif msg.role == ofp.OFPCR_ROLE_EQUAL:
role = 'EQUAL'
elif msg.role == ofp.OFPCR_ROLE_MASTER:
role = 'MASTER'
elif msg.role == ofp.OFPCR_ROLE_SLAVE:
role = 'SLAVE'
else:
role = 'unknown'
JSON Example:
{
"OFPRoleReply": {
"generation_id": 17294086455919964160,
"role": 3
}
}
Asynchronous Messages
Packet-In Message
Attribute Description
buffer_id ID assigned by datapath
total_len Full length of frame
reason Reason packet is being sent.
OFPR_NO_MATCH
OFPR_ACTION
OFPR_INVALID_TTL
Example:
@set_ev_cls(ofp_event.EventOFPPacketIn, MAIN_DISPATCHER)
def packet_in_handler(self, ev):
msg = ev.msg
dp = msg.datapath
ofp = dp.ofproto
if msg.reason == ofp.OFPR_NO_MATCH:
reason = 'NO MATCH'
elif msg.reason == ofp.OFPR_ACTION:
reason = 'ACTION'
elif msg.reason == ofp.OFPR_INVALID_TTL:
reason = 'INVALID TTL'
else:
reason = 'unknown'
JSON Example:
{
"OFPPacketIn": {
"buffer_id": 2,
"data": "////////8gukffjqCAYAAQgABgQAAfILpH346goAAAEAAAAAAAAKAAAD",
"match": {
"OFPMatch": {
(continues on next page)
Attribute Description
cookie Opaque controller-issued identifier
priority Priority level of flow entry
reason One of the following values.
OFPRR_IDLE_TIMEOUT
OFPRR_HARD_TIMEOUT
OFPRR_DELETE
OFPRR_GROUP_DELETE
Example:
@set_ev_cls(ofp_event.EventOFPFlowRemoved, MAIN_DISPATCHER)
def flow_removed_handler(self, ev):
msg = ev.msg
dp = msg.datapath
ofp = dp.ofproto
if msg.reason == ofp.OFPRR_IDLE_TIMEOUT:
reason = 'IDLE TIMEOUT'
elif msg.reason == ofp.OFPRR_HARD_TIMEOUT:
reason = 'HARD TIMEOUT'
elif msg.reason == ofp.OFPRR_DELETE:
reason = 'DELETE'
elif msg.reason == ofp.OFPRR_GROUP_DELETE:
reason = 'GROUP DELETE'
else:
reason = 'unknown'
JSON Example:
{
"OFPFlowRemoved": {
"byte_count": 86,
(continues on next page)
Attribute Description
reason One of the following values.
OFPPR_ADD
OFPPR_DELETE
OFPPR_MODIFY
Example:
@set_ev_cls(ofp_event.EventOFPPortStatus, MAIN_DISPATCHER)
def port_status_handler(self, ev):
msg = ev.msg
dp = msg.datapath
ofp = dp.ofproto
if msg.reason == ofp.OFPPR_ADD:
(continues on next page)
JSON Example:
{
"OFPPortStatus": {
"desc": {
"OFPPort": {
"advertised": 10240,
"config": 0,
"curr": 10248,
"curr_speed": 5000,
"hw_addr": "f2:0b:a4:d0:3f:70",
"max_speed": 5000,
"name": "\u79c1\u306e\u30dd\u30fc\u30c8",
"peer": 10248,
"port_no": 7,
"state": 4,
"supported": 10248
}
},
"reason": 0
}
}
Error Message
Attribute Description
type High level type of error
code Details depending on the type
data Variable length data depending on the type and code
Type Code
OFPET_HELLO_FAILED OFPHFC_*
OFPET_BAD_REQUEST OFPBRC_*
OFPET_BAD_ACTION OFPBAC_*
OFPET_BAD_INSTRUCTION OFPBIC_*
OFPET_BAD_MATCH OFPBMC_*
OFPET_FLOW_MOD_FAILED OFPFMFC_*
OFPET_GROUP_MOD_FAILED OFPGMFC_*
OFPET_PORT_MOD_FAILED OFPPMFC_*
OFPET_TABLE_MOD_FAILED OFPTMFC_*
OFPET_QUEUE_OP_FAILED OFPQOFC_*
OFPET_SWITCH_CONFIG_FAILED OFPSCFC_*
OFPET_ROLE_REQUEST_FAILED OFPRRFC_*
OFPET_EXPERIMENTER N/A
Attribute Description
exp_type Experimenter defined type
experimenter Experimenter ID
Example:
@set_ev_cls(ofp_event.EventOFPErrorMsg,
[HANDSHAKE_DISPATCHER, CONFIG_DISPATCHER, MAIN_DISPATCHER])
def error_msg_handler(self, ev):
msg = ev.msg
JSON Example:
{
"OFPErrorMsg": {
"code": 11,
"data": "ZnVnYWZ1Z2E=",
"type": 2
}
}
{
"OFPErrorMsg": {
"code": null,
"data": "amlra2VuIGRhdGE=",
"exp_type": 60000,
"experimenter": 999999,
"type": 65535
}
}
Symmetric Messages
Hello
class ryu.ofproto.ofproto_v1_2_parser.OFPHello(datapath)
Hello message
When connection is started, the hello message is exchanged between a switch and a controller.
This message is handled by the Ryu framework, so the Ryu application do not need to process this typically.
JSON Example:
{
"OFPHello": {}
}
Echo Request
Attribute Description
data An arbitrary length data
Example:
@set_ev_cls(ofp_event.EventOFPEchoRequest,
[HANDSHAKE_DISPATCHER, CONFIG_DISPATCHER, MAIN_DISPATCHER])
def echo_request_handler(self, ev):
self.logger.debug('OFPEchoRequest received: data=%s',
utils.hex_array(ev.msg.data))
JSON Example:
{
"OFPEchoRequest": {
"data": "aG9nZQ=="
}
}
Echo Reply
Attribute Description
data An arbitrary length data
Example:
@set_ev_cls(ofp_event.EventOFPEchoReply,
[HANDSHAKE_DISPATCHER, CONFIG_DISPATCHER, MAIN_DISPATCHER])
def echo_reply_handler(self, ev):
self.logger.debug('OFPEchoReply received: data=%s',
utils.hex_array(ev.msg.data))
JSON Example:
{
"OFPEchoReply": {
"data": "aG9nZQ=="
}
}
Experimenter
Attribute Description
experimenter Experimenter ID
exp_type Experimenter defined
data Experimenter defined arbitrary additional data
JSON Example:
{
"OFPExperimenter": {
"data": "bmF6bw==",
"exp_type": 123456789,
"experimenter": 98765432
}
}
Port Structures
class ryu.ofproto.ofproto_v1_2_parser.OFPPort
Description of a port
Attribute Description
port_no Port number and it uniquely identifies a port within a
switch.
hw_addr MAC address for the port.
name Null-terminated string containing a human-readable
name for the interface.
config Bitmap of port configration flags.
OFPPC_PORT_DOWN
OFPPC_NO_RECV
OFPPC_NO_FWD
OFPPC_NO_PACKET_IN
OFPPS_LINK_DOWN
OFPPS_BLOCKED
OFPPS_LIVE
Example:
>>> # compose
>>> match = parser.OFPMatch(
... in_port=1,
... eth_type=0x86dd,
... ipv6_src=('2001:db8:bd05:1d2:288a:1fc0:1:10ee',
... 'ffff:ffff:ffff:ffff::'),
... ipv6_dst='2001:db8:bd05:1d2:288a:1fc0:1:10ee')
>>> # query
>>> if 'ipv6_src' in match:
... print match['ipv6_src']
...
('2001:db8:bd05:1d2:288a:1fc0:1:10ee', 'ffff:ffff:ffff:ffff::')
Note: For the list of the supported Nicira experimenter matches, please refer to ryu.ofproto.nx_match.
Note: For VLAN id match field, special values are defined in OpenFlow Spec.
1) Packets with and without a VLAN tag
• Example:
match = parser.OFPMatch()
• Packet Matching
non-VLAN-tagged MATCH
VLAN-tagged(vlan_id=3) MATCH
VLAN-tagged(vlan_id=5) MATCH
match = parser.OFPMatch(vlan_vid=0x0000)
• Packet Matching
non-VLAN-tagged MATCH
VLAN-tagged(vlan_id=3) x
VLAN-tagged(vlan_id=5) x
• Packet Matching
non-VLAN-tagged x
VLAN-tagged(vlan_id=3) MATCH
VLAN-tagged(vlan_id=5) MATCH
• Packet Matching
non-VLAN-tagged x
VLAN-tagged(vlan_id=3) MATCH
VLAN-tagged(vlan_id=5) x
class ryu.ofproto.ofproto_v1_2_parser.OFPInstructionGotoTable(table_id,
type_=None,
len_=None)
Goto table instruction
This instruction indicates the next table in the processing pipeline.
Attribute Description
table_id Next table
class ryu.ofproto.ofproto_v1_2_parser.OFPInstructionWriteMetadata(metadata,
meta-
data_mask,
type_=None,
len_=None)
Write metadata instruction
This instruction writes the masked metadata value into the metadata field.
Attribute Description
metadata Metadata value to write
metadata_mask Metadata write bitmask
Attribute Description
type One of following values.
OFPIT_WRITE_ACTIONS
OFPIT_APPLY_ACTIONS
OFPIT_CLEAR_ACTIONS
Action Structures
Attribute Description
port Output port
max_len Max length to send to controller
Attribute Description
group_id Group identifier
Attribute Description
queue_id Queue ID for the packets
Attribute Description
mpls_ttl MPLS TTL
class ryu.ofproto.ofproto_v1_2_parser.OFPActionDecMplsTtl(type_=None,
len_=None)
Decrement MPLS TTL action
This action decrements the MPLS TTL.
class ryu.ofproto.ofproto_v1_2_parser.OFPActionSetNwTtl(nw_ttl, type_=None,
len_=None)
Set IP TTL action
This action sets the IP TTL.
Attribute Description
nw_ttl IP TTL
Attribute Description
ethertype Ether type. The default is 802.1Q. (0x8100)
class ryu.ofproto.ofproto_v1_2_parser.OFPActionPushMpls(ethertype=34887,
type_=None, len_=None)
Push MPLS action
This action pushes a new MPLS header to the packet.
Attribute Description
ethertype Ether type
set_field = OFPActionSetField(eth_src="00:00:00:00:00:00")
class ryu.ofproto.ofproto_v1_2_parser.OFPActionExperimenter(experimenter,
type_=None,
len_=None)
Experimenter action
This action is an extensible action for the experimenter.
Attribute Description
experimenter Experimenter ID
Note: For the list of the supported Nicira experimenter actions, please refer to ryu.ofproto.nx_actions.
Controller-to-Switch Messages
Handshake
class ryu.ofproto.ofproto_v1_3_parser.OFPFeaturesRequest(datapath)
Features request message
The controller sends a feature request to the switch upon session establishment.
This message is handled by the Ryu framework, so the Ryu application do not need to process this typically.
Example:
req = ofp_parser.OFPFeaturesRequest(datapath)
datapath.send_msg(req)
JSON Example:
{
"OFPFeaturesRequest": {}
}
@set_ev_cls(ofp_event.EventOFPSwitchFeatures, CONFIG_DISPATCHER)
def switch_features_handler(self, ev):
msg = ev.msg
JSON Example:
{
"OFPSwitchFeatures": {
"auxiliary_id": 99,
"capabilities": 79,
"datapath_id": 9210263729383,
"n_buffers": 0,
"n_tables": 255
}
}
Switch Configuration
Attribute Description
flags Bitmap of the following flags.
OFPC_FRAG_NORMAL
OFPC_FRAG_DROP
OFPC_FRAG_REASM
Example:
def send_set_config(self, datapath):
ofp = datapath.ofproto
ofp_parser = datapath.ofproto_parser
JSON Example:
{
"OFPSetConfig": {
"flags": 0,
"miss_send_len": 128
}
}
class ryu.ofproto.ofproto_v1_3_parser.OFPGetConfigRequest(datapath)
Get config request message
The controller sends a get config request to query configuration parameters in the switch.
Example:
def send_get_config_request(self, datapath):
ofp_parser = datapath.ofproto_parser
req = ofp_parser.OFPGetConfigRequest(datapath)
datapath.send_msg(req)
JSON Example:
{
"OFPGetConfigRequest": {}
}
The switch responds to a configuration request with a get config reply message.
Attribute Description
flags Bitmap of the following flags.
OFPC_FRAG_NORMAL
OFPC_FRAG_DROP
OFPC_FRAG_REASM
OFPC_FRAG_MASK
Example:
@set_ev_cls(ofp_event.EventOFPGetConfigReply, MAIN_DISPATCHER)
def get_config_reply_handler(self, ev):
msg = ev.msg
dp = msg.datapath
ofp = dp.ofproto
flags = []
JSON Example:
{
"OFPGetConfigReply": {
"flags": 0,
"miss_send_len": 128
}
}
Attribute Description
table_id ID of the table (OFPTT_ALL indicates all tables)
config Bitmap of the following flags. OFPTC_DEPRECATED_MASK (3)
Example:
req = ofp_parser.OFPTableMod(datapath, 1, 3)
datapath.send_msg(req)
JSON Example:
{
"OFPTableMod": {
"config": 0,
"table_id": 255
}
}
Attribute Description
cookie Opaque controller-issued identifier
cookie_mask Mask used to restrict the cookie bits that must
match when the command is OPFFC_MODIFY* or
OFPFC_DELETE*
table_id ID of the table to put the flow in
command One of the following values.
OFPFC_ADD
OFPFC_MODIFY
OFPFC_MODIFY_STRICT
OFPFC_DELETE
OFPFC_DELETE_STRICT
OFPFF_SEND_FLOW_REM
OFPFF_CHECK_OVERLAP
OFPFF_RESET_COUNTS
OFPFF_NO_PKT_COUNTS
OFPFF_NO_BYT_COUNTS
Example:
cookie = cookie_mask = 0
table_id = 0
idle_timeout = hard_timeout = 0
priority = 32768
buffer_id = ofp.OFP_NO_BUFFER
match = ofp_parser.OFPMatch(in_port=1, eth_dst='ff:ff:ff:ff:ff:ff')
actions = [ofp_parser.OFPActionOutput(ofp.OFPP_NORMAL, 0)]
inst = [ofp_parser.OFPInstructionActions(ofp.OFPIT_APPLY_ACTIONS,
actions)]
req = ofp_parser.OFPFlowMod(datapath, cookie, cookie_mask,
table_id, ofp.OFPFC_ADD,
idle_timeout, hard_timeout,
priority, buffer_id,
(continues on next page)
JSON Example:
{
"OFPFlowMod": {
"buffer_id": 65535,
"command": 0,
"cookie": 0,
"cookie_mask": 0,
"flags": 0,
"hard_timeout": 0,
"idle_timeout": 0,
"instructions": [
{
"OFPInstructionActions": {
"actions": [
{
"OFPActionSetField": {
"field": {
"OXMTlv": {
"field": "vlan_vid",
"mask": null,
"value": 258
}
},
"len": 16,
"type": 25
}
},
{
"OFPActionCopyTtlOut": {
"len": 8,
"type": 11
}
},
{
"OFPActionCopyTtlIn": {
"len": 8,
"type": 12
}
},
{
"OFPActionCopyTtlIn": {
"len": 8,
"type": 12
}
},
{
"OFPActionPopPbb": {
"len": 8,
"type": 27
}
},
(continues on next page)
{
"OFPFlowMod": {
"buffer_id": 65535,
"command": 0,
"cookie": 0,
"cookie_mask": 0,
"flags": 0,
"hard_timeout": 0,
"idle_timeout": 0,
"instructions": [
{
"OFPInstructionGotoTable": {
"len": 8,
"table_id": 1,
"type": 1
}
}
],
(continues on next page)
{
"OFPFlowMod": {
"buffer_id": 65535,
"command": 0,
"cookie": 0,
"cookie_mask": 0,
"flags": 0,
"hard_timeout": 0,
"idle_timeout": 0,
"instructions": [
{
"OFPInstructionMeter": {
"len": 8,
"meter_id": 1,
"type": 6
}
},
{
"OFPInstructionActions": {
"actions": [
{
"OFPActionOutput": {
"len": 16,
"max_len": 65535,
"port": 6,
"type": 0
}
(continues on next page)
Attribute Description
command One of the following values.
OFPGC_ADD
OFPGC_MODIFY
OFPGC_DELETE
OFPGT_ALL
OFPGT_SELECT
OFPGT_INDIRECT
OFPGT_FF
port = 1
max_len = 2000
actions = [ofp_parser.OFPActionOutput(port, max_len)]
weight = 100
watch_port = 0
watch_group = 0
buckets = [ofp_parser.OFPBucket(weight, watch_port, watch_group,
actions)]
group_id = 1
req = ofp_parser.OFPGroupMod(datapath, ofp.OFPGC_ADD,
ofp.OFPGT_SELECT, group_id, buckets)
datapath.send_msg(req)
JSON Example:
{
"OFPGroupMod": {
"buckets": [
{
"OFPBucket": {
"actions": [
{
"OFPActionOutput": {
"len": 16,
"max_len": 65535,
"port": 2,
"type": 0
}
}
],
"len": 32,
"watch_group": 1,
"watch_port": 1,
"weight": 1
}
}
],
"command": 0,
"group_id": 1,
"type": 0
}
}
Attribute Description
port_no Port number to modify
hw_addr The hardware address that must be the same as
hw_addr of OFPPort of OFPSwitchFeatures
config Bitmap of configuration flags.
OFPPC_PORT_DOWN
OFPPC_NO_RECV
OFPPC_NO_FWD
OFPPC_NO_PACKET_IN
OFPPF_10MB_HD
OFPPF_10MB_FD
OFPPF_100MB_HD
OFPPF_100MB_FD
OFPPF_1GB_HD
OFPPF_1GB_FD
OFPPF_10GB_FD
OFPPF_40GB_FD
OFPPF_100GB_FD
OFPPF_1TB_FD
OFPPF_OTHER
OFPPF_COPPER
OFPPF_FIBER
OFPPF_AUTONEG
OFPPF_PAUSE
OFPPF_PAUSE_ASYM
Example:
port_no = 3
hw_addr = 'fa:c8:e8:76:1d:7e'
config = 0
mask = (ofp.OFPPC_PORT_DOWN | ofp.OFPPC_NO_RECV |
ofp.OFPPC_NO_FWD | ofp.OFPPC_NO_PACKET_IN)
advertise = (ofp.OFPPF_10MB_HD | ofp.OFPPF_100MB_FD |
ofp.OFPPF_1GB_FD | ofp.OFPPF_COPPER |
ofp.OFPPF_AUTONEG | ofp.OFPPF_PAUSE |
ofp.OFPPF_PAUSE_ASYM)
req = ofp_parser.OFPPortMod(datapath, port_no, hw_addr, config,
mask, advertise)
datapath.send_msg(req)
JSON Example:
{
"OFPPortMod": {
"advertise": 4096,
"config": 0,
"hw_addr": "00:11:00:00:11:11",
"mask": 0,
"port_no": 1
}
}
Attribute Description
command One of the following values.
OFPMC_ADD
OFPMC_MODIFY
OFPMC_DELETE
OFPMF_KBPS
OFPMF_PKTPS
OFPMF_BURST
OFPMF_STATS
OFPMeterBandDrop
OFPMeterBandDscpRemark
OFPMeterBandExperimenter
JSON Example:
{
"OFPMeterMod": {
"bands": [
{
"OFPMeterBandDrop": {
"burst_size": 10,
"len": 16,
"rate": 1000,
"type": 1
}
},
{
"OFPMeterBandDscpRemark": {
"burst_size": 10,
(continues on next page)
Multipart Messages
Attribute Description
flags Zero or OFPMPF_REQ_MORE
Example:
req = ofp_parser.OFPDescStatsRequest(datapath, 0)
datapath.send_msg(req)
JSON Example:
{
"OFPDescStatsRequest": {
"flags": 0,
"type": 0
}
}
Attribute Description
body Instance of OFPDescStats
Example:
@set_ev_cls(ofp_event.EventOFPDescStatsReply, MAIN_DISPATCHER)
def desc_stats_reply_handler(self, ev):
body = ev.msg.body
JSON Example:
{
"OFPDescStatsReply": {
"body": {
"OFPDescStats": {
"dp_desc": "dp",
"hw_desc": "hw",
"mfr_desc": "mfr",
"serial_num": "serial",
"sw_desc": "sw"
}
},
"flags": 0,
"type": 0
}
}
Attribute Description
flags Zero or OFPMPF_REQ_MORE
table_id ID of table to read
out_port Require matching entries to include this as an output port
out_group Require matching entries to include this as an output group
cookie Require matching entries to contain this cookie value
cookie_mask Mask used to restrict the cookie bits that must match
match Instance of OFPMatch
Example:
cookie = cookie_mask = 0
match = ofp_parser.OFPMatch(in_port=1)
req = ofp_parser.OFPFlowStatsRequest(datapath, 0,
ofp.OFPTT_ALL,
ofp.OFPP_ANY, ofp.OFPG_ANY,
cookie, cookie_mask,
match)
datapath.send_msg(req)
JSON Example:
{
"OFPFlowStatsRequest": {
"cookie": 0,
"cookie_mask": 0,
"flags": 0,
"match": {
"OFPMatch": {
"length": 4,
"oxm_fields": [],
"type": 1
}
},
"out_group": 4294967295,
"out_port": 4294967295,
"table_id": 0,
"type": 1
}
}
Attribute Description
body List of OFPFlowStats instance
Example:
@set_ev_cls(ofp_event.EventOFPFlowStatsReply, MAIN_DISPATCHER)
def flow_stats_reply_handler(self, ev):
flows = []
for stat in ev.msg.body:
flows.append('table_id=%s '
'duration_sec=%d duration_nsec=%d '
'priority=%d '
'idle_timeout=%d hard_timeout=%d flags=0x%04x '
'cookie=%d packet_count=%d byte_count=%d '
'match=%s instructions=%s' %
(stat.table_id,
stat.duration_sec, stat.duration_nsec,
(continues on next page)
JSON Example:
{
"OFPFlowStatsReply": {
"body": [
{
"OFPFlowStats": {
"byte_count": 0,
"cookie": 0,
"duration_nsec": 115277000,
"duration_sec": 358,
"flags": 0,
"hard_timeout": 0,
"idle_timeout": 0,
"instructions": [],
"length": 56,
"match": {
"OFPMatch": {
"length": 4,
"oxm_fields": [],
"type": 1
}
},
"packet_count": 0,
"priority": 65535,
"table_id": 0
}
},
{
"OFPFlowStats": {
"byte_count": 0,
"cookie": 0,
"duration_nsec": 115055000,
"duration_sec": 358,
"flags": 0,
"hard_timeout": 0,
"idle_timeout": 0,
"instructions": [
{
"OFPInstructionActions": {
"actions": [
{
"OFPActionOutput": {
"len": 16,
"max_len": 0,
"port": 4294967290,
"type": 0
}
}
],
"len": 24,
(continues on next page)
class ryu.ofproto.ofproto_v1_3_parser.OFPAggregateStatsRequest(datapath,
flags, table_id,
out_port,
out_group,
cookie,
cookie_mask,
match,
type_=None)
Aggregate flow statistics request message
The controller uses this message to query aggregate flow statictics.
Attribute Description
flags Zero or OFPMPF_REQ_MORE
table_id ID of table to read
out_port Require matching entries to include this as an output port
out_group Require matching entries to include this as an output group
cookie Require matching entries to contain this cookie value
cookie_mask Mask used to restrict the cookie bits that must match
match Instance of OFPMatch
Example:
def send_aggregate_stats_request(self, datapath):
ofp = datapath.ofproto
ofp_parser = datapath.ofproto_parser
cookie = cookie_mask = 0
match = ofp_parser.OFPMatch(in_port=1)
req = ofp_parser.OFPAggregateStatsRequest(datapath, 0,
ofp.OFPTT_ALL,
ofp.OFPP_ANY,
ofp.OFPG_ANY,
cookie, cookie_mask,
match)
datapath.send_msg(req)
JSON Example:
{
"OFPAggregateStatsRequest": {
"cookie": 0,
"cookie_mask": 0,
"flags": 0,
"match": {
(continues on next page)
class ryu.ofproto.ofproto_v1_3_parser.OFPAggregateStatsReply(datapath,
type_=None,
**kwargs)
Aggregate flow statistics reply message
The switch responds with this message to an aggregate flow statistics request.
Attribute Description
body Instance of OFPAggregateStats
Example:
@set_ev_cls(ofp_event.EventOFPAggregateStatsReply, MAIN_DISPATCHER)
def aggregate_stats_reply_handler(self, ev):
body = ev.msg.body
JSON Example:
{
"OFPAggregateStatsReply": {
"body": {
"OFPAggregateStats": {
"byte_count": 574,
"flow_count": 6,
"packet_count": 7
}
},
"flags": 0,
"type": 2
}
}
Attribute Description
flags Zero or OFPMPF_REQ_MORE
Example:
def send_table_stats_request(self, datapath):
ofp_parser = datapath.ofproto_parser
req = ofp_parser.OFPTableStatsRequest(datapath, 0)
datapath.send_msg(req)
JSON Example:
{
"OFPTableStatsRequest": {
"flags": 0,
"type": 3
}
}
Attribute Description
body List of OFPTableStats instance
Example:
@set_ev_cls(ofp_event.EventOFPTableStatsReply, MAIN_DISPATCHER)
def table_stats_reply_handler(self, ev):
tables = []
for stat in ev.msg.body:
tables.append('table_id=%d active_count=%d lookup_count=%d '
' matched_count=%d' %
(stat.table_id, stat.active_count,
stat.lookup_count, stat.matched_count))
self.logger.debug('TableStats: %s', tables)
JSON Example:
{
"OFPTableStatsReply": {
"body": [
{
"OFPTableStats": {
"active_count": 4,
"lookup_count": 4,
"matched_count": 4,
"table_id": 0
}
},
{
"OFPTableStats": {
(continues on next page)
Attribute Description
flags Zero or OFPMPF_REQ_MORE
port_no Port number to read (OFPP_ANY to all ports)
Example:
def send_port_stats_request(self, datapath):
ofp = datapath.ofproto
ofp_parser = datapath.ofproto_parser
JSON Example:
{
"OFPPortStatsRequest": {
"flags": 0,
"port_no": 4294967295,
"type": 4
}
}
Attribute Description
body List of OFPPortStats instance
Example:
@set_ev_cls(ofp_event.EventOFPPortStatsReply, MAIN_DISPATCHER)
def port_stats_reply_handler(self, ev):
(continues on next page)
JSON Example:
{
"OFPPortStatsReply": {
"body": [
{
"OFPPortStats": {
"collisions": 0,
"duration_nsec": 0,
"duration_sec": 0,
"port_no": 7,
"rx_bytes": 0,
"rx_crc_err": 0,
"rx_dropped": 0,
"rx_errors": 0,
"rx_frame_err": 0,
"rx_over_err": 0,
"rx_packets": 0,
"tx_bytes": 336,
"tx_dropped": 0,
"tx_errors": 0,
"tx_packets": 4
}
},
{
"OFPPortStats": {
"collisions": 0,
"duration_nsec": 0,
"duration_sec": 0,
"port_no": 6,
"rx_bytes": 336,
"rx_crc_err": 0,
"rx_dropped": 0,
"rx_errors": 0,
"rx_frame_err": 0,
"rx_over_err": 0,
"rx_packets": 4,
"tx_bytes": 336,
(continues on next page)
class ryu.ofproto.ofproto_v1_3_parser.OFPPortDescStatsRequest(datapath,
flags=0,
type_=None)
Port description request message
The controller uses this message to query description of all the ports.
Attribute Description
flags Zero or OFPMPF_REQ_MORE
Example:
req = ofp_parser.OFPPortDescStatsRequest(datapath, 0)
datapath.send_msg(req)
JSON Example:
{
"OFPPortDescStatsRequest": {
"flags": 0,
"type": 13
}
}
class ryu.ofproto.ofproto_v1_3_parser.OFPPortDescStatsReply(datapath,
type_=None,
**kwargs)
Port description reply message
The switch responds with this message to a port description request.
Attribute Description
body List of OFPPort instance
Example:
@set_ev_cls(ofp_event.EventOFPPortDescStatsReply, MAIN_DISPATCHER)
def port_desc_stats_reply_handler(self, ev):
ports = []
for p in ev.msg.body:
ports.append('port_no=%d hw_addr=%s name=%s config=0x%08x '
(continues on next page)
JSON Example:
{
"OFPPortDescStatsReply": {
"body": [
{
"OFPPort": {
"advertised": 10240,
"config": 0,
"curr": 10248,
"curr_speed": 5000,
"hw_addr": "f2:0b:a4:d0:3f:70",
"max_speed": 5000,
"name": "Port7",
"peer": 10248,
"port_no": 7,
"state": 4,
"supported": 10248
}
},
{
"OFPPort": {
"advertised": 10240,
"config": 0,
"curr": 10248,
"curr_speed": 5000,
"hw_addr": "f2:0b:a4:7d:f8:ea",
"max_speed": 5000,
"name": "Port6",
"peer": 10248,
"port_no": 6,
"state": 4,
"supported": 10248
}
}
],
"flags": 0,
"type": 13
}
}
Attribute Description
flags Zero or OFPMPF_REQ_MORE
port_no Port number to read
queue_id ID of queue to read
Example:
def send_queue_stats_request(self, datapath):
ofp = datapath.ofproto
ofp_parser = datapath.ofproto_parser
JSON Example:
{
"OFPQueueStatsRequest": {
"flags": 0,
"port_no": 4294967295,
"queue_id": 4294967295,
"type": 5
}
}
Attribute Description
body List of OFPQueueStats instance
Example:
@set_ev_cls(ofp_event.EventOFPQueueStatsReply, MAIN_DISPATCHER)
def queue_stats_reply_handler(self, ev):
queues = []
for stat in ev.msg.body:
queues.append('port_no=%d queue_id=%d '
'tx_bytes=%d tx_packets=%d tx_errors=%d '
'duration_sec=%d duration_nsec=%d' %
(stat.port_no, stat.queue_id,
stat.tx_bytes, stat.tx_packets, stat.tx_errors,
stat.duration_sec, stat.duration_nsec))
self.logger.debug('QueueStats: %s', queues)
JSON Example:
{
"OFPQueueStatsReply": {
"body": [
(continues on next page)
Attribute Description
flags Zero or OFPMPF_REQ_MORE
group_id ID of group to read (OFPG_ALL to all groups)
Example:
def send_group_stats_request(self, datapath):
ofp = datapath.ofproto
ofp_parser = datapath.ofproto_parser
Attribute Description
body List of OFPGroupStats instance
Example:
@set_ev_cls(ofp_event.EventOFPGroupStatsReply, MAIN_DISPATCHER)
def group_stats_reply_handler(self, ev):
groups = []
for stat in ev.msg.body:
groups.append('length=%d group_id=%d '
'ref_count=%d packet_count=%d byte_count=%d '
'duration_sec=%d duration_nsec=%d' %
(stat.length, stat.group_id,
stat.ref_count, stat.packet_count,
stat.byte_count, stat.duration_sec,
stat.duration_nsec))
self.logger.debug('GroupStats: %s', groups)
class ryu.ofproto.ofproto_v1_3_parser.OFPGroupDescStatsRequest(datapath,
flags=0,
type_=None)
Group description request message
The controller uses this message to list the set of groups on a switch.
Attribute Description
flags Zero or OFPMPF_REQ_MORE
Example:
req = ofp_parser.OFPGroupDescStatsRequest(datapath, 0)
datapath.send_msg(req)
JSON Example:
{
"OFPGroupDescStatsRequest": {
"flags": 0,
"type": 7
}
}
class ryu.ofproto.ofproto_v1_3_parser.OFPGroupDescStatsReply(datapath,
type_=None,
**kwargs)
Group description reply message
The switch responds with this message to a group description request.
Attribute Description
body List of OFPGroupDescStats instance
Example:
@set_ev_cls(ofp_event.EventOFPGroupDescStatsReply, MAIN_DISPATCHER)
def group_desc_stats_reply_handler(self, ev):
descs = []
for stat in ev.msg.body:
descs.append('length=%d type=%d group_id=%d '
'buckets=%s' %
(stat.length, stat.type, stat.group_id,
stat.bucket))
self.logger.debug('GroupDescStats: %s', descs)
JSON Example:
{
"OFPGroupDescStatsReply": {
"body": [
{
"OFPGroupDescStats": {
"buckets": [
{
"OFPBucket": {
"actions": [
{
"OFPActionOutput": {
"len": 16,
"max_len": 65535,
"port": 2,
"type": 0
}
}
],
"len": 32,
"watch_group": 1,
"watch_port": 1,
"weight": 1
}
}
],
"group_id": 1,
"length": 40,
"type": 0
}
}
],
"flags": 0,
"type": 7
(continues on next page)
class ryu.ofproto.ofproto_v1_3_parser.OFPGroupFeaturesStatsRequest(datapath,
flags=0,
type_=None)
Group features request message
The controller uses this message to list the capabilities of groups on a switch.
Attribute Description
flags Zero or OFPMPF_REQ_MORE
Example:
req = ofp_parser.OFPGroupFeaturesStatsRequest(datapath, 0)
datapath.send_msg(req)
JSON Example:
{
"OFPGroupFeaturesStatsRequest": {
"flags": 0,
"type": 8
}
}
class ryu.ofproto.ofproto_v1_3_parser.OFPGroupFeaturesStatsReply(datapath,
type_=None,
**kwargs)
Group features reply message
The switch responds with this message to a group features request.
Attribute Description
body Instance of OFPGroupFeaturesStats
Example:
@set_ev_cls(ofp_event.EventOFPGroupFeaturesStatsReply, MAIN_DISPATCHER)
def group_features_stats_reply_handler(self, ev):
body = ev.msg.body
JSON Example:
{
"OFPGroupFeaturesStatsReply": {
"body": {
"OFPGroupFeaturesStats": {
"actions": [
67082241,
67082241,
67082241,
67082241
],
"capabilities": 5,
"max_groups": [
16777216,
16777216,
16777216,
16777216
],
"types": 15
}
},
"flags": 0,
"type": 8
}
}
Attribute Description
flags Zero or OFPMPF_REQ_MORE
meter_id ID of meter to read (OFPM_ALL to all meters)
Example:
JSON Example:
{
"OFPMeterStatsRequest": {
"flags": 0,
"meter_id": 4294967295,
"type": 9
}
}
Attribute Description
body List of OFPMeterStats instance
Example:
@set_ev_cls(ofp_event.EventOFPMeterStatsReply, MAIN_DISPATCHER)
def meter_stats_reply_handler(self, ev):
meters = []
for stat in ev.msg.body:
meters.append('meter_id=0x%08x len=%d flow_count=%d '
'packet_in_count=%d byte_in_count=%d '
'duration_sec=%d duration_nsec=%d '
'band_stats=%s' %
(stat.meter_id, stat.len, stat.flow_count,
stat.packet_in_count, stat.byte_in_count,
stat.duration_sec, stat.duration_nsec,
stat.band_stats))
self.logger.debug('MeterStats: %s', meters)
JSON Example:
{
"OFPMeterStatsReply": {
"body": [
{
"OFPMeterStats": {
"band_stats": [
{
"OFPMeterBandStats": {
"byte_band_count": 0,
"packet_band_count": 0
}
}
],
"byte_in_count": 0,
"duration_nsec": 480000,
"duration_sec": 0,
"flow_count": 0,
"len": 56,
"meter_id": 100,
"packet_in_count": 0
}
}
],
"flags": 0,
"type": 9
}
}
class ryu.ofproto.ofproto_v1_3_parser.OFPMeterConfigStatsRequest(datapath,
flags=0, me-
ter_id=4294967295,
type_=None)
Meter configuration statistics request message
The controller uses this message to query configuration for one or more meters.
Attribute Description
flags Zero or OFPMPF_REQ_MORE
meter_id ID of meter to read (OFPM_ALL to all meters)
Example:
req = ofp_parser.OFPMeterConfigStatsRequest(datapath, 0,
ofp.OFPM_ALL)
datapath.send_msg(req)
JSON Example:
{
"OFPMeterConfigStatsRequest": {
"flags": 0,
"meter_id": 4294967295,
"type": 10
}
}
class ryu.ofproto.ofproto_v1_3_parser.OFPMeterConfigStatsReply(datapath,
type_=None,
**kwargs)
Meter configuration statistics reply message
The switch responds with this message to a meter configuration statistics request.
Attribute Description
body List of OFPMeterConfigStats instance
Example:
@set_ev_cls(ofp_event.EventOFPMeterConfigStatsReply, MAIN_DISPATCHER)
def meter_config_stats_reply_handler(self, ev):
configs = []
for stat in ev.msg.body:
configs.append('length=%d flags=0x%04x meter_id=0x%08x '
'bands=%s' %
(stat.length, stat.flags, stat.meter_id,
stat.bands))
self.logger.debug('MeterConfigStats: %s', configs)
JSON Example:
{
"OFPMeterConfigStatsReply": {
"body": [
{
"OFPMeterConfigStats": {
"bands": [
(continues on next page)
class ryu.ofproto.ofproto_v1_3_parser.OFPMeterFeaturesStatsRequest(datapath,
flags=0,
type_=None)
Meter features statistics request message
The controller uses this message to query the set of features of the metering subsystem.
Attribute Description
flags Zero or OFPMPF_REQ_MORE
Example:
req = ofp_parser.OFPMeterFeaturesStatsRequest(datapath, 0)
datapath.send_msg(req)
JSON Example:
{
"OFPMeterFeaturesStatsRequest": {
"flags": 0,
"type": 11
}
}
class ryu.ofproto.ofproto_v1_3_parser.OFPMeterFeaturesStatsReply(datapath,
type_=None,
**kwargs)
Meter features statistics reply message
The switch responds with this message to a meter features statistics request.
Attribute Description
body List of OFPMeterFeaturesStats instance
Example:
@set_ev_cls(ofp_event.EventOFPMeterFeaturesStatsReply, MAIN_DISPATCHER)
def meter_features_stats_reply_handler(self, ev):
features = []
for stat in ev.msg.body:
features.append('max_meter=%d band_types=0x%08x '
'capabilities=0x%08x max_bands=%d '
'max_color=%d' %
(stat.max_meter, stat.band_types,
stat.capabilities, stat.max_bands,
stat.max_color))
self.logger.debug('MeterFeaturesStats: %s', features)
JSON Example:
{
"OFPMeterFeaturesStatsReply": {
"body": [
{
"OFPMeterFeaturesStats": {
"band_types": 2147483654,
"capabilities": 15,
"max_bands": 255,
"max_color": 0,
"max_meter": 16777216
}
}
],
"flags": 0,
"type": 11
}
}
class ryu.ofproto.ofproto_v1_3_parser.OFPTableFeaturesStatsRequest(datapath,
flags=0,
body=None,
type_=None)
Table features statistics request message
The controller uses this message to query table features.
Attribute Description
body List of OFPTableFeaturesStats instances. The default is [].
class ryu.ofproto.ofproto_v1_3_parser.OFPTableFeaturesStatsReply(datapath,
type_=None,
**kwargs)
Table features statistics reply message
The switch responds with this message to a table features statistics request.
Attribute Description
body List of OFPTableFeaturesStats instance
JSON Example:
Attribute Description
port Port to be queried (OFPP_ANY to all configured queues)
Example:
JSON Example:
{
"OFPQueueGetConfigRequest": {
"port": 4294967295
}
}
class ryu.ofproto.ofproto_v1_3_parser.OFPQueueGetConfigReply(datapath,
queues=None,
port=None)
Queue configuration reply message
The switch responds with this message to a queue configuration request.
Attribute Description
queues list of OFPPacketQueue instance
port Port which was queried
Example:
@set_ev_cls(ofp_event.EventOFPQueueGetConfigReply, MAIN_DISPATCHER)
def queue_get_config_reply_handler(self, ev):
msg = ev.msg
JSON Example:
{
"OFPQueueGetConfigReply": {
"port": 4294967295,
"queues": [
{
"OFPPacketQueue": {
"len": 64,
"port": 77,
"properties": [
{
"OFPQueuePropMinRate": {
"len": 16,
"property": 1,
"rate": 10
}
},
{
"OFPQueuePropMaxRate": {
"len": 16,
"property": 2,
"rate": 900
}
},
{
"OFPQueuePropExperimenter": {
"data": [],
"experimenter": 999,
"len": 16,
"property": 65535
}
}
],
"queue_id": 99
}
},
{
"OFPPacketQueue": {
"len": 65,
"port": 77,
"properties": [
{
"OFPQueuePropMinRate": {
"len": 16,
"property": 1,
"rate": 100
}
},
{
"OFPQueuePropMaxRate": {
"len": 16,
"property": 2,
"rate": 200
}
},
{
"OFPQueuePropExperimenter": {
"experimenter": 999,
(continues on next page)
Packet-Out Message
The controller uses this message to send a packet out throught the switch.
Attribute Description
buffer_id ID assigned by datapath (OFP_NO_BUFFER if none)
in_port Packet’s input port or OFPP_CONTROLLER
actions list of OpenFlow action class
data Packet data of a binary type value or an instances of packet.Packet.
Example:
JSON Example:
{
"OFPPacketOut": {
"actions": [
{
"OFPActionOutput": {
"len": 16,
"max_len": 65535,
"port": 4294967292,
"type": 0
}
}
],
"actions_len": 16,
"buffer_id": 4294967295,
"data":
˓→"8guk0D9w8gukffjqCABFAABU+BoAAP8Br4sKAAABCgAAAggAAgj3YAAAMdYCAAAAAACrjS0xAAAAABAREhMUFRYXGBkaG
˓→",
"in_port": 4294967293
}
}
Barrier Message
class ryu.ofproto.ofproto_v1_3_parser.OFPBarrierRequest(datapath)
Barrier request message
The controller sends this message to ensure message dependencies have been met or receive notifications for
completed operations.
Example:
JSON Example:
{
"OFPBarrierRequest": {}
}
class ryu.ofproto.ofproto_v1_3_parser.OFPBarrierReply(datapath)
Barrier reply message
The switch responds with this message to a barrier request.
Example:
@set_ev_cls(ofp_event.EventOFPBarrierReply, MAIN_DISPATCHER)
def barrier_reply_handler(self, ev):
self.logger.debug('OFPBarrierReply received')
JSON Example:
{
"OFPBarrierReply": {}
}
Attribute Description
role One of the following values.
OFPCR_ROLE_NOCHANGE
OFPCR_ROLE_EQUAL
OFPCR_ROLE_MASTER
OFPCR_ROLE_SLAVE
Example:
JSON Example:
{
"OFPRoleRequest": {
"generation_id": 17294086455919964160,
"role": 2
}
}
Attribute Description
role One of the following values.
OFPCR_ROLE_NOCHANGE
OFPCR_ROLE_EQUAL
OFPCR_ROLE_MASTER
OFPCR_ROLE_SLAVE
Example:
@set_ev_cls(ofp_event.EventOFPRoleReply, MAIN_DISPATCHER)
def role_reply_handler(self, ev):
msg = ev.msg
dp = msg.datapath
ofp = dp.ofproto
if msg.role == ofp.OFPCR_ROLE_NOCHANGE:
role = 'NOCHANGE'
elif msg.role == ofp.OFPCR_ROLE_EQUAL:
role = 'EQUAL'
elif msg.role == ofp.OFPCR_ROLE_MASTER:
role = 'MASTER'
elif msg.role == ofp.OFPCR_ROLE_SLAVE:
role = 'SLAVE'
else:
role = 'unknown'
JSON Example:
{
"OFPRoleReply": {
"generation_id": 17294086455919964160,
"role": 3
}
}
Attribute Description
packet_in_mask 2-element array: element 0, when the con-
troller has a OFPCR_ROLE_EQUAL or OF-
PCR_ROLE_MASTER role. element 1, OF-
PCR_ROLE_SLAVE role controller. Bitmasks of
following values.
OFPR_NO_MATCH
OFPR_ACTION
OFPR_INVALID_TTL
OFPPR_ADD
OFPPR_DELETE
OFPPR_MODIFY
OFPRR_IDLE_TIMEOUT
OFPRR_HARD_TIMEOUT
OFPRR_DELETE
OFPRR_GROUP_DELETE
Example:
JSON Example:
{
"OFPSetAsync": {
"flow_removed_mask": [
15,
3
],
"packet_in_mask": [
5,
1
],
"port_status_mask": [
7,
3
]
}
}
class ryu.ofproto.ofproto_v1_3_parser.OFPGetAsyncRequest(datapath)
Get asynchronous configuration request message
The controller uses this message to query the asynchronous message.
Example:
req = ofp_parser.OFPGetAsyncRequest(datapath)
datapath.send_msg(req)
JSON Example:
{
"OFPGetAsyncRequest": {}
}
class ryu.ofproto.ofproto_v1_3_parser.OFPGetAsyncReply(datapath,
packet_in_mask=None,
port_status_mask=None,
flow_removed_mask=None)
Get asynchronous configuration reply message
The switch responds with this message to a get asynchronous configuration request.
Attribute Description
packet_in_mask 2-element array: element 0, when the con-
troller has a OFPCR_ROLE_EQUAL or OF-
PCR_ROLE_MASTER role. element 1, OF-
PCR_ROLE_SLAVE role controller. Bitmasks of
following values.
OFPR_NO_MATCH
OFPR_ACTION
OFPR_INVALID_TTL
OFPPR_ADD
OFPPR_DELETE
OFPPR_MODIFY
OFPRR_IDLE_TIMEOUT
OFPRR_HARD_TIMEOUT
OFPRR_DELETE
OFPRR_GROUP_DELETE
Example:
@set_ev_cls(ofp_event.EventOFPGetAsyncReply, MAIN_DISPATCHER)
def get_async_reply_handler(self, ev):
msg = ev.msg
JSON Example:
{
"OFPGetAsyncReply": {
"flow_removed_mask": [
15,
3
],
"packet_in_mask": [
5,
1
(continues on next page)
Asynchronous Messages
Packet-In Message
Attribute Description
buffer_id ID assigned by datapath
total_len Full length of frame
reason Reason packet is being sent.
OFPR_NO_MATCH
OFPR_ACTION
OFPR_INVALID_TTL
Example:
@set_ev_cls(ofp_event.EventOFPPacketIn, MAIN_DISPATCHER)
def packet_in_handler(self, ev):
msg = ev.msg
dp = msg.datapath
ofp = dp.ofproto
if msg.reason == ofp.OFPR_NO_MATCH:
reason = 'NO MATCH'
elif msg.reason == ofp.OFPR_ACTION:
reason = 'ACTION'
elif msg.reason == ofp.OFPR_INVALID_TTL:
reason = 'INVALID TTL'
else:
reason = 'unknown'
JSON Example:
{
"OFPPacketIn": {
"buffer_id": 2,
"cookie": 283686884868096,
"data": "////////8gukffjqCAYAAQgABgQAAfILpH346goAAAEAAAAAAAAKAAAD",
"match": {
"OFPMatch": {
"length": 80,
"oxm_fields": [
{
"OXMTlv": {
"field": "in_port",
"mask": null,
"value": 6
}
},
{
"OXMTlv": {
"field": "eth_type",
"mask": null,
"value": 2054
}
},
{
"OXMTlv": {
"field": "eth_dst",
"mask": null,
"value": "ff:ff:ff:ff:ff:ff"
}
},
{
"OXMTlv": {
"field": "eth_src",
"mask": null,
"value": "f2:0b:a4:7d:f8:ea"
}
},
{
"OXMTlv": {
"field": "arp_op",
"mask": null,
"value": 1
}
},
{
"OXMTlv": {
"field": "arp_spa",
"mask": null,
"value": "10.0.0.1"
(continues on next page)
Attribute Description
cookie Opaque controller-issued identifier
priority Priority level of flow entry
reason One of the following values.
OFPRR_IDLE_TIMEOUT
OFPRR_HARD_TIMEOUT
OFPRR_DELETE
OFPRR_GROUP_DELETE
Example:
@set_ev_cls(ofp_event.EventOFPFlowRemoved, MAIN_DISPATCHER)
def flow_removed_handler(self, ev):
msg = ev.msg
dp = msg.datapath
ofp = dp.ofproto
if msg.reason == ofp.OFPRR_IDLE_TIMEOUT:
reason = 'IDLE TIMEOUT'
elif msg.reason == ofp.OFPRR_HARD_TIMEOUT:
reason = 'HARD TIMEOUT'
elif msg.reason == ofp.OFPRR_DELETE:
reason = 'DELETE'
elif msg.reason == ofp.OFPRR_GROUP_DELETE:
reason = 'GROUP DELETE'
else:
reason = 'unknown'
JSON Example:
{
"OFPFlowRemoved": {
"byte_count": 86,
(continues on next page)
Attribute Description
reason One of the following values.
OFPPR_ADD
OFPPR_DELETE
OFPPR_MODIFY
Example:
@set_ev_cls(ofp_event.EventOFPPortStatus, MAIN_DISPATCHER)
def port_status_handler(self, ev):
msg = ev.msg
dp = msg.datapath
ofp = dp.ofproto
if msg.reason == ofp.OFPPR_ADD:
(continues on next page)
JSON Example:
{
"OFPPortStatus": {
"desc": {
"OFPPort": {
"advertised": 10240,
"config": 0,
"curr": 10248,
"curr_speed": 5000,
"hw_addr": "f2:0b:a4:d0:3f:70",
"max_speed": 5000,
"name": "\u79c1\u306e\u30dd\u30fc\u30c8",
"peer": 10248,
"port_no": 7,
"state": 4,
"supported": 10248
}
},
"reason": 0
}
}
Error Message
Attribute Description
type High level type of error
code Details depending on the type
data Variable length data depending on the type and code
Type Code
OFPET_HELLO_FAILED OFPHFC_*
OFPET_BAD_REQUEST OFPBRC_*
OFPET_BAD_ACTION OFPBAC_*
OFPET_BAD_INSTRUCTION OFPBIC_*
OFPET_BAD_MATCH OFPBMC_*
OFPET_FLOW_MOD_FAILED OFPFMFC_*
OFPET_GROUP_MOD_FAILED OFPGMFC_*
OFPET_PORT_MOD_FAILED OFPPMFC_*
OFPET_TABLE_MOD_FAILED OFPTMFC_*
OFPET_QUEUE_OP_FAILED OFPQOFC_*
OFPET_SWITCH_CONFIG_FAILED OFPSCFC_*
OFPET_ROLE_REQUEST_FAILED OFPRRFC_*
OFPET_METER_MOD_FAILED OFPMMFC_*
OFPET_TABLE_FEATURES_FAILED OFPTFFC_*
OFPET_EXPERIMENTER N/A
Attribute Description
exp_type Experimenter defined type
experimenter Experimenter ID
Example:
@set_ev_cls(ofp_event.EventOFPErrorMsg,
[HANDSHAKE_DISPATCHER, CONFIG_DISPATCHER, MAIN_DISPATCHER])
def error_msg_handler(self, ev):
msg = ev.msg
JSON Example:
{
"OFPErrorMsg": {
"code": 11,
"data": "ZnVnYWZ1Z2E=",
"type": 2
}
}
Symmetric Messages
Hello
This message is handled by the Ryu framework, so the Ryu application do not need to process this typically.
Attribute Description
elements list of OFPHelloElemVersionBitmap instance
JSON Example:
{
"OFPHello": {
"elements": [
{
"OFPHelloElemVersionBitmap": {
"length": 8,
"type": 1,
"versions": [
1,
2,
3,
9,
10,
30
]
}
}
]
}
}
class ryu.ofproto.ofproto_v1_3_parser.OFPHelloElemVersionBitmap(versions,
type_=None,
length=None)
Version bitmap Hello Element
Attribute Description
versions list of versions of OpenFlow protocol a device supports
Echo Request
Attribute Description
data An arbitrary length data
Example:
def send_echo_request(self, datapath, data):
ofp_parser = datapath.ofproto_parser
JSON Example:
{
"OFPEchoRequest": {
"data": "aG9nZQ=="
}
}
Echo Reply
Attribute Description
data An arbitrary length data
Example:
@set_ev_cls(ofp_event.EventOFPEchoReply,
[HANDSHAKE_DISPATCHER, CONFIG_DISPATCHER, MAIN_DISPATCHER])
def echo_reply_handler(self, ev):
self.logger.debug('OFPEchoReply received: data=%s',
utils.hex_array(ev.msg.data))
JSON Example:
{
"OFPEchoReply": {
"data": "aG9nZQ=="
}
}
Experimenter
Attribute Description
experimenter Experimenter ID
exp_type Experimenter defined
data Experimenter defined arbitrary additional data
JSON Example:
{
"OFPExperimenter": {
"data": "bmF6bw==",
"exp_type": 123456789,
"experimenter": 98765432
}
}
Port Structures
class ryu.ofproto.ofproto_v1_3_parser.OFPPort
Description of a port
Attribute Description
port_no Port number and it uniquely identifies a port within a
switch.
hw_addr MAC address for the port.
name Null-terminated string containing a human-readable
name for the interface.
config Bitmap of port configration flags.
OFPPC_PORT_DOWN
OFPPC_NO_RECV
OFPPC_NO_FWD
OFPPC_NO_PACKET_IN
OFPPS_LINK_DOWN
OFPPS_BLOCKED
OFPPS_LIVE
This class is implementation of the flow match structure having compose/query API. There are new API and old
API for compatibility. the old API is supposed to be removed later.
You can define the flow match by the keyword arguments. The following arguments are available.
Example:
>>> # compose
>>> match = parser.OFPMatch(
... in_port=1,
... eth_type=0x86dd,
... ipv6_src=('2001:db8:bd05:1d2:288a:1fc0:1:10ee',
... 'ffff:ffff:ffff:ffff::'),
... ipv6_dst='2001:db8:bd05:1d2:288a:1fc0:1:10ee')
>>> # query
>>> if 'ipv6_src' in match:
... print match['ipv6_src']
...
('2001:db8:bd05:1d2:288a:1fc0:1:10ee', 'ffff:ffff:ffff:ffff::')
Note: For the list of the supported Nicira experimenter matches, please refer to ryu.ofproto.nx_match.
Note: For VLAN id match field, special values are defined in OpenFlow Spec.
1) Packets with and without a VLAN tag
• Example:
match = parser.OFPMatch()
• Packet Matching
non-VLAN-tagged MATCH
VLAN-tagged(vlan_id=3) MATCH
VLAN-tagged(vlan_id=5) MATCH
match = parser.OFPMatch(vlan_vid=0x0000)
• Packet Matching
non-VLAN-tagged MATCH
VLAN-tagged(vlan_id=3) x
VLAN-tagged(vlan_id=5) x
• Packet Matching
non-VLAN-tagged x
VLAN-tagged(vlan_id=3) MATCH
VLAN-tagged(vlan_id=5) MATCH
• Packet Matching
non-VLAN-tagged x
VLAN-tagged(vlan_id=3) MATCH
VLAN-tagged(vlan_id=5) x
class ryu.ofproto.ofproto_v1_3_parser.OFPInstructionGotoTable(table_id,
type_=None,
len_=None)
Goto table instruction
This instruction indicates the next table in the processing pipeline.
Attribute Description
table_id Next table
class ryu.ofproto.ofproto_v1_3_parser.OFPInstructionWriteMetadata(metadata,
meta-
data_mask,
type_=None,
len_=None)
Write metadata instruction
This instruction writes the masked metadata value into the metadata field.
Attribute Description
metadata Metadata value to write
metadata_mask Metadata write bitmask
Attribute Description
type One of following values.
OFPIT_WRITE_ACTIONS
OFPIT_APPLY_ACTIONS
OFPIT_CLEAR_ACTIONS
Attribute Description
meter_id Meter instance
Action Structures
Attribute Description
port Output port
max_len Max length to send to controller
Attribute Description
group_id Group identifier
Attribute Description
queue_id Queue ID for the packets
Attribute Description
mpls_ttl MPLS TTL
class ryu.ofproto.ofproto_v1_3_parser.OFPActionDecMplsTtl(type_=None,
len_=None)
Decrement MPLS TTL action
This action decrements the MPLS TTL.
Attribute Description
nw_ttl IP TTL
Attribute Description
ethertype Ether type. The default is 802.1Q. (0x8100)
class ryu.ofproto.ofproto_v1_3_parser.OFPActionPushMpls(ethertype=34887,
type_=None, len_=None)
Push MPLS action
This action pushes a new MPLS header to the packet.
Attribute Description
ethertype Ether type
Example:
set_field = OFPActionSetField(eth_src="00:00:00:00:00:00")
class ryu.ofproto.ofproto_v1_3_parser.OFPActionExperimenter(experimenter)
Experimenter action
This action is an extensible action for the experimenter.
Attribute Description
experimenter Experimenter ID
Note: For the list of the supported Nicira experimenter actions, please refer to ryu.ofproto.nx_actions.
Controller-to-Switch Messages
Handshake
class ryu.ofproto.ofproto_v1_4_parser.OFPFeaturesRequest(datapath)
Features request message
The controller sends a feature request to the switch upon session establishment.
This message is handled by the Ryu framework, so the Ryu application do not need to process this typically.
Example:
req = ofp_parser.OFPFeaturesRequest(datapath)
datapath.send_msg(req)
JSON Example:
{
"OFPFeaturesRequest": {}
}
@set_ev_cls(ofp_event.EventOFPSwitchFeatures, CONFIG_DISPATCHER)
def switch_features_handler(self, ev):
msg = ev.msg
JSON Example:
{
"OFPSwitchFeatures": {
"auxiliary_id": 99,
"capabilities": 79,
"datapath_id": 9210263729383,
"n_buffers": 0,
"n_tables": 255
}
}
Switch Configuration
Attribute Description
flags Bitmap of the following flags.
OFPC_FRAG_NORMAL
OFPC_FRAG_DROP
OFPC_FRAG_REASM
Example:
def send_set_config(self, datapath):
ofp = datapath.ofproto
ofp_parser = datapath.ofproto_parser
JSON Example:
{
"OFPSetConfig": {
(continues on next page)
class ryu.ofproto.ofproto_v1_4_parser.OFPGetConfigRequest(datapath)
Get config request message
The controller sends a get config request to query configuration parameters in the switch.
Example:
def send_get_config_request(self, datapath):
ofp_parser = datapath.ofproto_parser
req = ofp_parser.OFPGetConfigRequest(datapath)
datapath.send_msg(req)
JSON Example:
{
"OFPGetConfigRequest": {}
}
Attribute Description
flags Bitmap of the following flags.
OFPC_FRAG_NORMAL
OFPC_FRAG_DROP
OFPC_FRAG_REASM
Example:
@set_ev_cls(ofp_event.EventOFPGetConfigReply, MAIN_DISPATCHER)
def get_config_reply_handler(self, ev):
msg = ev.msg
dp = msg.datapath
ofp = dp.ofproto
flags = []
JSON Example:
{
"OFPGetConfigReply": {
"flags": 0,
"miss_send_len": 128
}
}
Attribute Description
table_id ID of the table (OFPTT_ALL indicates all tables)
config Bitmap of configuration flags.
OFPTC_EVICTION
OFPTC_VACANCY_EVENTS
Example:
req = ofp_parser.OFPTableMod(datapath, 1, 3)
flags = ofp.OFPTC_VACANCY_EVENTS
properties = [ofp_parser.OFPTableModPropEviction(flags)]
req = ofp_parser.OFPTableMod(datapath, 1, 3, properties)
datapath.send_msg(req)
JSON Example:
{
"OFPTableMod": {
"config": 0,
"properties": [
{
"OFPTableModPropEviction": {
"flags": 0,
"length": 8,
"type": 2
}
(continues on next page)
Attribute Description
cookie Opaque controller-issued identifier
cookie_mask Mask used to restrict the cookie bits that must
match when the command is OPFFC_MODIFY* or
OFPFC_DELETE*
table_id ID of the table to put the flow in
command One of the following values.
OFPFC_ADD
OFPFC_MODIFY
OFPFC_MODIFY_STRICT
OFPFC_DELETE
OFPFC_DELETE_STRICT
OFPFF_SEND_FLOW_REM
OFPFF_CHECK_OVERLAP
OFPFF_RESET_COUNTS
OFPFF_NO_PKT_COUNTS
OFPFF_NO_BYT_COUNTS
Example:
cookie = cookie_mask = 0
table_id = 0
idle_timeout = hard_timeout = 0
priority = 32768
buffer_id = ofp.OFP_NO_BUFFER
importance = 0
match = ofp_parser.OFPMatch(in_port=1, eth_dst='ff:ff:ff:ff:ff:ff')
actions = [ofp_parser.OFPActionOutput(ofp.OFPP_NORMAL, 0)]
inst = [ofp_parser.OFPInstructionActions(ofp.OFPIT_APPLY_ACTIONS,
actions)]
(continues on next page)
JSON Example:
{
"OFPFlowMod": {
"buffer_id": 65535,
"command": 0,
"cookie": 0,
"cookie_mask": 0,
"flags": 0,
"hard_timeout": 0,
"idle_timeout": 0,
"importance": 0,
"instructions": [
{
"OFPInstructionActions": {
"actions": [
{
"OFPActionSetField": {
"field": {
"OXMTlv": {
"field": "vlan_vid",
"mask": null,
"value": 258
}
},
"len": 16,
"type": 25
}
},
{
"OFPActionCopyTtlOut": {
"len": 8,
"type": 11
}
},
{
"OFPActionCopyTtlIn": {
"len": 8,
"type": 12
}
},
{
"OFPActionCopyTtlIn": {
"len": 8,
"type": 12
}
},
(continues on next page)
{
"OFPFlowMod": {
"buffer_id": 65535,
"command": 0,
"cookie": 0,
"cookie_mask": 0,
"flags": 0,
"hard_timeout": 0,
"idle_timeout": 0,
"importance": 0,
"instructions": [
{
(continues on next page)
{
"OFPFlowMod": {
"buffer_id": 65535,
"command": 0,
"cookie": 0,
"cookie_mask": 0,
"flags": 0,
"hard_timeout": 0,
"idle_timeout": 0,
"importance": 0,
"instructions": [
{
"OFPInstructionMeter": {
"len": 8,
"meter_id": 1,
"type": 6
}
},
{
"OFPInstructionActions": {
(continues on next page)
{
"OFPFlowMod": {
"buffer_id": 65535,
"command": 0,
"cookie": 0,
"cookie_mask": 0,
"flags": 0,
"hard_timeout": 0,
"idle_timeout": 0,
"importance": 0,
"instructions": [],
"match": {
"OFPMatch": {
"length": 329,
"oxm_fields": [
{
"OXMTlv": {
"field": "in_port",
"mask": null,
(continues on next page)
Attribute Description
command One of the following values.
OFPGC_ADD
OFPGC_MODIFY
OFPGC_DELETE
OFPGT_ALL
OFPGT_SELECT
OFPGT_INDIRECT
OFPGT_FF
port = 1
max_len = 2000
actions = [ofp_parser.OFPActionOutput(port, max_len)]
weight = 100
watch_port = 0
watch_group = 0
buckets = [ofp_parser.OFPBucket(weight, watch_port, watch_group,
actions)]
group_id = 1
req = ofp_parser.OFPGroupMod(datapath, ofp.OFPGC_ADD,
ofp.OFPGT_SELECT, group_id, buckets)
datapath.send_msg(req)
JSON Example:
{
"OFPGroupMod": {
"buckets": [
{
(continues on next page)
Attribute Description
port_no Port number to modify
hw_addr The hardware address that must be the same as
hw_addr of OFPPort of OFPSwitchFeatures
config Bitmap of configuration flags.
OFPPC_PORT_DOWN
OFPPC_NO_RECV
OFPPC_NO_FWD
OFPPC_NO_PACKET_IN
Example:
port_no = 3
hw_addr = 'fa:c8:e8:76:1d:7e'
config = 0
(continues on next page)
JSON Example:
{
"OFPPortMod": {
"config": 0,
"hw_addr": "00:11:00:00:11:11",
"mask": 0,
"port_no": 1,
"properties": [
{
"OFPPortModPropEthernet": {
"advertise": 4096,
"length": 8,
"type": 0
}
},
{
"OFPPortModPropOptical": {
"configure": 3,
"fl_offset": 2000,
"freq_lmda": 1500,
"grid_span": 3000,
"length": 24,
"tx_pwr": 300,
"type": 1
}
},
{
"OFPPortModPropExperimenter": {
"data": [],
"exp_type": 0,
"experimenter": 101,
"length": 12,
"type": 65535
}
},
{
"OFPPortModPropExperimenter": {
"data": [
1
],
"exp_type": 1,
"experimenter": 101,
"length": 16,
"type": 65535
}
(continues on next page)
Attribute Description
command One of the following values.
OFPMC_ADD
OFPMC_MODIFY
OFPMC_DELETE
OFPMF_KBPS
OFPMF_PKTPS
OFPMF_BURST
OFPMF_STATS
OFPMeterBandDrop
OFPMeterBandDscpRemark
OFPMeterBandExperimenter
JSON Example:
{
"OFPMeterMod": {
"bands": [
{
"OFPMeterBandDrop": {
"burst_size": 10,
(continues on next page)
Multipart Messages
Attribute Description
flags Zero or OFPMPF_REQ_MORE
Example:
req = ofp_parser.OFPDescStatsRequest(datapath, 0)
datapath.send_msg(req)
JSON Example:
{
"OFPDescStatsRequest": {
"flags": 0,
(continues on next page)
Attribute Description
body Instance of OFPDescStats
Example:
@set_ev_cls(ofp_event.EventOFPDescStatsReply, MAIN_DISPATCHER)
def desc_stats_reply_handler(self, ev):
body = ev.msg.body
JSON Example:
{
"OFPDescStatsReply": {
"body": {
"OFPDescStats": {
"dp_desc": "dp",
"hw_desc": "hw",
"mfr_desc": "mfr",
"serial_num": "serial",
"sw_desc": "sw"
}
},
"flags": 0,
"type": 0
}
}
Attribute Description
flags Zero or OFPMPF_REQ_MORE
table_id ID of table to read
out_port Require matching entries to include this as an output port
out_group Require matching entries to include this as an output group
cookie Require matching entries to contain this cookie value
cookie_mask Mask used to restrict the cookie bits that must match
match Instance of OFPMatch
Example:
cookie = cookie_mask = 0
match = ofp_parser.OFPMatch(in_port=1)
req = ofp_parser.OFPFlowStatsRequest(datapath, 0,
ofp.OFPTT_ALL,
ofp.OFPP_ANY, ofp.OFPG_ANY,
cookie, cookie_mask,
match)
datapath.send_msg(req)
JSON Example:
{
"OFPFlowStatsRequest": {
"cookie": 0,
"cookie_mask": 0,
"flags": 0,
"match": {
"OFPMatch": {
"length": 4,
"oxm_fields": [],
"type": 1
}
},
"out_group": 4294967295,
"out_port": 4294967295,
"table_id": 0,
"type": 1
}
}
Attribute Description
body List of OFPFlowStats instance
Example:
@set_ev_cls(ofp_event.EventOFPFlowStatsReply, MAIN_DISPATCHER)
def flow_stats_reply_handler(self, ev):
flows = []
for stat in ev.msg.body:
flows.append('table_id=%s '
'duration_sec=%d duration_nsec=%d '
'priority=%d '
'idle_timeout=%d hard_timeout=%d flags=0x%04x '
'importance=%d cookie=%d packet_count=%d '
'byte_count=%d match=%s instructions=%s' %
(stat.table_id,
stat.duration_sec, stat.duration_nsec,
stat.priority,
stat.idle_timeout, stat.hard_timeout,
stat.flags, stat.importance,
stat.cookie, stat.packet_count, stat.byte_count,
stat.match, stat.instructions))
self.logger.debug('FlowStats: %s', flows)
JSON Example:
{
"OFPFlowStatsReply": {
"body": [
{
"OFPFlowStats": {
"byte_count": 0,
"cookie": 0,
"duration_nsec": 115277000,
"duration_sec": 358,
"flags": 0,
"hard_timeout": 0,
"idle_timeout": 0,
"importance": 0,
"instructions": [],
"length": 56,
"match": {
"OFPMatch": {
"length": 4,
"oxm_fields": [],
"type": 1
}
},
"packet_count": 0,
"priority": 65535,
"table_id": 0
}
},
{
"OFPFlowStats": {
"byte_count": 0,
"cookie": 0,
"duration_nsec": 115055000,
"duration_sec": 358,
"flags": 0,
"hard_timeout": 0,
"idle_timeout": 0,
(continues on next page)
class ryu.ofproto.ofproto_v1_4_parser.OFPAggregateStatsRequest(datapath,
flags, table_id,
out_port,
out_group,
cookie,
cookie_mask,
match,
type_=None)
Aggregate flow statistics request message
The controller uses this message to query aggregate flow statictics.
Attribute Description
flags Zero or OFPMPF_REQ_MORE
table_id ID of table to read
out_port Require matching entries to include this as an output port
out_group Require matching entries to include this as an output group
cookie Require matching entries to contain this cookie value
cookie_mask Mask used to restrict the cookie bits that must match
match Instance of OFPMatch
Example:
def send_aggregate_stats_request(self, datapath):
ofp = datapath.ofproto
ofp_parser = datapath.ofproto_parser
cookie = cookie_mask = 0
(continues on next page)
JSON Example:
{
"OFPAggregateStatsRequest": {
"cookie": 0,
"cookie_mask": 0,
"flags": 0,
"match": {
"OFPMatch": {
"length": 4,
"oxm_fields": [],
"type": 1
}
},
"out_group": 4294967295,
"out_port": 4294967295,
"table_id": 255,
"type": 2
}
}
class ryu.ofproto.ofproto_v1_4_parser.OFPAggregateStatsReply(datapath,
type_=None,
**kwargs)
Aggregate flow statistics reply message
The switch responds with this message to an aggregate flow statistics request.
Attribute Description
body Instance of OFPAggregateStats
Example:
@set_ev_cls(ofp_event.EventOFPAggregateStatsReply, MAIN_DISPATCHER)
def aggregate_stats_reply_handler(self, ev):
body = ev.msg.body
JSON Example:
{
"OFPAggregateStatsReply": {
"body": {
(continues on next page)
Attribute Description
flags Zero or OFPMPF_REQ_MORE
Example:
req = ofp_parser.OFPTableStatsRequest(datapath, 0)
datapath.send_msg(req)
JSON Example:
{
"OFPTableStatsRequest": {
"flags": 0,
"type": 3
}
}
Attribute Description
body List of OFPTableStats instance
Example:
@set_ev_cls(ofp_event.EventOFPTableStatsReply, MAIN_DISPATCHER)
def table_stats_reply_handler(self, ev):
tables = []
for stat in ev.msg.body:
tables.append('table_id=%d active_count=%d lookup_count=%d '
' matched_count=%d' %
(stat.table_id, stat.active_count,
(continues on next page)
JSON Example:
{
"OFPTableStatsReply": {
"body": [
{
"OFPTableStats": {
"active_count": 4,
"lookup_count": 4,
"matched_count": 4,
"table_id": 0
}
},
{
"OFPTableStats": {
"active_count": 4,
"lookup_count": 4,
"matched_count": 4,
"table_id": 1
}
}
],
"flags": 0,
"type": 3
}
}
class ryu.ofproto.ofproto_v1_4_parser.OFPTableDescStatsRequest(datapath,
flags=0,
type_=None)
Table description request message
The controller uses this message to query description of all the tables.
Attribute Description
flags Zero or OFPMPF_REQ_MORE
Example:
req = ofp_parser.OFPTableDescStatsRequest(datapath, 0)
datapath.send_msg(req)
JSON Example:
{
"OFPTableDescStatsRequest": {
"flags": 0,
"type": 14
}
}
class ryu.ofproto.ofproto_v1_4_parser.OFPTableDescStatsReply(datapath,
type_=None,
**kwargs)
Table description reply message
The switch responds with this message to a table description request.
Attribute Description
body List of OFPTableDesc instance
Example:
@set_ev_cls(ofp_event.EventOFPTableDescStatsReply, MAIN_DISPATCHER)
def table_desc_stats_reply_handler(self, ev):
tables = []
for p in ev.msg.body:
tables.append('table_id=%d config=0x%08x properties=%s' %
(p.table_id, p.config, repr(p.properties)))
self.logger.debug('OFPTableDescStatsReply received: %s', tables)
JSON Example:
{
"OFPTableDescStatsReply": {
"body": [
{
"OFPTableDesc": {
"config": 0,
"length": 24,
"properties": [
{
"OFPTableModPropExperimenter": {
"data": [],
"exp_type": 0,
"experimenter": 101,
"length": 12,
"type": 65535
}
}
],
"table_id": 7
}
},
{
"OFPTableDesc": {
"config": 0,
"length": 80,
"properties": [
{
"OFPTableModPropEviction": {
"flags": 0,
"length": 8,
"type": 2
}
},
{
"OFPTableModPropVacancy": {
(continues on next page)
class ryu.ofproto.ofproto_v1_4_parser.OFPTableFeaturesStatsRequest(datapath,
flags=0,
body=None,
type_=None)
Table features statistics request message
The controller uses this message to query table features.
Attribute Description
body List of OFPTableFeaturesStats instances. The default is [].
JSON Example:
See an example in:
ryu/tests/unit/ofproto/json/of14/5-53-ofp_table_features_request.
packet.json
class ryu.ofproto.ofproto_v1_4_parser.OFPTableFeaturesStatsReply(datapath,
type_=None,
**kwargs)
Table features statistics reply message
The switch responds with this message to a table features statistics request.
Attribute Description
body List of OFPTableFeaturesStats instance
JSON Example:
See an example in:
ryu/tests/unit/ofproto/json/of14/5-54-ofp_table_features_reply.
packet.json
class ryu.ofproto.ofproto_v1_4_parser.OFPPortStatsRequest(datapath, flags,
port_no, type_=None)
Port statistics request message
The controller uses this message to query information about ports statistics.
Attribute Description
flags Zero or OFPMPF_REQ_MORE
port_no Port number to read (OFPP_ANY to all ports)
Example:
JSON Example:
{
"OFPPortStatsRequest": {
"flags": 0,
"port_no": 4294967295,
"type": 4
}
}
Attribute Description
body List of OFPPortStats instance
Example:
@set_ev_cls(ofp_event.EventOFPPortStatsReply, MAIN_DISPATCHER)
def port_stats_reply_handler(self, ev):
ports = []
for stat in ev.msg.body:
ports.append(stat.length, stat.port_no,
stat.duration_sec, stat.duration_nsec,
stat.rx_packets, stat.tx_packets,
stat.rx_bytes, stat.tx_bytes,
stat.rx_dropped, stat.tx_dropped,
stat.rx_errors, stat.tx_errors,
repr(stat.properties))
self.logger.debug('PortStats: %s', ports)
JSON Example:
{
"OFPPortStatsReply": {
"body": [
{
"OFPPortStats": {
"duration_nsec": 0,
"duration_sec": 0,
"length": 224,
"port_no": 7,
"properties": [
{
"OFPPortStatsPropEthernet": {
"collisions": 0,
"length": 40,
"rx_crc_err": 0,
"rx_frame_err": 0,
"rx_over_err": 0,
"type": 0
}
},
{
"OFPPortStatsPropOptical": {
"bias_current": 300,
"flags": 3,
"length": 44,
"rx_freq_lmda": 1500,
"rx_grid_span": 500,
"rx_offset": 700,
"rx_pwr": 2000,
"temperature": 273,
"tx_freq_lmda": 1500,
(continues on next page)
class ryu.ofproto.ofproto_v1_4_parser.OFPPortDescStatsRequest(datapath,
flags=0,
type_=None)
Port description request message
The controller uses this message to query description of all the ports.
Attribute Description
flags Zero or OFPMPF_REQ_MORE
Example:
def send_port_desc_stats_request(self, datapath):
ofp_parser = datapath.ofproto_parser
req = ofp_parser.OFPPortDescStatsRequest(datapath, 0)
datapath.send_msg(req)
JSON Example:
{
"OFPPortDescStatsRequest": {
"flags": 0,
"type": 13
}
}
class ryu.ofproto.ofproto_v1_4_parser.OFPPortDescStatsReply(datapath,
type_=None,
**kwargs)
Port description reply message
Attribute Description
body List of OFPPort instance
Example:
@set_ev_cls(ofp_event.EventOFPPortDescStatsReply, MAIN_DISPATCHER)
def port_desc_stats_reply_handler(self, ev):
ports = []
for p in ev.msg.body:
ports.append('port_no=%d hw_addr=%s name=%s config=0x%08x '
'state=0x%08x properties=%s' %
(p.port_no, p.hw_addr,
p.name, p.config, p.state, repr(p.properties)))
self.logger.debug('OFPPortDescStatsReply received: %s', ports)
JSON Example:
{
"OFPPortDescStatsReply": {
"body": [
{
"OFPPort": {
"config": 0,
"hw_addr": "f2:0b:a4:d0:3f:70",
"length": 168,
"name": "Port7",
"port_no": 7,
"properties": [
{
"OFPPortDescPropEthernet": {
"advertised": 10240,
"curr": 10248,
"curr_speed": 5000,
"length": 32,
"max_speed": 5000,
"peer": 10248,
"supported": 10248,
"type": 0
}
},
{
"OFPPortDescPropOptical": {
"length": 40,
"rx_grid_freq_lmda": 1500,
"rx_max_freq_lmda": 2000,
"rx_min_freq_lmda": 1000,
"supported": 1,
"tx_grid_freq_lmda": 1500,
"tx_max_freq_lmda": 2000,
"tx_min_freq_lmda": 1000,
"tx_pwr_max": 2000,
"tx_pwr_min": 1000,
"type": 1
}
},
(continues on next page)
Attribute Description
flags Zero or OFPMPF_REQ_MORE
port_no Port number to read
queue_id ID of queue to read
Example:
JSON Example:
{
"OFPQueueStatsRequest": {
"flags": 0,
"port_no": 4294967295,
"queue_id": 4294967295,
"type": 5
}
}
Attribute Description
body List of OFPQueueStats instance
Example:
@set_ev_cls(ofp_event.EventOFPQueueStatsReply, MAIN_DISPATCHER)
def queue_stats_reply_handler(self, ev):
queues = []
for stat in ev.msg.body:
queues.append('port_no=%d queue_id=%d '
'tx_bytes=%d tx_packets=%d tx_errors=%d '
'duration_sec=%d duration_nsec=%d'
'properties=%s' %
(stat.port_no, stat.queue_id,
stat.tx_bytes, stat.tx_packets, stat.tx_errors,
stat.duration_sec, stat.duration_nsec,
repr(stat.properties)))
self.logger.debug('QueueStats: %s', queues)
JSON Example:
{
"OFPQueueStatsReply": {
"body": [
{
"OFPQueueStats": {
"duration_nsec": 0,
"duration_sec": 0,
"length": 104,
"port_no": 7,
"properties": [
{
"OFPQueueStatsPropExperimenter": {
"data": [],
"exp_type": 0,
"experimenter": 101,
"length": 12,
"type": 65535
}
},
{
"OFPQueueStatsPropExperimenter": {
"data": [
1
],
"exp_type": 1,
"experimenter": 101,
"length": 16,
"type": 65535
}
},
{
"OFPQueueStatsPropExperimenter": {
"data": [
1,
2
],
"exp_type": 2,
"experimenter": 101,
"length": 20,
"type": 65535
}
(continues on next page)
class ryu.ofproto.ofproto_v1_4_parser.OFPQueueDescStatsRequest(datapath,
flags=0,
port_no=4294967295,
queue_id=4294967295,
type_=None)
Queue description request message
The controller uses this message to query description of all the queues.
Attribute Description
flags Zero or OFPMPF_REQ_MORE
port_no Port number to read (OFPP_ANY for all ports)
queue_id ID of queue to read (OFPQ_ALL for all queues)
Example:
JSON Example:
{
"OFPQueueDescStatsRequest": {
"flags": 0,
"port_no": 7,
"queue_id": 4294967295,
"type": 15
}
}
class ryu.ofproto.ofproto_v1_4_parser.OFPQueueDescStatsReply(datapath,
type_=None,
**kwargs)
Queue description reply message
The switch responds with this message to a queue description request.
Attribute Description
body List of OFPQueueDesc instance
Example:
@set_ev_cls(ofp_event.EventOFPQueueDescStatsReply, MAIN_DISPATCHER)
def queue_desc_stats_reply_handler(self, ev):
queues = []
for q in ev.msg.body:
queues.append('port_no=%d queue_id=0x%08x properties=%s' %
(q.port_no, q.queue_id, repr(q.properties)))
self.logger.debug('OFPQueueDescStatsReply received: %s', queues)
JSON Example:
{
"OFPQueueDescStatsReply": {
"body": [
{
"OFPQueueDesc": {
"len": 32,
"port_no": 7,
"properties": [
{
"OFPQueueDescPropExperimenter": {
"data": [],
"exp_type": 0,
"experimenter": 101,
"length": 12,
"type": 65535
(continues on next page)
Attribute Description
flags Zero or OFPMPF_REQ_MORE
group_id ID of group to read (OFPG_ALL to all groups)
Example:
def send_group_stats_request(self, datapath):
ofp = datapath.ofproto
ofp_parser = datapath.ofproto_parser
JSON Example:
{
"OFPGroupStatsRequest": {
"flags": 0,
"group_id": 4294967292,
"type": 6
}
}
Attribute Description
body List of OFPGroupStats instance
Example:
@set_ev_cls(ofp_event.EventOFPGroupStatsReply, MAIN_DISPATCHER)
def group_stats_reply_handler(self, ev):
groups = []
for stat in ev.msg.body:
(continues on next page)
JSON Example:
{
"OFPGroupStatsReply": {
"body": [
{
"OFPGroupStats": {
"bucket_stats": [
{
"OFPBucketCounter": {
"byte_count": 2345,
"packet_count": 234
}
}
],
"byte_count": 12345,
"duration_nsec": 609036000,
"duration_sec": 9,
"group_id": 1,
"length": 56,
"packet_count": 123,
"ref_count": 2
}
}
],
"flags": 0,
"type": 6
}
}
class ryu.ofproto.ofproto_v1_4_parser.OFPGroupDescStatsRequest(datapath,
flags=0,
type_=None)
Group description request message
The controller uses this message to list the set of groups on a switch.
Attribute Description
flags Zero or OFPMPF_REQ_MORE
Example:
JSON Example:
{
"OFPGroupDescStatsRequest": {
"flags": 0,
"type": 7
}
}
class ryu.ofproto.ofproto_v1_4_parser.OFPGroupDescStatsReply(datapath,
type_=None,
**kwargs)
Group description reply message
The switch responds with this message to a group description request.
Attribute Description
body List of OFPGroupDescStats instance
Example:
@set_ev_cls(ofp_event.EventOFPGroupDescStatsReply, MAIN_DISPATCHER)
def group_desc_stats_reply_handler(self, ev):
descs = []
for stat in ev.msg.body:
descs.append('length=%d type=%d group_id=%d '
'buckets=%s' %
(stat.length, stat.type, stat.group_id,
stat.bucket))
self.logger.debug('GroupDescStats: %s', descs)
JSON Example:
{
"OFPGroupDescStatsReply": {
"body": [
{
"OFPGroupDescStats": {
"buckets": [
{
"OFPBucket": {
"actions": [
{
"OFPActionOutput": {
"len": 16,
"max_len": 65535,
"port": 2,
"type": 0
}
}
],
"len": 32,
"watch_group": 1,
(continues on next page)
class ryu.ofproto.ofproto_v1_4_parser.OFPGroupFeaturesStatsRequest(datapath,
flags=0,
type_=None)
Group features request message
The controller uses this message to list the capabilities of groups on a switch.
Attribute Description
flags Zero or OFPMPF_REQ_MORE
Example:
req = ofp_parser.OFPGroupFeaturesStatsRequest(datapath, 0)
datapath.send_msg(req)
JSON Example:
{
"OFPGroupFeaturesStatsRequest": {
"flags": 0,
"type": 8
}
}
class ryu.ofproto.ofproto_v1_4_parser.OFPGroupFeaturesStatsReply(datapath,
type_=None,
**kwargs)
Group features reply message
The switch responds with this message to a group features request.
Attribute Description
body Instance of OFPGroupFeaturesStats
Example:
@set_ev_cls(ofp_event.EventOFPGroupFeaturesStatsReply, MAIN_DISPATCHER)
def group_features_stats_reply_handler(self, ev):
body = ev.msg.body
JSON Example:
{
"OFPGroupFeaturesStatsReply": {
"body": {
"OFPGroupFeaturesStats": {
"actions": [
67082241,
67082241,
67082241,
67082241
],
"capabilities": 5,
"max_groups": [
16777216,
16777216,
16777216,
16777216
],
"types": 15
}
},
"flags": 0,
"type": 8
}
}
Attribute Description
flags Zero or OFPMPF_REQ_MORE
meter_id ID of meter to read (OFPM_ALL to all meters)
Example:
JSON Example:
{
"OFPMeterStatsRequest": {
"flags": 0,
"meter_id": 4294967295,
"type": 9
}
}
Attribute Description
body List of OFPMeterStats instance
Example:
@set_ev_cls(ofp_event.EventOFPMeterStatsReply, MAIN_DISPATCHER)
def meter_stats_reply_handler(self, ev):
meters = []
for stat in ev.msg.body:
meters.append('meter_id=0x%08x len=%d flow_count=%d '
'packet_in_count=%d byte_in_count=%d '
'duration_sec=%d duration_nsec=%d '
'band_stats=%s' %
(stat.meter_id, stat.len, stat.flow_count,
stat.packet_in_count, stat.byte_in_count,
stat.duration_sec, stat.duration_nsec,
stat.band_stats))
self.logger.debug('MeterStats: %s', meters)
JSON Example:
{
"OFPMeterStatsReply": {
"body": [
{
"OFPMeterStats": {
"band_stats": [
{
"OFPMeterBandStats": {
"byte_band_count": 0,
"packet_band_count": 0
}
}
],
"byte_in_count": 0,
"duration_nsec": 480000,
"duration_sec": 0,
"flow_count": 0,
"len": 56,
"meter_id": 100,
"packet_in_count": 0
(continues on next page)
class ryu.ofproto.ofproto_v1_4_parser.OFPMeterConfigStatsRequest(datapath,
flags=0, me-
ter_id=4294967295,
type_=None)
Meter configuration statistics request message
The controller uses this message to query configuration for one or more meters.
Attribute Description
flags Zero or OFPMPF_REQ_MORE
meter_id ID of meter to read (OFPM_ALL to all meters)
Example:
def send_meter_config_stats_request(self, datapath):
ofp = datapath.ofproto
ofp_parser = datapath.ofproto_parser
req = ofp_parser.OFPMeterConfigStatsRequest(datapath, 0,
ofp.OFPM_ALL)
datapath.send_msg(req)
JSON Example:
{
"OFPMeterConfigStatsRequest": {
"flags": 0,
"meter_id": 4294967295,
"type": 10
}
}
class ryu.ofproto.ofproto_v1_4_parser.OFPMeterConfigStatsReply(datapath,
type_=None,
**kwargs)
Meter configuration statistics reply message
The switch responds with this message to a meter configuration statistics request.
Attribute Description
body List of OFPMeterConfigStats instance
Example:
@set_ev_cls(ofp_event.EventOFPMeterConfigStatsReply, MAIN_DISPATCHER)
def meter_config_stats_reply_handler(self, ev):
configs = []
(continues on next page)
JSON Example:
{
"OFPMeterConfigStatsReply": {
"body": [
{
"OFPMeterConfigStats": {
"bands": [
{
"OFPMeterBandDrop": {
"burst_size": 10,
"len": 16,
"rate": 1000,
"type": 1
}
}
],
"flags": 14,
"length": 24,
"meter_id": 100
}
}
],
"flags": 0,
"type": 10
}
}
class ryu.ofproto.ofproto_v1_4_parser.OFPMeterFeaturesStatsRequest(datapath,
flags=0,
type_=None)
Meter features statistics request message
The controller uses this message to query the set of features of the metering subsystem.
Attribute Description
flags Zero or OFPMPF_REQ_MORE
Example:
req = ofp_parser.OFPMeterFeaturesStatsRequest(datapath, 0)
datapath.send_msg(req)
JSON Example:
{
"OFPMeterFeaturesStatsRequest": {
"flags": 0,
"type": 11
}
}
class ryu.ofproto.ofproto_v1_4_parser.OFPMeterFeaturesStatsReply(datapath,
type_=None,
**kwargs)
Meter features statistics reply message
The switch responds with this message to a meter features statistics request.
Attribute Description
body List of OFPMeterFeaturesStats instance
Example:
@set_ev_cls(ofp_event.EventOFPMeterFeaturesStatsReply, MAIN_DISPATCHER)
def meter_features_stats_reply_handler(self, ev):
features = []
for stat in ev.msg.body:
features.append('max_meter=%d band_types=0x%08x '
'capabilities=0x%08x max_bands=%d '
'max_color=%d' %
(stat.max_meter, stat.band_types,
stat.capabilities, stat.max_bands,
stat.max_color))
self.logger.debug('MeterFeaturesStats: %s', features)
JSON Example:
{
"OFPMeterFeaturesStatsReply": {
"body": [
{
"OFPMeterFeaturesStats": {
"band_types": 2147483654,
"capabilities": 15,
"max_bands": 255,
"max_color": 0,
"max_meter": 16777216
}
}
],
"flags": 0,
"type": 11
}
}
Attribute Description
flags Zero or OFPMPF_REQ_MORE
monitor_id Controller-assigned ID for this monitor
out_port Require matching entries to include this as an output
port
out_group Require matching entries to include this as an output
group
monitor_flags Bitmap of the following flags.
OFPFMF_INITIAL
OFPFMF_ADD
OFPFMF_REMOVED
OFPFMF_MODIFY
OFPFMF_INSTRUCTIONS
OFPFMF_NO_ABBREV
OFPFMF_ONLY_OWN
OFPFMC_ADD
OFPFMC_MODIFY
OFPFMC_DELETE
Example:
JSON Example:
{
"OFPFlowMonitorRequest": {
"command": 0,
"flags": 0,
"match": {
"OFPMatch": {
"length": 14,
"oxm_fields": [
{
"OXMTlv": {
"field": "eth_dst",
"mask": null,
"value": "f2:0b:a4:7d:f8:ea"
}
}
],
"type": 1
}
},
"monitor_flags": 15,
"monitor_id": 100000000,
"out_group": 4294967295,
"out_port": 22,
"table_id": 33,
"type": 16
}
}
Attribute Description
body List of list of the following class instance.
OFPFlowMonitorFull
OFPFlowMonitorAbbrev
OFPFlowMonitorPaused
Example:
@set_ev_cls(ofp_event.EventOFPFlowMonitorReply, MAIN_DISPATCHER)
def flow_monitor_reply_handler(self, ev):
msg = ev.msg
dp = msg.datapath
ofp = dp.ofproto
flow_updates = []
JSON Example:
{
"OFPFlowMonitorReply": {
"body": [
{
"OFPFlowUpdateFull": {
"cookie": 0,
"event": 0,
"hard_timeout": 700,
"idle_timeout": 600,
"instructions": [
{
"OFPInstructionActions": {
"actions": [
{
"OFPActionOutput": {
"len": 16,
"max_len": 0,
"port": 4294967290,
"type": 0
}
}
],
"len": 24,
"type": 4
}
}
],
"length": 64,
"match": {
"OFPMatch": {
"length": 10,
"oxm_fields": [
{
"OXMTlv": {
"field": "eth_type",
"mask": null,
"value": 2054
}
}
],
(continues on next page)
class ryu.ofproto.ofproto_v1_4_parser.OFPExperimenterStatsRequest(datapath,
flags, ex-
perimenter,
exp_type,
data,
type_=None)
Experimenter multipart request message
Attribute Description
flags Zero or OFPMPF_REQ_MORE
experimenter Experimenter ID
exp_type Experimenter defined
data Experimenter defined additional data
JSON Example:
{
"OFPExperimenterStatsRequest": {
"data": "aG9nZWhvZ2U=",
"exp_type": 3405678728,
"experimenter": 3735928495,
"flags": 0,
"type": 65535
}
}
class ryu.ofproto.ofproto_v1_4_parser.OFPExperimenterStatsReply(datapath,
type_=None,
**kwargs)
Attribute Description
body An OFPExperimenterMultipart instance
JSON Example:
{
"OFPExperimenterStatsReply": {
"body": {
"OFPExperimenterMultipart": {
"data": "dGVzdGRhdGE5OTk5OTk5OQ==",
"exp_type": 3405674359,
"experimenter": 3735928495
}
},
"flags": 0,
"type": 65535
}
}
Packet-Out Message
Attribute Description
buffer_id ID assigned by datapath (OFP_NO_BUFFER if none)
in_port Packet’s input port or OFPP_CONTROLLER
actions list of OpenFlow action class
data Packet data of a binary type value or an instances of packet.Packet.
Example:
JSON Example:
{
"OFPPacketOut": {
"actions": [
{
"OFPActionOutput": {
(continues on next page)
˓→",
"in_port": 4294967293
}
}
Barrier Message
class ryu.ofproto.ofproto_v1_4_parser.OFPBarrierRequest(datapath)
Barrier request message
The controller sends this message to ensure message dependencies have been met or receive notifications for
completed operations.
Example:
req = ofp_parser.OFPBarrierRequest(datapath)
datapath.send_msg(req)
JSON Example:
{
"OFPBarrierRequest": {}
}
class ryu.ofproto.ofproto_v1_4_parser.OFPBarrierReply(datapath)
Barrier reply message
The switch responds with this message to a barrier request.
Example:
@set_ev_cls(ofp_event.EventOFPBarrierReply, MAIN_DISPATCHER)
def barrier_reply_handler(self, ev):
self.logger.debug('OFPBarrierReply received')
JSON Example:
{
"OFPBarrierReply": {}
}
Attribute Description
role One of the following values.
OFPCR_ROLE_NOCHANGE
OFPCR_ROLE_EQUAL
OFPCR_ROLE_MASTER
OFPCR_ROLE_SLAVE
Example:
JSON Example:
{
"OFPRoleRequest": {
"generation_id": 17294086455919964160,
"role": 2
}
}
Attribute Description
role One of the following values.
OFPCR_ROLE_NOCHANGE
OFPCR_ROLE_EQUAL
OFPCR_ROLE_MASTER
OFPCR_ROLE_SLAVE
Example:
@set_ev_cls(ofp_event.EventOFPRoleReply, MAIN_DISPATCHER)
def role_reply_handler(self, ev):
msg = ev.msg
dp = msg.datapath
ofp = dp.ofproto
if msg.role == ofp.OFPCR_ROLE_NOCHANGE:
role = 'NOCHANGE'
elif msg.role == ofp.OFPCR_ROLE_EQUAL:
role = 'EQUAL'
elif msg.role == ofp.OFPCR_ROLE_MASTER:
role = 'MASTER'
elif msg.role == ofp.OFPCR_ROLE_SLAVE:
role = 'SLAVE'
else:
role = 'unknown'
JSON Example:
{
"OFPRoleReply": {
"generation_id": 17294086455919964160,
"role": 3
}
}
Bundle Messages
Attribute Description
bundle_id Id of the bundle
type One of the following values.
OFPBCT_OPEN_REQUEST
OFPBCT_OPEN_REPLY
OFPBCT_CLOSE_REQUEST
OFPBCT_CLOSE_REPLY
OFPBCT_COMMIT_REQUEST
OFPBCT_COMMIT_REPLY
OFPBCT_DISCARD_REQUEST
OFPBCT_DISCARD_REPLY
OFPBF_ATOMIC
OFPBF_ORDERED
Example:
def send_bundle_control(self, datapath):
ofp = datapath.ofproto
ofp_parser = datapath.ofproto_parser
req = ofp_parser.OFPBundleCtrlMsg(datapath, 7,
ofp.OFPBCT_OPEN_REQUEST,
ofp.OFPBF_ATOMIC, [])
datapath.send_msg(req)
JSON Example:
{
"OFPBundleCtrlMsg": {
"bundle_id": 1234,
"flags": 1,
"properties": [
{
"OFPBundlePropExperimenter": {
"data": [],
"exp_type": 0,
"experimenter": 101,
"length": 12,
"type": 65535
}
},
{
"OFPBundlePropExperimenter": {
"data": [
1
],
"exp_type": 1,
"experimenter": 101,
(continues on next page)
Attribute Description
bundle_id Id of the bundle
flags Bitmap of the following flags.
OFPBF_ATOMIC
OFPBF_ORDERED
Example:
JSON Example:
{
"OFPBundleAddMsg": {
"bundle_id": 1234,
"flags": 1,
(continues on next page)
Attribute Description
properties List of OFPAsyncConfigProp subclass instances
Example:
properties = [
ofp_parser.OFPAsyncConfigPropReasons(
ofp.OFPACPT_PACKET_IN_SLAVE, 8,
(1 << ofp.OFPR_APPLY_ACTION
| 1 << ofp.OFPR_INVALID_TTL))]
req = ofp_parser.OFPSetAsync(datapath, properties)
datapath.send_msg(req)
JSON Example:
{
"OFPSetAsync": {
"properties": [
{
"OFPAsyncConfigPropReasons": {
"length": 8,
"mask": 3,
"type": 0
}
},
{
"OFPAsyncConfigPropReasons": {
"length": 8,
"mask": 3,
"type": 1
}
},
{
"OFPAsyncConfigPropReasons": {
"length": 8,
"mask": 3,
"type": 2
}
},
{
"OFPAsyncConfigPropReasons": {
"length": 8,
"mask": 3,
"type": 3
}
},
{
"OFPAsyncConfigPropReasons": {
"length": 8,
"mask": 3,
"type": 4
}
},
{
"OFPAsyncConfigPropReasons": {
"length": 8,
"mask": 3,
"type": 5
(continues on next page)
class ryu.ofproto.ofproto_v1_4_parser.OFPGetAsyncRequest(datapath)
Get asynchronous configuration request message
The controller uses this message to query the asynchronous message.
Example:
req = ofp_parser.OFPGetAsyncRequest(datapath)
datapath.send_msg(req)
JSON Example:
{
"OFPGetAsyncRequest": {}
}
Attribute Description
properties List of OFPAsyncConfigProp subclass instances
Example:
@set_ev_cls(ofp_event.EventOFPGetAsyncReply, MAIN_DISPATCHER)
def get_async_reply_handler(self, ev):
msg = ev.msg
JSON Example:
{
"OFPGetAsyncReply": {
"properties": [
{
"OFPAsyncConfigPropReasons": {
"length": 8,
"mask": 3,
"type": 0
}
},
{
"OFPAsyncConfigPropReasons": {
"length": 8,
"mask": 3,
"type": 1
}
},
{
"OFPAsyncConfigPropReasons": {
"length": 8,
"mask": 3,
"type": 2
}
},
{
"OFPAsyncConfigPropReasons": {
"length": 8,
"mask": 3,
"type": 3
}
},
{
"OFPAsyncConfigPropReasons": {
"length": 8,
"mask": 3,
"type": 4
}
},
{
"OFPAsyncConfigPropReasons": {
"length": 8,
"mask": 3,
"type": 5
}
},
{
"OFPAsyncConfigPropReasons": {
"length": 8,
"mask": 3,
"type": 6
}
},
(continues on next page)
Asynchronous Messages
Packet-In Message
Attribute Description
buffer_id ID assigned by datapath
total_len Full length of frame
reason Reason packet is being sent.
OFPR_TABLE_MISS
OFPR_APPLY_ACTION
OFPR_INVALID_TTL
OFPR_ACTION_SET
OFPR_GROUP
OFPR_PACKET_OUT
Example:
@set_ev_cls(ofp_event.EventOFPPacketIn, MAIN_DISPATCHER)
def packet_in_handler(self, ev):
msg = ev.msg
dp = msg.datapath
ofp = dp.ofproto
JSON Example:
{
"OFPPacketIn": {
"buffer_id": 2,
"cookie": 283686884868096,
"data": "////////8gukffjqCAYAAQgABgQAAfILpH346goAAAEAAAAAAAAKAAAD",
"match": {
"OFPMatch": {
"length": 80,
"oxm_fields": [
{
"OXMTlv": {
"field": "in_port",
"mask": null,
"value": 6
}
},
{
"OXMTlv": {
"field": "eth_type",
"mask": null,
"value": 2054
}
},
{
"OXMTlv": {
"field": "eth_dst",
"mask": null,
"value": "ff:ff:ff:ff:ff:ff"
}
},
{
"OXMTlv": {
"field": "eth_src",
(continues on next page)
{
"OFPPacketIn": {
"buffer_id": 4026531840,
"cookie": 283686884868096,
"data": "",
"match": {
"OFPMatch": {
(continues on next page)
Attribute Description
cookie Opaque controller-issued identifier
priority Priority level of flow entry
reason One of the following values.
OFPRR_IDLE_TIMEOUT
OFPRR_HARD_TIMEOUT
OFPRR_DELETE
OFPRR_GROUP_DELETE
OFPRR_METER_DELETE
OFPRR_EVICTION
Example:
@set_ev_cls(ofp_event.EventOFPFlowRemoved, MAIN_DISPATCHER)
def flow_removed_handler(self, ev):
msg = ev.msg
dp = msg.datapath
(continues on next page)
if msg.reason == ofp.OFPRR_IDLE_TIMEOUT:
reason = 'IDLE TIMEOUT'
elif msg.reason == ofp.OFPRR_HARD_TIMEOUT:
reason = 'HARD TIMEOUT'
elif msg.reason == ofp.OFPRR_DELETE:
reason = 'DELETE'
elif msg.reason == ofp.OFPRR_GROUP_DELETE:
reason = 'GROUP DELETE'
else:
reason = 'unknown'
JSON Example:
{
"OFPFlowRemoved": {
"byte_count": 86,
"cookie": 0,
"duration_nsec": 48825000,
"duration_sec": 3,
"hard_timeout": 0,
"idle_timeout": 3,
"match": {
"OFPMatch": {
"length": 14,
"oxm_fields": [
{
"OXMTlv": {
"field": "eth_dst",
"mask": null,
"value": "f2:0b:a4:7d:f8:ea"
}
}
],
"type": 1
}
},
"packet_count": 1,
"priority": 65535,
"reason": 0,
"table_id": 0
}
}
Attribute Description
reason One of the following values.
OFPPR_ADD
OFPPR_DELETE
OFPPR_MODIFY
Example:
@set_ev_cls(ofp_event.EventOFPPortStatus, MAIN_DISPATCHER)
def port_status_handler(self, ev):
msg = ev.msg
dp = msg.datapath
ofp = dp.ofproto
if msg.reason == ofp.OFPPR_ADD:
reason = 'ADD'
elif msg.reason == ofp.OFPPR_DELETE:
reason = 'DELETE'
elif msg.reason == ofp.OFPPR_MODIFY:
reason = 'MODIFY'
else:
reason = 'unknown'
JSON Example:
{
"OFPPortStatus": {
"desc": {
"OFPPort": {
"config": 0,
"hw_addr": "f2:0b:a4:d0:3f:70",
"length": 168,
"name": "\u79c1\u306e\u30dd\u30fc\u30c8",
"port_no": 7,
"properties": [
{
"OFPPortDescPropEthernet": {
"advertised": 10240,
"curr": 10248,
"curr_speed": 5000,
"length": 32,
"max_speed": 5000,
(continues on next page)
Attribute Description
role One of the following values.
OFPCR_ROLE_NOCHANGE
OFPCR_ROLE_EQUAL
OFPCR_ROLE_MASTER
OFPCRR_MASTER_REQUEST
OFPCRR_CONFIG
OFPCRR_EXPERIMENTER
Example:
@set_ev_cls(ofp_event.EventOFPRoleStatus, MAIN_DISPATCHER)
def role_status_handler(self, ev):
msg = ev.msg
dp = msg.datapath
ofp = dp.ofproto
if msg.role == ofp.OFPCR_ROLE_NOCHANGE:
role = 'ROLE NOCHANGE'
elif msg.role == ofp.OFPCR_ROLE_EQUAL:
role = 'ROLE EQUAL'
elif msg.role == ofp.OFPCR_ROLE_MASTER:
role = 'ROLE MASTER'
else:
role = 'unknown'
if msg.reason == ofp.OFPCRR_MASTER_REQUEST:
reason = 'MASTER REQUEST'
elif msg.reason == ofp.OFPCRR_CONFIG:
reason = 'CONFIG'
elif msg.reason == ofp.OFPCRR_EXPERIMENTER:
reason = 'EXPERIMENTER'
else:
(continues on next page)
JSON Example:
{
"OFPRoleStatus": {
"generation_id": 7,
"properties": [
{
"OFPRolePropExperimenter": {
"data": [],
"exp_type": 0,
"experimenter": 101,
"length": 12,
"type": 65535
}
},
{
"OFPRolePropExperimenter": {
"data": [
1
],
"exp_type": 1,
"experimenter": 101,
"length": 16,
"type": 65535
}
},
{
"OFPRolePropExperimenter": {
"data": [
1,
2
],
"exp_type": 2,
"experimenter": 101,
"length": 20,
"type": 65535
}
}
],
"reason": 0,
"role": 2
}
}
Attribute Description
reason One of the following values.
OFPTR_VACANCY_DOWN
OFPTR_VACANCY_UP
Example:
@set_ev_cls(ofp_event.EventOFPTableStatus, MAIN_DISPATCHER)
def table(self, ev):
msg = ev.msg
dp = msg.datapath
ofp = dp.ofproto
if msg.reason == ofp.OFPTR_VACANCY_DOWN:
reason = 'VACANCY_DOWN'
elif msg.reason == ofp.OFPTR_VACANCY_UP:
reason = 'VACANCY_UP'
else:
reason = 'unknown'
JSON Example:
{
"OFPTableStatus": {
"reason": 3,
"table": {
"OFPTableDesc": {
"config": 0,
"length": 80,
"properties": [
{
"OFPTableModPropEviction": {
"flags": 0,
"length": 8,
"type": 2
}
},
{
"OFPTableModPropVacancy": {
"length": 8,
"type": 3,
"vacancy": 0,
"vacancy_down": 0,
"vacancy_up": 0
}
},
(continues on next page)
Attribute Description
request OFPGroupMod or OFPMeterMod instance
Example:
@set_ev_cls(ofp_event.EventOFPRequestForward, MAIN_DISPATCHER)
def request_forward_handler(self, ev):
msg = ev.msg
(continues on next page)
if msg.request.msg_type == ofp.OFPT_GROUP_MOD:
self.logger.debug(
'OFPRequestForward received: request=OFPGroupMod('
'command=%d, type=%d, group_id=%d, buckets=%s)',
msg.request.command, msg.request.type,
msg.request.group_id, msg.request.buckets)
elif msg.request.msg_type == ofp.OFPT_METER_MOD:
self.logger.debug(
'OFPRequestForward received: request=OFPMeterMod('
'command=%d, flags=%d, meter_id=%d, bands=%s)',
msg.request.command, msg.request.flags,
msg.request.meter_id, msg.request.bands)
else:
self.logger.debug(
'OFPRequestForward received: request=Unknown')
JSON Example:
{
"OFPRequestForward": {
"request": {
"OFPGroupMod": {
"buckets": [
{
"OFPBucket": {
"actions": [
{
"OFPActionOutput": {
"len": 16,
"max_len": 65535,
"port": 2,
"type": 0
}
}
],
"len": 32,
"watch_group": 1,
"watch_port": 1,
"weight": 1
}
}
],
"command": 0,
"group_id": 1,
"type": 0
}
}
}
}
Symmetric Messages
Hello
Attribute Description
elements list of OFPHelloElemVersionBitmap instance
JSON Example:
{
"OFPHello": {
"elements": [
{
"OFPHelloElemVersionBitmap": {
"length": 8,
"type": 1,
"versions": [
1,
2,
3,
9,
10,
30
]
}
}
]
}
}
class ryu.ofproto.ofproto_v1_4_parser.OFPHelloElemVersionBitmap(versions,
type_=None,
length=None)
Version bitmap Hello Element
Attribute Description
versions list of versions of OpenFlow protocol a device supports
Echo Request
Attribute Description
data An arbitrary length data
Example:
@set_ev_cls(ofp_event.EventOFPEchoRequest,
[HANDSHAKE_DISPATCHER, CONFIG_DISPATCHER, MAIN_DISPATCHER])
def echo_request_handler(self, ev):
self.logger.debug('OFPEchoRequest received: data=%s',
utils.hex_array(ev.msg.data))
JSON Example:
{
"OFPEchoRequest": {
"data": "aG9nZQ=="
}
}
Echo Reply
Attribute Description
data An arbitrary length data
Example:
@set_ev_cls(ofp_event.EventOFPEchoReply,
[HANDSHAKE_DISPATCHER, CONFIG_DISPATCHER, MAIN_DISPATCHER])
def echo_reply_handler(self, ev):
self.logger.debug('OFPEchoReply received: data=%s',
utils.hex_array(ev.msg.data))
JSON Example:
{
"OFPEchoReply": {
"data": "aG9nZQ=="
}
}
Error Message
Attribute Description
type High level type of error
code Details depending on the type
data Variable length data depending on the type and code
Type Code
OFPET_HELLO_FAILED OFPHFC_*
OFPET_BAD_REQUEST OFPBRC_*
OFPET_BAD_ACTION OFPBAC_*
OFPET_BAD_INSTRUCTION OFPBIC_*
OFPET_BAD_MATCH OFPBMC_*
OFPET_FLOW_MOD_FAILED OFPFMFC_*
OFPET_GROUP_MOD_FAILED OFPGMFC_*
OFPET_PORT_MOD_FAILED OFPPMFC_*
OFPET_TABLE_MOD_FAILED OFPTMFC_*
OFPET_QUEUE_OP_FAILED OFPQOFC_*
OFPET_SWITCH_CONFIG_FAILED OFPSCFC_*
OFPET_ROLE_REQUEST_FAILED OFPRRFC_*
OFPET_METER_MOD_FAILED OFPMMFC_*
OFPET_TABLE_FEATURES_FAILED OFPTFFC_*
OFPET_EXPERIMENTER N/A
Attribute Description
exp_type Experimenter defined type
experimenter Experimenter ID
Example:
@set_ev_cls(ofp_event.EventOFPErrorMsg,
[HANDSHAKE_DISPATCHER, CONFIG_DISPATCHER, MAIN_DISPATCHER])
def error_msg_handler(self, ev):
msg = ev.msg
JSON Example:
{
"OFPErrorMsg": {
"code": 11,
"data": "ZnVnYWZ1Z2E=",
"type": 2
}
}
Experimenter
Attribute Description
experimenter Experimenter ID
exp_type Experimenter defined
data Experimenter defined arbitrary additional data
JSON Example:
{
"OFPExperimenter": {
"data": "bmF6bw==",
"exp_type": 123456789,
"experimenter": 98765432
}
}
Port Structures
Attribute Description
port_no Port number and it uniquely identifies a port within a
switch.
length Length of ofp_port (excluding padding).
hw_addr MAC address for the port.
name Null-terminated string containing a human-readable
name for the interface.
config Bitmap of port configration flags.
OFPPC_PORT_DOWN
OFPPC_NO_RECV
OFPPC_NO_FWD
OFPPC_NO_PACKET_IN
OFPPS_LINK_DOWN
OFPPS_BLOCKED
OFPPS_LIVE
Example:
>>> # compose
>>> match = parser.OFPMatch(
... in_port=1,
... eth_type=0x86dd,
... ipv6_src=('2001:db8:bd05:1d2:288a:1fc0:1:10ee',
... 'ffff:ffff:ffff:ffff::'),
... ipv6_dst='2001:db8:bd05:1d2:288a:1fc0:1:10ee')
>>> # query
>>> if 'ipv6_src' in match:
... print match['ipv6_src']
...
('2001:db8:bd05:1d2:288a:1fc0:1:10ee', 'ffff:ffff:ffff:ffff::')
Note: For the list of the supported Nicira experimenter matches, please refer to ryu.ofproto.nx_match.
Note: For VLAN id match field, special values are defined in OpenFlow Spec.
1) Packets with and without a VLAN tag
• Example:
match = parser.OFPMatch()
• Packet Matching
non-VLAN-tagged MATCH
VLAN-tagged(vlan_id=3) MATCH
VLAN-tagged(vlan_id=5) MATCH
match = parser.OFPMatch(vlan_vid=0x0000)
• Packet Matching
non-VLAN-tagged MATCH
VLAN-tagged(vlan_id=3) x
VLAN-tagged(vlan_id=5) x
• Packet Matching
non-VLAN-tagged x
VLAN-tagged(vlan_id=3) MATCH
VLAN-tagged(vlan_id=5) MATCH
• Packet Matching
non-VLAN-tagged x
VLAN-tagged(vlan_id=3) MATCH
VLAN-tagged(vlan_id=5) x
class ryu.ofproto.ofproto_v1_4_parser.OFPInstructionGotoTable(table_id,
type_=None,
len_=None)
Goto table instruction
This instruction indicates the next table in the processing pipeline.
Attribute Description
table_id Next table
class ryu.ofproto.ofproto_v1_4_parser.OFPInstructionWriteMetadata(metadata,
meta-
data_mask,
type_=None,
len_=None)
Write metadata instruction
This instruction writes the masked metadata value into the metadata field.
Attribute Description
metadata Metadata value to write
metadata_mask Metadata write bitmask
Attribute Description
type One of following values.
OFPIT_WRITE_ACTIONS
OFPIT_APPLY_ACTIONS
OFPIT_CLEAR_ACTIONS
Attribute Description
meter_id Meter instance
Action Structures
Attribute Description
port Output port
max_len Max length to send to controller
class ryu.ofproto.ofproto_v1_4_parser.OFPActionCopyTtlOut(type_=None,
len_=None)
Copy TTL Out action
This action copies the TTL from the next-to-outermost header with TTL to the outermost header with TTL.
class ryu.ofproto.ofproto_v1_4_parser.OFPActionCopyTtlIn(type_=None,
len_=None)
Copy TTL In action
This action copies the TTL from the outermost header with TTL to the next-to-outermost header with TTL.
class ryu.ofproto.ofproto_v1_4_parser.OFPActionSetMplsTtl(mpls_ttl, type_=None,
len_=None)
Set MPLS TTL action
This action sets the MPLS TTL.
Attribute Description
mpls_ttl MPLS TTL
class ryu.ofproto.ofproto_v1_4_parser.OFPActionDecMplsTtl(type_=None,
len_=None)
Decrement MPLS TTL action
This action decrements the MPLS TTL.
class ryu.ofproto.ofproto_v1_4_parser.OFPActionPushVlan(ethertype=33024,
type_=None, len_=None)
Push VLAN action
This action pushes a new VLAN tag to the packet.
Attribute Description
ethertype Ether type. The default is 802.1Q. (0x8100)
Attribute Description
ethertype Ether type
class ryu.ofproto.ofproto_v1_4_parser.OFPActionPopMpls(ethertype=2048,
type_=None, len_=None)
Pop MPLS action
This action pops the MPLS header from the packet.
Attribute Description
queue_id Queue ID for the packets
Attribute Description
group_id Group identifier
Attribute Description
nw_ttl IP TTL
set_field = OFPActionSetField(eth_src="00:00:00:00:00:00")
Attribute Description
ethertype Ether type
class ryu.ofproto.ofproto_v1_4_parser.OFPActionExperimenter(experimenter)
Experimenter action
This action is an extensible action for the experimenter.
Attribute Description
experimenter Experimenter ID
Note: For the list of the supported Nicira experimenter actions, please refer to ryu.ofproto.nx_actions.
Controller-to-Switch Messages
Handshake
class ryu.ofproto.ofproto_v1_5_parser.OFPFeaturesRequest(datapath)
Features request message
The controller sends a feature request to the switch upon session establishment.
This message is handled by the Ryu framework, so the Ryu application do not need to process this typically.
Example:
def send_features_request(self, datapath):
ofp_parser = datapath.ofproto_parser
req = ofp_parser.OFPFeaturesRequest(datapath)
datapath.send_msg(req)
JSON Example:
{
"OFPFeaturesRequest": {}
}
JSON Example:
{
"OFPSwitchFeatures": {
"auxiliary_id": 0,
"capabilities": 79,
"datapath_id": 1,
"n_buffers": 255,
"n_tables": 255
}
}
Switch Configuration
Attribute Description
flags Bitmap of the following flags.
OFPC_FRAG_NORMAL
OFPC_FRAG_DROP
OFPC_FRAG_REASM
Example:
def send_set_config(self, datapath):
ofp = datapath.ofproto
ofp_parser = datapath.ofproto_parser
JSON Example:
{
"OFPSetConfig": {
"flags": 0,
"miss_send_len": 128
}
}
class ryu.ofproto.ofproto_v1_5_parser.OFPGetConfigRequest(datapath)
Get config request message
The controller sends a get config request to query configuration parameters in the switch.
Example:
req = ofp_parser.OFPGetConfigRequest(datapath)
datapath.send_msg(req)
JSON Example:
{
"OFPGetConfigRequest": {}
}
Attribute Description
flags Bitmap of the following flags.
OFPC_FRAG_NORMAL
OFPC_FRAG_DROP
OFPC_FRAG_REASM
Example:
@set_ev_cls(ofp_event.EventOFPGetConfigReply, MAIN_DISPATCHER)
def get_config_reply_handler(self, ev):
msg = ev.msg
dp = msg.datapath
ofp = dp.ofproto
flags = []
JSON Example:
{
"OFPGetConfigReply": {
"flags": 0,
"miss_send_len": 128
}
}
Attribute Description
table_id ID of the table (OFPTT_ALL indicates all tables)
config Bitmap of configuration flags.
OFPTC_EVICTION
OFPTC_VACANCY_EVENTS
Example:
req = ofp_parser.OFPTableMod(datapath, 1, 3)
flags = ofp.OFPTC_VACANCY_EVENTS
properties = [ofp_parser.OFPTableModPropEviction(flags)]
req = ofp_parser.OFPTableMod(datapath, 1, 3, properties)
datapath.send_msg(req)
JSON Example:
{
"OFPTableMod": {
"config": 4,
"properties": [
{
"OFPTableModPropEviction": {
"flags": 2,
"length": 8,
"type": 2
}
}
],
"table_id": 255
}
}
Attribute Description
cookie Opaque controller-issued identifier
cookie_mask Mask used to restrict the cookie bits that must
match when the command is OPFFC_MODIFY* or
OFPFC_DELETE*
table_id ID of the table to put the flow in
command One of the following values.
OFPFC_ADD
OFPFC_MODIFY
OFPFC_MODIFY_STRICT
OFPFC_DELETE
OFPFC_DELETE_STRICT
OFPFF_SEND_FLOW_REM
OFPFF_CHECK_OVERLAP
OFPFF_RESET_COUNTS
OFPFF_NO_PKT_COUNTS
OFPFF_NO_BYT_COUNTS
Example:
JSON Example:
{
"OFPFlowMod": {
"buffer_id": 0,
"command": 0,
"cookie": 1311768467463790320,
"cookie_mask": 18446744073709551615,
"flags": 0,
"hard_timeout": 0,
"idle_timeout": 0,
"importance": 39032,
"instructions": [
{
"OFPInstructionActions": {
"actions": [
{
"OFPActionPopVlan": {
"len": 8,
"type": 18
}
},
{
"OFPActionSetField": {
"field": {
"OXMTlv": {
"field": "ipv4_dst",
"mask": null,
"value": "192.168.2.9"
}
},
"len": 16,
"type": 25
}
},
{
"NXActionLearn": {
(continues on next page)
{
"OFPFlowMod": {
"buffer_id": 0,
"command": 0,
"cookie": 1311768467463790320,
"cookie_mask": 18446744073709551615,
"flags": 0,
"hard_timeout": 0,
"idle_timeout": 0,
"importance": 39032,
"instructions": [
(continues on next page)
{
"OFPFlowMod": {
"buffer_id": 0,
"command": 0,
"cookie": 1311768467463790320,
"cookie_mask": 18446744073709551615,
"flags": 0,
"hard_timeout": 0,
"idle_timeout": 0,
"importance": 39032,
"instructions": [
{
"OFPInstructionActions": {
"actions": [
{
"OFPActionPopVlan": {
"len": 8,
"type": 18
}
},
{
"OFPActionSetField": {
(continues on next page)
Attribute Description
command One of the following values.
OFPGC_ADD
OFPGC_MODIFY
OFPGC_DELETE
OFPGC_INSERT_BUCKET
OFPGC_REMOVE_BUCKET
OFPGT_ALL
OFPGT_SELECT
OFPGT_INDIRECT
OFPGT_FF
port = 1
max_len = 2000
actions = [ofp_parser.OFPActionOutput(port, max_len)]
weight = 100
watch_port = 0
watch_group = 0
buckets = [ofp_parser.OFPBucket(weight, watch_port, watch_group,
actions)]
group_id = 1
command_bucket_id=1
req = ofp_parser.OFPGroupMod(datapath, ofp.OFPGC_ADD,
ofp.OFPGT_SELECT, group_id,
command_bucket_id, buckets)
datapath.send_msg(req)
JSON Example:
{
"OFPGroupMod": {
"bucket_array_len": 56,
"buckets": [
(continues on next page)
Attribute Description
port_no Port number to modify
hw_addr The hardware address that must be the same as
hw_addr of OFPPort of OFPSwitchFeatures
config Bitmap of configuration flags.
OFPPC_PORT_DOWN
OFPPC_NO_RECV
OFPPC_NO_FWD
OFPPC_NO_PACKET_IN
Example:
port_no = 3
hw_addr = 'fa:c8:e8:76:1d:7e'
config = 0
mask = (ofp.OFPPC_PORT_DOWN | ofp.OFPPC_NO_RECV |
ofp.OFPPC_NO_FWD | ofp.OFPPC_NO_PACKET_IN)
advertise = (ofp.OFPPF_10MB_HD | ofp.OFPPF_100MB_FD |
ofp.OFPPF_1GB_FD | ofp.OFPPF_COPPER |
ofp.OFPPF_AUTONEG | ofp.OFPPF_PAUSE |
ofp.OFPPF_PAUSE_ASYM)
properties = [ofp_parser.OFPPortModPropEthernet(advertise)]
req = ofp_parser.OFPPortMod(datapath, port_no, hw_addr, config,
mask, properties)
datapath.send_msg(req)
JSON Example:
{
"OFPPortMod": {
"config": 0,
"hw_addr": "00:11:00:00:11:11",
"mask": 0,
"port_no": 1,
"properties": [
{
(continues on next page)
Attribute Description
command One of the following values.
OFPMC_ADD
OFPMC_MODIFY
OFPMC_DELETE
OFPMF_KBPS
OFPMF_PKTPS
OFPMF_BURST
OFPMF_STATS
OFPMeterBandDrop
OFPMeterBandDscpRemark
OFPMeterBandExperimenter
JSON Example:
{
"OFPMeterMod": {
"bands": [
{
"OFPMeterBandDrop": {
"burst_size": 10,
"len": 16,
"rate": 1000,
"type": 1
}
},
{
"OFPMeterBandDscpRemark": {
"burst_size": 10,
"len": 16,
"prec_level": 1,
"rate": 1000,
"type": 2
}
}
],
"command": 0,
"flags": 14,
"meter_id": 100
}
}
Multipart Messages
Attribute Description
flags Zero or OFPMPF_REQ_MORE
Example:
req = ofp_parser.OFPDescStatsRequest(datapath, 0)
datapath.send_msg(req)
JSON Example:
{
"OFPDescStatsRequest": {
"flags": 0,
"type": 0
}
}
Attribute Description
body Instance of OFPDescStats
Example:
@set_ev_cls(ofp_event.EventOFPDescStatsReply, MAIN_DISPATCHER)
def desc_stats_reply_handler(self, ev):
body = ev.msg.body
JSON Example:
{
"OFPDescStatsReply": {
"body": {
"OFPDescStats": {
"dp_desc": "dp",
"hw_desc": "hw",
(continues on next page)
class ryu.ofproto.ofproto_v1_5_parser.OFPFlowDescStatsRequest(datapath,
flags=0, ta-
ble_id=255,
out_port=4294967295,
out_group=4294967295,
cookie=0,
cookie_mask=0,
match=None,
type_=None)
Individual flow descriptions request message
The controller uses this message to query individual flow descriptions.
Attribute Description
flags Zero or OFPMPF_REQ_MORE
table_id ID of table to read
out_port Require matching entries to include this as an output port
out_group Require matching entries to include this as an output group
cookie Require matching entries to contain this cookie value
cookie_mask Mask used to restrict the cookie bits that must match
match Instance of OFPMatch
Example:
def send_flow_desc_request(self, datapath):
ofp = datapath.ofproto
ofp_parser = datapath.ofproto_parser
cookie = cookie_mask = 0
match = ofp_parser.OFPMatch(in_port=1)
req = ofp_parser.OFPFlowDescStatsRequest(datapath, 0,
ofp.OFPTT_ALL,
ofp.OFPP_ANY,
ofp.OFPG_ANY,
cookie, cookie_mask,
match)
datapath.send_msg(req)
JSON Example:
{
"OFPFlowDescStatsRequest": {
"cookie": 1234605616436508552,
"cookie_mask": 18446744073709551615,
"flags": 0,
(continues on next page)
class ryu.ofproto.ofproto_v1_5_parser.OFPFlowDescStatsReply(datapath,
type_=None,
**kwargs)
Individual flow descriptions reply message
The switch responds with this message to an individual flow descriptions request.
Attribute Description
body List of OFPFlowDesc instance
Example:
@set_ev_cls(ofp_event.EventOFPFlowDescStatsReply, MAIN_DISPATCHER)
def flow_desc_reply_handler(self, ev):
flows = []
for stat in ev.msg.body:
flows.append('table_id=%s priority=%d '
'idle_timeout=%d hard_timeout=%d flags=0x%04x '
'importance=%d cookie=%d match=%s '
'stats=%s instructions=%s' %
(stat.table_id, stat.priority,
stat.idle_timeout, stat.hard_timeout,
stat.flags, stat.importance,
stat.cookie, stat.match,
stat.stats, stat.instructions))
self.logger.debug('FlowDesc: %s', flows)
JSON Example:
{
"OFPFlowDescStatsReply": {
"body": [
{
"OFPFlowDesc": {
(continues on next page)
Attribute Description
flags Zero or OFPMPF_REQ_MORE
table_id ID of table to read
out_port Require matching entries to include this as an output port
out_group Require matching entries to include this as an output group
cookie Require matching entries to contain this cookie value
cookie_mask Mask used to restrict the cookie bits that must match
match Instance of OFPMatch
Example:
cookie = cookie_mask = 0
match = ofp_parser.OFPMatch(in_port=1)
req = ofp_parser.OFPFlowStatsRequest(datapath, 0,
ofp.OFPTT_ALL,
ofp.OFPP_ANY, ofp.OFPG_ANY,
cookie, cookie_mask,
match)
datapath.send_msg(req)
JSON Example:
{
"OFPFlowStatsRequest": {
"cookie": 0,
"cookie_mask": 0,
"flags": 0,
"match": {
"OFPMatch": {
"length": 4,
"oxm_fields": [],
"type": 1
}
},
"out_group": 4294967295,
"out_port": 4294967295,
"table_id": 0,
"type": 17
}
}
Attribute Description
body List of OFPFlowStats instance
Example:
@set_ev_cls(ofp_event.EventOFPFlowStatsReply, MAIN_DISPATCHER)
def flow_stats_reply_handler(self, ev):
flows = []
for stat in ev.msg.body:
flows.append('table_id=%s reason=%d priority=%d '
'match=%s stats=%s' %
(stat.table_id, stat.reason, stat.priority,
stat.match, stat.stats))
self.logger.debug('FlowStats: %s', flows)
JSON Example:
{
"OFPFlowStatsReply": {
"body": [
{
"OFPFlowStats": {
"length": 40,
"match": {
"OFPMatch": {
"length": 12,
"oxm_fields": [
{
"OXMTlv": {
"field": "in_port",
"mask": null,
"value": 1
}
}
],
"type": 1
}
},
"priority": 1,
"reason": 0,
"stats": {
"OFPStats": {
"length": 12,
"oxs_fields": [
{
"OXSTlv": {
"field": "flow_count",
"value": 1
}
}
]
(continues on next page)
class ryu.ofproto.ofproto_v1_5_parser.OFPAggregateStatsRequest(datapath,
flags, table_id,
out_port,
out_group,
cookie,
cookie_mask,
match,
type_=None)
Aggregate flow statistics request message
The controller uses this message to query aggregate flow statictics.
Attribute Description
flags Zero or OFPMPF_REQ_MORE
table_id ID of table to read
out_port Require matching entries to include this as an output port
out_group Require matching entries to include this as an output group
cookie Require matching entries to contain this cookie value
cookie_mask Mask used to restrict the cookie bits that must match
match Instance of OFPMatch
Example:
def send_aggregate_stats_request(self, datapath):
ofp = datapath.ofproto
ofp_parser = datapath.ofproto_parser
cookie = cookie_mask = 0
match = ofp_parser.OFPMatch(in_port=1)
req = ofp_parser.OFPAggregateStatsRequest(datapath, 0,
ofp.OFPTT_ALL,
ofp.OFPP_ANY,
ofp.OFPG_ANY,
cookie, cookie_mask,
match)
datapath.send_msg(req)
JSON Example:
{
"OFPAggregateStatsRequest": {
"cookie": 0,
"cookie_mask": 0,
"flags": 0,
(continues on next page)
class ryu.ofproto.ofproto_v1_5_parser.OFPAggregateStatsReply(datapath,
type_=None,
**kwargs)
Aggregate flow statistics reply message
The switch responds with this message to an aggregate flow statistics request.
Attribute Description
body Instance of OFPAggregateStats
Example:
@set_ev_cls(ofp_event.EventOFPAggregateStatsReply, MAIN_DISPATCHER)
def aggregate_stats_reply_handler(self, ev):
body = ev.msg.body
JSON Example:
{
"OFPAggregateStatsReply": {
"body": {
"OFPAggregateStats": {
"length": 16,
"stats": {
"OFPStats": {
"length": 12,
"oxs_fields": [
{
"OXSTlv": {
"field": "flow_count",
"value": 1
}
}
]
}
}
}
},
"flags": 0,
"type": 2
(continues on next page)
Attribute Description
flags Zero or OFPMPF_REQ_MORE
port_no Port number to read (OFPP_ANY to all ports)
Example:
JSON Example:
{
"OFPPortStatsRequest": {
"flags": 0,
"port_no": 4294967295,
"type": 4
}
}
Attribute Description
body List of OFPPortStats instance
Example:
@set_ev_cls(ofp_event.EventOFPPortStatsReply, MAIN_DISPATCHER)
def port_stats_reply_handler(self, ev):
ports = []
for stat in ev.msg.body:
ports.append(stat.length, stat.port_no,
stat.duration_sec, stat.duration_nsec,
stat.rx_packets, stat.tx_packets,
stat.rx_bytes, stat.tx_bytes,
stat.rx_dropped, stat.tx_dropped,
stat.rx_errors, stat.tx_errors,
repr(stat.properties))
self.logger.debug('PortStats: %s', ports)
JSON Example:
{
"OFPPortStatsReply": {
"body": [
{
"OFPPortStats": {
"duration_nsec": 0,
"duration_sec": 0,
"length": 224,
"port_no": 7,
"properties": [
{
"OFPPortStatsPropEthernet": {
"collisions": 0,
"length": 40,
"rx_crc_err": 0,
"rx_frame_err": 0,
"rx_over_err": 0,
"type": 0
}
},
{
"OFPPortStatsPropOptical": {
"bias_current": 300,
"flags": 3,
"length": 44,
"rx_freq_lmda": 1500,
"rx_grid_span": 500,
"rx_offset": 700,
"rx_pwr": 2000,
"temperature": 273,
"tx_freq_lmda": 1500,
"tx_grid_span": 500,
"tx_offset": 700,
"tx_pwr": 2000,
"type": 1
}
},
{
"OFPPortStatsPropExperimenter": {
"data": [],
"exp_type": 0,
"experimenter": 101,
"length": 12,
"type": 65535
}
},
{
"OFPPortStatsPropExperimenter": {
"data": [
1
],
"exp_type": 1,
"experimenter": 101,
"length": 16,
"type": 65535
}
(continues on next page)
class ryu.ofproto.ofproto_v1_5_parser.OFPPortDescStatsRequest(datapath,
flags=0,
port_no=4294967295,
type_=None)
Port description request message
The controller uses this message to query description of one or all the ports.
Attribute Description
flags Zero or OFPMPF_REQ_MORE
port_no Port number to read (OFPP_ANY to all ports)
Example:
JSON Example:
{
"OFPPortDescStatsRequest": {
"flags": 0,
"port_no": 48346,
"type": 13
}
}
class ryu.ofproto.ofproto_v1_5_parser.OFPPortDescStatsReply(datapath,
type_=None,
**kwargs)
Port description reply message
The switch responds with this message to a port description request.
Attribute Description
body List of OFPPort instance
Example:
@set_ev_cls(ofp_event.EventOFPPortDescStatsReply, MAIN_DISPATCHER)
def port_desc_stats_reply_handler(self, ev):
ports = []
for p in ev.msg.body:
ports.append('port_no=%d hw_addr=%s name=%s config=0x%08x '
'state=0x%08x properties=%s' %
(p.port_no, p.hw_addr,
p.name, p.config, p.state, repr(p.properties)))
self.logger.debug('OFPPortDescStatsReply received: %s', ports)
JSON Example:
{
"OFPPortDescStatsReply": {
"body": [
{
"OFPPort": {
"config": 0,
"hw_addr": "f2:0b:a4:d0:3f:70",
"length": 168,
"name": "Port7",
"port_no": 7,
"properties": [
{
"OFPPortDescPropEthernet": {
"advertised": 10240,
"curr": 10248,
"curr_speed": 5000,
"length": 32,
"max_speed": 5000,
"peer": 10248,
"supported": 10248,
"type": 0
}
},
{
"OFPPortDescPropOptical": {
"length": 40,
"rx_grid_freq_lmda": 1500,
"rx_max_freq_lmda": 2000,
"rx_min_freq_lmda": 1000,
"supported": 1,
"tx_grid_freq_lmda": 1500,
"tx_max_freq_lmda": 2000,
"tx_min_freq_lmda": 1000,
"tx_pwr_max": 2000,
"tx_pwr_min": 1000,
"type": 1
}
},
{
"OFPPortDescPropExperimenter": {
"data": [],
"exp_type": 0,
"experimenter": 101,
"length": 12,
"type": 65535
}
},
{
"OFPPortDescPropExperimenter": {
"data": [
1
],
"exp_type": 1,
"experimenter": 101,
"length": 16,
"type": 65535
}
(continues on next page)
Attribute Description
flags Zero or OFPMPF_REQ_MORE
port_no Port number to read
queue_id ID of queue to read
Example:
def send_queue_stats_request(self, datapath):
ofp = datapath.ofproto
ofp_parser = datapath.ofproto_parser
JSON Example:
{
"OFPQueueStatsRequest": {
"flags": 0,
"port_no": 43981,
"queue_id": 4294967295,
"type": 5
}
}
Attribute Description
body List of OFPQueueStats instance
Example:
@set_ev_cls(ofp_event.EventOFPQueueStatsReply, MAIN_DISPATCHER)
def queue_stats_reply_handler(self, ev):
queues = []
for stat in ev.msg.body:
queues.append('port_no=%d queue_id=%d '
'tx_bytes=%d tx_packets=%d tx_errors=%d '
'duration_sec=%d duration_nsec=%d'
'properties=%s' %
(stat.port_no, stat.queue_id,
stat.tx_bytes, stat.tx_packets, stat.tx_errors,
stat.duration_sec, stat.duration_nsec,
repr(stat.properties)))
self.logger.debug('QueueStats: %s', queues)
JSON Example:
{
"OFPQueueStatsReply": {
"body": [
(continues on next page)
class ryu.ofproto.ofproto_v1_5_parser.OFPQueueDescStatsRequest(datapath,
flags=0,
port_no=4294967295,
queue_id=4294967295,
type_=None)
Queue description request message
The controller uses this message to query description of all the queues.
Attribute Description
flags Zero or OFPMPF_REQ_MORE
port_no Port number to read (OFPP_ANY for all ports)
queue_id ID of queue to read (OFPQ_ALL for all queues)
Example:
req = ofp_parser.OFPQueueDescStatsRequest(datapath, 0,
ofp.OFPP_ANY,
ofp.OFPQ_ALL)
datapath.send_msg(req)
JSON Example:
{
"OFPQueueDescStatsRequest": {
"flags": 0,
"port_no": 52651,
"queue_id": 57020,
"type": 15
}
}
class ryu.ofproto.ofproto_v1_5_parser.OFPQueueDescStatsReply(datapath,
type_=None,
**kwargs)
Queue description reply message
The switch responds with this message to a queue description request.
Attribute Description
body List of OFPQueueDesc instance
Example:
@set_ev_cls(ofp_event.EventOFPQueueDescStatsReply, MAIN_DISPATCHER)
def queue_desc_stats_reply_handler(self, ev):
queues = []
for q in ev.msg.body:
queues.append('port_no=%d queue_id=0x%08x properties=%s' %
(q.port_no, q.queue_id, repr(q.properties)))
self.logger.debug('OFPQueueDescStatsReply received: %s', queues)
JSON Example:
{
"OFPQueueDescStatsReply": {
"body": [
{
"OFPQueueDesc": {
"len": 32,
"port_no": 7,
"properties": [
{
"OFPQueueDescPropExperimenter": {
"data": [],
"exp_type": 0,
"experimenter": 101,
"length": 12,
"type": 65535
}
}
],
"queue_id": 0
}
},
{
"OFPQueueDesc": {
"len": 88,
"port_no": 8,
"properties": [
{
"OFPQueueDescPropMinRate": {
"length": 8,
"rate": 300,
"type": 1
}
},
{
"OFPQueueDescPropMaxRate": {
(continues on next page)
Attribute Description
flags Zero or OFPMPF_REQ_MORE
group_id ID of group to read (OFPG_ALL to all groups)
Example:
JSON Example:
{
"OFPGroupStatsRequest": {
"flags": 0,
"group_id": 4294967292,
"type": 6
}
}
Attribute Description
body List of OFPGroupStats instance
Example:
@set_ev_cls(ofp_event.EventOFPGroupStatsReply, MAIN_DISPATCHER)
def group_stats_reply_handler(self, ev):
groups = []
for stat in ev.msg.body:
groups.append('length=%d group_id=%d '
'ref_count=%d packet_count=%d byte_count=%d '
'duration_sec=%d duration_nsec=%d' %
(stat.length, stat.group_id,
stat.ref_count, stat.packet_count,
stat.byte_count, stat.duration_sec,
stat.duration_nsec))
self.logger.debug('GroupStats: %s', groups)
JSON Example:
{
"OFPGroupStatsReply": {
"body": [
{
"OFPGroupStats": {
"bucket_stats": [
{
"OFPBucketCounter": {
"byte_count": 2345,
"packet_count": 234
}
}
(continues on next page)
class ryu.ofproto.ofproto_v1_5_parser.OFPGroupDescStatsRequest(datapath,
flags=0,
group_id=4294967292,
type_=None)
Group description request message
The controller uses this message to list the set of groups on a switch.
Attribute Description
flags Zero or OFPMPF_REQ_MORE
group_id ID of group to read (OFPG_ALL to all groups)
Example:
JSON Example:
{
"OFPGroupDescStatsRequest": {
"flags": 0,
"group_id": 52651,
"type": 7
}
}
class ryu.ofproto.ofproto_v1_5_parser.OFPGroupDescStatsReply(datapath,
type_=None,
**kwargs)
Group description reply message
The switch responds with this message to a group description request.
Attribute Description
body List of OFPGroupDescStats instance
Example:
@set_ev_cls(ofp_event.EventOFPGroupDescStatsReply, MAIN_DISPATCHER)
def group_desc_stats_reply_handler(self, ev):
descs = []
for stat in ev.msg.body:
descs.append('length=%d type=%d group_id=%d '
'buckets=%s properties=%s' %
(stat.length, stat.type, stat.group_id,
stat.bucket, repr(stat.properties)))
self.logger.debug('GroupDescStats: %s', descs)
JSON Example:
{
"OFPGroupDescStatsReply": {
"body": [
{
"OFPGroupDescStats": {
"bucket_array_len": 32,
"buckets": [
{
"OFPBucket": {
"action_array_len": 16,
"actions": [
{
"OFPActionOutput": {
"len": 16,
"max_len": 65509,
"port": 1,
"type": 0
}
}
],
"bucket_id": 65535,
"len": 32,
"properties": [
{
"OFPGroupBucketPropWeight": {
"length": 8,
"type": 0,
"weight": 65535
}
}
]
}
}
],
"group_id": 1,
"length": 48,
"properties": [],
"type": 1
}
}
],
"flags": 0,
"type": 7
}
(continues on next page)
class ryu.ofproto.ofproto_v1_5_parser.OFPGroupFeaturesStatsRequest(datapath,
flags=0,
type_=None)
Group features request message
The controller uses this message to list the capabilities of groups on a switch.
Attribute Description
flags Zero or OFPMPF_REQ_MORE
Example:
def send_group_features_stats_request(self, datapath):
ofp_parser = datapath.ofproto_parser
req = ofp_parser.OFPGroupFeaturesStatsRequest(datapath, 0)
datapath.send_msg(req)
JSON Example:
{
"OFPGroupFeaturesStatsRequest": {
"flags": 0,
"type": 8
}
}
class ryu.ofproto.ofproto_v1_5_parser.OFPGroupFeaturesStatsReply(datapath,
type_=None,
**kwargs)
Group features reply message
The switch responds with this message to a group features request.
Attribute Description
body Instance of OFPGroupFeaturesStats
Example:
@set_ev_cls(ofp_event.EventOFPGroupFeaturesStatsReply, MAIN_DISPATCHER)
def group_features_stats_reply_handler(self, ev):
body = ev.msg.body
JSON Example:
{
"OFPGroupFeaturesStatsReply": {
(continues on next page)
Attribute Description
flags Zero or OFPMPF_REQ_MORE
meter_id ID of meter to read (OFPM_ALL to all meters)
Example:
JSON Example:
{
"OFPMeterStatsRequest": {
"flags": 0,
"meter_id": 4294967295,
"type": 9
}
}
Attribute Description
body List of OFPMeterStats instance
Example:
@set_ev_cls(ofp_event.EventOFPMeterStatsReply, MAIN_DISPATCHER)
def meter_stats_reply_handler(self, ev):
meters = []
for stat in ev.msg.body:
meters.append('meter_id=0x%08x len=%d ref_count=%d '
'packet_in_count=%d byte_in_count=%d '
'duration_sec=%d duration_nsec=%d '
'band_stats=%s' %
(stat.meter_id, stat.len, stat.ref_count,
stat.packet_in_count, stat.byte_in_count,
stat.duration_sec, stat.duration_nsec,
stat.band_stats))
self.logger.debug('MeterStats: %s', meters)
JSON Example:
{
"OFPMeterStatsReply": {
"body": [
{
"OFPMeterStats": {
"band_stats": [
{
"OFPMeterBandStats": {
"byte_band_count": 0,
"packet_band_count": 0
}
}
],
"byte_in_count": 0,
"duration_nsec": 480000,
"duration_sec": 0,
"ref_count": 0,
"len": 56,
"meter_id": 100,
"packet_in_count": 0
}
}
],
"flags": 0,
"type": 9
}
}
class ryu.ofproto.ofproto_v1_5_parser.OFPMeterDescStatsRequest(datapath,
flags=0, me-
ter_id=4294967295,
type_=None)
Meter description statistics request message
The controller uses this message to query configuration for one or more meters.
Attribute Description
flags Zero or OFPMPF_REQ_MORE
meter_id ID of meter to read (OFPM_ALL to all meters)
Example:
def send_meter_desc_stats_request(self, datapath):
ofp = datapath.ofproto
ofp_parser = datapath.ofproto_parser
req = ofp_parser.OFPMeterDescStatsRequest(datapath, 0,
ofp.OFPM_ALL)
datapath.send_msg(req)
JSON Example:
{
"OFPMeterDescStatsRequest": {
"flags": 0,
"meter_id": 4294967295,
"type": 10
}
}
class ryu.ofproto.ofproto_v1_5_parser.OFPMeterDescStatsReply(datapath,
type_=None,
**kwargs)
Meter description statistics reply message
The switch responds with this message to a meter description statistics request.
Attribute Description
body List of OFPMeterDescStats instance
Example:
@set_ev_cls(ofp_event.EventOFPMeterDescStatsReply, MAIN_DISPATCHER)
def meter_desc_stats_reply_handler(self, ev):
configs = []
for stat in ev.msg.body:
configs.append('length=%d flags=0x%04x meter_id=0x%08x '
'bands=%s' %
(stat.length, stat.flags, stat.meter_id,
stat.bands))
self.logger.debug('MeterDescStats: %s', configs)
JSON Example:
{
"OFPMeterDescStatsReply": {
"body": [
{
"OFPMeterDescStats": {
"bands": [
{
"OFPMeterBandDrop": {
(continues on next page)
class ryu.ofproto.ofproto_v1_5_parser.OFPMeterFeaturesStatsRequest(datapath,
flags=0,
type_=None)
Meter features statistics request message
The controller uses this message to query the set of features of the metering subsystem.
Attribute Description
flags Zero or OFPMPF_REQ_MORE
Example:
req = ofp_parser.OFPMeterFeaturesStatsRequest(datapath, 0)
datapath.send_msg(req)
JSON Example:
{
"OFPMeterFeaturesStatsRequest": {
"flags": 0,
"type": 11
}
}
class ryu.ofproto.ofproto_v1_5_parser.OFPMeterFeaturesStatsReply(datapath,
type_=None,
**kwargs)
Meter features statistics reply message
The switch responds with this message to a meter features statistics request.
Attribute Description
body List of OFPMeterFeaturesStats instance
Example:
@set_ev_cls(ofp_event.EventOFPMeterFeaturesStatsReply, MAIN_DISPATCHER)
def meter_features_stats_reply_handler(self, ev):
features = []
for stat in ev.msg.body:
features.append('max_meter=%d band_types=0x%08x '
'capabilities=0x%08x max_bands=%d '
'max_color=%d' %
(stat.max_meter, stat.band_types,
stat.capabilities, stat.max_bands,
stat.max_color))
self.logger.debug('MeterFeaturesStats: %s', features)
JSON Example:
{
"OFPMeterFeaturesStatsReply": {
"body": [
{
"OFPMeterFeaturesStats": {
"band_types": 2147483654,
"capabilities": 15,
"features": 3,
"max_bands": 255,
"max_color": 0,
"max_meter": 16777216
}
}
],
"flags": 0,
"type": 11
}
}
class ryu.ofproto.ofproto_v1_5_parser.OFPControllerStatusStatsRequest(datapath,
flags=0,
type_=None)
Controller status multipart request message
The controller uses this message to request the status, the roles and the control channels of other controllers
configured on the switch.
Attribute Description
flags Zero or OFPMPF_REQ_MORE
Example:
req = ofp_parser.OFPPortDescStatsRequest(datapath, 0)
datapath.send_msg(req)
JSON Example:
{
"OFPControllerStatusStatsRequest": {
(continues on next page)
class ryu.ofproto.ofproto_v1_5_parser.OFPControllerStatusStatsReply(datapath,
type_=None,
**kwargs)
Controller status multipart reply message
The switch responds with this message to a controller status multipart request.
Attribute Description
body List of OFPControllerStatus instance
Example:
@set_ev_cls(ofp_event.EventOFPControllerStatusStatsReply,
MAIN_DISPATCHER)
def controller_status_multipart_reply_handler(self, ev):
status = []
for s in ev.msg.body:
status.append('short_id=%d role=%d reason=%d '
'channel_status=%d properties=%s' %
(s.short_id, s.role, s.reason,
s.channel_status, repr(s.properties)))
self.logger.debug('OFPControllerStatusStatsReply received: %s',
status)
JSON Example:
{
"OFPControllerStatusStatsReply": {
"body": [
{
"OFPControllerStatusStats": {
"channel_status": 1,
"length": 48,
"properties": [
{
"OFPControllerStatusPropUri": {
"length": 26,
"type": 0,
"uri": "tls:192.168.34.23:6653"
}
}
],
"reason": 1,
"role": 1,
"short_id": 65535
}
}
],
"flags": 0,
"type": 18
(continues on next page)
Attribute Description
flags Zero or OFPMPF_REQ_MORE
Example:
req = ofp_parser.OFPTableStatsRequest(datapath, 0)
datapath.send_msg(req)
JSON Example:
{
"OFPTableStatsRequest": {
"flags": 0,
"type": 3
}
}
Attribute Description
body List of OFPTableStats instance
Example:
@set_ev_cls(ofp_event.EventOFPTableStatsReply, MAIN_DISPATCHER)
def table_stats_reply_handler(self, ev):
tables = []
for stat in ev.msg.body:
tables.append('table_id=%d active_count=%d lookup_count=%d '
' matched_count=%d' %
(stat.table_id, stat.active_count,
stat.lookup_count, stat.matched_count))
self.logger.debug('TableStats: %s', tables)
JSON Example:
{
"OFPTableStatsReply": {
"body": [
(continues on next page)
class ryu.ofproto.ofproto_v1_5_parser.OFPTableDescStatsRequest(datapath,
flags=0,
type_=None)
Table description request message
The controller uses this message to query description of all the tables.
Attribute Description
flags Zero or OFPMPF_REQ_MORE
Example:
req = ofp_parser.OFPTableDescStatsRequest(datapath, 0)
datapath.send_msg(req)
JSON Example:
{
"OFPTableDescStatsRequest": {
"flags": 0,
"type": 14
}
}
class ryu.ofproto.ofproto_v1_5_parser.OFPTableDescStatsReply(datapath,
type_=None,
**kwargs)
Table description reply message
The switch responds with this message to a table description request.
Attribute Description
body List of OFPTableDesc instance
Example:
@set_ev_cls(ofp_event.EventOFPTableDescStatsReply, MAIN_DISPATCHER)
def table_desc_stats_reply_handler(self, ev):
tables = []
for p in ev.msg.body:
tables.append('table_id=%d config=0x%08x properties=%s' %
(p.table_id, p.config, repr(p.properties)))
self.logger.debug('OFPTableDescStatsReply received: %s', tables)
JSON Example:
{
"OFPTableDescStatsReply": {
"body": [
{
"OFPTableDesc": {
"config": 0,
"length": 24,
"properties": [
{
"OFPTableModPropExperimenter": {
"data": [],
"exp_type": 0,
"experimenter": 101,
"length": 12,
"type": 65535
}
}
],
"table_id": 7
}
},
{
"OFPTableDesc": {
"config": 0,
"length": 80,
"properties": [
{
"OFPTableModPropEviction": {
"flags": 0,
"length": 8,
"type": 2
}
},
{
"OFPTableModPropVacancy": {
"length": 8,
"type": 3,
"vacancy": 0,
"vacancy_down": 0,
"vacancy_up": 0
}
},
(continues on next page)
class ryu.ofproto.ofproto_v1_5_parser.OFPTableFeaturesStatsRequest(datapath,
flags=0,
body=None,
type_=None)
Table features statistics request message
The controller uses this message to query table features.
Attribute Description
body List of OFPTableFeaturesStats instances. The default is [].
JSON Example:
{
"OFPTableFeaturesStatsRequest": {
"body": [
{
"OFPTableFeaturesStats": {
"capabilities": 4,
"command": 1,
"features": 1,
"length": 80,
"max_entries": 255,
"metadata_match": 18446744073709551615,
"metadata_write": 18446744073709551615,
"name": "table1",
"properties": [
{
"OFPTableFeaturePropOxmValues": {
"length": 14,
"oxm_values": [
{
"OXMTlv": {
"field": "eth_src",
"mask": null,
"value": "aa:bb:cc:dd:ee:ff"
}
}
],
"type": 22
}
}
],
"table_id": 1
}
}
],
"flags": 0,
"type": 12
}
}
class ryu.ofproto.ofproto_v1_5_parser.OFPTableFeaturesStatsReply(datapath,
type_=None,
**kwargs)
Table features statistics reply message
The switch responds with this message to a table features statistics request.
Attribute Description
body List of OFPTableFeaturesStats instance
JSON Example:
{
"OFPTableFeaturesStatsReply": {
"body": [
{
"OFPTableFeaturesStats": {
"capabilities": 4,
(continues on next page)
Attribute Description
flags Zero or OFPMPF_REQ_MORE
monitor_id Controller-assigned ID for this monitor
out_port Require matching entries to include this as an output
port
out_group Require matching entries to include this as an output
group
monitor_flags Bitmap of the following flags.
OFPFMF_INITIAL
OFPFMF_ADD
OFPFMF_REMOVED
OFPFMF_MODIFY
OFPFMF_INSTRUCTIONS
OFPFMF_NO_ABBREV
OFPFMF_ONLY_OWN
OFPFMC_ADD
OFPFMC_MODIFY
OFPFMC_DELETE
Example:
JSON Example:
{
"OFPFlowMonitorRequest": {
"command": 0,
"flags": 0,
"match": {
"OFPMatch": {
"length": 14,
"oxm_fields": [
{
"OXMTlv": {
(continues on next page)
Attribute Description
body List of list of the following class instance.
OFPFlowMonitorFull
OFPFlowMonitorAbbrev
OFPFlowMonitorPaused
Example:
@set_ev_cls(ofp_event.EventOFPFlowMonitorReply, MAIN_DISPATCHER)
def flow_monitor_reply_handler(self, ev):
msg = ev.msg
dp = msg.datapath
ofp = dp.ofproto
flow_updates = []
JSON Example:
{
"OFPFlowMonitorReply": {
"body": [
{
"OFPFlowUpdateFull": {
"cookie": 0,
"event": 0,
"hard_timeout": 700,
"idle_timeout": 600,
"instructions": [
{
"OFPInstructionActions": {
"actions": [
{
"OFPActionOutput": {
"len": 16,
"max_len": 0,
"port": 4294967290,
"type": 0
}
}
],
"len": 24,
"type": 4
}
}
],
"length": 64,
"match": {
"OFPMatch": {
"length": 10,
"oxm_fields": [
{
"OXMTlv": {
"field": "eth_type",
"mask": null,
"value": 2054
}
}
],
"type": 1
}
},
"priority": 3,
"reason": 0,
"table_id": 0
}
},
{
"OFPFlowUpdateAbbrev": {
(continues on next page)
class ryu.ofproto.ofproto_v1_5_parser.OFPBundleFeaturesStatsRequest(datapath,
flags=0,
fea-
ture_request_flags=0,
proper-
ties=None,
type_=None)
Bundle features request message
The controller uses this message to query a switch about its bundle capabilities, including whether it supports
atomic bundles, ordered bundles, and scheduled bundles.
Attribute Description
flags Zero or OFPMPF_REQ_MORE
feature_request_flags Bitmap of the following flags.
OFPBF_TIMESTAMP
OFPBF_TIME_SET_SCHED
Example:
req = ofp_parser.OFPBundleFeaturesStatsRequest(datapath, 0)
datapath.send_msg(req)
JSON Example:
{
"OFPBundleFeaturesStatsRequest": {
"feature_request_flags": 3,
"flags": 0,
(continues on next page)
class ryu.ofproto.ofproto_v1_5_parser.OFPBundleFeaturesStatsReply(datapath,
type_=None,
**kwargs)
Bundle features reply message
The switch responds with this message to a bundle features request.
Attribute Description
body Instance of OFPBundleFeaturesStats
Example:
@set_ev_cls(ofp_event.EventOFPBundleFeaturesStatsReply, MAIN_DISPATCHER)
def bundle_features_stats_reply_handler(self, ev):
body = ev.msg.body
JSON Example:
{
"OFPBundleFeaturesStatsReply": {
"body": {
"OFPBundleFeaturesStats": {
"capabilities": 7,
"properties": [
{
"OFPBundleFeaturesPropTime": {
"length": 72,
"sched_accuracy": {
"OFPTime": {
"nanoseconds": 1717986918,
"seconds": 6148914691236517205
}
},
"sched_max_future": {
"OFPTime": {
"nanoseconds": 2290649224,
"seconds": 8608480567731124087
}
},
"sched_max_past": {
"OFPTime": {
"nanoseconds": 2863311530,
"seconds": 11068046444225730969
}
},
"timestamp": {
"OFPTime": {
"nanoseconds": 3435973836,
"seconds": 13527612320720337851
}
},
"type": 1
}
}
]
}
},
"flags": 0,
"type": 19
}
}
class ryu.ofproto.ofproto_v1_5_parser.OFPExperimenterStatsRequest(datapath,
flags, ex-
perimenter,
exp_type,
data,
type_=None)
Experimenter multipart request message
Attribute Description
flags Zero or OFPMPF_REQ_MORE
experimenter Experimenter ID
exp_type Experimenter defined
data Experimenter defined additional data
JSON Example:
{
"OFPExperimenterStatsRequest": {
"data": "aG9nZWhvZ2U=",
"exp_type": 3405678728,
"experimenter": 3735928495,
"flags": 0,
"type": 65535
}
}
class ryu.ofproto.ofproto_v1_5_parser.OFPExperimenterStatsReply(datapath,
type_=None,
**kwargs)
Experimenter multipart reply message
Attribute Description
body An OFPExperimenterMultipart instance
JSON Example:
{
"OFPExperimenterStatsReply": {
"body": {
"OFPExperimenterMultipart": {
"data": "dGVzdGRhdGE5OTk5OTk5OQ==",
"exp_type": 3405674359,
"experimenter": 3735928495
}
},
"flags": 0,
"type": 65535
}
}
Packet-Out Message
Attribute Description
buffer_id ID assigned by datapath (OFP_NO_BUFFER if none)
match Instance of OFPMatch (in_port is mandatory in the match field)
actions list of OpenFlow action class
data Packet data of a binary type value or an instances of packet.Packet.
Example:
match = OFPMatch(in_port=in_port)
actions = [ofp_parser.OFPActionOutput(ofp.OFPP_FLOOD, 0)]
req = ofp_parser.OFPPacketOut(datapath, buffer_id,
match, actions)
datapath.send_msg(req)
JSON Example:
{
"OFPPacketOut": {
"actions": [
{
"OFPActionOutput": {
"len": 16,
"max_len": 65535,
"port": 4294967291,
"type": 0
}
}
],
"actions_len": 16,
"buffer_id": 4294967295,
"data": "dGVzdA==",
"match": {
"OFPMatch": {
"length": 12,
"oxm_fields": [
{
"OXMTlv": {
"field": "in_port",
"mask": null,
"value": 4294967040
}
}
],
"type": 1
}
}
}
}
Barrier Message
class ryu.ofproto.ofproto_v1_5_parser.OFPBarrierRequest(datapath)
Barrier request message
The controller sends this message to ensure message dependencies have been met or receive notifications for
completed operations.
Example:
req = ofp_parser.OFPBarrierRequest(datapath)
datapath.send_msg(req)
JSON Example:
{
"OFPBarrierRequest": {}
}
class ryu.ofproto.ofproto_v1_5_parser.OFPBarrierReply(datapath)
Barrier reply message
The switch responds with this message to a barrier request.
Example:
@set_ev_cls(ofp_event.EventOFPBarrierReply, MAIN_DISPATCHER)
def barrier_reply_handler(self, ev):
self.logger.debug('OFPBarrierReply received')
JSON Example:
{
"OFPBarrierReply": {}
}
Attribute Description
role One of the following values.
OFPCR_ROLE_NOCHANGE
OFPCR_ROLE_EQUAL
OFPCR_ROLE_MASTER
OFPCR_ROLE_SLAVE
Example:
def send_role_request(self, datapath):
ofp = datapath.ofproto
(continues on next page)
JSON Example:
{
"OFPRoleRequest": {
"generation_id": 1234605616436508552,
"role": 1,
"short_id": 43690
}
}
Attribute Description
role One of the following values.
OFPCR_ROLE_NOCHANGE
OFPCR_ROLE_EQUAL
OFPCR_ROLE_MASTER
OFPCR_ROLE_SLAVE
Example:
@set_ev_cls(ofp_event.EventOFPRoleReply, MAIN_DISPATCHER)
def role_reply_handler(self, ev):
msg = ev.msg
dp = msg.datapath
ofp = dp.ofproto
if msg.role == ofp.OFPCR_ROLE_NOCHANGE:
role = 'NOCHANGE'
elif msg.role == ofp.OFPCR_ROLE_EQUAL:
role = 'EQUAL'
elif msg.role == ofp.OFPCR_ROLE_MASTER:
role = 'MASTER'
elif msg.role == ofp.OFPCR_ROLE_SLAVE:
role = 'SLAVE'
else:
role = 'unknown'
JSON Example:
{
"OFPRoleReply": {
"generation_id": 1234605616436508552,
"role": 1,
"short_id": 43690
}
}
Bundle Messages
Attribute Description
bundle_id Id of the bundle
type One of the following values.
OFPBCT_OPEN_REQUEST
OFPBCT_OPEN_REPLY
OFPBCT_CLOSE_REQUEST
OFPBCT_CLOSE_REPLY
OFPBCT_COMMIT_REQUEST
OFPBCT_COMMIT_REPLY
OFPBCT_DISCARD_REQUEST
OFPBCT_DISCARD_REPLY
OFPBF_ATOMIC
OFPBF_ORDERED
Example:
req = ofp_parser.OFPBundleCtrlMsg(datapath, 7,
ofp.OFPBCT_OPEN_REQUEST,
(continues on next page)
JSON Example:
{
"OFPBundleCtrlMsg": {
"bundle_id": 99999999,
"flags": 1,
"properties": [],
"type": 1
}
}
Attribute Description
bundle_id Id of the bundle
flags Bitmap of the following flags.
OFPBF_ATOMIC
OFPBF_ORDERED
Example:
def send_bundle_add_message(self, datapath):
ofp = datapath.ofproto
ofp_parser = datapath.ofproto_parser
JSON Example:
{
"OFPBundleAddMsg": {
"bundle_id": 99999999,
"flags": 1,
"message": {
"OFPFlowMod": {
"buffer_id": 0,
"command": 0,
"cookie": 1311768467463790320,
"cookie_mask": 18446744073709551615,
"flags": 0,
(continues on next page)
Attribute Description
properties List of OFPAsyncConfigProp subclass instances
Example:
def send_set_async(self, datapath):
ofp = datapath.ofproto
ofp_parser = datapath.ofproto_parser
properties = [
ofp_parser.OFPAsyncConfigPropReasons(
ofp.OFPACPT_PACKET_IN_SLAVE, 8,
(1 << ofp.OFPR_APPLY_ACTION
| 1 << ofp.OFPR_INVALID_TTL))]
req = ofp_parser.OFPSetAsync(datapath, properties)
datapath.send_msg(req)
JSON Example:
{
"OFPSetAsync": {
"properties": [
{
"OFPAsyncConfigPropReasons": {
"length": 8,
"mask": 3,
"type": 0
(continues on next page)
class ryu.ofproto.ofproto_v1_5_parser.OFPGetAsyncRequest(datapath)
Get asynchronous configuration request message
The controller uses this message to query the asynchronous message.
Example:
def send_get_async_request(self, datapath):
ofp_parser = datapath.ofproto_parser
req = ofp_parser.OFPGetAsyncRequest(datapath)
datapath.send_msg(req)
JSON Example:
{
"OFPGetAsyncRequest": {}
}
Attribute Description
properties List of OFPAsyncConfigProp subclass instances
Example:
@set_ev_cls(ofp_event.EventOFPGetAsyncReply, MAIN_DISPATCHER)
def get_async_reply_handler(self, ev):
msg = ev.msg
JSON Example:
{
"OFPGetAsyncReply": {
"properties": [
{
"OFPAsyncConfigPropReasons": {
"length": 8,
"mask": 3,
"type": 0
}
},
{
"OFPAsyncConfigPropReasons": {
"length": 8,
"mask": 3,
"type": 1
}
},
{
"OFPAsyncConfigPropReasons": {
"length": 8,
(continues on next page)
Asynchronous Messages
Packet-In Message
The switch sends the packet that received to the controller by this message.
Attribute Description
buffer_id ID assigned by datapath
total_len Full length of frame
reason Reason packet is being sent.
OFPR_TABLE_MISS
OFPR_APPLY_ACTION
OFPR_INVALID_TTL
OFPR_ACTION_SET
OFPR_GROUP
OFPR_PACKET_OUT
Example:
@set_ev_cls(ofp_event.EventOFPPacketIn, MAIN_DISPATCHER)
def packet_in_handler(self, ev):
msg = ev.msg
dp = msg.datapath
ofp = dp.ofproto
if msg.reason == ofp.TABLE_MISS:
reason = 'TABLE MISS'
elif msg.reason == ofp.OFPR_APPLY_ACTION:
reason = 'APPLY ACTION'
elif msg.reason == ofp.OFPR_INVALID_TTL:
reason = 'INVALID TTL'
elif msg.reason == ofp.OFPR_ACTION_SET:
reason = 'ACTION SET'
elif msg.reason == ofp.OFPR_GROUP:
reason = 'GROUP'
elif msg.reason == ofp.OFPR_PACKET_OUT:
reason = 'PACKET OUT'
else:
reason = 'unknown'
JSON Example:
{
"OFPPacketIn": {
"buffer_id": 200,
"cookie": 0,
(continues on next page)
Attribute Description
table_id ID of the table
reason One of the following values.
OFPRR_IDLE_TIMEOUT
OFPRR_HARD_TIMEOUT
OFPRR_DELETE
OFPRR_GROUP_DELETE
OFPRR_METER_DELETE
OFPRR_EVICTION
Example:
@set_ev_cls(ofp_event.EventOFPFlowRemoved, MAIN_DISPATCHER)
def flow_removed_handler(self, ev):
msg = ev.msg
dp = msg.datapath
ofp = dp.ofproto
if msg.reason == ofp.OFPRR_IDLE_TIMEOUT:
reason = 'IDLE TIMEOUT'
elif msg.reason == ofp.OFPRR_HARD_TIMEOUT:
reason = 'HARD TIMEOUT'
elif msg.reason == ofp.OFPRR_DELETE:
reason = 'DELETE'
elif msg.reason == ofp.OFPRR_GROUP_DELETE:
reason = 'GROUP DELETE'
elif msg.reason == ofp.OFPRR_METER_DELETE:
reason = 'METER DELETE'
elif msg.reason == ofp.OFPRR_EVICTION:
reason = 'EVICTION'
else:
reason = 'unknown'
JSON Example:
{
"OFPFlowRemoved": {
"cookie": 1234605616436508552,
(continues on next page)
Attribute Description
reason One of the following values.
OFPPR_ADD
OFPPR_DELETE
OFPPR_MODIFY
Example:
@set_ev_cls(ofp_event.EventOFPPortStatus, MAIN_DISPATCHER)
def port_status_handler(self, ev):
msg = ev.msg
dp = msg.datapath
ofp = dp.ofproto
if msg.reason == ofp.OFPPR_ADD:
reason = 'ADD'
elif msg.reason == ofp.OFPPR_DELETE:
reason = 'DELETE'
elif msg.reason == ofp.OFPPR_MODIFY:
reason = 'MODIFY'
else:
reason = 'unknown'
JSON Example:
{
"OFPPortStatus": {
"desc": {
"OFPPort": {
"config": 0,
"hw_addr": "f2:0b:a4:d0:3f:70",
"length": 168,
"name": "\u79c1\u306e\u30dd\u30fc\u30c8",
"port_no": 7,
"properties": [
{
"OFPPortDescPropEthernet": {
"advertised": 10240,
"curr": 10248,
"curr_speed": 5000,
"length": 32,
"max_speed": 5000,
"peer": 10248,
"supported": 10248,
"type": 0
}
},
{
"OFPPortDescPropOptical": {
"length": 40,
"rx_grid_freq_lmda": 1500,
"rx_max_freq_lmda": 2000,
"rx_min_freq_lmda": 1000,
"supported": 1,
"tx_grid_freq_lmda": 1500,
"tx_max_freq_lmda": 2000,
"tx_min_freq_lmda": 1000,
"tx_pwr_max": 2000,
"tx_pwr_min": 1000,
"type": 1
}
},
(continues on next page)
Attribute Description
role One of the following values.
OFPCR_ROLE_NOCHANGE
OFPCR_ROLE_EQUAL
OFPCR_ROLE_MASTER
OFPCRR_MASTER_REQUEST
OFPCRR_CONFIG
OFPCRR_EXPERIMENTER
Example:
@set_ev_cls(ofp_event.EventOFPRoleStatus, MAIN_DISPATCHER)
def role_status_handler(self, ev):
msg = ev.msg
dp = msg.datapath
ofp = dp.ofproto
if msg.role == ofp.OFPCR_ROLE_NOCHANGE:
role = 'ROLE NOCHANGE'
elif msg.role == ofp.OFPCR_ROLE_EQUAL:
role = 'ROLE EQUAL'
elif msg.role == ofp.OFPCR_ROLE_MASTER:
role = 'ROLE MASTER'
else:
role = 'unknown'
if msg.reason == ofp.OFPCRR_MASTER_REQUEST:
reason = 'MASTER REQUEST'
elif msg.reason == ofp.OFPCRR_CONFIG:
reason = 'CONFIG'
elif msg.reason == ofp.OFPCRR_EXPERIMENTER:
reason = 'EXPERIMENTER'
else:
reason = 'unknown'
JSON Example:
{
"OFPRoleStatus": {
"generation_id": 17356517385562371090,
"properties": [],
"reason": 0,
"role": 3
}
(continues on next page)
Attribute Description
reason One of the following values.
OFPTR_VACANCY_DOWN
OFPTR_VACANCY_UP
Example:
@set_ev_cls(ofp_event.EventOFPTableStatus, MAIN_DISPATCHER)
def table(self, ev):
msg = ev.msg
dp = msg.datapath
ofp = dp.ofproto
if msg.reason == ofp.OFPTR_VACANCY_DOWN:
reason = 'VACANCY_DOWN'
elif msg.reason == ofp.OFPTR_VACANCY_UP:
reason = 'VACANCY_UP'
else:
reason = 'unknown'
JSON Example:
{
"OFPTableStatus": {
"reason": 3,
"table": {
"OFPTableDesc": {
"config": 0,
"length": 80,
"properties": [
{
"OFPTableModPropEviction": {
"flags": 0,
"length": 8,
"type": 2
(continues on next page)
Attribute Description
request OFPGroupMod or OFPMeterMod instance
Example:
@set_ev_cls(ofp_event.EventOFPRequestForward, MAIN_DISPATCHER)
def request_forward_handler(self, ev):
msg = ev.msg
dp = msg.datapath
ofp = dp.ofproto
if msg.request.msg_type == ofp.OFPT_GROUP_MOD:
self.logger.debug(
'OFPRequestForward received: request=OFPGroupMod('
'command=%d, type=%d, group_id=%d, command_bucket_id=%d, '
'buckets=%s, properties=%s)',
msg.request.command, msg.request.type,
msg.request.group_id, msg.request.command_bucket_id,
msg.request.buckets, repr(msg.request.properties))
elif msg.request.msg_type == ofp.OFPT_METER_MOD:
self.logger.debug(
'OFPRequestForward received: request=OFPMeterMod('
'command=%d, flags=%d, meter_id=%d, bands=%s)',
msg.request.command, msg.request.flags,
msg.request.meter_id, msg.request.bands)
else:
self.logger.debug(
'OFPRequestForward received: request=Unknown')
JSON Example:
{
"OFPRequestForward": {
"request": {
"OFPGroupMod": {
"bucket_array_len": 56,
"buckets": [
{
"OFPBucket": {
"action_array_len": 24,
"actions": [
{
"OFPActionPopVlan": {
"len": 8,
"type": 18
}
},
{
"OFPActionSetField": {
"field": {
"OXMTlv": {
"field": "ipv4_dst",
"mask": null,
"value": "192.168.2.9"
}
},
"len": 16,
(continues on next page)
Attribute Description
status OFPControllerStatusStats instance
Example:
@set_ev_cls(ofp_event.EventOFPControllerStatus, MAIN_DISPATCHER)
def table(self, ev):
msg = ev.msg
dp = msg.datapath
ofp = dp.ofproto
status = msg.status
if status.role == ofp.OFPCR_ROLE_NOCHANGE:
role = 'NOCHANGE'
elif status.role == ofp.OFPCR_ROLE_EQUAL:
role = 'EQUAL'
elif status.role == ofp.OFPCR_ROLE_MASTER:
role = 'MASTER'
elif status.role == ofp.OFPCR_ROLE_SLAVE:
role = 'SLAVE'
else:
role = 'unknown'
if status.reason == ofp.OFPCSR_REQUEST:
reason = 'REQUEST'
elif status.reason == ofp.OFPCSR_CHANNEL_STATUS:
reason = 'CHANNEL_STATUS'
elif status.reason == ofp.OFPCSR_ROLE:
reason = 'ROLE'
elif status.reason == ofp.OFPCSR_CONTROLLER_ADDED:
reason = 'CONTROLLER_ADDED'
elif status.reason == ofp.OFPCSR_CONTROLLER_REMOVED:
reason = 'CONTROLLER_REMOVED'
elif status.reason == ofp.OFPCSR_SHORT_ID:
reason = 'SHORT_ID'
elif status.reason == ofp.OFPCSR_EXPERIMENTER:
reason = 'EXPERIMENTER'
else:
reason = 'unknown'
if status.channel_status == OFPCT_STATUS_UP:
channel_status = 'UP'
if status.channel_status == OFPCT_STATUS_DOWN:
channel_status = 'DOWN'
else:
channel_status = 'unknown'
JSON Example:
{
"OFPControllerStatus": {
"status": {
"OFPControllerStatusStats": {
"channel_status": 1,
"length": 48,
"properties": [
(continues on next page)
Symmetric Messages
Hello
Attribute Description
elements list of OFPHelloElemVersionBitmap instance
JSON Example:
{
"OFPHello": {
"elements": [
{
"OFPHelloElemVersionBitmap": {
"length": 8,
"type": 1,
"versions": [
6
]
}
}
]
}
}
class ryu.ofproto.ofproto_v1_5_parser.OFPHelloElemVersionBitmap(versions,
type_=None,
length=None)
Version bitmap Hello Element
Attribute Description
versions list of versions of OpenFlow protocol a device supports
Echo Request
Attribute Description
data An arbitrary length data
Example:
def send_echo_request(self, datapath, data):
ofp_parser = datapath.ofproto_parser
@set_ev_cls(ofp_event.EventOFPEchoRequest,
[HANDSHAKE_DISPATCHER, CONFIG_DISPATCHER, MAIN_DISPATCHER])
def echo_request_handler(self, ev):
self.logger.debug('OFPEchoRequest received: data=%s',
utils.hex_array(ev.msg.data))
JSON Example:
{
"OFPEchoRequest": {
"data": ""
}
}
Echo Reply
Attribute Description
data An arbitrary length data
Example:
def send_echo_reply(self, datapath, data):
ofp_parser = datapath.ofproto_parser
@set_ev_cls(ofp_event.EventOFPEchoReply,
[HANDSHAKE_DISPATCHER, CONFIG_DISPATCHER, MAIN_DISPATCHER])
def echo_reply_handler(self, ev):
self.logger.debug('OFPEchoReply received: data=%s',
utils.hex_array(ev.msg.data))
JSON Example:
{
"OFPEchoReply": {
"data": ""
}
}
Error Message
Attribute Description
type High level type of error
code Details depending on the type
data Variable length data depending on the type and code
Type Code
OFPET_HELLO_FAILED OFPHFC_*
OFPET_BAD_REQUEST OFPBRC_*
OFPET_BAD_ACTION OFPBAC_*
OFPET_BAD_INSTRUCTION OFPBIC_*
OFPET_BAD_MATCH OFPBMC_*
OFPET_FLOW_MOD_FAILED OFPFMFC_*
OFPET_GROUP_MOD_FAILED OFPGMFC_*
OFPET_PORT_MOD_FAILED OFPPMFC_*
OFPET_TABLE_MOD_FAILED OFPTMFC_*
OFPET_QUEUE_OP_FAILED OFPQOFC_*
OFPET_SWITCH_CONFIG_FAILED OFPSCFC_*
OFPET_ROLE_REQUEST_FAILED OFPRRFC_*
OFPET_METER_MOD_FAILED OFPMMFC_*
OFPET_TABLE_FEATURES_FAILED OFPTFFC_*
OFPET_EXPERIMENTER N/A
Attribute Description
exp_type Experimenter defined type
experimenter Experimenter ID
Example:
@set_ev_cls(ofp_event.EventOFPErrorMsg,
[HANDSHAKE_DISPATCHER, CONFIG_DISPATCHER, MAIN_DISPATCHER])
def error_msg_handler(self, ev):
msg = ev.msg
JSON Example:
{
"OFPErrorMsg": {
"code": 6,
"data": "Bg4ACAAAAAA=",
"type": 4
}
}
Experimenter
Attribute Description
experimenter Experimenter ID
exp_type Experimenter defined
data Experimenter defined arbitrary additional data
JSON Example:
{
"OFPErrorMsg": {
"code": null,
"data": "amlra2VuIGRhdGE=",
"exp_type": 60000,
"experimenter": 999999,
"type": 65535
}
}
Port Structures
Attribute Description
port_no Port number and it uniquely identifies a port within a
switch.
length Length of ofp_port (excluding padding).
hw_addr MAC address for the port.
name Null-terminated string containing a human-readable
name for the interface.
config Bitmap of port configration flags.
OFPPC_PORT_DOWN
OFPPC_NO_RECV
OFPPC_NO_FWD
OFPPC_NO_PACKET_IN
OFPPS_LINK_DOWN
OFPPS_BLOCKED
OFPPS_LIVE
Example:
>>> # compose
>>> match = parser.OFPMatch(
... in_port=1,
... eth_type=0x86dd,
... ipv6_src=('2001:db8:bd05:1d2:288a:1fc0:1:10ee',
... 'ffff:ffff:ffff:ffff::'),
... ipv6_dst='2001:db8:bd05:1d2:288a:1fc0:1:10ee')
>>> # query
>>> if 'ipv6_src' in match:
... print match['ipv6_src']
...
('2001:db8:bd05:1d2:288a:1fc0:1:10ee', 'ffff:ffff:ffff:ffff::')
Note: For the list of the supported Nicira experimenter matches, please refer to ryu.ofproto.nx_match.
Note: For VLAN id match field, special values are defined in OpenFlow Spec.
1) Packets with and without a VLAN tag
• Example:
match = parser.OFPMatch()
• Packet Matching
non-VLAN-tagged MATCH
VLAN-tagged(vlan_id=3) MATCH
VLAN-tagged(vlan_id=5) MATCH
• Packet Matching
non-VLAN-tagged MATCH
VLAN-tagged(vlan_id=3) x
VLAN-tagged(vlan_id=5) x
• Packet Matching
non-VLAN-tagged x
VLAN-tagged(vlan_id=3) MATCH
VLAN-tagged(vlan_id=5) MATCH
• Packet Matching
non-VLAN-tagged x
VLAN-tagged(vlan_id=3) MATCH
VLAN-tagged(vlan_id=5) x
Example:
>>> # compose
>>> stats = parser.OFPStats(
... packet_count=100,
... duration=(100, 200)
>>> # query
>>> if 'duration' in stats:
... print stats['duration']
...
(100, 200)
class ryu.ofproto.ofproto_v1_5_parser.OFPInstructionGotoTable(table_id,
type_=None,
len_=None)
Goto table instruction
This instruction indicates the next table in the processing pipeline.
Attribute Description
table_id Next table
class ryu.ofproto.ofproto_v1_5_parser.OFPInstructionWriteMetadata(metadata,
meta-
data_mask,
type_=None,
len_=None)
Write metadata instruction
This instruction writes the masked metadata value into the metadata field.
Attribute Description
metadata Metadata value to write
metadata_mask Metadata write bitmask
Attribute Description
type One of following values.
OFPIT_WRITE_ACTIONS
OFPIT_APPLY_ACTIONS
OFPIT_CLEAR_ACTIONS
Attribute Description
flags Bitmap of the following flags.
OFPSTF_PERIODIC
OFPSTF_ONLY_FIRST
Action Structures
Attribute Description
port Output port
max_len Max length to send to controller
class ryu.ofproto.ofproto_v1_5_parser.OFPActionCopyTtlOut(type_=None,
len_=None)
Copy TTL Out action
This action copies the TTL from the next-to-outermost header with TTL to the outermost header with TTL.
class ryu.ofproto.ofproto_v1_5_parser.OFPActionCopyTtlIn(type_=None,
len_=None)
Copy TTL In action
This action copies the TTL from the outermost header with TTL to the next-to-outermost header with TTL.
class ryu.ofproto.ofproto_v1_5_parser.OFPActionSetMplsTtl(mpls_ttl, type_=None,
len_=None)
Set MPLS TTL action
Attribute Description
mpls_ttl MPLS TTL
class ryu.ofproto.ofproto_v1_5_parser.OFPActionDecMplsTtl(type_=None,
len_=None)
Decrement MPLS TTL action
This action decrements the MPLS TTL.
class ryu.ofproto.ofproto_v1_5_parser.OFPActionPushVlan(ethertype=33024,
type_=None, len_=None)
Push VLAN action
This action pushes a new VLAN tag to the packet.
Attribute Description
ethertype Ether type. The default is 802.1Q. (0x8100)
Attribute Description
ethertype Ether type
class ryu.ofproto.ofproto_v1_5_parser.OFPActionPopMpls(ethertype=2048,
type_=None, len_=None)
Pop MPLS action
This action pops the MPLS header from the packet.
class ryu.ofproto.ofproto_v1_5_parser.OFPActionSetQueue(queue_id, type_=None,
len_=None)
Set queue action
This action sets the queue id that will be used to map a flow to an already-configured queue on a port.
Attribute Description
queue_id Queue ID for the packets
Attribute Description
group_id Group identifier
Attribute Description
nw_ttl IP TTL
set_field = OFPActionSetField(eth_src="00:00:00:00:00:00")
set_field = OFPActionSetField(ipv4_src=("192.168.100.0",
"255.255.255.0"))
Attribute Description
ethertype Ether type
At- Description
tribute
n_bits Number of bits to copy.
src_offset
Starting bit offset in source.
dst_offset
Starting bit offset in destination.
oxm_idsList of OFPOxmId instances. The first element of this list, src_oxm_id, identifies the field where the
value is copied from. The second element of this list, dst_oxm_id, identifies the field where the value
is copied to. The default is [].
Attribute Description
meter_id Meter instance
class ryu.ofproto.ofproto_v1_5_parser.OFPActionExperimenter(experimenter)
Experimenter action
This action is an extensible action for the experimenter.
Attribute Description
experimenter Experimenter ID
Note: For the list of the supported Nicira experimenter actions, please refer to ryu.ofproto.nx_actions.
class ryu.ofproto.ofproto_v1_5_parser.OFPControllerStatusStats(short_id=None,
role=None, rea-
son=None,
chan-
nel_status=None,
proper-
ties=None,
length=None)
Controller status structure
Attribute Description
length Length of this entry.
short_id ID number which identifies the controller.
role Bitmap of controller’s role flags.
OFPCR_ROLE_NOCHANGE
OFPCR_ROLE_EQUAL
OFPCR_ROLE_MASTER
OFPCR_ROLE_SLAVE
OFPCSR_REQUEST
OFPCSR_CHANNEL_STATUS
OFPCSR_ROLE
OFPCSR_CONTROLLER_ADDED
OFPCSR_CONTROLLER_REMOVED
OFPCSR_SHORT_ID
OFPCSR_EXPERIMENTER
OFPCT_STATUS_UP
OFPCT_STATUS_DOWN
set_queue:queue
Attribute Description
queue_id Queue ID for the packets
Example:
actions += [parser.NXActionSetQueue(queue_id=10)]
dec_ttl
Example:
actions += [parser.NXActionDecTtl()]
push_mpls:ethertype
Attribute Description
ethertype Ether type(The value must be either 0x8847 or 0x8848)
Example:
match = parser.OFPMatch(dl_type=0x0800)
actions += [parser.NXActionPushMpls(ethertype=0x8847)]
pop_mpls:ethertype
Attribute Description
ethertype Ether type
Example:
match = parser.OFPMatch(dl_type=0x8847)
actions += [parser.NXActionPushMpls(ethertype=0x0800)]
set_mpls_ttl:ttl
Attribute Description
ttl MPLS TTL
Example:
actions += [parser.NXActionSetMplsTil(ttl=128)]
dec_mpls_ttl
Example:
actions += [parser.NXActionDecMplsTil()]
set_mpls_label:label
Attribute Description
label MPLS Label
Example:
actions += [parser.NXActionSetMplsLabel(label=0x10)]
set_mpls_tc:tc
Attribute Description
tc MPLS Tc
Example:
actions += [parser.NXActionSetMplsLabel(tc=0x10)]
This action restors the queue to the value it was before any set_queue actions were applied.
And equivalent to the followings action of ovs-ofctl command.
pop_queue
Example:
actions += [parser.NXActionPopQueue()]
load:value->dst[start..end]
At- Description
tribute
ofs_nbits Start and End for the OXM/NXM field. Setting method refer to the nicira_ext.
ofs_nbits
dst OXM/NXM header for destination field
value OXM/NXM value to be loaded
Example:
actions += [parser.NXActionRegLoad(
ofs_nbits=nicira_ext.ofs_nbits(4, 31),
dst="eth_dst",
value=0x112233)]
set_field:value[/mask]->dst
Attribute Description
value OXM/NXM value to be loaded
mask Mask for destination field
dst OXM/NXM header for destination field
Example:
actions += [parser.NXActionRegLoad2(dst="tun_ipv4_src",
value="192.168.10.0",
mask="255.255.255.0")]
note:[hh]..
Attribute Description
note A list of integer type values
Example:
actions += [parser.NXActionNote(note=[0xaa,0xbb,0xcc,0xdd])]
set_tunnel:id
Attribute Description
tun_id Tunnel ID(32bits)
Example:
actions += [parser.NXActionSetTunnel(tun_id=0xa)]
set_tunnel64:id
Attribute Description
tun_id Tunnel ID(64bits)
Example:
actions += [parser.NXActionSetTunnel64(tun_id=0xa)]
move:src[start..end]->dst[start..end ]
Attribute Description
src_field OXM/NXM header for source field
dst_field OXM/NXM header for destination field
n_bits Number of bits
src_ofs Starting bit offset in source
dst_ofs Starting bit offset in destination
Caution:
src_start and src_end difference and dst_start and dst_end difference must be the same.
Example:
actions += [parser.NXActionRegMove(src_field="reg0",
dst_field="reg1",
n_bits=5,
src_ofs=0
dst_ofs=10)]
class ryu.ofproto.ofproto_v1_3_parser.NXActionResubmit(in_port=65528,
type_=None, len_=None,
experimenter=None, sub-
type=None)
Resubmit action
This action searches one of the switch’s flow tables.
resubmit:port
Attribute Description
in_port New in_port for checking flow table
Example:
actions += [parser.NXActionResubmit(in_port=8080)]
class ryu.ofproto.ofproto_v1_3_parser.NXActionResubmitTable(in_port=65528,
table_id=255,
type_=None,
len_=None, ex-
perimenter=None,
subtype=None)
Resubmit action
This action searches one of the switch’s flow tables.
And equivalent to the followings action of ovs-ofctl command.
resubmit([port],[table])
Attribute Description
in_port New in_port for checking flow table
table_id Checking flow tables
Example:
actions += [parser.NXActionResubmitTable(in_port=8080,
table_id=10)]
output:src[start...end]
At- Description
tribute
ofs_nbits Start and End for the OXM/NXM field. Setting method refer to the nicira_ext.
ofs_nbits
src OXM/NXM header for source field
max_len Max length to send to controller
Example:
actions += [parser.NXActionOutputReg(
ofs_nbits=nicira_ext.ofs_nbits(4, 31),
src="reg0",
max_len=1024)]
output:src[start...end]
Note: Like the NXActionOutputReg but organized so that there is room for a 64-bit experimenter OXM as
’src’.
At- Description
tribute
ofs_nbits Start and End for the OXM/NXM field. Setting method refer to the nicira_ext.
ofs_nbits
src OXM/NXM header for source field
max_len Max length to send to controller
Example:
actions += [parser.NXActionOutputReg2(
ofs_nbits=nicira_ext.ofs_nbits(4, 31),
src="reg0",
max_len=1024)]
learn(argument[,argument]...)
Attribute Description
table_id The table in which the new flow should be inserted
specs Adds a match criterion to the new flow
Please use the NXFlowSpecMatch in order to set
the following format
field=value
field[start..end] =
src[start..end] | field[start..end] |
Please use the NXFlowSpecLoad in order to set
the following format
load:value->dst
output:field[start..end]
Caution: The arguments specify the flow’s match fields, actions, and other properties, as follows. At least
one match criterion and one action argument should ordinarily be specified.
Example:
actions += [
parser.NXActionLearn(able_id=10,
specs=[parser.NXFlowSpecMatch(src=0x800,
dst=('eth_type_nxm', 0),
n_bits=16),
parser.NXFlowSpecMatch(src=('reg1', 1),
dst=('reg2', 3),
n_bits=5),
parser.NXFlowSpecMatch(src=('reg3', 1),
dst=('reg3', 1),
n_bits=5),
parser.NXFlowSpecLoad(src=0,
dst=('reg4', 3),
n_bits=5),
parser.NXFlowSpecLoad(src=('reg5', 1),
dst=('reg6', 3),
n_bits=5),
parser.NXFlowSpecOutput(src=('reg7', 1),
(continues on next page)
exit
Example:
actions += [parser.NXActionExit()]
controller(key=value...)
Attribute Description
max_len Max length to send to controller
controller_id Controller ID to send packet-in
reason Reason for sending the message
Example:
actions += [
parser.NXActionController(max_len=1024,
controller_id=1,
reason=ofproto.OFPR_INVALID_TTL)]
class ryu.ofproto.ofproto_v1_3_parser.NXActionController2(type_=None,
len_=None, ven-
dor=None, sub-
type=None, **kwargs)
Send packet in message action
This action sends the packet to the OpenFlow controller as a packet in message.
And equivalent to the followings action of ovs-ofctl command.
controller(key=value...)
Attribute Description
max_len Max length to send to controller
controller_id Controller ID to send packet-in
reason Reason for sending the message
userdata Additional data to the controller in the packet-in message
pause Flag to pause pipeline to resume later
Example:
actions += [
parser.NXActionController(max_len=1024,
controller_id=1,
reason=ofproto.OFPR_INVALID_TTL,
userdata=[0xa,0xb,0xc],
pause=True)]
dec_ttl(id1[,id2]...)
Attribute Description
cnt_ids Controller ids
Example:
actions += [parser.NXActionDecTtlCntIds(cnt_ids=[1,2,3])]
Note: If you want to set the following ovs-ofctl command. Please use OFPActionDecNwTtl.
dec_ttl
pop:dst[start...end]
Attribute Description
field OXM/NXM header for source field
start Start bit for source field
end End bit for source field
Example:
actions += [parser.NXActionStackPush(field="reg2",
start=0,
end=5)]
pop:src[start...end]
Attribute Description
field OXM/NXM header for destination field
start Start bit for destination field
end End bit for destination field
Example:
actions += [parser.NXActionStackPop(field="reg2",
start=0,
end=5)]
sample(argument[,argument]...)
Attribute Description
probability The number of sampled packets
collec- The unsigned 32-bit integer identifier of the set of sample collectors to send sampled pack-
tor_set_id ets to
obs_domain_id The Unsigned 32-bit integer Observation Domain ID
obs_point_id The unsigned 32-bit integer Observation Point ID
Example:
actions += [parser.NXActionSample(probability=3,
collector_set_id=1,
obs_domain_id=2,
obs_point_id=3,)]
sample(argument[,argument]...)
Attribute Description
probability The number of sampled packets
collec- The unsigned 32-bit integer identifier of the set of sample collectors to send sampled pack-
tor_set_id ets to
obs_domain_id The Unsigned 32-bit integer Observation Domain ID
obs_point_id The unsigned 32-bit integer Observation Point ID
sampling_port Sampling port number
Example:
actions += [parser.NXActionSample2(probability=3,
collector_set_id=1,
obs_domain_id=2,
obs_point_id=3,
sampling_port=8080)]
class ryu.ofproto.ofproto_v1_3_parser.NXActionFinTimeout(fin_idle_timeout,
fin_hard_timeout,
type_=None, len_=None,
experimenter=None,
subtype=None)
Change TCP timeout action
This action changes the idle timeout or hard timeout or both, of this OpenFlow rule when the rule matches a
TCP packet with the FIN or RST flag.
And equivalent to the followings action of ovs-ofctl command.
fin_timeout(argument[,argument]...)
Attribute Description
fin_idle_timeout Causes the flow to expire after the given number of seconds of inactivity
fin_idle_timeout Causes the flow to expire after the given number of second, regardless of activity
Example:
conjunction(id,k/n)
Attribute Description
clause Number assigned to the flow’s dimension
n_clauses Specify the conjunctive flow’s match condition
id_ Conjunction ID
Example:
actions += [parser.NXActionConjunction(clause=1,
n_clauses=2,
id_=10)]
Attribute Description
fields One of NX_HASH_FIELDS_*
basis Universal hash parameter
algo- One of NX_MP_ALG_*.
rithm
max_link Number of output links
arg Algorithm-specific argument
ofs_nbits Start and End for the OXM/NXM field. Setting method refer to the nicira_ext.
ofs_nbits
dst OXM/NXM header for source field
Example:
actions += [parser.NXActionMultipath(
fields=nicira_ext.NX_HASH_FIELDS_SYMMETRIC_L4,
basis=1024,
algorithm=nicira_ext.NX_MP_ALG_HRW,
max_link=5,
arg=0,
ofs_nbits=nicira_ext.ofs_nbits(4, 31),
dst="reg2")]
Attribute Description
algorithm One of NX_MP_ALG_*.
fields One of NX_HASH_FIELDS_*
basis Universal hash parameter
slave_type Type of slaves(must be NXM_OF_IN_PORT)
n_slaves Number of slaves
ofs_nbits Start and End for the OXM/NXM field. (must be zero)
dst OXM/NXM header for source field(must be zero)
slaves List of slaves
Example:
actions += [parser.NXActionBundle(
algorithm=nicira_ext.NX_MP_ALG_HRW,
fields=nicira_ext.NX_HASH_FIELDS_ETH_SRC,
basis=0,
(continues on next page)
Attribute Description
algorithm One of NX_MP_ALG_*.
fields One of NX_HASH_FIELDS_*
basis Universal hash parameter
slave_type Type of slaves(must be NXM_OF_IN_PORT)
n_slaves Number of slaves
ofs_nbits Start and End for the OXM/NXM field. Setting method refer to the nicira_ext.
ofs_nbits
dst OXM/NXM header for source field
slaves List of slaves
Example:
actions += [parser.NXActionBundleLoad(
algorithm=nicira_ext.NX_MP_ALG_HRW,
fields=nicira_ext.NX_HASH_FIELDS_ETH_SRC,
basis=0,
slave_type=nicira_ext.NXM_OF_IN_PORT,
n_slaves=2,
ofs_nbits=nicira_ext.ofs_nbits(4, 31),
dst="reg0",
slaves=[2, 3])]
ct(argument[,argument]...)
At- Description
tribute
flags Zero or more(Unspecified flag bits must be zero.)
zone_src OXM/NXM header for source field
zone_ofs_nbits
Start and End for the OXM/NXM field. Setting method refer to the nicira_ext.ofs_nbits.
If you need set the Immediate value for zone, zone_src must be set to None or empty character
string.
re- Recirculate to a specific table
circ_table
alg Well-known port number for the protocol
actions Zero or more actions may immediately follow this action
Note: If you set number to zone_src, Traceback occurs when you run the to_jsondict.
Example:
Note: The following command image does not exist in ovs-ofctl command manual and has been created from
the command response.
nat(src=ip_min-ip_max : proto_min-proto-max)
Attribute Description
flags Zero or more(Unspecified flag bits must be zero.)
range_ipv4_min Range ipv4 address minimun
range_ipv4_max Range ipv4 address maximun
range_ipv6_min Range ipv6 address minimun
range_ipv6_max Range ipv6 address maximun
range_proto_min Range protocol minimum
range_proto_max Range protocol maximun
Example:
match = parser.OFPMatch(eth_type=0x0800)
actions += [
parser.NXActionCT(
flags = 1,
zone_src = "reg0",
zone_ofs_nbits = nicira_ext.ofs_nbits(4, 31),
recirc_table = 255,
alg = 0,
actions = [
parser.NXActionNAT(
flags = 1,
range_ipv4_min = "10.1.12.0",
range_ipv4_max = "10.1.13.255",
range_ipv6_min = "",
range_ipv6_max = "",
range_proto_min = 1,
range_proto_max = 1023
)
]
)
]
output(port=port,max_len=max_len)
Attribute Description
port Output port
max_len Max bytes to send
Example:
actions += [parser.NXActionOutputTrunc(port=8080,
max_len=1024)]
dec_nsh_ttl
Example:
actions += [parser.NXActionDecNshTtl()]
Attribute Description
src OXM/NXM header and Start bit for source field
dst OXM/NXM header and Start bit for destination field
n_bits The number of bits from the start bit
Attribute Description
src OXM/NXM header and Start bit for source field
dst OXM/NXM header and Start bit for destination field
n_bits The number of bits from the start bit
Attribute Description
src OXM/NXM header and Start bit for source field
dst Must be ”
n_bits The number of bits from the start bit
ryu.ofproto.nicira_ext.ofs_nbits(start, end)
The utility method for ofs_nbits
This method is used in the class to set the ofs_nbits.
This method converts start/end bits into ofs_nbits required to specify the bit range of OXM/NXM fields.
ofs_nbits can be calculated as following:
field[start..end]
Attribute Description
start Start bit for OXM/NXM field
end End bit for OXM/NXM field
Note: Setting the TCP flags via the nicira extensions. This is required when using OVS version < 2.4. When using
the nxm fields, you need to use any nxm prereq fields as well or you will receive a OFPBMC_BAD_PREREQ error
Example:
# Works
flag = tcp.TCP_ACK
match = parser.OFPMatch(
tcp_flags_nxm=(flag, flag),
ip_proto_nxm=inet.IPPROTO_TCP,
eth_type_nxm=eth_type)
OFP_VERSIONS = [ofproto_v1_0.OFP_VERSION,
ofproto_v1_2.OFP_VERSION]
If multiple Ryu applications are loaded in the system, the intersection of their OFP_VERSIONS is used.
_CONTEXTS = {}
A dictionary to specify contexts which this Ryu application wants to use. Its key is a name of context and
its value is an ordinary class which implements the context. The class is instantiated by app_manager and
the instance is shared among RyuApp subclasses which has _CONTEXTS member with the same key. A
RyuApp subclass can obtain a reference to the instance via its __init__’s kwargs as the following.
Example:
_CONTEXTS = {
'network': network.Network
}
_EVENTS = []
A list of event classes which this RyuApp subclass would generate. This should be specified if and only if
event classes are defined in a different python module from the RyuApp subclass is.
close()
teardown method. The method name, close, is chosen for python context manager
classmethod context_iteritems()
Return iterator over the (key, contxt class) of application context
reply_to_request(req, rep)
Send a reply for a synchronous request sent by send_request. The first argument should be an instance of
EventRequestBase. The second argument should be an instance of EventReplyBase.
send_event(name, ev, state=None)
Send the specified event to the RyuApp instance specified by name.
send_event_to_observers(ev, state=None)
Send the specified event to all observers of this RyuApp.
send_request(req)
Make a synchronous request. Set req.sync to True, send it to a Ryu application specified by req.dst,
and block until receiving a reply. Returns the received reply. The argument should be an instance of
EventRequestBase.
start()
Hook that is called after startup initialization is done.
class ryu.controller.dpset.DPSet(*args, **kwargs)
DPSet application manages a set of switches (datapaths) connected to this controller.
Usage Example:
# ...(snip)...
from ryu.controller import dpset
class MyApp(app_manager.RyuApp):
_CONTEXTS = {
'dpset': dpset.DPSet,
}
def _my_handler(self):
# Get the datapath object which has the given dpid
dpid = 1
dp = self.dpset.get(dpid)
if dp is None:
self.logger.info('No such datapath: dpid=%d', dpid)
get(dp_id)
This method returns the ryu.controller.controller.Datapath instance for the given Datapath ID.
get_all()
This method returns a list of tuples which represents instances for switches connected to this controller.
The tuple consists of a Datapath ID and an instance of ryu.controller.controller.Datapath.
A return value looks like the following:
get_port(dpid, port_no)
This method returns the ryu.controller.dpset.PortState instance for the given Datapath ID and the port
number. Raises ryu_exc.PortNotFound if no such a datapath connected to this controller or no such a port
exists.
get_ports(dpid)
This method returns a list of ryu.controller.dpset.PortState instances for the given Datapath ID. Raises
KeyError if no such a datapath connected to this controller.
Configuration
If you want to use secure channel to connect OpenFlow switches, you need to use TLS connection. This document
describes how to setup Ryu to connect to the Open vSwitch over TLS.
If you don’t have a PKI, the ovs-pki script included with Open vSwitch can help you. This section is based on the
INSTALL.SSL in the Open vSwitch source code.
NOTE: How to install Open vSwitch isn’t described in this document. Please refer to the Open vSwitch documents.
Create a PKI by using ovs-pki script:
% ovs-pki init
(Default directory is /usr/local/var/lib/openvswitch/pki)
The pki directory consists of controllerca and switchca subdirectories. Each directory contains CA files.
Create a controller private key and certificate:
499
ryu Documentation, Release 4.34
Configuring ovs-vswitchd to use CA files using the ovs-vsctl "set-ssl" command, e.g.:
Substitute the correct file names, if they differ from the ones used above. You should use absolute file names.
Run Ryu with CA files:
3.2.1 Usage
3.2.2 Screenshot
Tests
503
ryu Documentation, Release 4.34
Caveats
Please make sure that all interfaces and bridges are UP. Don’t forget interfaces in netns gateway1/gateway2.
^ veth5
|
V veth5-br1
-----------------------
|Linux Brirge vrrp-br1|
-----------------------
veth3-br1^ ^ veth4-br1
| |
veth3V V veth4
---------- ----------
|netns | |netns |
|gateway1| |gateway2|
|ryu-vrrp| |ryu-vrrp|
---------- ----------
veth1^ ^ veth2
| |
veth1-br0V V veth2-br0
-----------------------
(continues on next page)
# TODO:
# Right now, we have our own patched copy of ovs python bindings
# Once our modification is upstreamed and widely deployed,
# use it
#
# NOTE: this modifies sys.path and thus affects the following imports.
# eg. oslo.config.cfg.
import ryu.contrib
_VRID = 7
_IP_ADDRESS = '10.0.0.1'
_PRIORITY = 100
class VRRPTestRouter(app_manager.RyuApp):
def __init__(self, *args, **kwargs):
super(VRRPTestRouter, self).__init__(*args, **kwargs)
print args
self.logger.debug('vrrp_config %s', args)
self._ifname = args[0]
self._primary_ip_address = args[1]
self._priority = int(args[2])
def start(self):
print 'start'
hub.spawn(self._main)
def _main(self):
print self
interface = vrrp_event.VRRPInterfaceNetworkDevice(
lib_mac.DONTCARE, self._primary_ip_address, None, self._ifname)
self.logger.debug('%s', interface)
ip_addresses = [_IP_ADDRESS]
config = vrrp_event.VRRPConfig(
version=vrrp.VRRP_VERSION_V3, vrid=_VRID, priority=self._priority,
ip_addresses=ip_addresses)
self.logger.debug('%s', config)
def main():
vrrp_config = sys.argv[-3:]
sys.argv = sys.argv[:-3]
CONF(project='ryu', version='ryu-vrrp %s' % version)
log.init_log()
# always enable ofp for now.
app_lists = ['ryu.services.protocols.vrrp.manager',
'ryu.services.protocols.vrrp.dumper',
'ryu.services.protocols.vrrp.sample_manager']
app_mgr = app_manager.AppManager.get_instance()
app_mgr.load_apps(app_lists)
contexts = app_mgr.create_contexts()
app_mgr.instantiate_apps(**contexts)
vrrp_router = app_mgr.instantiate(VRRPTestRouter, *vrrp_config, **contexts)
vrrp_router.start()
while True:
time.sleep(999999)
if __name__ == "__main__":
main()
This page describes how to setup LINC and test Ryu OF-config with it.
The procedure is as follows. Although all the procedure is written for reader’s convenience, please refer to LINC
document for latest informations of LINC.
https://github.com/FlowForwarding/LINC-Switch
The test procedure
• install Erlang environment
• build LINC
• configure LINC switch
• setup for LINC
• run LINC switch
• run Ryu test_of_config app
For getting/installing Ryu itself, please refer to https://ryu-sdn.org/
Since LINC is written in Erlang, you need to install Erlang execution environment. Required version is R15B+.
The easiest way is to use binary package from https://www.erlang-solutions.com/downloads/download-erlang-otp
The distribution may also provide Erlang package.
On Ubuntu:
On RedHat/CentOS:
% cd LINC-Switch
% make
Note: At the time of this writing, test_of_config fails due to a bug of LINC. You can try this test with LINC which is
built by the following methods.
% cd LINC-Switch
% make
% cd deps/of_config
% git reset --hard f772af4b765984381ad024ca8e5b5b8c54362638
% cd ../..
% make offline
edit LINC switch configuration file. rel/linc/releases/0.1/sys.config Here is the sample sys.config for
test_of_config.py to run.
[{linc,
[{of_config,enabled},
{capable_switch_ports,
[{port,1,[{interface,"linc-port"}]},
{port,2,[{interface,"linc-port2"}]},
{port,3,[{interface,"linc-port3"}]},
{port,4,[{interface,"linc-port4"}]}]},
{capable_switch_queues,
[
{queue,991,[{min_rate,10},{max_rate,120}]},
{queue,992,[{min_rate,10},{max_rate,130}]},
{queue,993,[{min_rate,200},{max_rate,300}]},
{queue,994,[{min_rate,400},{max_rate,900}]}
]},
{logical_switches,
[{switch,0,
[{backend,linc_us4},
(continues on next page)
# rel/linc/bin/linc console
If you don’t install ryu and are working in the git repo directly:
Snort Intergration
5.1 Overview
There are two options can send alert to Ryu controller. The Option 1 is easier if you just want to demonstrate or test.
Since Snort need very large computation power for analyzing packets you can choose Option 2 to separate them.
[Option 1] Ryu and Snort are on the same machine
+---------------------+
| unixsock |
| Ryu == snort |
+----eth0-----eth1----+
| |
+-------+ +----------+ +-------+
| HostA |---| OFSwitch |---| HostB |
+-------+ +----------+ +-------+
The above depicts Ryu and Snort architecture. Ryu receives Snort alert packet via Unix Domain Socket . To monitor
packets between HostA and HostB, installing a flow that mirrors packets to Snort.
[Option 2] Ryu and Snort are on the different machines
+---------------+
| Snort eth0--|
| Sniffer | |
+-----eth1------+ |
| |
+-------+ +----------+ +-----------+
| HostA |---| OFSwitch |---| LAN (*CP) |
+-------+ +----------+ +-----------+
| |
+----------+ +----------+
(continues on next page)
511
ryu Documentation, Release 4.34
Snort is an open source network intrusion prevention and detectionsystem developed by Sourcefire. If you are not
familiar with installing/setting up Snort, please referto snort setup guides.
http://www.snort.org/documents
include $RULE_PATH/Myrules.rules
5.4 Usage
[Option 1]
1. Modify the simple_switch_snort.py:
The incoming packets will all mirror to port 3 which should be connect to Snort network interface. You can modify
the mirror port by assign a new value in the self.snort_port = 3 of simple_switch_snort.py
3. Run Snort:
$ sudo -i
$ snort -i eth1 -A unsock -l /tmp -c /etc/snort/snort.conf
This program listening snort alert messages from unix domain socket and sending it to Ryu using network socket.
You can clone the source code from this repo. https://github.com/John-Lin/pigrelay
5. Send an ICMP packet from HostA (192.168.8.40) to HostB (192.168.8.50):
$ ping 192.168.8.50
ipv4(csum=42562,dst='192.168.8.50',flags=0,header_length=5,identification=724,
˓→offset=0,option=None,proto=1,src='192.168.8.40',tos=0,total_length=60,ttl=128,
˓→version=4)
ethernet(dst='00:23:54:5a:05:14',ethertype=2048,src='00:23:54:6c:1d:17')
alertmsg: Pinging...
icmp(code=0,csum=21773,data=echo(data=array('B', [97, 98, 99, 100, 101, 102, 103,
˓→104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119,
ipv4(csum=52095,dst='192.168.8.40',flags=0,header_length=5,identification=7575,
˓→offset=0,option=None,proto=1,src='192.168.8.50',tos=0,total_length=60,ttl=64,
Ryu has some built-in Ryu applications. Some of them are examples. Others provide some functionalities to other
Ryu applications.
6.1 ryu.app.ofctl
import ryu.app.ofctl.api
OfctlService application internally uses OpenFlow barrier messages to ensure message boundaries. As OpenFlow
messages are asynchronous and some of messages does not have any replies on success, barriers are necessary for
correct error handling.
ryu.app.ofctl.api.get_datapath(app, dpid=None)
Get datapath object by dpid.
Parameters
• app – Client RyuApp instance
• dpid – Datapath ID (int type) or None to get all datapath objects
Returns a object of datapath, a list of datapath objects when no dpid given or None when error.
Raises an exception if any of the given values is invalid.
Example:
515
ryu Documentation, Release 4.34
# ...(snip)...
import ryu.app.ofctl.api as ofctl_api
class MyApp(app_manager.RyuApp):
# ...(snip)...
import ryu.app.ofctl.api as ofctl_api
class MyApp(app_manager.RyuApp):
6.1.2 exceptions
exception ryu.app.ofctl.exception.InvalidDatapath(result)
Datapath is invalid.
This can happen when the bridge disconnects.
exception ryu.app.ofctl.exception.OFError(result)
OFPErrorMsg is received.
exception ryu.app.ofctl.exception.UnexpectedMultiReply(result)
Two or more replies are received for reply_muiti=False request.
6.2 ryu.app.ofctl_rest
ryu.app.ofctl_rest provides REST APIs for retrieving the switch stats and Updating the switch stats. This application
helps you debug your application and get various statistics.
This application supports OpenFlow version 1.0, 1.2, 1.3, 1.4 and 1.5.
Contents
• ryu.app.ofctl_rest
– Retrieve the switch stats
Method GET
URI /stats/switches
Example of use:
[
1,
2,
3
]
Note: The result of the REST command is formatted for easy viewing.
Get the desc stats of the switch which specified with Datapath ID in URI.
Usage:
Method GET
URI /stats/desc/<dpid>
Example of use:
{
"1": {
"mfr_desc": "Nicira, Inc.",
"hw_desc": "Open vSwitch",
"sw_desc": "2.3.90",
"serial_num": "None",
"dp_desc": "None"
}
}
Get all flows stats of the switch which specified with Datapath ID in URI.
Usage:
Method GET
URI /stats/flow/<dpid>
Example of use:
$ curl -X GET http://localhost:8080/stats/flow/1
{
"1": [
{
"length": 88,
"table_id": 0,
"duration_sec": 2,
"duration_nsec": 6.76e+08,
"priority": 11111,
"idle_timeout": 0,
"hard_timeout": 0,
"flags": 1,
"cookie": 1,
"packet_count": 0,
"byte_count": 0,
"match": {
"eth_type": 2054
},
"importance": 0,
"instructions": [
{
"type": "APPLY_ACTIONS",
"actions": [
{
"port": 2,
"max_len": 0,
"type": "OUTPUT"
}
]
}
]
}
]
}
Get flows stats of the switch filtered by the OFPFlowStats fields. This is POST method version of Get all
flows stats.
Usage:
Method POST
URI /stats/flow/<dpid>
Note: OpenFlow Spec does not allow to filter flow entries by priority, but when with a large
amount of flow entries, filtering by priority is convenient to get statistics efficiently. So, this
app provides priority field for filtering.
{
"1": [
{
"length": 88,
"table_id": 0,
"duration_sec": 2,
"duration_nsec": 6.76e+08,
"priority": 11111,
"idle_timeout": 0,
"hard_timeout": 0,
"flags": 1,
"cookie": 1,
"packet_count": 0,
"byte_count": 0,
"match": {
"eth_type": 2054
},
"importance": 0,
"instructions": [
{
"type": "APPLY_ACTIONS",
"actions": [
{
"port": 2,
"max_len": 0,
"type": "OUTPUT"
}
]
}
]
}
]
}
Get aggregate flow stats of the switch which specified with Datapath ID in URI.
Usage:
Method GET
URI /stats/aggregateflow/<dpid>
Example of use:
{
"1": [
{
"packet_count": 18,
"byte_count": 756,
"flow_count": 3
}
]
}
Get aggregate flow stats of the switch filtered by the OFPAggregateStats fields. This is POST method
version of Get aggregate flow stats.
Usage:
Method POST
URI /stats/aggregateflow/<dpid>
{
"1": [
{
"packet_count": 18,
"byte_count": 756,
"flow_count": 3
}
]
}
Get table stats of the switch which specified with Datapath ID in URI.
Usage:
Method GET
URI /stats/table/<dpid>
Example of use:
Response (OpenFlow1.0):
{
"1": [
{
"table_id": 0,
"lookup_count": 8,
"max_entries": 1e+06,
"active_count": 0,
"name": "classifier",
"matched_count": 0,
"wildcards": [
"IN_PORT",
"DL_VLAN"
]
},
...
{
"table_id": 253,
"lookup_count": 0,
"max_entries": 1e+06,
"active_count": 0,
"name": "table253",
"matched_count": 0,
"wildcards": [
"IN_PORT",
"DL_VLAN"
]
}
]
}
Response (OpenFlow1.2):
{
"1": [
{
"apply_setfields": [
"OFB_IN_PORT",
"OFB_METADATA"
],
"match": [
"OFB_IN_PORT",
"OFB_METADATA"
],
(continues on next page)
Response (OpenFlow1.3):
{
"1": [
{
"active_count": 0,
"table_id": 0,
"lookup_count": 8,
"matched_count": 0
},
...
{
"active_count": 0,
"table_id": 253,
"lookup_count": 0,
"matched_count": 0
}
]
}
Get table features of the switch which specified with Datapath ID in URI.
Usage:
Method GET
URI /stats/tablefeatures/<dpid>
Example of use:
{
"1": [
{
"metadata_write": 18446744073709552000,
"config": 0,
"table_id": 0,
"metadata_match": 18446744073709552000,
"max_entries": 4096,
"properties": [
{
"type": "INSTRUCTIONS",
"instruction_ids": [
{
"len": 4,
"type": 1
},
...
]
},
...
],
"name": "table_0"
},
{
"metadata_write": 18446744073709552000,
"config": 0,
"table_id": 1,
"metadata_match": 18446744073709552000,
"max_entries": 4096,
"properties": [
{
"type": "INSTRUCTIONS",
"instruction_ids": [
{
"len": 4,
"type": 1
},
(continues on next page)
Get ports stats of the switch which specified with Datapath ID in URI.
Usage:
Method GET
URI /stats/port/<dpid>[/<port>]
Example of use:
{
"1": [
{
"port_no": 1,
"rx_packets": 9,
"tx_packets": 6,
"rx_bytes": 738,
"tx_bytes": 252,
"rx_dropped": 0,
"tx_dropped": 0,
"rx_errors": 0,
"tx_errors": 0,
"rx_frame_err": 0,
"rx_over_err": 0,
"rx_crc_err": 0,
"collisions": 0,
"duration_sec": 12,
"duration_nsec": 9.76e+08
},
{
:
:
}
]
}
{
"1": [
{
"port_no": 1,
"rx_packets": 9,
"tx_packets": 6,
"rx_bytes": 738,
"tx_bytes": 252,
"rx_dropped": 0,
"tx_dropped": 0,
"rx_errors": 0,
"tx_errors": 0,
"duration_nsec": 12,
"duration_sec": 9.76e+08,
"properties": [
{
"rx_frame_err": 0,
"rx_over_err": 0,
"rx_crc_err": 0,
"collisions": 0,
"type": "ETHERNET"
},
{
"bias_current": 300,
"flags": 3,
"rx_freq_lmda": 1500,
"rx_grid_span": 500,
"rx_offset": 700,
"rx_pwr": 2000,
"temperature": 273,
"tx_freq_lmda": 1500,
"tx_grid_span": 500,
"tx_offset": 700,
"tx_pwr": 2000,
"type": "OPTICAL"
},
{
"data": [],
"exp_type": 0,
"experimenter": 101,
"type": "EXPERIMENTER"
},
{
:
:
}
]
}
]
}
Get ports description of the switch which specified with Datapath ID in URI.
Usage(OpenFlow1.4 or earlier):
Method GET
URI /stats/portdesc/<dpid>
Usage(OpenFlow1.5 or later):
Method GET
URI /stats/portdesc/<dpid>/[<port>]
Example of use:
{
"1": [
{
"port_no": 1,
"hw_addr": "0a:b6:d0:0c:e1:d7",
(continues on next page)
:
}
]
}
]
}
Get queues stats of the switch which specified with Datapath ID in URI.
Usage:
Method GET
URI /stats/queue/<dpid>[/<port>[/<queue_id>]]
Example of use:
{
"1": [
{
"port_no": 1,
"queue_id": 0,
"tx_bytes": 0,
"tx_packets": 0,
"tx_errors": 0,
"duration_sec": 4294963425,
"duration_nsec": 3912967296
},
{
"port_no": 1,
"queue_id": 1,
"tx_bytes": 0,
"tx_packets": 0,
"tx_errors": 0,
"duration_sec": 4294963425,
"duration_nsec": 3912967296
}
]
}
{
"1": [
{
"port_no": 1,
"queue_id": 0,
"tx_bytes": 0,
"tx_packets": 0,
"tx_errors": 0,
"duration_sec": 4294963425,
(continues on next page)
:
}
]
},
{
"port_no": 2,
"queue_id": 1,
"tx_bytes": 0,
"tx_packets": 0,
"tx_errors": 0,
"duration_sec": 4294963425,
"duration_nsec": 3912967296,
"length": 48,
"properties": []
}
]
}
Get queues config of the switch which specified with Datapath ID and Port in URI.
Usage:
Method GET
URI /stats/queueconfig/<dpid>/[<port>]
Example of use:
{
"1": [
{
"port": 1,
"queues": [
{
"properties": [
{
"property": "MIN_RATE",
"rate": 80
}
],
"port": 0,
"queue_id": 1
},
{
"properties": [
{
"property": "MAX_RATE",
"rate": 120
}
],
"port": 2,
"queue_id": 2
},
{
"properties": [
{
"property": "EXPERIMENTER",
"data": [],
"experimenter": 999
}
],
"port": 3,
"queue_id": 3
}
]
}
]
}
Get queues description of the switch which specified with Datapath ID, Port and Queue_id in URI.
Usage:
Method GET
URI /stats/queuedesc/<dpid>[/<port>/[<queue_id>]]
Example of use:
$ curl -X GET http://localhost:8080/stats/queuedesc/1/1/1
{
"1": [
{
"len": 88,
"port_no": 1,
"queue_id": 1,
"properties": [
{
"length": 8,
"rate": 300,
"type": "MIN_RATE"
},
{
"length": 8,
"rate": 900,
"type": "MAX_RATE"
},
{
"length": 16,
"exp_type": 0,
(continues on next page)
:
}
]
}
]
}
Get groups stats of the switch which specified with Datapath ID in URI.
Usage:
Method GET
URI /stats/group/<dpid>[/<group_id>]
Example of use:
{
"1": [
{
"length": 56,
"group_id": 1,
"ref_count": 1,
"packet_count": 0,
"byte_count": 0,
"duration_sec": 161,
"duration_nsec": 3.03e+08,
"bucket_stats": [
{
"packet_count": 0,
"byte_count": 0
}
]
}
]
}
Get group description stats of the switch which specified with Datapath ID in URI.
Usage(Openflow1.4 or earlier):
Method GET
URI /stats/groupdesc/<dpid>
Usage(Openflow1.5 or later):
Method GET
URI /stats/groupdesc/<dpid>/[<group_id>]
Example of use:
{
"1": [
{
"type": "ALL",
"group_id": 1,
"buckets": [
{
"weight": 0,
"watch_port": 4294967295,
"watch_group": 4294967295,
"actions": [
"OUTPUT:1"
]
}
]
}
]
}
{
"1": [
{
"type": "ALL",
"group_id": 1,
"length": 40,
"buckets": [
(continues on next page)
Get group features stats of the switch which specified with Datapath ID in URI.
Usage:
Method GET
URI /stats/groupfeatures/<dpid>
Example of use:
$ curl -X GET http://localhost:8080/stats/groupfeatures/1
{
"1": [
{
"types": [],
"capabilities": [
"SELECT_WEIGHT",
(continues on next page)
Get meters stats of the switch which specified with Datapath ID in URI.
Usage:
Method GET
URI /stats/meter/<dpid>[/<meter_id>]
Example of use:
{
"1": [
{
"meter_id": 1,
"len": 56,
"flow_count": 0,
"packet_in_count": 0,
"byte_in_count": 0,
"duration_sec": 37,
"duration_nsec": 988000,
"band_stats": [
{
"packet_band_count": 0,
"byte_band_count": 0
}
]
}
]
}
Get meter config stats of the switch which specified with Datapath ID in URI.
Caution: This message has been renamed in openflow 1.5. If Openflow 1.4 or earlier is
in use, please used as Get meter description stats. If Openflow 1.5 or later is in use, please
used as Get meter description stats.
Usage(Openflow1.4 or earlier):
Method GET
URI /stats/meterconfig/<dpid>[/<meter_id>]
Usage(Openflow1.5 or later):
Method GET
URI /stats/meterdesc/<dpid>[/<meter_id>]
Example of use:
$ curl -X GET http://localhost:8080/stats/meterconfig/1
{
"1": [
{
"flags": [
"KBPS"
],
"meter_id": 1,
"bands": [
{
"type": "DROP",
"rate": 1000,
"burst_size": 0
}
]
}
(continues on next page)
Get meter features stats of the switch which specified with Datapath ID in URI.
Usage:
Method GET
URI /stats/meterfeatures/<dpid>
Example of use:
{
"1": [
{
"max_meter": 256,
"band_types": [
"DROP"
],
"capabilities": [
"KBPS",
"BURST",
"STATS"
],
"max_bands": 16,
"max_color": 8
}
]
}
Get role
Method GET
URI /stats/role/<dpid>
Example of use:
{
"1": [
{
"generation_id": 0,
"role": "EQUAL"
}
]
}
{
"1": [
{
"generation_id": 0,
"role": "EQUAL",
"short_id": 0
}
]
}
Method POST
URI /stats/flowentry/add
Note: For description of match and actions, please see Reference: Description of Match and Actions.
Note: To confirm flow entry registration, please see Get all flows stats or Get flows stats filtered by fields.
Method POST
URI /stats/flowentry/modify
Example of use:
Method POST
URI /stats/flowentry/modify_strict
Example of use:
Method POST
URI /stats/flowentry/delete
Example of use:
Method POST
URI /stats/flowentry/delete_strict
Example of use:
Delete all flow entries of the switch which specified with Datapath ID in URI.
Usage:
Method DELETE
URI /stats/flowentry/clear/<dpid>
Example of use:
Method POST
URI /stats/groupentry/add
Example of use:
Note: To confirm group entry registration, please see Get group description stats.
Method POST
URI /stats/groupentry/modify
Example of use:
Method POST
URI /stats/groupentry/delete
Example of use:
Method POST
URI /stats/portdesc/modify
Example of use:
Method POST
URI /stats/meterentry/add
Example of use:
Note: To confirm meter entry registration, please see Get meter config stats.
Method POST
URI /stats/meterentry/modify
Example of use:
Method POST
URI /stats/meterentry/delete
Example of use:
Modify role
Method POST
URI /stats/role
Example of use:
$ curl -X POST -d '{
"dpid": 1,
"role": "MASTER"
}' http://localhost:8080/stats/role
Send a experimenter message to the switch which specified with Datapath ID in URI.
Usage:
Method POST
URI /stats/experimenter/<dpid>
Example of use:
$ curl -X POST -d '{
"dpid": 1,
"experimenter": 1,
"exp_type": 1,
"data_type": "ascii",
"data": "data"
}' http://localhost:8080/stats/experimenter/1
"192.168.0.1"
"192.168.0.2/24"
"aa:bb:cc:11:22:33"
"aa:bb:cc:11:22:33/00:00:00:00:ff:ff"
IPv4 address:
"192.168.0.11"
"192.168.0.44/24"
"192.168.10.10/255.255.255.0"
IPv6 address:
"2001::ffff:cccc:bbbb:1111"
"2001::ffff:cccc:bbbb:2222/64"
"2001::ffff:cccc:bbbb:2222/ffff:ffff:ffff:ffff::0"
Metadata:
"0x1212121212121212"
"0x3434343434343434/0x01010101010101010"
Note: When "dl_vlan" field is described as decimal int value, OFPVID_PRESENT(0x1000) bit is auto-
matically applied.
},
"actions":[
{
"type":"OUTPUT",
"port": 1
}
]
}' http://localhost:8080/stats/flowentry/add
• To match only packets with VLAN tag and VLAN ID equal value 5:
},
"actions":[
{
"type":"OUTPUT",
"port": 1
}
]
}' http://localhost:8080/stats/flowentry/add
Note: When using the descriptions for OpenFlow1.2 or later, please describe "dl_vlan" field as hexadec-
imal string value, and OFPVID_PRESENT(0x1000) bit is NOT automatically applied.
},
{
"type": "SET_FIELD",
"field": "vlan_vid", # Set VLAN ID
"value": 4102 # Describe sum of vlan_id(e.g. 6) |
˓→OFPVID_PRESENT(0x1000=4096)
},
{
"type": "OUTPUT",
"port": 2
}
]
}' http://localhost:8080/stats/flowentry/add
6.3 ryu.app.rest_vtep
This sample application performs as VTEP for EVPN VXLAN and constructs a Single Subnet per EVI corresponding
to the VLAN Based service in [RFC7432].
Note: This app will invoke OVSDB request to the switches. Please set the manager address before calling the API of
this app.
$ sudo ovs-vsctl set-manager ptcp:6640
$ sudo ovs-vsctl show
...(snip)
Manager "ptcp:6640"
...(snip)
Environment
Configuration steps
On Host B:
(Host B)$ curl -X POST -d '{
"dpid": 1,
"as_number": 65000,
"router_id": "172.17.0.2"
}' http://localhost:8080/vtep/speakers | python -m json.tool
On Host B:
(Host B)$ curl -X POST -d '{
"address": "172.17.0.1",
"remote_as": 65000
}' http://localhost:8080/vtep/neighbors |
python -m json.tool
On Host B:
Testing
If BGP (EVPN) connection between Ryu1 and Ryu2 has been established, pings between the client s1h1 and s2h1
should work.
Troubleshooting
If connectivity between s1h1 and s2h1 isn’t working, please check the followings.
1. Make sure that Host A and Host B have full network connectivity.
...
{
"172.17.0.2": {
"EvpnNeighbor": {
"address": "172.17.0.2",
"remote_as": 65000,
"state": "up" # "up" shows the connection established
}
}
}
...
{
"10": {
"EvpnNetwork": {
"clients": {
"aa:bb:cc:00:00:11": {
"EvpnClient": {
"ip": "10.0.0.11",
"mac": "aa:bb:cc:00:00:11",
"next_hop": "172.17.0.1",
"port": 1
}
},
"aa:bb:cc:00:00:21": { # route for "s2h1" on Host B
"EvpnClient": {
"ip": "10.0.0.21",
"mac": "aa:bb:cc:00:00:21",
"next_hop": "172.17.0.2",
"port": 3
}
}
},
"ethernet_tag_id": 0,
"route_dist": "65000:10",
"vni": 10
}
}
}
4. Make sure that the IPv6 is enabled on your environment. Some Ryu BGP features require the IPv6 connectivity to
bind sockets. Mininet seems to disable IPv6 on its installation.
For example:
$ sysctl net.ipv6.conf.all.disable_ipv6
net.ipv6.conf.all.disable_ipv6 = 0 # should NOT be enabled
5. Make sure that your switch using the OpenFlow version 1.3. This application supports only the OpenFlow version
1.3.
For example:
Note: At the time of this writing, we use the the following version of Ryu, Open vSwitch and Mininet.
$ ryu --version
ryu 4.19
$ ovs-vsctl --version
ovs-vsctl (Open vSwitch) 2.5.2 # APT packaged version of Ubuntu 16.04
Compiled Oct 17 2017 16:38:57
DB Schema 7.12.1
$ mn --version
2.2.1 # APT packaged version of Ubuntu 16.04
add_speaker(req, **kwargs)
Creates a new BGPSpeaker instance.
Usage:
Method URI
POST /vtep/speakers
Request parameters:
Attribute Description
dpid ID of Datapath binding to speaker. (e.g. 1)
as_number AS number. (e.g. 65000)
router_id Router ID. (e.g. "172.17.0.1")
Example:
$ curl -X POST -d '{
"dpid": 1,
"as_number": 65000,
"router_id": "172.17.0.1"
}' http://localhost:8080/vtep/speakers | python -m json.tool
{
"172.17.0.1": {
"EvpnSpeaker": {
"as_number": 65000,
"dpid": 1,
"neighbors": {},
"router_id": "172.17.0.1"
}
}
}
get_speakers(_, **kwargs)
Gets the info of BGPSpeaker instance.
Usage:
Method URI
GET /vtep/speakers
Example:
{
"172.17.0.1": {
"EvpnSpeaker": {
"as_number": 65000,
"dpid": 1,
"neighbors": {
"172.17.0.2": {
"EvpnNeighbor": {
"address": "172.17.0.2",
"remote_as": 65000,
"state": "up"
}
}
},
"router_id": "172.17.0.1"
}
}
}
del_speaker(_, **kwargs)
Shutdowns BGPSpeaker instance.
Usage:
Method URI
DELETE /vtep/speakers
Example:
{
"172.17.0.1": {
"EvpnSpeaker": {
"as_number": 65000,
"dpid": 1,
"neighbors": {},
"router_id": "172.17.0.1"
}
}
}
add_neighbor(req, **kwargs)
Registers a new neighbor to the speaker.
Usage:
Method URI
POST /vtep/neighbors
Request parameters:
Attribute Description
address IP address of neighbor. (e.g. "172.17.0.2")
remote_as AS number of neighbor. (e.g. 65000)
Example:
{
"172.17.0.2": {
"EvpnNeighbor": {
"address": "172.17.0.2",
"remote_as": 65000,
"state": "down"
}
}
}
get_neighbors(_, **kwargs)
Gets a list of all neighbors.
Usage:
Method URI
GET /vtep/neighbors
Example:
{
"172.17.0.2": {
"EvpnNeighbor": {
"address": "172.17.0.2",
"remote_as": 65000,
"state": "up"
}
}
}
get_neighbor(_, **kwargs)
Gets the neighbor for the specified address.
Usage:
Method URI
GET /vtep/neighbors/{address}
Request parameters:
Attribute Description
address IP address of neighbor. (e.g. "172.17.0.2")
Example:
{
"172.17.0.2": {
"EvpnNeighbor": {
"address": "172.17.0.2",
"remote_as": 65000,
"state": "up"
}
}
}
del_neighbor(_, **kwargs)
Unregister the specified neighbor from the speaker.
Usage:
Method URI
DELETE /vtep/speaker/neighbors/{address}
Request parameters:
Attribute Description
address IP address of neighbor. (e.g. "172.17.0.2")
Example:
{
"172.17.0.2": {
"EvpnNeighbor": {
"address": "172.17.0.2",
"remote_as": 65000,
"state": "up"
}
}
}
add_network(req, **kwargs)
Defines a new network.
Usage:
Method URI
POST /vtep/networks
Request parameters:
Attribute Description
vni Virtual Network Identifier. (e.g. 10)
Example:
{
"10": {
"EvpnNetwork": {
"clients": {},
"ethernet_tag_id": 0,
"route_dist": "65000:10",
"vni": 10
}
}
}
get_networks(_, **kwargs)
Gets a list of all networks.
Usage:
Method URI
GET /vtep/networks
Example:
{
"10": {
"EvpnNetwork": {
"clients": {
"aa:bb:cc:dd:ee:ff": {
"EvpnClient": {
"ip": "10.0.0.1",
"mac": "aa:bb:cc:dd:ee:ff",
"next_hop": "172.17.0.1",
"port": 1
}
}
},
"ethernet_tag_id": 0,
(continues on next page)
get_network(_, **kwargs)
Gets the network for the specified VNI.
Usage:
Method URI
GET /vtep/networks/{vni}
Request parameters:
Attribute Description
vni Virtual Network Identifier. (e.g. 10)
Example:
{
"10": {
"EvpnNetwork": {
"clients": {
"aa:bb:cc:dd:ee:ff": {
"EvpnClient": {
"ip": "10.0.0.1",
"mac": "aa:bb:cc:dd:ee:ff",
"next_hop": "172.17.0.1",
"port": 1
}
}
},
"ethernet_tag_id": 0,
"route_dist": "65000:10",
"vni": 10
}
}
}
del_network(_, **kwargs)
Deletes the network for the specified VNI.
Usage:
Method URI
DELETE /vtep/networks/{vni}
Request parameters:
Attribute Description
vni Virtual Network Identifier. (e.g. 10)
Example:
{
"10": {
"EvpnNetwork": {
"ethernet_tag_id": 10,
"clients": [
{
"EvpnClient": {
"ip": "10.0.0.11",
"mac": "e2:b1:0c:ba:42:ed",
"port": 1
}
}
],
"route_dist": "65000:100",
"vni": 10
}
}
}
add_client(req, **kwargs)
Registers a new client to the specified network.
Usage:
Method URI
POST /vtep/networks/{vni}/clients
Request parameters:
At- Description
tribute
vni Virtual Network Identifier. (e.g. 10)
port Port number to connect client. For convenience, port name can be specified and
automatically translated to port number. (e.g. "s1-eth1" or 1)
mac Client MAC address to register. (e.g. "aa:bb:cc:dd:ee:ff")
ip Client IP address. (e.g. "10.0.0.1")
Example:
{
"10": {
"EvpnClient": {
"ip": "10.0.0.1",
"mac": "aa:bb:cc:dd:ee:ff",
"next_hop": "172.17.0.1",
"port": 1
}
}
}
del_client(_, **kwargs)
Registers a new client to the specified network.
Usage:
Method URI
DELETE /vtep/networks/{vni}/clients/{mac}
Request parameters:
Attribute Description
vni Virtual Network Identifier. (e.g. 10)
mac Client MAC address to register.
Example:
python -m json.tool
{
"10": {
"EvpnClient": {
"ip": "10.0.0.1",
"mac": "aa:bb:cc:dd:ee:ff",
"next_hop": "172.17.0.1",
"port": 1
}
}
}
6.4 ryu.services.protocols.bgp.application
This module provides a convenient application for using Ryu BGPSpeaker and for writing your BGP application.
It reads a configuration file which includes settings for neighbors, routes and some others. Please refer to ryu/
services/protocols/bgp/bgp_sample_conf.py for the sample configuration.
Usage Example:
$ ryu-manager ryu/services/protocols/bgp/application.py \
--bgp-app-config-file ryu/services/protocols/bgp/bgp_sample_conf.py
You can also use the SSH console and see the RIB and do some operations from this console. The SSH port and
username/password can be configured by the configuration file. You can check the help by hitting ’?’ key in this
interface.
Example:
# my_bgp_app.py
class MyBGPApp(app_manager.RyuApp):
_CONTEXTS = {
'ryubgpspeaker': bgp_application.RyuBGPSpeaker,
}
@set_ev_cls(bgp_application.EventBestPathChanged)
def _best_patch_changed_handler(self, ev):
self.logger.info(
'Best path changed: is_withdraw=%s, path=%s',
ev.is_withdraw, ev.path)
Usage Example:
$ ryu-manager my_bgp_app.py \
--bgp-app-config-file ryu/services/protocols/bgp/bgp_sample_conf.py
exception ryu.services.protocols.bgp.application.ApplicationException(desc=None)
Specific Base exception related to BSPSpeaker.
class ryu.services.protocols.bgp.application.EventAdjRibInChanged(path,
is_withdraw,
peer_ip,
peer_as)
Event called when any adj-RIB-in path is changed due to UPDATE messages or remote peer’s down.
This event is the wrapper for adj_rib_in_change_handler of bgpspeaker.BGPSpeaker.
path attribute contains an instance of info_base.base.Path subclasses.
If is_withdraw attribute is True, path attribute has the information of the withdraw route.
peer_ip is the peer’s IP address who sent this path.
peer_as is the peer’s AS number who sent this path.
class ryu.services.protocols.bgp.application.EventBestPathChanged(path,
is_withdraw)
Event called when any best remote path is changed due to UPDATE messages or remote peer’s down.
This event is the wrapper for best_path_change_handler of bgpspeaker.BGPSpeaker.
path attribute contains an instance of info_base.base.Path subclasses.
If is_withdraw attribute is True, path attribute has the information of the withdraw route.
class ryu.services.protocols.bgp.application.EventPeerDown(remote_ip, re-
mote_as)
Event called when the session to the remote peer goes down.
This event is the wrapper for peer_down_handler of bgpspeaker.BGPSpeaker.
• genindex
• modindex
• search
585
ryu Documentation, Release 4.34
r ryu.lib.packet.packet_base, 19
ryu.app.cbench, 9 ryu.lib.packet.pbb, 86
ryu.app.ofctl.api, 515 ryu.lib.packet.sctp, 87
ryu.app.ofctl.exception, 516 ryu.lib.packet.slow, 98
ryu.app.rest_vtep, 569 ryu.lib.packet.stream_parser, 19
ryu.app.simple_switch, 9 ryu.lib.packet.tcp, 102
ryu.base.app_manager, 7 ryu.lib.packet.udp, 103
ryu.controller.controller, 7 ryu.lib.packet.vlan, 104
ryu.controller.dpset, 7 ryu.lib.packet.vrrp, 105
ryu.controller.ofp_event, 7 ryu.lib.packet.vxlan, 108
ryu.controller.ofp_handler, 7 ryu.lib.packet.zebra, 109
ryu.lib.netconf, 9 ryu.lib.xflow, 10
ryu.lib.of_config, 9 ryu.ofproto.nicira_ext, 494
ryu.lib.ovs, 9 ryu.ofproto.ofproto_v1_0, 8
ryu.lib.ovs.bridge, 135 ryu.ofproto.ofproto_v1_0_parser, 8
ryu.lib.ovs.vsctl, 134 ryu.ofproto.ofproto_v1_2, 8
ryu.lib.packet, 9 ryu.ofproto.ofproto_v1_2_parser, 8
ryu.lib.packet.arp, 20 ryu.ofproto.ofproto_v1_3, 8
ryu.lib.packet.bfd, 21 ryu.ofproto.ofproto_v1_3_parser, 8
ryu.lib.packet.bgp, 26 ryu.ofproto.ofproto_v1_4, 9
ryu.lib.packet.bmp, 41 ryu.ofproto.ofproto_v1_4_parser, 9
ryu.lib.packet.bpdu, 46 ryu.ofproto.ofproto_v1_5, 9
ryu.lib.packet.cfm, 51 ryu.ofproto.ofproto_v1_5_parser, 9
ryu.lib.packet.dhcp, 57 ryu.services.protocols.bgp.application,
ryu.lib.packet.dhcp6, 58 580
ryu.lib.packet.ethernet, 60 ryu.topology, 9
ryu.lib.packet.geneve, 61
ryu.lib.packet.gre, 62
ryu.lib.packet.icmp, 63
ryu.lib.packet.icmpv6, 65
ryu.lib.packet.igmp, 69
ryu.lib.packet.ipv4, 73
ryu.lib.packet.ipv6, 74
ryu.lib.packet.llc, 77
ryu.lib.packet.lldp, 79
ryu.lib.packet.mpls, 82
ryu.lib.packet.openflow, 83
ryu.lib.packet.ospf, 84
ryu.lib.packet.packet, 18
587
ryu Documentation, Release 4.34
Symbols (ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker
_CONTEXTS (ryu.base.app_manager.RyuApp attribute), method), 120
496 attribute_map_set()
_EVENTS (ryu.base.app_manager.RyuApp attribute), (ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker
496 method), 120
_TYPE (ryu.ofproto.ofproto_parser.MsgBase attribute), AttributeMap (class in
139 ryu.services.protocols.bgp.info_base.base),
129
A AttrLenError, 26
add_bond() (ryu.lib.ovs.bridge.OVSBridge method), auth (class in ryu.lib.packet.ipv6), 74
135 authenticate() (ryu.lib.packet.bfd.bfd method), 25
add_client() (ryu.app.rest_vtep.RestVtepController authenticate() (ryu.lib.packet.bfd.KeyedMD5
method), 579 method), 22
add_db_attribute() authenticate() (ryu.lib.packet.bfd.KeyedSHA1
(ryu.lib.ovs.bridge.OVSBridge method), 135 method), 23
add_gre_port() (ryu.lib.ovs.bridge.OVSBridge authenticate() (ryu.lib.packet.bfd.SimplePassword
method), 136 method), 24
add_neighbor() (ryu.app.rest_vtep.RestVtepController AuthFailure, 26
method), 574
add_network() (ryu.app.rest_vtep.RestVtepController
B
method), 576 BadBgpId, 31
add_protocol() (ryu.lib.packet.packet.Packet BadLen, 31
method), 18 BadMsg, 31
add_speaker() (ryu.app.rest_vtep.RestVtepController BadNotification, 31
method), 573 BadPeerAs, 31
add_tunnel_port() (ryu.lib.ovs.bridge.OVSBridge bfd (class in ryu.lib.packet.bfd), 25
method), 136 BFDAuth (class in ryu.lib.packet.bfd), 22
add_vxlan_port() (ryu.lib.ovs.bridge.OVSBridge BGPEvpnEsiLabelExtendedCommunity (class in
method), 136 ryu.lib.packet.bgp), 26
AdminReset, 26 BGPEvpnEsImportRTExtendedCommunity (class
AdminShutdown, 26 in ryu.lib.packet.bgp), 26
ApplicationException, 582 BGPEvpnMacMobilityExtendedCommunity
arp (class in ryu.lib.packet.arp), 20 (class in ryu.lib.packet.bgp), 26
arp_ip() (in module ryu.lib.packet.arp), 21 BgpExc, 31
ASPathFilter (class in BGPFlowSpecRedirectCommunity (class in
ryu.services.protocols.bgp.info_base.base), ryu.lib.packet.bgp), 27
129 BGPFlowSpecTPIDActionCommunity (class in
AttrFlagError, 26 ryu.lib.packet.bgp), 27
attribute_map_get() BGPFlowSpecTrafficActionCommunity (class
in ryu.lib.packet.bgp), 27
589
ryu Documentation, Release 4.34
590 Index
ryu Documentation, Release 4.34
D EventOFPPortStateChange (class in
data_tlv (class in ryu.lib.packet.cfm), 53 ryu.controller.ofp_event), 13
Datapath (class in ryu.controller.controller), 12 EventOFPStateChange (class in
db_get_map() (ryu.lib.ovs.bridge.OVSBridge ryu.controller.ofp_event), 13
method), 136 EventPeerDown (class in
db_get_val() (ryu.lib.ovs.bridge.OVSBridge ryu.services.protocols.bgp.application), 582
method), 136 EventPeerUp (class in
del_client() (ryu.app.rest_vtep.RestVtepController ryu.services.protocols.bgp.application), 583
method), 580 EventPortAdd (class in ryu.controller.dpset), 14
del_controller() (ryu.lib.ovs.bridge.OVSBridge EventPortDelete (class in ryu.controller.dpset), 14
method), 136 EventPortModify (class in ryu.controller.dpset), 14
del_neighbor() (ryu.app.rest_vtep.RestVtepController EventPrefix (class in
method), 576 ryu.services.protocols.bgp.bgpspeaker), 127
del_network() (ryu.app.rest_vtep.RestVtepController EventReplyBase (class in ryu.controller.event), 13
method), 578 EventRequestBase (class in ryu.controller.event), 13
del_port() (ryu.lib.ovs.bridge.OVSBridge method), EventTunnelKeyAdd (class in
136 ryu.controller.tunnels), 15
del_qos() (ryu.lib.ovs.bridge.OVSBridge method), EventTunnelKeyDel (class in
137 ryu.controller.tunnels), 16
del_speaker() (ryu.app.rest_vtep.RestVtepController EventTunnelPort (class in ryu.controller.tunnels),
method), 574 16
delete_port() (ryu.lib.ovs.bridge.OVSBridge evpn_prefix_add()
method), 137 (ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker
dest_unreach (class in ryu.lib.packet.icmp), 63 method), 121
dhcp (class in ryu.lib.packet.dhcp), 57 evpn_prefix_del()
dhcp6 (class in ryu.lib.packet.dhcp6), 59 (ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker
DPSet (class in ryu.controller.dpset), 497 method), 122
dst_opts (class in ryu.lib.packet.ipv6), 74 EvpnArbitraryEsi (class in ryu.lib.packet.bgp), 32
EvpnASBasedEsi (class in ryu.lib.packet.bgp), 32
E EvpnEsi (class in ryu.lib.packet.bgp), 32
echo (class in ryu.lib.packet.icmp), 64 EvpnEthernetAutoDiscoveryNLRI (class in
echo (class in ryu.lib.packet.icmpv6), 65 ryu.lib.packet.bgp), 32
End (class in ryu.lib.packet.lldp), 80 EvpnEthernetSegmentNLRI (class in
ethernet (class in ryu.lib.packet.ethernet), 60 ryu.lib.packet.bgp), 32
EvpnInclusiveMulticastEthernetTagNLRI
evaluate() (ryu.services.protocols.bgp.info_base.base.ASPathFilter
method), 129 (class in ryu.lib.packet.bgp), 32
EvpnIpPrefixNLRI
evaluate() (ryu.services.protocols.bgp.info_base.base.AttributeMap (class in ryu.lib.packet.bgp), 32
method), 130 EvpnL2BridgeEsi (class in ryu.lib.packet.bgp), 33
EvpnLACPEsi
evaluate() (ryu.services.protocols.bgp.info_base.base.PrefixFilter (class in ryu.lib.packet.bgp), 33
method), 129 EvpnMacBasedEsi (class in ryu.lib.packet.bgp), 33
EventAdjRibInChanged (class in EvpnMacIPAdvertisementNLRI (class in
ryu.services.protocols.bgp.application), 582 ryu.lib.packet.bgp), 33
EventBase (class in ryu.controller.event), 13 EvpnNLRI (class in ryu.lib.packet.bgp), 33
EventBestPathChanged (class in EvpnRouterIDEsi (class in ryu.lib.packet.bgp), 33
ryu.services.protocols.bgp.application), 582 EvpnUnknownEsi (class in ryu.lib.packet.bgp), 33
EventDP (class in ryu.controller.dpset), 13 EvpnUnknownNLRI (class in ryu.lib.packet.bgp), 33
EventMacAddress (class in ryu.controller.network),
15
F
EventNetworkDel (class in ryu.controller.network), find_db_attributes()
15 (ryu.lib.ovs.bridge.OVSBridge method), 137
EventNetworkPort (class in ryu.controller.network), FiniteStateMachineError, 33
14 flowspec_prefix_add()
EventOFPMsgBase (class in ryu.controller.ofp_event), (ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker
11 method), 122
Index 591
ryu Documentation, Release 4.34
592 Index
ryu Documentation, Release 4.34
Index 593
ryu Documentation, Release 4.34
neighbors_get() (ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker
NXActionOutputTrunc (class in
method), 125 ryu.ofproto.ofproto_v1_3_parser), 492
NextHopBlackhole (class in ryu.lib.packet.zebra), NXActionPopMpls (class in
109 ryu.ofproto.ofproto_v1_0_parser), 475
NextHopIFIndex (class in ryu.lib.packet.zebra), 109 NXActionPopQueue (class in
NextHopIFName (class in ryu.lib.packet.zebra), 109 ryu.ofproto.ofproto_v1_3_parser), 477
NextHopIPv4 (class in ryu.lib.packet.zebra), 109 NXActionPushMpls (class in
NextHopIPv4IFIndex (class in ryu.lib.packet.zebra), ryu.ofproto.ofproto_v1_0_parser), 475
109 NXActionRegLoad (class in
NextHopIPv4IFName (class in ryu.lib.packet.zebra), ryu.ofproto.ofproto_v1_3_parser), 478
109 NXActionRegLoad2 (class in
NextHopIPv6 (class in ryu.lib.packet.zebra), 109 ryu.ofproto.ofproto_v1_3_parser), 478
NextHopIPv6IFIndex (class in ryu.lib.packet.zebra), NXActionRegMove (class in
109 ryu.ofproto.ofproto_v1_3_parser), 480
NextHopIPv6IFName (class in ryu.lib.packet.zebra), NXActionResubmit (class in
109 ryu.ofproto.ofproto_v1_3_parser), 480
NotSync, 40 NXActionResubmitTable (class in
nvgre() (in module ryu.lib.packet.gre), 63 ryu.ofproto.ofproto_v1_3_parser), 481
NXActionBundle (class in NXActionSample (class in
ryu.ofproto.ofproto_v1_3_parser), 489 ryu.ofproto.ofproto_v1_3_parser), 486
NXActionBundleLoad (class in NXActionSample2 (class in
ryu.ofproto.ofproto_v1_3_parser), 490 ryu.ofproto.ofproto_v1_3_parser), 487
NXActionConjunction (class in NXActionSetMplsLabel (class in
ryu.ofproto.ofproto_v1_3_parser), 488 ryu.ofproto.ofproto_v1_0_parser), 477
NXActionController (class in NXActionSetMplsTc (class in
ryu.ofproto.ofproto_v1_3_parser), 484 ryu.ofproto.ofproto_v1_0_parser), 477
NXActionController2 (class in NXActionSetMplsTtl (class in
ryu.ofproto.ofproto_v1_3_parser), 484 ryu.ofproto.ofproto_v1_0_parser), 476
NXActionCT (class in NXActionSetQueue (class in
ryu.ofproto.ofproto_v1_3_parser), 490 ryu.ofproto.ofproto_v1_0_parser), 474
NXActionDecMplsTtl (class in NXActionSetTunnel (class in
ryu.ofproto.ofproto_v1_0_parser), 476 ryu.ofproto.ofproto_v1_3_parser), 479
NXActionDecNshTtl (class in NXActionSetTunnel64 (class in
ryu.ofproto.ofproto_v1_3_parser), 493 ryu.ofproto.ofproto_v1_3_parser), 479
NXActionDecTtl (class in NXActionStackPop (class in
ryu.ofproto.ofproto_v1_0_parser), 475 ryu.ofproto.ofproto_v1_3_parser), 486
NXActionDecTtlCntIds (class in NXActionStackPush (class in
ryu.ofproto.ofproto_v1_3_parser), 485 ryu.ofproto.ofproto_v1_3_parser), 485
NXActionExit (class in NXFlowSpecLoad (class in
ryu.ofproto.ofproto_v1_3_parser), 484 ryu.ofproto.ofproto_v1_3_parser), 493
NXActionFinTimeout (class in NXFlowSpecMatch (class in
ryu.ofproto.ofproto_v1_3_parser), 487 ryu.ofproto.ofproto_v1_3_parser), 493
NXActionLearn (class in NXFlowSpecOutput (class in
ryu.ofproto.ofproto_v1_3_parser), 482 ryu.ofproto.ofproto_v1_3_parser), 493
NXActionMultipath (class in
ryu.ofproto.ofproto_v1_3_parser), 488 O
NXActionNAT (class in OFError, 516
ryu.ofproto.ofproto_v1_3_parser), 491 ofp_msg_from_jsondict() (in module
NXActionNote (class in ryu.ofproto.ofproto_parser), 140
ryu.ofproto.ofproto_v1_3_parser), 479 OFP_VERSIONS (ryu.base.app_manager.RyuApp
NXActionOutputReg (class in attribute), 496
ryu.ofproto.ofproto_v1_3_parser), 481 OFPAction (class in ryu.ofproto.ofproto_v1_0_parser),
NXActionOutputReg2 (class in 162
ryu.ofproto.ofproto_v1_3_parser), 482
594 Index
ryu Documentation, Release 4.34
Index 595
ryu Documentation, Release 4.34
596 Index
ryu Documentation, Release 4.34
Index 597
ryu Documentation, Release 4.34
598 Index
ryu Documentation, Release 4.34
Index 599
ryu Documentation, Release 4.34
600 Index
ryu Documentation, Release 4.34
Index 601
ryu Documentation, Release 4.34
602 Index
ryu Documentation, Release 4.34
Index 603
ryu Documentation, Release 4.34
604 Index
ryu Documentation, Release 4.34
Index 605
ryu Documentation, Release 4.34
606 Index