nl:: Weave:: System:: PacketBuffer
#include <src/system/SystemPacketBuffer.h>
La classe di buffer dei pacchetti è la struttura principale utilizzata per manipolare pacchetti di dati serializzati a ottetto, di solito nel contesto di una rete di comunicazione dati come il Bluetooth o il protocollo Internet.
Riepilogo
Negli ambienti basati su LwIP, questa classe è basata sulla struttura pbuf definita nella libreria. In assenza di LwIP, Weave fornisce un'implementazione basata su Malloc o basata su pool che si avvicina molto alle sfide di memoria dei dispositivi profondamente incorporati.
La classe PacketBuffer, come molte strutture simili utilizzate negli stack di rete a più livelli, fornisce un meccanismo per riservare spazio per le intestazioni di protocollo su ciascun livello di uno stack di comunicazione configurabile. Per maggiori dettagli, consulta PacketBuffer::New()
e la documentazione LwIP.
Gli oggetti PacketBuffer vengono conteggiati per riferimento e la modalità di utilizzo prevalente in Weave è "fire-and-forget". Poiché il pacchetto (e l'oggetto PacketBuffer sottostante) viene inviato attraverso vari livelli di protocollo, l'upcall o il downcall riuscito tra i livelli implica il trasferimento della proprietà e il destinatario della chiamata è responsabile di liberare il buffer. In caso di errore di una chiamata cross-layer, la responsabilità di liberare il buffer resta del chiamante.
I nuovi oggetti della classe PacketBuffer vengono inizializzati all'inizio di un'allocazione di memoria ottenuta dall'ambiente sottostante, ad esempio da pool di destinazione pbuf LwIP, dall'heap della libreria C standard, da un pool di buffer interno. In questo caso, la dimensione del buffer è WEAVE_SYSTEM_PACKETBUFFER_SIZE. È fornito un compositore che consente l'utilizzo di buffer di dati di altre dimensioni.
Gli oggetti PacketBuffer possono essere concatenati per ospitare payload più grandi. Il concatenamento, tuttavia, non è trasparente e gli utenti della classe devono decidere esplicitamente se supportarlo. Ecco alcuni esempi di classi scritte con il supporto per concatenamento:
@ref nl::Weave::WeaveTLVReader @ref nl::Weave::WeaveTLVWriter
Eredità
Eredita da: pbuf
Funzioni pubbliche |
|
---|---|
AddRef(void)
|
void
Aumenta il conteggio dei riferimenti del buffer attuale.
|
AddToEnd(PacketBuffer *aPacket)
|
void
Aggiungi il buffer di pacchetti specificato alla fine della catena, regolando di conseguenza la lunghezza totale di ciascun buffer nella catena.
|
AlignPayload(uint16_t aAlignBytes)
|
bool
Allinea il payload del buffer al limite di byte specificato.
|
AllocSize(void) const
|
size_t
Restituisce la dimensione dell'allocazione, inclusi gli spazi di dati riservati e di payload, ma escluso lo spazio allocato per la struttura PacketBuffer.
|
AvailableDataLength(void) const
|
uint16_t
Ottieni il numero di byte di dati che possono essere aggiunti al buffer attuale in base alla posizione iniziale e alla lunghezza dei dati correnti.
|
CompactHead(void)
|
void
Sposta i dati dai buffer successivi della catena nel buffer attuale fino a esaurimento.
|
Consume(uint16_t aConsumeLength)
|
Consuma i dati in una catena di buffer.
|
ConsumeHead(uint16_t aConsumeLength)
|
void
Regola il buffer attuale per indicare la quantità di dati consumati.
|
DataLength(void) const
|
uint16_t
Ottieni la lunghezza, in byte, dei dati nel buffer di pacchetti.
|
DetachTail(void)
|
Scollega il buffer corrente dalla sua catena e restituisce un puntatore ai buffer rimanenti.
|
EnsureReservedSize(uint16_t aReservedSize)
|
bool
Assicurati che il buffer abbia almeno la quantità specificata di spazio riservato.
|
MaxDataLength(void) const
|
uint16_t
Ottieni la quantità massima, in byte, di dati che possono essere inseriti nel buffer in base alla posizione iniziale e alle dimensioni del buffer attuali.
|
Next(void) const
|
Ottieni il puntatore al buffer successivo nella catena.
|
ReservedSize(void) const
|
uint16_t
Ottieni il numero di byte all'interno del buffer attuale tra l'inizio del buffer e la posizione di inizio dei dati corrente.
|
SetDataLength(uint16_t aNewLen, PacketBuffer *aChainHead)
|
void
Imposta la lunghezza, in byte, dei dati nel buffer, regolando la lunghezza totale di conseguenza.
|
SetStart(uint8_t *aNewStart)
|
void
Imposta i dati iniziali nel buffer, regolando di conseguenza la lunghezza e la lunghezza totale.
|
Start(void) const
|
uint8_t *
Ottieni il puntatore all'inizio dei dati nel buffer.
|
TotalLength(void) const
|
uint16_t
Ottieni la lunghezza totale dei dati dei pacchetti nella catena di buffer.
|
Funzioni statiche pubbliche |
|
---|---|
Free(PacketBuffer *aPacket)
|
void
Libera tutti i buffer dei pacchetti in una catena.
|
FreeHead(PacketBuffer *aPacket)
|
Libera il primo buffer di una catena, restituendo un puntatore ai buffer rimanenti.
|
New(void)
|
Alloca un singolo PacketBuffer di dimensione massima predefinita (WEAVE_SYSTEM_CONFIG_PACKETBUFFER_CAPACITY_MAX) con dimensione riservata predefinita (WEAVE_SYSTEM_CONFIG_HEADER_RESERVE_SIZE) nel payload.
|
New(uint16_t aReservedSize)
|
Alloca un singolo PacketBuffer di dimensione totale massima con una dimensione specifica della riserva di intestazioni.
|
NewWithAvailableSize(size_t aAvailableSize)
|
Alloca un PacketBuffer con una dimensione riservata predefinita (WEAVE_SYSTEM_CONFIG_HEADER_RESERVE_SIZE) nel payload per le intestazioni e almeno
aAllocSize byte di spazio per i dati aggiuntivi dopo il puntatore iniziale del cursore. |
NewWithAvailableSize(uint16_t aReservedSize, size_t aAvailableSize)
|
Alloca un oggetto PacketBuffer con almeno
aReservedSize byte riservati nel payload per le intestazioni e almeno aAllocSize byte di spazio per i dati aggiuntivi dopo il puntatore iniziale del cursore. |
RightSize(PacketBuffer *aPacket)
|
Copia il buffer specificato in un buffer di dimensioni corrette, se applicabile.
|
Funzioni pubbliche
AddRef
void AddRef( void )
Aumenta il conteggio dei riferimenti del buffer attuale.
AddToEnd
void AddToEnd( PacketBuffer *aPacket )
Aggiungi il buffer di pacchetti specificato alla fine della catena, regolando di conseguenza la lunghezza totale di ciascun buffer nella catena.
Dettagli | |||
---|---|---|---|
Parametri |
|
AlignPayload
bool AlignPayload( uint16_t aAlignBytes )
Allinea il payload del buffer al limite di byte specificato.
Sposta il payload nel buffer in avanti, se necessario.
Dettagli | |||
---|---|---|---|
Parametri |
|
||
Restituisce |
true se l'allineamento riesce, false se non c'è abbastanza spazio nel buffer. |
AllocSize
size_t AllocSize( void ) const
Restituisce la dimensione dell'allocazione, inclusi gli spazi di dati riservati e di payload, ma escluso lo spazio allocato per la struttura PacketBuffer.
Dettagli | |
---|---|
Restituisce |
dimensione dell'allocazione
|
AvailableDataLength
uint16_t AvailableDataLength( void ) const
Ottieni il numero di byte di dati che possono essere aggiunti al buffer attuale in base alla posizione iniziale e alla lunghezza dei dati correnti.
Dettagli | |
---|---|
Restituisce |
la lunghezza, in byte, dei dati che rientreranno nel buffer attuale in base alla posizione iniziale e alla lunghezza dei dati correnti.
|
CompactHead
void CompactHead( void )
Sposta i dati dai buffer successivi della catena nel buffer attuale fino a esaurimento.
Viene compattato solo il buffer attuale: i dati all'interno del buffer vengono spostati nella parte anteriore del buffer, eliminando lo spazio riservato. Lo spazio disponibile rimanente viene riempito di dati spostati dai buffer successivi della catena, finché il buffer attuale non è pieno. Se un buffer successivo della catena viene spostato completamente nel buffer corrente, viene rimosso dalla catena e liberato. Il metodo non accetta parametri, non restituisce risultati e non può avere esito negativo.
Consuma
PacketBuffer * Consume( uint16_t aConsumeLength )
Consuma i dati in una catena di buffer.
Consumare i dati in una catena di buffer che inizia con il buffer attuale e prosegue attraverso i buffer rimanenti della catena. Ogni buffer completamente utilizzato viene liberato e la funzione restituisce il primo buffer (se presente) contenente i dati rimanenti. Il buffer attuale deve essere l'intestazione della catena di buffer.
Dettagli | |||
---|---|---|---|
Parametri |
|
||
Restituisce |
il primo buffer della catena corrente che contiene eventuali dati rimanenti. Se non rimangono dati, viene restituito un valore NULL.
|
ConsumeHead
void ConsumeHead( uint16_t aConsumeLength )
Regola il buffer attuale per indicare la quantità di dati consumati.
Fai avanzare la posizione iniziale dei dati nel buffer attuale in base alla quantità specificata, in byte, fino alla lunghezza dei dati nel buffer. Riduci la durata e la durata totale in base all'importo consumato.
Dettagli | |||
---|---|---|---|
Parametri |
|
DataLength
uint16_t DataLength( void ) const
Ottieni la lunghezza, in byte, dei dati nel buffer di pacchetti.
Dettagli | |
---|---|
Restituisce |
lunghezza del payload, in byte (lunghezza del payload attuale).
|
DetachTail
PacketBuffer * DetachTail( void )
Scollega il buffer corrente dalla sua catena e restituisce un puntatore ai buffer rimanenti.
Il buffer attuale deve essere l'intestazione della catena.
Dettagli | |
---|---|
Restituisce |
alla coda della catena di buffer attuale oppure NULL se il buffer attuale è l'unico buffer della catena.
|
EnsureReservedSize
bool EnsureReservedSize( uint16_t aReservedSize )
Assicurati che il buffer abbia almeno la quantità specificata di spazio riservato.
Assicurati che il buffer abbia almeno la quantità di spazio riservato specificata, spostando i dati nel buffer in avanti per liberare spazio, se necessario.
Dettagli | |||
---|---|---|---|
Parametri |
|
||
Restituisce |
true se la dimensione prenotata richiesta è disponibile, false se non c'è abbastanza spazio nel buffer. |
MaxDataLength
uint16_t MaxDataLength( void ) const
Ottieni la quantità massima, in byte, di dati che possono essere inseriti nel buffer in base alla posizione iniziale e alle dimensioni attuali del buffer.
Dettagli | |
---|---|
Restituisce |
di byte che rientrano nel buffer data la posizione iniziale corrente.
|
Avanti
PacketBuffer * Next( void ) const
Ottieni il puntatore al buffer successivo nella catena.
Dettagli | |
---|---|
Restituisce |
un puntatore al buffer successivo nella catena.
NULL viene restituito quando la catena non contiene buffer. |
ReservedSize
uint16_t ReservedSize( void ) const
Ottieni il numero di byte all'interno del buffer attuale tra l'inizio del buffer e la posizione di inizio dei dati corrente.
Dettagli | |
---|---|
Restituisce |
la quantità, in byte, di spazio tra l'inizio del buffer e la posizione di inizio dei dati corrente.
|
SetDataLength
void SetDataLength( uint16_t aNewLen, PacketBuffer *aChainHead )
Imposta la lunghezza, in byte, dei dati nel buffer, regolando la lunghezza totale di conseguenza.
La funzione imposta la lunghezza, in byte, dei dati nel buffer, regolando in modo appropriato la lunghezza totale. Quando il buffer non è l'head della catena di buffer (caso comune: il chiamante aggiunge dati all'ultimo buffer nella catena PacketBuffer prima di chiamare strati più alti), aChainHead deve essere passato in modo da regolare correttamente le lunghezze totali di ciascun buffer davanti al buffer corrente.
Dettagli | |||||
---|---|---|---|---|---|
Parametri |
|
SetStart
void SetStart( uint8_t *aNewStart )
Imposta i dati iniziali nel buffer, regolando di conseguenza la lunghezza e la lunghezza totale.
Dettagli | |||
---|---|---|---|
Parametri |
|
Inizia
uint8_t * Start( void ) const
Ottieni il puntatore all'inizio dei dati nel buffer.
Dettagli | |
---|---|
Restituisce |
all'inizio dei dati.
|
TotalLength
uint16_t TotalLength( void ) const
Ottieni la lunghezza totale dei dati dei pacchetti nella catena di buffer.
Dettagli | |
---|---|
Restituisce |
lunghezza totale, in ottetti.
|
Funzioni statiche pubbliche
Gratis
void Free( PacketBuffer *aPacket )
Libera tutti i buffer dei pacchetti in una catena.
Riduci il conteggio dei riferimenti a tutti i buffer nella catena attuale. Se il conteggio dei riferimenti raggiunge 0, i rispettivi buffer vengono liberati o restituiti ai pool di allocazione, a seconda dei casi. Come regola, gli utenti devono considerare questo metodo come un equivalente della funzione free()
e non utilizzare l'argomento dopo la chiamata.
Dettagli | |||
---|---|---|---|
Parametri |
|
FreeHead
PacketBuffer * FreeHead( PacketBuffer *aPacket )
Libera il primo buffer di una catena, restituendo un puntatore ai buffer rimanenti.
* @note When the buffer chain is referenced by multiple callers,
FreeHead()` scollega la head, ma non deallando forzatamente il buffer head.
Dettagli | |||
---|---|---|---|
Parametri |
|
||
Restituisce |
catena di buffer di pacchetti costituita dalla coda del buffer di input (potrebbe essere
NULL ). |
Nuovo
PacketBuffer * New( void )
Alloca un singolo PacketBuffer di dimensione massima predefinita (WEAVE_SYSTEM_CONFIG_PACKETBUFFER_CAPACITY_MAX) con dimensione riservata predefinita (WEAVE_SYSTEM_CONFIG_HEADER_RESERVE_SIZE) nel payload.
La dimensione riservata (WEAVE_SYSTEM_CONFIG_HEADER_RESERVE_SIZE) è sufficientemente grande da contenere le intestazioni del livello di trasporto, così come le intestazioni richieste da WeaveMessageLayer
e WeaveExchangeLayer
.
Nuovo
PacketBuffer * New( uint16_t aReservedSize )
Alloca un singolo PacketBuffer di dimensione totale massima con una dimensione specifica della riserva di intestazioni.
Il parametro passato corrisponde alla dimensione riservata prima del payload per contenere le intestazioni dei pacchetti da diversi livelli di stack, non la dimensione complessiva del buffer da allocare. Le dimensioni del buffer WEAVE_SYSTEM_CONFIG_PACKETBUFFER_CAPACITY_MAX e non, specificate nella chiamata.
PacketBuffer::New(0)
: quando viene chiamato in questo modo, il buffer viene restituito senza nessuna intestazione riservata, di conseguenza l'intero payload è utilizzabile dal chiamante. Questo pattern è particolarmente utile nei livelli inferiori degli stack di rete, nei casi in cui l'utente sa che il payload verrà copiato nel messaggio finale con riserve di intestazioni appropriate o nella creazione di PacketBuffer che vengono aggiunti a una catena di PacketBuffer tramitePacketBuffer::AddToEnd()
. Parametri[in] aReservedSize
di spazio di intestazione da riservare.In caso di esito positivo, un puntatore a PacketBuffer, in caso di erroreNULL
.
NewWithAvailableSize
PacketBuffer * NewWithAvailableSize( size_t aAvailableSize )
Alloca un PacketBuffer con una dimensione riservata predefinita (WEAVE_SYSTEM_CONFIG_HEADER_RESERVE_SIZE) nel payload per le intestazioni e almeno aAllocSize
byte di spazio per i dati aggiuntivi dopo il puntatore iniziale del cursore.
Questo utilizzo è più appropriato quando si alloca un PacketBuffer per un messaggio a livello di applicazione.
Dettagli | |||
---|---|---|---|
Parametri |
|
||
Restituisce |
Se l'operazione riesce, un puntatore a PacketBuffer nel blocco allocato. In caso di errore,
NULL . * |
NewWithAvailableSize
PacketBuffer * NewWithAvailableSize( uint16_t aReservedSize, size_t aAvailableSize )
Alloca un oggetto PacketBuffer con almeno aReservedSize
byte riservati nel payload per le intestazioni e almeno aAllocSize
byte di spazio per i dati aggiuntivi dopo il puntatore iniziale del cursore.
Dettagli | |||||
---|---|---|---|---|---|
Parametri |
|
||||
Restituisce |
Se l'operazione riesce, un puntatore a PacketBuffer nel blocco allocato. In caso di errore,
NULL . |
RightSize
PacketBuffer * RightSize( PacketBuffer *aPacket )
Copia il buffer specificato in un buffer di dimensioni corrette, se applicabile.
Questa funzione è autonoma per i socket.
Dettagli | |||
---|---|---|---|
Parametri |
|
||
Restituisce |
nuovo buffer di pacchetti o il buffer originale
|