OpenDaylight(氢版本)数据通信代码解读

最近看了Opendaylight的源码,仔细研读openflow_plugin,SAL,上层服务(Arphandler)。以下分析是基于Opendaylight的Hydrogen版本。不过讲的这些插件应该可以在Helium适用,毕竟各个成熟的bundle不会大幅度变化。

Opendaylight使用OSGi框架,这个框架的巨大好处是可以热插拔各个组件,即不用关闭应用就能为ODL安装各个应用。其结构如下:

ODL控制器有多个小项目,每个小项目是一个bundle(组件),组件之间可以为其他组件提供服务。openflow1.0插件属于其南向各种plugin的一个。

首先Openflow插件的结构如下:

这个插件的位置位于controller/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/,它里面有两个文件夹,core和internal。

core是openflow1.0的核心代码,里面有一些重要java文件讲一下,

■IController.java定义了openflow控制器与交换机交互的抽象接口,无具体实现代码

■Controller.java控制器核心操作

■ControllerIO.java主要是处理交换机的连接请求,一个java的线程,每五秒检测一次

internal是openflow1.0插件上层的服务

■DataPacketMuxDemux.java

下面分析一下几个重要的文件:

ControllerIO.java,这是一个java的线程,每五秒检测一次,是否有新连接请求进来,有则处理。

它会调用Controller.java的handlerNewConnection,这里会给这一个新的交换机生成一个SwitchHandler,它是一个线程,专门和交换机进行通信。SwitchHandler的handleMessages()函数用来处理各类消息;SwitchHandler用MessageReadWriteService.java文件实现与交换机的Socket连接,这也是为什么一个交换机对应一个SwitchHandler。SwitchHandler就在SwitchHandler.java文件内。

在Internal里的核心在Controller.java,他的主要作用:

■处理交换机发来的event,保存一个event队列

■控制器启动一个线程处理Event队列

■每种消息使用一个listener

处理Event的队列线程也在Controller.java实现,Switch_message就是交换机发送来的openflow消息。Event队列的Event定义在SwithEvent.java文件。

Event队列的Event是从哪里来的呢?来自SwitchHandler.java,因为每个Switch有一个SwitchHandler的线程,SwitchHandler收到消息就封装成Event后加入到Controller的Event队列里。请仔细阅读SwitchHandler.java的代码,它里面会区分各个openflow的消息。

Controller对的Event的处理中,假如是消息的Event,也就是MessageEvent,调用receive(ISwitch sw, OFMessage msg),这个函数在DataPacketMuxDemux.java实现。

这里大家一定很奇怪,为什么DataPacketMuxDemux.java能收到消息,我们需要明白,opendaylight定义了很多接口,DataPacketMuxDemux.java里实现了接口IMessageListener,而Opendaylight为每个openflow消息都定义了一种IMessageListener,如果要监听这种消息,我们只需要设置addMessageListener(OFType, this)函数里加上自己要监听的Openflow的消息类型,不信你看看DataPacketMuxDemux是否有这个函数,它因此可以收到Pack_in消息。

这个函数处理中,调用receiveDataPacket,数据就会进入SAL层,SAL层收到openflow_plugin发出的Pack_in消息同样是实现了一个接口IPluginOutDataPacketService,这个接口由SAL层的DataPacketService.java实现,大家看了代码肯定会发现它还实现了另一个接口IDataPacketService,这个接口是接收从SAL上层各个服务发送的数据包。所以SAL层起到了一个处理分发的作用。在SAL层收到下层plugin发送到包后,会送入上层的各个服务

各个服务(如ArpHandler)会通过监听IListenDataPacket接口来收到从SAL层发来的数据。这里有个问题讲明白,上层监听这个端口的可能有很多个服务,那么每个监听此接口的服务都会收到SAL转发的数据包备份。

下面是整个数据传输结构图:

SAL层中处理数据包的是DataPacketService,而处理流表操作FlowProgrammerService。所以SAL的每个Service都可以看成是处理南北数据通路的一种服务。关键需要搞懂的是南北通路中的数据传输过程和机制。上面组件之间传输通过接口实现。

需要主要注意的是Openflow_plugin内的Controller.java,ContrllerIO.java,SwitchHandler.java,MessageReadWriteService.java(这里是和Switch通信的Socket的实现),DataPacketServices.java这几个文件,需要认真阅读。

基本上ODL的代码还算易懂。

作者简介:

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

点击阅读原文

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,084评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,623评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,450评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,322评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,370评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,274评论 1 300
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,126评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,980评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,414评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,599评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,773评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,470评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,080评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,713评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,852评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,865评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,689评论 2 354

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,654评论 18 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,625评论 18 399
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,243评论 11 349
  • 青海湖无疑是绝美的,她的美让我的人生无可避免的就有了遗憾! 去青海玩事先并没有计划,几个朋友说想去,刚...
    夜雪_5e1b阅读 825评论 0 2
  • 昨晚临睡时临在,我静静地感受,我感受我的肩很痛,我的肚子气体不断涌现,最后不断打嗝或者呕吐,随之而来的是呼吸急促,...
    徐恺嵘阅读 275评论 0 0