En Google, luchamos por la equidad racial de la comunidad negra. Más información

nl :: Tejido:: Sistema:: PacketBuffer

#include <src/system/SystemPacketBuffer.h>

La clase de búfer de paquetes es la estructura central utilizada para manipular paquetes de datos serializados en octetos, generalmente en el contexto de una red de comunicaciones de datos, como Bluetooth o el protocolo de Internet.

Resumen

En entornos basados ​​en LwIP, esta clase se construye sobre la estructura pbuf definida en esa biblioteca. En ausencia de LwIP, Weave proporciona una implementación basada en malloc o una implementación basada en pool que se aproxima mucho a los desafíos de memoria de los dispositivos profundamente integrados.

El PacketBuffer clase, como muchas estructuras similares utilizados en pilas de red en capas, proporciona un mecanismo para reservar espacio para cabeceras de protocolo en cada capa de una pila de comunicación configurable. Para más detalles, véase PacketBuffer::New() , así como la documentación lwip.

PacketBuffer objetos son de referencia contado, y el modo de uso que prevalece dentro de la armadura es "dispara y olvida". A medida que el paquete (y de su subyacente PacketBuffer objeto) se distribuye a través de diversas capas de protocolo, la upcall éxito o downcall entre capas implica transferencia de la propiedad, y el destinatario de la llamada es responsable de liberar el buffer. En caso de falla de una llamada entre capas, la responsabilidad de liberar el búfer recae en la persona que llama.

Nuevos objetos de PacketBuffer clase se inicializan en el comienzo de una asignación de memoria obtenida de la ambiente subyacente, por ejemplo de lwIP pBuf grupos de destino, de la norma montón biblioteca C, a partir de un grupo de búferes interna. En el caso simple, el tamaño de la memoria intermedia de datos es WEAVE_SYSTEM_PACKETBUFFER_SIZE . Se proporciona un compositor que permite el uso de búferes de datos de otros tamaños.

PacketBuffer objetos pueden ser encadenados para acomodar cargas útiles más grandes. Sin embargo, el encadenamiento no es transparente y los usuarios de la clase deben decidir explícitamente si admiten el encadenamiento. Ejemplos de clases escritas con el encadenamiento de apoyo son los siguientes:

@ref nl::Weave::WeaveTLVReader
@ref nl::Weave::WeaveTLVWriter

Herencia

Hereda de: pBuf

Funciones publicas

AddRef (void)
void
Incrementa el recuento de referencia del búfer actual.
AddToEnd ( PacketBuffer *aPacket)
void
Agregue el búfer de paquetes dado al final de la cadena de búfer, ajustando la longitud total de cada búfer en la cadena en consecuencia.
AlignPayload (uint16_t aAlignBytes)
bool
Alinee la carga útil del búfer en el límite de bytes especificado.
AllocSize (void) const
size_t
Devolver el tamaño de la asignación incluyendo los espacios de datos reservados y de carga útil, pero sin incluir el espacio asignado para el PacketBuffer estructura.
AvailableDataLength (void) const
uint16_t
Obtenga el número de bytes de datos que se pueden agregar al búfer actual dada la posición de inicio actual y la longitud de los datos.
CompactHead (void)
void
Mueva los datos de los búferes posteriores de la cadena al búfer actual hasta que esté lleno.
Consume (uint16_t aConsumeLength)
Consume datos en una cadena de búferes.
ConsumeHead (uint16_t aConsumeLength)
void
Ajuste el búfer actual para indicar la cantidad de datos consumidos.
DataLength (void) const
uint16_t
Obtiene la longitud, en bytes, de los datos en el búfer de paquetes.
DetachTail (void)
Desconecte el búfer actual de su cadena y devuelva un puntero a los búferes restantes.
EnsureReservedSize (uint16_t aReservedSize)
bool
Asegúrese de que el búfer tenga al menos la cantidad especificada de espacio reservado.
MaxDataLength (void) const
uint16_t
Obtenga la cantidad máxima, en bytes, de datos que cabrán en el búfer dada la posición de inicio actual y el tamaño del búfer.
Next (void) const
Lleva el puntero al siguiente búfer de la cadena.
ReservedSize (void) const
uint16_t
Obtiene el número de bytes dentro del búfer actual entre el inicio del búfer y la posición de inicio de datos actual.
SetDataLength (uint16_t aNewLen, PacketBuffer *aChainHead)
void
Configure la longitud, en bytes, de los datos en el búfer, ajustando la longitud total en consecuencia.
SetStart (uint8_t *aNewStart)
void
Establezca los datos de inicio en el búfer, ajustando la longitud y la longitud total en consecuencia.
Start (void) const
uint8_t *
Obtener el puntero al inicio de los datos en el búfer.
TotalLength (void) const
uint16_t
Obtenga la longitud total de los paquetes de datos en la cadena de búfer.

