Microchip zigbee协议栈路由协议学习(4):路由表

Microchip的zigbee协议栈路由协议实现代码中有3张与路由有关的表:路由表(routing table)、路由发现表(route discovery table)和邻居表(neighbor table)。

在对数据分组转发中,主要进行下一跳地址定位的函数为GetRoutingAddress()(用于网状路由)和RouteAlongTree()(用于树状路由)。

GetRoutingAddress()方法的主要流程为:

通过NWKLookupNodeByShortAddrVal()方法在邻居表中查找节点;

如果找到了并且该节点属于本节点的下属节点(currentNeighborRecord.deviceInfo.bits.Relationship == NEIGHBOR_IS_CHILD):

  • 直接发送该分组。返回。

否则:

如果设置了支持网状路由算法的话:

先通过HaveRoutingCapacity()检测路由表(routing table)和路由发现表(route discovery table)是否存在目的地址的路由或者有空记录(可以发起对目的地址的路由发现)。

如果具备路由能力:

如果输入参数指定强制发现路由(discoverRoute == ROUTE_DISCOVERY_FORCE):

  • 启动路由发现:InitiateRouteDiscovery();

否则:

通过GetNextHop()遍历路由表,找到目的地址对应的路由记录,从路由记录中取下一跳地址及路由状态;

如果返回成功(ROUTE_ACTIVE):

  • 发送分组;

否则:

  • 通过RouteAlongTree()使用树状路由算法转发分组;

否则:

  • 通过RouteAlongTree()使用树状路由算法转发分组;

否则:

  • 通过RouteAlongTree()使用树状路由算法转发分组;

注:GetRoutingAddress()方法本身不执行分组的转发,而是通过返回ROUTE_SEND_TO_MAC_ADDRESS状态由它的调用者来执行分组转发。

在RouteAlongTree()方法中,对邻居表中的每条记录进行判断,如果该邻居属于本节点的子节点,则判断目的地址是否该节点或该节点的下级节点(通过IsDescendant()方法实现判断),是的话就转发分组。

博主
lanzhoo
lanzhoo's Blog
lanzhoo