Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Openflow多部分请求错误消息:OFPBRC\u BAD\u LEN(6)_Python_Lua_Wireshark_Mininet_Openflow - Fatal编程技术网

Python Openflow多部分请求错误消息:OFPBRC\u BAD\u LEN(6)

Python Openflow多部分请求错误消息:OFPBRC\u BAD\u LEN(6),python,lua,wireshark,mininet,openflow,Python,Lua,Wireshark,Mininet,Openflow,长话短说,我有一个项目,需要我用python从头创建一个控制器,并处理通过遵循开放流协议的mininet拓扑创建的交换机的请求 有用的开放流协议资源: 我的代码可在github上获得,用于克隆和完全透明: [自2019年12月10日起删除,请参见下面我的回答] 我遇到的问题是,我无法发送端口统计信息描述的多部分请求消息(在此上搜索PortDesc)。我不知道为什么会出现这种情况,但是当我在wireshark中查看数据包时,我得到一个“范围超出界限”错误。我还没弄明白为什么会这样。以

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

有用的开放流协议资源:

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

  • [自2019年12月10日起删除,请参见下面我的回答]
我遇到的问题是,我无法发送端口统计信息描述的多部分请求消息(在此上搜索
PortDesc
)。我不知道为什么会出现这种情况,但是当我在wireshark中查看数据包时,我得到一个“范围超出界限”错误。我还没弄明白为什么会这样。以下是数据包数据的一些屏幕截图:

Wireshark捕获:

Lua错误消息:

错误请求错误消息响应: 这里需要注意的是,代码中显示了opbrc\u BAD\u LEN(6),但在多部分请求中发送的字节长度为16

一位正确发送数据包的同学说,他们使用的打包结构与我相同,只是他们的打包成功了(参见python文档)。我不知道我的问题出在哪里,我也没有什么好主意去检查了。任何指点都将不胜感激


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

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

解决方案:

正如您在上面的屏幕截图中所看到的,我在1.5版协议中发送OpenFlow数据包,这是最新的版本,但是访问只显示了1.4版之前的文档

在此基础上,文档显示的多部分请求的最新版本是1.3.1。即使当我发送OpenFlowProtocolVersion1.5的多部分请求时,它也没有显示为OpenFlowProtocol,而是显示为常规TCP数据包。我做了以下三件事:

  • 在我创建交换机的拓扑文件中,我正在初始化 开关为
    s1=self.addSwitch('s1')
    。我在这上面加了什么 语句是协议参数:
    s1=self.addSwitch('s1',
    协议='OpenFlow14')

  • 为了更好地衡量,我还将
    协议
    规范添加到 控制台中的mininet命令:
    sudo mn--custom mytopo.py--topo
    mytopo
    --控制器=远程,ipaddr=127.0.0.1,端口=6653,协议=OpenFlow14

  • 我还改变了打包请求的方式,因此 指定版本1.5(在数据包头中为“06”),I 将其打包为1.4(在数据包头中为“05”)<代码>请求= 结构包(“!BBHI',5,5,8,0)(例如
    功能请求
    消息 发送到交换机)

  • 这些步骤解决了我遇到的问题,我能够从交换机获得一个
    stats\u回复

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

    我认为问题在于,到目前为止,OpenFlow版本1.5还不支持多部分请求,当发送端口描述的多部分请求时,它显示的是常规TCP协议,而不是OpenFlow协议