os_ken.ofproto.ofproto_v1_4_parser.
OFPFeaturesRequest
(datapath)¶Features request message
The controller sends a feature request to the switch upon session establishment.
This message is handled by the 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": {}
}
os_ken.ofproto.ofproto_v1_4_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": 99,
"capabilities": 79,
"datapath_id": 9210263729383,
"n_buffers": 0,
"n_tables": 255
}
}
os_ken.ofproto.ofproto_v1_4_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_NORMAL
OFPC_FRAG_DROP
OFPC_FRAG_REASM
|
miss_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
}
}
os_ken.ofproto.ofproto_v1_4_parser.
OFPGetConfigRequest
(datapath)¶Get config request message
The controller sends a get config request to query configuration parameters in the switch.
Example:
def send_get_config_request(self, datapath):
ofp_parser = datapath.ofproto_parser
req = ofp_parser.OFPGetConfigRequest(datapath)
datapath.send_msg(req)
JSON Example:
{
"OFPGetConfigRequest": {}
}
os_ken.ofproto.ofproto_v1_4_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_NORMAL
OFPC_FRAG_DROP
OFPC_FRAG_REASM
|
miss_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
}
}
os_ken.ofproto.ofproto_v1_4_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_EVICTION
OFPTC_VACANCY_EVENTS
|
properties | List of OFPTableModProp subclass instance |
Example:
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": 0,
"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": 255
}
}
os_ken.ofproto.ofproto_v1_4_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* or
OFPFC_DELETE* |
table_id | ID of the table to put the flow in |
command | One of the following values. OFPFC_ADD
OFPFC_MODIFY
OFPFC_MODIFY_STRICT
OFPFC_DELETE
OFPFC_DELETE_STRICT
|
idle_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 port |
out_group | For OFPFC_DELETE* commands, require matching
entries to include this as an output group |
flags | Bitmap of the following flags. OFPFF_SEND_FLOW_REM
OFPFF_CHECK_OVERLAP
OFPFF_RESET_COUNTS
OFPFF_NO_PKT_COUNTS
OFPFF_NO_BYT_COUNTS
|
importance | Eviction precedence |
match | Instance of OFPMatch |
instructions | list of OFPInstruction* instance |
Example:
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": 65535,
"command": 0,
"cookie": 0,
"cookie_mask": 0,
"flags": 0,
"hard_timeout": 0,
"idle_timeout": 0,
"importance": 0,
"instructions": [
{
"OFPInstructionActions": {
"actions": [
{
"OFPActionSetField": {
"field": {
"OXMTlv": {
"field": "vlan_vid",
"mask": null,
"value": 258
}
},
"len": 16,
"type": 25
}
},
{
"OFPActionCopyTtlOut": {
"len": 8,
"type": 11
}
},
{
"OFPActionCopyTtlIn": {
"len": 8,
"type": 12
}
},
{
"OFPActionCopyTtlIn": {
"len": 8,
"type": 12
}
},
{
"OFPActionPopPbb": {
"len": 8,
"type": 27
}
},
{
"OFPActionPushPbb": {
"ethertype": 4660,
"len": 8,
"type": 26
}
},
{
"OFPActionPopMpls": {
"ethertype": 39030,
"len": 8,
"type": 20
}
},
{
"OFPActionPushMpls": {
"ethertype": 34887,
"len": 8,
"type": 19
}
},
{
"OFPActionPopVlan": {
"len": 8,
"type": 18
}
},
{
"OFPActionPushVlan": {
"ethertype": 33024,
"len": 8,
"type": 17
}
},
{
"OFPActionDecMplsTtl": {
"len": 8,
"type": 16
}
},
{
"OFPActionSetMplsTtl": {
"len": 8,
"mpls_ttl": 10,
"type": 15
}
},
{
"OFPActionDecNwTtl": {
"len": 8,
"type": 24
}
},
{
"OFPActionSetNwTtl": {
"len": 8,
"nw_ttl": 10,
"type": 23
}
},
{
"OFPActionExperimenterUnknown": {
"data": "AAECAwQFBgc=",
"experimenter": 101,
"len": 16,
"type": 65535
}
},
{
"OFPActionSetQueue": {
"len": 8,
"queue_id": 3,
"type": 21
}
},
{
"OFPActionGroup": {
"group_id": 99,
"len": 8,
"type": 22
}
},
{
"OFPActionOutput": {
"len": 16,
"max_len": 65535,
"port": 6,
"type": 0
}
}
],
"len": 176,
"type": 3
}
},
{
"OFPInstructionActions": {
"actions": [
{
"OFPActionSetField": {
"field": {
"OXMTlv": {
"field": "eth_src",
"mask": null,
"value": "01:02:03:04:05:06"
}
},
"len": 16,
"type": 25
}
},
{
"OFPActionSetField": {
"field": {
"OXMTlv": {
"field": "pbb_uca",
"mask": null,
"value": 1
}
},
"len": 16,
"type": 25
}
}
],
"len": 40,
"type": 4
}
}
],
"match": {
"OFPMatch": {
"length": 14,
"oxm_fields": [
{
"OXMTlv": {
"field": "eth_dst",
"mask": null,
"value": "f2:0b:a4:7d:f8:ea"
}
}
],
"type": 1
}
},
"out_group": 4294967295,
"out_port": 4294967295,
"priority": 123,
"table_id": 1
}
}
{
"OFPFlowMod": {
"buffer_id": 65535,
"command": 0,
"cookie": 0,
"cookie_mask": 0,
"flags": 0,
"hard_timeout": 0,
"idle_timeout": 0,
"importance": 0,
"instructions": [
{
"OFPInstructionGotoTable": {
"len": 8,
"table_id": 1,
"type": 1
}
}
],
"match": {
"OFPMatch": {
"length": 22,
"oxm_fields": [
{
"OXMTlv": {
"field": "in_port",
"mask": null,
"value": 6
}
},
{
"OXMTlv": {
"field": "eth_src",
"mask": null,
"value": "f2:0b:a4:7d:f8:ea"
}
}
],
"type": 1
}
},
"out_group": 4294967295,
"out_port": 4294967295,
"priority": 123,
"table_id": 0
}
}
{
"OFPFlowMod": {
"buffer_id": 65535,
"command": 0,
"cookie": 0,
"cookie_mask": 0,
"flags": 0,
"hard_timeout": 0,
"idle_timeout": 0,
"importance": 0,
"instructions": [
{
"OFPInstructionMeter": {
"len": 8,
"meter_id": 1,
"type": 6
}
},
{
"OFPInstructionActions": {
"actions": [
{
"OFPActionOutput": {
"len": 16,
"max_len": 65535,
"port": 6,
"type": 0
}
}
],
"len": 24,
"type": 3
}
}
],
"match": {
"OFPMatch": {
"length": 14,
"oxm_fields": [
{
"OXMTlv": {
"field": "eth_dst",
"mask": null,
"value": "f2:0b:a4:7d:f8:ea"
}
}
],
"type": 1
}
},
"out_group": 4294967295,
"out_port": 4294967295,
"priority": 123,
"table_id": 1
}
}
{
"OFPFlowMod": {
"buffer_id": 65535,
"command": 0,
"cookie": 0,
"cookie_mask": 0,
"flags": 0,
"hard_timeout": 0,
"idle_timeout": 0,
"importance": 0,
"instructions": [],
"match": {
"OFPMatch": {
"length": 329,
"oxm_fields": [
{
"OXMTlv": {
"field": "in_port",
"mask": null,
"value": 84281096
}
},
{
"OXMTlv": {
"field": "in_phy_port",
"mask": null,
"value": 16909060
}
},
{
"OXMTlv": {
"field": "metadata",
"mask": null,
"value": 283686952306183
}
},
{
"OXMTlv": {
"field": "eth_type",
"mask": null,
"value": 2054
}
},
{
"OXMTlv": {
"field": "eth_dst",
"mask": null,
"value": "ff:ff:ff:ff:ff:ff"
}
},
{
"OXMTlv": {
"field": "eth_src",
"mask": null,
"value": "f2:0b:a4:7d:f8:ea"
}
},
{
"OXMTlv": {
"field": "vlan_vid",
"mask": null,
"value": 999
}
},
{
"OXMTlv": {
"field": "ip_dscp",
"mask": null,
"value": 9
}
},
{
"OXMTlv": {
"field": "ip_ecn",
"mask": null,
"value": 3
}
},
{
"OXMTlv": {
"field": "ip_proto",
"mask": null,
"value": 99
}
},
{
"OXMTlv": {
"field": "ipv4_src",
"mask": null,
"value": "1.2.3.4"
}
},
{
"OXMTlv": {
"field": "ipv4_dst",
"mask": null,
"value": "1.2.3.4"
}
},
{
"OXMTlv": {
"field": "tcp_src",
"mask": null,
"value": 8080
}
},
{
"OXMTlv": {
"field": "tcp_dst",
"mask": null,
"value": 18080
}
},
{
"OXMTlv": {
"field": "udp_src",
"mask": null,
"value": 28080
}
},
{
"OXMTlv": {
"field": "udp_dst",
"mask": null,
"value": 55936
}
},
{
"OXMTlv": {
"field": "sctp_src",
"mask": null,
"value": 48080
}
},
{
"OXMTlv": {
"field": "sctp_dst",
"mask": null,
"value": 59328
}
},
{
"OXMTlv": {
"field": "icmpv4_type",
"mask": null,
"value": 100
}
},
{
"OXMTlv": {
"field": "icmpv4_code",
"mask": null,
"value": 101
}
},
{
"OXMTlv": {
"field": "arp_op",
"mask": null,
"value": 1
}
},
{
"OXMTlv": {
"field": "arp_spa",
"mask": null,
"value": "10.0.0.1"
}
},
{
"OXMTlv": {
"field": "arp_tpa",
"mask": null,
"value": "10.0.0.3"
}
},
{
"OXMTlv": {
"field": "arp_sha",
"mask": null,
"value": "f2:0b:a4:7d:f8:ea"
}
},
{
"OXMTlv": {
"field": "arp_tha",
"mask": null,
"value": "00:00:00:00:00:00"
}
},
{
"OXMTlv": {
"field": "ipv6_src",
"mask": null,
"value": "fe80::f00b:a4ff:fe48:28a5"
}
},
{
"OXMTlv": {
"field": "ipv6_dst",
"mask": null,
"value": "fe80::f00b:a4ff:fe05:b7dc"
}
},
{
"OXMTlv": {
"field": "ipv6_flabel",
"mask": null,
"value": 541473
}
},
{
"OXMTlv": {
"field": "icmpv6_type",
"mask": null,
"value": 200
}
},
{
"OXMTlv": {
"field": "icmpv6_code",
"mask": null,
"value": 201
}
},
{
"OXMTlv": {
"field": "ipv6_nd_target",
"mask": null,
"value": "fe80::a60:6eff:fe7f:74e7"
}
},
{
"OXMTlv": {
"field": "ipv6_nd_sll",
"mask": null,
"value": "00:00:00:00:02:9a"
}
},
{
"OXMTlv": {
"field": "ipv6_nd_tll",
"mask": null,
"value": "00:00:00:00:02:2b"
}
},
{
"OXMTlv": {
"field": "mpls_label",
"mask": null,
"value": 624485
}
},
{
"OXMTlv": {
"field": "mpls_tc",
"mask": null,
"value": 5
}
},
{
"OXMTlv": {
"field": "mpls_bos",
"mask": null,
"value": 1
}
},
{
"OXMTlv": {
"field": "pbb_isid",
"mask": null,
"value": 11259375
}
},
{
"OXMTlv": {
"field": "tunnel_id",
"mask": null,
"value": 651061555542690057
}
},
{
"OXMTlv": {
"field": "ipv6_exthdr",
"mask": null,
"value": 500
}
},
{
"OXMTlv": {
"field": "pbb_uca",
"mask": null,
"value": 1
}
}
],
"type": 1
}
},
"out_group": 4294967295,
"out_port": 4294967295,
"priority": 123,
"table_id": 1
}
}
os_ken.ofproto.ofproto_v1_4_parser.
OFPGroupMod
(datapath, command=0, type_=0, group_id=0, buckets=None)¶Modify group entry message
The controller sends this message to modify the group table.
Attribute | Description |
---|---|
command | One of the following values. OFPGC_ADD
OFPGC_MODIFY
OFPGC_DELETE
|
type | One of the following values. OFPGT_ALL
OFPGT_SELECT
OFPGT_INDIRECT
OFPGT_FF
|
group_id | Group identifier |
buckets | list of OFPBucket |
type
attribute corresponds to type_
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
req = ofp_parser.OFPGroupMod(datapath, ofp.OFPGC_ADD,
ofp.OFPGT_SELECT, group_id, buckets)
datapath.send_msg(req)
JSON Example:
{
"OFPGroupMod": {
"buckets": [
{
"OFPBucket": {
"actions": [
{
"OFPActionOutput": {
"len": 16,
"max_len": 65535,
"port": 2,
"type": 0
}
}
],
"len": 32,
"watch_group": 1,
"watch_port": 1,
"weight": 1
}
}
],
"command": 0,
"group_id": 1,
"type": 0
}
}
os_ken.ofproto.ofproto_v1_4_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 of OFPSwitchFeatures |
config | Bitmap of configuration flags. OFPPC_PORT_DOWN
OFPPC_NO_RECV
OFPPC_NO_FWD
OFPPC_NO_PACKET_IN
|
mask | Bitmap of configuration flags above to be changed |
properties | List of OFPPortModProp subclass instance |
Example:
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
}
}
]
}
}
os_ken.ofproto.ofproto_v1_4_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_ADD
OFPMC_MODIFY
OFPMC_DELETE
|
flags | Bitmap of the following flags. OFPMF_KBPS
OFPMF_PKTPS
OFPMF_BURST
OFPMF_STATS
|
meter_id | Meter instance |
bands | list of the following class instance. OFPMeterBandDrop
OFPMeterBandDscpRemark
OFPMeterBandExperimenter
|
JSON Example:
{
"OFPMeterMod": {
"bands": [
{
"OFPMeterBandDrop": {
"burst_size": 10,
"len": 16,
"rate": 1000,
"type": 1
}
},
{
"OFPMeterBandDscpRemark": {
"burst_size": 10,
"len": 16,
"prec_level": 1,
"rate": 1000,
"type": 2
}
},
{
"OFPMeterBandExperimenter": {
"burst_size": 10,
"experimenter": 999,
"len": 16,
"rate": 1000,
"type": 65535
}
}
],
"command": 0,
"flags": 14,
"meter_id": 100
}
}
os_ken.ofproto.ofproto_v1_4_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
}
}
os_ken.ofproto.ofproto_v1_4_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
}
}
os_ken.ofproto.ofproto_v1_4_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": 1
}
}
os_ken.ofproto.ofproto_v1_4_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 instance |
Example:
@set_ev_cls(ofp_event.EventOFPFlowStatsReply, MAIN_DISPATCHER)
def flow_stats_reply_handler(self, ev):
flows = []
for stat in ev.msg.body:
flows.append('table_id=%s '
'duration_sec=%d duration_nsec=%d '
'priority=%d '
'idle_timeout=%d hard_timeout=%d flags=0x%04x '
'importance=%d cookie=%d packet_count=%d '
'byte_count=%d match=%s instructions=%s' %
(stat.table_id,
stat.duration_sec, stat.duration_nsec,
stat.priority,
stat.idle_timeout, stat.hard_timeout,
stat.flags, stat.importance,
stat.cookie, stat.packet_count, stat.byte_count,
stat.match, stat.instructions))
self.logger.debug('FlowStats: %s', flows)
JSON Example:
{
"OFPFlowStatsReply": {
"body": [
{
"OFPFlowStats": {
"byte_count": 0,
"cookie": 0,
"duration_nsec": 115277000,
"duration_sec": 358,
"flags": 0,
"hard_timeout": 0,
"idle_timeout": 0,
"importance": 0,
"instructions": [],
"length": 56,
"match": {
"OFPMatch": {
"length": 4,
"oxm_fields": [],
"type": 1
}
},
"packet_count": 0,
"priority": 65535,
"table_id": 0
}
},
{
"OFPFlowStats": {
"byte_count": 0,
"cookie": 0,
"duration_nsec": 115055000,
"duration_sec": 358,
"flags": 0,
"hard_timeout": 0,
"idle_timeout": 0,
"importance": 0,
"instructions": [
{
"OFPInstructionActions": {
"actions": [
{
"OFPActionOutput": {
"len": 16,
"max_len": 0,
"port": 4294967290,
"type": 0
}
}
],
"len": 24,
"type": 4
}
}
],
"length": 88,
"match": {
"OFPMatch": {
"length": 10,
"oxm_fields": [
{
"OXMTlv": {
"field": "eth_type",
"mask": null,
"value": 2054
}
}
],
"type": 1
}
},
"packet_count": 0,
"priority": 65534,
"table_id": 0
}
},
{
"OFPFlowStats": {
"byte_count": 238,
"cookie": 0,
"duration_nsec": 511582000,
"duration_sec": 316220,
"flags": 0,
"hard_timeout": 0,
"idle_timeout": 0,
"importance": 0,
"instructions": [
{
"OFPInstructionGotoTable": {
"len": 8,
"table_id": 1,
"type": 1
}
}
],
"length": 80,
"match": {
"OFPMatch": {
"length": 22,
"oxm_fields": [
{
"OXMTlv": {
"field": "in_port",
"mask": null,
"value": 6
}
},
{
"OXMTlv": {
"field": "eth_src",
"mask": null,
"value": "f2:0b:a4:7d:f8:ea"
}
}
],
"type": 1
}
},
"packet_count": 3,
"priority": 123,
"table_id": 0
}
},
{
"OFPFlowStats": {
"byte_count": 98,
"cookie": 0,
"duration_nsec": 980901000,
"duration_sec": 313499,
"flags": 0,
"hard_timeout": 0,
"idle_timeout": 0,
"importance": 0,
"instructions": [
{
"OFPInstructionActions": {
"actions": [
{
"OFPActionSetField": {
"field": {
"OXMTlv": {
"field": "vlan_vid",
"mask": null,
"value": 258
}
},
"len": 16,
"type": 25
}
},
{
"OFPActionCopyTtlOut": {
"len": 8,
"type": 11
}
},
{
"OFPActionCopyTtlIn": {
"len": 8,
"type": 12
}
},
{
"OFPActionCopyTtlIn": {
"len": 8,
"type": 12
}
},
{
"OFPActionPopPbb": {
"len": 8,
"type": 27
}
},
{
"OFPActionPushPbb": {
"ethertype": 4660,
"len": 8,
"type": 26
}
},
{
"OFPActionPopMpls": {
"ethertype": 39030,
"len": 8,
"type": 20
}
},
{
"OFPActionPushMpls": {
"ethertype": 34887,
"len": 8,
"type": 19
}
},
{
"OFPActionPopVlan": {
"len": 8,
"type": 18
}
},
{
"OFPActionPushVlan": {
"ethertype": 33024,
"len": 8,
"type": 17
}
},
{
"OFPActionDecMplsTtl": {
"len": 8,
"type": 16
}
},
{
"OFPActionSetMplsTtl": {
"len": 8,
"mpls_ttl": 10,
"type": 15
}
},
{
"OFPActionDecNwTtl": {
"len": 8,
"type": 24
}
},
{
"OFPActionSetNwTtl": {
"len": 8,
"nw_ttl": 10,
"type": 23
}
},
{
"OFPActionSetQueue": {
"len": 8,
"queue_id": 3,
"type": 21
}
},
{
"OFPActionGroup": {
"group_id": 99,
"len": 8,
"type": 22
}
},
{
"OFPActionOutput": {
"len": 16,
"max_len": 65535,
"port": 6,
"type": 0
}
},
{
"OFPActionExperimenterUnknown": {
"len": 16,
"data": "ZXhwX2RhdGE=",
"experimenter": 98765432,
"type": 65535
}
},
{
"NXActionUnknown": {
"len": 16,
"data": "cF9kYXRh",
"experimenter": 8992,
"type": 65535,
"subtype": 25976
}
}
],
"len": 192,
"type": 3
}
},
{
"OFPInstructionActions": {
"actions": [
{
"OFPActionSetField": {
"field": {
"OXMTlv": {
"field": "eth_src",
"mask": null,
"value": "01:02:03:04:05:06"
}
},
"len": 16,
"type": 25
}
},
{
"OFPActionSetField": {
"field": {
"OXMTlv": {
"field": "pbb_uca",
"mask": null,
"value": 1
}
},
"len": 16,
"type": 25
}
}
],
"len": 40,
"type": 4
}
},
{
"OFPInstructionActions": {
"actions": [
{
"OFPActionOutput": {
"len": 16,
"max_len": 65535,
"port": 4294967293,
"type": 0
}
}
],
"len": 24,
"type": 3
}
}
],
"length": 312,
"match": {
"OFPMatch": {
"length": 4,
"oxm_fields": [],
"type": 1
}
},
"packet_count": 1,
"priority": 0,
"table_id": 0
}
}
],
"flags": 0,
"type": 1
}
}
os_ken.ofproto.ofproto_v1_4_parser.
OFPAggregateStatsRequest
(datapath, flags, table_id, out_port, out_group, cookie, cookie_mask, match, type_=None)¶Aggregate flow statistics request message
The controller uses this message to query aggregate flow statictics.
Attribute | Description |
---|---|
flags | Zero or OFPMPF_REQ_MORE |
table_id | ID of table to read |
out_port | Require matching entries to include this as an output port |
out_group | Require matching entries to include this as an output group |
cookie | Require matching entries to contain this cookie value |
cookie_mask | Mask used to restrict the cookie bits that must match |
match | Instance of OFPMatch |
Example:
def send_aggregate_stats_request(self, datapath):
ofp = datapath.ofproto
ofp_parser = datapath.ofproto_parser
cookie = cookie_mask = 0
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
}
}
os_ken.ofproto.ofproto_v1_4_parser.
OFPAggregateStatsReply
(datapath, type_=None, **kwargs)¶Aggregate flow statistics reply message
The switch responds with this message to an aggregate flow statistics request.
Attribute | Description |
---|---|
body | Instance of OFPAggregateStats |
Example:
@set_ev_cls(ofp_event.EventOFPAggregateStatsReply, MAIN_DISPATCHER)
def aggregate_stats_reply_handler(self, ev):
body = ev.msg.body
self.logger.debug('AggregateStats: packet_count=%d byte_count=%d '
'flow_count=%d',
body.packet_count, body.byte_count,
body.flow_count)
JSON Example:
{
"OFPAggregateStatsReply": {
"body": {
"OFPAggregateStats": {
"byte_count": 574,
"flow_count": 6,
"packet_count": 7
}
},
"flags": 0,
"type": 2
}
}
os_ken.ofproto.ofproto_v1_4_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
}
}
os_ken.ofproto.ofproto_v1_4_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 instance |
Example:
@set_ev_cls(ofp_event.EventOFPTableStatsReply, MAIN_DISPATCHER)
def table_stats_reply_handler(self, ev):
tables = []
for stat in ev.msg.body:
tables.append('table_id=%d active_count=%d lookup_count=%d '
' matched_count=%d' %
(stat.table_id, stat.active_count,
stat.lookup_count, stat.matched_count))
self.logger.debug('TableStats: %s', tables)
JSON Example:
{
"OFPTableStatsReply": {
"body": [
{
"OFPTableStats": {
"active_count": 4,
"lookup_count": 4,
"matched_count": 4,
"table_id": 0
}
},
{
"OFPTableStats": {
"active_count": 4,
"lookup_count": 4,
"matched_count": 4,
"table_id": 1
}
}
],
"flags": 0,
"type": 3
}
}
os_ken.ofproto.ofproto_v1_4_parser.
OFPTableDescStatsRequest
(datapath, flags=0, type_=None)¶Table description request message
The controller uses this message to query description of all the tables.
Attribute | Description |
---|---|
flags | Zero or OFPMPF_REQ_MORE |
Example:
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
}
}
os_ken.ofproto.ofproto_v1_4_parser.
OFPTableDescStatsReply
(datapath, type_=None, **kwargs)¶Table description reply message
The switch responds with this message to a table description request.
Attribute | Description |
---|---|
body | List of OFPTableDesc instance |
Example:
@set_ev_cls(ofp_event.EventOFPTableDescStatsReply, MAIN_DISPATCHER)
def table_desc_stats_reply_handler(self, ev):
tables = []
for p in ev.msg.body:
tables.append('table_id=%d config=0x%08x properties=%s' %
(p.table_id, p.config, repr(p.properties)))
self.logger.debug('OFPTableDescStatsReply received: %s', tables)
JSON Example:
{
"OFPTableDescStatsReply": {
"body": [
{
"OFPTableDesc": {
"config": 0,
"length": 24,
"properties": [
{
"OFPTableModPropExperimenter": {
"data": [],
"exp_type": 0,
"experimenter": 101,
"length": 12,
"type": 65535
}
}
],
"table_id": 7
}
},
{
"OFPTableDesc": {
"config": 0,
"length": 80,
"properties": [
{
"OFPTableModPropEviction": {
"flags": 0,
"length": 8,
"type": 2
}
},
{
"OFPTableModPropVacancy": {
"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
}
}
os_ken.ofproto.ofproto_v1_4_parser.
OFPTableFeaturesStatsRequest
(datapath, flags=0, body=None, type_=None)¶Table features statistics request message
The controller uses this message to query table features.
Attribute | Description |
---|---|
body | List of OFPTableFeaturesStats instances.
The default is []. |
JSON Example:
See an example in:
os_ken/tests/unit/ofproto/json/of14/5-53-ofp_table_features_request.packet.json
os_ken.ofproto.ofproto_v1_4_parser.
OFPTableFeaturesStatsReply
(datapath, type_=None, **kwargs)¶Table features statistics reply message
The switch responds with this message to a table features statistics request.
Attribute | Description |
---|---|
body | List of OFPTableFeaturesStats instance |
JSON Example:
See an example in:
os_ken/tests/unit/ofproto/json/of14/5-54-ofp_table_features_reply.packet.json
os_ken.ofproto.ofproto_v1_4_parser.
OFPPortStatsRequest
(datapath, flags, port_no, type_=None)¶Port statistics request message
The controller uses this message to query information about ports statistics.
Attribute | Description |
---|---|
flags | Zero or OFPMPF_REQ_MORE |
port_no | Port number to read (OFPP_ANY to all ports) |
Example:
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
}
}
os_ken.ofproto.ofproto_v1_4_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 instance |
Example:
@set_ev_cls(ofp_event.EventOFPPortStatsReply, MAIN_DISPATCHER)
def port_stats_reply_handler(self, ev):
ports = []
for stat in ev.msg.body:
ports.append(stat.length, stat.port_no,
stat.duration_sec, stat.duration_nsec,
stat.rx_packets, stat.tx_packets,
stat.rx_bytes, stat.tx_bytes,
stat.rx_dropped, stat.tx_dropped,
stat.rx_errors, stat.tx_errors,
repr(stat.properties))
self.logger.debug('PortStats: %s', ports)
JSON Example:
{
"OFPPortStatsReply": {
"body": [
{
"OFPPortStats": {
"duration_nsec": 0,
"duration_sec": 0,
"length": 224,
"port_no": 7,
"properties": [
{
"OFPPortStatsPropEthernet": {
"collisions": 0,
"length": 40,
"rx_crc_err": 0,
"rx_frame_err": 0,
"rx_over_err": 0,
"type": 0
}
},
{
"OFPPortStatsPropOptical": {
"bias_current": 300,
"flags": 3,
"length": 44,
"rx_freq_lmda": 1500,
"rx_grid_span": 500,
"rx_offset": 700,
"rx_pwr": 2000,
"temperature": 273,
"tx_freq_lmda": 1500,
"tx_grid_span": 500,
"tx_offset": 700,
"tx_pwr": 2000,
"type": 1
}
},
{
"OFPPortStatsPropExperimenter": {
"data": [],
"exp_type": 0,
"experimenter": 101,
"length": 12,
"type": 65535
}
},
{
"OFPPortStatsPropExperimenter": {
"data": [
1
],
"exp_type": 1,
"experimenter": 101,
"length": 16,
"type": 65535
}
},
{
"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
}
}
os_ken.ofproto.ofproto_v1_4_parser.
OFPPortDescStatsRequest
(datapath, flags=0, type_=None)¶Port description request message
The controller uses this message to query description of all the ports.
Attribute | Description |
---|---|
flags | Zero or OFPMPF_REQ_MORE |
Example:
def send_port_desc_stats_request(self, datapath):
ofp_parser = datapath.ofproto_parser
req = ofp_parser.OFPPortDescStatsRequest(datapath, 0)
datapath.send_msg(req)
JSON Example:
{
"OFPPortDescStatsRequest": {
"flags": 0,
"type": 13
}
}
os_ken.ofproto.ofproto_v1_4_parser.
OFPPortDescStatsReply
(datapath, type_=None, **kwargs)¶Port description reply message
The switch responds with this message to a port description request.
Attribute | Description |
---|---|
body | List of OFPPort instance |
Example:
@set_ev_cls(ofp_event.EventOFPPortDescStatsReply, MAIN_DISPATCHER)
def port_desc_stats_reply_handler(self, ev):
ports = []
for p in ev.msg.body:
ports.append('port_no=%d hw_addr=%s name=%s config=0x%08x '
'state=0x%08x properties=%s' %
(p.port_no, p.hw_addr,
p.name, p.config, p.state, repr(p.properties)))
self.logger.debug('OFPPortDescStatsReply received: %s', ports)
JSON Example:
{
"OFPPortDescStatsReply": {
"body": [
{
"OFPPort": {
"config": 0,
"hw_addr": "f2:0b:a4:d0:3f:70",
"length": 168,
"name": "Port7",
"port_no": 7,
"properties": [
{
"OFPPortDescPropEthernet": {
"advertised": 10240,
"curr": 10248,
"curr_speed": 5000,
"length": 32,
"max_speed": 5000,
"peer": 10248,
"supported": 10248,
"type": 0
}
},
{
"OFPPortDescPropOptical": {
"length": 40,
"rx_grid_freq_lmda": 1500,
"rx_max_freq_lmda": 2000,
"rx_min_freq_lmda": 1000,
"supported": 1,
"tx_grid_freq_lmda": 1500,
"tx_max_freq_lmda": 2000,
"tx_min_freq_lmda": 1000,
"tx_pwr_max": 2000,
"tx_pwr_min": 1000,
"type": 1
}
},
{
"OFPPortDescPropExperimenter": {
"data": [],
"exp_type": 0,
"experimenter": 101,
"length": 12,
"type": 65535
}
},
{
"OFPPortDescPropExperimenter": {
"data": [
1
],
"exp_type": 1,
"experimenter": 101,
"length": 16,
"type": 65535
}
},
{
"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
}
}
os_ken.ofproto.ofproto_v1_4_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": 4294967295,
"queue_id": 4294967295,
"type": 5
}
}
os_ken.ofproto.ofproto_v1_4_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 instance |
Example:
@set_ev_cls(ofp_event.EventOFPQueueStatsReply, MAIN_DISPATCHER)
def queue_stats_reply_handler(self, ev):
queues = []
for stat in ev.msg.body:
queues.append('port_no=%d queue_id=%d '
'tx_bytes=%d tx_packets=%d tx_errors=%d '
'duration_sec=%d duration_nsec=%d'
'properties=%s' %
(stat.port_no, stat.queue_id,
stat.tx_bytes, stat.tx_packets, stat.tx_errors,
stat.duration_sec, stat.duration_nsec,
repr(stat.properties)))
self.logger.debug('QueueStats: %s', queues)
JSON Example:
{
"OFPQueueStatsReply": {
"body": [
{
"OFPQueueStats": {
"duration_nsec": 0,
"duration_sec": 0,
"length": 104,
"port_no": 7,
"properties": [
{
"OFPQueueStatsPropExperimenter": {
"data": [],
"exp_type": 0,
"experimenter": 101,
"length": 12,
"type": 65535
}
},
{
"OFPQueueStatsPropExperimenter": {
"data": [
1
],
"exp_type": 1,
"experimenter": 101,
"length": 16,
"type": 65535
}
},
{
"OFPQueueStatsPropExperimenter": {
"data": [
1,
2
],
"exp_type": 2,
"experimenter": 101,
"length": 20,
"type": 65535
}
}
],
"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
}
}
os_ken.ofproto.ofproto_v1_4_parser.
OFPQueueDescStatsRequest
(datapath, flags=0, port_no=4294967295, queue_id=4294967295, type_=None)¶Queue description request message
The controller uses this message to query description of all the queues.
Attribute | Description |
---|---|
flags | Zero or OFPMPF_REQ_MORE |
port_no | Port number to read (OFPP_ANY for all ports) |
queue_id | ID of queue to read (OFPQ_ALL for all queues) |
Example:
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": 7,
"queue_id": 4294967295,
"type": 15
}
}
os_ken.ofproto.ofproto_v1_4_parser.
OFPQueueDescStatsReply
(datapath, type_=None, **kwargs)¶Queue description reply message
The switch responds with this message to a queue description request.
Attribute | Description |
---|---|
body | List of OFPQueueDesc instance |
Example:
@set_ev_cls(ofp_event.EventOFPQueueDescStatsReply, MAIN_DISPATCHER)
def queue_desc_stats_reply_handler(self, ev):
queues = []
for q in ev.msg.body:
queues.append('port_no=%d queue_id=0x%08x properties=%s' %
(q.port_no, q.queue_id, repr(q.properties)))
self.logger.debug('OFPQueueDescStatsReply received: %s', queues)
JSON Example:
{
"OFPQueueDescStatsReply": {
"body": [
{
"OFPQueueDesc": {
"len": 32,
"port_no": 7,
"properties": [
{
"OFPQueueDescPropExperimenter": {
"data": [],
"exp_type": 0,
"experimenter": 101,
"length": 12,
"type": 65535
}
}
],
"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
}
}
os_ken.ofproto.ofproto_v1_4_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
}
}
os_ken.ofproto.ofproto_v1_4_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 instance |
Example:
@set_ev_cls(ofp_event.EventOFPGroupStatsReply, MAIN_DISPATCHER)
def group_stats_reply_handler(self, ev):
groups = []
for stat in ev.msg.body:
groups.append('length=%d group_id=%d '
'ref_count=%d packet_count=%d byte_count=%d '
'duration_sec=%d duration_nsec=%d' %
(stat.length, stat.group_id,
stat.ref_count, stat.packet_count,
stat.byte_count, stat.duration_sec,
stat.duration_nsec))
self.logger.debug('GroupStats: %s', groups)
JSON Example:
{
"OFPGroupStatsReply": {
"body": [
{
"OFPGroupStats": {
"bucket_stats": [
{
"OFPBucketCounter": {
"byte_count": 2345,
"packet_count": 234
}
}
],
"byte_count": 12345,
"duration_nsec": 609036000,
"duration_sec": 9,
"group_id": 1,
"length": 56,
"packet_count": 123,
"ref_count": 2
}
}
],
"flags": 0,
"type": 6
}
}
os_ken.ofproto.ofproto_v1_4_parser.
OFPGroupDescStatsRequest
(datapath, flags=0, type_=None)¶Group description request message
The controller uses this message to list the set of groups on a switch.
Attribute | Description |
---|---|
flags | Zero or OFPMPF_REQ_MORE |
Example:
def send_group_desc_stats_request(self, datapath):
ofp = datapath.ofproto
ofp_parser = datapath.ofproto_parser
req = ofp_parser.OFPGroupDescStatsRequest(datapath, 0)
datapath.send_msg(req)
JSON Example:
{
"OFPGroupDescStatsRequest": {
"flags": 0,
"type": 7
}
}
os_ken.ofproto.ofproto_v1_4_parser.
OFPGroupDescStatsReply
(datapath, type_=None, **kwargs)¶Group description reply message
The switch responds with this message to a group description request.
Attribute | Description |
---|---|
body | List of OFPGroupDescStats instance |
Example:
@set_ev_cls(ofp_event.EventOFPGroupDescStatsReply, MAIN_DISPATCHER)
def group_desc_stats_reply_handler(self, ev):
descs = []
for stat in ev.msg.body:
descs.append('length=%d type=%d group_id=%d '
'buckets=%s' %
(stat.length, stat.type, stat.group_id,
stat.bucket))
self.logger.debug('GroupDescStats: %s', descs)
JSON Example:
{
"OFPGroupDescStatsReply": {
"body": [
{
"OFPGroupDescStats": {
"buckets": [
{
"OFPBucket": {
"actions": [
{
"OFPActionOutput": {
"len": 16,
"max_len": 65535,
"port": 2,
"type": 0
}
}
],
"len": 32,
"watch_group": 1,
"watch_port": 1,
"weight": 1
}
}
],
"group_id": 1,
"length": 40,
"type": 0
}
}
],
"flags": 0,
"type": 7
}
}
os_ken.ofproto.ofproto_v1_4_parser.
OFPGroupFeaturesStatsRequest
(datapath, flags=0, type_=None)¶Group features request message
The controller uses this message to list the capabilities of groups on a switch.
Attribute | Description |
---|---|
flags | Zero or OFPMPF_REQ_MORE |
Example:
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
}
}
os_ken.ofproto.ofproto_v1_4_parser.
OFPGroupFeaturesStatsReply
(datapath, type_=None, **kwargs)¶Group features reply message
The switch responds with this message to a group features request.
Attribute | Description |
---|---|
body | Instance of OFPGroupFeaturesStats |
Example:
@set_ev_cls(ofp_event.EventOFPGroupFeaturesStatsReply, MAIN_DISPATCHER)
def group_features_stats_reply_handler(self, ev):
body = ev.msg.body
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
}
}
os_ken.ofproto.ofproto_v1_4_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
}
}
os_ken.ofproto.ofproto_v1_4_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 instance |
Example:
@set_ev_cls(ofp_event.EventOFPMeterStatsReply, MAIN_DISPATCHER)
def meter_stats_reply_handler(self, ev):
meters = []
for stat in ev.msg.body:
meters.append('meter_id=0x%08x len=%d flow_count=%d '
'packet_in_count=%d byte_in_count=%d '
'duration_sec=%d duration_nsec=%d '
'band_stats=%s' %
(stat.meter_id, stat.len, stat.flow_count,
stat.packet_in_count, stat.byte_in_count,
stat.duration_sec, stat.duration_nsec,
stat.band_stats))
self.logger.debug('MeterStats: %s', meters)
JSON Example:
{
"OFPMeterStatsReply": {
"body": [
{
"OFPMeterStats": {
"band_stats": [
{
"OFPMeterBandStats": {
"byte_band_count": 0,
"packet_band_count": 0
}
}
],
"byte_in_count": 0,
"duration_nsec": 480000,
"duration_sec": 0,
"flow_count": 0,
"len": 56,
"meter_id": 100,
"packet_in_count": 0
}
}
],
"flags": 0,
"type": 9
}
}
os_ken.ofproto.ofproto_v1_4_parser.
OFPMeterConfigStatsRequest
(datapath, flags=0, meter_id=4294967295, type_=None)¶Meter configuration statistics request message
The controller uses this message to query configuration for one or more meters.
Attribute | Description |
---|---|
flags | Zero or OFPMPF_REQ_MORE |
meter_id | ID of meter to read (OFPM_ALL to all meters) |
Example:
def send_meter_config_stats_request(self, datapath):
ofp = datapath.ofproto
ofp_parser = datapath.ofproto_parser
req = ofp_parser.OFPMeterConfigStatsRequest(datapath, 0,
ofp.OFPM_ALL)
datapath.send_msg(req)
JSON Example:
{
"OFPMeterConfigStatsRequest": {
"flags": 0,
"meter_id": 4294967295,
"type": 10
}
}
os_ken.ofproto.ofproto_v1_4_parser.
OFPMeterConfigStatsReply
(datapath, type_=None, **kwargs)¶Meter configuration statistics reply message
The switch responds with this message to a meter configuration statistics request.
Attribute | Description |
---|---|
body | List of OFPMeterConfigStats instance |
Example:
@set_ev_cls(ofp_event.EventOFPMeterConfigStatsReply, MAIN_DISPATCHER)
def meter_config_stats_reply_handler(self, ev):
configs = []
for stat in ev.msg.body:
configs.append('length=%d flags=0x%04x meter_id=0x%08x '
'bands=%s' %
(stat.length, stat.flags, stat.meter_id,
stat.bands))
self.logger.debug('MeterConfigStats: %s', configs)
JSON Example:
{
"OFPMeterConfigStatsReply": {
"body": [
{
"OFPMeterConfigStats": {
"bands": [
{
"OFPMeterBandDrop": {
"burst_size": 10,
"len": 16,
"rate": 1000,
"type": 1
}
}
],
"flags": 14,
"length": 24,
"meter_id": 100
}
}
],
"flags": 0,
"type": 10
}
}
os_ken.ofproto.ofproto_v1_4_parser.
OFPMeterFeaturesStatsRequest
(datapath, flags=0, type_=None)¶Meter features statistics request message
The controller uses this message to query the set of features of the metering subsystem.
Attribute | Description |
---|---|
flags | Zero or OFPMPF_REQ_MORE |
Example:
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
}
}
os_ken.ofproto.ofproto_v1_4_parser.
OFPMeterFeaturesStatsReply
(datapath, type_=None, **kwargs)¶Meter features statistics reply message
The switch responds with this message to a meter features statistics request.
Attribute | Description |
---|---|
body | List of OFPMeterFeaturesStats instance |
Example:
@set_ev_cls(ofp_event.EventOFPMeterFeaturesStatsReply, MAIN_DISPATCHER)
def meter_features_stats_reply_handler(self, ev):
features = []
for stat in ev.msg.body:
features.append('max_meter=%d band_types=0x%08x '
'capabilities=0x%08x max_bands=%d '
'max_color=%d' %
(stat.max_meter, stat.band_types,
stat.capabilities, stat.max_bands,
stat.max_color))
self.logger.debug('MeterFeaturesStats: %s', features)
JSON Example:
{
"OFPMeterFeaturesStatsReply": {
"body": [
{
"OFPMeterFeaturesStats": {
"band_types": 2147483654,
"capabilities": 15,
"max_bands": 255,
"max_color": 0,
"max_meter": 16777216
}
}
],
"flags": 0,
"type": 11
}
}
os_ken.ofproto.ofproto_v1_4_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_INITIAL
OFPFMF_ADD
OFPFMF_REMOVED
OFPFMF_MODIFY
OFPFMF_INSTRUCTIONS
OFPFMF_NO_ABBREV
OFPFMF_ONLY_OWN
|
table_id | ID of table to monitor |
command | One of the following values. OFPFMC_ADD
OFPFMC_MODIFY
OFPFMC_DELETE
|
match | 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
}
}
os_ken.ofproto.ofproto_v1_4_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. OFPFlowMonitorFull
OFPFlowMonitorAbbrev
OFPFlowMonitorPaused
|
Example:
@set_ev_cls(ofp_event.EventOFPFlowMonitorReply, MAIN_DISPATCHER)
def flow_monitor_reply_handler(self, ev):
msg = ev.msg
dp = msg.datapath
ofp = dp.ofproto
flow_updates = []
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
}
}
os_ken.ofproto.ofproto_v1_4_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
}
}
os_ken.ofproto.ofproto_v1_4_parser.
OFPExperimenterStatsReply
(datapath, type_=None, **kwargs)¶Experimenter multipart reply message
Attribute | Description |
---|---|
body | An OFPExperimenterMultipart instance |
JSON Example:
{
"OFPExperimenterStatsReply": {
"body": {
"OFPExperimenterMultipart": {
"data": "dGVzdGRhdGE5OTk5OTk5OQ==",
"exp_type": 3405674359,
"experimenter": 3735928495
}
},
"flags": 0,
"type": 65535
}
}
os_ken.ofproto.ofproto_v1_4_parser.
OFPPacketOut
(datapath, buffer_id=None, in_port=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) |
in_port | Packet's input port or OFPP_CONTROLLER |
actions | list of OpenFlow action class |
data | Packet data of a binary type value or an instances of packet.Packet. |
Example:
def send_packet_out(self, datapath, buffer_id, in_port):
ofp = datapath.ofproto
ofp_parser = datapath.ofproto_parser
actions = [ofp_parser.OFPActionOutput(ofp.OFPP_FLOOD, 0)]
req = ofp_parser.OFPPacketOut(datapath, buffer_id,
in_port, actions)
datapath.send_msg(req)
JSON Example:
{
"OFPPacketOut": {
"actions": [
{
"OFPActionOutput": {
"len": 16,
"max_len": 65535,
"port": 4294967292,
"type": 0
}
}
],
"actions_len": 16,
"buffer_id": 4294967295,
"data": "8guk0D9w8gukffjqCABFAABU+BoAAP8Br4sKAAABCgAAAggAAgj3YAAAMdYCAAAAAACrjS0xAAAAABAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vAAAAAAAAAAA=",
"in_port": 4294967293
}
}
os_ken.ofproto.ofproto_v1_4_parser.
OFPBarrierRequest
(datapath)¶Barrier request message
The controller sends this message to ensure message dependencies have been met or receive notifications for completed operations.
Example:
def send_barrier_request(self, datapath):
ofp_parser = datapath.ofproto_parser
req = ofp_parser.OFPBarrierRequest(datapath)
datapath.send_msg(req)
JSON Example:
{
"OFPBarrierRequest": {}
}
os_ken.ofproto.ofproto_v1_4_parser.
OFPBarrierReply
(datapath)¶Barrier reply message
The switch responds with this message to a barrier request.
Example:
@set_ev_cls(ofp_event.EventOFPBarrierReply, MAIN_DISPATCHER)
def barrier_reply_handler(self, ev):
self.logger.debug('OFPBarrierReply received')
JSON Example:
{
"OFPBarrierReply": {}
}
os_ken.ofproto.ofproto_v1_4_parser.
OFPRoleRequest
(datapath, role=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_NOCHANGE
OFPCR_ROLE_EQUAL
OFPCR_ROLE_MASTER
OFPCR_ROLE_SLAVE
|
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, 0)
datapath.send_msg(req)
JSON Example:
{
"OFPRoleRequest": {
"generation_id": 17294086455919964160,
"role": 2
}
}
os_ken.ofproto.ofproto_v1_4_parser.
OFPRoleReply
(datapath, role=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_NOCHANGE
OFPCR_ROLE_EQUAL
OFPCR_ROLE_MASTER
OFPCR_ROLE_SLAVE
|
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 generation_id=%d',
role, msg.generation_id)
JSON Example:
{
"OFPRoleReply": {
"generation_id": 17294086455919964160,
"role": 3
}
}
os_ken.ofproto.ofproto_v1_4_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_REQUEST
OFPBCT_OPEN_REPLY
OFPBCT_CLOSE_REQUEST
OFPBCT_CLOSE_REPLY
OFPBCT_COMMIT_REQUEST
OFPBCT_COMMIT_REPLY
OFPBCT_DISCARD_REQUEST
OFPBCT_DISCARD_REPLY
|
flags | Bitmap of the following flags. OFPBF_ATOMIC
OFPBF_ORDERED
|
properties | List of OFPBundleProp subclass instance |
Example:
def send_bundle_control(self, datapath):
ofp = datapath.ofproto
ofp_parser = datapath.ofproto_parser
req = ofp_parser.OFPBundleCtrlMsg(datapath, 7,
ofp.OFPBCT_OPEN_REQUEST,
ofp.OFPBF_ATOMIC, [])
datapath.send_msg(req)
JSON Example:
{
"OFPBundleCtrlMsg": {
"bundle_id": 1234,
"flags": 1,
"properties": [
{
"OFPBundlePropExperimenter": {
"data": [],
"exp_type": 0,
"experimenter": 101,
"length": 12,
"type": 65535
}
},
{
"OFPBundlePropExperimenter": {
"data": [
1
],
"exp_type": 1,
"experimenter": 101,
"length": 16,
"type": 65535
}
},
{
"OFPBundlePropExperimenter": {
"data": [
1,
2
],
"exp_type": 2,
"experimenter": 101,
"length": 20,
"type": 65535
}
}
],
"type": 0
}
}
os_ken.ofproto.ofproto_v1_4_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_ATOMIC
OFPBF_ORDERED
|
message | MsgBase subclass instance |
properties | List of OFPBundleProp subclass instance |
Example:
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": 1234,
"flags": 1,
"message": {
"OFPEchoRequest": {
"data": null
}
},
"properties": [
{
"OFPBundlePropExperimenter": {
"data": [],
"exp_type": 0,
"experimenter": 101,
"length": 12,
"type": 65535
}
},
{
"OFPBundlePropExperimenter": {
"data": [
1
],
"exp_type": 1,
"experimenter": 101,
"length": 16,
"type": 65535
}
},
{
"OFPBundlePropExperimenter": {
"data": [
1,
2
],
"exp_type": 2,
"experimenter": 101,
"length": 20,
"type": 65535
}
}
]
}
}
os_ken.ofproto.ofproto_v1_4_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 instances |
Example:
def send_set_async(self, datapath):
ofp = datapath.ofproto
ofp_parser = datapath.ofproto_parser
properties = [
ofp_parser.OFPAsyncConfigPropReasons(
ofp.OFPACPT_PACKET_IN_SLAVE, 8,
(1 << ofp.OFPR_APPLY_ACTION
| 1 << ofp.OFPR_INVALID_TTL))]
req = ofp_parser.OFPSetAsync(datapath, properties)
datapath.send_msg(req)
JSON Example:
{
"OFPSetAsync": {
"properties": [
{
"OFPAsyncConfigPropReasons": {
"length": 8,
"mask": 3,
"type": 0
}
},
{
"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
}
}
]
}
}
os_ken.ofproto.ofproto_v1_4_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": {}
}
os_ken.ofproto.ofproto_v1_4_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 instances |
Example:
@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
}
}
]
}
}
os_ken.ofproto.ofproto_v1_4_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_MISS
OFPR_APPLY_ACTION
OFPR_INVALID_TTL
OFPR_ACTION_SET
OFPR_GROUP
OFPR_PACKET_OUT
|
table_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": 2,
"cookie": 283686884868096,
"data": "////////8gukffjqCAYAAQgABgQAAfILpH346goAAAEAAAAAAAAKAAAD",
"match": {
"OFPMatch": {
"length": 80,
"oxm_fields": [
{
"OXMTlv": {
"field": "in_port",
"mask": null,
"value": 6
}
},
{
"OXMTlv": {
"field": "eth_type",
"mask": null,
"value": 2054
}
},
{
"OXMTlv": {
"field": "eth_dst",
"mask": null,
"value": "ff:ff:ff:ff:ff:ff"
}
},
{
"OXMTlv": {
"field": "eth_src",
"mask": null,
"value": "f2:0b:a4:7d:f8:ea"
}
},
{
"OXMTlv": {
"field": "arp_op",
"mask": null,
"value": 1
}
},
{
"OXMTlv": {
"field": "arp_spa",
"mask": null,
"value": "10.0.0.1"
}
},
{
"OXMTlv": {
"field": "arp_tpa",
"mask": null,
"value": "10.0.0.3"
}
},
{
"OXMTlv": {
"field": "arp_sha",
"mask": null,
"value": "f2:0b:a4:7d:f8:ea"
}
},
{
"OXMTlv": {
"field": "arp_tha",
"mask": null,
"value": "00:00:00:00:00:00"
}
}
],
"type": 1
}
},
"reason": 3,
"table_id": 1,
"total_len": 42
}
}
{
"OFPPacketIn": {
"buffer_id": 4026531840,
"cookie": 283686884868096,
"data": "",
"match": {
"OFPMatch": {
"length": 329,
"oxm_fields": [
{
"OXMTlv": {
"field": "in_port",
"mask": null,
"value": 84281096
}
},
{
"OXMTlv": {
"field": "in_phy_port",
"mask": null,
"value": 16909060
}
},
{
"OXMTlv": {
"field": "metadata",
"mask": null,
"value": 283686952306183
}
},
{
"OXMTlv": {
"field": "eth_type",
"mask": null,
"value": 2054
}
},
{
"OXMTlv": {
"field": "eth_dst",
"mask": null,
"value": "ff:ff:ff:ff:ff:ff"
}
},
{
"OXMTlv": {
"field": "eth_src",
"mask": null,
"value": "f2:0b:a4:7d:f8:ea"
}
},
{
"OXMTlv": {
"field": "vlan_vid",
"mask": null,
"value": 999
}
},
{
"OXMTlv": {
"field": "ip_dscp",
"mask": null,
"value": 9
}
},
{
"OXMTlv": {
"field": "ip_ecn",
"mask": null,
"value": 3
}
},
{
"OXMTlv": {
"field": "ip_proto",
"mask": null,
"value": 99
}
},
{
"OXMTlv": {
"field": "ipv4_src",
"mask": null,
"value": "1.2.3.4"
}
},
{
"OXMTlv": {
"field": "ipv4_dst",
"mask": null,
"value": "1.2.3.4"
}
},
{
"OXMTlv": {
"field": "tcp_src",
"mask": null,
"value": 8080
}
},
{
"OXMTlv": {
"field": "tcp_dst",
"mask": null,
"value": 18080
}
},
{
"OXMTlv": {
"field": "udp_src",
"mask": null,
"value": 28080
}
},
{
"OXMTlv": {
"field": "udp_dst",
"mask": null,
"value": 55936
}
},
{
"OXMTlv": {
"field": "sctp_src",
"mask": null,
"value": 48080
}
},
{
"OXMTlv": {
"field": "sctp_dst",
"mask": null,
"value": 59328
}
},
{
"OXMTlv": {
"field": "icmpv4_type",
"mask": null,
"value": 100
}
},
{
"OXMTlv": {
"field": "icmpv4_code",
"mask": null,
"value": 101
}
},
{
"OXMTlv": {
"field": "arp_op",
"mask": null,
"value": 1
}
},
{
"OXMTlv": {
"field": "arp_spa",
"mask": null,
"value": "10.0.0.1"
}
},
{
"OXMTlv": {
"field": "arp_tpa",
"mask": null,
"value": "10.0.0.3"
}
},
{
"OXMTlv": {
"field": "arp_sha",
"mask": null,
"value": "f2:0b:a4:7d:f8:ea"
}
},
{
"OXMTlv": {
"field": "arp_tha",
"mask": null,
"value": "00:00:00:00:00:00"
}
},
{
"OXMTlv": {
"field": "ipv6_src",
"mask": null,
"value": "fe80::f00b:a4ff:fe48:28a5"
}
},
{
"OXMTlv": {
"field": "ipv6_dst",
"mask": null,
"value": "fe80::f00b:a4ff:fe05:b7dc"
}
},
{
"OXMTlv": {
"field": "ipv6_flabel",
"mask": null,
"value": 541473
}
},
{
"OXMTlv": {
"field": "icmpv6_type",
"mask": null,
"value": 200
}
},
{
"OXMTlv": {
"field": "icmpv6_code",
"mask": null,
"value": 201
}
},
{
"OXMTlv": {
"field": "ipv6_nd_target",
"mask": null,
"value": "fe80::a60:6eff:fe7f:74e7"
}
},
{
"OXMTlv": {
"field": "ipv6_nd_sll",
"mask": null,
"value": "00:00:00:00:02:9a"
}
},
{
"OXMTlv": {
"field": "ipv6_nd_tll",
"mask": null,
"value": "00:00:00:00:02:2b"
}
},
{
"OXMTlv": {
"field": "mpls_label",
"mask": null,
"value": 624485
}
},
{
"OXMTlv": {
"field": "mpls_tc",
"mask": null,
"value": 5
}
},
{
"OXMTlv": {
"field": "mpls_bos",
"mask": null,
"value": 1
}
},
{
"OXMTlv": {
"field": "pbb_isid",
"mask": null,
"value": 11259375
}
},
{
"OXMTlv": {
"field": "tunnel_id",
"mask": null,
"value": 651061555542690057
}
},
{
"OXMTlv": {
"field": "ipv6_exthdr",
"mask": null,
"value": 500
}
},
{
"OXMTlv": {
"field": "pbb_uca",
"mask": null,
"value": 1
}
}
],
"type": 1
}
},
"reason": 0,
"table_id": 200,
"total_len": 0
}
}
os_ken.ofproto.ofproto_v1_4_parser.
OFPFlowRemoved
(datapath, cookie=None, priority=None, reason=None, table_id=None, duration_sec=None, duration_nsec=None, idle_timeout=None, hard_timeout=None, packet_count=None, byte_count=None, match=None)¶Flow removed message
When flow entries time out or are deleted, the switch notifies controller with this message.
Attribute | Description |
---|---|
cookie | Opaque controller-issued identifier |
priority | Priority level of flow entry |
reason | One of the following values. OFPRR_IDLE_TIMEOUT
OFPRR_HARD_TIMEOUT
OFPRR_DELETE
OFPRR_GROUP_DELETE
OFPRR_METER_DELETE
OFPRR_EVICTION
|
table_id | ID of the table |
duration_sec | Time flow was alive in seconds |
duration_nsec | Time flow was alive in nanoseconds beyond duration_sec |
idle_timeout | Idle timeout from original flow mod |
hard_timeout | Hard timeout from original flow mod |
packet_count | Number of packets that was associated with the flow |
byte_count | Number of bytes that was associated with the flow |
match | Instance of OFPMatch |
Example:
@set_ev_cls(ofp_event.EventOFPFlowRemoved, MAIN_DISPATCHER)
def flow_removed_handler(self, ev):
msg = ev.msg
dp = msg.datapath
ofp = dp.ofproto
if msg.reason == ofp.OFPRR_IDLE_TIMEOUT:
reason = 'IDLE TIMEOUT'
elif msg.reason == ofp.OFPRR_HARD_TIMEOUT:
reason = 'HARD TIMEOUT'
elif msg.reason == ofp.OFPRR_DELETE:
reason = 'DELETE'
elif msg.reason == ofp.OFPRR_GROUP_DELETE:
reason = 'GROUP DELETE'
else:
reason = 'unknown'
self.logger.debug('OFPFlowRemoved received: '
'cookie=%d priority=%d reason=%s table_id=%d '
'duration_sec=%d duration_nsec=%d '
'idle_timeout=%d hard_timeout=%d '
'packet_count=%d byte_count=%d match.fields=%s',
msg.cookie, msg.priority, reason, msg.table_id,
msg.duration_sec, msg.duration_nsec,
msg.idle_timeout, msg.hard_timeout,
msg.packet_count, msg.byte_count, msg.match)
JSON Example:
{
"OFPFlowRemoved": {
"byte_count": 86,
"cookie": 0,
"duration_nsec": 48825000,
"duration_sec": 3,
"hard_timeout": 0,
"idle_timeout": 3,
"match": {
"OFPMatch": {
"length": 14,
"oxm_fields": [
{
"OXMTlv": {
"field": "eth_dst",
"mask": null,
"value": "f2:0b:a4:7d:f8:ea"
}
}
],
"type": 1
}
},
"packet_count": 1,
"priority": 65535,
"reason": 0,
"table_id": 0
}
}
os_ken.ofproto.ofproto_v1_4_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_ADD
OFPPR_DELETE
OFPPR_MODIFY
|
desc | 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
}
}
os_ken.ofproto.ofproto_v1_4_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_NOCHANGE
OFPCR_ROLE_EQUAL
OFPCR_ROLE_MASTER
|
reason | One of the following values. OFPCRR_MASTER_REQUEST
OFPCRR_CONFIG
OFPCRR_EXPERIMENTER
|
generation_id | Master Election Generation ID |
properties | List of OFPRoleProp subclass instance |
Example:
@set_ev_cls(ofp_event.EventOFPRoleStatus, MAIN_DISPATCHER)
def role_status_handler(self, ev):
msg = ev.msg
dp = msg.datapath
ofp = dp.ofproto
if msg.role == ofp.OFPCR_ROLE_NOCHANGE:
role = 'ROLE NOCHANGE'
elif msg.role == ofp.OFPCR_ROLE_EQUAL:
role = 'ROLE EQUAL'
elif msg.role == ofp.OFPCR_ROLE_MASTER:
role = 'ROLE MASTER'
else:
role = 'unknown'
if msg.reason == ofp.OFPCRR_MASTER_REQUEST:
reason = 'MASTER REQUEST'
elif msg.reason == ofp.OFPCRR_CONFIG:
reason = 'CONFIG'
elif msg.reason == ofp.OFPCRR_EXPERIMENTER:
reason = 'EXPERIMENTER'
else:
reason = 'unknown'
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": 7,
"properties": [
{
"OFPRolePropExperimenter": {
"data": [],
"exp_type": 0,
"experimenter": 101,
"length": 12,
"type": 65535
}
},
{
"OFPRolePropExperimenter": {
"data": [
1
],
"exp_type": 1,
"experimenter": 101,
"length": 16,
"type": 65535
}
},
{
"OFPRolePropExperimenter": {
"data": [
1,
2
],
"exp_type": 2,
"experimenter": 101,
"length": 20,
"type": 65535
}
}
],
"reason": 0,
"role": 2
}
}
os_ken.ofproto.ofproto_v1_4_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_DOWN
OFPTR_VACANCY_UP
|
table | OFPTableDesc instance |
Example:
@set_ev_cls(ofp_event.EventOFPTableStatus, MAIN_DISPATCHER)
def table(self, ev):
msg = ev.msg
dp = msg.datapath
ofp = dp.ofproto
if msg.reason == ofp.OFPTR_VACANCY_DOWN:
reason = 'VACANCY_DOWN'
elif msg.reason == ofp.OFPTR_VACANCY_UP:
reason = 'VACANCY_UP'
else:
reason = 'unknown'
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
}
}
}
}
os_ken.ofproto.ofproto_v1_4_parser.
OFPRequestForward
(datapath, request=None)¶Forwarded request message
The swtich forwards request messages from one controller to other controllers.
Attribute | Description |
---|---|
request | OFPGroupMod or OFPMeterMod instance |
Example:
@set_ev_cls(ofp_event.EventOFPRequestForward, MAIN_DISPATCHER)
def request_forward_handler(self, ev):
msg = ev.msg
dp = msg.datapath
ofp = dp.ofproto
if msg.request.msg_type == ofp.OFPT_GROUP_MOD:
self.logger.debug(
'OFPRequestForward received: request=OFPGroupMod('
'command=%d, type=%d, group_id=%d, buckets=%s)',
msg.request.command, msg.request.type,
msg.request.group_id, msg.request.buckets)
elif msg.request.msg_type == ofp.OFPT_METER_MOD:
self.logger.debug(
'OFPRequestForward received: request=OFPMeterMod('
'command=%d, flags=%d, meter_id=%d, bands=%s)',
msg.request.command, msg.request.flags,
msg.request.meter_id, msg.request.bands)
else:
self.logger.debug(
'OFPRequestForward received: request=Unknown')
JSON Example:
{
"OFPRequestForward": {
"request": {
"OFPGroupMod": {
"buckets": [
{
"OFPBucket": {
"actions": [
{
"OFPActionOutput": {
"len": 16,
"max_len": 65535,
"port": 2,
"type": 0
}
}
],
"len": 32,
"watch_group": 1,
"watch_port": 1,
"weight": 1
}
}
],
"command": 0,
"group_id": 1,
"type": 0
}
}
}
}
os_ken.ofproto.ofproto_v1_4_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 instance |
JSON Example:
{
"OFPHello": {
"elements": [
{
"OFPHelloElemVersionBitmap": {
"length": 8,
"type": 1,
"versions": [
1,
2,
3,
9,
10,
30
]
}
}
]
}
}
os_ken.ofproto.ofproto_v1_4_parser.
OFPHelloElemVersionBitmap
(versions, type_=None, length=None)¶Version bitmap Hello Element
Attribute | Description |
---|---|
versions | list of versions of OpenFlow protocol a device supports |
os_ken.ofproto.ofproto_v1_4_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 = datapath.ofproto
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": "aG9nZQ=="
}
}
os_ken.ofproto.ofproto_v1_4_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": "aG9nZQ=="
}
}
os_ken.ofproto.ofproto_v1_4_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 to type_
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": 11,
"data": "ZnVnYWZ1Z2E=",
"type": 2
}
}
os_ken.ofproto.ofproto_v1_4_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:
{
"OFPExperimenter": {
"data": "bmF6bw==",
"exp_type": 123456789,
"experimenter": 98765432
}
}
os_ken.ofproto.ofproto_v1_4_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_DOWN
OFPPC_NO_RECV
OFPPC_NO_FWD
OFPPC_NO_PACKET_IN
|
state | Bitmap of port state flags. OFPPS_LINK_DOWN
OFPPS_BLOCKED
OFPPS_LIVE
|
properties | List of OFPPortDescProp subclass instance |
os_ken.ofproto.ofproto_v1_4_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 (EXT-109 ONF Extension) |
actset_output | Integer 32bit | Output port from action set metadata (EXT-233 ONF Extension) |
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
os_ken.ofproto.ofproto_v1_4_parser.
OFPInstructionGotoTable
(table_id, type_=None, len_=None)¶Goto table instruction
This instruction indicates the next table in the processing pipeline.
Attribute | Description |
---|---|
table_id | Next table |
os_ken.ofproto.ofproto_v1_4_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 |
os_ken.ofproto.ofproto_v1_4_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_ACTIONS
OFPIT_APPLY_ACTIONS
OFPIT_CLEAR_ACTIONS
|
actions | list of OpenFlow action class |
type
attribute corresponds to type_
parameter of __init__.
os_ken.ofproto.ofproto_v1_4_parser.
OFPInstructionMeter
(meter_id=1, type_=None, len_=None)¶Meter instruction
This instruction applies the meter.
Attribute | Description |
---|---|
meter_id | Meter instance |
os_ken.ofproto.ofproto_v1_4_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 |
os_ken.ofproto.ofproto_v1_4_parser.
OFPActionCopyTtlOut
(type_=None, len_=None)¶Copy TTL Out action
This action copies the TTL from the next-to-outermost header with TTL to the outermost header with TTL.
os_ken.ofproto.ofproto_v1_4_parser.
OFPActionCopyTtlIn
(type_=None, len_=None)¶Copy TTL In action
This action copies the TTL from the outermost header with TTL to the next-to-outermost header with TTL.
os_ken.ofproto.ofproto_v1_4_parser.
OFPActionSetMplsTtl
(mpls_ttl, type_=None, len_=None)¶Set MPLS TTL action
This action sets the MPLS TTL.
Attribute | Description |
---|---|
mpls_ttl | MPLS TTL |
os_ken.ofproto.ofproto_v1_4_parser.
OFPActionDecMplsTtl
(type_=None, len_=None)¶Decrement MPLS TTL action
This action decrements the MPLS TTL.
os_ken.ofproto.ofproto_v1_4_parser.
OFPActionPushVlan
(ethertype=33024, type_=None, len_=None)¶Push VLAN action
This action pushes a new VLAN tag to the packet.
Attribute | Description |
---|---|
ethertype | Ether type. The default is 802.1Q. (0x8100) |
os_ken.ofproto.ofproto_v1_4_parser.
OFPActionPopVlan
(type_=None, len_=None)¶Pop VLAN action
This action pops the outermost VLAN tag from the packet.
os_ken.ofproto.ofproto_v1_4_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 |
os_ken.ofproto.ofproto_v1_4_parser.
OFPActionPopMpls
(ethertype=2048, type_=None, len_=None)¶Pop MPLS action
This action pops the MPLS header from the packet.
os_ken.ofproto.ofproto_v1_4_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 |
os_ken.ofproto.ofproto_v1_4_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 |
os_ken.ofproto.ofproto_v1_4_parser.
OFPActionSetNwTtl
(nw_ttl, type_=None, len_=None)¶Set IP TTL action
This action sets the IP TTL.
Attribute | Description |
---|---|
nw_ttl | IP TTL |
os_ken.ofproto.ofproto_v1_4_parser.
OFPActionDecNwTtl
(type_=None, len_=None)¶Decrement IP TTL action
This action decrements the IP TTL.
os_ken.ofproto.ofproto_v1_4_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.
Example:
set_field = OFPActionSetField(eth_src="00:00:00:00:00:00")
os_ken.ofproto.ofproto_v1_4_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 |
os_ken.ofproto.ofproto_v1_4_parser.
OFPActionPopPbb
(type_=None, len_=None)¶Pop PBB action
This action pops the outermost PBB service instance header from the packet.
os_ken.ofproto.ofproto_v1_4_parser.
OFPActionExperimenter
(experimenter)¶Experimenter action
This action is an extensible action for the experimenter.
Attribute | Description |
---|---|
experimenter | Experimenter ID |
Note
For the list of the supported Nicira experimenter actions, please refer to os_ken.ofproto.nx_actions.
Except where otherwise noted, this document is licensed under Creative Commons Attribution 3.0 License. See all OpenStack Legal Documents.