【问题标题】:Openflow Multipart Request Error Message: OFPBRC_BAD_LEN (6)Openflow 多部分请求错误消息:OFPBRC_BAD_LEN (6)
【发布时间】:2020-02-09 09:25:30
【问题描述】:

长话短说,我有一个项目需要我在 python 中从头开始创建一个控制器,并处理来自通过遵循开放流协议的 mininet 拓扑创建的交换机的请求。

有用的开放流协议资源:

我的代码在 github 上可用于克隆和完全透明:

  • [已于 2019 年 10 月 12 日删除,请参阅下面的答案]

我遇到的问题是我无法为端口统计描述发送多部分请求消息(在此link 上搜索PortDesc)。我不知道为什么会这样,但是当我在 Wireshark 中查看数据包数据时,出现“范围超出范围”错误。我一直无法弄清楚为什么会这样。以下是数据包数据的几张截图:

Wireshark 捕获:

Lua 错误消息:

错误请求错误消息响应: 这里需要注意的是代码是OFPBRC_BAD_LEN (6),但是多部分请求中发送的字节长度是16。

一个正确发送数据包数据的同学说他们使用的打包结构和我一样,只是他们的打包结构是成功的(参见 python struct 文档)。我不知道我的问题可能是什么,而且我已经没有想法可以检查了。任何指针将不胜感激。

TL;DR:我无法发送多部分请求,即使我遵守请求规范,结果仍会返回错误代码。 Wireshark 中的错误显示“范围超出范围”,我不知道如何构建我的请求以更正此错误消息。

【问题讨论】:

    标签: python lua wireshark mininet openflow


    【解决方案1】:

    我解决了我的问题,但我认为我没有关于问题所在的答案。首先我会从我的解决方案开始,然后谈谈我认为的问题所在。

    解决方案:

    正如您在上面的屏幕截图中看到的,我使用 1.5 版协议发送 OpenFlow 数据包,这是最新版本,但访问 openflow message layer documentation 仅显示最高 1.4 的文档。

    最重要的是,文档显示的最新版本的多部分请求是 1.3.1。即使我发送开放流协议 1.5 版的多部分请求,它也没有显示为 OpenFlowProtocol,而是显示为常规 TCP 数据包。我做了以下三件事:

    1. 在我创建交换机的拓扑文件中,我正在初始化 开关为s1 = self.addSwitch( 's1')。我添加到这个 声明是协议参数:s1 = self.addSwitch( 's1', protocols='OpenFlow14')

    2. 为了更好的衡量,我还添加了 protocols 规范到 控制台中的 mininet 命令:sudo mn --custom mytopo.py --topo mytopo --controller=remote,ipaddr=127.0.0.1,port=6653,protocols=OpenFlow14

    3. 我还更改了打包请求的方式,所以不是 指定版本 1.5(在数据包头中是“06”),我 将其打包为 1.4(数据包标头中的“05”)。 req = struct.pack('!BBHI',5,5,8,0)(例如 feature_request 消息 发送到交换机)。

    这些步骤解决了我遇到的问题,我能够从交换机获得stats_reply

    问题(或我认为问题所在):

    我认为问题在于现在,Open Flow 版本 1.5 尚不支持多部分请求,正如在发送端口描述的多部分请求时所证明的那样,它显示的是常规 TCP 协议而不是开放流协议。

    【讨论】:

      猜你喜欢
      • 2017-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多