原创
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()方法实现判断),是的话就转发分组。
关闭
站长推荐
/3
用户138786 2011-5-8 18:31
用户1406923 2011-1-15 10:00
用户1663478 2011-1-6 09:44