OpenFlow v1.5 Messages and Structures¶
Controller-to-Switch Messages¶
Handshake¶
-
class
os_ken.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 OSKen framework, so the OSKen 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
os_ken.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 OSKen framework, so the OSKen 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
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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 OSKen framework, so the OSKen 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
os_ken.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
os_ken.ofproto.ofproto_v1_5_parser.
OFPEchoRequest
(datapath, data=None)¶ Echo request message
This message is handled by the OSKen framework, so the OSKen 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
os_ken.ofproto.ofproto_v1_5_parser.
OFPEchoReply
(datapath, data=None)¶ Echo reply message
This message is handled by the OSKen framework, so the OSKen 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
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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 os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.ofproto.ofproto_v1_5_parser.
OFPActionDecMplsTtl
(type_=None, len_=None)¶ Decrement MPLS TTL action
This action decrements the MPLS TTL.
-
class
os_ken.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
os_ken.ofproto.ofproto_v1_5_parser.
OFPActionPopVlan
(type_=None, len_=None)¶ Pop VLAN action
This action pops the outermost VLAN tag from the packet.
-
class
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.ofproto.ofproto_v1_5_parser.
OFPActionDecNwTtl
(type_=None, len_=None)¶ Decrement IP TTL action
This action decrements the IP TTL.
-
class
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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
os_ken.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 os_ken.ofproto.nx_actions.
Controller Status Structure¶
-
class
os_ken.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