Funciones estáticas públicas

Free ( PacketBuffer *aPacket)
void
Libera todos los búferes de paquetes de una cadena.
FreeHead ( PacketBuffer *aPacket)
Libera el primer búfer de una cadena y devuelve un puntero a los búferes restantes.
New (void)
Asigna un único PacketBuffer de tamaño máximo predeterminado ( WEAVE_SYSTEM_CONFIG_PACKETBUFFER_CAPACITY_MAX ) con defecto tamaño reservado ( WEAVE_SYSTEM_CONFIG_HEADER_RESERVE_SIZE ) en la carga útil.
New (uint16_t aReservedSize)
Asigna un único PacketBuffer de tamaño total máximo con un tamaño de la reserva de encabezado específico.
NewWithAvailableSize (size_t aAvailableSize)
Asigna un PacketBuffer con defecto reservado tamaño ( WEAVE_SYSTEM_CONFIG_HEADER_RESERVE_SIZE ) en la carga útil para las cabeceras, y al menos aAllocSize bytes de espacio para los datos adicionales después el puntero del cursor inicial.
NewWithAvailableSize (uint16_t aReservedSize, size_t aAvailableSize)
Asigna un PacketBuffer objeto con al menos aReservedSize bytes reservados en la carga útil para las cabeceras, y al menos aAllocSize bytes de espacio para los datos adicionales después el puntero del cursor inicial.
RightSize ( PacketBuffer *aPacket)
Copie el búfer dado en un búfer de tamaño adecuado si corresponde.

Funciones publicas

AddRef

void AddRef(
  void
)

Incrementa el recuento de referencia del búfer actual.

AddToEnd

void AddToEnd(
  PacketBuffer *aPacket
)

Agregue el búfer de paquetes dado al final de la cadena de búfer, ajustando la longitud total de cada búfer en la cadena en consecuencia.

Detalles
Parámetros
[in] aPacket
- el búfer de paquetes que se agregará al final de la cadena actual.

AlignPayload

bool AlignPayload(
  uint16_t aAlignBytes
)

Alinee la carga útil del búfer en el límite de bytes especificado.

Moviendo la carga útil en el búfer hacia adelante si es necesario.

Detalles
Parámetros
[in] aAlignBytes
- especifica el número de bytes de alineación para el puntero de inicio de la carga útil.
Devoluciones
true si la alineación es correcta, false si no hay suficiente espacio en la memoria intermedia.

AllocSize

size_t AllocSize(
  void
) const 

Devolver el tamaño de la asignación incluyendo los espacios de datos reservados y de carga útil, pero sin incluir el espacio asignado para el PacketBuffer estructura.

Detalles
Devoluciones
tamaño de la asignación

AvailableDataLength

uint16_t AvailableDataLength(
  void
) const 

Obtenga el número de bytes de datos que se pueden agregar al búfer actual dada la posición de inicio actual y la longitud de los datos.

Detalles
Devoluciones
la longitud, en bytes, de los datos que cabrán en el búfer actual dada la posición de inicio actual y la longitud de los datos.

CompactHead

void CompactHead(
  void
)

Mueva los datos de los búferes posteriores de la cadena al búfer actual hasta que esté lleno.

Solo se compacta el búfer actual: los datos dentro del búfer actual se mueven al frente del búfer, eliminando cualquier espacio reservado. El espacio disponible restante se llena con los datos que se mueven desde los búferes posteriores de la cadena, hasta que se llena el búfer actual. Si un búfer posterior de la cadena se mueve al búfer actual en su totalidad, se elimina de la cadena y se libera. El método no toma parámetros, no devuelve resultados y no puede fallar.

Consumir

PacketBuffer * Consume(
  uint16_t aConsumeLength
)

Consume datos en una cadena de búferes.

Consumir datos en una cadena de búferes comenzando con el búfer actual y siguiendo con los búferes restantes de la cadena. Cada búfer que se consume por completo se libera y la función devuelve el primer búfer (si lo hay) que contiene los datos restantes. El búfer actual debe ser el encabezado de la cadena de búfer.

