nl:: Weave:: System:: PacketBuffer
#include <src/system/SystemPacketBuffer.h>
Die Paketpufferklasse ist die Kernstruktur, die zur Manipulation von Paketen mit Oktett-serialisierten Daten verwendet wird, normalerweise im Zusammenhang mit einem Datenkommunikationsnetzwerk wie Bluetooth oder dem Internetprotokoll.
Zusammenfassung
In LwIP-basierten Umgebungen basiert diese Klasse auf der pbuf-Struktur, die in dieser Bibliothek definiert ist. Fehlt LwIP, bietet Weave entweder eine Malloc-basierte Implementierung oder eine Pool-basierte Implementierung an, mit der sich die Speicherherausforderungen tief eingebetteter Geräte nahezu vollständig bewältigen lassen.
Die Klasse PacketBuffer bietet wie viele ähnliche Strukturen, die in mehrschichtigen Netzwerkstacks verwendet werden, einen Mechanismus, um auf jeder Schicht eines konfigurierbaren Kommunikationsstacks Platz für Protokollheader zu reservieren. Weitere Informationen finden Sie in der Dokumentation zu PacketBuffer::New()
und LwIP.
PacketBuffer-Objekte werden durch Referenzen gezählt und der überwiegende Verwendungsmodus in Weave ist „Fire-and-Forget“. Da das Paket und sein zugrunde liegendes PacketBuffer-Objekt über verschiedene Protokollebenen weitergeleitet werden, impliziert der erfolgreiche Up- oder Downcall zwischen den Ebenen eine Übertragung der Inhaberschaft. Der Aufgerufene ist dafür verantwortlich, den Zwischenspeicher freizugeben. Wenn ein schichtübergreifender Aufruf fehlschlägt, liegt die Verantwortung für das Freigeben des Zwischenspeichers beim Aufrufer.
Neue Objekte der Klasse PacketBuffer werden zu Beginn einer Arbeitsspeicherzuweisung aus der zugrunde liegenden Umgebung initialisiert, z.B. aus LwIP-pbuf-Zielpools, aus dem Heap der Standard-C-Bibliothek und aus einem internen Zwischenspeicherpool. Im einfachen Fall beträgt die Größe des Datenpuffers WEAVE_SYSTEM_PACKETBUFFER_SIZE. Ein Composer wird bereitgestellt, der die Verwendung von Datenpuffern anderer Größen ermöglicht.
PacketBuffer-Objekte können für größere Nutzlasten verkettet werden. Die Verkettung ist jedoch nicht transparent und die Nutzer der Klasse müssen sich explizit dafür entscheiden, Verkettungen zu unterstützen. Beispiele für Klassen mit Unterstützung für Verkettungen sind:
@ref nl::Weave::WeaveTLVReader @ref nl::Weave::WeaveTLVWriter
Übernahme
Übernimmt von : pbuf
Öffentliche Funktionen |
|
---|---|
AddRef(void)
|
void
Erhöht den Referenzwert des aktuellen Zwischenspeichers.
|
AddToEnd(PacketBuffer *aPacket)
|
void
Fügen Sie den angegebenen Paketzwischenspeicher am Ende der Pufferkette hinzu und passen Sie die Gesamtlänge jedes Zwischenspeichers in der Kette entsprechend an.
|
AlignPayload(uint16_t aAlignBytes)
|
bool
Richtet die Zwischenspeichernutzlast an der angegebenen Bytegrenze aus.
|
AllocSize(void) const
|
size_t
Gibt die Größe der Zuweisung zurück, einschließlich der reservierten und Nutzlast-Datenbereiche, aber ohne den für die PacketBuffer-Struktur zugewiesenen Speicherplatz.
|
AvailableDataLength(void) const
|
uint16_t
Ruft die Anzahl von Datenbyte ab, die dem aktuellen Zwischenspeicher unter Berücksichtigung der aktuellen Startposition und Datenlänge hinzugefügt werden können.
|
CompactHead(void)
|
void
Verschieben Sie Daten aus nachfolgenden Puffern in der Kette in den aktuellen Zwischenspeicher, bis sie voll sind.
|
Consume(uint16_t aConsumeLength)
|
Daten in einer Kette von Puffern verarbeiten.
|
ConsumeHead(uint16_t aConsumeLength)
|
void
Passen Sie den aktuellen Zwischenspeicher an, um die verbrauchte Datenmenge anzugeben.
|
DataLength(void) const
|
uint16_t
Ruft die Länge der Daten im Paketzwischenspeicher in Byte ab.
|
DetachTail(void)
|
Trennen Sie den aktuellen Zwischenspeicher von seiner Kette und geben Sie einen Zeiger an die verbleibenden Zwischenspeicher zurück.
|
EnsureReservedSize(uint16_t aReservedSize)
|
bool
Achten Sie darauf, dass der Puffer mindestens den angegebenen reservierten Speicherplatz hat.
|
MaxDataLength(void) const
|
uint16_t
Ruft die maximale Menge von Daten in Byte ab, die unter Berücksichtigung der aktuellen Startposition und Puffergröße in den Zwischenspeicher passen.
|
Next(void) const
|
Zeiger zum nächsten Zwischenspeicher in der Kette abrufen.
|
ReservedSize(void) const
|
uint16_t
Ruft die Anzahl der Byte im aktuellen Zwischenspeicher zwischen dem Start des Zwischenspeichers und der aktuellen Datenstartposition ab.
|
SetDataLength(uint16_t aNewLen, PacketBuffer *aChainHead)
|
void
Legt die Länge der Daten im Zwischenspeicher in Byte fest und passt die Gesamtlänge entsprechend an.
|
SetStart(uint8_t *aNewStart)
|
void
Legen Sie die Startdaten als Puffer fest und passen Sie Länge und Gesamtlänge entsprechend an.
|
Start(void) const
|
uint8_t *
Zeiger zum Anfang der Daten im Zwischenspeicher abrufen.
|
TotalLength(void) const
|
uint16_t
Gesamtlänge der Paketdaten in der Zwischenspeicherkette abrufen.
|
Öffentliche statische Funktionen |
|
---|---|
Free(PacketBuffer *aPacket)
|
void
Alle Paketzwischenspeicher in einer Kette freigeben.
|
FreeHead(PacketBuffer *aPacket)
|
Geben Sie den ersten Zwischenspeicher in einer Kette kostenlos und geben Sie einen Zeiger zu den verbleibenden Zwischenspeichern zurück.
|
New(void)
|
Weist einen einzelnen PacketBuffer der standardmäßigen maximalen Größe (WEAVE_SYSTEM_CONFIG_PACKETBUFFER_CAPACITY_MAX) mit standardmäßig reservierter Größe (WEAVE_SYSTEM_CONFIG_HEADER_RESERVE_SIZE) in der Nutzlast zu.
|
New(uint16_t aReservedSize)
|
Weist einen einzelnen PacketBuffer der maximalen Gesamtgröße mit einer bestimmten Header-Reservegröße zu.
|
NewWithAvailableSize(size_t aAvailableSize)
|
Weist Headern einen PacketBuffer mit standardmäßig reservierter Größe (WEAVE_SYSTEM_CONFIG_HEADER_RESERVE_SIZE) und nach dem anfänglichen Cursorzeiger mindestens
aAllocSize Byte Speicherplatz für zusätzliche Daten zu. |
NewWithAvailableSize(uint16_t aReservedSize, size_t aAvailableSize)
|
Weist ein PacketBuffer-Objekt mit mindestens
aReservedSize Byte in der Nutzlast für Header und mindestens aAllocSize Byte Speicherplatz für zusätzliche Daten nach dem anfänglichen Cursorzeiger zu. |
RightSize(PacketBuffer *aPacket)
|
Kopieren Sie den angegebenen Zwischenspeicher gegebenenfalls in einen Zwischenspeicher der richtigen Größe.
|
Öffentliche Funktionen
AddRef
void AddRef( void )
Erhöht den Referenzwert des aktuellen Zwischenspeichers.
AddToEnd
void AddToEnd( PacketBuffer *aPacket )
Fügen Sie den angegebenen Paketzwischenspeicher am Ende der Pufferkette hinzu und passen Sie die Gesamtlänge jedes Zwischenspeichers in der Kette entsprechend an.
Details | |||
---|---|---|---|
Parameter |
|
AlignPayload
bool AlignPayload( uint16_t aAlignBytes )
Richtet die Zwischenspeichernutzlast an der angegebenen Bytegrenze aus.
Die Nutzlast im Zwischenspeicher wird bei Bedarf vorwärts bewegt.
Details | |||
---|---|---|---|
Parameter |
|
||
Rückgabe |
true bei erfolgreicher Ausrichtung, false , wenn im Zwischenspeicher nicht genügend Platz ist. |
AllocSize
size_t AllocSize( void ) const
Gibt die Größe der Zuweisung zurück, einschließlich der reservierten und Nutzlast-Datenbereiche, aber ohne den für die PacketBuffer-Struktur zugewiesenen Speicherplatz.
Details | |
---|---|
Rückgabe |
Umfang der Zuweisung
|
AvailableDataLength
uint16_t AvailableDataLength( void ) const
Ruft die Anzahl von Datenbyte ab, die dem aktuellen Zwischenspeicher unter Berücksichtigung der aktuellen Startposition und Datenlänge hinzugefügt werden können.
Details | |
---|---|
Rückgabe |
Die Länge der Daten in Byte, die unter Berücksichtigung der aktuellen Startposition und Datenlänge in den aktuellen Zwischenspeicher passen.
|
CompactHead
void CompactHead( void )
Verschieben Sie Daten aus nachfolgenden Puffern in der Kette in den aktuellen Zwischenspeicher, bis sie voll sind.
Nur der aktuelle Zwischenspeicher wird verdichtet: Die Daten im aktuellen Zwischenspeicher werden an den Anfang des Zwischenspeichers verschoben, um reservierten Platz zu entfernen. Der verbleibende verfügbare Speicherplatz wird mit Daten gefüllt, die aus nachfolgenden Zwischenspeichern in der Kette verschoben werden, bis der aktuelle Zwischenspeicher voll ist. Wenn ein nachfolgender Zwischenspeicher in der Kette vollständig in den aktuellen Zwischenspeicher verschoben wird, wird er aus der Kette entfernt und freigegeben. Die Methode akzeptiert keine Parameter, gibt keine Ergebnisse zurück und kann nicht fehlschlagen.
Lesen
PacketBuffer * Consume( uint16_t aConsumeLength )
Daten in einer Kette von Puffern verarbeiten.
Daten in einer Kette von Puffern verarbeiten, beginnend mit dem aktuellen Zwischenspeicher und anschließend durch die verbleibenden Zwischenspeicher in der Kette Jeder vollständig verbrauchte Zwischenspeicher wird freigegeben und die Funktion gibt den ersten Zwischenspeicher (falls vorhanden) zurück, der die verbleibenden Daten enthält. Der aktuelle Zwischenspeicher muss der Anfang der Pufferkette sein.
Details | |||
---|---|---|---|
Parameter |
|
||
Rückgabe |
ersten Zwischenspeicher aus der aktuellen Kette, der alle verbleibenden Daten enthält. Wenn keine Daten mehr vorhanden sind, wird NULL zurückgegeben.
|
ConsumeHead
void ConsumeHead( uint16_t aConsumeLength )
Passen Sie den aktuellen Zwischenspeicher an, um die verbrauchte Datenmenge anzugeben.
Verschiebt die Datenstartposition im aktuellen Zwischenspeicher um die angegebene Menge in Byte bis zur Länge der Daten im Zwischenspeicher. Verringere die Länge und die Gesamtlänge um die verbrauchte Menge.
Details | |||
---|---|---|---|
Parameter |
|
DataLength
uint16_t DataLength( void ) const
Ruft die Länge der Daten im Paketzwischenspeicher in Byte ab.
Details | |
---|---|
Rückgabe |
Länge in Byte (aktuelle Nutzlastlänge).
|
DetachTail
PacketBuffer * DetachTail( void )
Trennen Sie den aktuellen Zwischenspeicher von seiner Kette und geben Sie einen Zeiger an die verbleibenden Zwischenspeicher zurück.
Der aktuelle Zwischenspeicher muss der Anfang der Kette sein.
Details | |
---|---|
Rückgabe |
das Ende der aktuellen Pufferkette oder NULL, wenn der aktuelle Zwischenspeicher der einzige Zwischenspeicher in der Kette ist.
|
EnsureReservedSize
bool EnsureReservedSize( uint16_t aReservedSize )
Achten Sie darauf, dass der Puffer mindestens den angegebenen reservierten Speicherplatz hat.
Stellen Sie sicher, dass der Puffer mindestens über den angegebenen reservierten Platz verfügt, um die Daten im Puffer nach vorne zu verschieben, um bei Bedarf Platz zu schaffen.
Details | |||
---|---|---|---|
Parameter |
|
||
Rückgabe |
true , wenn die angeforderte reservierte Größe verfügbar ist, false , wenn im Zwischenspeicher nicht genügend Platz ist. |
MaxDataLength
uint16_t MaxDataLength( void ) const
Ruft die maximale Menge von Daten in Byte ab, die unter Berücksichtigung der aktuellen Startposition und Puffergröße in den Zwischenspeicher passen.
Details | |
---|---|
Rückgabe |
Anzahl von Byte, die in den Zwischenspeicher passen, wenn die aktuelle Startposition angegeben ist.
|
Weiter
PacketBuffer * Next( void ) const
Zeiger zum nächsten Zwischenspeicher in der Kette abrufen.
Details | |
---|---|
Rückgabe |
zum nächsten Puffer in der Kette.
NULL wird zurückgegeben, wenn die Kette keine Zwischenspeicher hat. |
ReservedSize
uint16_t ReservedSize( void ) const
Ruft die Anzahl der Byte im aktuellen Zwischenspeicher zwischen dem Start des Zwischenspeichers und der aktuellen Datenstartposition ab.
Details | |
---|---|
Rückgabe |
Der Abstand zwischen dem Start des Zwischenspeichers und der aktuellen Datenstartposition in Byte.
|
SetDataLength
void SetDataLength( uint16_t aNewLen, PacketBuffer *aChainHead )
Legt die Länge der Daten im Zwischenspeicher in Byte fest und passt die Gesamtlänge entsprechend an.
Die Funktion legt die Länge der Daten im Zwischenspeicher in Byte fest und passt die Gesamtlänge entsprechend an. Wenn der Zwischenspeicher nicht der Anfang der Zwischenspeicherkette ist (häufiger Fall, dass der Aufrufer dem letzten Zwischenspeicher in der PacketBuffer-Kette Daten vor dem Aufrufen höherer Layers hinzufügt), muss der aChainHead übergeben werden, um die Gesamtlänge jedes Zwischenspeichers vor dem aktuellen Zwischenspeicher richtig anzupassen.
Details | |||||
---|---|---|---|---|---|
Parameter |
|
SetStart
void SetStart( uint8_t *aNewStart )
Legen Sie die Startdaten als Puffer fest und passen Sie Länge und Gesamtlänge entsprechend an.
Details | |||
---|---|---|---|
Parameter |
|
Start
uint8_t * Start( void ) const
Zeiger zum Anfang der Daten im Zwischenspeicher abrufen.
Details | |
---|---|
Rückgabe |
Zeiger zum Anfang der Daten.
|
TotalLength
uint16_t TotalLength( void ) const
Gesamtlänge der Paketdaten in der Zwischenspeicherkette abrufen.
Details | |
---|---|
Rückgabe |
Gesamtlänge in Oktetten.
|
Öffentliche statische Funktionen
Kostenlos
void Free( PacketBuffer *aPacket )
Alle Paketzwischenspeicher in einer Kette freigeben.
Verringern Sie die Referenzanzahl auf alle Zwischenspeicher in der aktuellen Kette. Wenn die Referenzanzahl 0 erreicht, werden die entsprechenden Zwischenspeicher freigegeben oder nach Bedarf an Zuweisungspools zurückgegeben. In der Regel sollten Nutzer diese Methode als Äquivalent der free()
-Funktion behandeln und das Argument nicht nach dem Aufruf verwenden.
Details | |||
---|---|---|---|
Parameter |
|
FreeHead
PacketBuffer * FreeHead( PacketBuffer *aPacket )
Geben Sie den ersten Zwischenspeicher in einer Kette kostenlos und geben Sie einen Zeiger zu den verbleibenden Zwischenspeichern zurück.
* @note When the buffer chain is referenced by multiple callers,
FreeHead()` trennt den Kopf, hebt jedoch die Zuweisung des Kopfzwischenspeichers nicht auf.
Details | |||
---|---|---|---|
Parameter |
|
||
Rückgabe |
Paketzwischenspeicherkette, die aus dem Ende des Eingabepuffers besteht (kann
NULL sein). |
Neu
PacketBuffer * New( void )
Weist einen einzelnen PacketBuffer der standardmäßigen maximalen Größe (WEAVE_SYSTEM_CONFIG_PACKETBUFFER_CAPACITY_MAX) mit standardmäßig reservierter Größe (WEAVE_SYSTEM_CONFIG_HEADER_RESERVE_SIZE) in der Nutzlast zu.
Die reservierte Größe (WEAVE_SYSTEM_CONFIG_HEADER_RESERVE_SIZE) ist groß genug, um Header der Transportschicht sowie Header, die von WeaveMessageLayer
und WeaveExchangeLayer
benötigt werden, aufzunehmen.
Neu
PacketBuffer * New( uint16_t aReservedSize )
Weist einen einzelnen PacketBuffer der maximalen Gesamtgröße mit einer bestimmten Header-Reservegröße zu.
Der übergebene Parameter ist die Größe, die vor der Nutzlast reserviert wurde, um Paketheader aus verschiedenen Stackebenen aufzunehmen, und nicht die Gesamtgröße des zuzuweisenden Zwischenspeichers. Die im Aufruf angegebene Größe des Zwischenspeichers WEAVE_SYSTEM_CONFIG_PACKETBUFFER_CAPACITY_MAX.
PacketBuffer::New(0)
: Bei diesem Aufruf wird der Zwischenspeicher ohne reservierte Header zurückgegeben. Folglich kann die gesamte Nutzlast vom Aufrufer verwendet werden. Dieses Muster ist besonders auf den unteren Ebenen von Netzwerkstacks nützlich, wenn der Nutzer weiß, dass die Nutzlast mit entsprechenden Headerreserven in die endgültige Nachricht kopiert wird, oder beim Erstellen von PacketBuffer, die überPacketBuffer::AddToEnd()
an eine Kette von PacketBuffer angehängt werden. Parameter[in] aReservedSize
viel Platz für den Header, der reserviert werden soll.Bei Erfolg ein Zeiger auf den PacketBuffer, bei FehlerNULL
.
NewWithAvailableSize
PacketBuffer * NewWithAvailableSize( size_t aAvailableSize )
Weist Headern einen PacketBuffer mit standardmäßig reservierter Größe (WEAVE_SYSTEM_CONFIG_HEADER_RESERVE_SIZE) und nach dem anfänglichen Cursorzeiger mindestens aAllocSize
Byte Speicherplatz für zusätzliche Daten zu.
Diese Verwendung eignet sich am besten zum Zuweisen eines PacketBuffer zu einer Nachricht auf Anwendungsebene.
Details | |||
---|---|---|---|
Parameter |
|
||
Rückgabe |
Bei Erfolg ein Zeiger auf den PacketBuffer im zugewiesenen Block. Bei Fehler:
NULL . * |
NewWithAvailableSize
PacketBuffer * NewWithAvailableSize( uint16_t aReservedSize, size_t aAvailableSize )
Weist ein PacketBuffer-Objekt mit mindestens aReservedSize
Byte in der Nutzlast für Header und mindestens aAllocSize
Byte Speicherplatz für zusätzliche Daten nach dem anfänglichen Cursorzeiger zu.
Details | |||||
---|---|---|---|---|---|
Parameter |
|
||||
Rückgabe |
Bei Erfolg ein Zeiger auf den PacketBuffer im zugewiesenen Block. Bei Fehler:
NULL . |
RightSize
PacketBuffer * RightSize( PacketBuffer *aPacket )
Kopieren Sie den angegebenen Zwischenspeicher gegebenenfalls in einen Zwischenspeicher der richtigen Größe.
Diese Funktion ist ein Leerbefehl für Sockets.
Details | |||
---|---|---|---|
Parameter |
|
||
Rückgabe |
neuen Paketzwischenspeicher oder ursprünglichen Zwischenspeicher
|