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
[in] aPacket
– der Paketzwischenspeicher, der am Ende der aktuellen Kette hinzugefügt wird

Nutzlast

bool AlignPayload(
  uint16_t aAlignBytes
)

Richtet die Zwischenspeichernutzlast an der angegebenen Bytegrenze aus.

Gegebenenfalls die Nutzlast in den Zwischenspeicher verschieben.

Details
Parameter
[in] aAlignBytes
– Gibt die Anzahl der Byte in der Nutzlast für den Startzeiger an.
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
[in] aConsumeLength
– Anzahl der Byte, die für die aktuelle Kette verarbeitet werden sollen.
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
[in] aConsumeLen
– Anzahl der Byte, die aus dem aktuellen Puffer verarbeitet werden sollen.

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
[in] aReservedSize
– Anzahl der Byte, die für die Header erforderlich sind
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
[in] aNewLen
– neue Länge dieses Zwischenspeichers in Byte
[in,out] aChainHead
– der Kopf der Pufferkette, zu der der aktuelle Puffer gehört. Kann NULL sein, wenn der aktuelle Puffer der Kopf der Pufferkette ist.

SetStart

void SetStart(
  uint8_t *aNewStart
)

Startdaten im Puffer festlegen und Länge und Gesamtlänge entsprechend anpassen

Details
Parameter
[in] aNewStart
– Hinweis für die Position, an der die neue Nutzlast starten soll. „newStart“ wird intern so angepasst, dass sie in die Grenzen des ersten Zwischenspeichers in der PacketBuffer-Kette fällt.

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
[in] aPacket
– Paketpuffer, der freigegeben werden soll

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
[in] aPacket
– Pufferkette.
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 über PacketBuffer::AddToEnd() an eine Kette des PacketBuffers angehängt wird. Parameter
    [in] aReservedSize
    Speicherplatz, der reserviert werden soll.
    Rückgabe
    Bei Erfolg verweist ein Zeiger auf den PacketBuffer bei Fehler NULL.

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
[in] aAvailableSize
Anzahl der Oktette, die nach dem Cursor zugewiesen werden sollen.
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
[in] aReservedSize
Anzahl der Oktette, die hinter dem Cursor reserviert werden sollen.
[in] aAvailableSize
Anzahl der Oktette, die nach dem Cursor zugewiesen werden sollen.
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
[in] aPacket
– Puffer oder Puffer
Rückgabe
neuer Paketzwischenspeicher oder der ursprüngliche Puffer