OpenFlow v1.5 消息和结构¶
控制器到交换机消息¶
握手¶
- class os_ken.ofproto.ofproto_v1_5_parser.OFPFeaturesRequest(datapath)¶
功能请求消息
控制器在会话建立后向交换机发送功能请求。
此消息由 OSKen 框架处理,因此 OSKen 应用程序通常不需要处理此消息。
示例
def send_features_request(self, datapath): ofp_parser = datapath.ofproto_parser req = ofp_parser.OFPFeaturesRequest(datapath) datapath.send_msg(req)
JSON 示例
{ "OFPFeaturesRequest": {} }
- class os_ken.ofproto.ofproto_v1_5_parser.OFPSwitchFeatures(datapath, datapath_id=None, n_buffers=None, n_tables=None, auxiliary_id=None, capabilities=None)¶
功能回复消息
交换机响应功能请求,发送功能回复消息。
此消息由 OSKen 框架处理,因此 OSKen 应用程序通常不需要处理此消息。
示例
@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 示例
{ "OFPSwitchFeatures": { "auxiliary_id": 0, "capabilities": 79, "datapath_id": 1, "n_buffers": 255, "n_tables": 255 } }
交换机配置¶
- class os_ken.ofproto.ofproto_v1_5_parser.OFPSetConfig(datapath, flags=0, miss_send_len=0)¶
设置配置请求消息
控制器发送设置配置请求消息以设置配置参数。
属性
描述
flags
以下标志的位图。
OFPC_FRAG_NORMALOFPC_FRAG_DROPOFPC_FRAG_REASMmiss_send_len
数据路径应发送到控制器的最大新流字节数
示例
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 示例
{ "OFPSetConfig": { "flags": 0, "miss_send_len": 128 } }
- class os_ken.ofproto.ofproto_v1_5_parser.OFPGetConfigRequest(datapath)¶
获取配置请求消息
控制器发送获取配置请求以查询交换机中的配置参数。
示例
def send_get_config_request(self, datapath): ofp_parser = datapath.ofproto_parser req = ofp_parser.OFPGetConfigRequest(datapath) datapath.send_msg(req)
JSON 示例
{ "OFPGetConfigRequest": {} }
- class os_ken.ofproto.ofproto_v1_5_parser.OFPGetConfigReply(datapath, flags=None, miss_send_len=None)¶
获取配置回复消息
交换机响应配置请求,发送获取配置回复消息。
属性
描述
flags
以下标志的位图。
OFPC_FRAG_NORMALOFPC_FRAG_DROPOFPC_FRAG_REASMmiss_send_len
数据路径应发送到控制器的最大新流字节数
示例
@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 示例
{ "OFPGetConfigReply": { "flags": 0, "miss_send_len": 128 } }
修改状态消息¶
- class os_ken.ofproto.ofproto_v1_5_parser.OFPTableMod(datapath, table_id, config, properties)¶
流表配置消息
控制器发送此消息以配置表状态。
属性
描述
table_id
表的 ID(OFPTT_ALL 表示所有表)
config
配置标志的位图。
OFPTC_EVICTIONOFPTC_VACANCY_EVENTSproperties
OFPTableModProp子类实例列表示例
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 示例
{ "OFPTableMod": { "config": 4, "properties": [ { "OFPTableModPropEviction": { "flags": 2, "length": 8, "type": 2 } } ], "table_id": 255 } }
- class os_ken.ofproto.ofproto_v1_5_parser.OFPFlowMod(datapath, cookie=0, cookie_mask=0, table_id=0, command=0, idle_timeout=0, hard_timeout=0, priority=32768, buffer_id=4294967295, out_port=0, out_group=0, flags=0, importance=0, match=None, instructions=None)¶
修改流条目消息
控制器发送此消息以修改流表。
属性
描述
cookie
不透明的控制器颁发的标识符
cookie_mask
用于限制在命令为
OPFFC_MODIFY*或OFPFC_DELETE*时必须匹配的 cookie 位的掩码table_id
要将流放入的表的 ID
command
以下值之一。
OFPFC_ADDOFPFC_MODIFYOFPFC_MODIFY_STRICTOFPFC_DELETEOFPFC_DELETE_STRICTidle_timeout
丢弃前的空闲时间(秒)
hard_timeout
丢弃前的最大时间(秒)
priority
流条目的优先级
buffer_id
要应用的缓冲数据包(或 OFP_NO_BUFFER)
out_port
对于
OFPFC_DELETE*命令,要求匹配的条目包含此作为输出端口out_group
对于
OFPFC_DELETE*命令,要求匹配的条目包含此作为输出组flags
以下标志的位图。
OFPFF_SEND_FLOW_REMOFPFF_CHECK_OVERLAPOFPFF_RESET_COUNTSOFPFF_NO_PKT_COUNTSOFPFF_NO_BYT_COUNTSimportance
驱逐优先级
match
OFPMatch的实例instructions
OFPInstruction*实例列表示例
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 示例
{ "OFPFlowMod": { "buffer_id": 0, "command": 0, "cookie": 1311768467463790320, "cookie_mask": 18446744073709551615, "flags": 0, "hard_timeout": 0, "idle_timeout": 0, "importance": 39032, "instructions": [ { "OFPInstructionActions": { "actions": [ { "OFPActionPopVlan": { "len": 8, "type": 18 } }, { "OFPActionSetField": { "field": { "OXMTlv": { "field": "ipv4_dst", "mask": null, "value": "192.168.2.9" } }, "len": 16, "type": 25 } }, { "NXActionLearn": { "cookie": 0, "experimenter": 8992, "fin_hard_timeout": 0, "fin_idle_timeout": 0, "flags": 0, "hard_timeout": 300, "idle_timeout": 0, "len": 96, "priority": 1, "specs": [ { "NXFlowSpecMatch": { "dst": [ "vlan_vid", 0 ], "n_bits": 12, "src": [ "vlan_vid", 0 ] } }, { "NXFlowSpecMatch": { "dst": [ "eth_dst_nxm", 0 ], "n_bits": 48, "src": [ "eth_src_nxm", 0 ] } }, { "NXFlowSpecLoad": { "dst": [ "vlan_vid", 0 ], "n_bits": 12, "src": 0 } }, { "NXFlowSpecLoad": { "dst": [ "tunnel_id_nxm", 0 ], "n_bits": 64, "src": [ "tunnel_id_nxm", 0 ] } }, { "NXFlowSpecOutput": { "dst": "", "n_bits": 32, "src": [ "in_port", 0 ] } } ], "subtype": 16, "table_id": 99, "type": 65535 } } ], "len": 128, "type": 4 } }, { "OFPInstructionGotoTable": { "len": 8, "table_id": 100, "type": 1 } } ], "match": { "OFPMatch": { "length": 70, "oxm_fields": [ { "OXMTlv": { "field": "in_port", "mask": null, "value": 43981 } }, { "OXMTlv": { "field": "eth_dst", "mask": null, "value": "aa:bb:cc:99:88:77" } }, { "OXMTlv": { "field": "eth_type", "mask": null, "value": 2048 } }, { "OXMTlv": { "field": "vlan_vid", "mask": null, "value": 5095 } }, { "OXMTlv": { "field": "ipv4_dst", "mask": null, "value": "192.168.2.1" } }, { "OXMTlv": { "field": "tunnel_id", "mask": null, "value": 50000 } }, { "OXMTlv": { "field": "tun_ipv4_src", "mask": null, "value": "192.168.2.3" } }, { "OXMTlv": { "field": "tun_ipv4_dst", "mask": null, "value": "192.168.2.4" } } ], "type": 1 } }, "out_group": 0, "out_port": 0, "priority": 0, "table_id": 2 } }
{ "OFPFlowMod": { "buffer_id": 0, "command": 0, "cookie": 1311768467463790320, "cookie_mask": 18446744073709551615, "flags": 0, "hard_timeout": 0, "idle_timeout": 0, "importance": 39032, "instructions": [ { "OFPInstructionActions": { "actions": [ { "NXActionConjunction": { "clause": 1, "experimenter": 8992, "id": 11259375, "len": 16, "n_clauses": 2, "subtype": 34, "type": 65535 } } ], "len": 24, "type": 4 } } ], "match": { "OFPMatch": { "length": 70, "oxm_fields": [ { "OXMTlv": { "field": "in_port", "mask": null, "value": 43981 } }, { "OXMTlv": { "field": "eth_dst", "mask": null, "value": "aa:bb:cc:99:88:77" } }, { "OXMTlv": { "field": "eth_type", "mask": null, "value": 2048 } }, { "OXMTlv": { "field": "vlan_vid", "mask": null, "value": 5095 } }, { "OXMTlv": { "field": "ipv4_dst", "mask": null, "value": "192.168.2.1" } }, { "OXMTlv": { "field": "tunnel_id", "mask": null, "value": 50000 } }, { "OXMTlv": { "field": "tun_ipv4_src", "mask": null, "value": "192.168.2.3" } }, { "OXMTlv": { "field": "tun_ipv4_dst", "mask": null, "value": "192.168.2.4" } } ], "type": 1 } }, "out_group": 0, "out_port": 0, "priority": 0, "table_id": 4 } }
{ "OFPFlowMod": { "buffer_id": 0, "command": 0, "cookie": 1311768467463790320, "cookie_mask": 18446744073709551615, "flags": 0, "hard_timeout": 0, "idle_timeout": 0, "importance": 39032, "instructions": [ { "OFPInstructionActions": { "actions": [ { "OFPActionPopVlan": { "len": 8, "type": 18 } }, { "OFPActionSetField": { "field": { "OXMTlv": { "field": "ipv4_dst", "mask": null, "value": "192.168.2.9" } }, "len": 16, "type": 25 } } ], "len": 32, "type": 4 } }, { "OFPInstructionGotoTable": { "len": 8, "table_id": 100, "type": 1 } } ], "match": { "OFPMatch": { "length": 12, "oxm_fields": [ { "OXMTlv": { "field": "conj_id", "mask": null, "value": 11259375 } } ], "type": 1 } }, "out_group": 0, "out_port": 0, "priority": 0, "table_id": 3 } }
- class os_ken.ofproto.ofproto_v1_5_parser.OFPGroupMod(datapath, command=0, type_=0, group_id=0, command_bucket_id=4294967295, buckets=None, properties=None, bucket_array_len=None)¶
修改组条目消息
控制器发送此消息以修改组表。
属性
描述
command
以下值之一。
OFPGC_ADDOFPGC_MODIFYOFPGC_DELETEOFPGC_INSERT_BUCKETOFPGC_REMOVE_BUCKETtype
以下值之一。
OFPGT_ALLOFPGT_SELECTOFPGT_INDIRECTOFPGT_FFgroup_id
组标识符。
command_bucket_id
用于 OFPGC_INSERT_BUCKET 和 OFPGC_REMOVE_BUCKET 命令执行的 Bucket Id。
buckets
OFPBucket实例列表properties
OFPGroupProp实例列表type属性对应于 __init__ 的type_参数。示例
def send_group_mod(self, datapath): ofp = datapath.ofproto ofp_parser = datapath.ofproto_parser port = 1 max_len = 2000 actions = [ofp_parser.OFPActionOutput(port, max_len)] weight = 100 watch_port = 0 watch_group = 0 buckets = [ofp_parser.OFPBucket(weight, watch_port, watch_group, actions)] group_id = 1 command_bucket_id=1 req = ofp_parser.OFPGroupMod(datapath, ofp.OFPGC_ADD, ofp.OFPGT_SELECT, group_id, command_bucket_id, buckets) datapath.send_msg(req)
JSON 示例
{ "OFPGroupMod": { "bucket_array_len": 56, "buckets": [ { "OFPBucket": { "action_array_len": 24, "actions": [ { "OFPActionPopVlan": { "len": 8, "type": 18 } }, { "OFPActionSetField": { "field": { "OXMTlv": { "field": "ipv4_dst", "mask": null, "value": "192.168.2.9" } }, "len": 16, "type": 25 } } ], "bucket_id": 305419896, "len": 56, "properties": [ { "OFPGroupBucketPropWeight": { "length": 8, "type": 0, "weight": 52428 } }, { "OFPGroupBucketPropWatch": { "length": 8, "type": 1, "watch": 56797 } }, { "OFPGroupBucketPropWatch": { "length": 8, "type": 2, "watch": 4008636142 } } ] } } ], "command": 3, "command_bucket_id": 3149642683, "group_id": 2863311530, "properties": [], "type": 1 } }
- class os_ken.ofproto.ofproto_v1_5_parser.OFPPortMod(datapath, port_no=0, hw_addr='00:00:00:00:00:00', config=0, mask=0, properties=None)¶
端口修改消息
控制器发送此消息以修改端口的行为。
属性
描述
port_no
要修改的端口号
hw_addr
必须与
OFPSwitchFeatures的OFPPort的 hw_addr 相同的硬件地址config
配置标志的位图。
OFPPC_PORT_DOWNOFPPC_NO_RECVOFPPC_NO_FWDOFPPC_NO_PACKET_INmask
要更改的上述配置标志的位图
properties
OFPPortModProp子类实例列表示例
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 示例
{ "OFPPortMod": { "config": 0, "hw_addr": "00:11:00:00:11:11", "mask": 0, "port_no": 1, "properties": [ { "OFPPortModPropEthernet": { "advertise": 4096, "length": 8, "type": 0 } }, { "OFPPortModPropOptical": { "configure": 3, "fl_offset": 2000, "freq_lmda": 1500, "grid_span": 3000, "length": 24, "tx_pwr": 300, "type": 1 } }, { "OFPPortModPropExperimenter": { "data": [], "exp_type": 0, "experimenter": 101, "length": 12, "type": 65535 } }, { "OFPPortModPropExperimenter": { "data": [ 1 ], "exp_type": 1, "experimenter": 101, "length": 16, "type": 65535 } }, { "OFPPortModPropExperimenter": { "data": [ 1, 2 ], "exp_type": 2, "experimenter": 101, "length": 20, "type": 65535 } } ] } }
- class os_ken.ofproto.ofproto_v1_5_parser.OFPMeterMod(datapath, command=0, flags=1, meter_id=1, bands=None)¶
计量器修改消息
控制器发送此消息以修改计量器。
属性
描述
command
以下值之一。
OFPMC_ADDOFPMC_MODIFYOFPMC_DELETEflags
以下标志的位图。
OFPMF_KBPSOFPMF_PKTPSOFPMF_BURSTOFPMF_STATSmeter_id
计量器实例
bands
以下类实例列表。
OFPMeterBandDropOFPMeterBandDscpRemarkOFPMeterBandExperimenterJSON 示例
{ "OFPMeterMod": { "bands": [ { "OFPMeterBandDrop": { "burst_size": 10, "len": 16, "rate": 1000, "type": 1 } }, { "OFPMeterBandDscpRemark": { "burst_size": 10, "len": 16, "prec_level": 1, "rate": 1000, "type": 2 } } ], "command": 0, "flags": 14, "meter_id": 100 } }
多部分消息¶
- class os_ken.ofproto.ofproto_v1_5_parser.OFPDescStatsRequest(datapath, flags=0, type_=None)¶
描述统计请求消息
控制器使用此消息查询交换机的描述。
属性
描述
flags
零或
OFPMPF_REQ_MORE示例
def send_desc_stats_request(self, datapath): ofp_parser = datapath.ofproto_parser req = ofp_parser.OFPDescStatsRequest(datapath, 0) datapath.send_msg(req)
JSON 示例
{ "OFPDescStatsRequest": { "flags": 0, "type": 0 } }
- class os_ken.ofproto.ofproto_v1_5_parser.OFPDescStatsReply(datapath, type_=None, **kwargs)¶
描述统计回复消息
交换机响应描述统计请求,发送此消息。
属性
描述
body
OFPDescStats的实例示例
@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 示例
{ "OFPDescStatsReply": { "body": { "OFPDescStats": { "dp_desc": "dp", "hw_desc": "hw", "mfr_desc": "mfr", "serial_num": "serial", "sw_desc": "sw" } }, "flags": 0, "type": 0 } }
- class os_ken.ofproto.ofproto_v1_5_parser.OFPFlowDescStatsRequest(datapath, flags=0, table_id=255, out_port=4294967295, out_group=4294967295, cookie=0, cookie_mask=0, match=None, type_=None)¶
单独流描述请求消息
控制器使用此消息查询单独的流描述。
属性
描述
flags
零或
OFPMPF_REQ_MOREtable_id
要读取的表 ID
out_port
要求匹配的条目将此作为输出端口包含在内
out_group
要求匹配的条目将此作为输出组包含在内
cookie
要求匹配的条目包含此 cookie 值
cookie_mask
用于限制必须匹配的 cookie 位的掩码
match
OFPMatch的实例示例
def send_flow_desc_request(self, datapath): ofp = datapath.ofproto ofp_parser = datapath.ofproto_parser cookie = cookie_mask = 0 match = ofp_parser.OFPMatch(in_port=1) req = ofp_parser.OFPFlowDescStatsRequest(datapath, 0, ofp.OFPTT_ALL, ofp.OFPP_ANY, ofp.OFPG_ANY, cookie, cookie_mask, match) datapath.send_msg(req)
JSON 示例
{ "OFPFlowDescStatsRequest": { "cookie": 1234605616436508552, "cookie_mask": 18446744073709551615, "flags": 0, "match": { "OFPMatch": { "length": 12, "oxm_fields": [ { "OXMTlv": { "field": "in_port", "mask": null, "value": 1 } } ], "type": 1 } }, "out_group": 4294967295, "out_port": 4294967295, "table_id": 1, "type": 1 } }
- class os_ken.ofproto.ofproto_v1_5_parser.OFPFlowDescStatsReply(datapath, type_=None, **kwargs)¶
单独流描述回复消息
交换机响应单独流描述请求时,发送此消息。
属性
描述
body
OFPFlowDesc实例列表示例
@set_ev_cls(ofp_event.EventOFPFlowDescStatsReply, MAIN_DISPATCHER) def flow_desc_reply_handler(self, ev): flows = [] for stat in ev.msg.body: flows.append('table_id=%s priority=%d ' 'idle_timeout=%d hard_timeout=%d flags=0x%04x ' 'importance=%d cookie=%d match=%s ' 'stats=%s instructions=%s' % (stat.table_id, stat.priority, stat.idle_timeout, stat.hard_timeout, stat.flags, stat.importance, stat.cookie, stat.match, stat.stats, stat.instructions)) self.logger.debug('FlowDesc: %s', flows)
JSON 示例
{ "OFPFlowDescStatsReply": { "body": [ { "OFPFlowDesc": { "cookie": 1234605616436508552, "flags": 1, "hard_timeout": 255, "idle_timeout": 255, "importance": 43690, "instructions": [ { "OFPInstructionGotoTable": { "len": 8, "table_id": 2, "type": 1 } } ], "length": 64, "match": { "OFPMatch": { "length": 12, "oxm_fields": [ { "OXMTlv": { "field": "in_port", "mask": null, "value": 1 } } ], "type": 1 } }, "priority": 5, "stats": { "OFPStats": { "length": 12, "oxs_fields": [ { "OXSTlv": { "field": "flow_count", "value": 1 } } ] } }, "table_id": 1 } } ], "flags": 0, "type": 1 } }
- class os_ken.ofproto.ofproto_v1_5_parser.OFPFlowStatsRequest(datapath, flags=0, table_id=255, out_port=4294967295, out_group=4294967295, cookie=0, cookie_mask=0, match=None, type_=None)¶
单个流统计请求消息
控制器使用此消息查询单个流统计信息。
属性
描述
flags
零或
OFPMPF_REQ_MOREtable_id
要读取的表 ID
out_port
要求匹配的条目将此作为输出端口包含在内
out_group
要求匹配的条目将此作为输出组包含在内
cookie
要求匹配的条目包含此 cookie 值
cookie_mask
用于限制必须匹配的 cookie 位的掩码
match
OFPMatch的实例示例
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 示例
{ "OFPFlowStatsRequest": { "cookie": 0, "cookie_mask": 0, "flags": 0, "match": { "OFPMatch": { "length": 4, "oxm_fields": [], "type": 1 } }, "out_group": 4294967295, "out_port": 4294967295, "table_id": 0, "type": 17 } }
- class os_ken.ofproto.ofproto_v1_5_parser.OFPFlowStatsReply(datapath, type_=None, **kwargs)¶
单个流统计回复消息
交换机使用此消息响应单个流统计请求。
属性
描述
body
OFPFlowStats实例列表示例
@set_ev_cls(ofp_event.EventOFPFlowStatsReply, MAIN_DISPATCHER) def flow_stats_reply_handler(self, ev): flows = [] for stat in ev.msg.body: flows.append('table_id=%s reason=%d priority=%d ' 'match=%s stats=%s' % (stat.table_id, stat.reason, stat.priority, stat.match, stat.stats)) self.logger.debug('FlowStats: %s', flows)
JSON 示例
{ "OFPFlowStatsReply": { "body": [ { "OFPFlowStats": { "length": 40, "match": { "OFPMatch": { "length": 12, "oxm_fields": [ { "OXMTlv": { "field": "in_port", "mask": null, "value": 1 } } ], "type": 1 } }, "priority": 1, "reason": 0, "stats": { "OFPStats": { "length": 12, "oxs_fields": [ { "OXSTlv": { "field": "flow_count", "value": 1 } } ] } }, "table_id": 1 } } ], "flags": 0, "type": 17 } }
- class os_ken.ofproto.ofproto_v1_5_parser.OFPAggregateStatsRequest(datapath, flags, table_id, out_port, out_group, cookie, cookie_mask, match, type_=None)¶
聚合流统计请求消息
控制器使用此消息查询聚合流统计信息。
属性
描述
flags
零或
OFPMPF_REQ_MOREtable_id
要读取的表 ID
out_port
要求匹配的条目将此作为输出端口包含在内
out_group
要求匹配的条目将此作为输出组包含在内
cookie
要求匹配的条目包含此 cookie 值
cookie_mask
用于限制必须匹配的 cookie 位的掩码
match
OFPMatch的实例示例
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 示例
{ "OFPAggregateStatsRequest": { "cookie": 0, "cookie_mask": 0, "flags": 0, "match": { "OFPMatch": { "length": 4, "oxm_fields": [], "type": 1 } }, "out_group": 4294967295, "out_port": 4294967295, "table_id": 255, "type": 2 } }
- class os_ken.ofproto.ofproto_v1_5_parser.OFPAggregateStatsReply(datapath, type_=None, **kwargs)¶
聚合流统计回复消息
交换机使用此消息响应聚合流统计请求。
属性
描述
body
OFPAggregateStats实例示例
@set_ev_cls(ofp_event.EventOFPAggregateStatsReply, MAIN_DISPATCHER) def aggregate_stats_reply_handler(self, ev): body = ev.msg.body self.logger.debug('AggregateStats: stats=%s', body.stats)
JSON 示例
{ "OFPAggregateStatsReply": { "body": { "OFPAggregateStats": { "length": 16, "stats": { "OFPStats": { "length": 12, "oxs_fields": [ { "OXSTlv": { "field": "flow_count", "value": 1 } } ] } } } }, "flags": 0, "type": 2 } }
- class os_ken.ofproto.ofproto_v1_5_parser.OFPPortStatsRequest(datapath, flags, port_no, type_=None)¶
端口统计请求消息
控制器使用此消息查询端口统计信息。
属性
描述
flags
零或
OFPMPF_REQ_MOREport_no
要读取的端口号(OFPP_ANY 表示所有端口)
示例
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 示例
{ "OFPPortStatsRequest": { "flags": 0, "port_no": 4294967295, "type": 4 } }
- class os_ken.ofproto.ofproto_v1_5_parser.OFPPortStatsReply(datapath, type_=None, **kwargs)¶
端口统计回复消息
交换机使用此消息响应端口统计请求。
属性
描述
body
OFPPortStats实例列表示例
@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 示例
{ "OFPPortStatsReply": { "body": [ { "OFPPortStats": { "duration_nsec": 0, "duration_sec": 0, "length": 224, "port_no": 7, "properties": [ { "OFPPortStatsPropEthernet": { "collisions": 0, "length": 40, "rx_crc_err": 0, "rx_frame_err": 0, "rx_over_err": 0, "type": 0 } }, { "OFPPortStatsPropOptical": { "bias_current": 300, "flags": 3, "length": 44, "rx_freq_lmda": 1500, "rx_grid_span": 500, "rx_offset": 700, "rx_pwr": 2000, "temperature": 273, "tx_freq_lmda": 1500, "tx_grid_span": 500, "tx_offset": 700, "tx_pwr": 2000, "type": 1 } }, { "OFPPortStatsPropExperimenter": { "data": [], "exp_type": 0, "experimenter": 101, "length": 12, "type": 65535 } }, { "OFPPortStatsPropExperimenter": { "data": [ 1 ], "exp_type": 1, "experimenter": 101, "length": 16, "type": 65535 } }, { "OFPPortStatsPropExperimenter": { "data": [ 1, 2 ], "exp_type": 2, "experimenter": 101, "length": 20, "type": 65535 } } ], "rx_bytes": 0, "rx_dropped": 0, "rx_errors": 0, "rx_packets": 0, "tx_bytes": 336, "tx_dropped": 0, "tx_errors": 0, "tx_packets": 4 } }, { "OFPPortStats": { "duration_nsec": 0, "duration_sec": 0, "length": 120, "port_no": 6, "properties": [ { "OFPPortStatsPropEthernet": { "collisions": 0, "length": 40, "rx_crc_err": 0, "rx_frame_err": 0, "rx_over_err": 0, "type": 0 } } ], "rx_bytes": 336, "rx_dropped": 0, "rx_errors": 0, "rx_packets": 4, "tx_bytes": 336, "tx_dropped": 0, "tx_errors": 0, "tx_packets": 4 } } ], "flags": 0, "type": 4 } }
- class os_ken.ofproto.ofproto_v1_5_parser.OFPPortDescStatsRequest(datapath, flags=0, port_no=4294967295, type_=None)¶
端口描述请求消息
控制器使用此消息查询一个或所有端口的描述。
属性
描述
flags
零或
OFPMPF_REQ_MOREport_no
要读取的端口号(OFPP_ANY 表示所有端口)
示例
def send_port_desc_stats_request(self, datapath): ofp = datapath.ofproto ofp_parser = datapath.ofproto_parser req = ofp_parser.OFPPortDescStatsRequest(datapath, 0, ofp.OFPP_ANY) datapath.send_msg(req)
JSON 示例
{ "OFPPortDescStatsRequest": { "flags": 0, "port_no": 48346, "type": 13 } }
- class os_ken.ofproto.ofproto_v1_5_parser.OFPPortDescStatsReply(datapath, type_=None, **kwargs)¶
端口描述回复消息
交换机使用此消息响应端口描述请求。
属性
描述
body
OFPPort实例列表示例
@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 示例
{ "OFPPortDescStatsReply": { "body": [ { "OFPPort": { "config": 0, "hw_addr": "f2:0b:a4:d0:3f:70", "length": 168, "name": "Port7", "port_no": 7, "properties": [ { "OFPPortDescPropEthernet": { "advertised": 10240, "curr": 10248, "curr_speed": 5000, "length": 32, "max_speed": 5000, "peer": 10248, "supported": 10248, "type": 0 } }, { "OFPPortDescPropOptical": { "length": 40, "rx_grid_freq_lmda": 1500, "rx_max_freq_lmda": 2000, "rx_min_freq_lmda": 1000, "supported": 1, "tx_grid_freq_lmda": 1500, "tx_max_freq_lmda": 2000, "tx_min_freq_lmda": 1000, "tx_pwr_max": 2000, "tx_pwr_min": 1000, "type": 1 } }, { "OFPPortDescPropExperimenter": { "data": [], "exp_type": 0, "experimenter": 101, "length": 12, "type": 65535 } }, { "OFPPortDescPropExperimenter": { "data": [ 1 ], "exp_type": 1, "experimenter": 101, "length": 16, "type": 65535 } }, { "OFPPortDescPropExperimenter": { "data": [ 1, 2 ], "exp_type": 2, "experimenter": 101, "length": 20, "type": 65535 } } ], "state": 4 } }, { "OFPPort": { "config": 0, "hw_addr": "f2:0b:a4:7d:f8:ea", "length": 72, "name": "Port6", "port_no": 6, "properties": [ { "OFPPortDescPropEthernet": { "advertised": 10240, "curr": 10248, "curr_speed": 5000, "length": 32, "max_speed": 5000, "peer": 10248, "supported": 10248, "type": 0 } } ], "state": 4 } } ], "flags": 0, "type": 13 } }
- class os_ken.ofproto.ofproto_v1_5_parser.OFPQueueStatsRequest(datapath, flags=0, port_no=4294967295, queue_id=4294967295, type_=None)¶
队列统计请求消息
控制器使用此消息查询队列统计信息。
属性
描述
flags
零或
OFPMPF_REQ_MOREport_no
要读取的端口号
queue_id
要读取的队列 ID
示例
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 示例
{ "OFPQueueStatsRequest": { "flags": 0, "port_no": 43981, "queue_id": 4294967295, "type": 5 } }
- class os_ken.ofproto.ofproto_v1_5_parser.OFPQueueStatsReply(datapath, type_=None, **kwargs)¶
队列统计回复消息
交换机使用此消息响应聚合流统计请求。
属性
描述
body
OFPQueueStats实例列表示例
@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 示例
{ "OFPQueueStatsReply": { "body": [ { "OFPQueueStats": { "duration_nsec": 0, "duration_sec": 0, "length": 104, "port_no": 7, "properties": [ { "OFPQueueStatsPropExperimenter": { "data": [], "exp_type": 0, "experimenter": 101, "length": 12, "type": 65535 } }, { "OFPQueueStatsPropExperimenter": { "data": [ 1 ], "exp_type": 1, "experimenter": 101, "length": 16, "type": 65535 } }, { "OFPQueueStatsPropExperimenter": { "data": [ 1, 2 ], "exp_type": 2, "experimenter": 101, "length": 20, "type": 65535 } } ], "queue_id": 1, "tx_bytes": 0, "tx_errors": 0, "tx_packets": 0 } }, { "OFPQueueStats": { "duration_nsec": 0, "duration_sec": 0, "length": 48, "port_no": 6, "properties": [], "queue_id": 1, "tx_bytes": 0, "tx_errors": 0, "tx_packets": 0 } }, { "OFPQueueStats": { "duration_nsec": 0, "duration_sec": 0, "length": 48, "port_no": 7, "properties": [], "queue_id": 2, "tx_bytes": 0, "tx_errors": 0, "tx_packets": 0 } } ], "flags": 0, "type": 5 } }
- class os_ken.ofproto.ofproto_v1_5_parser.OFPQueueDescStatsRequest(datapath, flags=0, port_no=4294967295, queue_id=4294967295, type_=None)¶
队列描述请求消息
控制器使用此消息查询所有队列的描述。
属性
描述
flags
零或
OFPMPF_REQ_MOREport_no
要读取的端口号 (OFPP_ANY 表示所有端口)
queue_id
要读取的队列 ID (OFPQ_ALL 表示所有队列)
示例
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 示例
{ "OFPQueueDescStatsRequest": { "flags": 0, "port_no": 52651, "queue_id": 57020, "type": 15 } }
- class os_ken.ofproto.ofproto_v1_5_parser.OFPQueueDescStatsReply(datapath, type_=None, **kwargs)¶
队列描述回复消息
交换机使用此消息响应队列描述请求。
属性
描述
body
OFPQueueDesc实例列表示例
@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 示例
{ "OFPQueueDescStatsReply": { "body": [ { "OFPQueueDesc": { "len": 32, "port_no": 7, "properties": [ { "OFPQueueDescPropExperimenter": { "data": [], "exp_type": 0, "experimenter": 101, "length": 12, "type": 65535 } } ], "queue_id": 0 } }, { "OFPQueueDesc": { "len": 88, "port_no": 8, "properties": [ { "OFPQueueDescPropMinRate": { "length": 8, "rate": 300, "type": 1 } }, { "OFPQueueDescPropMaxRate": { "length": 8, "rate": 900, "type": 2 } }, { "OFPQueueDescPropExperimenter": { "data": [], "exp_type": 0, "experimenter": 101, "length": 12, "type": 65535 } }, { "OFPQueueDescPropExperimenter": { "data": [ 1 ], "exp_type": 1, "experimenter": 101, "length": 16, "type": 65535 } }, { "OFPQueueDescPropExperimenter": { "data": [ 1, 2 ], "exp_type": 2, "experimenter": 101, "length": 20, "type": 65535 } } ], "queue_id": 1 } } ], "flags": 0, "type": 15 } }
- class os_ken.ofproto.ofproto_v1_5_parser.OFPGroupStatsRequest(datapath, flags=0, group_id=4294967292, type_=None)¶
组统计请求消息
控制器使用此消息查询一个或多个组的统计信息。
属性
描述
flags
零或
OFPMPF_REQ_MOREgroup_id
要读取的组ID(使用OFPG_ALL表示所有组)
示例
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 示例
{ "OFPGroupStatsRequest": { "flags": 0, "group_id": 4294967292, "type": 6 } }
- class os_ken.ofproto.ofproto_v1_5_parser.OFPGroupStatsReply(datapath, type_=None, **kwargs)¶
组统计回复消息
交换机使用此消息响应组统计请求。
属性
描述
body
OFPGroupStats实例列表示例
@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 示例
{ "OFPGroupStatsReply": { "body": [ { "OFPGroupStats": { "bucket_stats": [ { "OFPBucketCounter": { "byte_count": 2345, "packet_count": 234 } } ], "byte_count": 12345, "duration_nsec": 609036000, "duration_sec": 9, "group_id": 1, "length": 56, "packet_count": 123, "ref_count": 2 } } ], "flags": 0, "type": 6 } }
- class os_ken.ofproto.ofproto_v1_5_parser.OFPGroupDescStatsRequest(datapath, flags=0, group_id=4294967292, type_=None)¶
组描述请求消息
控制器使用此消息列出交换机上的组集合。
属性
描述
flags
零或
OFPMPF_REQ_MOREgroup_id
要读取的组ID(使用OFPG_ALL表示所有组)
示例
def send_group_desc_stats_request(self, datapath): ofp = datapath.ofproto ofp_parser = datapath.ofproto_parser req = ofp_parser.OFPGroupDescStatsRequest(datapath, 0, ofp.OFPG_ALL) datapath.send_msg(req)
JSON 示例
{ "OFPGroupDescStatsRequest": { "flags": 0, "group_id": 52651, "type": 7 } }
- class os_ken.ofproto.ofproto_v1_5_parser.OFPGroupDescStatsReply(datapath, type_=None, **kwargs)¶
组描述回复消息
交换机使用此消息响应组描述请求。
属性
描述
body
OFPGroupDescStats实例列表示例
@set_ev_cls(ofp_event.EventOFPGroupDescStatsReply, MAIN_DISPATCHER) def group_desc_stats_reply_handler(self, ev): descs = [] for stat in ev.msg.body: descs.append('length=%d type=%d group_id=%d ' 'buckets=%s properties=%s' % (stat.length, stat.type, stat.group_id, stat.bucket, repr(stat.properties))) self.logger.debug('GroupDescStats: %s', descs)
JSON 示例
{ "OFPGroupDescStatsReply": { "body": [ { "OFPGroupDescStats": { "bucket_array_len": 32, "buckets": [ { "OFPBucket": { "action_array_len": 16, "actions": [ { "OFPActionOutput": { "len": 16, "max_len": 65509, "port": 1, "type": 0 } } ], "bucket_id": 65535, "len": 32, "properties": [ { "OFPGroupBucketPropWeight": { "length": 8, "type": 0, "weight": 65535 } } ] } } ], "group_id": 1, "length": 48, "properties": [], "type": 1 } } ], "flags": 0, "type": 7 } }
- class os_ken.ofproto.ofproto_v1_5_parser.OFPGroupFeaturesStatsRequest(datapath, flags=0, type_=None)¶
组功能请求消息
控制器使用此消息查询交换机上组的功能。
属性
描述
flags
零或
OFPMPF_REQ_MORE示例
def send_group_features_stats_request(self, datapath): ofp_parser = datapath.ofproto_parser req = ofp_parser.OFPGroupFeaturesStatsRequest(datapath, 0) datapath.send_msg(req)
JSON 示例
{ "OFPGroupFeaturesStatsRequest": { "flags": 0, "type": 8 } }
- class os_ken.ofproto.ofproto_v1_5_parser.OFPGroupFeaturesStatsReply(datapath, type_=None, **kwargs)¶
组功能回复消息
交换机使用此消息响应组功能请求。
属性
描述
body
OFPGroupFeaturesStats实例示例
@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 示例
{ "OFPGroupFeaturesStatsReply": { "body": { "OFPGroupFeaturesStats": { "actions": [ 67082241, 67082241, 67082241, 67082241 ], "capabilities": 5, "max_groups": [ 16777216, 16777216, 16777216, 16777216 ], "types": 15 } }, "flags": 0, "type": 8 } }
- class os_ken.ofproto.ofproto_v1_5_parser.OFPMeterStatsRequest(datapath, flags=0, meter_id=4294967295, type_=None)¶
计量统计请求消息
控制器使用此消息查询一个或多个计量的统计信息。
属性
描述
flags
零或
OFPMPF_REQ_MOREmeter_id
要读取的计量ID(使用OFPM_ALL表示所有计量)
示例
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 示例
{ "OFPMeterStatsRequest": { "flags": 0, "meter_id": 4294967295, "type": 9 } }
- class os_ken.ofproto.ofproto_v1_5_parser.OFPMeterStatsReply(datapath, type_=None, **kwargs)¶
计量统计回复消息
交换机使用此消息响应计量统计请求。
属性
描述
body
OFPMeterStats实例列表示例
@set_ev_cls(ofp_event.EventOFPMeterStatsReply, MAIN_DISPATCHER) def meter_stats_reply_handler(self, ev): meters = [] for stat in ev.msg.body: meters.append('meter_id=0x%08x len=%d ref_count=%d ' 'packet_in_count=%d byte_in_count=%d ' 'duration_sec=%d duration_nsec=%d ' 'band_stats=%s' % (stat.meter_id, stat.len, stat.ref_count, stat.packet_in_count, stat.byte_in_count, stat.duration_sec, stat.duration_nsec, stat.band_stats)) self.logger.debug('MeterStats: %s', meters)
JSON 示例
{ "OFPMeterStatsReply": { "body": [ { "OFPMeterStats": { "band_stats": [ { "OFPMeterBandStats": { "byte_band_count": 0, "packet_band_count": 0 } } ], "byte_in_count": 0, "duration_nsec": 480000, "duration_sec": 0, "ref_count": 0, "len": 56, "meter_id": 100, "packet_in_count": 0 } } ], "flags": 0, "type": 9 } }
- class os_ken.ofproto.ofproto_v1_5_parser.OFPMeterDescStatsRequest(datapath, flags=0, meter_id=4294967295, type_=None)¶
计量描述统计请求消息
控制器使用此消息查询一个或多个计量的配置。
属性
描述
flags
零或
OFPMPF_REQ_MOREmeter_id
要读取的计量ID(使用OFPM_ALL表示所有计量)
示例
def send_meter_desc_stats_request(self, datapath): ofp = datapath.ofproto ofp_parser = datapath.ofproto_parser req = ofp_parser.OFPMeterDescStatsRequest(datapath, 0, ofp.OFPM_ALL) datapath.send_msg(req)
JSON 示例
{ "OFPMeterDescStatsRequest": { "flags": 0, "meter_id": 4294967295, "type": 10 } }
- class os_ken.ofproto.ofproto_v1_5_parser.OFPMeterDescStatsReply(datapath, type_=None, **kwargs)¶
计量描述统计回复消息
交换机使用此消息响应计量描述统计请求。
属性
描述
body
OFPMeterDescStats实例列表示例
@set_ev_cls(ofp_event.EventOFPMeterDescStatsReply, MAIN_DISPATCHER) def meter_desc_stats_reply_handler(self, ev): configs = [] for stat in ev.msg.body: configs.append('length=%d flags=0x%04x meter_id=0x%08x ' 'bands=%s' % (stat.length, stat.flags, stat.meter_id, stat.bands)) self.logger.debug('MeterDescStats: %s', configs)
JSON 示例
{ "OFPMeterDescStatsReply": { "body": [ { "OFPMeterDescStats": { "bands": [ { "OFPMeterBandDrop": { "burst_size": 10, "len": 16, "rate": 1000, "type": 1 } } ], "flags": 14, "length": 24, "meter_id": 100 } } ], "flags": 0, "type": 10 } }
- class os_ken.ofproto.ofproto_v1_5_parser.OFPMeterFeaturesStatsRequest(datapath, flags=0, type_=None)¶
计量功能统计请求消息
控制器使用此消息查询交换机上计量的功能集。
属性
描述
flags
零或
OFPMPF_REQ_MORE示例
def send_meter_features_stats_request(self, datapath): ofp_parser = datapath.ofproto_parser req = ofp_parser.OFPMeterFeaturesStatsRequest(datapath, 0) datapath.send_msg(req)
JSON 示例
{ "OFPMeterFeaturesStatsRequest": { "flags": 0, "type": 11 } }
- class os_ken.ofproto.ofproto_v1_5_parser.OFPMeterFeaturesStatsReply(datapath, type_=None, **kwargs)¶
计量功能统计回复消息
交换机使用此消息响应计量功能统计请求。
属性
描述
body
OFPMeterFeaturesStats实例示例
@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 示例
{ "OFPMeterFeaturesStatsReply": { "body": [ { "OFPMeterFeaturesStats": { "band_types": 2147483654, "capabilities": 15, "features": 3, "max_bands": 255, "max_color": 0, "max_meter": 16777216 } } ], "flags": 0, "type": 11 } }
- class os_ken.ofproto.ofproto_v1_5_parser.OFPControllerStatusStatsRequest(datapath, flags=0, type_=None)¶
控制器状态多部分请求消息
控制器使用此消息请求交换机上配置的其他控制器的状态、角色和控制通道。
属性
描述
flags
零或
OFPMPF_REQ_MORE示例
def send_controller_status_multipart_request(self, datapath): ofp_parser = datapath.ofproto_parser req = ofp_parser.OFPPortDescStatsRequest(datapath, 0) datapath.send_msg(req)
JSON 示例
{ "OFPControllerStatusStatsRequest": { "flags": 0, "type": 18 } }
- class os_ken.ofproto.ofproto_v1_5_parser.OFPControllerStatusStatsReply(datapath, type_=None, **kwargs)¶
控制器状态多部分回复消息
交换机使用此消息响应控制器状态多部分请求。
属性
描述
body
OFPControllerStatus实例列表示例
@set_ev_cls(ofp_event.EventOFPControllerStatusStatsReply, MAIN_DISPATCHER) def controller_status_multipart_reply_handler(self, ev): status = [] for s in ev.msg.body: status.append('short_id=%d role=%d reason=%d ' 'channel_status=%d properties=%s' % (s.short_id, s.role, s.reason, s.channel_status, repr(s.properties))) self.logger.debug('OFPControllerStatusStatsReply received: %s', status)
JSON 示例
{ "OFPControllerStatusStatsReply": { "body": [ { "OFPControllerStatusStats": { "channel_status": 1, "length": 48, "properties": [ { "OFPControllerStatusPropUri": { "length": 26, "type": 0, "uri": "tls:192.168.34.23:6653" } } ], "reason": 1, "role": 1, "short_id": 65535 } } ], "flags": 0, "type": 18 } }
- class os_ken.ofproto.ofproto_v1_5_parser.OFPTableStatsRequest(datapath, flags, type_=None)¶
表统计请求消息
控制器使用此消息查询流表统计信息。
属性
描述
flags
零或
OFPMPF_REQ_MORE示例
def send_table_stats_request(self, datapath): ofp_parser = datapath.ofproto_parser req = ofp_parser.OFPTableStatsRequest(datapath, 0) datapath.send_msg(req)
JSON 示例
{ "OFPTableStatsRequest": { "flags": 0, "type": 3 } }
- class os_ken.ofproto.ofproto_v1_5_parser.OFPTableStatsReply(datapath, type_=None, **kwargs)¶
表统计回复消息
交换机使用此消息响应表统计请求。
属性
描述
body
OFPTableStats实例列表示例
@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 示例
{ "OFPTableStatsReply": { "body": [ { "OFPTableStats": { "active_count": 4, "lookup_count": 4, "matched_count": 4, "table_id": 0 } }, { "OFPTableStats": { "active_count": 4, "lookup_count": 4, "matched_count": 4, "table_id": 1 } } ], "flags": 0, "type": 3 } }
- class os_ken.ofproto.ofproto_v1_5_parser.OFPTableDescStatsRequest(datapath, flags=0, type_=None)¶
表描述请求消息
控制器使用此消息查询所有表的描述。
属性
描述
flags
零或
OFPMPF_REQ_MORE示例
def send_table_desc_stats_request(self, datapath): ofp_parser = datapath.ofproto_parser req = ofp_parser.OFPTableDescStatsRequest(datapath, 0) datapath.send_msg(req)
JSON 示例
{ "OFPTableDescStatsRequest": { "flags": 0, "type": 14 } }
- class os_ken.ofproto.ofproto_v1_5_parser.OFPTableDescStatsReply(datapath, type_=None, **kwargs)¶
表描述回复消息
交换机使用此消息响应表描述请求。
属性
描述
body
OFPTableDesc实例列表示例
@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 示例
{ "OFPTableDescStatsReply": { "body": [ { "OFPTableDesc": { "config": 0, "length": 24, "properties": [ { "OFPTableModPropExperimenter": { "data": [], "exp_type": 0, "experimenter": 101, "length": 12, "type": 65535 } } ], "table_id": 7 } }, { "OFPTableDesc": { "config": 0, "length": 80, "properties": [ { "OFPTableModPropEviction": { "flags": 0, "length": 8, "type": 2 } }, { "OFPTableModPropVacancy": { "length": 8, "type": 3, "vacancy": 0, "vacancy_down": 0, "vacancy_up": 0 } }, { "OFPTableModPropExperimenter": { "data": [], "exp_type": 0, "experimenter": 101, "length": 12, "type": 65535 } }, { "OFPTableModPropExperimenter": { "data": [ 1 ], "exp_type": 1, "experimenter": 101, "length": 16, "type": 65535 } }, { "OFPTableModPropExperimenter": { "data": [ 1, 2 ], "exp_type": 2, "experimenter": 101, "length": 20, "type": 65535 } } ], "table_id": 8 } } ], "flags": 0, "type": 14 } }
- class os_ken.ofproto.ofproto_v1_5_parser.OFPTableFeaturesStatsRequest(datapath, flags=0, body=None, type_=None)¶
表功能统计请求消息
控制器使用此消息查询表功能。
属性
描述
body
OFPTableFeaturesStats实例列表。默认值为 []。JSON 示例
{ "OFPTableFeaturesStatsRequest": { "body": [ { "OFPTableFeaturesStats": { "capabilities": 4, "command": 1, "features": 1, "length": 80, "max_entries": 255, "metadata_match": 18446744073709551615, "metadata_write": 18446744073709551615, "name": "table1", "properties": [ { "OFPTableFeaturePropOxmValues": { "length": 14, "oxm_values": [ { "OXMTlv": { "field": "eth_src", "mask": null, "value": "aa:bb:cc:dd:ee:ff" } } ], "type": 22 } } ], "table_id": 1 } } ], "flags": 0, "type": 12 } }
- class os_ken.ofproto.ofproto_v1_5_parser.OFPTableFeaturesStatsReply(datapath, type_=None, **kwargs)¶
表功能统计回复消息
交换机使用此消息响应表功能统计请求。
属性
描述
body
OFPTableFeaturesStats实例列表JSON 示例
{ "OFPTableFeaturesStatsReply": { "body": [ { "OFPTableFeaturesStats": { "capabilities": 4, "command": 1, "features": 1, "length": 80, "max_entries": 255, "metadata_match": 18446744073709551615, "metadata_write": 18446744073709551615, "name": "table1", "properties": [ { "OFPTableFeaturePropOxmValues": { "length": 14, "oxm_values": [ { "OXMTlv": { "field": "eth_src", "mask": null, "value": "aa:bb:cc:dd:ee:ff" } } ], "type": 22 } } ], "table_id": 1 } } ], "flags": 0, "type": 12 } }
- class os_ken.ofproto.ofproto_v1_5_parser.OFPFlowMonitorRequest(datapath, flags=0, monitor_id=0, out_port=4294967295, out_group=4294967295, monitor_flags=0, table_id=255, command=0, match=None, type_=None)¶
流监控请求消息
控制器使用此消息查询流监控器。
属性
描述
flags
零或
OFPMPF_REQ_MOREmonitor_id
控制器为此监控分配的 ID
out_port
要求匹配的条目将此作为输出端口包含在内
out_group
要求匹配的条目将此作为输出组包含在内
monitor_flags
以下标志的位图。
OFPFMF_INITIALOFPFMF_ADDOFPFMF_REMOVEDOFPFMF_MODIFYOFPFMF_INSTRUCTIONSOFPFMF_NO_ABBREVOFPFMF_ONLY_OWNtable_id
要监控的表的 ID
command
以下值之一。
OFPFMC_ADDOFPFMC_MODIFYOFPFMC_DELETEmatch
OFPMatch的实例示例
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 示例
{ "OFPFlowMonitorRequest": { "command": 0, "flags": 0, "match": { "OFPMatch": { "length": 14, "oxm_fields": [ { "OXMTlv": { "field": "eth_dst", "mask": null, "value": "f2:0b:a4:7d:f8:ea" } } ], "type": 1 } }, "monitor_flags": 15, "monitor_id": 100000000, "out_group": 4294967295, "out_port": 22, "table_id": 33, "type": 16 } }
- class os_ken.ofproto.ofproto_v1_5_parser.OFPFlowMonitorReply(datapath, type_=None, **kwargs)¶
流监控回复消息
交换机使用此消息响应流监控请求。
属性
描述
body
以下类实例的列表:
OFPFlowMonitorFullOFPFlowMonitorAbbrevOFPFlowMonitorPaused示例
@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 示例
{ "OFPFlowMonitorReply": { "body": [ { "OFPFlowUpdateFull": { "cookie": 0, "event": 0, "hard_timeout": 700, "idle_timeout": 600, "instructions": [ { "OFPInstructionActions": { "actions": [ { "OFPActionOutput": { "len": 16, "max_len": 0, "port": 4294967290, "type": 0 } } ], "len": 24, "type": 4 } } ], "length": 64, "match": { "OFPMatch": { "length": 10, "oxm_fields": [ { "OXMTlv": { "field": "eth_type", "mask": null, "value": 2054 } } ], "type": 1 } }, "priority": 3, "reason": 0, "table_id": 0 } }, { "OFPFlowUpdateAbbrev": { "event": 4, "length": 8, "xid": 1234 } }, { "OFPFlowUpdatePaused": { "event": 5, "length": 8 } } ], "flags": 0, "type": 16 } }
- class os_ken.ofproto.ofproto_v1_5_parser.OFPBundleFeaturesStatsRequest(datapath, flags=0, feature_request_flags=0, properties=None, type_=None)¶
捆绑功能请求消息
控制器使用此消息查询交换机的捆绑功能,包括它是否支持原子捆绑、有序捆绑和计划捆绑。
属性
描述
flags
零或
OFPMPF_REQ_MOREfeature_request_flags
以下标志的位图。
OFPBF_TIMESTAMPOFPBF_TIME_SET_SCHEDproperties
OFPBundleFeaturesProp子类实例列表示例
def send_bundle_features_stats_request(self, datapath): ofp = datapath.ofproto ofp_parser = datapath.ofproto_parser req = ofp_parser.OFPBundleFeaturesStatsRequest(datapath, 0) datapath.send_msg(req)
JSON 示例
{ "OFPBundleFeaturesStatsRequest": { "feature_request_flags": 3, "flags": 0, "properties": [ { "OFPBundleFeaturesPropTime": { "length": 72, "sched_accuracy": { "OFPTime": { "nanoseconds": 1717986918, "seconds": 6148914691236517205 } }, "sched_max_future": { "OFPTime": { "nanoseconds": 2290649224, "seconds": 8608480567731124087 } }, "sched_max_past": { "OFPTime": { "nanoseconds": 2863311530, "seconds": 11068046444225730969 } }, "timestamp": { "OFPTime": { "nanoseconds": 3435973836, "seconds": 13527612320720337851 } }, "type": 1 } } ], "type": 19 } }
- class os_ken.ofproto.ofproto_v1_5_parser.OFPBundleFeaturesStatsReply(datapath, type_=None, **kwargs)¶
捆绑功能回复消息
交换机使用此消息响应捆绑功能请求。
属性
描述
body
OFPBundleFeaturesStats实例示例
@set_ev_cls(ofp_event.EventOFPBundleFeaturesStatsReply, MAIN_DISPATCHER) def bundle_features_stats_reply_handler(self, ev): body = ev.msg.body self.logger.debug('OFPBundleFeaturesStats: capabilities=%0x%08x ' 'properties=%s', body.capabilities, repr(body.properties))
JSON 示例
{ "OFPBundleFeaturesStatsReply": { "body": { "OFPBundleFeaturesStats": { "capabilities": 7, "properties": [ { "OFPBundleFeaturesPropTime": { "length": 72, "sched_accuracy": { "OFPTime": { "nanoseconds": 1717986918, "seconds": 6148914691236517205 } }, "sched_max_future": { "OFPTime": { "nanoseconds": 2290649224, "seconds": 8608480567731124087 } }, "sched_max_past": { "OFPTime": { "nanoseconds": 2863311530, "seconds": 11068046444225730969 } }, "timestamp": { "OFPTime": { "nanoseconds": 3435973836, "seconds": 13527612320720337851 } }, "type": 1 } } ] } }, "flags": 0, "type": 19 } }
- class os_ken.ofproto.ofproto_v1_5_parser.OFPExperimenterStatsRequest(datapath, flags, experimenter, exp_type, data, type_=None)¶
实验者多部分请求消息
属性
描述
flags
零或
OFPMPF_REQ_MOREexperimenter
实验者ID
exp_type
实验者定义
data
实验者定义的附加数据
JSON 示例
{ "OFPExperimenterStatsRequest": { "data": "aG9nZWhvZ2U=", "exp_type": 3405678728, "experimenter": 3735928495, "flags": 0, "type": 65535 } }
- class os_ken.ofproto.ofproto_v1_5_parser.OFPExperimenterStatsReply(datapath, type_=None, **kwargs)¶
实验者多部分回复消息
属性
描述
body
一个
OFPExperimenterMultipart实例JSON 示例
{ "OFPExperimenterStatsReply": { "body": { "OFPExperimenterMultipart": { "data": "dGVzdGRhdGE5OTk5OTk5OQ==", "exp_type": 3405674359, "experimenter": 3735928495 } }, "flags": 0, "type": 65535 } }
报文输出消息¶
- class os_ken.ofproto.ofproto_v1_5_parser.OFPPacketOut(datapath, buffer_id=None, match=None, actions=None, data=None, actions_len=None)¶
报文输出消息
控制器使用此消息通过交换机发送一个报文。
属性
描述
buffer_id
由数据路径分配的ID (如果没有则为 OFP_NO_BUFFER)
match
一个
OFPMatch实例(匹配字段中in_port是必需的)动作
OpenFlow动作类的列表
data
二进制类型值的报文数据或 packet.Packet 的实例。
示例
def send_packet_out(self, datapath, buffer_id, in_port): ofp = datapath.ofproto ofp_parser = datapath.ofproto_parser match = OFPMatch(in_port=in_port) actions = [ofp_parser.OFPActionOutput(ofp.OFPP_FLOOD, 0)] req = ofp_parser.OFPPacketOut(datapath, buffer_id, match, actions) datapath.send_msg(req)
JSON 示例
{ "OFPPacketOut": { "actions": [ { "OFPActionOutput": { "len": 16, "max_len": 65535, "port": 4294967291, "type": 0 } } ], "actions_len": 16, "buffer_id": 4294967295, "data": "dGVzdA==", "match": { "OFPMatch": { "length": 12, "oxm_fields": [ { "OXMTlv": { "field": "in_port", "mask": null, "value": 4294967040 } } ], "type": 1 } } } }
屏障消息¶
- class os_ken.ofproto.ofproto_v1_5_parser.OFPBarrierRequest(datapath)¶
屏障请求消息
控制器发送此消息以确保已满足消息依赖关系或接收已完成操作的通知。
示例
def send_barrier_request(self, datapath): ofp_parser = datapath.ofproto_parser req = ofp_parser.OFPBarrierRequest(datapath) datapath.send_msg(req)
JSON 示例
{ "OFPBarrierRequest": {} }
- class os_ken.ofproto.ofproto_v1_5_parser.OFPBarrierReply(datapath)¶
屏障回复消息
交换机用此消息响应屏障请求。
示例
@set_ev_cls(ofp_event.EventOFPBarrierReply, MAIN_DISPATCHER) def barrier_reply_handler(self, ev): self.logger.debug('OFPBarrierReply received')
JSON 示例
{ "OFPBarrierReply": {} }
角色请求消息¶
- class os_ken.ofproto.ofproto_v1_5_parser.OFPRoleRequest(datapath, role=None, short_id=None, generation_id=None)¶
角色请求消息
控制器使用此消息来更改其角色。
属性
描述
role
以下值之一。
OFPCR_ROLE_NOCHANGEOFPCR_ROLE_EQUALOFPCR_ROLE_MASTEROFPCR_ROLE_SLAVEshort_id
控制器的 ID 号。默认值为 OFPCID_UNDEFINED。
generation_id
主选举生成ID
示例
def send_role_request(self, datapath): ofp = datapath.ofproto ofp_parser = datapath.ofproto_parser req = ofp_parser.OFPRoleRequest(datapath, ofp.OFPCR_ROLE_EQUAL, ofp.OFPCID_UNDEFINED, 0) datapath.send_msg(req)
JSON 示例
{ "OFPRoleRequest": { "generation_id": 1234605616436508552, "role": 1, "short_id": 43690 } }
- class os_ken.ofproto.ofproto_v1_5_parser.OFPRoleReply(datapath, role=None, short_id=None, generation_id=None)¶
角色回复消息
交换机用此消息响应角色请求。
属性
描述
role
以下值之一。
OFPCR_ROLE_NOCHANGEOFPCR_ROLE_EQUALOFPCR_ROLE_MASTEROFPCR_ROLE_SLAVEshort_id
控制器的 ID 号。默认值为 OFPCID_UNDEFINED。
generation_id
主选举生成ID
示例
@set_ev_cls(ofp_event.EventOFPRoleReply, MAIN_DISPATCHER) def role_reply_handler(self, ev): msg = ev.msg dp = msg.datapath ofp = dp.ofproto if msg.role == ofp.OFPCR_ROLE_NOCHANGE: role = 'NOCHANGE' elif msg.role == ofp.OFPCR_ROLE_EQUAL: role = 'EQUAL' elif msg.role == ofp.OFPCR_ROLE_MASTER: role = 'MASTER' elif msg.role == ofp.OFPCR_ROLE_SLAVE: role = 'SLAVE' else: role = 'unknown' self.logger.debug('OFPRoleReply received: ' 'role=%s short_id=%d, generation_id=%d', role, msg.short_id, msg.generation_id)
JSON 示例
{ "OFPRoleReply": { "generation_id": 1234605616436508552, "role": 1, "short_id": 43690 } }
捆绑消息¶
- class os_ken.ofproto.ofproto_v1_5_parser.OFPBundleCtrlMsg(datapath, bundle_id=None, type_=None, flags=None, properties=None)¶
捆绑控制消息
控制器使用此消息来创建、销毁和提交捆绑包
属性
描述
bundle_id
捆绑包的ID
type
以下值之一。
OFPBCT_OPEN_REQUESTOFPBCT_OPEN_REPLYOFPBCT_CLOSE_REQUESTOFPBCT_CLOSE_REPLYOFPBCT_COMMIT_REQUESTOFPBCT_COMMIT_REPLYOFPBCT_DISCARD_REQUESTOFPBCT_DISCARD_REPLYflags
以下标志的位图。
OFPBF_ATOMICOFPBF_ORDEREDproperties
包含
OFPBundleProp子类实例的列表示例
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 示例
{ "OFPBundleCtrlMsg": { "bundle_id": 99999999, "flags": 1, "properties": [], "type": 1 } }
- class os_ken.ofproto.ofproto_v1_5_parser.OFPBundleAddMsg(datapath, bundle_id, flags, message, properties)¶
捆绑包添加消息
控制器使用此消息将消息添加到捆绑包
属性
描述
bundle_id
捆绑包的ID
flags
以下标志的位图。
OFPBF_ATOMICOFPBF_ORDEREDmessage
MsgBase子类实例properties
包含
OFPBundleProp子类实例的列表示例
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 示例
{ "OFPBundleAddMsg": { "bundle_id": 99999999, "flags": 1, "message": { "OFPFlowMod": { "buffer_id": 0, "command": 0, "cookie": 1311768467463790320, "cookie_mask": 18446744073709551615, "flags": 0, "hard_timeout": 0, "idle_timeout": 0, "importance": 39032, "instructions": [ { "OFPInstructionActions": { "actions": [ { "OFPActionPopVlan": { "len": 8, "type": 18 } }, { "OFPActionSetField": { "field": { "OXMTlv": { "field": "ipv4_dst", "mask": null, "value": "192.168.2.9" } }, "len": 16, "type": 25 } }, { "NXActionLearn": { "cookie": 0, "experimenter": 8992, "fin_hard_timeout": 0, "fin_idle_timeout": 0, "flags": 0, "hard_timeout": 300, "idle_timeout": 0, "len": 96, "priority": 1, "specs": [ { "NXFlowSpecMatch": { "dst": [ "vlan_vid", 0 ], "n_bits": 12, "src": [ "vlan_vid", 0 ] } }, { "NXFlowSpecMatch": { "dst": [ "eth_dst_nxm", 0 ], "n_bits": 48, "src": [ "eth_src_nxm", 0 ] } }, { "NXFlowSpecLoad": { "dst": [ "vlan_vid", 0 ], "n_bits": 12, "src": 0 } }, { "NXFlowSpecLoad": { "dst": [ "tunnel_id_nxm", 0 ], "n_bits": 64, "src": [ "tunnel_id_nxm", 0 ] } }, { "NXFlowSpecOutput": { "dst": "", "n_bits": 32, "src": [ "in_port", 0 ] } } ], "subtype": 16, "table_id": 99, "type": 65535 } } ], "len": 128, "type": 4 } }, { "OFPInstructionGotoTable": { "len": 8, "table_id": 100, "type": 1 } } ], "match": { "OFPMatch": { "length": 70, "oxm_fields": [ { "OXMTlv": { "field": "in_port", "mask": null, "value": 43981 } }, { "OXMTlv": { "field": "eth_dst", "mask": null, "value": "aa:bb:cc:99:88:77" } }, { "OXMTlv": { "field": "eth_type", "mask": null, "value": 2048 } }, { "OXMTlv": { "field": "vlan_vid", "mask": null, "value": 5095 } }, { "OXMTlv": { "field": "ipv4_dst", "mask": null, "value": "192.168.2.1" } }, { "OXMTlv": { "field": "tunnel_id", "mask": null, "value": 50000 } }, { "OXMTlv": { "field": "tun_ipv4_src", "mask": null, "value": "192.168.2.3" } }, { "OXMTlv": { "field": "tun_ipv4_dst", "mask": null, "value": "192.168.2.4" } } ], "type": 1 } }, "out_group": 0, "out_port": 0, "priority": 0, "table_id": 2 } }, "properties": [] } }
设置异步配置消息¶
- class os_ken.ofproto.ofproto_v1_5_parser.OFPSetAsync(datapath, properties=None)¶
设置异步配置消息
控制器发送此消息以设置要在给定 OpenFlow 通道上接收的异步消息。
属性
描述
properties
包含
OFPAsyncConfigProp子类实例的列表示例
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 示例
{ "OFPSetAsync": { "properties": [ { "OFPAsyncConfigPropReasons": { "length": 8, "mask": 3, "type": 0 } }, { "OFPAsyncConfigPropReasons": { "length": 8, "mask": 3, "type": 1 } }, { "OFPAsyncConfigPropReasons": { "length": 8, "mask": 3, "type": 2 } }, { "OFPAsyncConfigPropReasons": { "length": 8, "mask": 3, "type": 3 } }, { "OFPAsyncConfigPropReasons": { "length": 8, "mask": 3, "type": 4 } }, { "OFPAsyncConfigPropReasons": { "length": 8, "mask": 3, "type": 5 } }, { "OFPAsyncConfigPropReasons": { "length": 8, "mask": 3, "type": 6 } }, { "OFPAsyncConfigPropReasons": { "length": 8, "mask": 3, "type": 7 } }, { "OFPAsyncConfigPropReasons": { "length": 8, "mask": 24, "type": 8 } }, { "OFPAsyncConfigPropReasons": { "length": 8, "mask": 24, "type": 9 } }, { "OFPAsyncConfigPropReasons": { "length": 8, "mask": 3, "type": 10 } }, { "OFPAsyncConfigPropReasons": { "length": 8, "mask": 3, "type": 11 } }, { "OFPAsyncConfigPropExperimenter": { "data": [], "exp_type": 0, "experimenter": 101, "length": 12, "type": 65534 } }, { "OFPAsyncConfigPropExperimenter": { "data": [ 1 ], "exp_type": 1, "experimenter": 101, "length": 16, "type": 65535 } }, { "OFPAsyncConfigPropExperimenter": { "data": [ 1, 2 ], "exp_type": 2, "experimenter": 101, "length": 20, "type": 65535 } } ] } }
- class os_ken.ofproto.ofproto_v1_5_parser.OFPGetAsyncRequest(datapath)¶
获取异步配置请求消息
控制器使用此消息来查询异步消息。
示例
def send_get_async_request(self, datapath): ofp_parser = datapath.ofproto_parser req = ofp_parser.OFPGetAsyncRequest(datapath) datapath.send_msg(req)
JSON 示例
{ "OFPGetAsyncRequest": {} }
- class os_ken.ofproto.ofproto_v1_5_parser.OFPGetAsyncReply(datapath, properties=None)¶
获取异步配置回复消息
交换机用此消息响应获取异步配置请求。
属性
描述
properties
包含
OFPAsyncConfigProp子类实例的列表示例
@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 示例
{ "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 } } ] } }
异步消息¶
报文输入消息¶
- class os_ken.ofproto.ofproto_v1_5_parser.OFPPacketIn(datapath, buffer_id=None, total_len=None, reason=None, table_id=None, cookie=None, match=None, data=None)¶
报文输入消息
交换机通过此消息将接收到的报文发送给控制器。
属性
描述
buffer_id
由数据路径分配的ID
total_len
帧的完整长度
reason
发送报文的原因。
OFPR_TABLE_MISSOFPR_APPLY_ACTIONOFPR_INVALID_TTLOFPR_ACTION_SETOFPR_GROUPOFPR_PACKET_OUTtable_id
查找表的ID
cookie
查找的流条目的 Cookie
match
OFPMatch的实例data
以太网帧
示例
@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 示例
{ "OFPPacketIn": { "buffer_id": 200, "cookie": 0, "data": "aG9nZQ==", "match": { "OFPMatch": { "length": 40, "oxm_fields": [ { "OXMTlv": { "field": "in_port", "mask": null, "value": 43981 } }, { "OXMTlv": { "field": "tunnel_id", "mask": null, "value": 50000 } }, { "OXMTlv": { "field": "tun_ipv4_src", "mask": null, "value": "192.168.2.3" } }, { "OXMTlv": { "field": "tun_ipv4_dst", "mask": null, "value": "192.168.2.4" } } ], "type": 1 } }, "reason": 0, "table_id": 100, "total_len": 1000 } }
流移除消息¶
- class os_ken.ofproto.ofproto_v1_5_parser.OFPFlowRemoved(datapath, table_id=None, reason=None, priority=None, idle_timeout=None, hard_timeout=None, cookie=None, match=None, stats=None)¶
流移除消息
当流条目超时或被删除时,交换机通过此消息通知控制器。
属性
描述
table_id
表的ID
reason
以下值之一。
OFPRR_IDLE_TIMEOUTOFPRR_HARD_TIMEOUTOFPRR_DELETEOFPRR_GROUP_DELETEOFPRR_METER_DELETEOFPRR_EVICTIONpriority
流条目的优先级
idle_timeout
原始流 mod 中的空闲超时
hard_timeout
原始流 mod 中的硬超时
cookie
不透明的控制器颁发的标识符
match
OFPMatch的实例stats
包含
OFPStats实例示例
@set_ev_cls(ofp_event.EventOFPFlowRemoved, MAIN_DISPATCHER) def flow_removed_handler(self, ev): msg = ev.msg dp = msg.datapath ofp = dp.ofproto if msg.reason == ofp.OFPRR_IDLE_TIMEOUT: reason = 'IDLE TIMEOUT' elif msg.reason == ofp.OFPRR_HARD_TIMEOUT: reason = 'HARD TIMEOUT' elif msg.reason == ofp.OFPRR_DELETE: reason = 'DELETE' elif msg.reason == ofp.OFPRR_GROUP_DELETE: reason = 'GROUP DELETE' elif msg.reason == ofp.OFPRR_METER_DELETE: reason = 'METER DELETE' elif msg.reason == ofp.OFPRR_EVICTION: reason = 'EVICTION' else: reason = 'unknown' self.logger.debug('OFPFlowRemoved received: ' 'table_id=%d reason=%s priority=%d ' 'idle_timeout=%d hard_timeout=%d cookie=%d ' 'match=%s stats=%s', msg.table_id, reason, msg.priority, msg.idle_timeout, msg.hard_timeout, msg.cookie, msg.match, msg.stats)
JSON 示例
{ "OFPFlowRemoved": { "cookie": 1234605616436508552, "hard_timeout": 255, "idle_timeout": 255, "match": { "OFPMatch": { "length": 12, "oxm_fields": [ { "OXMTlv": { "field": "in_port", "mask": null, "value": 1 } } ], "type": 1 } }, "priority": 1, "reason": 0, "stats": { "OFPStats": { "length": 12, "oxs_fields": [ { "OXSTlv": { "field": "flow_count", "value": 1 } } ] } }, "table_id": 1 } }
端口状态消息¶
- class os_ken.ofproto.ofproto_v1_5_parser.OFPPortStatus(datapath, reason=None, desc=None)¶
端口状态消息
交换机通知控制器端口的变化。
属性
描述
reason
以下值之一。
OFPPR_ADDOFPPR_DELETEOFPPR_MODIFYdesc
OFPPort的实例示例
@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 示例
{ "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 } }
控制器角色状态消息¶
- class os_ken.ofproto.ofproto_v1_5_parser.OFPRoleStatus(datapath, role=None, reason=None, generation_id=None, properties=None)¶
角色状态消息
交换机通知控制器角色变更。
属性
描述
role
以下值之一。
OFPCR_ROLE_NOCHANGEOFPCR_ROLE_EQUALOFPCR_ROLE_MASTERreason
以下值之一。
OFPCRR_MASTER_REQUESTOFPCRR_CONFIGOFPCRR_EXPERIMENTERgeneration_id
主选举生成ID
properties
包含
OFPRoleProp子类实例的列表示例
@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 示例
{ "OFPRoleStatus": { "generation_id": 17356517385562371090, "properties": [], "reason": 0, "role": 3 } }
表状态消息¶
- class os_ken.ofproto.ofproto_v1_5_parser.OFPTableStatus(datapath, reason=None, table=None)¶
表状态消息
交换机通知控制器表状态变更。
属性
描述
reason
以下值之一。
OFPTR_VACANCY_DOWNOFPTR_VACANCY_UP表格
OFPTableDesc实例示例
@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 示例
{ "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 } } } }
请求转发消息¶
- class os_ken.ofproto.ofproto_v1_5_parser.OFPRequestForward(datapath, request=None)¶
转发的请求消息
交换机将请求消息从一个控制器转发到其他控制器。
属性
描述
请求
OFPGroupMod或OFPMeterMod实例示例
@set_ev_cls(ofp_event.EventOFPRequestForward, MAIN_DISPATCHER) def request_forward_handler(self, ev): msg = ev.msg dp = msg.datapath ofp = dp.ofproto if msg.request.msg_type == ofp.OFPT_GROUP_MOD: self.logger.debug( 'OFPRequestForward received: request=OFPGroupMod(' 'command=%d, type=%d, group_id=%d, command_bucket_id=%d, ' 'buckets=%s, properties=%s)', msg.request.command, msg.request.type, msg.request.group_id, msg.request.command_bucket_id, msg.request.buckets, repr(msg.request.properties)) elif msg.request.msg_type == ofp.OFPT_METER_MOD: self.logger.debug( 'OFPRequestForward received: request=OFPMeterMod(' 'command=%d, flags=%d, meter_id=%d, bands=%s)', msg.request.command, msg.request.flags, msg.request.meter_id, msg.request.bands) else: self.logger.debug( 'OFPRequestForward received: request=Unknown')
JSON 示例
{ "OFPRequestForward": { "request": { "OFPGroupMod": { "bucket_array_len": 56, "buckets": [ { "OFPBucket": { "action_array_len": 24, "actions": [ { "OFPActionPopVlan": { "len": 8, "type": 18 } }, { "OFPActionSetField": { "field": { "OXMTlv": { "field": "ipv4_dst", "mask": null, "value": "192.168.2.9" } }, "len": 16, "type": 25 } } ], "bucket_id": 305419896, "len": 56, "properties": [ { "OFPGroupBucketPropWeight": { "length": 8, "type": 0, "weight": 52428 } }, { "OFPGroupBucketPropWatch": { "length": 8, "type": 1, "watch": 56797 } }, { "OFPGroupBucketPropWatch": { "length": 8, "type": 2, "watch": 4008636142 } } ] } } ], "command": 3, "command_bucket_id": 3149642683, "group_id": 2863311530, "properties": [], "type": 1 } } } }
控制器状态消息¶
- class os_ken.ofproto.ofproto_v1_5_parser.OFPControllerStatus(datapath, status=None)¶
控制器状态消息
交换机告知控制器其维护的与每个控制器之间的控制通道的状态。
属性
描述
status
OFPControllerStatusStats实例示例
@set_ev_cls(ofp_event.EventOFPControllerStatus, MAIN_DISPATCHER) def table(self, ev): msg = ev.msg dp = msg.datapath ofp = dp.ofproto status = msg.status if status.role == ofp.OFPCR_ROLE_NOCHANGE: role = 'NOCHANGE' elif status.role == ofp.OFPCR_ROLE_EQUAL: role = 'EQUAL' elif status.role == ofp.OFPCR_ROLE_MASTER: role = 'MASTER' elif status.role == ofp.OFPCR_ROLE_SLAVE: role = 'SLAVE' else: role = 'unknown' if status.reason == ofp.OFPCSR_REQUEST: reason = 'REQUEST' elif status.reason == ofp.OFPCSR_CHANNEL_STATUS: reason = 'CHANNEL_STATUS' elif status.reason == ofp.OFPCSR_ROLE: reason = 'ROLE' elif status.reason == ofp.OFPCSR_CONTROLLER_ADDED: reason = 'CONTROLLER_ADDED' elif status.reason == ofp.OFPCSR_CONTROLLER_REMOVED: reason = 'CONTROLLER_REMOVED' elif status.reason == ofp.OFPCSR_SHORT_ID: reason = 'SHORT_ID' elif status.reason == ofp.OFPCSR_EXPERIMENTER: reason = 'EXPERIMENTER' else: reason = 'unknown' if status.channel_status == OFPCT_STATUS_UP: channel_status = 'UP' if status.channel_status == OFPCT_STATUS_DOWN: channel_status = 'DOWN' else: channel_status = 'unknown' self.logger.debug('OFPControllerStatus received: short_id=%d' 'role=%s reason=%s channel_status=%s ' 'properties=%s', status.short_id, role, reason, channel_status, repr(status.properties))
JSON 示例
{ "OFPControllerStatus": { "status": { "OFPControllerStatusStats": { "channel_status": 1, "length": 48, "properties": [ { "OFPControllerStatusPropUri": { "length": 26, "type": 0, "uri": "tls:192.168.34.23:6653" } } ], "reason": 1, "role": 1, "short_id": 65535 } } } }
对称消息¶
Hello¶
- class os_ken.ofproto.ofproto_v1_5_parser.OFPHello(datapath, elements=None)¶
Hello 消息
当连接启动时,Hello 消息在交换机和控制器之间交换。
此消息由 OSKen 框架处理,因此 OSKen 应用程序通常不需要处理此消息。
属性
描述
元素
OFPHelloElemVersionBitmap实例列表JSON 示例
{ "OFPHello": { "elements": [ { "OFPHelloElemVersionBitmap": { "length": 8, "type": 1, "versions": [ 6 ] } } ] } }
- class os_ken.ofproto.ofproto_v1_5_parser.OFPHelloElemVersionBitmap(versions, type_=None, length=None)¶
版本位图 Hello 元素
属性
描述
versions
设备支持的 OpenFlow 协议版本列表
Echo 请求¶
- class os_ken.ofproto.ofproto_v1_5_parser.OFPEchoRequest(datapath, data=None)¶
Echo 请求消息
此消息由 OSKen 框架处理,因此 OSKen 应用程序通常不需要处理此消息。
属性
描述
data
任意长度的数据
示例
def send_echo_request(self, datapath, data): ofp_parser = datapath.ofproto_parser req = ofp_parser.OFPEchoRequest(datapath, data) datapath.send_msg(req) @set_ev_cls(ofp_event.EventOFPEchoRequest, [HANDSHAKE_DISPATCHER, CONFIG_DISPATCHER, MAIN_DISPATCHER]) def echo_request_handler(self, ev): self.logger.debug('OFPEchoRequest received: data=%s', utils.hex_array(ev.msg.data))
JSON 示例
{ "OFPEchoRequest": { "data": "" } }
Echo 响应¶
- class os_ken.ofproto.ofproto_v1_5_parser.OFPEchoReply(datapath, data=None)¶
Echo 响应消息
此消息由 OSKen 框架处理,因此 OSKen 应用程序通常不需要处理此消息。
属性
描述
data
任意长度的数据
示例
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 示例
{ "OFPEchoReply": { "data": "" } }
错误消息¶
- class os_ken.ofproto.ofproto_v1_5_parser.OFPErrorMsg(datapath, type_=None, code=None, data=None, **kwargs)¶
错误消息
交换机通过此消息通知控制器问题。
属性
描述
type
错误的高级类型
code
根据类型而定的详细信息
data
根据类型和代码而定的变长数据
type属性对应于 __init__ 的type_参数。类型和代码在
os_ken.ofproto.ofproto中定义。类型
代码
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
不适用
如果
type == OFPET_EXPERIMENTER,此消息还具有以下属性。属性
描述
exp_type
实验者定义的类型
experimenter
实验者ID
示例
@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 示例
{ "OFPErrorMsg": { "code": 6, "data": "Bg4ACAAAAAA=", "type": 4 } }
实验者¶
- class os_ken.ofproto.ofproto_v1_5_parser.OFPExperimenter(datapath, experimenter=None, exp_type=None, data=None)¶
实验者扩展消息
属性
描述
experimenter
实验者ID
exp_type
实验者定义
data
实验者定义的任意附加数据
JSON 示例
{ "OFPErrorMsg": { "code": null, "data": "amlra2VuIGRhdGE=", "exp_type": 60000, "experimenter": 999999, "type": 65535 } }
端口结构¶
- class os_ken.ofproto.ofproto_v1_5_parser.OFPPort(port_no=None, length=None, hw_addr=None, name=None, config=None, state=None, properties=None)¶
端口的描述
属性
描述
port_no
端口号,它在交换机内唯一标识一个端口。
长度
ofp_port 的长度(不包括填充)。
hw_addr
端口的 MAC 地址。
name
以 null 结尾的字符串,包含接口的可读名称。
config
端口配置标志的位图。
OFPPC_PORT_DOWNOFPPC_NO_RECVOFPPC_NO_FWDOFPPC_NO_PACKET_INstate
端口状态标志的位图。
OFPPS_LINK_DOWNOFPPS_BLOCKEDOFPPS_LIVEproperties
包含
OFPPortDescProp子类实例的列表
流匹配结构¶
- class os_ken.ofproto.ofproto_v1_5_parser.OFPMatch(type_=None, length=None, _ordered_fields=None, **kwargs)¶
流匹配结构
此类是具有 compose/query API 的流匹配结构的实现。
您可以通过关键字参数定义流匹配。以下参数可用:
参数
值
描述
in_port
整数 32 位
交换机输入端口
in_phy_port
整数 32 位
交换机物理输入端口
metadata
整数 64 位
在表之间传递的元数据
eth_dst
MAC 地址
以太网目标地址
eth_src
MAC 地址
以太网源地址
eth_type
整数 16 位
以太网帧类型
vlan_vid
整数 16 位
VLAN ID
vlan_pcp
整数 8 位
VLAN 优先级
ip_dscp
整数 8 位
IP DSCP(ToS 字段中的 6 位)
ip_ecn
整数 8 位
IP ECN(ToS 字段中的 2 位)
ip_proto
整数 8 位
IP 协议
ipv4_src
IPv4 地址
IPv4 源地址
ipv4_dst
IPv4 地址
IPv4 目标地址
tcp_src
整数 16 位
TCP 源端口
tcp_dst
整数 16 位
TCP 目标端口
udp_src
整数 16 位
UDP 源端口
udp_dst
整数 16 位
UDP 目标端口
sctp_src
整数 16 位
SCTP 源端口
sctp_dst
整数 16 位
SCTP 目标端口
icmpv4_type
整数 8 位
ICMP 类型
icmpv4_code
整数 8 位
ICMP 代码
arp_op
整数 16 位
ARP 操作码
arp_spa
IPv4 地址
ARP 源 IPv4 地址
arp_tpa
IPv4 地址
ARP 目标 IPv4 地址
arp_sha
MAC 地址
ARP 源硬件地址
arp_tha
MAC 地址
ARP 目标硬件地址
ipv6_src
IPv6 地址
IPv6 源地址
ipv6_dst
IPv6 地址
IPv6 目标地址
ipv6_flabel
整数 32 位
IPv6 流标签
icmpv6_type
整数 8 位
ICMPv6 类型
icmpv6_code
整数 8 位
ICMPv6 代码
ipv6_nd_target
IPv6 地址
ND 的目标地址
ipv6_nd_sll
MAC 地址
ND 的源链路层
ipv6_nd_tll
MAC 地址
ND 的目标链路层
mpls_label
整数 32 位
MPLS 标签
mpls_tc
整数 8 位
MPLS TC
mpls_bos
整数 8 位
MPLS BoS 位
pbb_isid
整数 24 位
PBB I-SID
tunnel_id
整数 64 位
逻辑端口元数据
ipv6_exthdr
整数 16 位
IPv6 扩展标头伪字段
pbb_uca
整数 8 位
PBB UCA 头部字段
tcp_flags
整数 16 位
TCP 标志
actset_output
整数 32 位
来自 action set metadata 的输出端口
packet_type
整数 32 位
数据包类型值
示例
>>> # 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::')
注意
有关受支持的 Nicira 实验者匹配的列表,请参阅 os_ken.ofproto.nx_match。
注意
对于 VLAN ID 匹配字段,OpenFlow 规范中定义了特殊值。
带有和不带有 VLAN 标签的数据包
示例
match = parser.OFPMatch()
数据包匹配
非 VLAN 标记
MATCH
VLAN 标记(vlan_id=3)
MATCH
VLAN 标记(vlan_id=5)
MATCH
仅不带 VLAN 标签的数据包
示例
match = parser.OFPMatch(vlan_vid=0x0000)
数据包匹配
非 VLAN 标记
MATCH
VLAN 标记(vlan_id=3)
x
VLAN 标记(vlan_id=5)
x
仅带有 VLAN 标签的数据包,无论其值如何
示例
match = parser.OFPMatch(vlan_vid=(0x1000, 0x1000))
数据包匹配
非 VLAN 标记
x
VLAN 标记(vlan_id=3)
MATCH
VLAN 标记(vlan_id=5)
MATCH
仅带有 VLAN 标签且 VID 等于的数据包
示例
match = parser.OFPMatch(vlan_vid=(0x1000 | 3))
数据包匹配
非 VLAN 标记
x
VLAN 标记(vlan_id=3)
MATCH
VLAN 标记(vlan_id=5)
x
流统计结构¶
- class os_ken.ofproto.ofproto_v1_5_parser.OFPStats(length=None, _ordered_fields=None, **kwargs)¶
流统计结构
该类是具有 compose/query API 的流统计结构的实现。
您可以使用关键字参数定义流统计。以下参数可用。
参数
值
描述
duration
整数 32位*2
流条目存活的时间。该字段是一个包含两个 32 位整数的元组。第一个值是 duration_sec,第二个值是 duration_nsec。
idle_time
整数 32位*2
流条目处于空闲状态的时间。
flow_count
整数 32 位
聚合流条目的数量。
packet_count
整数 64 位
与流条目匹配的数据包数量。
byte_count
整数 64 位
与流条目匹配的字节数。
示例
>>> # compose >>> stats = parser.OFPStats( ... packet_count=100, ... duration=(100, 200) >>> # query >>> if 'duration' in stats: ... print stats['duration'] ... (100, 200)
流指令结构¶
- class os_ken.ofproto.ofproto_v1_5_parser.OFPInstructionGotoTable(table_id, type_=None, len_=None)¶
转到表指令
此指令指示处理流水线中的下一个表。
属性
描述
table_id
下一个表
- class os_ken.ofproto.ofproto_v1_5_parser.OFPInstructionWriteMetadata(metadata, metadata_mask, type_=None, len_=None)¶
写入元数据指令
此指令将掩码后的元数据值写入元数据字段。
属性
描述
metadata
要写入的元数据值
metadata_mask
元数据写入位掩码
- class os_ken.ofproto.ofproto_v1_5_parser.OFPInstructionActions(type_, actions=None, len_=None)¶
动作指令
此指令写入/应用/清除动作。
属性
描述
type
以下值之一。
OFPIT_WRITE_ACTIONSOFPIT_APPLY_ACTIONSOFPIT_CLEAR_ACTIONS动作
OpenFlow动作类的列表
type属性对应于 __init__ 的type_参数。
- class os_ken.ofproto.ofproto_v1_5_parser.OFPInstructionStatTrigger(flags, thresholds, type_=None, len_=None)¶
统计触发器指令
此指令使用 OXS 定义一组统计阈值。
属性
描述
flags
以下标志的位图。
OFPSTF_PERIODICOFPSTF_ONLY_FIRSTthresholds
包含
OFPStats实例
动作结构¶
- class os_ken.ofproto.ofproto_v1_5_parser.OFPActionOutput(port, max_len=65509, type_=None, len_=None)¶
输出动作
此动作指示将数据包输出到交换机端口。
属性
描述
port
输出端口
max_len
发送到控制器的最大长度
- class os_ken.ofproto.ofproto_v1_5_parser.OFPActionCopyTtlOut(type_=None, len_=None)¶
复制 TTL Out 动作
此动作将从外层倒数第二个头部复制 TTL 到最外层头部。
- class os_ken.ofproto.ofproto_v1_5_parser.OFPActionCopyTtlIn(type_=None, len_=None)¶
复制 TTL In 动作
此动作将从最外层头部复制 TTL 到外层倒数第二个头部。
- class os_ken.ofproto.ofproto_v1_5_parser.OFPActionSetMplsTtl(mpls_ttl, type_=None, len_=None)¶
设置 MPLS TTL 动作
此动作设置 MPLS TTL。
属性
描述
mpls_ttl
MPLS TTL
- class os_ken.ofproto.ofproto_v1_5_parser.OFPActionDecMplsTtl(type_=None, len_=None)¶
减少 MPLS TTL 动作
此动作减少 MPLS TTL。
- class os_ken.ofproto.ofproto_v1_5_parser.OFPActionPushVlan(ethertype=33024, type_=None, len_=None)¶
推送 VLAN 动作
此动作将新的 VLAN 标签推送到数据包。
属性
描述
ethertype
以太类型。默认值为 802.1Q (0x8100)
- class os_ken.ofproto.ofproto_v1_5_parser.OFPActionPopVlan(type_=None, len_=None)¶
弹出 VLAN 动作
此动作从数据包中弹出最外层的 VLAN 标签。
- class os_ken.ofproto.ofproto_v1_5_parser.OFPActionPushMpls(ethertype=34887, type_=None, len_=None)¶
推送 MPLS 动作
此动作将新的 MPLS 头部推送到数据包。
属性
描述
ethertype
以太类型
- class os_ken.ofproto.ofproto_v1_5_parser.OFPActionPopMpls(ethertype=2048, type_=None, len_=None)¶
弹出 MPLS 动作
此动作从数据包中弹出 MPLS 头部。
- class os_ken.ofproto.ofproto_v1_5_parser.OFPActionSetQueue(queue_id, type_=None, len_=None)¶
设置队列动作
此动作设置将用于将流映射到端口上已配置队列的队列 ID。
属性
描述
queue_id
数据包的队列 ID
- class os_ken.ofproto.ofproto_v1_5_parser.OFPActionGroup(group_id=0, type_=None, len_=None)¶
组动作
此动作指示用于处理数据包的组。
属性
描述
group_id
组标识符
- class os_ken.ofproto.ofproto_v1_5_parser.OFPActionSetNwTtl(nw_ttl, type_=None, len_=None)¶
设置 IP TTL 动作
此动作设置 IP TTL。
属性
描述
nw_ttl
IP TTL
- class os_ken.ofproto.ofproto_v1_5_parser.OFPActionDecNwTtl(type_=None, len_=None)¶
减少 IP TTL 动作
此动作减少 IP TTL。
- class os_ken.ofproto.ofproto_v1_5_parser.OFPActionSetField(field=None, **kwargs)¶
设置字段动作
此动作修改数据包中的头部字段。
此操作可用的关键字集与 OFPMatch 相同,包括带/不带掩码。
示例
set_field = OFPActionSetField(eth_src="00:00:00:00:00:00") set_field = OFPActionSetField(ipv4_src=("192.168.100.0", "255.255.255.0"))
- class os_ken.ofproto.ofproto_v1_5_parser.OFPActionPushPbb(ethertype, type_=None, len_=None)¶
推送 PBB 操作
此操作将新的 PBB 标头推送到数据包。
属性
描述
ethertype
以太类型
- class os_ken.ofproto.ofproto_v1_5_parser.OFPActionPopPbb(type_=None, len_=None)¶
弹出 PBB 操作
此操作从数据包中弹出最外层的 PBB 服务实例标头。
- class os_ken.ofproto.ofproto_v1_5_parser.OFPActionCopyField(n_bits=0, src_offset=0, dst_offset=0, oxm_ids=None, type_=None, len_=None)¶
复制字段动作
此动作在报头和寄存器之间复制值。
属性
描述
n_bits
要复制的位数。
src_offset
源中的起始位偏移量。
dst_offset
目标中的起始位偏移量。
oxm_ids
OFPOxmId实例列表。此列表的第一个元素 src_oxm_id 标识复制值的字段。此列表的第二个元素 dst_oxm_id 标识复制值的目标字段。默认值为 []。
- class os_ken.ofproto.ofproto_v1_5_parser.OFPActionMeter(meter_id, type_=None, len_=None)¶
计量动作
此动作应用计量器(速率限制器)
属性
描述
meter_id
计量器实例
- class os_ken.ofproto.ofproto_v1_5_parser.OFPActionExperimenter(experimenter)¶
实验者动作
此动作是实验者的可扩展动作。
属性
描述
experimenter
实验者ID
注意
有关受支持的 Nicira 实验者动作列表,请参阅 os_ken.ofproto.nx_actions。
控制器状态结构¶
- class os_ken.ofproto.ofproto_v1_5_parser.OFPControllerStatusStats(short_id=None, role=None, reason=None, channel_status=None, properties=None, length=None)¶
控制器状态结构
属性
描述
长度
此条目的长度。
short_id
标识控制器的 ID 编号。
role
控制器角色标志的位图。
OFPCR_ROLE_NOCHANGEOFPCR_ROLE_EQUALOFPCR_ROLE_MASTEROFPCR_ROLE_SLAVEreason
控制器状态原因标志的位图。
OFPCSR_REQUESTOFPCSR_CHANNEL_STATUSOFPCSR_ROLEOFPCSR_CONTROLLER_ADDEDOFPCSR_CONTROLLER_REMOVEDOFPCSR_SHORT_IDOFPCSR_EXPERIMENTERchannel_status
控制通道状态标志的位图。
OFPCT_STATUS_UPOFPCT_STATUS_DOWNproperties
OFPControllerStatusProp子类实例列表