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结构体可方便地找到路由相关的所有信息。
(2) batadv_orig_node结构体。
batadv_orig_node为保存mesh网络中节点相关信息最主要的结构体,通过对应节点的batadv_orig_node结构体,可方便地查找到节点相关的所有信息。当收到某一节点有效的OGM包时,系统将更新并维护相应的batadv_orig_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。
为了说明上述各个结构体的联系,假定已知目标节点MAC地址,batadv_priv结构体和负责发送的网络接口,解释当需要向目标节点发送数据时所需要进行的查找过程。