z-stack home 1.2.2a 父节点收到入网请求与密匙分配过程代码分析与白名单实现方法

1 概述

        本文将分析z-stack协议栈设备加入安全使能网络时的相关代码,采用集中式安全的网络,从mac连接成功到密匙分配或收到密匙的过程,包含父节点和子节点(加网设备)。设备搜网过程不在本文讨论范围内,这方面的可参阅TI 中文社区的一篇分享贴:

        点击打开链接

        该分析基于z-stack home 1.2.2a 协议栈,也适用于较早的协议版本与z-stack3.0,但是在z-stack3.0中增加一层对新设备Link key验证的机制,未进行验证的新设备默认会在15秒后被移除。验证link key的目的在于,防止link key不一致导致的新设备收到无法解析的网络密匙后离网,而信任中心确认为新设备已经入网的现象出现。这块内容本文不详细阐述,相关函数为bdb_TCAddJoiningDevice、bdb_TCProcessJoiningList、bdb_TCjoiningDeviceComplete、APSME_ConfirmKeyReq、APSME_VerifyKeyReq,读者可自行分析。

2 父节点处理过程

        在一个新设备在mac连接成功并获得地址后,父节点网络层会回调ZDO_JoinIndicationCB告诉zdo新设备的短地址、mac地址与设备类型(全功能设备or半功能设备),回调前新设备信息已经添加到关联表AssociatedDevList与地址管理表(地址映射表)。

2.1  ZDO_JoinIndicationCB 中

        a 延时6.5s设置ZDO_NWK_UPDATE_NV事件,用于处理完新设备后保存nv

        b 将新设备的短地址信息加入单链表ZDApp_NewDeviceList中,并设置一个600ms延时事件ZDO_NEW_DEVICE。

2.2 在ZDO_NEW_DEVICE事件中

        a 调用ZDSecMgrNewDeviceEvent 处理新设备事件

        b 释放链表节点并延时启动下一次ZDO_NEW_DEVICE事件,确保事件执行时在新设备mac层入网成功600ms后

2.3 ZDSecMgrNewDeviceEvent 函数

        a 如果是预配置网络密匙模式则直接标记设备状态为已认证:authenticated

        b 构建ZDSecMgrDevice_t实例device,对于新设备device.secure = FALSE,表示未经验证

        b 传递device给 ZDSecMgrDeviceNew 处理新设备

        c 如果ZDSecMgrDeviceNew 返回失败则将其从关联表与地址管理表中清除。

2.4 ZDSecMgrDeviceNew 函数: 

        a 如果自己是协调器或者是分布式安全网络(作者没研究)则调用ZDSecMgrDeviceJoinDirect

         b 否则(自己是路由器节点)调用ZDSecMgrDeviceJoinFwd(2.7节)

2.5 ZDSecMgrDeviceJoinDirect 函数

        a 直接调用 ZDSecMgrDeviceJoin 处理直接设备加入

        b 如果ZDSecMgrDeviceJoin 成功,将设备标记为已认证

2.6 ZDSecMgrDeviceJoin 函数:(加到路由器的设备会通过aps层UpdateDevice命令调用到该函数)

        a 调用 ZDSecMgrDeviceValidate 验证新设备能否加入网络,白名单功能可修改该函数实现,返回成功设备才能入网

        b 验证通过调用ZDSecMgrSendNwkKey发送网络密匙给新的设备:直接发送或通过aps层隧道tunnel发送

        c 验证不通过或密匙发送失败则将新设备移除:移除自身子节点或通过aps层RemoveDevice命令告诉路由器移除其子节点

2.7 ZDSecMgrDeviceJoinFwd函数

        a 通过aps层UpdateDevice将新设备信息发送到信任中心验证是否入网

2.8 路由节点附加描述

        新设备加到路由器节点会通过UpdateDevice发送到信任中心验证是否入网,信任中心通过tunnel:TransportKey命令告诉路由器新设备可入网,或者通过RemoveDevice告诉路由器不允许新设备入网。

3 子节点处理过程

        新设备在mac连接成功并获得地址后,网络层会回调ZDO_JoinConfirmCB告诉zdo。

3.1 ZDO_JoinConfirmCB 函数

        a 清除邻居表

        b ZDO_NWK_UPDATE_NV,用于处理完入网过程后保存nv

        c 发送任务消息ZDO_NWK_JOIN_IND到zdo任务,在ZDO_NWK_JOIN_IND消息中调用ZDApp_ProcessNetworkJoin

3.2 ZDApp_ProcessNetworkJoin 函数

        a 将设备标记为等待验证状态

        b 启动验证超时定时器,默认为MAX_DEVICE_UNAUTH_TIMEOUT毫秒,这个时间可自己修改,建议3~5秒。这个时间内如果未收到TransportKey消息设备将重新搜网。

3.3 收到密匙调用 ZDSecMgrTransportKeyInd( ZDO_TransportKeyInd_t* ind )

          a 更新网络密匙SSP_UpdateNwkKey

          b 调用ZDSecMgrAuthNwkKey设置ZDO_DEVICE_AUTH 事件以更改设备状态为已认证


转载请注明出处:https://blog.csdn.net/jason_lm/article/details/80950479

猜你喜欢

转载自blog.csdn.net/jason_lm/article/details/80950479
今日推荐