OpenFlow v1.5 Messages and Structures¶
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": {} }
-
class
ryu.ofproto.ofproto_v1_5_parser.
OFPSwitchFeatures
(datapath, datapath_id=None, n_buffers=None, n_tables=None, auxiliary_id=None, capabilities=None)¶ Features reply message
The switch responds with a features reply message to a features request.
This message is handled by the Ryu framework, so the Ryu application do not need to process this typically.
Example:
@set_ev_cls(ofp_event.EventOFPSwitchFeatures, CONFIG_DISPATCHER) def switch_features_handler(self, ev): msg = ev.msg self.logger.debug('OFPSwitchFeatures received: ' 'datapath_id=0x%016x n_buffers=%d ' 'n_tables=%d auxiliary_id=%d ' 'capabilities=0x%08x', msg.datapath_id, msg.n_buffers, msg.n_tables, msg.auxiliary_id, msg.capabilities)
JSON Example:
{ "OFPSwitchFeatures": { "auxiliary_id": 0, "capabilities": 79, "datapath_id": 1, "n_buffers": 255, "n_tables": 255 } }
Switch Configuration¶
-
class
ryu.ofproto.ofproto_v1_5_parser.
OFPSetConfig
(datapath, flags=0, miss_send_len=0)¶ Set config request message
The controller sends a set config request message to set configuraion parameters.
Attribute Description flags Bitmap of the following flags.
OFPC_FRAG_NORMALOFPC_FRAG_DROPOFPC_FRAG_REASMmiss_send_len Max bytes of new flow that datapath should send to the controller Example:
def send_set_config(self, datapath): ofp = datapath.ofproto ofp_parser = datapath.ofproto_parser req = ofp_parser.OFPSetConfig(datapath, ofp.OFPC_FRAG_NORMAL, 256) datapath.send_msg(req)
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:
def send_get_config_request(self, datapath): ofp_parser = datapath.ofproto_parser req = ofp_parser.OFPGetConfigRequest(datapath) datapath.send_msg(req)
JSON Example:
{ "OFPGetConfigRequest": {} }
-
class
ryu.ofproto.ofproto_v1_5_parser.
OFPGetConfigReply
(datapath, flags=None, miss_send_len=None)¶ Get config reply message
The switch responds to a configuration request with a get config reply message.
Attribute Description flags Bitmap of the following flags.
OFPC_FRAG_NORMALOFPC_FRAG_DROPOFPC_FRAG_REASMmiss_send_len Max bytes of new flow that datapath should send to the 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 flags = [] if msg.flags & ofp.OFPC_FRAG_NORMAL: flags.append('NORMAL') if msg.flags & ofp.OFPC_FRAG_DROP: flags.append('DROP') if msg.flags & ofp.OFPC_FRAG_REASM: flags.append('REASM') self.logger.debug('OFPGetConfigReply received: ' 'flags=%s miss_send_len=%d', ','.join(flags), msg.miss_send_len)
JSON Example:
{ "OFPGetConfigReply": { "flags": 0, "miss_send_len": 128 } }
Modify State Messages¶
-
class
ryu.ofproto.ofproto_v1_5_parser.
OFPTableMod
(datapath, table_id, config, properties)¶ Flow table configuration message
The controller sends this message to configure table state.
Attribute Description table_id ID of the table (OFPTT_ALL indicates all tables) config Bitmap of configuration flags.
OFPTC_EVICTIONOFPTC_VACANCY_EVENTSproperties List of OFPTableModProp
subclass instanceExample:
def send_table_mod(self, datapath): ofp = datapath.ofproto ofp_parser = datapath.ofproto_parser 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 } }
-
class
ryu.ofproto.ofproto_v1_5_parser.
OFPFlowMod
(datapath, cookie=0, cookie_mask=0, table_id=0, command=0, idle_timeout=0, hard_timeout=0, priority=32768, buffer_id=4294967295, out_port=0, out_group=0, flags=0, importance=0, match=None, instructions=None)¶ Modify Flow entry message
The controller sends this message to modify the flow table.
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*
orOFPFC_DELETE*
table_id ID of the table to put the flow in command One of the following values.
OFPFC_ADDOFPFC_MODIFYOFPFC_MODIFY_STRICTOFPFC_DELETEOFPFC_DELETE_STRICTidle_timeout Idle time before discarding (seconds) hard_timeout Max time before discarding (seconds) priority Priority level of flow entry buffer_id Buffered packet to apply to (or OFP_NO_BUFFER) out_port For OFPFC_DELETE*
commands, require matching entries to include this as an output portout_group For OFPFC_DELETE*
commands, require matching entries to include this as an output groupflags Bitmap of the following flags.
OFPFF_SEND_FLOW_REMOFPFF_CHECK_OVERLAPOFPFF_RESET_COUNTSOFPFF_NO_PKT_COUNTSOFPFF_NO_BYT_COUNTSimportance Eviction precedence match Instance of OFPMatch
instructions list of OFPInstruction*
instanceExample:
def send_flow_mod(self, datapath): ofp = datapath.ofproto ofp_parser = datapath.ofproto_parser 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)] 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, importance, match, inst) datapath.send_msg(req)
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": { "cookie": 0, "experimenter": 8992, "fin_hard_timeout": 0, "fin_idle_timeout": 0, "flags": 0, "hard_timeout": 300, "idle_timeout": 0, "len": 96, "priority": 1, "specs": [ { "NXFlowSpecMatch": { "dst": [ "vlan_vid", 0 ], "n_bits": 12, "src": [ "vlan_vid", 0 ] } }, { "NXFlowSpecMatch": { "dst": [ "eth_dst_nxm", 0 ], "n_bits": 48, "src": [ "eth_src_nxm", 0 ] } }, { "NXFlowSpecLoad": { "dst": [ "vlan_vid", 0 ], "n_bits": 12, "src": 0 } }, { "NXFlowSpecLoad": { "dst": [ "tunnel_id_nxm", 0 ], "n_bits": 64, "src": [ "tunnel_id_nxm", 0 ] } }, { "NXFlowSpecOutput": { "dst": "", "n_bits": 32, "src": [ "in_port", 0 ] } } ], "subtype": 16, "table_id": 99, "type": 65535 } } ], "len": 128, "type": 4 } }, { "OFPInstructionGotoTable": { "len": 8, "table_id": 100, "type": 1 } } ], "match": { "OFPMatch": { "length": 70, "oxm_fields": [ { "OXMTlv": { "field": "in_port", "mask": null, "value": 43981 } }, { "OXMTlv": { "field": "eth_dst", "mask": null, "value": "aa:bb:cc:99:88:77" } }, { "OXMTlv": { "field": "eth_type", "mask": null, "value": 2048 } }, { "OXMTlv": { "field": "vlan_vid", "mask": null, "value": 5095 } }, { "OXMTlv": { "field": "ipv4_dst", "mask": null, "value": "192.168.2.1" } }, { "OXMTlv": { "field": "tunnel_id", "mask": null, "value": 50000 } }, { "OXMTlv": { "field": "tun_ipv4_src", "mask": null, "value": "192.168.2.3" } }, { "OXMTlv": { "field": "tun_ipv4_dst", "mask": null, "value": "192.168.2.4" } } ], "type": 1 } }, "out_group": 0, "out_port": 0, "priority": 0, "table_id": 2 } }
{ "OFPFlowMod": { "buffer_id": 0, "command": 0, "cookie": 1311768467463790320, "cookie_mask": 18446744073709551615, "flags": 0, "hard_timeout": 0, "idle_timeout": 0, "importance": 39032, "instructions": [ { "OFPInstructionActions": { "actions": [ { "NXActionConjunction": { "clause": 1, "experimenter": 8992, "id": 11259375, "len": 16, "n_clauses": 2, "subtype": 34, "type": 65535 } } ], "len": 24, "type": 4 } } ], "match": { "OFPMatch": { "length": 70, "oxm_fields": [ { "OXMTlv": { "field": "in_port", "mask": null, "value": 43981 } }, { "OXMTlv": { "field": "eth_dst", "mask": null, "value": "aa:bb:cc:99:88:77" } }, { "OXMTlv": { "field": "eth_type", "mask": null, "value": 2048 } }, { "OXMTlv": { "field": "vlan_vid", "mask": null, "value": 5095 } }, { "OXMTlv": { "field": "ipv4_dst", "mask": null, "value": "192.168.2.1" } }, { "OXMTlv": { "field": "tunnel_id", "mask": null, "value": 50000 } }, { "OXMTlv": { "field": "tun_ipv4_src", "mask": null, "value": "192.168.2.3" } }, { "OXMTlv": { "field": "tun_ipv4_dst", "mask": null, "value": "192.168.2.4" } } ], "type": 1 } }, "out_group": 0, "out_port": 0, "priority": 0, "table_id": 4 } }
{ "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 } } ], "len": 32, "type": 4 } }, { "OFPInstructionGotoTable": { "len": 8, "table_id": 100, "type": 1 } } ], "match": { "OFPMatch": { "length": 12, "oxm_fields": [ { "OXMTlv": { "field": "conj_id", "mask": null, "value": 11259375 } } ], "type": 1 } }, "out_group": 0, "out_port": 0, "priority": 0, "table_id": 3 } }
-
class
ryu.ofproto.ofproto_v1_5_parser.
OFPGroupMod
(datapath, command=0, type_=0, group_id=0, command_bucket_id=4294967295, buckets=None, properties=None, bucket_array_len=None)¶ Modify group entry message
The controller sends this message to modify the group table.
Attribute Description command One of the following values.
OFPGC_ADDOFPGC_MODIFYOFPGC_DELETEOFPGC_INSERT_BUCKETOFPGC_REMOVE_BUCKETtype One of the following values.
OFPGT_ALLOFPGT_SELECTOFPGT_INDIRECTOFPGT_FFgroup_id Group identifier. command_bucket_id Bucket Id used as part of OFPGC_INSERT_BUCKET and OFPGC_REMOVE_BUCKET commands execution. buckets List of OFPBucket
instanceproperties List of OFPGroupProp
instancetype
attribute corresponds totype_
parameter of __init__.Example:
def send_group_mod(self, datapath): ofp = datapath.ofproto ofp_parser = datapath.ofproto_parser 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": [ { "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, "type": 25 } } ], "bucket_id": 305419896, "len": 56, "properties": [ { "OFPGroupBucketPropWeight": { "length": 8, "type": 0, "weight": 52428 } }, { "OFPGroupBucketPropWatch": { "length": 8, "type": 1, "watch": 56797 } }, { "OFPGroupBucketPropWatch": { "length": 8, "type": 2, "watch": 4008636142 } } ] } } ], "command": 3, "command_bucket_id": 3149642683, "group_id": 2863311530, "properties": [], "type": 1 } }
-
class
ryu.ofproto.ofproto_v1_5_parser.
OFPPortMod
(datapath, port_no=0, hw_addr='00:00:00:00:00:00', config=0, mask=0, properties=None)¶ Port modification message
The controller sneds this message to modify the behavior of the port.
Attribute Description port_no Port number to modify hw_addr The hardware address that must be the same as hw_addr of OFPPort
ofOFPSwitchFeatures
config Bitmap of configuration flags.
OFPPC_PORT_DOWNOFPPC_NO_RECVOFPPC_NO_FWDOFPPC_NO_PACKET_INmask Bitmap of configuration flags above to be changed properties List of OFPPortModProp
subclass instanceExample:
def send_port_mod(self, datapath): ofp = datapath.ofproto ofp_parser = datapath.ofproto_parser 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": [ { "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 } }, { "OFPPortModPropExperimenter": { "data": [ 1, 2 ], "exp_type": 2, "experimenter": 101, "length": 20, "type": 65535 } } ] } }
-
class
ryu.ofproto.ofproto_v1_5_parser.
OFPMeterMod
(datapath, command=0, flags=1, meter_id=1, bands=None)¶ Meter modification message
The controller sends this message to modify the meter.
Attribute Description command One of the following values.
OFPMC_ADDOFPMC_MODIFYOFPMC_DELETEflags Bitmap of the following flags.
OFPMF_KBPSOFPMF_PKTPSOFPMF_BURSTOFPMF_STATSmeter_id Meter instance bands list of the following class instance.
OFPMeterBandDropOFPMeterBandDscpRemarkOFPMeterBandExperimenterJSON 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¶
-
class
ryu.ofproto.ofproto_v1_5_parser.
OFPDescStatsRequest
(datapath, flags=0, type_=None)¶ Description statistics request message
The controller uses this message to query description of the switch.
Attribute Description flags Zero or OFPMPF_REQ_MORE
Example:
def send_desc_stats_request(self, datapath): ofp_parser = datapath.ofproto_parser req = ofp_parser.OFPDescStatsRequest(datapath, 0) datapath.send_msg(req)
JSON Example:
{ "OFPDescStatsRequest": { "flags": 0, "type": 0 } }
-
class
ryu.ofproto.ofproto_v1_5_parser.
OFPDescStatsReply
(datapath, type_=None, **kwargs)¶ Description statistics reply message
The switch responds with this message to a description statistics request.
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 self.logger.debug('DescStats: mfr_desc=%s hw_desc=%s sw_desc=%s ' 'serial_num=%s dp_desc=%s', body.mfr_desc, body.hw_desc, body.sw_desc, body.serial_num, body.dp_desc)
JSON Example:
{ "OFPDescStatsReply": { "body": { "OFPDescStats": { "dp_desc": "dp", "hw_desc": "hw", "mfr_desc": "mfr", "serial_num": "serial", "sw_desc": "sw" } }, "flags": 0, "type": 0 } }
-
class
ryu.ofproto.ofproto_v1_5_parser.
OFPFlowDescStatsRequest
(datapath, flags=0, table_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, "match": { "OFPMatch": { "length": 12, "oxm_fields": [ { "OXMTlv": { "field": "in_port", "mask": null, "value": 1 } } ], "type": 1 } }, "out_group": 4294967295, "out_port": 4294967295, "table_id": 1, "type": 1 } }
-
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
instanceExample:
@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": { "cookie": 1234605616436508552, "flags": 1, "hard_timeout": 255, "idle_timeout": 255, "importance": 43690, "instructions": [ { "OFPInstructionGotoTable": { "len": 8, "table_id": 2, "type": 1 } } ], "length": 64, "match": { "OFPMatch": { "length": 12, "oxm_fields": [ { "OXMTlv": { "field": "in_port", "mask": null, "value": 1 } } ], "type": 1 } }, "priority": 5, "stats": { "OFPStats": { "length": 12, "oxs_fields": [ { "OXSTlv": { "field": "flow_count", "value": 1 } } ] } }, "table_id": 1 } } ], "flags": 0, "type": 1 } }
-
class
ryu.ofproto.ofproto_v1_5_parser.
OFPFlowStatsRequest
(datapath, flags=0, table_id=255, out_port=4294967295, out_group=4294967295, cookie=0, cookie_mask=0, match=None, type_=None)¶ Individual flow statistics request message
The controller uses this message to query individual flow statistics.
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_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.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 } }
-
class
ryu.ofproto.ofproto_v1_5_parser.
OFPFlowStatsReply
(datapath, type_=None, **kwargs)¶ Individual flow statistics reply message
The switch responds with this message to an individual flow statistics request.
Attribute Description body List of OFPFlowStats
instanceExample:
@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 } } ] } }, "table_id": 1 } } ], "flags": 0, "type": 17 } }
-
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, "match": { "OFPMatch": { "length": 4, "oxm_fields": [], "type": 1 } }, "out_group": 4294967295, "out_port": 4294967295, "table_id": 255, "type": 2 } }
-
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 self.logger.debug('AggregateStats: stats=%s', body.stats)
JSON Example:
{ "OFPAggregateStatsReply": { "body": { "OFPAggregateStats": { "length": 16, "stats": { "OFPStats": { "length": 12, "oxs_fields": [ { "OXSTlv": { "field": "flow_count", "value": 1 } } ] } } } }, "flags": 0, "type": 2 } }
-
class
ryu.ofproto.ofproto_v1_5_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:
def send_port_stats_request(self, datapath): ofp = datapath.ofproto ofp_parser = datapath.ofproto_parser req = ofp_parser.OFPPortStatsRequest(datapath, 0, ofp.OFPP_ANY) datapath.send_msg(req)
JSON Example:
{ "OFPPortStatsRequest": { "flags": 0, "port_no": 4294967295, "type": 4 } }
-
class
ryu.ofproto.ofproto_v1_5_parser.
OFPPortStatsReply
(datapath, type_=None, **kwargs)¶ Port statistics reply message
The switch responds with this message to a port statistics request.
Attribute Description body List of OFPPortStats
instanceExample:
@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 } }, { "OFPPortStatsPropExperimenter": { "data": [ 1, 2 ], "exp_type": 2, "experimenter": 101, "length": 20, "type": 65535 } } ], "rx_bytes": 0, "rx_dropped": 0, "rx_errors": 0, "rx_packets": 0, "tx_bytes": 336, "tx_dropped": 0, "tx_errors": 0, "tx_packets": 4 } }, { "OFPPortStats": { "duration_nsec": 0, "duration_sec": 0, "length": 120, "port_no": 6, "properties": [ { "OFPPortStatsPropEthernet": { "collisions": 0, "length": 40, "rx_crc_err": 0, "rx_frame_err": 0, "rx_over_err": 0, "type": 0 } } ], "rx_bytes": 336, "rx_dropped": 0, "rx_errors": 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_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:
def send_port_desc_stats_request(self, datapath): ofp = datapath.ofproto ofp_parser = datapath.ofproto_parser req = ofp_parser.OFPPortDescStatsRequest(datapath, 0, ofp.OFPP_ANY) datapath.send_msg(req)
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
instanceExample:
@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 } }, { "OFPPortDescPropExperimenter": { "data": [ 1, 2 ], "exp_type": 2, "experimenter": 101, "length": 20, "type": 65535 } } ], "state": 4 } }, { "OFPPort": { "config": 0, "hw_addr": "f2:0b:a4:7d:f8:ea", "length": 72, "name": "Port6", "port_no": 6, "properties": [ { "OFPPortDescPropEthernet": { "advertised": 10240, "curr": 10248, "curr_speed": 5000, "length": 32, "max_speed": 5000, "peer": 10248, "supported": 10248, "type": 0 } } ], "state": 4 } } ], "flags": 0, "type": 13 } }
-
class
ryu.ofproto.ofproto_v1_5_parser.
OFPQueueStatsRequest
(datapath, flags=0, port_no=4294967295, queue_id=4294967295, type_=None)¶ Queue statistics request message
The controller uses this message to query queue statictics.
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 req = ofp_parser.OFPQueueStatsRequest(datapath, 0, ofp.OFPP_ANY, ofp.OFPQ_ALL) datapath.send_msg(req)
JSON Example:
{ "OFPQueueStatsRequest": { "flags": 0, "port_no": 43981, "queue_id": 4294967295, "type": 5 } }
-
class
ryu.ofproto.ofproto_v1_5_parser.
OFPQueueStatsReply
(datapath, type_=None, **kwargs)¶ Queue statistics reply message
The switch responds with this message to an aggregate flow statistics request.
Attribute Description body List of OFPQueueStats
instanceExample:
@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 } } ], "queue_id": 1, "tx_bytes": 0, "tx_errors": 0, "tx_packets": 0 } }, { "OFPQueueStats": { "duration_nsec": 0, "duration_sec": 0, "length": 48, "port_no": 6, "properties": [], "queue_id": 1, "tx_bytes": 0, "tx_errors": 0, "tx_packets": 0 } }, { "OFPQueueStats": { "duration_nsec": 0, "duration_sec": 0, "length": 48, "port_no": 7, "properties": [], "queue_id": 2, "tx_bytes": 0, "tx_errors": 0, "tx_packets": 0 } } ], "flags": 0, "type": 5 } }
-
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:
def send_queue_desc_stats_request(self, datapath): ofp = datapath.ofproto ofp_parser = datapath.ofproto_parser 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
instanceExample:
@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": { "length": 8, "rate": 900, "type": 2 } }, { "OFPQueueDescPropExperimenter": { "data": [], "exp_type": 0, "experimenter": 101, "length": 12, "type": 65535 } }, { "OFPQueueDescPropExperimenter": { "data": [ 1 ], "exp_type": 1, "experimenter": 101, "length": 16, "type": 65535 } }, { "OFPQueueDescPropExperimenter": { "data": [ 1, 2 ], "exp_type": 2, "experimenter": 101, "length": 20, "type": 65535 } } ], "queue_id": 1 } } ], "flags": 0, "type": 15 } }
-
class
ryu.ofproto.ofproto_v1_5_parser.
OFPGroupStatsRequest
(datapath, flags=0, group_id=4294967292, type_=None)¶ Group statistics request message
The controller uses this message to query statistics of one or more groups.
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 req = ofp_parser.OFPGroupStatsRequest(datapath, 0, ofp.OFPG_ALL) datapath.send_msg(req)
JSON Example:
{ "OFPGroupStatsRequest": { "flags": 0, "group_id": 4294967292, "type": 6 } }
-
class
ryu.ofproto.ofproto_v1_5_parser.
OFPGroupStatsReply
(datapath, type_=None, **kwargs)¶ Group statistics reply message
The switch responds with this message to a group statistics request.
Attribute Description body List of OFPGroupStats
instanceExample:
@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 } } ], "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_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:
def send_group_desc_stats_request(self, datapath): ofp = datapath.ofproto ofp_parser = datapath.ofproto_parser req = ofp_parser.OFPGroupDescStatsRequest(datapath, 0, ofp.OFPG_ALL) datapath.send_msg(req)
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
instanceExample:
@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 } }
-
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 self.logger.debug('GroupFeaturesStats: types=%d ' 'capabilities=0x%08x max_groups=%s ' 'actions=%s', body.types, body.capabilities, body.max_groups, body.actions)
JSON Example:
{ "OFPGroupFeaturesStatsReply": { "body": { "OFPGroupFeaturesStats": { "actions": [ 67082241, 67082241, 67082241, 67082241 ], "capabilities": 5, "max_groups": [ 16777216, 16777216, 16777216, 16777216 ], "types": 15 } }, "flags": 0, "type": 8 } }
-
class
ryu.ofproto.ofproto_v1_5_parser.
OFPMeterStatsRequest
(datapath, flags=0, meter_id=4294967295, type_=None)¶ Meter statistics request message
The controller uses this message to query statistics 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_stats_request(self, datapath): ofp = datapath.ofproto ofp_parser = datapath.ofproto_parser req = ofp_parser.OFPMeterStatsRequest(datapath, 0, ofp.OFPM_ALL) datapath.send_msg(req)
JSON Example:
{ "OFPMeterStatsRequest": { "flags": 0, "meter_id": 4294967295, "type": 9 } }
-
class
ryu.ofproto.ofproto_v1_5_parser.
OFPMeterStatsReply
(datapath, type_=None, **kwargs)¶ Meter statistics reply message
The switch responds with this message to a meter statistics request.
Attribute Description body List of OFPMeterStats
instanceExample:
@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, meter_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
instanceExample:
@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": { "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_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:
def send_meter_features_stats_request(self, datapath): ofp_parser = datapath.ofproto_parser 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
instanceExample:
@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:
def send_controller_status_multipart_request(self, datapath): ofp_parser = datapath.ofproto_parser req = ofp_parser.OFPPortDescStatsRequest(datapath, 0) datapath.send_msg(req)
JSON Example:
{ "OFPControllerStatusStatsRequest": { "flags": 0, "type": 18 } }
-
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
instanceExample:
@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 } }
-
class
ryu.ofproto.ofproto_v1_5_parser.
OFPTableStatsRequest
(datapath, flags, type_=None)¶ Table statistics request message
The controller uses this message to query flow table statictics.
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 } }
-
class
ryu.ofproto.ofproto_v1_5_parser.
OFPTableStatsReply
(datapath, type_=None, **kwargs)¶ Table statistics reply message
The switch responds with this message to a table statistics request.
Attribute Description body List of OFPTableStats
instanceExample:
@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": { "active_count": 4, "lookup_count": 4, "matched_count": 4, "table_id": 1 } } ], "flags": 0, "type": 3 } }
-
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:
def send_table_desc_stats_request(self, datapath): ofp_parser = datapath.ofproto_parser 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
instanceExample:
@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 } }, { "OFPTableModPropExperimenter": { "data": [], "exp_type": 0, "experimenter": 101, "length": 12, "type": 65535 } }, { "OFPTableModPropExperimenter": { "data": [ 1 ], "exp_type": 1, "experimenter": 101, "length": 16, "type": 65535 } }, { "OFPTableModPropExperimenter": { "data": [ 1, 2 ], "exp_type": 2, "experimenter": 101, "length": 20, "type": 65535 } } ], "table_id": 8 } } ], "flags": 0, "type": 14 } }
-
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
instanceJSON Example:
{ "OFPTableFeaturesStatsReply": { "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.
OFPFlowMonitorRequest
(datapath, flags=0, monitor_id=0, out_port=4294967295, out_group=4294967295, monitor_flags=0, table_id=255, command=0, match=None, type_=None)¶ Flow monitor request message
The controller uses this message to query flow monitors.
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_INITIALOFPFMF_ADDOFPFMF_REMOVEDOFPFMF_MODIFYOFPFMF_INSTRUCTIONSOFPFMF_NO_ABBREVOFPFMF_ONLY_OWNtable_id ID of table to monitor command One of the following values.
OFPFMC_ADDOFPFMC_MODIFYOFPFMC_DELETEmatch Instance of OFPMatch
Example:
def send_flow_monitor_request(self, datapath): ofp = datapath.ofproto ofp_parser = datapath.ofproto_parser monitor_flags = [ofp.OFPFMF_INITIAL, ofp.OFPFMF_ONLY_OWN] match = ofp_parser.OFPMatch(in_port=1) req = ofp_parser.OFPFlowMonitorRequest(datapath, 0, 10000, ofp.OFPP_ANY, ofp.OFPG_ANY, monitor_flags, ofp.OFPTT_ALL, ofp.OFPFMC_ADD, match) datapath.send_msg(req)
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 } }
-
class
ryu.ofproto.ofproto_v1_5_parser.
OFPFlowMonitorReply
(datapath, type_=None, **kwargs)¶ Flow monitor reply message
The switch responds with this message to a flow monitor request.
Attribute Description body List of list of the following class instance.
OFPFlowMonitorFullOFPFlowMonitorAbbrevOFPFlowMonitorPausedExample:
@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 = [] for update in msg.body: update_str = 'length=%d event=%d' % (update.length, update.event) if (update.event == ofp.OFPFME_INITIAL or update.event == ofp.OFPFME_ADDED or update.event == ofp.OFPFME_REMOVED or update.event == ofp.OFPFME_MODIFIED): update_str += 'table_id=%d reason=%d idle_timeout=%d ' 'hard_timeout=%d priority=%d cookie=%d ' 'match=%d instructions=%s' % (update.table_id, update.reason, update.idle_timeout, update.hard_timeout, update.priority, update.cookie, update.match, update.instructions) elif update.event == ofp.OFPFME_ABBREV: update_str += 'xid=%d' % (update.xid) flow_updates.append(update_str) self.logger.debug('FlowUpdates: %s', 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": { "event": 4, "length": 8, "xid": 1234 } }, { "OFPFlowUpdatePaused": { "event": 5, "length": 8 } } ], "flags": 0, "type": 16 } }
-
class
ryu.ofproto.ofproto_v1_5_parser.
OFPBundleFeaturesStatsRequest
(datapath, flags=0, feature_request_flags=0, properties=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_TIMESTAMPOFPBF_TIME_SET_SCHEDproperties List of OFPBundleFeaturesProp
subclass instanceExample:
def send_bundle_features_stats_request(self, datapath): ofp = datapath.ofproto ofp_parser = datapath.ofproto_parser req = ofp_parser.OFPBundleFeaturesStatsRequest(datapath, 0) datapath.send_msg(req)
JSON Example:
{ "OFPBundleFeaturesStatsRequest": { "feature_request_flags": 3, "flags": 0, "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 } } ], "type": 19 } }
-
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 self.logger.debug('OFPBundleFeaturesStats: capabilities=%0x%08x ' 'properties=%s', body.capabilities, repr(body.properties))
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, experimenter, 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
instanceJSON Example:
{ "OFPExperimenterStatsReply": { "body": { "OFPExperimenterMultipart": { "data": "dGVzdGRhdGE5OTk5OTk5OQ==", "exp_type": 3405674359, "experimenter": 3735928495 } }, "flags": 0, "type": 65535 } }
Packet-Out Message¶
-
class
ryu.ofproto.ofproto_v1_5_parser.
OFPPacketOut
(datapath, buffer_id=None, match=None, actions=None, data=None, actions_len=None)¶ 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) 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:
def send_packet_out(self, datapath, buffer_id, in_port): ofp = datapath.ofproto ofp_parser = datapath.ofproto_parser 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:
def send_barrier_request(self, datapath): ofp_parser = datapath.ofproto_parser 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": {} }
Role Request Message¶
-
class
ryu.ofproto.ofproto_v1_5_parser.
OFPRoleRequest
(datapath, role=None, short_id=None, generation_id=None)¶ Role request message
The controller uses this message to change its role.
Attribute Description role One of the following values.
OFPCR_ROLE_NOCHANGEOFPCR_ROLE_EQUALOFPCR_ROLE_MASTEROFPCR_ROLE_SLAVEshort_id ID number for the controller. The default is OFPCID_UNDEFINED. generation_id Master Election Generation ID Example:
def send_role_request(self, datapath): ofp = datapath.ofproto ofp_parser = datapath.ofproto_parser req = ofp_parser.OFPRoleRequest(datapath, ofp.OFPCR_ROLE_EQUAL, ofp.OFPCID_UNDEFINED, 0) datapath.send_msg(req)
JSON Example:
{ "OFPRoleRequest": { "generation_id": 1234605616436508552, "role": 1, "short_id": 43690 } }
-
class
ryu.ofproto.ofproto_v1_5_parser.
OFPRoleReply
(datapath, role=None, short_id=None, generation_id=None)¶ Role reply message
The switch responds with this message to a role request.
Attribute Description role One of the following values.
OFPCR_ROLE_NOCHANGEOFPCR_ROLE_EQUALOFPCR_ROLE_MASTEROFPCR_ROLE_SLAVEshort_id ID number for the controller. The default is OFPCID_UNDEFINED. generation_id Master Election Generation ID 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' self.logger.debug('OFPRoleReply received: ' 'role=%s short_id=%d, generation_id=%d', role, msg.short_id, msg.generation_id)
JSON Example:
{ "OFPRoleReply": { "generation_id": 1234605616436508552, "role": 1, "short_id": 43690 } }
Bundle Messages¶
-
class
ryu.ofproto.ofproto_v1_5_parser.
OFPBundleCtrlMsg
(datapath, bundle_id=None, type_=None, flags=None, properties=None)¶ Bundle control message
The controller uses this message to create, destroy and commit bundles
Attribute Description bundle_id Id of the bundle type One of the following values.
OFPBCT_OPEN_REQUESTOFPBCT_OPEN_REPLYOFPBCT_CLOSE_REQUESTOFPBCT_CLOSE_REPLYOFPBCT_COMMIT_REQUESTOFPBCT_COMMIT_REPLYOFPBCT_DISCARD_REQUESTOFPBCT_DISCARD_REPLYflags Bitmap of the following flags.
OFPBF_ATOMICOFPBF_ORDEREDproperties List of OFPBundleProp
subclass instanceExample:
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": 99999999, "flags": 1, "properties": [], "type": 1 } }
-
class
ryu.ofproto.ofproto_v1_5_parser.
OFPBundleAddMsg
(datapath, bundle_id, flags, message, properties)¶ Bundle add message
The controller uses this message to add a message to a bundle
Attribute Description bundle_id Id of the bundle flags Bitmap of the following flags.
OFPBF_ATOMICOFPBF_ORDEREDmessage MsgBase
subclass instanceproperties List of OFPBundleProp
subclass instanceExample:
def send_bundle_add_message(self, datapath): ofp = datapath.ofproto ofp_parser = datapath.ofproto_parser msg = ofp_parser.OFPRoleRequest(datapath, ofp.OFPCR_ROLE_EQUAL, 0) req = ofp_parser.OFPBundleAddMsg(datapath, 7, ofp.OFPBF_ATOMIC, msg, []) datapath.send_msg(req)
JSON Example:
{ "OFPBundleAddMsg": { "bundle_id": 99999999, "flags": 1, "message": { "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": { "cookie": 0, "experimenter": 8992, "fin_hard_timeout": 0, "fin_idle_timeout": 0, "flags": 0, "hard_timeout": 300, "idle_timeout": 0, "len": 96, "priority": 1, "specs": [ { "NXFlowSpecMatch": { "dst": [ "vlan_vid", 0 ], "n_bits": 12, "src": [ "vlan_vid", 0 ] } }, { "NXFlowSpecMatch": { "dst": [ "eth_dst_nxm", 0 ], "n_bits": 48, "src": [ "eth_src_nxm", 0 ] } }, { "NXFlowSpecLoad": { "dst": [ "vlan_vid", 0 ], "n_bits": 12, "src": 0 } }, { "NXFlowSpecLoad": { "dst": [ "tunnel_id_nxm", 0 ], "n_bits": 64, "src": [ "tunnel_id_nxm", 0 ] } }, { "NXFlowSpecOutput": { "dst": "", "n_bits": 32, "src": [ "in_port", 0 ] } } ], "subtype": 16, "table_id": 99, "type": 65535 } } ], "len": 128, "type": 4 } }, { "OFPInstructionGotoTable": { "len": 8, "table_id": 100, "type": 1 } } ], "match": { "OFPMatch": { "length": 70, "oxm_fields": [ { "OXMTlv": { "field": "in_port", "mask": null, "value": 43981 } }, { "OXMTlv": { "field": "eth_dst", "mask": null, "value": "aa:bb:cc:99:88:77" } }, { "OXMTlv": { "field": "eth_type", "mask": null, "value": 2048 } }, { "OXMTlv": { "field": "vlan_vid", "mask": null, "value": 5095 } }, { "OXMTlv": { "field": "ipv4_dst", "mask": null, "value": "192.168.2.1" } }, { "OXMTlv": { "field": "tunnel_id", "mask": null, "value": 50000 } }, { "OXMTlv": { "field": "tun_ipv4_src", "mask": null, "value": "192.168.2.3" } }, { "OXMTlv": { "field": "tun_ipv4_dst", "mask": null, "value": "192.168.2.4" } } ], "type": 1 } }, "out_group": 0, "out_port": 0, "priority": 0, "table_id": 2 } }, "properties": [] } }
Set Asynchronous Configuration Message¶
-
class
ryu.ofproto.ofproto_v1_5_parser.
OFPSetAsync
(datapath, properties=None)¶ Set asynchronous configuration message
The controller sends this message to set the asynchronous messages that it wants to receive on a given OpneFlow channel.
Attribute Description properties List of OFPAsyncConfigProp
subclass instancesExample:
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 } }, { "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 } }, { "OFPAsyncConfigPropReasons": { "length": 8, "mask": 3, "type": 7 } }, { "OFPAsyncConfigPropReasons": { "length": 8, "mask": 24, "type": 8 } }, { "OFPAsyncConfigPropReasons": { "length": 8, "mask": 24, "type": 9 } }, { "OFPAsyncConfigPropReasons": { "length": 8, "mask": 3, "type": 10 } }, { "OFPAsyncConfigPropReasons": { "length": 8, "mask": 3, "type": 11 } }, { "OFPAsyncConfigPropExperimenter": { "data": [], "exp_type": 0, "experimenter": 101, "length": 12, "type": 65534 } }, { "OFPAsyncConfigPropExperimenter": { "data": [ 1 ], "exp_type": 1, "experimenter": 101, "length": 16, "type": 65535 } }, { "OFPAsyncConfigPropExperimenter": { "data": [ 1, 2 ], "exp_type": 2, "experimenter": 101, "length": 20, "type": 65535 } } ] } }
-
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": {} }
-
class
ryu.ofproto.ofproto_v1_5_parser.
OFPGetAsyncReply
(datapath, properties=None)¶ Get asynchronous configuration reply message
The switch responds with this message to a get asynchronous configuration request.
Attribute Description properties List of OFPAsyncConfigProp
subclass instancesExample:
@set_ev_cls(ofp_event.EventOFPGetAsyncReply, MAIN_DISPATCHER) def get_async_reply_handler(self, ev): msg = ev.msg self.logger.debug('OFPGetAsyncReply received: ' 'properties=%s', repr(msg.properties))
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 } }, { "OFPAsyncConfigPropReasons": { "length": 8, "mask": 3, "type": 7 } }, { "OFPAsyncConfigPropReasons": { "length": 8, "mask": 24, "type": 8 } }, { "OFPAsyncConfigPropReasons": { "length": 8, "mask": 24, "type": 9 } }, { "OFPAsyncConfigPropReasons": { "length": 8, "mask": 3, "type": 10 } }, { "OFPAsyncConfigPropReasons": { "length": 8, "mask": 3, "type": 11 } }, { "OFPAsyncConfigPropExperimenter": { "data": [], "exp_type": 0, "experimenter": 101, "length": 12, "type": 65534 } }, { "OFPAsyncConfigPropExperimenter": { "data": [ 1 ], "exp_type": 1, "experimenter": 101, "length": 16, "type": 65535 } }, { "OFPAsyncConfigPropExperimenter": { "data": [ 1, 2 ], "exp_type": 2, "experimenter": 101, "length": 20, "type": 65535 } } ] } }
Asynchronous Messages¶
Packet-In Message¶
-
class
ryu.ofproto.ofproto_v1_5_parser.
OFPPacketIn
(datapath, buffer_id=None, total_len=None, reason=None, table_id=None, cookie=None, match=None, data=None)¶ 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_MISSOFPR_APPLY_ACTIONOFPR_INVALID_TTLOFPR_ACTION_SETOFPR_GROUPOFPR_PACKET_OUTtable_id ID of the table that was looked up cookie Cookie of the flow entry that was looked up match Instance of OFPMatch
data Ethernet frame 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' self.logger.debug('OFPPacketIn received: ' 'buffer_id=%x total_len=%d reason=%s ' 'table_id=%d cookie=%d match=%s data=%s', msg.buffer_id, msg.total_len, reason, msg.table_id, msg.cookie, msg.match, utils.hex_array(msg.data))
JSON Example:
{ "OFPPacketIn": { "buffer_id": 200, "cookie": 0, "data": "aG9nZQ==", "match": { "OFPMatch": { "length": 40, "oxm_fields": [ { "OXMTlv": { "field": "in_port", "mask": null, "value": 43981 } }, { "OXMTlv": { "field": "tunnel_id", "mask": null, "value": 50000 } }, { "OXMTlv": { "field": "tun_ipv4_src", "mask": null, "value": "192.168.2.3" } }, { "OXMTlv": { "field": "tun_ipv4_dst", "mask": null, "value": "192.168.2.4" } } ], "type": 1 } }, "reason": 0, "table_id": 100, "total_len": 1000 } }
Flow Removed Message¶
-
class
ryu.ofproto.ofproto_v1_5_parser.
OFPFlowRemoved
(datapath, table_id=None, reason=None, priority=None, idle_timeout=None, hard_timeout=None, cookie=None, match=None, stats=None)¶ Flow removed message
When flow entries time out or are deleted, the switch notifies controller with this message.
Attribute Description table_id ID of the table reason One of the following values.
OFPRR_IDLE_TIMEOUTOFPRR_HARD_TIMEOUTOFPRR_DELETEOFPRR_GROUP_DELETEOFPRR_METER_DELETEOFPRR_EVICTIONpriority Priority level of flow entry idle_timeout Idle timeout from original flow mod hard_timeout Hard timeout from original flow mod cookie Opaque controller-issued identifier match Instance of OFPMatch
stats Instance of OFPStats
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' self.logger.debug('OFPFlowRemoved received: ' 'table_id=%d reason=%s priority=%d ' 'idle_timeout=%d hard_timeout=%d cookie=%d ' 'match=%s stats=%s', msg.table_id, reason, msg.priority, msg.idle_timeout, msg.hard_timeout, msg.cookie, msg.match, msg.stats)
JSON Example:
{ "OFPFlowRemoved": { "cookie": 1234605616436508552, "hard_timeout": 255, "idle_timeout": 255, "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 } } ] } }, "table_id": 1 } }
Port Status Message¶
-
class
ryu.ofproto.ofproto_v1_5_parser.
OFPPortStatus
(datapath, reason=None, desc=None)¶ Port status message
The switch notifies controller of change of ports.
Attribute Description reason One of the following values.
OFPPR_ADDOFPPR_DELETEOFPPR_MODIFYdesc instance of OFPPort
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' self.logger.debug('OFPPortStatus received: reason=%s desc=%s', reason, msg.desc)
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 } }, { "OFPPortDescPropExperimenter": { "data": [], "exp_type": 0, "experimenter": 101, "length": 12, "type": 65535 } }, { "OFPPortDescPropExperimenter": { "data": [ 1 ], "exp_type": 1, "experimenter": 101, "length": 16, "type": 65535 } }, { "OFPPortDescPropExperimenter": { "data": [ 1, 2 ], "exp_type": 2, "experimenter": 101, "length": 20, "type": 65535 } } ], "state": 4 } }, "reason": 0 } }
Controller Role Status Message¶
-
class
ryu.ofproto.ofproto_v1_5_parser.
OFPRoleStatus
(datapath, role=None, reason=None, generation_id=None, properties=None)¶ Role status message
The switch notifies controller of change of role.
Attribute Description role One of the following values.
OFPCR_ROLE_NOCHANGEOFPCR_ROLE_EQUALOFPCR_ROLE_MASTERreason One of the following values.
OFPCRR_MASTER_REQUESTOFPCRR_CONFIGOFPCRR_EXPERIMENTERgeneration_id Master Election Generation ID properties List of OFPRoleProp
subclass instanceExample:
@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' self.logger.debug('OFPRoleStatus received: role=%s reason=%s ' 'generation_id=%d properties=%s', role, reason, msg.generation_id, repr(msg.properties))
JSON Example:
{ "OFPRoleStatus": { "generation_id": 17356517385562371090, "properties": [], "reason": 0, "role": 3 } }
Table Status Message¶
-
class
ryu.ofproto.ofproto_v1_5_parser.
OFPTableStatus
(datapath, reason=None, table=None)¶ Table status message
The switch notifies controller of change of table status.
Attribute Description reason One of the following values.
OFPTR_VACANCY_DOWNOFPTR_VACANCY_UPtable OFPTableDesc
instanceExample:
@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' self.logger.debug('OFPTableStatus received: reason=%s ' 'table_id=%d config=0x%08x properties=%s', reason, msg.table.table_id, msg.table.config, repr(msg.table.properties))
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 } }, { "OFPTableModPropExperimenter": { "data": [], "exp_type": 0, "experimenter": 101, "length": 12, "type": 65535 } }, { "OFPTableModPropExperimenter": { "data": [ 1 ], "exp_type": 1, "experimenter": 101, "length": 16, "type": 65535 } }, { "OFPTableModPropExperimenter": { "data": [ 1, 2 ], "exp_type": 2, "experimenter": 101, "length": 20, "type": 65535 } } ], "table_id": 8 } } } }
Request Forward Message¶
-
class
ryu.ofproto.ofproto_v1_5_parser.
OFPRequestForward
(datapath, request=None)¶ Forwarded request message
The swtich forwards request messages from one controller to other controllers.
Attribute Description request OFPGroupMod
orOFPMeterMod
instanceExample:
@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, "type": 25 } } ], "bucket_id": 305419896, "len": 56, "properties": [ { "OFPGroupBucketPropWeight": { "length": 8, "type": 0, "weight": 52428 } }, { "OFPGroupBucketPropWatch": { "length": 8, "type": 1, "watch": 56797 } }, { "OFPGroupBucketPropWatch": { "length": 8, "type": 2, "watch": 4008636142 } } ] } } ], "command": 3, "command_bucket_id": 3149642683, "group_id": 2863311530, "properties": [], "type": 1 } } } }
Controller Status Message¶
-
class
ryu.ofproto.ofproto_v1_5_parser.
OFPControllerStatus
(datapath, status=None)¶ Controller status message
The switch informs the controller about the status of the control channel it maintains with each controller.
Attribute Description status OFPControllerStatusStats
instanceExample:
@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' self.logger.debug('OFPControllerStatus received: short_id=%d' 'role=%s reason=%s channel_status=%s ' 'properties=%s', status.short_id, role, reason, channel_status, repr(status.properties))
JSON Example:
{ "OFPControllerStatus": { "status": { "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 } } } }
Symmetric Messages¶
Hello¶
-
class
ryu.ofproto.ofproto_v1_5_parser.
OFPHello
(datapath, elements=None)¶ 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.
Attribute Description elements list of OFPHelloElemVersionBitmap
instanceJSON 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¶
-
class
ryu.ofproto.ofproto_v1_5_parser.
OFPEchoRequest
(datapath, data=None)¶ Echo request message
This message is handled by the Ryu framework, so the Ryu application do not need to process this typically.
Attribute Description data An arbitrary length data Example:
def send_echo_request(self, datapath, data): ofp_parser = datapath.ofproto_parser req = ofp_parser.OFPEchoRequest(datapath, data) datapath.send_msg(req) @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¶
-
class
ryu.ofproto.ofproto_v1_5_parser.
OFPEchoReply
(datapath, data=None)¶ Echo reply message
This message is handled by the Ryu framework, so the Ryu application do not need to process this typically.
Attribute Description data An arbitrary length data Example:
def send_echo_reply(self, datapath, data): ofp_parser = datapath.ofproto_parser reply = ofp_parser.OFPEchoReply(datapath, data) datapath.send_msg(reply) @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¶
-
class
ryu.ofproto.ofproto_v1_5_parser.
OFPErrorMsg
(datapath, type_=None, code=None, data=None, **kwargs)¶ Error message
The switch notifies controller of problems by this 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
attribute corresponds totype_
parameter of __init__.Types and codes are defined in
ryu.ofproto.ofproto
.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 If
type == OFPET_EXPERIMENTER
, this message has also the following attributes.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 self.logger.debug('OFPErrorMsg received: type=0x%02x code=0x%02x ' 'message=%s', msg.type, msg.code, utils.hex_array(msg.data))
JSON Example:
{ "OFPErrorMsg": { "code": 6, "data": "Bg4ACAAAAAA=", "type": 4 } }
Experimenter¶
-
class
ryu.ofproto.ofproto_v1_5_parser.
OFPExperimenter
(datapath, experimenter=None, exp_type=None, data=None)¶ Experimenter extension message
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¶
-
class
ryu.ofproto.ofproto_v1_5_parser.
OFPPort
(port_no=None, length=None, hw_addr=None, name=None, config=None, state=None, properties=None)¶ Description of a port
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_DOWNOFPPC_NO_RECVOFPPC_NO_FWDOFPPC_NO_PACKET_INstate Bitmap of port state flags.
OFPPS_LINK_DOWNOFPPS_BLOCKEDOFPPS_LIVEproperties List of OFPPortDescProp
subclass instance
Flow Match Structure¶
-
class
ryu.ofproto.ofproto_v1_5_parser.
OFPMatch
(type_=None, length=None, _ordered_fields=None, **kwargs)¶ Flow Match Structure
This class is implementation of the flow match structure having compose/query API.
You can define the flow match by the keyword arguments. The following arguments are available.
Argument Value Description in_port Integer 32bit Switch input port in_phy_port Integer 32bit Switch physical input port metadata Integer 64bit Metadata passed between tables eth_dst MAC address Ethernet destination address eth_src MAC address Ethernet source address eth_type Integer 16bit Ethernet frame type vlan_vid Integer 16bit VLAN id vlan_pcp Integer 8bit VLAN priority ip_dscp Integer 8bit IP DSCP (6 bits in ToS field) ip_ecn Integer 8bit IP ECN (2 bits in ToS field) ip_proto Integer 8bit IP protocol ipv4_src IPv4 address IPv4 source address ipv4_dst IPv4 address IPv4 destination address tcp_src Integer 16bit TCP source port tcp_dst Integer 16bit TCP destination port udp_src Integer 16bit UDP source port udp_dst Integer 16bit UDP destination port sctp_src Integer 16bit SCTP source port sctp_dst Integer 16bit SCTP destination port icmpv4_type Integer 8bit ICMP type icmpv4_code Integer 8bit ICMP code arp_op Integer 16bit ARP opcode arp_spa IPv4 address ARP source IPv4 address arp_tpa IPv4 address ARP target IPv4 address arp_sha MAC address ARP source hardware address arp_tha MAC address ARP target hardware address ipv6_src IPv6 address IPv6 source address ipv6_dst IPv6 address IPv6 destination address ipv6_flabel Integer 32bit IPv6 Flow Label icmpv6_type Integer 8bit ICMPv6 type icmpv6_code Integer 8bit ICMPv6 code ipv6_nd_target IPv6 address Target address for ND ipv6_nd_sll MAC address Source link-layer for ND ipv6_nd_tll MAC address Target link-layer for ND mpls_label Integer 32bit MPLS label mpls_tc Integer 8bit MPLS TC mpls_bos Integer 8bit MPLS BoS bit pbb_isid Integer 24bit PBB I-SID tunnel_id Integer 64bit Logical Port Metadata ipv6_exthdr Integer 16bit IPv6 Extension Header pseudo-field pbb_uca Integer 8bit PBB UCA header field tcp_flags Integer 16bit TCP flags actset_output Integer 32bit Output port from action set metadata packet_type Integer 32bit Packet type value 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.
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
Only packets without a VLAN tag
Example:
match = parser.OFPMatch(vlan_vid=0x0000)
Packet Matching
non-VLAN-tagged MATCH VLAN-tagged(vlan_id=3) x VLAN-tagged(vlan_id=5) x
Only packets with a VLAN tag regardless of its value
Example:
match = parser.OFPMatch(vlan_vid=(0x1000, 0x1000))
Packet Matching
non-VLAN-tagged x VLAN-tagged(vlan_id=3) MATCH VLAN-tagged(vlan_id=5) MATCH
Only packets with VLAN tag and VID equal
Example:
match = parser.OFPMatch(vlan_vid=(0x1000 | 3))
Packet Matching
non-VLAN-tagged x VLAN-tagged(vlan_id=3) MATCH VLAN-tagged(vlan_id=5) x
Flow Stats Structures¶
-
class
ryu.ofproto.ofproto_v1_5_parser.
OFPStats
(length=None, _ordered_fields=None, **kwargs)¶ Flow Stats Structure
This class is implementation of the flow stats structure having compose/query API.
You can define the flow stats by the keyword arguments. The following arguments are available.
Argument Value Description duration Integer 32bit*2 Time flow entry has been alive. This field is a tuple of two Integer 32bit. The first value is duration_sec and the second is duration_nsec. idle_time Integer 32bit*2 Time flow entry has been idle. flow_count Integer 32bit Number of aggregated flow entries. packet_count Integer 64bit Number of packets matched by a flow entry. byte_count Integer 64bit Number of bytes matched by a flow entry. Example:
>>> # compose >>> stats = parser.OFPStats( ... packet_count=100, ... duration=(100, 200) >>> # query >>> if 'duration' in stats: ... print stats['duration'] ... (100, 200)
Flow Instruction Structures¶
-
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, metadata_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
-
class
ryu.ofproto.ofproto_v1_5_parser.
OFPInstructionActions
(type_, actions=None, len_=None)¶ Actions instruction
This instruction writes/applies/clears the actions.
Attribute Description type One of following values.
OFPIT_WRITE_ACTIONSOFPIT_APPLY_ACTIONSOFPIT_CLEAR_ACTIONSactions list of OpenFlow action class type
attribute corresponds totype_
parameter of __init__.
-
class
ryu.ofproto.ofproto_v1_5_parser.
OFPInstructionStatTrigger
(flags, thresholds, type_=None, len_=None)¶ Statistics triggers instruction
This instruction defines a set of statistics thresholds using OXS.
Attribute Description flags Bitmap of the following flags.
OFPSTF_PERIODICOFPSTF_ONLY_FIRSTthresholds Instance of OFPStats
Action Structures¶
-
class
ryu.ofproto.ofproto_v1_5_parser.
OFPActionOutput
(port, max_len=65509, type_=None, len_=None)¶ Output action
This action indicates output a packet to the switch port.
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
This action sets the MPLS TTL.
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)
-
class
ryu.ofproto.ofproto_v1_5_parser.
OFPActionPopVlan
(type_=None, len_=None)¶ Pop VLAN action
This action pops the outermost VLAN tag from the packet.
-
class
ryu.ofproto.ofproto_v1_5_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
-
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
-
class
ryu.ofproto.ofproto_v1_5_parser.
OFPActionGroup
(group_id=0, type_=None, len_=None)¶ Group action
This action indicates the group used to process the packet.
Attribute Description group_id Group identifier
-
class
ryu.ofproto.ofproto_v1_5_parser.
OFPActionSetNwTtl
(nw_ttl, type_=None, len_=None)¶ Set IP TTL action
This action sets the IP TTL.
Attribute Description nw_ttl IP TTL
-
class
ryu.ofproto.ofproto_v1_5_parser.
OFPActionDecNwTtl
(type_=None, len_=None)¶ Decrement IP TTL action
This action decrements the IP TTL.
-
class
ryu.ofproto.ofproto_v1_5_parser.
OFPActionSetField
(field=None, **kwargs)¶ Set field action
This action modifies a header field in the packet.
The set of keywords available for this is same as OFPMatch which including with/without mask.
Example:
set_field = OFPActionSetField(eth_src="00:00:00:00:00:00") set_field = OFPActionSetField(ipv4_src=("192.168.100.0", "255.255.255.0"))
-
class
ryu.ofproto.ofproto_v1_5_parser.
OFPActionPushPbb
(ethertype, type_=None, len_=None)¶ Push PBB action
This action pushes a new PBB header to the packet.
Attribute Description ethertype Ether type
-
class
ryu.ofproto.ofproto_v1_5_parser.
OFPActionPopPbb
(type_=None, len_=None)¶ Pop PBB action
This action pops the outermost PBB service instance header from the packet.
-
class
ryu.ofproto.ofproto_v1_5_parser.
OFPActionCopyField
(n_bits=0, src_offset=0, dst_offset=0, oxm_ids=None, type_=None, len_=None)¶ Copy Field action
This action copy value between header and register.
Attribute Description n_bits Number of bits to copy. src_offset Starting bit offset in source. dst_offset Starting bit offset in destination. oxm_ids List 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 [].
-
class
ryu.ofproto.ofproto_v1_5_parser.
OFPActionMeter
(meter_id, type_=None, len_=None)¶ Meter action
This action applies meter (rate limiter)
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.
Controller Status Structure¶
-
class
ryu.ofproto.ofproto_v1_5_parser.
OFPControllerStatusStats
(short_id=None, role=None, reason=None, channel_status=None, properties=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_NOCHANGEOFPCR_ROLE_EQUALOFPCR_ROLE_MASTEROFPCR_ROLE_SLAVEreason Bitmap of controller status reason flags.
OFPCSR_REQUESTOFPCSR_CHANNEL_STATUSOFPCSR_ROLEOFPCSR_CONTROLLER_ADDEDOFPCSR_CONTROLLER_REMOVEDOFPCSR_SHORT_IDOFPCSR_EXPERIMENTERchannel_status Bitmap of control channel status flags.
OFPCT_STATUS_UPOFPCT_STATUS_DOWNproperties List of OFPControllerStatusProp
subclass instance