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_NORMAL
OFPC_FRAG_DROP
OFPC_FRAG_REASM

miss_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_NORMAL
OFPC_FRAG_DROP
OFPC_FRAG_REASM

miss_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_EVICTION
OFPTC_VACANCY_EVENTS

properties

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_ADD
OFPFC_MODIFY
OFPFC_MODIFY_STRICT
OFPFC_DELETE
OFPFC_DELETE_STRICT

idle_timeout

丢弃前的空闲时间(秒)

hard_timeout

丢弃前的最大时间(秒)

priority

流条目的优先级

buffer_id

要应用的缓冲数据包(或 OFP_NO_BUFFER)

out_port

对于 OFPFC_DELETE* 命令,要求匹配的条目包含此作为输出端口

out_group

对于 OFPFC_DELETE* 命令,要求匹配的条目包含此作为输出组

flags

以下标志的位图。

OFPFF_SEND_FLOW_REM
OFPFF_CHECK_OVERLAP
OFPFF_RESET_COUNTS
OFPFF_NO_PKT_COUNTS
OFPFF_NO_BYT_COUNTS

importance

驱逐优先级

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_ADD
OFPGC_MODIFY
OFPGC_DELETE
OFPGC_INSERT_BUCKET
OFPGC_REMOVE_BUCKET

type

以下值之一。

OFPGT_ALL
OFPGT_SELECT
OFPGT_INDIRECT
OFPGT_FF

group_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

必须与 OFPSwitchFeaturesOFPPort 的 hw_addr 相同的硬件地址

config

配置标志的位图。

OFPPC_PORT_DOWN
OFPPC_NO_RECV
OFPPC_NO_FWD
OFPPC_NO_PACKET_IN

mask

要更改的上述配置标志的位图

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_ADD
OFPMC_MODIFY
OFPMC_DELETE

flags

以下标志的位图。

OFPMF_KBPS
OFPMF_PKTPS
OFPMF_BURST
OFPMF_STATS

meter_id

计量器实例

bands

以下类实例列表。

OFPMeterBandDrop
OFPMeterBandDscpRemark
OFPMeterBandExperimenter

JSON 示例

{
   "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_MORE

table_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_MORE

table_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_MORE

table_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_MORE

port_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_MORE

port_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_MORE

port_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_MORE

port_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_MORE

group_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_MORE

group_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_MORE

meter_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_MORE

meter_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_MORE

monitor_id

控制器为此监控分配的 ID

out_port

要求匹配的条目将此作为输出端口包含在内

out_group

要求匹配的条目将此作为输出组包含在内

monitor_flags

以下标志的位图。

OFPFMF_INITIAL
OFPFMF_ADD
OFPFMF_REMOVED
OFPFMF_MODIFY
OFPFMF_INSTRUCTIONS
OFPFMF_NO_ABBREV
OFPFMF_ONLY_OWN

table_id

要监控的表的 ID

command

以下值之一。

OFPFMC_ADD
OFPFMC_MODIFY
OFPFMC_DELETE

match

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

以下类实例的列表:

OFPFlowMonitorFull
OFPFlowMonitorAbbrev
OFPFlowMonitorPaused

示例

@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_MORE

feature_request_flags

以下标志的位图。

OFPBF_TIMESTAMP
OFPBF_TIME_SET_SCHED

properties

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_MORE

experimenter

实验者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_NOCHANGE
OFPCR_ROLE_EQUAL
OFPCR_ROLE_MASTER
OFPCR_ROLE_SLAVE

short_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_NOCHANGE
OFPCR_ROLE_EQUAL
OFPCR_ROLE_MASTER
OFPCR_ROLE_SLAVE

short_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_REQUEST
OFPBCT_OPEN_REPLY
OFPBCT_CLOSE_REQUEST
OFPBCT_CLOSE_REPLY
OFPBCT_COMMIT_REQUEST
OFPBCT_COMMIT_REPLY
OFPBCT_DISCARD_REQUEST
OFPBCT_DISCARD_REPLY

flags

以下标志的位图。

OFPBF_ATOMIC
OFPBF_ORDERED

properties

包含 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_ATOMIC
OFPBF_ORDERED

message

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_MISS
OFPR_APPLY_ACTION
OFPR_INVALID_TTL
OFPR_ACTION_SET
OFPR_GROUP
OFPR_PACKET_OUT

table_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_TIMEOUT
OFPRR_HARD_TIMEOUT
OFPRR_DELETE
OFPRR_GROUP_DELETE
OFPRR_METER_DELETE
OFPRR_EVICTION

priority

流条目的优先级

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_ADD
OFPPR_DELETE
OFPPR_MODIFY

desc

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_NOCHANGE
OFPCR_ROLE_EQUAL
OFPCR_ROLE_MASTER

reason

以下值之一。

OFPCRR_MASTER_REQUEST
OFPCRR_CONFIG
OFPCRR_EXPERIMENTER

generation_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_DOWN
OFPTR_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)

转发的请求消息

交换机将请求消息从一个控制器转发到其他控制器。

属性

描述

请求

OFPGroupModOFPMeterMod 实例

示例

@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_DOWN
OFPPC_NO_RECV
OFPPC_NO_FWD
OFPPC_NO_PACKET_IN

state

端口状态标志的位图。

OFPPS_LINK_DOWN
OFPPS_BLOCKED
OFPPS_LIVE

properties

包含 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 规范中定义了特殊值。

  1. 带有和不带有 VLAN 标签的数据包

    • 示例

      match = parser.OFPMatch()
      
    • 数据包匹配

      非 VLAN 标记

      MATCH

      VLAN 标记(vlan_id=3)

      MATCH

      VLAN 标记(vlan_id=5)

      MATCH

  2. 仅不带 VLAN 标签的数据包

    • 示例

      match = parser.OFPMatch(vlan_vid=0x0000)
      
    • 数据包匹配

      非 VLAN 标记

      MATCH

      VLAN 标记(vlan_id=3)

      x

      VLAN 标记(vlan_id=5)

      x

  3. 仅带有 VLAN 标签的数据包,无论其值如何

    • 示例

      match = parser.OFPMatch(vlan_vid=(0x1000, 0x1000))
      
    • 数据包匹配

      非 VLAN 标记

      x

      VLAN 标记(vlan_id=3)

      MATCH

      VLAN 标记(vlan_id=5)

      MATCH

  4. 仅带有 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_ACTIONS
OFPIT_APPLY_ACTIONS
OFPIT_CLEAR_ACTIONS

动作

OpenFlow动作类的列表

type 属性对应于 __init__ 的 type_ 参数。

class os_ken.ofproto.ofproto_v1_5_parser.OFPInstructionStatTrigger(flags, thresholds, type_=None, len_=None)

统计触发器指令

此指令使用 OXS 定义一组统计阈值。

属性

描述

flags

以下标志的位图。

OFPSTF_PERIODIC
OFPSTF_ONLY_FIRST

thresholds

包含 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_NOCHANGE
OFPCR_ROLE_EQUAL
OFPCR_ROLE_MASTER
OFPCR_ROLE_SLAVE

reason

控制器状态原因标志的位图。

OFPCSR_REQUEST
OFPCSR_CHANNEL_STATUS
OFPCSR_ROLE
OFPCSR_CONTROLLER_ADDED
OFPCSR_CONTROLLER_REMOVED
OFPCSR_SHORT_ID
OFPCSR_EXPERIMENTER

channel_status

控制通道状态标志的位图。

OFPCT_STATUS_UP
OFPCT_STATUS_DOWN

properties

OFPControllerStatusProp 子类实例列表