openflow1.3版本windows下wireshark插件开发

来源:互联网 发布:c语言clear函数 编辑:程序博客网 时间:2024/05/20 18:44

        Openflow开源项目最近已经发布了1.4版本。作为一个新的协议,wireshark并没有提供对openflow的支持,为了提高调试效率,更好的分析协议报文,一个openflow的wireshark插件是必不可少的。同时作为一个开源项目,openflow除了斯坦福大学在发布之初提供的1.0版本的开源代码,网上的开源代码并不多,尤其是最近使用较多的1.3版本。网上使用率较高的支持到1.3版本的openflow开源代码是巴西一家公司的产品,链接是https://github.com/cpqd,这个主页上提供了openflow1.0到1.3版本的交换机、控制器、测试脚本的代码,同时也提供了一份用C++编写的支持ofp协议的wireshark插件代码。插件代码采用scons进行编译,由于scons实际是python语言支持跨平台,所以这份插件代码可以被编译成linux的.so文件,也可以被编译成windows下的.dll文件。linux下源码推荐安装平台为ubuntu11.10,按照README进行操作,比较顺利。windows下编译方法的说明比较简单,其中还需要进行一些设置与修改,因此本文针对这份开源插件代码,介绍了windows平台下的编译过程,操作系统为windows xp sp3。如有谬误,欢迎大家指正,这也是我的第一篇CSDN博客。

    1.下载插件代码。https://github.com/CPqD/ofdissector

        查看README.md,其中有一句
The Windows build should also pretty much work out of the box, provided you have sufficiently set up your system for building Wireshark itself.

        一开始我没有注意到这句话,错误的以为只能在linux环境下编译,错过了直接生成windows插件的机会,哈哈。

    2.搭建windows下wireshark开发环境,需要vs2008,cygwin,python等工具,并下载wireshark的源码。

   这儿有一篇很好的文章,推荐给大家。http://blog.csdn.net/headmaster110/article/details/7967001

    3.安装scons

   第3步完成后,正式进入插件的编译工作。前文提到,编译采用scons工具,可以更好的支持跨平台编译,因此需要安装scons。http://www.scons.org/右侧download-Production (2.3.0)选择windows进行下载并安装。为了调用方便,将scons加入path环境变量。如下图左所示,加入C:\Python27\与C:\Python27\Scripts(python的安装路径)。

       README中还提到

You can set the `WIRESHARK` environment variable to the directory that your include files live in (e.g. the root of an svn checkout) - this should be such that `<epan/packet.h>` is a valid include.

       需要设置WIRESHARK环境变量,指向步骤3生成的wireshark文件夹,如下右图所示。设置完成需要重启计算机方可生效。


     4.开始编译 

        修改源码路径下 ofdissector-master\src\Sconstruct,将其中include与lib的路径指向步骤3中下载的wireshark的lib文件夹,如下代码所示。cmd进入ofdissector-master\src下,由于之前已经设置了环境变量,因此可以直接执行scons install,结果如下图所示

elif os.name == 'nt':  env.AppendUnique(    CPPPATH = [os.getcwd(),               os.environ['WIRESHARK'],               'C:\wireshark-win32-libs-1.6\gtk2\lib\glib-2.0\include',               'C:\wireshark-win32-libs-1.6\gtk2\include\glib-2.0'],    LIBPATH = ['C:\wireshark-win32-libs-1.6\gtk2\lib',               '%s/epan/' % (os.environ['WIRESHARK'])])

        提示当前VS版本与所需要版本不匹配,这是什么原因,小弟还没有想明白,如果哪位知晓,还请不吝赐教。不过这个问题的解决办法倒也简单,进入wireshark路径下的config.h文件,找到如下几行,把error那行注释掉,当检测到版本不匹配时,跳过error处理即可。

