1. 程式人生 > 其它 >BATMAN.adv系列05 資料結構分析

BATMAN.adv系列05 資料結構分析

分析BATMAN.adv的資料結構,闡述BATMAN.adv如果確定資料包轉發。

路由結構表

BATMAN.adv是一種主幹自組網協議,其最終目的是為網路中的非mesh網節點(客戶節點)提供服務。為了管理網路中的mesh節點與非mesh節點,每個執行BATMAN.adv的源節點都有三張路由表用於維護路由資訊。

本地路由表(The local translation table):每個mesh節點都存有一張本地路由表,該表包含節點正在服務的所有客戶節點。表中包含版本號屬性值(the translation table version number,ttvn),當表發生變更時ttvn會自增1。出於對協議優化的考慮,同一OGM包傳送週期內即使發生多次變化ttvn也只會加1。

全域性路由表(The global translation table):網路中的每個mesh節點都需要儲存其它節點的“本地路由表”,稱之為全域性路由表。表中包含客戶節點MAC地址與服務該客戶節點的mesh節點MAC地址之間的對應關係。隸屬於不同mesh節點的客戶節點之間傳送資料依賴於全域性路由表。

源節點列表(originator table):源節點列表儲存mesh節點之間的路由資訊,其中包括:源節點MAC地址,最近收到該源節OGM包的時間,連線源節點的網口地址,資料發往某一源節點時應選擇的最佳下一跳MAC地址,可將資料發往某一源節點的所有下一跳節點MAC地址和最新的OGM包序列號等。下圖中,節點f通過節點d與節點e收到了由o產生的OGM包,通過OGM包中TQOGM判定節點d為傳送資料給o時的最佳下一跳,節點e作為備選。

圖2 源節點列表示意圖

源節點路由表

BATMAN.adv的源節點列表資料結構如下圖所示,mesh網路虛擬介面對應的私有資料指標指向一個batadv_priv結構體,而batadv_priv結構體連線著多個batadv_orig_node結構體。batadv_orig_node結構體儲存並維護其它源節點的資訊。batadv_orig_node所連線的batadv_neigh_node結構體主要儲存可將資料路由至對應源節點的所有鄰居節點。下文摘取部分重要的成員變數進行闡述。

圖2 batman-adv源節點路由資料結構

每一個mesh網路對應的一個batadv_priv結構體,其被mesh網路對應的虛擬網路裝置(net_device)的私有資料指標所指向。通過batadv_priv結構體可方便地找到路由相關的所有資訊。

  • soft_iface指標指向mesh網路對應的網路介面結構體。
  • forw_bat_list為一連結串列頭,連結串列儲存了待轉發的OGM包。
  • orig_hash為一batadv_hashtable型別的結構體,其主要功能為儲存batadv_orig_node連結串列。
  • orig_work用於儲存定時傳送OGM包的延時工作佇列。
  • primary_if為儲存主要網路介面的指標。

(2) batadv_orig_node結構體。

batadv_orig_node為儲存mesh網路中節點相關資訊最主要的結構體,通過對應節點的batadv_orig_node結構體,可方便地查詢到節點相關的所有資訊。當收到某一節點有效的OGM包時,系統將更新並維護相應的batadv_orig_node結構體。

  • orig陣列,長度為6個位元組,儲存了mesh網路中節點的MAC地址。程式通過匹配MAC地址查詢某一節點所對應的batadv_orig_node結構體。
  • ifinfo_list是一連結串列表頭,儲存了batadv_orig_ifinfo結構體連結串列。此結構體與路由有關,下文詳細介紹。
  • neigh_list是一連結串列表頭,儲存了batadv_neigh_node結構體連結串列。

(3) batadv_neigh_node結構體。

batadv_neigh_node結構體以連結串列的形式維護,連結串列中的每一個節點對應了一個可將資料包轉發至目標的一個跳鄰居節點。本機將資料傳送至neigh_list所對應的一跳鄰居節點後,此一跳鄰居節點能將資料包轉發至batadv_orig_node所對應的節點。系統會依據收到的OGM包不斷地維護並且更新batadv_neigh_node結構體。

(4) batadv_orig_ifinfo結構體

batadv_orig_ifinfo結構體儲存mesh網路中節點與相關網路介面的資訊。當存在多個網路介面時,mesh網路中的一個節點對應一個batadv_orig_node結構體,而batadv_orig_node結構體下轄多個batadv_orig_ifinfo。

  • if_outgoing指向傳送資料的網路介面。
  • router指向發往mesh網路中節點的最佳下一跳鄰居節點所對應的batadv_neigh_node結構體。此外batadv_orig_ifinfo結構體還維護了一張其它備選路由節點的連結串列。

為了說明上述各個結構體的聯絡,假定已知目標節點MAC地址,batadv_priv結構體和負責傳送的網路介面,解釋當需要向目標節點發送資料時所需要進行的查詢過程。

  1. 根據目標節點的MAC地址遍歷batadv_priv結構體下的batadv_orig_node結構體連結串列,找到連結串列中orig陣列與目標節點MAC地址相同的batadv_orig_node。
  2. 根據負責傳送的網路介面,找到上一步中batadv_orig_node結構體下與已知介面對應的batadv_orig_ifinfo結構體。
  3. 獲取上一步中batadv_orig_ifinfo結構體中成員變數router所指向的batadv_neigh_node型別結構體。
  4. 利用上一步獲取的batadv_neigh_node型別結構體和相關介面函式,向目標節點發送資料包。