NOX控制器添加自定义应用的方法

一、NOX简介

    作为SDN控制器,NOX控制器可以说是遗老级别的了。在早期,NOXSDN的研究起了巨大的推动作用,是SDN研究领域众人皆知的开源项目。但是后来NOX的开发团队舍弃NOX,重新成立了一个POX控制器项目,对此我有些不解,于是邮件过NOX的项目负责人,他们没有回复我原因,只是说推荐使用POXNOX将不再维护。或许,python作为POX的开发语言,简单快捷的一大优点有利于搞科研和实验有极大的方便性。笔者不敢妄断POX是否适合商业控制器,因为笔者对POX不太熟悉,但是总觉得效率仍是个短板。笔者认为最终的商业控制器还是需要像C/C++开发的。最起码,控制器的核心部分需要C/C++开发,核心之上可以搭配其他的开发语言。

    选择使用NOX的朋友,可能你是看上了它的高效性,也可能是你对C++熟悉,也可能就是因为任性选择了它,不管怎样的理由,笔者可以负责任地告诉你,NOX还真不是块儿好啃的骨头。甚至对于NOX的初次使用的人,连NOX苛刻的环境配置诉求都很难满足,别以为NOXwiki给了配置的方法,其实,存在有很多问题,笔者不在这篇博文中具述说配置问题。NOX的代码对于初阅者也不轻松,作为一个小菜,笔者深受折磨,因为当初选它的理由是出于任性,但是笔者打算任性到底了。

二、NOX源码阅读的准备

    NOX对阅读者的专业知识要求很高,这里有两个心理障碍需要扫清一下。首先,由于NOX使用了GNU的软件管理方式(automakeautomake工具)来对代码进行管理,因此你会看到从github下载下来的代码中有“Makefile.am”,很多“*.m4”的文件,“configure.ac.in”还有“configure”文件。总之第一眼就让我们吓一跳。当配置好环境,按照教程编译通过后,我们再打算读代码时,又发现生成的Makefile甚是庞大,实不敢拜读,瞬间无从下手。这里我可以告诉大家,以上那些文件暂且可忽略掉。NOX的所有代码都是在src目录下的,其他文件夹完全可以忽略。

    其次,大量使用了第三方技术,libtoolboosttbbswift。以上是NOX项目中用到的,因此阅读代码、修改代码并不是件轻松的事。再加上NOX提供的文档有限,而且不详细,若有人想修改这个代码来满足自己的需求,还是需要谨慎考虑的。但只要你把这个源码读下去并理解,相信你能向大牛学到不少代码的技能和SDN控制器的编码思想。

      阅读源代码,大家都有一个习惯,就是先将这个代码的使用方法、功能熟悉一下。在NOX的框架上添加控制器APP算是方便的,但由于NOX所在github下的wiki文档说明过于粗线条,所以对于很多NOX控制器的学习者,添加应用面临不小的困扰。我想把自己的添加过程写下来,分享给大家。给那些喜欢NOX的代码的,打算了解、使用它的人一个参考。

三、从添加一个应用入手

      NOX的新APP的编写在wiki中有较为详细的说明,简单明了。编写NOX应用程序的唯一方法就是使用NOX框架为我们提供的API以及遵循NOXAPP编码规范。大多数API需要使用者主动从源码中探索,因为文档并没有很详细的说明,另外也有一些参考例子可供学习。

      首先我们需要知道,NOX控制器把应用看作模块,NOX的架构实现为事件驱动,可动态加载模块的风格。因此,我们自己编写的应用只是一个可以动态加载的模块,这个模块以文件形式存在,相对于核心文件是独立编译的,可以被NOX核心动态加载。

1.   实验需求

github下载NOXhttps://github.com/noxrepo/nox.git)并且编译,能够正常使用,这里不详细介绍,可以参考github中提供的wiki帮助文档。(选择nox库而非nox-classic库的原因,是因为nox库是nox-classic库的核心,阅读较为轻松)


2.   实验过程

NOX的应用程序目录有两个”nox/src/coreapps”和“nox/src/netapps”,在任意一个目录下都可以放置我们的应用程序。在coreapps目录下已经包含了两个应用程序,如下图所示


我们可以通过输入命令来加载相应的应用模块。例如switch模块的加载:


这样,我们的控制器就可以控制网络中的设备,使设备工作在switch模式下。

注意:模块名并不是文件夹的名字,而是文件夹里的meta.json文件中显示的名字,如openflow文件夹对应的应用名是openflow-manger,如下图所示:


接下来我们编写自己的hub应用,我们把应用放在netapps文件夹中。建立一个名为hub的新文件夹,将hub.cc文件放入hub文件夹中。为了方便,我们从switch应用中复制代码到hub.cc并做简单修改。将里面的switch全部改为hub。如下图所示:



接下来将switch中的Makefile.am文件复制到hub文件家中,并对其内容进行修改,如下图所示:


经过以上两步,我们的模块编写与配置完成。

下面进入编译模块的阶段。想要编译新添加的模块,必须修改NOX的配置文件(nox/configure.ac.in文件),将模块加入到编译环境中。如下图,在箭头处添加“hub”字段:


nox目录下,执行命令行./boot命令,此时在hub文件夹中生成新的Makefile.in文件,这个文件是为后面的编译做准备:


进入build目录(编译目录),在build目录下执行命令../configure,然后执行make命令,编译通过, hub模块编译成功。此时进入编译目录中会发现build/src/netapps/hub目录中编译的结果:


接下来,我们试着去运行一下我们编写好的应用模块:


发现会报以上错误,因为我们没有为模块添加meta.json文件,NOX核心加载模块时需要读meta.json文件以了解模块的名字以及模块对其他模块的依赖。此时,我们把switch应用的meta.json拷贝到hub文件夹中,再做以下修改既可以了:


再次执行此模块:


运行成功。到此我们的模块添加的过程就说明完毕了。

关于NOX编译环境的搭建,我会另外写一篇文章来详细介绍的。

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页