ODL中Yang模型的通知(Notification)简介及报文接收方法

摘要

本文简要介绍了Opendaylight中Yang模型的通知(Notification)实现技术,并基于Notification方式实现了接收从网络中上送到控制器报文,并且此方法在Opendaylight版本(铍-Beryllium, 硼-Boron) 实现并运行正常。

阅读本文之前,请移步Opendaylight开发入门的前两篇,其中的某些细节本文略过。

OpenDayLight(硼Boron版本)实战开发入门: https://www.sdnlab.com/17863.html
怎样通过ODL控制器直接发送任意报文: https://www.sdnlab.com/18092.html

1、引言

SDN网络是一种控制和转发分离的网络,转发行为由控制器控制。流表下发有先应式(ProActive)和反应式(ReActive)两种方式的区别。 先应式的方法预先下发流表项,存在流表项对应的报文经过网络时直接转发,效率高,但是比较占用流表存储空间。反应式(ReActive)是当网络中第一次出现相应的报文时,才下发相应的流表项,对初始报文有延迟,但是不占用过多流表项。两种方式各有优缺点。

在以Opendaylight作为控制器的网络中,实现反应式(ReActive)响应,需要SDN应用接收到报文上报的消息。Opendaylight的编程模型从AD-SAL(API驱动的服务抽象层) 到MD-SAL(模型驱动的服务抽象层)转变的过程中,编程方式发生了变化。
下面进行说明。

1.1、AD-SAL方式的报文接收接口

在较早的Opendaylight版本(例如氢等), 接收报文需要实现服务接口IListenDataPacket, 接口的方法receiveDataPacket()可以实现报文的接收,如下所示:

这种方法在较早版本的Opendaylight中可以使用,而在比较新的版本中则不再采用这种方法。

1.2、MD-SAL方式的通知(Notification)简介

模型驱动(MD-ModelDriving)的方式,其中模型指的是YANG模型,YANG模型定义了通知(Notification)和远过程调用(RPC)的标准格式。关于YANG模型的具体情况请参阅[1, 2]。

Opendaylight中通知(notification)的实现方式简介如下:

通知(notification)是一种发布订阅/模式(Publish/Subscribe)。发布者发布通知,接收者接收通知,从而实现消息的交互功能。

定义了YANG模型后,ODL会自动生成相应的Java代码。以如下的YANG定义为例:

1) 通知类型:发布和订阅的消息,其类型名即为notification名字,在此例子中,通知消息为Say 。

2) 通知接口: 消息的接收者需要实现接收此通知的接口,接口名字由模块名+Listener构成,此例子中的接收消息接口为MypacketListener 。

3) 接收通知的方法:在接收消息的接口中重载接收消息的方法,方法名为notification名字前面加上on构成,此例子中的方法为onSay()。也即接口定义如下:

4) 构造通知消息: 消息的发送者在发送消息之前,需要产生消息,YANG工具自动生成构造消息的Java类,其规则为消息类+Builder构成,在本例子中为SayBuilder.,它的build()方法返回通知消息类Say.

5) 执行发送和接收: 通知消息的发送在ODL中由MD-SAL服务NotificationPublishService实现,获取此服务实例后即可发送相应的通知消息; 消息的接收者通过MD-SAL服务NotificationService注册接收接口后即可获取通知消息。

其编程模型如下图所示:

2、实现报文接收

AD-SAL方式实现的报文接收为实现接口IListenDataPacket, 这里不再举例说明。MD-SAL方式实现报文接收,需要找到相应的YANG定义的通知(Notification)模型。

2.1、报文接收通知接口

我们需要的通知类型在openflowplugin模块中有提供, 其YANG文件目录为: openflowplugin/model/model-flow-service/src/main/yang/packet-processing.yang

部分内容如下:

其中的通知” packet-received”就是满足我们要求的报文接收接口。

2.2、实现方法

根据上述内容,为了接收报文通知消息,实现方式如下:

  • 实现java类PacketHandler.java, 实现接口PacketProcessingListener
  • PacketHandler的Java类中重载(override)接口中的方法onPacketReceived(), 其中加入接收到报文后的处理,为了简单,只用日志方式输出此报文的源MAC, 目的MAC和以太网报文类型
  • 生成PacketHandler类的实例,通过MD-SAL服务NotificationService注册接收接口

2.3 实现步骤

这里以版本Boron-SR1为例介绍。
1) maven生成项目骨架,略。
假设groupID为: com.siwind.bupt, artifactID为: getpacket
2) 子项目impl新建java文件, PacketHandler.java,实现接口PacketProcessingListener. 并在接口方法onPacketReceived中输出报文的源MAC、目的MAC以及以太网报文类型。
3) 在子模块impl的GetpacketProvider.java文件中,实现注册接口的代码,如下:

4) 拷贝项目到ODL生产版本Boron-SR1中。

  • 当前项目目录” karaf/target/assembly/system/com/siwind/”下面为本项目生成的maven形式的jar文件,将之完整拷贝到ODL生产版本的”distribution-karaf-0.5.1-Boron-SR1/system/com”目录下面。
  • 打开生产版本ODL目录下的文件“system/org/opendaylight/integration/features-integration-index/0.5.1-Boron-SR1/features-integration-index-0.5.1-Boron-SR1-features.xml”,在文件末尾标签之前添加一行内容:

mvn:com.siwind.bupt/getpacket-features/0.1.0-SNAPSHOT/xml/features
5) 运行测试结果

运行log:tail命令后,网络中主机不停的ping不存在的IP地址后,控制器上就能收到ARP报文,并通过我们的日志输出。如下图所示:

6) 如果Opendaylight版本为Beryllium,那么GetpacketProvider.java中的相应代码为:

3、结论

本文简要介绍了Opendaylight中通知Notification实现的技术,并使用其中的packet-processing(2013-07-09)模型提供的通知接口packet-received实现了报文接收功能。

示例代码在版本Boron-SR1和Beryllium-SR4上均测试通过。

本文的完整示例代码在这里(基于Boron-SR1): https://github.com/siwind/getpacket

References

[1]. IETF NETCONF Data Modeling Language Working Group, YANG -- YANG modeling Language for NETCONF.
[2]. Internet Engineering Task Force (IETF) and M. Bjorklund, Ed., RFC 6020: YANG - A Data Modeling Language for the Network Configuration Protocol (NETCONF).
作者简介:王寅庆, 目前在北京邮电大学网络技术研究院学习。 曾经供职于行业内某通信技术公司, 做过软件研发, 带领过项目团队。 关注于网络、SDN、大数据和信息安全等方面研究。


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

登录后才可以评论

yinqingwang 发表于16-12-19
1