os_ken.ofproto.ofproto_v1_0_parser.
OFPFeaturesRequest
(datapath)¶Features request message
The controller sends a feature request to the switch upon session establishment.
This message is handled by the 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_0_parser.
OFPSwitchFeatures
(datapath, datapath_id=None, n_buffers=None, n_tables=None, capabilities=None, actions=None, ports=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.
Attribute | Description |
---|---|
datapath_id | Datapath unique ID. |
n_buffers | Max packets buffered at once. |
n_tables | Number of tables supported by datapath. |
capabilities | Bitmap of capabilities flag. OFPC_FLOW_STATS
OFPC_TABLE_STATS
OFPC_PORT_STATS
OFPC_STP
OFPC_RESERVED
OFPC_IP_REASM
OFPC_QUEUE_STATS
OFPC_ARP_MATCH_IP
|
actions | Bitmap of supported OFPAT_*. |
ports | List of OFPPhyPort instances. |
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 capabilities=0x%08x ports=%s',
msg.datapath_id, msg.n_buffers, msg.n_tables,
msg.capabilities, msg.ports)
JSON Example:
{
"OFPSwitchFeatures": {
"actions": 2115,
"capabilities": 169,
"datapath_id": 1095522080376,
"n_buffers": 0,
"n_tables": 255,
"ports": {
"6": {
"OFPPhyPort": {
"advertised": 640,
"config": 0,
"curr": 648,
"hw_addr": "f2:0b:a4:7d:f8:ea",
"name": "Port6",
"peer": 648,
"port_no": 6,
"state": 2,
"supported": 648
}
},
"7": {
"OFPPhyPort": {
"advertised": 640,
"config": 0,
"curr": 648,
"hw_addr": "f2:0b:a4:d0:3f:70",
"name": "Port7",
"peer": 648,
"port_no": 7,
"state": 16,
"supported": 648
}
}
}
}
}
os_ken.ofproto.ofproto_v1_0_parser.
OFPSetConfig
(datapath, flags=None, miss_send_len=None)¶Set config request message
The controller sends a set config request message to set configuraion parameters.
Attribute | Description |
---|---|
flags | One of the following configuration flags. OFPC_FRAG_NORMAL
OFPC_FRAG_DROP
OFPC_FRAG_REASM
OFPC_FRAG_MASK
|
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)
os_ken.ofproto.ofproto_v1_0_parser.
OFPGetConfigRequest
(datapath)¶Get config request message
The controller sends a get config request to query configuration parameters in the switch.
Example:
def send_get_config_request(self, datapath):
ofp_parser = datapath.ofproto_parser
req = ofp_parser.OFPGetConfigRequest(datapath)
datapath.send_msg(req)
os_ken.ofproto.ofproto_v1_0_parser.
OFPGetConfigReply
(datapath)¶Get config reply message
The switch responds to a configuration request with a get config reply message.
Attribute | Description |
---|---|
flags | One of the following configuration flags. OFPC_FRAG_NORMAL
OFPC_FRAG_DROP
OFPC_FRAG_REASM
OFPC_FRAG_MASK
|
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
if msg.flags == ofp.OFPC_FRAG_NORMAL:
flags = 'NORMAL'
elif msg.flags == ofp.OFPC_FRAG_DROP:
flags = 'DROP'
elif msg.flags == ofp.OFPC_FRAG_REASM:
flags = 'REASM'
elif msg.flags == ofp.OFPC_FRAG_MASK:
flags = 'MASK'
else:
flags = 'unknown'
self.logger.debug('OFPGetConfigReply received: '
'flags=%s miss_send_len=%d',
flags, msg.miss_send_len)
os_ken.ofproto.ofproto_v1_0_parser.
OFPFlowMod
(datapath, match=None, cookie=0, command=0, idle_timeout=0, hard_timeout=0, priority=32768, buffer_id=4294967295, out_port=65535, flags=0, actions=None)¶Modify Flow entry message
The controller sends this message to modify the flow table.
Attribute | Description |
---|---|
match | Instance of OFPMatch . |
cookie | Opaque controller-issued identifier. |
command | One of the following values. OFPFC_ADD
OFPFC_MODIFY
OFPFC_MODIFY_STRICT
OFPFC_DELETE
OFPFC_DELETE_STRICT
|
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 0xffffffff). Not meaningful for OFPFC_DELETE*. |
out_port | For OFPFC_DELETE* commands, require matching entries to include this as an output port. A value of OFPP_NONE indicates no restriction. |
flags | One of the following values. OFPFF_SEND_FLOW_REM
OFPFF_CHECK_OVERLAP
OFPFF_EMERG
|
actions | List of OFPAction* instance. |
Example:
def send_flow_mod(self, datapath):
ofp = datapath.ofproto
ofp_parser = datapath.ofproto_parser
match = ofp_parser.OFPMatch(in_port=1)
cookie = 0
command = ofp.OFPFC_ADD
idle_timeout = hard_timeout = 0
priority = 32768
buffer_id = 0xffffffff
out_port = ofproto.OFPP_NONE
flags = 0
actions = [ofp_parser.OFPActionOutput(ofp.OFPP_NORMAL, 0)]
req = ofp_parser.OFPFlowMod(
datapath, match, cookie, command, idle_timeout, hard_timeout,
priority, buffer_id, out_port, flags, actions)
datapath.send_msg(req)
JSON Example:
{
"OFPFlowMod": {
"actions": [
{
"OFPActionOutput": {
"max_len": 65535,
"port": 6
}
}
],
"buffer_id": 65535,
"command": 0,
"cookie": 0,
"flags": 0,
"hard_timeout": 0,
"idle_timeout": 0,
"match": {
"OFPMatch": {
"dl_dst": "f2:0b:a4:7d:f8:ea",
"dl_src": "00:00:00:00:00:00",
"dl_type": 0,
"dl_vlan": 0,
"dl_vlan_pcp": 0,
"in_port": 0,
"nw_dst": "0.0.0.0",
"nw_proto": 0,
"nw_src": "0.0.0.0",
"nw_tos": 0,
"tp_dst": 0,
"tp_src": 0,
"wildcards": 4194295
}
},
"out_port": 65532,
"priority": 123
}
}
os_ken.ofproto.ofproto_v1_0_parser.
OFPPortMod
(datapath, port_no=0, hw_addr='00:00:00:00:00:00', config=0, mask=0, advertise=0)¶Port modification message
The controller send 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 OFPPhyPort of OFPSwitchFeatures . |
config | Bitmap of configuration flags. OFPPC_PORT_DOWN
OFPPC_NO_STP
OFPPC_NO_RECV
OFPPC_NO_RECV_STP
OFPPC_NO_FLOOD
OFPPC_NO_FWD
OFPPC_NO_PACKET_IN
|
mask | Bitmap of configuration flags above to be changed |
advertise | Bitmap of the following flags. OFPPF_10MB_HD
OFPPF_10MB_FD
OFPPF_100MB_HD
OFPPF_100MB_FD
OFPPF_1GB_HD
OFPPF_1GB_FD
OFPPF_10GB_FD
OFPPF_COPPER
OFPPF_FIBER
OFPPF_AUTONEG
OFPPF_PAUSE
OFPPF_PAUSE_ASYM
|
Example:
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)
req = ofp_parser.OFPPortMod(datapath, port_no, hw_addr, config,
mask, advertise)
datapath.send_msg(req)
os_ken.ofproto.ofproto_v1_0_parser.
OFPQueueGetConfigRequest
(datapath, port)¶Queue configuration request message
Attribute | Description |
---|---|
port | Port to be queried. Should refer to a valid physical port (i.e. < OFPP_MAX). |
Example:
def send_queue_get_config_request(self, datapath):
ofp = datapath.ofproto
ofp_parser = datapath.ofproto_parser
req = ofp_parser.OFPQueueGetConfigRequest(datapath,
ofp.OFPP_NONE)
datapath.send_msg(req)
os_ken.ofproto.ofproto_v1_0_parser.
OFPQueueGetConfigReply
(datapath)¶Queue configuration reply message
The switch responds with this message to a queue configuration request.
Attribute | Description |
---|---|
port | Port to be queried. |
queues | List of OFPPacketQueue instance. |
Example:
@set_ev_cls(ofp_event.EventOFPQueueGetConfigReply, MAIN_DISPATCHER)
def queue_get_config_reply_handler(self, ev):
msg = ev.msg
self.logger.debug('OFPQueueGetConfigReply received: '
'port=%s queues=%s',
msg.port, msg.queues)
os_ken.ofproto.ofproto_v1_0_parser.
OFPDescStatsRequest
(datapath, flags)¶Description statistics request message
The controller uses this message to query description of the switch.
Attribute | Description |
---|---|
flags | Zero (none yet defined in the spec). |
Example:
def send_desc_stats_request(self, datapath):
ofp_parser = datapath.ofproto_parser
req = ofp_parser.OFPDescStatsRequest(datapath)
datapath.send_msg(req)
os_ken.ofproto.ofproto_v1_0_parser.
OFPDescStatsReply
(datapath)¶Description statistics reply message
The switch responds with a stats reply that include this message to a description statistics request.
Attribute | Description |
---|---|
mfr_desc | Manufacturer description. |
hw_desc | Hardware description. |
sw_desc | Software description. |
serial_num | Serial number. |
dp_desc | Human readable description of datapath. |
Example:
@set_ev_cls(ofp_event.EventOFPDescStatsReply, MAIN_DISPATCHER)
def desc_stats_reply_handler(self, ev):
msg = ev.msg
ofp = msg.datapath.ofproto
body = ev.msg.body
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)
os_ken.ofproto.ofproto_v1_0_parser.
OFPFlowStatsRequest
(datapath, flags, match, table_id, out_port)¶Individual flow statistics request message
The controller uses this message to query individual flow statistics.
Attribute | Description |
---|---|
flags | Zero (none yet defined in the spec). |
match | Instance of OFPMatch . |
table_id | ID of table to read (from ofp_table_stats), 0xff for all tables or 0xfe for emergency. |
out_port | Require matching entries to include this as an output port. A value of OFPP_NONE indicates no restriction. |
Example:
def send_flow_stats_request(self, datapath):
ofp = datapath.ofproto
ofp_parser = datapath.ofproto_parser
match = ofp_parser.OFPMatch(in_port=1)
table_id = 0xff
out_port = ofp.OFPP_NONE
req = ofp_parser.OFPFlowStatsRequest(
datapath, 0, match, table_id, out_port)
datapath.send_msg(req)
os_ken.ofproto.ofproto_v1_0_parser.
OFPFlowStatsReply
(datapath)¶Individual flow statistics reply message
The switch responds with a stats reply that include this message to an individual flow statistics request.
Attribute | Description |
---|---|
table_id | ID of table flow came from. |
match | Instance of OFPMatch . |
duration_sec | Time flow has been alive in seconds. |
duration_nsec | Time flow has been alive in nanoseconds beyond duration_sec. |
priority | Priority of the entry. Only meaningful when this is not an exact-match entry. |
idle_timeout | Number of seconds idle before expiration. |
hard_timeout | Number of seconds before expiration. |
cookie | Opaque controller-issued identifier. |
packet_count | Number of packets in flow. |
byte_count | Number of bytes in flow. |
actions | List of OFPAction* instance |
Example:
@set_ev_cls(ofp_event.EventOFPFlowStatsReply, MAIN_DISPATCHER)
def flow_stats_reply_handler(self, ev):
msg = ev.msg
ofp = msg.datapath.ofproto
body = ev.msg.body
flows = []
for stat in body:
flows.append('table_id=%s match=%s '
'duration_sec=%d duration_nsec=%d '
'priority=%d '
'idle_timeout=%d hard_timeout=%d '
'cookie=%d packet_count=%d byte_count=%d '
'actions=%s' %
(stat.table_id, stat.match,
stat.duration_sec, stat.duration_nsec,
stat.priority,
stat.idle_timeout, stat.hard_timeout,
stat.cookie, stat.packet_count, stat.byte_count,
stat.actions))
self.logger.debug('FlowStats: %s', flows)
os_ken.ofproto.ofproto_v1_0_parser.
OFPAggregateStatsRequest
(datapath, flags, match, table_id, out_port)¶Aggregate flow statistics request message
The controller uses this message to query aggregate flow statictics.
Attribute | Description |
---|---|
flags | Zero (none yet defined in the spec). |
match | Fields to match. |
table_id | ID of table to read (from ofp_table_stats) 0xff for all tables or 0xfe for emergency. |
out_port | Require matching entries to include this as an output port. A value of OFPP_NONE indicates no restriction. |
Example:
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, match, 0xff, ofp.OFPP_NONE)
datapath.send_msg(req)
os_ken.ofproto.ofproto_v1_0_parser.
OFPAggregateStatsReply
(datapath)¶Aggregate flow statistics reply message
The switch responds with a stats reply that include this message to an aggregate flow statistics request.
Attribute | Description |
---|---|
packet_count | Number of packets in flows. |
byte_count | Number of bytes in flows. |
flow_count | Number of flows. |
Example:
@set_ev_cls(ofp_event.EventOFPAggregateStatsReply, MAIN_DISPATCHER)
def aggregate_stats_reply_handler(self, ev):
msg = ev.msg
ofp = msg.datapath.ofproto
body = ev.msg.body
self.logger.debug('AggregateStats: packet_count=%d byte_count=%d '
'flow_count=%d',
body.packet_count, body.byte_count,
body.flow_count)
os_ken.ofproto.ofproto_v1_0_parser.
OFPTableStatsRequest
(datapath, flags)¶Table statistics request message
The controller uses this message to query flow table statictics.
Attribute | Description |
---|---|
flags | Zero (none yet defined in the spec). |
Example:
def send_table_stats_request(self, datapath):
ofp_parser = datapath.ofproto_parser
req = ofp_parser.OFPTableStatsRequest(datapath)
datapath.send_msg(req)
os_ken.ofproto.ofproto_v1_0_parser.
OFPTableStatsReply
(datapath)¶Table statistics reply message
The switch responds with a stats reply that include this message to a table statistics request.
Attribute | Description |
---|---|
table_id | ID of table. |
name | table name. |
wildcards | Bitmap of OFPFW_* wildcards that are supported by the table. |
max_entries | Max number of entries supported |
active_count | Number of active entries |
lookup_count | Number of packets looked up in table |
matched_count | Number of packets that hit table |
Example:
@set_ev_cls(ofp_event.EventOFPTableStatsReply, MAIN_DISPATCHER)
def stats_reply_handler(self, ev):
msg = ev.msg
ofp = msg.datapath.ofproto
body = ev.msg.body
tables = []
for stat in body:
tables.append('table_id=%d name=%s wildcards=0x%02x '
'max_entries=%d active_count=%d '
'lookup_count=%d matched_count=%d' %
(stat.table_id, stat.name, stat.wildcards,
stat.max_entries, stat.active_count,
stat.lookup_count, stat.matched_count))
self.logger.debug('TableStats: %s', tables)
os_ken.ofproto.ofproto_v1_0_parser.
OFPPortStatsRequest
(datapath, flags, port_no)¶Port statistics request message
The controller uses this message to query information about ports statistics.
Attribute | Description |
---|---|
flags | Zero (none yet defined in the spec). |
port_no | Port number to read (OFPP_NONE 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)
os_ken.ofproto.ofproto_v1_0_parser.
OFPPortStatsReply
(datapath)¶Port statistics reply message
The switch responds with a stats reply that include this message to a port statistics request.
Attribute | Description |
---|---|
port_no | Port number. |
rx_packets | Number of received packets. |
tx_packets | Number of transmitted packets. |
rx_bytes | Number of received bytes. |
tx_bytes | Number of transmitted bytes. |
rx_dropped | Number of packets dropped by RX. |
tx_dropped | Number of packets dropped by TX. |
rx_errors | Number of receive errors. |
tx_errors | Number of transmit errors. |
rx_frame_err | Number of frame alignment errors. |
rx_over_err | Number of packet with RX overrun. |
rx_crc_err | Number of CRC errors. |
collisions | Number of collisions. |
Example:
@set_ev_cls(ofp_event.EventOFPPortStatsReply, MAIN_DISPATCHER)
def port_stats_reply_handler(self, ev):
msg = ev.msg
ofp = msg.datapath.ofproto
body = ev.msg.body
ports = []
for stat in body:
ports.append('port_no=%d '
'rx_packets=%d tx_packets=%d '
'rx_bytes=%d tx_bytes=%d '
'rx_dropped=%d tx_dropped=%d '
'rx_errors=%d tx_errors=%d '
'rx_frame_err=%d rx_over_err=%d rx_crc_err=%d '
'collisions=%d' %
(stat.port_no,
stat.rx_packets, stat.tx_packets,
stat.rx_bytes, stat.tx_bytes,
stat.rx_dropped, stat.tx_dropped,
stat.rx_errors, stat.tx_errors,
stat.rx_frame_err, stat.rx_over_err,
stat.rx_crc_err, stat.collisions))
self.logger.debug('PortStats: %s', ports)
os_ken.ofproto.ofproto_v1_0_parser.
OFPQueueStatsRequest
(datapath, flags, port_no, queue_id)¶Queue statistics request message
The controller uses this message to query queue statictics.
Attribute | Description |
---|---|
flags | Zero (none yet defined in the spec) |
port_no | Port number to read (All ports if OFPT_ALL). |
queue_id | ID of queue to read (All queues if OFPQ_ALL). |
Example:
def send_queue_stats_request(self, datapath):
ofp = datapath.ofproto
ofp_parser = datapath.ofproto_parser
req = ofp_parser.OFPQueueStatsRequest(datapath, 0, ofp.OFPT_ALL,
ofp.OFPQ_ALL)
datapath.send_msg(req)
os_ken.ofproto.ofproto_v1_0_parser.
OFPQueueStatsReply
(datapath)¶Queue statistics reply message
The switch responds with a stats reply that include this message to an aggregate flow statistics request.
Attribute | Description |
---|---|
port_no | Port number. |
queue_id | ID of queue. |
tx_bytes | Number of transmitted bytes. |
tx_packets | Number of transmitted packets. |
tx_errors | Number of packets dropped due to overrun. |
Example:
@set_ev_cls(ofp_event.EventOFPQueueStatsReply, MAIN_DISPATCHER)
def stats_reply_handler(self, ev):
msg = ev.msg
ofp = msg.datapath.ofproto
body = ev.msg.body
queues = []
for stat in body:
queues.append('port_no=%d queue_id=%d '
'tx_bytes=%d tx_packets=%d tx_errors=%d ' %
(stat.port_no, stat.queue_id,
stat.tx_bytes, stat.tx_packets, stat.tx_errors))
self.logger.debug('QueueStats: %s', queues)
os_ken.ofproto.ofproto_v1_0_parser.
OFPVendorStatsRequest
(datapath, flags, vendor, specific_data=None)¶Vendor statistics request message
The controller uses this message to query vendor-specific information of a switch.
os_ken.ofproto.ofproto_v1_0_parser.
OFPVendorStatsReply
(datapath)¶Vendor statistics reply message
The switch responds with a stats reply that include this message to an vendor statistics request.
os_ken.ofproto.ofproto_v1_0_parser.
OFPPacketOut
(datapath, buffer_id=None, in_port=None, actions=None, data=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 (0xffffffff if none). |
in_port | Packet's input port (OFPP_NONE if none). |
actions | ist of OFPAction* instance. |
data | Packet data of a binary type value or an instances of packet.Packet. |
Example:
def send_packet_out(self, datapath):
ofp = datapath.ofproto
ofp_parser = datapath.ofproto_parser
buffer_id = 0xffffffff
in_port = ofp.OFPP_NONE
actions = [ofp_parser.OFPActionOutput(ofp.OFPP_FLOOD, 0)]
req = ofp_parser.OFPPacketOut(datapath, buffer_id,
in_port, actions)
datapath.send_msg(req)
JSON Example:
{
"OFPPacketOut": {
"actions": [
{
"OFPActionOutput": {
"max_len": 65535,
"port": 65532
}
}
],
"buffer_id": 4294967295,
"data": "8guk0D9w8gukffjqCABFAABU+BoAAP8Br4sKAAABCgAAAggAAgj3YAAAMdYCAAAAAACrjS0xAAAAABAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vAAAAAAAAAAA=",
"in_port": 65533
}
}
os_ken.ofproto.ofproto_v1_0_parser.
OFPBarrierRequest
(datapath)¶Barrier request message
The controller sends this message to ensure message dependencies have been met or receive notifications for completed operations.
Example:
def send_barrier_request(self, datapath):
ofp_parser = datapath.ofproto_parser
req = ofp_parser.OFPBarrierRequest(datapath)
datapath.send_msg(req)
os_ken.ofproto.ofproto_v1_0_parser.
OFPBarrierReply
(datapath)¶Barrier reply message
The switch responds with this message to a barrier request.
Example:
@set_ev_cls(ofp_event.EventOFPBarrierReply, MAIN_DISPATCHER)
def barrier_reply_handler(self, ev):
self.logger.debug('OFPBarrierReply received')
os_ken.ofproto.ofproto_v1_0_parser.
OFPPacketIn
(datapath, buffer_id=None, total_len=None, in_port=None, reason=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. |
in_port | Port on which frame was received. |
reason | Reason packet is being sent. OFPR_NO_MATCH
OFPR_ACTION
OFPR_INVALID_TTL
|
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.OFPR_NO_MATCH:
reason = 'NO MATCH'
elif msg.reason == ofp.OFPR_ACTION:
reason = 'ACTION'
elif msg.reason == ofp.OFPR_INVALID_TTL:
reason = 'INVALID TTL'
else:
reason = 'unknown'
self.logger.debug('OFPPacketIn received: '
'buffer_id=%x total_len=%d in_port=%d, '
'reason=%s data=%s',
msg.buffer_id, msg.total_len, msg.in_port,
reason, utils.hex_array(msg.data))
JSON Example:
{
"OFPPacketIn": {
"buffer_id": 2,
"data": "////////8gukffjqCAYAAQgABgQAAfILpH346goAAAEAAAAAAAAKAAAD",
"in_port": 99,
"reason": 1,
"total_len": 42
}
}
os_ken.ofproto.ofproto_v1_0_parser.
OFPFlowRemoved
(datapath)¶Flow removed message
When flow entries time out or are deleted, the switch notifies controller with this message.
Attribute | Description |
---|---|
match | Instance of OFPMatch . |
cookie | Opaque controller-issued identifier. |
priority | Priority level of flow entry. |
reason | One of the following values. OFPRR_IDLE_TIMEOUT
OFPRR_HARD_TIMEOUT
OFPRR_DELETE
|
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. |
packet_count | Number of packets that was associated with the flow. |
byte_count | Number of bytes that was associated with the flow. |
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: '
'match=%s cookie=%d priority=%d reason=%s '
'duration_sec=%d duration_nsec=%d '
'idle_timeout=%d packet_count=%d byte_count=%d',
msg.match, msg.cookie, msg.priority, reason,
msg.duration_sec, msg.duration_nsec,
msg.idle_timeout, msg.packet_count,
msg.byte_count)
os_ken.ofproto.ofproto_v1_0_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 OFPPhyPort |
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)
os_ken.ofproto.ofproto_v1_0_parser.
OFPErrorMsg
(datapath, type_=None, code=None, data=None)¶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_FLOW_MOD_FAILED | OFPFMFC_* |
OFPET_PORT_MOD_FAILED | OFPPMFC_* |
OFPET_QUEUE_OP_FAILED | OFPQOFC_* |
Example:
@set_ev_cls(ofp_event.EventOFPErrorMsg,
[HANDSHAKE_DISPATCHER, CONFIG_DISPATCHER, MAIN_DISPATCHER])
def error_msg_handler(self, ev):
msg = ev.msg
self.logger.debug('OFPErrorMsg received: type=0x%02x code=0x%02x '
'message=%s',
msg.type, msg.code, utils.hex_array(msg.data))
os_ken.ofproto.ofproto_v1_0_parser.
OFPHello
(datapath)¶Hello message
When connection is started, the hello message is exchanged between a switch and a controller.
This message is handled by the OSKen framework, so the OSKen application do not need to process this typically.
os_ken.ofproto.ofproto_v1_0_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)
os_ken.ofproto.ofproto_v1_0_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:
@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))
os_ken.ofproto.ofproto_v1_0_parser.
OFPPhyPort
¶Description of a port
Attribute | Description |
---|---|
port_no | Port number and it uniquely identifies a port within a switch. |
hw_addr | MAC address for the port. |
name | Null-terminated string containing a human-readable name for the interface. |
config | Bitmap of port configration flags. OFPPC_PORT_DOWN
OFPPC_NO_STP
OFPPC_NO_RECV
OFPPC_NO_RECV_STP
OFPPC_NO_FLOOD
OFPPC_NO_FWD
OFPPC_NO_PACKET_IN
|
state | Bitmap of port state flags. OFPPS_LINK_DOWN
OFPPS_STP_LISTEN
OFPPS_STP_LEARN
OFPPS_STP_FORWARD
OFPPS_STP_BLOCK
OFPPS_STP_MASK
|
curr | Current features. |
advertised | Features being advertised by the port. |
supported | Features supported by the port. |
peer | Features advertised by peer. |
os_ken.ofproto.ofproto_v1_0_parser.
OFPMatch
(wildcards=None, in_port=None, dl_src=None, dl_dst=None, dl_vlan=None, dl_vlan_pcp=None, dl_type=None, nw_tos=None, nw_proto=None, nw_src=None, nw_dst=None, tp_src=None, tp_dst=None, nw_src_mask=32, nw_dst_mask=32)¶Flow Match Structure
This class is implementation of the flow match structure having compose/query API.
Attribute | Description |
---|---|
wildcards | Wildcard fields. |
(match fields) | For the available match fields, please refer to the following. |
Argument | Value | Description |
---|---|---|
in_port | Integer 16bit | Switch input port. |
dl_src | MAC address | Ethernet source address. |
dl_dst | MAC address | Ethernet destination address. |
dl_vlan | Integer 16bit | Input VLAN id. |
dl_vlan_pcp | Integer 8bit | Input VLAN priority. |
dl_type | Integer 16bit | Ethernet frame type. |
nw_tos | Integer 8bit | IP ToS (actually DSCP field, 6 bits). |
nw_proto | Integer 8bit | IP protocol or lower 8 bits of ARP opcode. |
nw_src | IPv4 address | IP source address. |
nw_dst | IPv4 address | IP destination address. |
tp_src | Integer 16bit | TCP/UDP source port. |
tp_dst | Integer 16bit | TCP/UDP destination port. |
nw_src_mask | Integer 8bit | IP source address mask specified as IPv4 address prefix. |
nw_dst_mask | Integer 8bit | IP destination address mask specified as IPv4 address prefix. |
Example:
>>> # compose
>>> match = parser.OFPMatch(
... in_port=1,
... dl_type=0x0800,
... dl_src='aa:bb:cc:dd:ee:ff',
... nw_src='192.168.0.1')
>>> # query
>>> if 'nw_src' in match:
... print match['nw_src']
...
'192.168.0.1'
os_ken.ofproto.ofproto_v1_0_parser.
OFPActionHeader
(type_, len_)¶os_ken.ofproto.ofproto_v1_0_parser.
OFPAction
¶os_ken.ofproto.ofproto_v1_0_parser.
OFPActionOutput
(port, max_len=65509)¶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_0_parser.
OFPActionVlanVid
(vlan_vid)¶Set the 802.1q VLAN id action
This action indicates the 802.1q VLAN id to be set.
Attribute | Description |
---|---|
vlan_vid | VLAN id. |
os_ken.ofproto.ofproto_v1_0_parser.
OFPActionVlanPcp
(vlan_pcp)¶Set the 802.1q priority action
This action indicates the 802.1q priority to be set.
Attribute | Description |
---|---|
vlan_pcp | VLAN priority. |
os_ken.ofproto.ofproto_v1_0_parser.
OFPActionStripVlan
¶Strip the 802.1q header action
This action indicates the 802.1q priority to be striped.
os_ken.ofproto.ofproto_v1_0_parser.
OFPActionDlAddr
(dl_addr)¶os_ken.ofproto.ofproto_v1_0_parser.
OFPActionSetDlSrc
(dl_addr)¶Set the ethernet source address action
This action indicates the ethernet source address to be set.
Attribute | Description |
---|---|
dl_addr | Ethernet address. |
os_ken.ofproto.ofproto_v1_0_parser.
OFPActionSetDlDst
(dl_addr)¶Set the ethernet destination address action
This action indicates the ethernet destination address to be set.
Attribute | Description |
---|---|
dl_addr | Ethernet address. |
os_ken.ofproto.ofproto_v1_0_parser.
OFPActionNwAddr
(nw_addr)¶os_ken.ofproto.ofproto_v1_0_parser.
OFPActionSetNwSrc
(nw_addr)¶Set the IP source address action
This action indicates the IP source address to be set.
Attribute | Description |
---|---|
nw_addr | IP address. |
os_ken.ofproto.ofproto_v1_0_parser.
OFPActionSetNwDst
(nw_addr)¶Set the IP destination address action
This action indicates the IP destination address to be set.
Attribute | Description |
---|---|
nw_addr | IP address. |
os_ken.ofproto.ofproto_v1_0_parser.
OFPActionSetNwTos
(tos)¶Set the IP ToS action
This action indicates the IP ToS (DSCP field, 6 bits) to be set.
Attribute | Description |
---|---|
tos | IP ToS (DSCP field, 6 bits). |
os_ken.ofproto.ofproto_v1_0_parser.
OFPActionTpPort
(tp)¶os_ken.ofproto.ofproto_v1_0_parser.
OFPActionSetTpSrc
(tp)¶Set the TCP/UDP source port action
This action indicates the TCP/UDP source port to be set.
Attribute | Description |
---|---|
tp | TCP/UDP port. |
os_ken.ofproto.ofproto_v1_0_parser.
OFPActionSetTpDst
(tp)¶Set the TCP/UDP destination port action
This action indicates the TCP/UDP destination port to be set.
Attribute | Description |
---|---|
tp | TCP/UDP port. |
os_ken.ofproto.ofproto_v1_0_parser.
OFPActionEnqueue
(port, queue_id)¶Output to queue action
This action indicates send packets to given queue on port.
Attribute | Description |
---|---|
port | Port that queue belongs. |
queue_id | Where to enqueue the packets. |
os_ken.ofproto.ofproto_v1_0_parser.
OFPActionVendor
(vendor=None)¶Vendor action
This action is an extensible action for the vendor.
Except where otherwise noted, this document is licensed under Creative Commons Attribution 3.0 License. See all OpenStack Legal Documents.