nl:: Weave:: System:: PacketBuffer
#include <src/system/SystemPacketBuffer.h>
A classe de buffer de pacotes é a estrutura central usada para manipular pacotes de dados serializados por octeto, geralmente no contexto de uma rede de comunicações de dados, como Bluetooth ou protocolo de Internet.
Resumo
Em ambientes baseados em LwIP, essa classe é criada com base na estrutura pbuf definida nessa biblioteca. Na ausência do LwIP, o Weave oferece uma implementação baseada em shoppings ou em pool que se aproxima dos desafios de memória de dispositivos profundamente incorporados.
A classe PacketBuffer, assim como muitas estruturas semelhantes usadas em pilhas de rede em camadas, oferece um mecanismo para reservar espaço para cabeçalhos de protocolo em cada camada de uma pilha de comunicação configurável. Para mais detalhes, consulte PacketBuffer::New()
e a documentação do LwIP.
Os objetos PacketBuffer são contados por referência, e o modo de uso predominante no Weave é "fire-and-forget". À medida que o pacote (e o objeto PacketBuffer subjacente) é despachado por várias camadas de protocolo, o upcall ou downcall bem-sucedido entre as camadas implica transferência de propriedade, e o recebedor da chamada é responsável por liberar o buffer. Em caso de falha em uma chamada entre camadas, a responsabilidade de liberar o buffer será do autor da chamada.
Novos objetos da classe PacketBuffer são inicializados no início de uma alocação de memória recebida do ambiente subjacente. Por exemplo: de pools de destino pbuf do LwIP, do heap da biblioteca C padrão, de um pool de buffers interno. No caso simples, o tamanho do buffer de dados é WEAVE_SYSTEM_PACKETBUFFER_SIZE. É fornecido um compositor que permite o uso de buffers de dados de outros tamanhos.
Os objetos PacketBuffer podem ser encadeados para acomodar payloads maiores. No entanto, o encadeamento não é transparente, e os usuários da classe precisam decidir explicitamente oferecer suporte ao encadeamento. Veja a seguir exemplos de classes escritas com suporte ao encadeamento:
@ref nl::Weave::WeaveTLVReader @ref nl::Weave::WeaveTLVWriter
Herança
Herda de: pbuf
Funções públicas |
|
---|---|
AddRef(void)
|
void
Incrementar a contagem de referência do buffer atual.
|
AddToEnd(PacketBuffer *aPacket)
|
void
Adiciona o buffer de pacote fornecido ao final da cadeia de buffers, ajustando o comprimento total de cada buffer na cadeia de acordo.
|
AlignPayload(uint16_t aAlignBytes)
|
bool
Alinha o payload do buffer no limite de bytes especificado.
|
AllocSize(void) const
|
size_t
Retorna o tamanho da alocação, incluindo os espaços de dados reservados e de payload, mas sem incluir o espaço alocado para a estrutura PacketBuffer.
|
AvailableDataLength(void) const
|
uint16_t
Descubra o número de bytes de dados que podem ser adicionados ao buffer atual de acordo com a posição inicial e o comprimento dos dados atuais.
|
CompactHead(void)
|
void
Mover os dados dos buffers subsequentes na cadeia para o buffer atual até que ele esteja completo.
|
Consume(uint16_t aConsumeLength)
|
Consumir dados em uma cadeia de buffers.
|
ConsumeHead(uint16_t aConsumeLength)
|
void
Ajuste o buffer atual para indicar a quantidade de dados consumidas.
|
DataLength(void) const
|
uint16_t
Recebe o tamanho, em bytes, dos dados no buffer de pacote.
|
DetachTail(void)
|
Remover o buffer atual da cadeia e retornar um ponteiro para os buffers restantes.
|
EnsureReservedSize(uint16_t aReservedSize)
|
bool
Verifique se o buffer tem pelo menos a quantidade especificada de espaço reservado.
|
MaxDataLength(void) const
|
uint16_t
Encontra a quantidade máxima, em bytes, de dados que caberá no buffer de acordo com a posição inicial e o tamanho do buffer atuais.
|
Next(void) const
|
Recebe o ponteiro para o próximo buffer na cadeia.
|
ReservedSize(void) const
|
uint16_t
Recebe o número de bytes do buffer atual entre o início do buffer e a posição de início dos dados atual.
|
SetDataLength(uint16_t aNewLen, PacketBuffer *aChainHead)
|
void
Define o tamanho, em bytes, dos dados no buffer, ajustando o comprimento total de acordo.
|
SetStart(uint8_t *aNewStart)
|
void
Defina os dados iniciais no buffer, ajustando o comprimento e o comprimento total de acordo com eles.
|
Start(void) const
|
uint8_t *
Recebe o ponteiro para o início dos dados no buffer.
|
TotalLength(void) const
|
uint16_t
Recebe o comprimento total dos dados do pacote na cadeia do buffer.
|
Funções estáticas públicas |
|
---|---|
Free(PacketBuffer *aPacket)
|
void
Liberar todos os buffers de pacote em uma cadeia.
|
FreeHead(PacketBuffer *aPacket)
|
Libera o primeiro buffer em uma cadeia, retornando um ponteiro para os buffers restantes.
|
New(void)
|
Aloca um único PacketBuffer do tamanho máximo padrão (WEAVE_SYSTEM_CONFIG_PACKETBUFFER_CAPACITY_MAX) com o tamanho reservado padrão (WEAVE_SYSTEM_CONFIG_HEADER_RESERVE_SIZE) no payload.
|
New(uint16_t aReservedSize)
|
Aloca um único PacketBuffer do tamanho total máximo a um tamanho de reserva de cabeçalho específico.
|
NewWithAvailableSize(size_t aAvailableSize)
|
Aloca um PacketBuffer com o tamanho reservado padrão (WEAVE_SYSTEM_CONFIG_HEADER_RESERVE_SIZE) no payload para cabeçalhos e pelo menos
aAllocSize bytes de espaço para dados adicionais após o ponteiro do cursor inicial. |
NewWithAvailableSize(uint16_t aReservedSize, size_t aAvailableSize)
|
Aloca um objeto PacketBuffer com pelo menos
aReservedSize bytes reservados no payload para cabeçalhos e com pelo menos aAllocSize bytes de espaço para dados adicionais após o ponteiro do cursor inicial. |
RightSize(PacketBuffer *aPacket)
|
Copia o buffer fornecido para um buffer de tamanho correto, se aplicável.
|
Funções públicas
AddRef
void AddRef( void )
Incrementar a contagem de referência do buffer atual.
AddToEnd
void AddToEnd( PacketBuffer *aPacket )
Adiciona o buffer de pacote fornecido ao final da cadeia de buffers, ajustando o comprimento total de cada buffer na cadeia de acordo.
Detalhes | |||
---|---|---|---|
Parâmetros |
|
AlignPayload
bool AlignPayload( uint16_t aAlignBytes )
Alinha o payload do buffer no limite de bytes especificado.
Mover o payload do buffer adiante, se necessário.
Detalhes | |||
---|---|---|---|
Parâmetros |
|
||
Retornos |
true se o alinhamento for bem-sucedido, false se não houver espaço suficiente no buffer. |
AllocSize
size_t AllocSize( void ) const
Retorna o tamanho da alocação, incluindo os espaços de dados reservados e de payload, mas sem incluir o espaço alocado para a estrutura PacketBuffer.
Detalhes | |
---|---|
Retornos |
o tamanho da alocação
|
AvailableDataLength
uint16_t AvailableDataLength( void ) const
Descubra o número de bytes de dados que podem ser adicionados ao buffer atual de acordo com a posição inicial e o comprimento dos dados atuais.
Detalhes | |
---|---|
Retornos |
o tamanho, em bytes, dos dados que caberão no buffer atual de acordo com a posição inicial e o comprimento dos dados atuais.
|
CompactHead
void CompactHead( void )
Mover os dados dos buffers subsequentes na cadeia para o buffer atual até que ele esteja completo.
Somente o buffer atual é compactado: os dados no buffer atual são movidos para a frente do buffer, eliminando qualquer espaço reservado. O espaço disponível restante é preenchido com dados movidos de buffers subsequentes na cadeia, até que o buffer atual esteja cheio. Se um buffer subsequente na cadeia for movido integralmente para o buffer atual, ele será removido da cadeia e liberado. O método não tem parâmetros, não retorna resultados e não pode falhar.
Consumir
PacketBuffer * Consume( uint16_t aConsumeLength )
Consumir dados em uma cadeia de buffers.
Consumir dados em uma cadeia de buffers começando pelo buffer atual e seguindo pelos buffers restantes na cadeia. Cada buffer completamente consumido é liberado e a função retorna o primeiro buffer (se houver) contendo os dados restantes. O buffer atual precisa ser o cabeçalho da cadeia do buffer.
Detalhes | |||
---|---|---|---|
Parâmetros |
|
||
Retornos |
o primeiro buffer da cadeia atual que contém os dados restantes. Se nenhum dado permanecer, será retornado um NULL.
|
ConsumeHead
void ConsumeHead( uint16_t aConsumeLength )
Ajuste o buffer atual para indicar a quantidade de dados consumidas.
avança a posição inicial dos dados no buffer atual pela quantidade especificada, em bytes, até o comprimento dos dados no buffer; Diminua o comprimento e o comprimento total de acordo com a quantidade consumida.
Detalhes | |||
---|---|---|---|
Parâmetros |
|
DataLength
uint16_t DataLength( void ) const
Recebe o tamanho, em bytes, dos dados no buffer de pacote.
Detalhes | |
---|---|
Retornos |
comprimento, em bytes (comprimento do payload atual).
|
DetachTail
PacketBuffer * DetachTail( void )
Remover o buffer atual da cadeia e retornar um ponteiro para os buffers restantes.
O buffer atual precisa ser o cabeçalho da cadeia.
Detalhes | |
---|---|
Retornos |
a cauda da cadeia do buffer atual ou NULL se o buffer atual for o único buffer na cadeia.
|
EnsureReservedSize
bool EnsureReservedSize( uint16_t aReservedSize )
Verifique se o buffer tem pelo menos a quantidade especificada de espaço reservado.
Verifique se o buffer tem pelo menos a quantidade especificada de espaço reservado, movendo os dados no buffer para a frente, a fim de liberar espaço, se necessário.
Detalhes | |||
---|---|---|---|
Parâmetros |
|
||
Retornos |
true se o tamanho reservado solicitado estiver disponível, false se não houver espaço suficiente no buffer. |
MaxDataLength
uint16_t MaxDataLength( void ) const
Encontra a quantidade máxima, em bytes, de dados que caberá no buffer de acordo com a posição inicial e o tamanho do buffer atuais.
Detalhes | |
---|---|
Retornos |
número de bytes que cabem no buffer de acordo com a posição inicial atual.
|
Próxima
PacketBuffer * Next( void ) const
Recebe o ponteiro para o próximo buffer na cadeia.
Detalhes | |
---|---|
Retornos |
um ponteiro para o próximo buffer na cadeia.
NULL é retornado quando não há buffers na cadeia. |
ReservedSize
uint16_t ReservedSize( void ) const
Recebe o número de bytes do buffer atual entre o início do buffer e a posição de início dos dados atual.
Detalhes | |
---|---|
Retornos |
a quantidade, em bytes, de espaço entre o início do buffer e a posição inicial dos dados atuais.
|
SetDataLength
void SetDataLength( uint16_t aNewLen, PacketBuffer *aChainHead )
Define o tamanho, em bytes, dos dados no buffer, ajustando o comprimento total de acordo.
A função define o comprimento, em bytes, dos dados no buffer, ajustando o comprimento total adequadamente. Quando o buffer não é o topo da cadeia do buffer (caso comum: o autor da chamada adiciona dados ao último buffer na cadeia do PacketBuffer antes de chamar camadas superiores), o aChainHead precisa ser transmitido para ajustar corretamente o comprimento total de cada buffer à frente do buffer atual.
Detalhes | |||||
---|---|---|---|---|---|
Parâmetros |
|
SetStart
void SetStart( uint8_t *aNewStart )
Defina os dados iniciais no buffer, ajustando o comprimento e o comprimento total de acordo com eles.
Detalhes | |||
---|---|---|---|
Parâmetros |
|
Iniciar
uint8_t * Start( void ) const
Recebe o ponteiro para o início dos dados no buffer.
Detalhes | |
---|---|
Retornos |
para o início dos dados.
|
TotalLength
uint16_t TotalLength( void ) const
Recebe o comprimento total dos dados do pacote na cadeia do buffer.
Detalhes | |
---|---|
Retornos |
tamanho total em octetos
|
Funções estáticas públicas
Gratuito
void Free( PacketBuffer *aPacket )
Liberar todos os buffers de pacote em uma cadeia.
Diminuir a contagem de referência para todos os buffers na cadeia atual. Se a contagem de referência chegar a 0, os respectivos buffers serão liberados ou retornados para os pools de alocação, conforme apropriado. Como regra, os usuários precisam tratar esse método como um equivalente da função free()
e não usar o argumento após a chamada.
Detalhes | |||
---|---|---|---|
Parâmetros |
|
FreeHead
PacketBuffer * FreeHead( PacketBuffer *aPacket )
Libera o primeiro buffer em uma cadeia, retornando um ponteiro para os buffers restantes.
* @note When the buffer chain is referenced by multiple callers,
FreeHead()` vai remover o cabeçalho, mas não forçará a desalocação dele.
Detalhes | |||
---|---|---|---|
Parâmetros |
|
||
Retornos |
cadeia de buffer de pacotes que consiste na cauda do buffer de entrada (pode ser
NULL ). |
Novo
PacketBuffer * New( void )
Aloca um único PacketBuffer do tamanho máximo padrão (WEAVE_SYSTEM_CONFIG_PACKETBUFFER_CAPACITY_MAX) com o tamanho reservado padrão (WEAVE_SYSTEM_CONFIG_HEADER_RESERVE_SIZE) no payload.
O tamanho reservado (WEAVE_SYSTEM_CONFIG_HEADER_RESERVE_SIZE) é grande o suficiente para armazenar cabeçalhos da camada de transporte, além dos cabeçalhos exigidos por WeaveMessageLayer
e WeaveExchangeLayer
.
Novo
PacketBuffer * New( uint16_t aReservedSize )
Aloca um único PacketBuffer do tamanho total máximo a um tamanho de reserva de cabeçalho específico.
O parâmetro transmitido é o tamanho reservado antes do payload para acomodar cabeçalhos de pacotes de diferentes camadas de pilha, não o tamanho geral do buffer a ser alocado. O tamanho do buffer WEAVE_SYSTEM_CONFIG_PACKETBUFFER_CAPACITY_MAX, e não especificado, especificado na chamada.
PacketBuffer::New(0)
: quando chamado dessa maneira, o buffer é retornado sem nenhum cabeçalho reservado. Consequentemente, todo o payload pode ser usado pelo autor da chamada. Esse padrão é particularmente útil nas camadas inferiores das pilhas de rede, nos casos em que o usuário sabe que o payload será copiado para a mensagem final com reservas de cabeçalho apropriadas ou na criação de PacketBuffer que são anexados a uma cadeia de PacketBuffer viaPacketBuffer::AddToEnd()
. Parâmetros[in] aReservedSize
de espaço do cabeçalho para reservar.Em caso de sucesso, um ponteiro para o PacketBuffer, na falhaNULL
.
NewWithAvailableSize
PacketBuffer * NewWithAvailableSize( size_t aAvailableSize )
Aloca um PacketBuffer com o tamanho reservado padrão (WEAVE_SYSTEM_CONFIG_HEADER_RESERVE_SIZE) no payload para cabeçalhos e pelo menos aAllocSize
bytes de espaço para dados adicionais após o ponteiro do cursor inicial.
Esse uso é mais apropriado na alocação de um PacketBuffer para uma mensagem da camada do aplicativo.
Detalhes | |||
---|---|---|---|
Parâmetros |
|
||
Retornos |
Em caso de sucesso, um ponteiro para PacketBuffer no bloco alocado. Em caso de falha,
NULL . * |
NewWithAvailableSize
PacketBuffer * NewWithAvailableSize( uint16_t aReservedSize, size_t aAvailableSize )
Aloca um objeto PacketBuffer com pelo menos aReservedSize
bytes reservados no payload para cabeçalhos e pelo menos aAllocSize
bytes de espaço para dados adicionais após o ponteiro do cursor inicial.
Detalhes | |||||
---|---|---|---|---|---|
Parâmetros |
|
||||
Retornos |
Em caso de sucesso, um ponteiro para PacketBuffer no bloco alocado. Em caso de falha,
NULL . |
RightSize
PacketBuffer * RightSize( PacketBuffer *aPacket )
Copia o buffer fornecido para um buffer de tamanho correto, se aplicável.
Essa função é um ambiente autônomo para soquetes.
Detalhes | |||
---|---|---|---|
Parâmetros |
|
||
Retornos |
novo buffer de pacote ou o buffer original
|