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
[in] aPacket
- o buffer de pacote a ser adicionado ao final da cadeia atual.

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
[in] aAlignBytes
- especifica o número de alinhamento de bytes para o ponteiro de início do payload.
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
[in] aConsumeLength
- número de bytes a serem consumidos da cadeia atual.
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
[in] aConsumeLen
- número de bytes a serem consumidos do buffer atual.

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
[in] aReservedSize
- número de bytes desejado para os cabeçalhos.
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
[in] aNewLen
- novo tamanho, em bytes, deste buffer.
[in,out] aChainHead
- o núcleo da cadeia do buffer a que o buffer atual pertence. Pode ser NULL se o buffer atual for o início da cadeia do buffer.

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
[in] aNewStart
- Um ponteiro para onde o novo payload deve começar. newStart será ajustado internamente para estar nos limites do primeiro buffer na cadeia do PacketBuffer.

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
[in] aPacket
- Buffer de pacote a ser liberado.

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
[in] aPacket
- cadeia de buffer.
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 via PacketBuffer::AddToEnd(). Parâmetros
    [in] aReservedSize
    de espaço do cabeçalho para reservar.
    Retorna
    Em caso de sucesso, um ponteiro para o PacketBuffer, na falha NULL.

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
[in] aAvailableSize
Número de octetos a serem alocados após o cursor.
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
[in] aReservedSize
Número de octetos a serem reservados atrás do cursor.
[in] aAvailableSize
Número de octetos a serem alocados após o cursor.
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
[in] aPacket
- buffer ou cadeia de buffer.
Retornos
novo buffer de pacote ou o buffer original