os_ken.app.ofctl

os_ken.app.ofctl 提供了一种方便的方式来同步使用 OpenFlow 消息。

如果您的 OS-Ken 应用程序导入 ofctl.api 模块,OfctlService os_ken 应用程序将自动加载。

示例

import os_ken.app.ofctl.api

OfctlService 应用程序内部使用 OpenFlow barrier 消息来确保消息边界。由于 OpenFlow 消息是异步的,并且其中一些消息在成功时没有回复,因此需要 barrier 来进行正确的错误处理。

api 模块

os_ken.app.ofctl.api.get_datapath(app, dpid=None)

通过 dpid 获取 datapath 对象。

参数:
  • app -- 客户端 OSKenApp 实例

  • dpid -- Datapath ID(整型)或 None 以获取所有 datapath 对象

返回 datapath 对象,如果没有提供 dpid 则返回 datapath 对象列表,或者出错时返回 None。

如果给定的值中任何一个无效,则会引发异常。

示例

# ...(snip)...
import os_ken.app.ofctl.api as ofctl_api


class MyApp(app_manager.OSKenApp):

    def _my_handler(self, ev):
        # Get all datapath objects
        result = ofctl_api.get_datapath(self)

        # Get the datapath object which has the given dpid
        result = ofctl_api.get_datapath(self, dpid=1)
os_ken.app.ofctl.api.send_msg(app, msg, reply_cls=None, reply_multi=False)

发送 OpenFlow 消息并等待回复消息。

参数:
  • app -- 客户端 OSKenApp 实例

  • msg -- 要发送的 OpenFlow 控制器到交换机的消息

  • reply_cls -- 预期回复的 OpenFlow 消息类。None 表示不期望任何回复。默认值为 None。

  • reply_multi -- 如果期望多部分回复,则为 True。默认值为 False。

如果没有回复,则返回 None。如果 reply_multi=False,则返回 OpenFlow 交换机到控制器的消息。如果 reply_multi=True,则返回 OpenFlow 交换机到控制器消息的列表。

出错时引发异常。

示例

# ...(snip)...
import os_ken.app.ofctl.api as ofctl_api


class MyApp(app_manager.OSKenApp):

    def _my_handler(self, ev):
        # ...(snip)...
        msg = parser.OFPPortDescStatsRequest(datapath=datapath)
        result = ofctl_api.send_msg(
            self, msg,
            reply_cls=parser.OFPPortDescStatsReply,
            reply_multi=True)

异常

exception os_ken.app.ofctl.exception.InvalidDatapath(result)

Datapath 无效。

当网桥断开连接时,可能会发生这种情况。

exception os_ken.app.ofctl.exception.OFError(result)

收到 OFPErrorMsg。

exception os_ken.app.ofctl.exception.UnexpectedMultiReply(result)

对于 reply_muiti=False 请求,收到两个或多个回复。