ODL学习笔记基础之模块开发篇

编者按:这次主要是关于一篇OpenDaylight module开发的指南,主要是能够收到交换机发来的Packet-in消息,同时能够将收到的packet中的一些消息写入到一个文件中,并向交换机下发流表。

OpenDaylight develop module

一、结构描述

画一下结构图,我们需要的功能应该加在哪里得明确了。从图中看出我们加入的内容应该在SAL层上面,和SwitchManger等一系列Manger在一层上。

opendaylight packet 结构描述

下面确定依赖关系和需要实现的接口。

二、确定依赖关系

我们需要开发的是紫色的那个模块,如下面UML图所示,要实现IListenDataPacket接口,同时我们需要依赖于SAL层的两个服务:FlowProgrammerService和DataPacketService,这两个服务聚合于SAL层;蓝色的是SAL层几个比较重要的接口。

opendaylight packet 确定依赖关系

画出UML类图,模块的基本关系我们也清楚了,下一步就是设计方案了。

由于功能比较简单,就是收到Packet-in消息后进行一系列处理。

下面确定这个module放在哪里,我们都知道在controller/opendaylight/samples内放置了ODL开发者提供的几个例子,我写的也放在这里。

三、pom.xml文件编写

在samples内,建立一个文件:

现在开始写pom.xml文件,这个之前文章里有大神写过pom.xml详细介绍的,我就不班门弄斧了,直接开始写pom.xml。

pom.xml内容如下:

对于<build>内的内容,主要是为了定义输出包和需要依赖的包(输入包);<dependencies>内定义依赖包;至于在<dependencies>内看到switchmanager,是我以后开发工作还需要继续做别的内容,所以就先写上了,目前我们要实现的功能里不会用到。

四、代码编写

写好pom.xml文件,下面开始写代码,

完整PacketHandler.java代码如下:

OpenDaylight 确定实现IListenDataPacket

这部分代码里,我们确定实现IListenDataPacket,SET_MAT是下发流表里的一个action项,dataPacketService、flowProgrammerService、switchManager是后续需要的服务,函数intToInetAddress定义如何将一个int转换为IP地址,后续会用到。

OpenDaylight 截图的函数里,是核心函数

上面截图的函数是核心函数,收到一个RawPacket类型的报文后,可以获取交换机的逻辑描述node,即开发人员只需要知道这个逻辑node,不用了解具体的实现,这也是ODL开发里利用面向对象编程的依赖倒转原则(实现依赖于接口),知道接口怎么用即可。这里调用dataPacketService来解析包,获取二层的MAC包l2pkt。

OpenDaylight 判断是否是Ethernet类型的数据包MAC帧

这部分里首先判断是否是Ethernet类型的数据包(MAC帧),利用Object l3Pkt = l2pkt.getPayload();获取IP层的报文l3pkt,如果是IPv4的报文,就会获取出报文的源IP地址和目的IP地址。然后打开一个文件,将一些数据写入到文件内。

OpenDaylight 对数据包进行修改目的IP和目的MAC

上面的代码里创建Match域,写入匹配值,如源IP和目的IP ,然后设置Actions,对数据包进行修改目的IP和目的MAC(修改目的MAC会导致主机都收不到消息)。然后创建一条流flow,将match和actions加入进去,最后利用flowProgrammerService将流表下发下去,node就是前文讲的交换机逻辑节点。

最后是Activator.java的编写

完整Activator.java代码如下:

这部分主要是配置,将需要的服务设定好,比较简单。

五、编译安装

写完以后,在mytest下运行:

成功构建后会是下面图片,同时target目录里会有生成的jar包:

OpenDaylight 成功构建且target目录生成jar包

下面用命令启动控制器:

然后将数据包安装进去:

安装完会有如下图示:

将数据包安装进去,安装完后显示如下

从上图知道我们安装的bundle的id是344,所以执行如下命令:

然后我们关闭两个也接收数据包的服务,他们也实现了IListenDataPacket。

stop上处命令获取的bundle ID。

六、测试

最后启动mininet,其中192.168.3.101是控制器的IP

查看一下流表:

OpenDaylight 查看一下流表

根据前面代码,说明流表已经下发到交换机上,同时也在一个文件中写入了数据,内容如下显示:

OpenDaylight 在一个文件中也写入了数据

说明文件内也写入了我们要求的数据。
以上功能全部实现!

作者简介:

王钰琪,2013/07-至今 北京邮电大学网络技术研究院 网络与交换技术国家重点实验室攻读硕士研究生

 


  • 本站原创文章仅代表作者观点,不代表SDNLAB立场。所有原创内容版权均属SDNLAB,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用,转载须注明来自 SDNLAB并附上本文链接。 本站中所有编译类文章仅用于学习和交流目的,编译工作遵照 CC 协议,如果有侵犯到您权益的地方,请及时联系我们。
  • 本文链接https://www.sdnlab.com/11456.html
分享到:
相关文章
条评论

登录后才可以评论

wyqbupt 发表于15-05-08
4