nl:: Weave:: Sistema:: PacketBuffer
#include <src/system/SystemPacketBuffer.h>
La classe del buffer di pacchetto è la struttura principale utilizzata per manipolare i pacchetti di dati serializzati da ottetti, di solito nel contesto di una rete di comunicazione di dati, come il Bluetooth o il protocollo Internet.
Riepilogo
In ambienti basati su LwIP, questa classe si basa sulla struttura pbuf definita in quella libreria. In assenza di LwIP, Weave fornisce un'implementazione basata su Malloc o un'implementazione basata su pool che assomiglia molto alle sfide della memoria dei dispositivi profondamente incorporati.
La classe PacketBuffer, come molte strutture simili utilizzate negli stack di rete a strati, offre un meccanismo per riservare spazio per le intestazioni di protocollo a ogni livello di uno stack di comunicazione configurabile. Per i dettagli, consulta la PacketBuffer::New()
e la documentazione di LwIP.
Gli oggetti PacketBuffer sono conteggiati come riferimento e la modalità di utilizzo prevalente in Weave è "fire-and-forget". Poiché il pacchetto (e il relativo oggetto PacketBuffer sottostante) viene inviato tramite vari livelli di protocollo, la richiesta positiva o negativa tra i livelli implica il trasferimento della proprietà e il chiamante ha la responsabilità di liberare il buffer. In caso di errore di una chiamata tra più livelli, la responsabilità di liberare il buffer spetta al chiamante.
I nuovi oggetti della classe PacketBuffer vengono inizializzati all'inizio di un'allocazione della memoria ottenuta dall'ambiente sottostante, ad esempio dai pool di destinazione LwIP pbuf, dall'heap della libreria C standard, da un pool del buffer interno. Nel caso semplice, la dimensione del buffer di dati è WEAVE_SYSTEM_PACKETBUFFER_SIZE. Viene fornito un compositore che consente l'utilizzo di buffer di dati di altre dimensioni.
Gli oggetti PacketBuffer possono essere concatenati per supportare payload più grandi. Tuttavia, la concatenazione non è trasparente e gli utenti della classe devono decidere esplicitamente di supportare il concatenamento. Ecco alcuni esempi di corsi che supportano il concatenamento dell'assistenza:
@ref nl::Weave::WeaveTLVReader @ref nl::Weave::WeaveTLVWriter
Eredità
Eredita da: pbuf
Funzioni pubbliche |
|
---|---|
AddRef(void)
|
void
Incrementa il conteggio dei riferimenti del buffer corrente.
|
AddToEnd(PacketBuffer *aPacket)
|
void
Aggiungi il buffer di pacchetto specificato alla fine della catena di buffer, regolando di conseguenza la lunghezza totale di ogni buffer.
|
AlignPayload(uint16_t aAlignBytes)
|
bool
Allinea il payload del buffer al limite di byte specificato.
|
AllocSize(void) const
|
size_t
Restituisce le dimensioni dell'allocazione inclusi gli spazi dei dati riservati e di payload, ma non lo spazio assegnato per la struttura di PacketBuffer.
|
AvailableDataLength(void) const
|
uint16_t
Recupera il numero di byte di dati che possono essere aggiunti al buffer corrente, data la posizione iniziale e la lunghezza dei dati correnti.
|
CompactHead(void)
|
void
Spostare i dati dai buffer successivi della catena al buffer corrente fino a quando non è pieno.
|
Consume(uint16_t aConsumeLength)
|
Consumo di dati in una catena di buffer.
|
ConsumeHead(uint16_t aConsumeLength)
|
void
Regola il buffer corrente per indicare la quantità di dati utilizzati.
|
DataLength(void) const
|
uint16_t
Ottieni la lunghezza in byte dei dati nel buffer di pacchetto.
|
DetachTail(void)
|
Scollega il buffer corrente dalla 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 rientra nel buffer in base alla posizione di partenza e alla dimensione del buffer correnti.
|
Next(void) const
|
Ottieni il puntatore del buffer successivo nella catena.
|
ReservedSize(void) const
|
uint16_t
Ottenere il numero di byte all'interno del buffer corrente tra l'inizio del buffer e la posizione iniziale dei dati.
|
SetDataLength(uint16_t aNewLen, PacketBuffer *aChainHead)
|
void
Imposta la lunghezza in byte dei dati nel buffer e regola la lunghezza totale di conseguenza.
|
SetStart(uint8_t *aNewStart)
|
void
Imposta i dati di avvio nel buffer, regolando la lunghezza e la lunghezza totale di conseguenza.
|
Start(void) const
|
uint8_t *
Recupero del puntatore per iniziare i dati nel buffer.
|
TotalLength(void) const
|
uint16_t
Ottieni la lunghezza totale dei dati del pacchetto nella catena di buffer.
|
Funzioni pubbliche pubbliche |
|
---|---|
Free(PacketBuffer *aPacket)
|
void
Libera tutti i buffer di pacchetto 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 della dimensione totale massima con una dimensione specifica della riserva di intestazione.
|
NewWithAvailableSize(size_t aAvailableSize)
|
Alloca un PacketBuffer con dimensione riservata predefinita (WEAVE_SYSTEM_CONFIG_header_RESERVE_SIZE) nel payload per le intestazioni e almeno
aAllocSize byte di spazio per ulteriori dati dopo il puntatore cursore iniziale. |
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 dati aggiuntivi dopo il puntatore del cursore iniziale. |
RightSize(PacketBuffer *aPacket)
|
Copia il buffer specificato in un buffer di dimensioni giuste, se applicabile.
|
Funzioni pubbliche
Aggiungi riferimento
void AddRef( void )
Incrementa il conteggio dei riferimenti del buffer corrente.
Aggiunta
void AddToEnd( PacketBuffer *aPacket )
Aggiungi il buffer di pacchetto specificato alla fine della catena di buffer, regolando di conseguenza la lunghezza totale di ogni buffer.
Dettagli | |||
---|---|---|---|
Parametri |
|
Allinea PayPay
bool AlignPayload( uint16_t aAlignBytes )
Allinea il payload del buffer al limite di byte specificato.
Se necessario, sposta il payload in avanti.
Dettagli | |||
---|---|---|---|
Parametri |
|
||
Restituisce |
true se l'allineamento va a buon fine, false se lo spazio non è sufficiente nel buffer. |
Dimensioni Alloc
size_t AllocSize( void ) const
Restituisce le dimensioni dell'allocazione inclusi gli spazi dei dati riservati e di payload, ma non lo spazio assegnato per la struttura di PacketBuffer.
Dettagli | |
---|---|
Restituisce |
la dimensione dell'allocazione
|
Lunghezza dati disponibile
uint16_t AvailableDataLength( void ) const
Recupera il numero di byte di dati che possono essere aggiunti al buffer corrente, data la posizione iniziale e la lunghezza dei dati correnti.
Dettagli | |
---|---|
Restituisce |
la lunghezza in byte dei dati che rientra nel buffer corrente, in base alla posizione iniziale e alla lunghezza dei dati correnti.
|
Compatto
void CompactHead( void )
Spostare i dati dai buffer successivi della catena al buffer corrente fino a quando non è pieno.
Solo il buffer corrente viene compatta: i dati all'interno del buffer vengono spostati all'inizio del buffer, eliminando tutto lo spazio riservato. Lo spazio disponibile rimanente viene riempito con i dati spostati dai buffer successivi nella catena fino all'esaurimento del buffer corrente. Se un buffer successivo nella catena viene spostato interamente nel buffer, viene rimosso dalla catena e liberato. Il metodo non accetta parametri, non restituisce risultati e può restituire errori.
Consuma
PacketBuffer * Consume( uint16_t aConsumeLength )
Consumo di dati in una catena di buffer.
Consumare dati in una catena di buffer a partire dal buffer corrente e proseguire attraverso i buffer rimanenti nella catena. Ogni buffer completamente consumato viene liberato e la funzione restituisce il primo buffer (se presente) contenente i dati rimanenti. L'attuale buffer deve essere l'intestazione della catena di buffer.
Dettagli | |||
---|---|---|---|
Parametri |
|
||
Restituisce |
il primo buffer della catena corrente che contiene i dati rimanenti. Se i dati non sono rimasti, viene restituito un NULL.
|
ConsumeHead
void ConsumeHead( uint16_t aConsumeLength )
Regola il buffer corrente per indicare la quantità di dati utilizzati.
Avanza la posizione iniziale dei dati nel buffer corrente in base alla quantità specificata, in byte, fino alla lunghezza dei dati nel buffer. Riduci la lunghezza e la lunghezza totale per l'importo utilizzato.
Dettagli | |||
---|---|---|---|
Parametri |
|
Lunghezza dati
uint16_t DataLength( void ) const
Ottieni la lunghezza in byte dei dati nel buffer di pacchetto.
Dettagli | |
---|---|
Restituisce |
lunghezza, in byte (lunghezza del payload corrente).
|
Scollega
PacketBuffer * DetachTail( void )
Scollega il buffer corrente dalla catena e restituisce un puntatore ai buffer rimanenti.
Il buffer corrente deve essere l'intestazione della catena.
Dettagli | |
---|---|
Restituisce |
la coda dell'attuale catena di buffer o NULL se il buffer corrente è l'unico buffer della catena.
|
Assicurazione per dimensioni
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à specificata di spazio riservato che sposta i dati nel buffer in avanti per liberare spazio, se necessario.
Dettagli | |||
---|---|---|---|
Parametri |
|
||
Restituisce |
true se le dimensioni riservate richieste sono disponibili, false se lo spazio non è sufficiente nel buffer. |
Lunghezza massima dati
uint16_t MaxDataLength( void ) const
Ottieni la quantità massima, in byte, di dati che rientra nel buffer in base alla posizione di partenza e alla dimensione del buffer correnti.
Dettagli | |
---|---|
Restituisce |
numero di byte che rientra nel buffer data la posizione di avvio corrente.
|
Avanti
PacketBuffer * Next( void ) const
Ottieni il puntatore del buffer successivo nella catena.
Dettagli | |
---|---|
Restituisce |
un puntatore al buffer successivo della catena.
NULL viene restituito quando non sono presenti buffer nella catena. |
Riservato
uint16_t ReservedSize( void ) const
Ottenere il numero di byte all'interno del buffer corrente tra l'inizio del buffer e la posizione iniziale dei dati.
Dettagli | |
---|---|
Restituisce |
La quantità di spazio in byte tra l'inizio del buffer e la posizione attuale dei dati.
|
SetDataLength
void SetDataLength( uint16_t aNewLen, PacketBuffer *aChainHead )
Imposta la lunghezza in byte dei dati nel buffer e regola la lunghezza totale di conseguenza.
La funzione imposta la lunghezza in byte dei dati nel buffer, regolando la lunghezza totale in modo appropriato. Quando il buffer non è l'intestazione della catena di buffer (caso comune: il chiamante aggiunge i dati all'ultimo buffer della catena PacketBuffer prima di chiamare i livelli più alti), è necessario trasferire aaHead per regolare correttamente la lunghezza totale di ogni buffer prima del buffer.
Dettagli | |||||
---|---|---|---|---|---|
Parametri |
|
SetSet
void SetStart( uint8_t *aNewStart )
Imposta i dati di avvio nel buffer, regolando la lunghezza e la lunghezza totale di conseguenza.
Dettagli | |||
---|---|---|---|
Parametri |
|
Inizia
uint8_t * Start( void ) const
Recupero del puntatore per iniziare i dati nel buffer.
Dettagli | |
---|---|
Restituisce |
all'inizio dei dati.
|
Lunghezza totale
uint16_t TotalLength( void ) const
Ottieni la lunghezza totale dei dati del pacchetto nella catena di buffer.
Dettagli | |
---|---|
Restituisce |
lunghezza totale, in ottetti.
|
Funzioni pubbliche pubbliche
Nessun costo
void Free( PacketBuffer *aPacket )
Libera tutti i buffer di pacchetto in una catena.
Consente di diminuire il conteggio dei riferimenti a tutti i buffer della catena corrente. Se il numero di riferimento raggiunge lo 0, i rispettivi buffer vengono liberati o restituiti ai pool di allocazione in base alle esigenze. Come regola, gli utenti dovrebbero considerare questo metodo come una funzione free()
equivalente e non utilizzare l'argomento dopo la chiamata.
Dettagli | |||
---|---|---|---|
Parametri |
|
Testa libera
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()` unirà la testa, ma non fornirà forzatamente il buffer della testa.
Dettagli | |||
---|---|---|---|
Parametri |
|
||
Restituisce |
catena di buffer di pacchetti costituita dalla coda del buffer di input (può 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.
Le dimensioni riservate (WEAVE_SYSTEM_CONFIG_header_RESERVE_SIZE) sono sufficienti per contenere le intestazioni dei livelli di trasporto e le intestazioni richieste da WeaveMessageLayer
e WeaveExchangeLayer
.
Nuovo
PacketBuffer * New( uint16_t aReservedSize )
Alloca un singolo PacketBuffer della dimensione totale massima con una dimensione specifica della riserva di intestazione.
Il parametro trasmesso è la dimensione riservata prima del payload per ospitare 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)
: in questo caso, il buffer viene restituito senza alcuna intestazione riservata, di conseguenza l'intero payload può essere utilizzato dal chiamante. Questo pattern è particolarmente utile nei livelli inferiori di stack di rete, nei casi in cui l'utente sappia che il payload verrà copiato nel messaggio finale con le appropriate intestazioni delle intestazioni o nella creazione di PacketBuffer da aggiungere a una catena di PacketBuffer tramitePacketBuffer::AddToEnd()
. Parametri[in] aReservedSize
quantità di spazio di intestazione da prenotare.Al completamento, un puntatore a PacketBuffer, in caso di erroreNULL
.
NewWithAvailableSize
PacketBuffer * NewWithAvailableSize( size_t aAvailableSize )
Alloca un PacketBuffer con dimensione riservata predefinita (WEAVE_SYSTEM_CONFIG_header_RESERVE_SIZE) nel payload per le intestazioni e almeno aAllocSize
byte di spazio per ulteriori dati dopo il puntatore cursore iniziale.
L'utilizzo è più appropriato durante l'assegnazione di un PacketBuffer per un messaggio a livello di applicazione.
Dettagli | |||
---|---|---|---|
Parametri |
|
||
Restituisce |
Quando l'operazione ha esito positivo, un puntatore al 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 dati aggiuntivi dopo il puntatore del cursore iniziale.
Dettagli | |||||
---|---|---|---|---|---|
Parametri |
|
||||
Restituisce |
Quando l'operazione ha esito positivo, un puntatore al PacketBuffer nel blocco allocato. In caso di errore,
NULL . |
Dimensione destra
PacketBuffer * RightSize( PacketBuffer *aPacket )
Copia il buffer specificato in un buffer di dimensioni giuste, se applicabile.
Questa funzione è autonoma per i socket.
Dettagli | |||
---|---|---|---|
Parametri |
|
||
Restituisce |
nuovo buffer di pacchetto o buffer originale
|