Atribuição de endereço
Resumo
Introdução:
Como há várias interdependências entre as interfaces e cada configuração de dispositivo pode exigir atribuição de rota e endereço TCP/IP diferente, foi considerado essencial que a lógica de controle de endereço IP e a atribuição de rota seja consolidada em um único módulo. WARM serve para adicionar e remover corretamente endereços TCP/IP e rotas para interfaces IP relacionadas ao Weave à medida que essas interfaces passam de ativo<->inativo.
O WARM precisa ser configurado no tempo de compilação por meio de CurrentProjectConfig.h e WarmConfig.h. A função estado/aquecimento precisa refletir com precisão os recursos compatíveis com o dispositivo em que o comando WARM será executado.
WARM é um módulo portátil que limita a dependência da configuração da pilha TCP/IP e da interface de encadeamento. Para essa finalidade, o WARM depende de um conjunto de APIs da plataforma que precisa ser implementado pelo integrador da plataforma. Além disso, o integrador da plataforma é responsável por fazer as várias chamadas de API nl::Warm de pontos de execução apropriados na base de código da plataforma.
Teoria da operação:
A base de código da plataforma chamará as APIs nl::Warm para anunciar uma mudança de estado para recursos relacionados, como as interfaces Wi-Fi e Thread. Uma chamada para qualquer uma dessas nl::Warm API's pode resultar em uma chamada de WARM para Platform::RequestInvocActions(). Platform::RequestInitializeActions() precisa ser implementada para executar as operações necessárias que chamarão Warm::InvocationActions(). À primeira vista, esse processo pode parecer desnecessariamente indireto. Por que o WARM não chamaria integrarActions diretamente? A resposta a essa pergunta é permitir que qualquer tarefa em um sistema multitarefa chame as APIs nl::Warm State Change e fornecer um mecanismo para que somente uma tarefa específica chame as APIs da Platform::. Depois de considerar os requisitos da plataforma, o integrador de plataformas pode optar por implementar Platform::RequestInvocActions() para publicar um evento na tarefa apropriada que reagirá chamando Warm::Invoque ações(). Se, para uma determinada plataforma, for decidido que não existem essas questões de multitarefas, Platform:Invoc:RequestActions() pode ser implementado para chamar Warm::InitializeActions() diretamente.
Quando o método Warm::integrarActions() for chamado, a lógica WARM examinará o estado atual do sistema e fará todas as chamadas de API Platform:: necessárias para alinhar o endereço e o estado do roteamento ao estado do sistema e da configuração. Essas chamadas são feitas em uma ordem predefinida e, se qualquer uma dessas APIs retornar kPlatformResultInProgress, a execução da lista ordenada será suspensa e encerrada. Além disso, quando uma dessas APIs retorna kPlatformResultInProgress, é interpretado que a operação será concluída de forma assíncrona e que a lógica WARM deve aguardar a conclusão dessa operação. Após a conclusão da operação, o código da plataforma chamará Warm::ReportActionComplete(), transmitindo um resultado de kPlatformResultSuccess ou kPlatformResultFailure. Ao receber essa chamada, a lógica WARM chamará novamente Platform::RequestInitializeActions() para reiniciar a execução da lista de ações ordenadas.
Dessa forma, o WARM não exige uma tarefa própria, mas pode depender de outra tarefa para chamar a função Nest conforme apropriado. Além disso, qualquer tarefa pode chamar uma ou mais APIs de mudança de estado do sistema, simplificando a integração.