OpenDaylight(氫版本)數(shù)據(jù)通信代碼解讀

最近看了Opendaylight的源碼,仔細(xì)研讀openflow_plugin,SAL,上層服務(wù)(Arphandler)。以下分析是基于Opendaylight的Hydrogen版本。不過(guò)講的這些插件應(yīng)該可以在Helium適用,畢竟各個(gè)成熟的bundle不會(huì)大幅度變化。

Opendaylight使用OSGi框架,這個(gè)框架的巨大好處是可以熱插拔各個(gè)組件,即不用關(guān)閉應(yīng)用就能為ODL安裝各個(gè)應(yīng)用。其結(jié)構(gòu)如下:

ODL控制器有多個(gè)小項(xiàng)目,每個(gè)小項(xiàng)目是一個(gè)bundle(組件),組件之間可以為其他組件提供服務(wù)。openflow1.0插件屬于其南向各種plugin的一個(gè)。

首先Openflow插件的結(jié)構(gòu)如下:

這個(gè)插件的位置位于controller/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/,它里面有兩個(gè)文件夾,core和internal。

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

■IController.java定義了openflow控制器與交換機(jī)交互的抽象接口,無(wú)具體實(shí)現(xiàn)代碼

■Controller.java控制器核心操作

■ControllerIO.java主要是處理交換機(jī)的連接請(qǐng)求,一個(gè)java的線(xiàn)程,每五秒檢測(cè)一次

internal是openflow1.0插件上層的服務(wù)

■DataPacketMuxDemux.java

下面分析一下幾個(gè)重要的文件:

ControllerIO.java,這是一個(gè)java的線(xiàn)程,每五秒檢測(cè)一次,是否有新連接請(qǐng)求進(jìn)來(lái),有則處理。

它會(huì)調(diào)用Controller.java的handlerNewConnection,這里會(huì)給這一個(gè)新的交換機(jī)生成一個(gè)SwitchHandler,它是一個(gè)線(xiàn)程,專(zhuān)門(mén)和交換機(jī)進(jìn)行通信。SwitchHandler的handleMessages()函數(shù)用來(lái)處理各類(lèi)消息;SwitchHandler用MessageReadWriteService.java文件實(shí)現(xiàn)與交換機(jī)的Socket連接,這也是為什么一個(gè)交換機(jī)對(duì)應(yīng)一個(gè)SwitchHandler。SwitchHandler就在SwitchHandler.java文件內(nèi)。

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

■處理交換機(jī)發(fā)來(lái)的event,保存一個(gè)event隊(duì)列

■控制器啟動(dòng)一個(gè)線(xiàn)程處理Event隊(duì)列

■每種消息使用一個(gè)listener

處理Event的隊(duì)列線(xiàn)程也在Controller.java實(shí)現(xiàn),Switch_message就是交換機(jī)發(fā)送來(lái)的openflow消息。Event隊(duì)列的Event定義在SwithEvent.java文件。

Event隊(duì)列的Event是從哪里來(lái)的呢?來(lái)自SwitchHandler.java,因?yàn)槊總€(gè)Switch有一個(gè)SwitchHandler的線(xiàn)程,SwitchHandler收到消息就封裝成Event后加入到Controller的Event隊(duì)列里。請(qǐng)仔細(xì)閱讀SwitchHandler.java的代碼,它里面會(huì)區(qū)分各個(gè)openflow的消息。

Controller對(duì)的Event的處理中,假如是消息的Event,也就是MessageEvent,調(diào)用receive(ISwitch sw, OFMessage msg),這個(gè)函數(shù)在DataPacketMuxDemux.java實(shí)現(xiàn)。

這里大家一定很奇怪,為什么DataPacketMuxDemux.java能收到消息,我們需要明白,opendaylight定義了很多接口,DataPacketMuxDemux.java里實(shí)現(xiàn)了接口IMessageListener,而Opendaylight為每個(gè)openflow消息都定義了一種IMessageListener,如果要監(jiān)聽(tīng)這種消息,我們只需要設(shè)置addMessageListener(OFType,?this)函數(shù)里加上自己要監(jiān)聽(tīng)的Openflow的消息類(lèi)型,不信你看看DataPacketMuxDemux是否有這個(gè)函數(shù),它因此可以收到Pack_in消息。

