nl:: Weave:: System:: PacketBuffer
#include <src/system/SystemPacketBuffer.h>
La clase de búfer de paquetes es la estructura principal utilizada para manipular paquetes de datos serializados en octeto, generalmente en el contexto de una red de comunicación de datos, como Bluetooth o el protocolo de Internet.
Resumen
En entornos basados en LwIP, esta clase se compila sobre la estructura pbuf definida en esa biblioteca. Ante la ausencia de LwIP, Weave proporciona una implementación basada en malloc o una basada en grupos que se acerca mucho a los desafíos de memoria de los dispositivos profundamente incorporados.
La clase PacketBuffer, al igual que muchas estructuras similares que se usan en las pilas de red en capas, proporciona un mecanismo para reservar espacio para encabezados de protocolo en cada capa de una pila de comunicación configurable. Para obtener más información, consulta PacketBuffer::New()
y la documentación de LwIP.
Los objetos PacketBuffer se cuentan por referencia, y el modo de uso predominante en Weave es "activar y olvidar". Como el paquete (y su objeto PacketBuffer subyacente) se despacha a través de varias capas de protocolo, la llamada ascendente o descendente exitosa entre capas implica la transferencia de propiedad, y el destinatario es responsable de liberar el búfer. Si falla una llamada entre capas, la responsabilidad de liberar el búfer es responsabilidad del emisor.
Los objetos nuevos de la clase PacketBuffer se inicializan al comienzo de una asignación de memoria obtenida del entorno subyacente, p.ej., desde grupos de destino del pbuf de LwIP, desde el montón de la biblioteca C estándar, desde un grupo de búfer interno. En el caso simple, el tamaño del búfer de datos es WEAVE_SYSTEM_PACKETBUFFER_SIZE. Se proporciona un compositor que permite el uso de búferes de datos de otros tamaños.
Los objetos PacketBuffer pueden estar encadenados para adaptarse a cargas útiles más grandes. Sin embargo, el encadenamiento no es transparente, y los usuarios de la clase deben decidir de forma explícita que es compatible. Estos son algunos ejemplos de clases escritas con compatibilidad con el encadenamiento:
@ref nl::Weave::WeaveTLVReader @ref nl::Weave::WeaveTLVWriter
Herencia
Se hereda de: pbuf
Funciones públicas |
|
---|---|
AddRef(void)
|
void
Aumenta el recuento de referencias del búfer actual.
|
AddToEnd(PacketBuffer *aPacket)
|
void
Agrega el búfer de paquetes determinado al final de la cadena de búfer y ajusta la longitud total de cada búfer en la cadena según corresponda.
|
AlignPayload(uint16_t aAlignBytes)
|
bool
Alinea la carga útil del búfer con el límite de bytes especificado.
|
AllocSize(void) const
|
size_t
Muestra el tamaño de la asignación, incluidos los espacios de datos reservados y de carga útil, pero sin el espacio asignado para la estructura PacketBuffer.
|
AvailableDataLength(void) const
|
uint16_t
Obtiene la cantidad de bytes de datos que se pueden agregar al búfer actual según la posición inicial y la longitud de los datos actuales.
|
CompactHead(void)
|
void
Mueve los datos de los búferes posteriores de la cadena al búfer actual hasta que esté completo.
|
Consume(uint16_t aConsumeLength)
|
Consumir datos en una cadena de búferes.
|
ConsumeHead(uint16_t aConsumeLength)
|
void
Ajusta 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)
|
Desconecta el búfer actual de su cadena y muestra un puntero a los búferes restantes.
|
EnsureReservedSize(uint16_t aReservedSize)
|
bool
Asegúrate de que el búfer tenga al menos la cantidad especificada de espacio reservado.
|
MaxDataLength(void) const
|
uint16_t
Obtiene la cantidad máxima, en bytes, de datos que cabe en el búfer según la posición inicial y el tamaño del búfer actuales.
|
Next(void) const
|
Se obtiene el puntero al siguiente búfer de la cadena.
|
ReservedSize(void) const
|
uint16_t
Obtén la cantidad de bytes dentro del búfer actual entre su inicio y la posición de inicio de los datos actuales.
|
SetDataLength(uint16_t aNewLen, PacketBuffer *aChainHead)
|
void
Configura la longitud, en bytes, de los datos en búfer y ajusta la longitud total según corresponda.
|
SetStart(uint8_t *aNewStart)
|
void
Configura los datos de inicio en búfer y ajusta la longitud y la longitud total según corresponda.
|
Start(void) const
|
uint8_t *
Se obtiene un puntero para el inicio de los datos en búfer.
|
TotalLength(void) const
|
uint16_t
Obtiene la longitud total de los datos de un paquete en la cadena del 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 muestra un puntero a los búferes restantes.
|
New(void)
|
Asigna un solo PacketBuffer de tamaño máximo predeterminado (WEAVE_SYSTEM_CONFIG_PACKETBUFFER_CAPACITY_MAX) con tamaño reservado predeterminado (WEAVE_SYSTEM_CONFIG_HEADER_RESERVE_SIZE) en la carga útil.
|
New(uint16_t aReservedSize)
|
Asigna un solo PacketBuffer de tamaño total máximo con un tamaño de reserva de encabezado específico.
|
NewWithAvailableSize(size_t aAvailableSize)
|
Asigna un PacketBuffer con el tamaño reservado predeterminado (WEAVE_SYSTEM_CONFIG_HEADER_RESERVE_SIZE) en la carga útil para los encabezados y al menos
aAllocSize bytes de espacio para datos adicionales después del puntero inicial del cursor. |
NewWithAvailableSize(uint16_t aReservedSize, size_t aAvailableSize)
|
Asigna un objeto PacketBuffer con al menos
aReservedSize bytes reservados en la carga útil para los encabezados y al menos aAllocSize bytes de espacio para datos adicionales después del puntero inicial del cursor. |
RightSize(PacketBuffer *aPacket)
|
Copia el búfer determinado en un búfer del tamaño correcto, si corresponde.
|
Funciones públicas
AddRef
void AddRef( void )
Aumenta el recuento de referencias del búfer actual.
AddToEnd
void AddToEnd( PacketBuffer *aPacket )
Agrega el búfer de paquetes determinado al final de la cadena de búfer y ajusta la longitud total de cada búfer en la cadena según corresponda.
Detalles | |||
---|---|---|---|
Parámetros |
|
AlignPayload
bool AlignPayload( uint16_t aAlignBytes )
Alinea la carga útil del búfer con el límite de bytes especificado.
Mover la carga útil en el búfer hacia adelante si es necesario
Detalles | |||
---|---|---|---|
Parámetros |
|
||
Resultado que se muestra |
true si la alineación se realiza correctamente, false si no hay suficiente espacio en el búfer. |
AllocSize
size_t AllocSize( void ) const
Muestra el tamaño de la asignación, incluidos los espacios de datos reservados y de carga útil, pero sin el espacio asignado para la estructura PacketBuffer.
Detalles | |
---|---|
Resultado que se muestra |
tamaño de la asignación
|
AvailableDataLength
uint16_t AvailableDataLength( void ) const
Obtiene la cantidad de bytes de datos que se pueden agregar al búfer actual según la posición inicial y la longitud de los datos actuales.
Detalles | |
---|---|
Resultado que se muestra |
la longitud, en bytes, de los datos que se adaptarán al búfer actual según la posición inicial y la longitud de los datos actuales.
|
CompactHead
void CompactHead( void )
Mueve los datos de los búferes posteriores de la cadena al búfer actual hasta que esté completo.
Solo se compacta el búfer actual: los datos dentro del búfer actual se mueven al frente del búfer, lo que elimina el espacio reservado. El espacio disponible restante se llena con datos transferidos de los búferes posteriores de la cadena, hasta que el búfer actual esté completo. Si un búfer posterior de la cadena se traslada al búfer actual en su totalidad, se quita de la cadena y se libera. El método no toma parámetros, no muestra resultados y no puede fallar.
Consumo
PacketBuffer * Consume( uint16_t aConsumeLength )
Consumir datos en una cadena de búferes.
Consumir datos en una cadena de búferes comenzando con el búfer actual y pasando por los búferes restantes de la cadena. Cada búfer que se consume por completo se libera y la función muestra el primer búfer (si lo hubiera) que contiene los datos restantes. El búfer actual debe ser el encabezado de la cadena de búferes.
Detalles | |||
---|---|---|---|
Parámetros |
|
||
Resultado que se muestra |
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 )
Ajusta el búfer actual para indicar la cantidad de datos consumidos.
Avanza la posición de inicio de los datos en el búfer actual según la cantidad especificada, en bytes, hasta la longitud de los datos en el búfer. Disminuye la duración y la duración total según la cantidad consumida.
Detalles | |||
---|---|---|---|
Parámetros |
|
DataLength
uint16_t DataLength( void ) const
Obtiene la longitud, en bytes, de los datos en el búfer de paquetes.
Detalles | |
---|---|
Resultado que se muestra |
en bytes (longitud actual de la carga útil).
|
DetachTail
PacketBuffer * DetachTail( void )
Desconecta el búfer actual de su cadena y muestra un puntero a los búferes restantes.
El búfer actual debe ser el encabezado de la cadena.
Detalles | |
---|---|
Resultado que se muestra |
la cola de la cadena de búfer actual o NULL si el búfer actual es el único de la cadena.
|
EnsureReservedSize
bool EnsureReservedSize( uint16_t aReservedSize )
Asegúrate de que el búfer tenga al menos la cantidad especificada de espacio reservado.
Asegúrate de que el búfer tenga al menos la cantidad especificada de espacio reservado, moviendo los datos en el búfer hacia adelante para liberar espacio si es necesario.
Detalles | |||
---|---|---|---|
Parámetros |
|
||
Resultado que se muestra |
Es
true si el tamaño reservado solicitado está disponible y false si no hay suficiente espacio en el búfer. |
MaxDataLength
uint16_t MaxDataLength( void ) const
Obtiene la cantidad máxima, en bytes, de datos que cabe en el búfer según la posición inicial y el tamaño del búfer actuales.
Detalles | |
---|---|
Resultado que se muestra |
la cantidad de bytes que caben en el búfer según la posición inicial actual.
|
Siguiente
PacketBuffer * Next( void ) const
Se obtiene el puntero al siguiente búfer de la cadena.
Detalles | |
---|---|
Resultado que se muestra |
un puntero al siguiente búfer de la cadena. Se muestra
NULL cuando no hay búferes en la cadena. |
ReservedSize
uint16_t ReservedSize( void ) const
Obtén la cantidad de bytes dentro del búfer actual entre su inicio y la posición de inicio de los datos actuales.
Detalles | |
---|---|
Resultado que se muestra |
la cantidad, en bytes, de espacio entre el inicio del búfer y la posición de inicio de los datos actuales.
|
SetDataLength
void SetDataLength( uint16_t aNewLen, PacketBuffer *aChainHead )
Configura la longitud, en bytes, de los datos en búfer y ajusta la longitud total según corresponda.
La función establece la longitud, en bytes, de los datos en el búfer y ajusta la longitud total de forma adecuada. Cuando el búfer no es el principal de la cadena de búfer (caso común: el llamador agrega datos al último búfer en la cadena PacketBuffer antes de llamar a capas superiores), se debe pasar aChainHead para ajustar correctamente las longitudes totales de cada búfer antes del búfer actual.
Detalles | |||||
---|---|---|---|---|---|
Parámetros |
|
SetStart
void SetStart( uint8_t *aNewStart )
Configura los datos de inicio en búfer y ajusta la longitud y la longitud total según corresponda.
Detalles | |||
---|---|---|---|
Parámetros |
|
Iniciar
uint8_t * Start( void ) const
Se obtiene un puntero para el inicio de los datos en búfer.
Detalles | |
---|---|
Resultado que se muestra |
y el puntero hacia el inicio de los datos.
|
TotalLength
uint16_t TotalLength( void ) const
Obtiene la longitud total de los datos de un paquete en la cadena del búfer.
Detalles | |
---|---|
Resultado que se muestra |
la longitud total, en octetos.
|
Funciones estáticas públicas
Gratis
void Free( PacketBuffer *aPacket )
Libera todos los búferes de paquetes de una cadena.
Disminuye el recuento de referencias a todos los búferes en la cadena actual. Si el recuento de referencias alcanza 0, los búferes respectivos se liberan o se devuelven a los grupos de asignación según corresponda. Como regla, los usuarios deben tratar este método como un equivalente de la función free()
y no usar el argumento después de la llamada.
Detalles | |||
---|---|---|---|
Parámetros |
|
FreeHead
PacketBuffer * FreeHead( PacketBuffer *aPacket )
Libera el primer búfer de una cadena y muestra un puntero a los búferes restantes.
* @note When the buffer chain is referenced by multiple callers,
FreeHead() se separará, pero no anulará la asignación del búfer de manera forzosa.
Detalles | |||
---|---|---|---|
Parámetros |
|
||
Resultado que se muestra |
cadena de búfer de paquetes que consiste en la parte final del búfer de entrada (puede ser
NULL ). |
Nuevo
PacketBuffer * New( void )
Asigna un solo PacketBuffer de tamaño máximo predeterminado (WEAVE_SYSTEM_CONFIG_PACKETBUFFER_CAPACITY_MAX) con tamaño reservado predeterminado (WEAVE_SYSTEM_CONFIG_HEADER_RESERVE_SIZE) en la carga útil.
El tamaño reservado (WEAVE_SYSTEM_CONFIG_HEADER_RESERVE_SIZE) es lo suficientemente grande como para contener los encabezados de la capa de transporte, así como los encabezados requeridos para WeaveMessageLayer
y WeaveExchangeLayer
.
Nuevo
PacketBuffer * New( uint16_t aReservedSize )
Asigna un solo PacketBuffer de tamaño total máximo con un tamaño de reserva de encabezado específico.
El parámetro que se pasa es el tamaño reservado antes de la carga útil para adaptarse a los encabezados del paquete de diferentes capas de pila, no el tamaño total del búfer que se asignará. El tamaño del búfer WEAVE_SYSTEM_CONFIG_PACKETBUFFER_CAPACITY_MAX y no especificado en la llamada.
PacketBuffer::New(0)
: Cuando se llama de esta manera, el búfer se muestra sin ningún encabezado reservado, por lo que el llamador puede usar toda la carga útil. Este patrón es particularmente útil en las capas inferiores de las pilas de red, en los casos en que el usuario sabe que la carga útil se copiará en el mensaje final con las reservas de encabezado apropiadas o cuando se crea un PacketBuffer que se agrega a una cadena de PacketBuffer a través dePacketBuffer::AddToEnd()
. Parámetros[in] aReservedSize
cantidad de espacio de encabezado a reservar.Si la operación es exitosa, un puntero a PacketBuffer, si fallaNULL
.
NewWithAvailableSize
PacketBuffer * NewWithAvailableSize( size_t aAvailableSize )
Asigna un PacketBuffer con el tamaño reservado predeterminado (WEAVE_SYSTEM_CONFIG_HEADER_RESERVE_SIZE) en la carga útil para los encabezados y al menos aAllocSize
bytes de espacio para datos adicionales después del puntero inicial del cursor.
Este uso es el más apropiado cuando se asigna un PacketBuffer para un mensaje de la capa de la aplicación.
Detalles | |||
---|---|---|---|
Parámetros |
|
||
Resultado que se muestra |
Si se realiza de forma correcta, un puntero a PacketBuffer en el bloque asignado. En caso de error,
NULL . * |
NewWithAvailableSize
PacketBuffer * NewWithAvailableSize( uint16_t aReservedSize, size_t aAvailableSize )
Asigna un objeto PacketBuffer con al menos aReservedSize
bytes reservados en la carga útil para los encabezados y al menos aAllocSize
bytes de espacio para datos adicionales después del puntero inicial del cursor.
Detalles | |||||
---|---|---|---|---|---|
Parámetros |
|
||||
Resultado que se muestra |
Si se realiza de forma correcta, un puntero a PacketBuffer en el bloque asignado. En caso de error,
NULL . |
RightSize
PacketBuffer * RightSize( PacketBuffer *aPacket )
Copia el búfer determinado en un búfer del tamaño correcto, si corresponde.
Esta función es no-op para sockets.
Detalles | |||
---|---|---|---|
Parámetros |
|
||
Resultado que se muestra |
nuevo búfer de paquetes o el búfer original
|