BATMAN.adv系列05 数据结构分析
原创文章,转发请注明链接和作者。(而且作者很懒,没有检查错别字)
路由结构表
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结构体和负责发送的网络接口,解释当需要向目标节点发送数据时所需要进行的查找过程。
- 根据目标节点的MAC地址遍历batadv_priv结构体下的batadv_orig_node结构体链表,找到链表中orig数组与目标节点MAC地址相同的batadv_orig_node。
- 根据负责发送的网络接口,找到上一步中batadv_orig_node结构体下与已知接口对应的batadv_orig_ifinfo结构体。
- 获取上一步中batadv_orig_ifinfo结构体中成员变量router所指向的batadv_neigh_node类型结构体。
- 利用上一步获取的batadv_neigh_node类型结构体和相关接口函数,向目标节点发送数据包。