长话短说,我有一个项目,它要求我用python从头开始创建一个控制器,并处理通过遵循开放流协议的mininet拓扑创建的交换机的请求。你知道吗
有用的开放流协议资源:
我的代码可在github上获得,用于克隆和完全透明:
我遇到的问题是无法发送端口统计信息描述的多部分请求消息(在这个link上搜索PortDesc
)。我不知道为什么会这样,但是当我在wireshark中查看数据包时,我得到一个“Range is outbounds”错误。我还没弄明白为什么会这样。以下是一些数据包的截图:
错误请求错误消息响应:
这里需要注意的是,代码是OFPBRC_BAD_LEN (6)
,但是在多部分请求中发送的字节长度是16。你知道吗
一位正确发送数据包的同学说,他们使用的打包结构与我相同,只是他们的打包成功了(参见python^{
TL;DR:我无法发送多部分请求,即使我遵守了请求规范,结果仍会返回错误代码。wireshark中的错误表示“范围超出界限”,我不知道如何构造我的请求来更正此错误消息。你知道吗
我解决了我的问题,但我不认为我有什么问题的答案。首先我将从我的解决方案开始,然后谈谈我认为问题所在。你知道吗
解决方案:
正如您在上面的屏幕截图中所看到的,我在1.5版协议中发送OpenFlow数据包,这是最新的版本,但是访问openflow message layer documentation只显示1.4版之前的文档。你知道吗
在此基础上,文档显示的最新版本的multipart request是1.3.1。即使我为openflowprotocolversion1.5发送了一个多部分请求,它也没有显示为OpenFlowProtocol,而是显示为一个常规的TCP包。我做了以下三件事:
在我创建交换机的拓扑文件中,我正在初始化 开关为
s1 = self.addSwitch( 's1')
。我补充了什么 语句是协议参数:s1 = self.addSwitch( 's1', protocols='OpenFlow14')
。为了更好地衡量,我还将
protocols
规范添加到 控制台中的mininet命令:sudo mn custom mytopo.py topo mytopo controller=remote,ipaddr=127.0.0.1,port=6653,protocols=OpenFlow14
我还改变了打包请求的方式 指定版本1.5(在包头中是'06',I 将其打包为1.4(在数据包头中是“05”)。
req = struct.pack('!BBHI',5,5,8,0)
(例如feature_request
消息 发送到交换机)。这些步骤解决了我遇到的问题,并且我能够从交换机获得
stats_reply
。你知道吗问题(或我认为的问题):
我认为问题是,到目前为止,openflowversion1.5还不支持multipart请求,当发送端口描述的multipart请求时,它显示了一个常规的TCP协议,而不是OpenFlow协议。你知道吗
相关问题 更多 >
编程相关推荐