ryu学习笔记(3) 之 ofctl——同步获取openflow消息

我们在使用ryu控制器的时候经常希望可以同步地获取openflow的信息,而ryu/app/ofctl文件夹下的api.py文件就为我们提供了这样一个方便的途径。
当然最方便的获取和更新交换机状态的方法当然是使用REST API接口,我将会在下一篇博客中写到,关于这部分之前也有不少小伙伴写过,可以参考李呈同学的博客http://www.sdnlab.com/11552.html。
1.如何启动
如果你启动的app中已经导入了ryu.app.ofctl.api,那么在app启动的时候已经将ofctl.api模块导入。如果启动的app中没有导入它那么需要在启动的app文件中添加并编写,具体见2中的使用例子。

import ryu.app.ofctl.api

2.api模块
(附源码)
源码中定义了两个方法,其中一个是get_datapath,它有两个参数分别为:app和dpid,其中app为客户机中运行的app实例,dpid是其中一条datapath的id号(为整数)。另一个方法是send_msg,它的参数有四个分别为:app、msg、reply_cls、reply_multi,其中app为客户机中运行的app实例,msg是要发送的openflow controller-to-switch类型的消息,reply_cls是希望返回的openflow的消息类,reply_multi在希望返回多元的消息时为true默认为false,最后的两个参数均为默认。
使用例子:

import ryu.app.ofctl.api as api  #导入ryu.app.ofctl.api并重新命名为api

msg = parser.OFPPortDescStatsRequest(datapath=datapath)
result = api.send_msg(self, msg,
                            reply_cls=parser.OFPPortDescStatsReply,
                            reply_multi=True)

3.异常提示

1)exception ryu.app.ofctl.exception.InvalidDatapath(result)
   Datapath is invalid.
   这个通常可能是由于bridge没有连上造成的
2)exception ryu.app.ofctl.exception.OFError(result)
   OFPErrorMsg is received.
3)exception ryu.app.ofctl.exception.UnexpectedMultiReply(result)
   Two or more replies are received for reply_muiti=False request.

4.源码

import numbers

from ryu.base import app_manager
from . import event


def get_datapath(app, dpid):
    """ Get datapath object by dpid. :param app: Client RyuApp instance :param dpid: Datapath-id (in integer) Returns None on error. """
    assert isinstance(dpid, numbers.Integral)
    return app.send_request(event.GetDatapathRequest(dpid=dpid))()


def send_msg(app, msg, reply_cls=None, reply_multi=False):
    """ Send an OpenFlow message and wait for reply messages. :param app: Client RyuApp instance :param msg: An OpenFlow controller-to-switch message to send :param reply_cls: OpenFlow message class for expected replies. None means no replies are expected. The default is None. :param reply_multi: True if multipart replies are expected. The default is False. If no replies, returns None. If reply_multi=False, returns OpenFlow switch-to-controller message. If reply_multi=True, returns a list of OpenFlow switch-to-controller messages. Raise an exception on error. Example:: import ryu.app.ofctl.api as api msg = parser.OFPPortDescStatsRequest(datapath=datapath) result = api.send_msg(self, msg, reply_cls=parser.OFPPortDescStatsReply, reply_multi=True) """
    return app.send_request(event.SendMsgRequest(msg=msg,
                                                 reply_cls=reply_cls,
                                                 reply_multi=reply_multi))()


app_manager.require_app('ryu.app.ofctl.service', api_style=True)

参考网页:
http://ryu.readthedocs.org/en/latest/app/ofctl.html#ryu.app.ofctl.exception.InvalidDatapath

https://github.com/osrg/ryu/blob/master/ryu/app/ofctl/api.py

你可能感兴趣的:(ryu)