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 请求,收到两个或多个回复。