這個(gè)函數(shù)處理中,調(diào)用receiveDataPacket,數(shù)據(jù)就會(huì)進(jìn)入SAL層,SAL層收到openflow_plugin發(fā)出的Pack_in消息同樣是實(shí)現(xiàn)了一個(gè)接口IPluginOutDataPacketService,這個(gè)接口由SAL層的DataPacketService.java實(shí)現(xiàn),大家看了代碼肯定會(huì)發(fā)現(xiàn)它還實(shí)現(xiàn)了另一個(gè)接口IDataPacketService,這個(gè)接口是接收從SAL上層各個(gè)服務(wù)發(fā)送的數(shù)據(jù)包。所以SAL層起到了一個(gè)處理分發(fā)的作用。在SAL層收到下層plugin發(fā)送到包后,會(huì)送入上層的各個(gè)服務(wù)

各個(gè)服務(wù)(如ArpHandler)會(huì)通過(guò)監(jiān)聽(tīng)I(yíng)ListenDataPacket接口來(lái)收到從SAL層發(fā)來(lái)的數(shù)據(jù)。這里有個(gè)問(wèn)題講明白,上層監(jiān)聽(tīng)這個(gè)端口的可能有很多個(gè)服務(wù),那么每個(gè)監(jiān)聽(tīng)此接口的服務(wù)都會(huì)收到SAL轉(zhuǎn)發(fā)的數(shù)據(jù)包備份。

下面是整個(gè)數(shù)據(jù)傳輸結(jié)構(gòu)圖:

SAL層中處理數(shù)據(jù)包的是DataPacketService,而處理流表操作FlowProgrammerService。所以SAL的每個(gè)Service都可以看成是處理南北數(shù)據(jù)通路的一種服務(wù)。關(guān)鍵需要搞懂的是南北通路中的數(shù)據(jù)傳輸過(guò)程和機(jī)制。上面組件之間傳輸通過(guò)接口實(shí)現(xiàn)。

需要主要注意的是Openflow_plugin內(nèi)的Controller.java,ContrllerIO.java,SwitchHandler.java,MessageReadWriteService.java(這里是和Switch通信的Socket的實(shí)現(xiàn)),DataPacketServices.java這幾個(gè)文件,需要認(rèn)真閱讀。

基本上ODL的代碼還算易懂。

作者簡(jiǎn)介:

王鈺琪,2013/07-至今?北京郵電大學(xué)網(wǎng)絡(luò)技術(shù)研究院?網(wǎng)絡(luò)與交換技術(shù)國(guó)家重點(diǎn)實(shí)驗(yàn)室攻讀碩士研究生

點(diǎn)擊閱讀原文

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,505評(píng)論 6 533
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,556評(píng)論 3 418
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 176,463評(píng)論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 63,009評(píng)論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,778評(píng)論 6 410
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,218評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,281評(píng)論 3 441
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,436評(píng)論 0 288
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,969評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,795評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,993評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,537評(píng)論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,229評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,659評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 35,917評(píng)論 1 286
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,687評(píng)論 3 392
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,990評(píng)論 2 374

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,785評(píng)論 18 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類(lèi)相關(guān)的語(yǔ)法,內(nèi)部類(lèi)的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線(xiàn)程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,719評(píng)論 18 399
  • 從三月份找實(shí)習(xí)到現(xiàn)在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂(lè)視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,320評(píng)論 11 349
  • 青海湖無(wú)疑是絕美的,她的美讓我的人生無(wú)可避免的就有了遺憾! 去青海玩事先并沒(méi)有計(jì)劃,幾個(gè)朋友說(shuō)想去,剛...
    夜雪_5e1b閱讀 843評(píng)論 0 2
  • 昨晚臨睡時(shí)臨在,我靜靜地感受,我感受我的肩很痛,我的肚子氣體不斷涌現(xiàn),最后不斷打嗝或者嘔吐,隨之而來(lái)的是呼吸急促,...
    徐愷嶸閱讀 283評(píng)論 0 0