地址分配
摘要
简介:
由于接口之间有许多相互依赖性,并且不同的设备配置可能需要不同的 TCP/IP 地址和路由分配,因此将用于控制 IP 地址和路由分配的逻辑整合到一个模块中已被视为至关重要。WARM 的用途是正确添加和移除 TCP/IP 地址以及与 Weave 相关的 IP 接口的路由,因为这些接口从活跃<->非活跃转换。
WARM 应在编译时通过 ArmorProjectConfig.h 和 WarmConfig.h 进行配置。WarmProjectConfig.h 必须准确反映将执行 WARM 的设备支持的功能。
WARM 是一种可移植的模块,会限制其对 TCP/IP 堆栈和线程接口配置方式的依赖性。为此,WARM 依赖于必须由平台集成商实现的一组平台 API。此外,平台集成商负责从平台代码库内的适当执行点进行各种 nl::Warm API 调用。
操作理论:
平台代码库将调用 nl::Warm API ,宣布 Wi-Fi 接口和 Thread 接口等相关功能的状态变更。调用以下任何一项 nl::Warm API 都可能会导致 WARM 调用 Platform::RequestInvokeActions()。必须实现 Platform::RequestInvokeActions() 才能执行将调用 Warm::InvokeActions() 的必要操作。乍一看,此过程可能不必要,是间接的。为什么 WARM 不会直接调用 InvokeActions?问题的答案是允许多任务系统中的任何任务调用 nl::Warm State Change API ,并提供一种机制,以便只有特定任务会调用 Platform:: API。在考虑平台要求之后,平台集成商可以选择实现 Platform::RequestInvokeActions(),以便向相应任务发布事件,该事件将通过调用 Warm::InvokeActions() 来做出反应。如果对于某个给定平台,系统确定不存在此类多任务问题,则可以实现 Platform::RequestInvokeActions() 来直接调用 Warm::InvokeActions()
调用 Warm::InvokeActions() 时,WARM 逻辑将检查当前系统状态并进行必要的 Platform:: API 调用,以使地址和路由状态与系统和配置状态保持一致。这些调用按预定义顺序进行,如果其中任何 API 返回 kPlatformResultInProgress,系统将暂停并退出有序列表的执行。此外,当其中一个 API 返回 kPlatformResultInProgress 时,系统会将其解读为该操作将异步完成,且 WARM 逻辑应等待该操作完成。操作完成后,平台代码应调用 Warm::ReportActionComplete(),并传入 kPlatformResultSuccess 或 kPlatformResultFailure 的结果。收到此调用后,WARM 逻辑将再次调用 Platform::RequestInvokeActions(),以便重新开始执行有序操作列表。
这样,WARM 不需要自己的任务,而是可以视情况依赖于另一个任务调用“Warm”。此外,任何任务都可以调用一个或多个 System State Change API,从而简化集成工作。