Detalles
Parámetros
[in] aConsumeLength
- número de bytes a consumir de la cadena actual.
Devoluciones
el primer búfer de la cadena actual que contiene los datos restantes. Si no quedan datos, se devuelve NULL.

ConsumeHead

void ConsumeHead(
  uint16_t aConsumeLength
)

Ajuste el búfer actual para indicar la cantidad de datos consumidos.

Avance la posición de inicio de datos en el búfer actual en la cantidad especificada, en bytes, hasta la longitud de los datos en el búfer. Disminuya la longitud y la longitud total por la cantidad consumida.

Detalles
Parámetros
[in] aConsumeLen
- número de bytes a consumir del búfer actual.

Longitud de datos

uint16_t DataLength(
  void
) const 

Obtiene la longitud, en bytes, de los datos en el búfer de paquetes.

Detalles
Devoluciones
longitud, en bytes (longitud de carga útil actual).

Separar Cola

PacketBuffer * DetachTail(
  void
)

Desconecte el búfer actual de su cadena y devuelva un puntero a los búferes restantes.

El búfer actual debe ser el jefe de la cadena.

Detalles
Devoluciones
la cola de la cadena de búfer actual o NULL si el búfer actual es el único búfer de la cadena.

GarantizarReservadoSize

bool EnsureReservedSize(
  uint16_t aReservedSize
)

Asegúrese de que el búfer tenga al menos la cantidad especificada de espacio reservado.

Asegúrese de que el búfer tenga al menos la cantidad especificada de espacio reservado moviendo los datos en el búfer hacia adelante para hacer espacio si es necesario.

Detalles
Parámetros
[in] aReservedSize
- número de bytes deseados para los encabezados.
Devoluciones
true si el tamaño reservado solicitada está disponible, false si no hay suficiente espacio en la memoria intermedia.

MaxDataLength

uint16_t MaxDataLength(
  void
) const 

Obtenga la cantidad máxima, en bytes, de datos que cabrán en el búfer dada la posición inicial actual y el tamaño del búfer.

Detalles
Devoluciones
número de bytes que cabe en el búfer dada la posición de inicio actual.

próximo

PacketBuffer * Next(
  void
) const 

Lleva el puntero al siguiente búfer de la cadena.

Detalles
Devoluciones
un puntero al siguiente búfer de la cadena. NULL se devuelve cuando no hay memorias intermedias en la cadena.

ReservedSize

uint16_t ReservedSize(
  void
) const 

Obtiene el número de bytes dentro del búfer actual entre el inicio del búfer y la posición de inicio de datos actual.

Detalles
Devoluciones
la cantidad, en bytes, de espacio entre el inicio del búfer y la posición actual de inicio de los datos.

SetDataLength

void SetDataLength(
  uint16_t aNewLen,
  PacketBuffer *aChainHead
)

Establezca la longitud, en bytes, de los datos en el búfer, ajustando la longitud total en consecuencia.

La función establece la longitud, en bytes, de los datos en el búfer, ajustando la longitud total apropiadamente. Cuando la memoria intermedia no es la cabeza de la cadena del buffer (caso común: la persona que llama añade datos a la última memoria intermedia en el PacketBuffer cadena antes de llamar a las capas más altas), la aChainHead se debe pasar para ajustar adecuadamente las longitudes totales de cada uno por delante búfer del búfer actual.

Detalles
Parámetros
[in] aNewLen
- nueva longitud, en bytes, de este búfer.
[in,out] aChainHead
- la cabecera de la cadena de búfer a la que pertenece el búfer actual. Puede ser NULL si el búfer actual es el encabezado de la cadena de búfer.

Seleccione arranque

void SetStart(
  uint8_t *aNewStart
)

Establezca los datos de inicio en el búfer, ajustando la longitud y la longitud total en consecuencia.

Detalles
Parámetros
[in] aNewStart
- Un puntero al lugar donde debe comenzar la nueva carga útil. NEWSTART será ajustado internamente para caer dentro de los límites de la primera memoria intermedia en el PacketBuffer cadena.

Comienzo

uint8_t * Start(
  void
) const 

Obtiene el puntero al inicio de los datos en el búfer.

Detalles
Devoluciones
puntero al inicio de los datos.

Largo total

uint16_t TotalLength(
  void
) const 

Obtenga la longitud total de los paquetes de datos en la cadena de búfer.

Detalles
Devoluciones
longitud total, en octetos.

Funciones estáticas públicas

Libre

void Free(
  PacketBuffer *aPacket
)

Libera todos los búferes de paquetes de una cadena.