/* Check for the required _MSC_VER */#if MSC_VER_REQUIRED != _MSC_VER#define WS_TO_STRING2(x) #x#define WS_TO_STRING(x) WS_TO_STRING2(x)#pragma message( "_MSC_VER is:" WS_TO_STRING(_MSC_VER) " but required is:" WS_TO_STRING(MSC_VER_REQUIRED) )//#error Your MSVC_VARIANT setting in config.nmake doesn't match the MS compiler version!#endif
        再次编译,又报如下错误。原因已经写的很清楚,因为Microsoft Visual Stdio的CL编译器与GNU下的GCC编译器不同,CL编译器认为变长结构体中的变长元素中如果再含有变长结构是非法的,不过这个错误的处理也非常简单,因为这几个结构体只是在openflow1.3交换机的代码中才有作用,在wireshark插件中根本没有调用,直接注释掉即可。

/* Group setup and teardown (controller -> datapath). */struct ofp_group_mod {struct ofp_header header;uint16_t command;             /* One of OFPGC_*. */uint8_t type;                 /* One of OFPGT_*. */uint8_t pad;                  /* Pad to 64 bits. */uint32_t group_id;            /* Group identifier. *///struct ofp_bucket buckets[0]; /* The length of the bucket array is inferred                                     from the length field in the header. */};


        再次编译,编译已经顺利完成,再报链接错误,如上图所示,呵呵。CL编译器的错误信息没有GCC的信息看上去熟悉啊,但仔细观察下,LNK2001,啊,其实就是openflow120.cpp中的setupFields函数中的变量tfs_yes_no不能识别,对应代码如下。

   // ofp_oxm_field    TREE_FIELD("ofp_oxm", "OXM field");    FIELD("ofp_oxm.oxm_class", "Class", FT_UINT16, BASE_HEX, VALUES(ofp_oxm_class), NO_MASK);    FIELD("ofp_oxm.oxm_field", "Field", FT_UINT8, BASE_HEX, VALUES(oxm_ofb_match_fields), 0xFE);    FIELD("ofp_oxm.oxm_hasmask", "Has mask", FT_BOOLEAN, 1, TFS(&tfs_yes_no), 0x01);    FIELD("ofp_oxm.oxm_length", "Length", FT_UINT16, BASE_DEC, NO_VALUES, NO_MASK);    FIELD("ofp_oxm.value", "Value", FT_BYTES, BASE_NONE, NO_VALUES, NO_MASK);    FIELD("ofp_oxm.value-IPV4", "Value", FT_IPv4, BASE_NONE, NO_VALUES, NO_MASK);    FIELD("ofp_oxm.mask", "Mask", FT_BYTES, BASE_NONE, NO_VALUES, NO_MASK);


tfs_yes_no参考别的相似变量,例如tfs_set_noset 可以得知,其实就是一个字符串的结构体,用两个字符串来描述协议中某一bit位置0和置1时的意义。因此,在openflow120.hpp和openflow130.hpp的命名空间中添加下面一行结构体定义

namespace openflow_120 {    static const guint16 gVersion = 0x03;        // Importing from epan/tfs.h wreaks havoc    const true_false_string tfs_set_notset = {"Set", "Not set"};    const true_false_string tfs_yes_no = {"Yes", "No"};  //add def for tfs_yes_no

         再次执行scons install,呵呵,顺利编译链接通过,生成了openflow.dll。


        至此,openflow的windows下wireshark插件就编译生成了。将openflow.dll放入wireshark路径下的plugin文件夹中,当用wireshark打开openflow报文时,即可进行解析。不过这个巴西公司的源码有点偷工减料,multipart消息基本都没有解哦,大家如果有兴趣,可以自己修改完善一下代码哦。如果感觉C++用的不顺手,也可以直接在斯坦福1.0源码中插件代码的基础上进行修改,升级成支持1.3的插件哦。如果有哪位朋友因为环境安装不便,想直接安装.dll文件, 可以留言给我哦。也可以直接去http://download.csdn.net/detail/pht398/6529111下载,欢迎大家一起交流openflow啊!!

                                                                                                                                                                                                                                          author:pht     email: pht_1987@126.com