nl:: Weave:: System:: PacketBuffer
#include <src/system/SystemPacketBuffer.h>
Die Paketpufferklasse ist die Kernstruktur für die Manipulation von Paketen Oktett-Serialisierungsdaten, üblicherweise im Zusammenhang mit einem Datenkommunikationsnetzwerk wie Bluetooth oder dem Internetprotokoll.
Fazit
In LwIP-basierten Umgebungen basiert diese Klasse auf der Fotobuchstruktur, die in dieser Bibliothek definiert ist. Wenn LwIP nicht vorhanden ist, bietet Weave entweder eine Malloc-basierte Implementierung oder eine Poolbasierte Implementierung, bei der die Speicheranforderungen von tief eingebetteten Geräten ungefähr geschätzt werden.
Wie bei vielen ähnlichen Strukturen, die in mehrschichtigen Netzwerk-Stacks verwendet werden, bietet die PacketBuffer-Klasse einen Mechanismus, um Platz für Protokollheader in jeder Ebene eines konfigurierbaren Kommunikations-Stacks zu reservieren. Weitere Informationen finden Sie in der PacketBuffer::New()
und in der LwIP-Dokumentation.
PacketBuffer-Objekte werden als Referenz gezählt und der vorherrschende Nutzungsmodus in Weave ist „fire-and-Forget"“. Da das Paket (und das zugrunde liegende PacketBuffer-Objekt) über verschiedene Protokollebenen gesendet wird, impliziert der erfolgreiche Upcall oder Downcall zwischen Ebenen die Übertragung der Inhaberschaft und der Aufrufer ist für die Freigabe des Puffers verantwortlich. Wenn ein Schichtaufruf nicht ausgeführt wird, ist der Puffer für die Freigabe des Puffers beim Aufruf verantwortlich.
Neue Objekte der PacketBuffer-Klasse werden am Anfang einer Zuweisung von Arbeitsspeicher initialisiert, die aus der zugrunde liegenden Umgebung abgerufen wird, z.B. aus LwIP-pbuf-Zielpools, aus dem Standard-C-Speicher-Heap und einem internen Pufferpool. Im einfachen Fall hat der Datenzwischenspeicher folgende Größe: WEAVE_SYSTEM_PACKETBUFFER_SIZE. Es wird eine Composer-Datei bereitgestellt, mit der Datenzwischenspeicher anderer Größe verwendet werden können.
PacketBuffer-Objekte können verkettet werden, um größere Nutzlasten zu unterstützen. Die Verkettung ist jedoch nicht transparent und die Nutzer des Kurses müssen die Verkettung explizit unterstützen. Beispiele für Klassen mit Verkettung der Unterstützung:
@ref nl::Weave::WeaveTLVReader @ref nl::Weave::WeaveTLVWriter
Übernahme
Übernommen von: pbuf
Öffentliche Funktionen |
|
---|---|
AddRef(void)
|
void
Die Anzahl der Referenzen des aktuellen Zwischenspeichers erhöhen.
|
AddToEnd(PacketBuffer *aPacket)
|
void
Fügen Sie den angegebenen Paketzwischenspeicher am Ende der Zwischenspeicherkette 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 Nutzlastdatenbereiche, aber nicht den für die PacketBuffer-Struktur zugewiesenen Speicherplatz.
|
AvailableDataLength(void) const
|
uint16_t
Gibt die Anzahl der Datenbyte an, die dem aktuellen Puffer basierend auf der aktuellen Startposition und der aktuellen Datenlänge hinzugefügt werden können.
|
CompactHead(void)
|
void
Daten aus nachfolgenden Zwischenspeichern in der Kette in den aktuellen Puffer verschieben, bis er voll ist.
|
Consume(uint16_t aConsumeLength)
|
Daten in einer Pufferkette verarbeiten.
|
ConsumeHead(uint16_t aConsumeLength)
|
void
Passen Sie den aktuellen Puffer an, um die Menge der verbrauchten Daten anzugeben.
|
DataLength(void) const
|
uint16_t
Länge des Datenzwischenspeichers in Byte abrufen.
|
DetachTail(void)
|
Den aktuellen Puffer von seiner Kette trennen und einen Zeiger an die verbleibenden Zwischenspeicher zurückgeben.
|
EnsureReservedSize(uint16_t aReservedSize)
|
bool
Achten Sie darauf, dass der Puffer mindestens die angegebene Menge an reserviertem Speicherplatz hat.
|
MaxDataLength(void) const
|
uint16_t
Damit wird die maximale Datenmenge in Byte abgerufen, die in den Puffer für die aktuelle Startposition und Puffergröße passt.
|
Next(void) const
|
Mauszeiger auf nächsten Puffer in der Kette abrufen.
|
ReservedSize(void) const
|
uint16_t
Gibt die Anzahl der Byte im aktuellen Puffer zwischen dem Start des Zwischenspeichers und der aktuellen Datenstartposition ab.
|
SetDataLength(uint16_t aNewLen, PacketBuffer *aChainHead)
|
void
Lege die Länge der Daten im Zwischenspeicher in Byte fest und passe die Gesamtlänge entsprechend an.
|
SetStart(uint8_t *aNewStart)
|
void
Startdaten im Puffer festlegen und Länge und Gesamtlänge entsprechend anpassen
|
Start(void) const
|
uint8_t *
Zeige den Mauszeiger an den Anfang der Daten im Puffer.
|
TotalLength(void) const
|
uint16_t
Gesamtlänge der Paketdaten in der Pufferkette abrufen.
|
Öffentliche statische Funktionen |
|
---|---|
Free(PacketBuffer *aPacket)
|
void
Entfernt alle Paketzwischenspeicher in einer Kette.
|
FreeHead(PacketBuffer *aPacket)
|
Den ersten Puffer in einer Kette freigeben und einen Zeiger auf die verbleibenden Puffer zurückgeben.
|
New(void)
|
Ordnet einen einzelnen PacketBuffer der maximalen Standardgröße (WEAVE_SYSTEM_CONFIG_PACKETBUFFER_CAPACITY_MAX) mit der standardmäßigen reservierten Größe (WEAVE_SYSTEM_CONFIG_header_RESERVE_SIZE) in der Nutzlast zu.
|
New(uint16_t aReservedSize)
|
Weist einen einzelnen PacketBuffer mit der maximalen Gesamtgröße mit einer bestimmten Header-Reservierungsgröße zu.
|
NewWithAvailableSize(size_t aAvailableSize)
|
Weist einen PacketBuffer mit der standardmäßigen reservierten Größe (WEAVE_SYSTEM_CONFIG_header_RESERVE_SIZE) in der Nutzlast für Header sowie mindestens
aAllocSize Byte Platz für zusätzliche Daten nach dem ersten Cursorzeiger zu. |
NewWithAvailableSize(uint16_t aReservedSize, size_t aAvailableSize)
|
Weist ein PacketBuffer-Objekt zu, bei dem mindestens
aReservedSize Byte in der Nutzlast für Header reserviert sind, und mindestens aAllocSize Byte Speicherplatz für zusätzliche Daten nach dem ersten Cursor-Zeiger vorhanden sind. |
RightSize(PacketBuffer *aPacket)
|
Kopieren Sie den angegebenen Puffer in den richtigen Puffer.
|
Öffentliche Funktionen
Hinzufügen Ref
void AddRef( void )
Die Anzahl der Referenzen des aktuellen Zwischenspeichers erhöhen.
Hinzufügen
void AddToEnd( PacketBuffer *aPacket )
Fügen Sie den angegebenen Paketzwischenspeicher am Ende der Zwischenspeicherkette hinzu und passen Sie die Gesamtlänge jedes Zwischenspeichers in der Kette entsprechend an.
Details | |||
---|---|---|---|
Parameter |
|
Nutzlast
bool AlignPayload( uint16_t aAlignBytes )
Richtet die Zwischenspeichernutzlast an der angegebenen Bytegrenze aus.
Gegebenenfalls die Nutzlast in den Zwischenspeicher verschieben.
Details | |||
---|---|---|---|
Parameter |
|
||
Rückgabe |
true , wenn die Ausrichtung erfolgreich war, false , wenn im Puffer nicht genug Platz vorhanden ist. |
Zuweisungsgröße
size_t AllocSize( void ) const
Gibt die Größe der Zuweisung zurück, einschließlich der reservierten und Nutzlastdatenbereiche, aber nicht den für die PacketBuffer-Struktur zugewiesenen Speicherplatz.
Details | |
---|---|
Rückgabe |
Größe der Zuordnung
|
Verfügbare Datenlänge
uint16_t AvailableDataLength( void ) const
Gibt die Anzahl der Datenbyte an, die dem aktuellen Puffer basierend auf der aktuellen Startposition und der aktuellen Datenlänge hinzugefügt werden können.
Details | |
---|---|
Rückgabe |
die Länge der Daten in Byte, die in den aktuellen Puffer für die aktuelle Startposition und Datenlänge passen.
|
Kompakter Kopf
void CompactHead( void )
Daten aus nachfolgenden Zwischenspeichern in der Kette in den aktuellen Puffer verschieben, bis er voll ist.
Nur der aktuelle Puffer wird komprimiert: Die Daten im aktuellen Puffer werden an die Vorderseite des Puffers verschoben, sodass freier Speicherplatz nicht mehr verfügbar ist. Der verbleibende verfügbare Speicherplatz wird mit Daten gefüllt, die aus nachfolgenden Zwischenspeichern in der Kette verschoben werden, bis der aktuelle Puffer voll ist. Wenn ein nachfolgender Zwischenspeicher in der Kette komplett in den aktuellen Puffer 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 Pufferkette verarbeiten.
Sie verarbeiten Daten in einer Pufferkette, die mit dem aktuellen Puffer beginnt und durch die verbleibenden Zwischenspeicher beginnt. Jeder Zwischenspeicher, der vollständig verbraucht wird, wird freigegeben und die Funktion gibt den ersten Puffer (falls vorhanden) zurück, der die verbleibenden Daten enthält. Der aktuelle Puffer muss der Kopf der Pufferkette sein.
Details | |||
---|---|---|---|
Parameter |
|
||
Rückgabe |
den ersten Puffer aus der aktuellen Kette, der verbleibende Daten enthält. Wenn keine Daten verbleiben, wird ein NULL-Wert zurückgegeben.
|
Verbrauchskopf
void ConsumeHead( uint16_t aConsumeLength )
Passen Sie den aktuellen Puffer an, um die Menge der verbrauchten Daten anzugeben.
Die Datenstartposition im aktuellen Puffer um die angegebene Menge in Byte erhöhen – bis zur Länge der Daten im Puffer. Reduzieren Sie die Länge und die Gesamtlänge um den verbrauchten Betrag.
Details | |||
---|---|---|---|
Parameter |
|
Datenlänge
uint16_t DataLength( void ) const
Länge des Datenzwischenspeichers in Byte abrufen.
Details | |
---|---|
Rückgabe |
Länge in Byte (aktuelle Nutzlastlänge).
|
Detachtail
PacketBuffer * DetachTail( void )
Den aktuellen Puffer von seiner Kette trennen und einen Zeiger an die verbleibenden Zwischenspeicher zurückgeben.
Der aktuelle Puffer muss der Kopf der Kette sein.
Details | |
---|---|
Rückgabe |
Das Ende des aktuellen Zwischenspeichers oder NULL, wenn der aktuelle Puffer der einzige Puffer in der Kette ist.
|
Gesicherte Größe
bool EnsureReservedSize( uint16_t aReservedSize )
Achten Sie darauf, dass der Puffer mindestens die angegebene Menge an reserviertem Speicherplatz hat.
Achten Sie darauf, dass der Puffer mindestens die angegebene Menge an reserviertem Speicherplatz hat, indem Sie die Daten im Puffer nach vorn verschieben, um bei Bedarf Platz zu schaffen.
Details | |||
---|---|---|---|
Parameter |
|
||
Rückgabe |
true , wenn die angeforderte reservierte Größe verfügbar ist, false , wenn im Puffer nicht genug Platz vorhanden ist. |
MaxDataLength
uint16_t MaxDataLength( void ) const
Damit wird die maximale Datenmenge in Byte abgerufen, die in den Puffer für die aktuelle Startposition und Puffergröße passt.
Details | |
---|---|
Rückgabe |
Anzahl der Byte, die in den Puffer für die aktuelle Startposition passen.
|
Weiter
PacketBuffer * Next( void ) const
Mauszeiger auf nächsten Puffer in der Kette abrufen.
Details | |
---|---|
Rückgabe |
auf einen Zeiger auf den nächsten Puffer in der Kette verweist.
NULL wird zurückgegeben, wenn keine Zwischenspeicher vorhanden sind. |
Reservierte Größe
uint16_t ReservedSize( void ) const
Gibt die Anzahl der Byte im aktuellen Puffer zwischen dem Start des Zwischenspeichers und der aktuellen Datenstartposition ab.
Details | |
---|---|
Rückgabe |
Der Speicherplatz in Byte zwischen dem Start des Zwischenspeichers und der aktuellen Datenstartposition.
|
SetDataLength
void SetDataLength( uint16_t aNewLen, PacketBuffer *aChainHead )
Lege die Länge der Daten im Zwischenspeicher in Byte fest und passe die Gesamtlänge entsprechend an.
Mit der Funktion wird die Länge der Daten im Puffer in Byte festgelegt. Dabei wird die Gesamtlänge entsprechend angepasst. Wenn der Puffer nicht der Kopf der Pufferkette ist (üblicherweise: Der Aufrufer fügt dem letzten Puffer in der PacketBuffer-Kette vor dem Aufrufen höherer Ebenen Daten hinzu), muss der ChainHead übergeben werden, um die Gesamtlänge der einzelnen Zwischenspeicher vor dem aktuellen Puffer anzupassen.
Details | |||||
---|---|---|---|---|---|
Parameter |
|
SetStart
void SetStart( uint8_t *aNewStart )
Startdaten im Puffer festlegen und Länge und Gesamtlänge entsprechend anpassen
Details | |||
---|---|---|---|
Parameter |
|
Einstieg
uint8_t * Start( void ) const
Zeige den Mauszeiger an den Anfang der Daten im Puffer.
Details | |
---|---|
Rückgabe |
auf den Anfang der Daten verweist.
|
Gesamtlänge
uint16_t TotalLength( void ) const
Gesamtlänge der Paketdaten in der Pufferkette abrufen.
Details | |
---|---|
Rückgabe |
Gesamtlänge in Oktetten.
|
Öffentliche statische Funktionen
Kostenlos
void Free( PacketBuffer *aPacket )
Entfernt alle Paketzwischenspeicher in einer Kette.
Verringern Sie die Anzahl der Verweise auf alle Zwischenspeicher in der aktuellen Kette. Wenn die Referenzanzahl 0 erreicht, werden die entsprechenden Zwischenspeicher freigegeben oder an Zuweisungspools zurückgegeben. In der Regel sollten Nutzer diese Methode als Entsprechung der free()
-Funktion behandeln und das Argument nach dem Aufruf nicht verwenden.
Details | |||
---|---|---|---|
Parameter |
|
Freikopf
PacketBuffer * FreeHead( PacketBuffer *aPacket )
Den ersten Puffer in einer Kette freigeben und einen Zeiger auf die verbleibenden Puffer zurückgeben.
* @note When the buffer chain is referenced by multiple callers,
Mit FreeHead() wird der Kopf getrennt, der Kopfpuffer wird aber nicht zwangsweise entfernt.
Details | |||
---|---|---|---|
Parameter |
|
||
Rückgabe |
Paketpufferkette, die aus dem Ende des Eingabezwischenspeichers besteht (kann
NULL sein). |
Neu
PacketBuffer * New( void )
Ordnet einen einzelnen PacketBuffer der maximalen Standardgröße (WEAVE_SYSTEM_CONFIG_PACKETBUFFER_CAPACITY_MAX) mit der standardmäßigen reservierten 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 die für WeaveMessageLayer
und WeaveExchangeLayer
erforderlichen Header zu speichern.
Neu
PacketBuffer * New( uint16_t aReservedSize )
Weist einen einzelnen PacketBuffer mit der maximalen Gesamtgröße mit einer bestimmten Header-Reservierungsgröße zu.
Der übergebene Parameter ist die Größe, die vor der Nutzlast reserviert wurde, um Paketheader von verschiedenen Stackebenen zu speichern, nicht die Gesamtgröße des zuzuweisenden Zwischenspeichers. Die Größe des Zwischenspeichers WEAVE_SYSTEM_CONFIG_PACKETBUFFER_CAPACITY_MAX. Wird nicht im Aufruf angegeben.
PacketBuffer::New(0)
: Wenn dieser Seitenaufruf aufgerufen wird, wird der Zwischenspeicher zurückgegeben, ohne einen Header reserviert zu haben, sodass die gesamte Nutzlast vom Aufrufer verwendet werden kann. Dieses Muster ist besonders nützlich in den unteren Schichten von Netzwerk-Stacks. Das ist hilfreich, wenn der Nutzer weiß, dass die Nutzlast in die finale Nachricht mit entsprechenden Header-Reservierungen kopiert oder PacketBuffer erstellt wird, der überPacketBuffer::AddToEnd()
an eine Kette des PacketBuffers angehängt wird. Parameter[in] aReservedSize
Speicherplatz, der reserviert werden soll.Bei Erfolg verweist ein Zeiger auf den PacketBuffer bei FehlerNULL
.
NeueMitGröße
PacketBuffer * NewWithAvailableSize( size_t aAvailableSize )
Weist einen PacketBuffer mit der standardmäßigen reservierten Größe (WEAVE_SYSTEM_CONFIG_header_RESERVE_SIZE) in der Nutzlast für Header sowie mindestens aAllocSize
Byte Platz für zusätzliche Daten nach dem ersten Cursorzeiger zu.
Diese Verwendung ist besonders sinnvoll, wenn ein PacketBuffer für eine Nachricht auf Anwendungsebene zugewiesen wird.
Details | |||
---|---|---|---|
Parameter |
|
||
Rückgabe |
Wenn der Vorgang erfolgreich durchgeführt wurde, ein Zeiger auf den PacketBuffer im zugewiesenen Block. Fehler beim
NULL . * |
NeueMitGröße
PacketBuffer * NewWithAvailableSize( uint16_t aReservedSize, size_t aAvailableSize )
Weist ein PacketBuffer-Objekt zu, bei dem mindestens aReservedSize
Byte in der Nutzlast für Header reserviert sind, und mindestens aAllocSize
Byte Speicherplatz für zusätzliche Daten nach dem ersten Cursor-Zeiger vorhanden sind.
Details | |||||
---|---|---|---|---|---|
Parameter |
|
||||
Rückgabe |
Wenn der Vorgang erfolgreich durchgeführt wurde, ein Zeiger auf den PacketBuffer im zugewiesenen Block. Fehler beim
NULL . |
Rechts
PacketBuffer * RightSize( PacketBuffer *aPacket )
Kopieren Sie den angegebenen Puffer in den richtigen Puffer.
Diese Funktion ist für Sockets null möglich.
Details | |||
---|---|---|---|
Parameter |
|
||
Rückgabe |
neuer Paketzwischenspeicher oder der ursprüngliche Puffer
|