Disminuya el recuento de referencias a todos los búferes de la cadena actual. Si el recuento de referencias llega a 0, los búferes respectivos se liberan o se devuelven a los grupos de asignación según corresponda. Por regla general, los usuarios deben tratar a este método como un equivalente de free() función y no utilizar el argumento después de la llamada.

Detalles
Parámetros
[in] aPacket
- búfer de paquetes a liberar.

FreeHead

PacketBuffer * FreeHead(
  PacketBuffer *aPacket
)

Libera el primer búfer de una cadena y devuelve un puntero a los búferes restantes.

* @note When the buffer chain is referenced by multiple callers, FreeHead () `se separará la cabeza, pero no la fuerza desasignar la memoria intermedia de la cabeza.

Detalles
Parámetros
[in] aPacket
- cadena tampón.
Devoluciones
cadena de búfer de paquetes consiste en la cola de la memoria intermedia de entrada (puede ser NULL ).

Nuevo

PacketBuffer * New(
  void
)

Asigna un único PacketBuffer de tamaño máximo predeterminado ( WEAVE_SYSTEM_CONFIG_PACKETBUFFER_CAPACITY_MAX ) con defecto tamaño reservado ( WEAVE_SYSTEM_CONFIG_HEADER_RESERVE_SIZE ) en la carga útil.

El tamaño reservado ( WEAVE_SYSTEM_CONFIG_HEADER_RESERVE_SIZE ) es suficientemente grande para cabeceras de capa de transporte de retención, así como cabeceras requerido por WeaveMessageLayer y WeaveExchangeLayer .

Nuevo

PacketBuffer * New(
  uint16_t aReservedSize
)

Asigna un único PacketBuffer de tamaño total máximo con un tamaño de la reserva de encabezado específico.

El parámetro pasado en es el tamaño reservado antes de la carga útil para acomodar paquetes cabeceras de diferentes capas de la pila, no el tamaño total de la memoria intermedia de asignar. El tamaño de la memoria intermedia WEAVE_SYSTEM_CONFIG_PACKETBUFFER_CAPACITY_MAX y no, establecido en la convocatoria.

  • PacketBuffer::New(0) : cuando se le llama de esta manera, el buffer será devuelto sin los encabezados de reservada, por consiguiente, toda la carga útil puede ser usado por la persona que llama. Este patrón es particularmente útil en las capas inferiores de pilas de redes, en los casos en que el usuario conoce la carga útil se copiará a cabo en el mensaje final con reservas de cabecera apropiado o en la creación de PacketBuffer que se añade a una cadena de PacketBuffer través PacketBuffer::AddToEnd() . Parámetros
    [in] aReservedSize
    cantidad de espacio de encabezado para reservar.
    Devoluciones
    En caso de éxito, un puntero a la PacketBuffer , en caso de fallo NULL .

NewWithAvailableSize

PacketBuffer * NewWithAvailableSize(
  size_t aAvailableSize
)

Asigna un PacketBuffer con defecto reservado tamaño ( WEAVE_SYSTEM_CONFIG_HEADER_RESERVE_SIZE ) en la carga útil para las cabeceras, y al menos aAllocSize bytes de espacio para los datos adicionales después el puntero del cursor inicial.

Este uso es más adecuado cuando la asignación de un PacketBuffer para un mensaje de capa de aplicación.

Detalles
Parámetros
[in] aAvailableSize
Número de octetos para asignar después del cursor.
Devoluciones
En caso de éxito, un puntero a la PacketBuffer en el bloque asignado. En caso de error, NULL . *

NewWithAvailableSize

PacketBuffer * NewWithAvailableSize(
  uint16_t aReservedSize,
  size_t aAvailableSize
)

Asigna un PacketBuffer objeto con al menos aReservedSize bytes reservados en la carga útil para las cabeceras, y al menos aAllocSize bytes de espacio para los datos adicionales después el puntero del cursor inicial.

Detalles
Parámetros
[in] aReservedSize
Número de octetos para reservar detrás del cursor.
[in] aAvailableSize
Número de octetos para asignar después del cursor.
Devoluciones
En caso de éxito, un puntero a la PacketBuffer en el bloque asignado. En caso de error, NULL .

Talla correcta

PacketBuffer * RightSize(
  PacketBuffer *aPacket
)

Copie el búfer dado en un búfer de tamaño adecuado si corresponde.

Esta función no es operativa para los enchufes.

Detalles
Parámetros
[in] aPacket
- tampón o cadena tampón.
Devoluciones
nuevo búfer de paquetes o el búfer original