nl:: Weave:: System:: PacketBuffer
#include <src/system/SystemPacketBuffer.h>
Klasa bufora pakietów to podstawowa struktura używana do manipulowania pakietami danych w postaci oktetów, zwykle w kontekście sieci komunikacji danych, takiej jak Bluetooth czy protokół internetowy.
Podsumowanie
W środowiskach opartych na LwIP ta klasa jest tworzona na podstawie struktury pbuf zdefiniowanej w tej bibliotece. W przypadku braku LwIP Weave zapewnia implementację opartą na Malloc lub na pulę, która w dużym stopniu przybliża problemy związane z pamięcią umieszczane na urządzeniach umieszczonych w głębokich witrynach.
Klasa PacketBuffer, podobnie jak wiele podobnych struktur używanych w warstwowych stosach sieciowych, zapewnia mechanizm rezerwowania przestrzeni dla nagłówków protokołów w każdej warstwie konfigurowalnego stosu komunikacyjnego. Szczegółowe informacje znajdziesz na stronie PacketBuffer::New()
oraz w dokumentacji LwIP.
Obiekty PacketBuffer są liczone jako odwołania, a tryb użytkowania Weave to „fire-and-get”. Ponieważ pakiet (i jego bazowy obiekt PacketBuffer) jest wysyłany przez różne warstwy protokołu, udane wywołanie funkcji „wywołanie” lub „pobieranie” między warstwami oznacza przeniesienie własności, a odbiorca odpowiada za zwolnienie bufora. W przypadku niepowodzenia połączenia międzywarstwowym odpowiedzialność za zwolnienie bufora spoczywa na użytkowniku wywołującym.
Nowe obiekty klasy PacketBuffer są inicjowane na początku alokacji pamięci uzyskanej ze środowiska bazowego, np. z pul docelowych LwIP ze standardowej biblioteki C, z wewnętrznej puli buforów. W prostym przypadku rozmiar bufora danych to WEAVE_SYSTEM_PACKETBUFFER_SIZE. Udostępniono narzędzie kompozycyjne, które pozwala na używanie buforów danych o innych rozmiarach.
Obiekty PacketBuffer można połączyć w łańcuch, aby obsługiwać większe ładunki. Łańcuchy nie są jednak przejrzyste, a użytkownicy klasy muszą wyraźnie zdecydować, czy będą obsługiwać łańcuchy. Przykłady klas napisanych z obsługą łańcuchów:
@ref nl::Weave::WeaveTLVReader @ref nl::Weave::WeaveTLVWriter
Dziedziczenie
Dziedziczy z: pbuf
Funkcje publiczne |
|
---|---|
AddRef(void)
|
void
Zwiększ liczbę odwołań w bieżącym buforze.
|
AddToEnd(PacketBuffer *aPacket)
|
void
Dodaj dany bufor pakietów na końcu łańcucha buforów, odpowiednio dostosowując całkowitą długość każdego bufora w łańcuchu.
|
AlignPayload(uint16_t aAlignBytes)
|
bool
Wyrównaj ładunek bufora do określonej granicy bajtów.
|
AllocSize(void) const
|
size_t
Zwraca rozmiar alokacji, w tym zarezerwowane przestrzenie danych i ładunek, ale nie uwzględnia miejsca przydzielonego dla struktury PacketBuffer.
|
AvailableDataLength(void) const
|
uint16_t
Uzyskaj liczbę bajtów danych, które można dodać do bieżącego bufora przy danej pozycji początkowej i długości danych.
|
CompactHead(void)
|
void
Przenoś dane z kolejnych buforów w łańcuchu do bieżącego bufora, aż się zapełni.
|
Consume(uint16_t aConsumeLength)
|
Przetwarzanie danych w łańcuchu buforów.
|
ConsumeHead(uint16_t aConsumeLength)
|
void
Dostosuj bieżący bufor, aby wskazać ilość wykorzystanych danych.
|
DataLength(void) const
|
uint16_t
Uzyskaj długość danych w buforze pakietów (w bajtach).
|
DetachTail(void)
|
Odłącz bieżący bufor od jego łańcucha i zwróć wskaźnik do pozostałych.
|
EnsureReservedSize(uint16_t aReservedSize)
|
bool
Upewnij się, że bufor zawiera co najmniej określoną ilość zarezerwowanego miejsca.
|
MaxDataLength(void) const
|
uint16_t
Uzyskaj maksymalną ilość danych (w bajtach), które mieszczą się w buforze przy danej pozycji początkowej i rozmiarze bufora.
|
Next(void) const
|
Pobierz wskaźnik do następnego bufora w łańcuchu.
|
ReservedSize(void) const
|
uint16_t
Uzyskaj liczbę bajtów w bieżącym buforze między jego początkiem a bieżącą pozycją danych.
|
SetDataLength(uint16_t aNewLen, PacketBuffer *aChainHead)
|
void
Ustaw długość danych w buforze (w bajtach) i odpowiednio dostosuj jej łączną długość.
|
SetStart(uint8_t *aNewStart)
|
void
Umieść dane początkowe w buforze, odpowiednio dostosowując długość i całkowitą długość.
|
Start(void) const
|
uint8_t *
Pobierz wskaźnik do początku danych w buforze.
|
TotalLength(void) const
|
uint16_t
Uzyskaj całkowitą długość pakietu danych w łańcuchu bufora.
|
Publiczne funkcje statyczne |
|
---|---|
Free(PacketBuffer *aPacket)
|
void
Uwolnij wszystkie bufory pakietów w łańcuchu.
|
FreeHead(PacketBuffer *aPacket)
|
Zwolnij pierwszy bufor w łańcuchu, zwracając wskaźnik do pozostałych.
|
New(void)
|
Przydziela pojedynczy element PacketBuffer o domyślnym maksymalnym rozmiarze (WEAVE_SYSTEM_CONFIG_PACKETBUFFER_CAPACITY_MAX) z domyślnym zarezerwowanym rozmiarem (WEAVE_SYSTEM_CONFIG_HEADER_RESERVE_SIZE) w ładunku.
|
New(uint16_t aReservedSize)
|
Przydziela pojedynczy element PacketBuffer o maksymalnym łącznym rozmiarze z określonym rozmiarem rezerwacji nagłówka.
|
NewWithAvailableSize(size_t aAvailableSize)
|
Przydziela obiekt PacketBuffer z domyślnym zarezerwowanym rozmiarem (WEAVE_SYSTEM_CONFIG_HEADER_RESERVE_SIZE) w ładunku na nagłówki i co najmniej
aAllocSize bajtów miejsca na dodatkowe dane po początkowym wskaźniku kursora. |
NewWithAvailableSize(uint16_t aReservedSize, size_t aAvailableSize)
|
Przydziela obiekt PacketBuffer, którego ładunek zawiera co najmniej
aReservedSize B w ładunku dla nagłówków i co najmniej aAllocSize B miejsca na dodatkowe dane po początkowym wskaźniku kursora. |
RightSize(PacketBuffer *aPacket)
|
Skopiuj podany bufor do bufora o odpowiednim rozmiarze, jeśli jest to konieczne.
|
Funkcje publiczne
AddRef
void AddRef( void )
Zwiększ liczbę odwołań w bieżącym buforze.
AddToEnd
void AddToEnd( PacketBuffer *aPacket )
Dodaj dany bufor pakietów na końcu łańcucha buforów, odpowiednio dostosowując całkowitą długość każdego bufora w łańcuchu.
Szczegóły | |||
---|---|---|---|
Parametry |
|
AlignPayload
bool AlignPayload( uint16_t aAlignBytes )
Wyrównaj ładunek bufora do określonej granicy bajtów.
W razie potrzeby przenieść ładunek w buforze do przodu.
Szczegóły | |||
---|---|---|---|
Parametry |
|
||
Zwroty |
true , jeśli udało się wyrównać, false , jeśli w buforze jest za mało miejsca. |
AllocSize
size_t AllocSize( void ) const
Zwraca rozmiar alokacji, w tym zarezerwowane przestrzenie danych i ładunek, ale nie uwzględnia miejsca przydzielonego dla struktury PacketBuffer.
Szczegóły | |
---|---|
Zwroty |
wielkość alokacji
|
AvailableDataLength
uint16_t AvailableDataLength( void ) const
Uzyskaj liczbę bajtów danych, które można dodać do bieżącego bufora przy danej pozycji początkowej i długości danych.
Szczegóły | |
---|---|
Zwroty |
długość (w bajtach) danych, które zmieszczą się w bieżącym buforze przy danej pozycji początkowej i długości danych.
|
CompactHead
void CompactHead( void )
Przenoś dane z kolejnych buforów w łańcuchu do bieżącego bufora, aż się zapełni.
Kompaktowanie obejmuje tylko bieżący bufor: dane w bieżącym buforze są przenoszone na początek, eliminując zarezerwowane miejsce. Pozostałe dostępne miejsce jest wypełniane danymi przeniesionymi z kolejnych buforów w łańcuchu aż do zapełnienia bieżącego bufora. Jeśli kolejny bufor w łańcuchu zostanie w całości przeniesiony do bieżącego bufora, zostanie usunięty z łańcucha i uwolniony. Ta metoda nie przyjmuje żadnych parametrów, nie zwraca żadnych wyników i nie może zakończyć się niepowodzeniem.
Konsumpcja
PacketBuffer * Consume( uint16_t aConsumeLength )
Przetwarzanie danych w łańcuchu buforów.
Przetwarzanie danych w łańcuchu buforów, zaczynając od bieżącego bufora i przechodząc przez pozostałe bufory w łańcuchu. Każdy całkowicie zajęty bufor jest zwalniany, a funkcja zwraca pierwszy bufor (jeśli istnieje) zawierający pozostałe dane. Bieżący bufor musi być na początku łańcucha buforów.
Szczegóły | |||
---|---|---|---|
Parametry |
|
||
Zwroty |
pierwszy bufor w bieżącym łańcuchu, który zawiera pozostałe dane. Jeśli nie ma żadnych danych, zwracana jest wartość NULL.
|
ConsumeHead
void ConsumeHead( uint16_t aConsumeLength )
Dostosuj bieżący bufor, aby wskazać ilość wykorzystanych danych.
Przesuń pozycję początkową danych w bieżącym buforze o określoną ilość (w bajtach) do długości danych w buforze. Zmniejsz długość i całkowitą długość filmu o wykorzystaną ilość.
Szczegóły | |||
---|---|---|---|
Parametry |
|
DataLength
uint16_t DataLength( void ) const
Uzyskaj długość danych w buforze pakietów (w bajtach).
Szczegóły | |
---|---|
Zwroty |
długość w bajtach (bieżąca długość ładunku).
|
DetachTail
PacketBuffer * DetachTail( void )
Odłącz bieżący bufor od jego łańcucha i zwróć wskaźnik do pozostałych.
Bieżący bufor musi być na początku łańcucha.
Szczegóły | |
---|---|
Zwroty |
koniec bieżącego łańcucha buforów lub wartość NULL, jeśli bieżący bufor jest jedynym buforem w łańcuchu.
|
EnsureReservedSize
bool EnsureReservedSize( uint16_t aReservedSize )
Upewnij się, że bufor zawiera co najmniej określoną ilość zarezerwowanego miejsca.
Upewnij się, że bufor ma co najmniej określoną ilość zarezerwowanej przestrzeni, która służy do przenoszenia danych w buforze do przodu, aby w razie potrzeby zrobić miejsce.
Szczegóły | |||
---|---|---|---|
Parametry |
|
||
Zwroty |
true , jeśli żądany zarezerwowany rozmiar jest dostępny, false , jeśli w buforze jest za mało miejsca. |
MaxDataLength
uint16_t MaxDataLength( void ) const
Uzyskaj maksymalną ilość danych (w bajtach), które mieszczą się w buforze przy danej pozycji początkowej i rozmiarze bufora.
Szczegóły | |
---|---|
Zwroty |
liczba bajtów, które mieszczą się w buforze w danej pozycji początkowej.
|
Dalej
PacketBuffer * Next( void ) const
Pobierz wskaźnik do następnego bufora w łańcuchu.
Szczegóły | |
---|---|
Zwroty |
wskaźnik do następnego bufora w łańcuchu. Parametr
NULL jest zwracany, gdy w łańcuchu nie ma buforów. |
ReservedSize
uint16_t ReservedSize( void ) const
Uzyskaj liczbę bajtów w bieżącym buforze między jego początkiem a bieżącą pozycją danych.
Szczegóły | |
---|---|
Zwroty |
ilość (w bajtach) miejsca między początkiem bufora a bieżącą pozycją początkową danych.
|
SetDataLength
void SetDataLength( uint16_t aNewLen, PacketBuffer *aChainHead )
Ustaw długość danych w buforze (w bajtach) i odpowiednio dostosuj jej łączną długość.
Funkcja ta określa długość danych w buforze (w bajtach) i odpowiednio dostosowuje łączną długość. Gdy bufor nie jest na początku łańcucha bufora (typowy przypadek: element wywołujący dodaje dane do ostatniego bufora w PacketBuffer łańcuchu przed wywołaniem wyższych warstw), należywłaściwie dostosować całkowitą długość każdego bieżącego bufora za pomocą obiektu aChainHead.
Szczegóły | |||||
---|---|---|---|---|---|
Parametry |
|
SetStart
void SetStart( uint8_t *aNewStart )
Umieść dane początkowe w buforze, odpowiednio dostosowując długość i całkowitą długość.
Szczegóły | |||
---|---|---|---|
Parametry |
|
Rozpocznij
uint8_t * Start( void ) const
Pobierz wskaźnik do początku danych w buforze.
Szczegóły | |
---|---|
Zwroty |
na początek danych.
|
TotalLength
uint16_t TotalLength( void ) const
Uzyskaj całkowitą długość pakietu danych w łańcuchu bufora.
Szczegóły | |
---|---|
Zwroty |
całkowitej długości w oktetach.
|
Publiczne funkcje statyczne
Bezpłatnie
void Free( PacketBuffer *aPacket )
Uwolnij wszystkie bufory pakietów w łańcuchu.
Zmniejsz liczbę odwołań do wszystkich buforów w bieżącym łańcuchu. Jeśli liczba referencyjna osiągnie 0, odpowiednie bufory zostaną zwolnione lub zwrócone do pul alokacji. Użytkownicy powinni traktować tę metodę jako odpowiednik funkcji free()
i nie używać tego argumentu po wywołaniu.
Szczegóły | |||
---|---|---|---|
Parametry |
|
FreeHead
PacketBuffer * FreeHead( PacketBuffer *aPacket )
Zwolnij pierwszy bufor w łańcuchu, zwracając wskaźnik do pozostałych.
* @note When the buffer chain is referenced by multiple callers,
Funkcja FreeHead()” odłącza nagłówek, ale nie wymusza jego ulokowania.
Szczegóły | |||
---|---|---|---|
Parametry |
|
||
Zwroty |
łańcuch bufora pakietów składający się z końca bufora wejściowego (może to być
NULL ). |
Nowość
PacketBuffer * New( void )
Przydziela pojedynczy element PacketBuffer o domyślnym maksymalnym rozmiarze (WEAVE_SYSTEM_CONFIG_PACKETBUFFER_CAPACITY_MAX) z domyślnym zarezerwowanym rozmiarem (WEAVE_SYSTEM_CONFIG_HEADER_RESERVE_SIZE) w ładunku.
Zarezerwowany rozmiar (WEAVE_SYSTEM_CONFIG_HEADER_RESERVE_SIZE) jest wystarczająco duży, aby pomieścić nagłówki warstwy transportu oraz nagłówki wymagane przez zasady WeaveMessageLayer
i WeaveExchangeLayer
.
Nowość
PacketBuffer * New( uint16_t aReservedSize )
Przydziela pojedynczy element PacketBuffer o maksymalnym łącznym rozmiarze z określonym rozmiarem rezerwacji nagłówka.
Przekazany parametr to rozmiar zarezerwowany przed ładunkiem na potrzeby nagłówków pakietów z różnych warstw stosu, a nie ogólny rozmiar przydzielonego bufora. Rozmiar bufora WEAVE_SYSTEM_CONFIG_PACKETBUFFER_CAPACITY_MAX i nieokreślony w wywołaniu.
PacketBuffer::New(0)
: po wywołaniu w ten sposób bufor jest zwracany bez zarezerwowanego nagłówka, co oznacza, że wywołujący może korzystać z całego ładunku. Ten wzorzec jest szczególnie przydatny na niższych warstwach stosu sieciowych, gdy użytkownik wie, że ładunek zostanie skopiowany do końcowej wiadomości z odpowiednimi rezerwami nagłówka lub podczas tworzenia elementu PacketBuffer, które są dołączone do łańcucha PacketBuffer przezPacketBuffer::AddToEnd()
. Parametry[in] aReservedSize
ilość miejsca na nagłówek do zarezerwowania.W przypadku powodzenia wskaźnik do PacketBuffer w przypadku błęduNULL
.
NewWithAvailableSize
PacketBuffer * NewWithAvailableSize( size_t aAvailableSize )
Przydziela obiekt PacketBuffer z domyślnym zarezerwowanym rozmiarem (WEAVE_SYSTEM_CONFIG_HEADER_RESERVE_SIZE) w ładunku na nagłówki i co najmniej aAllocSize
bajtów miejsca na dodatkowe dane po początkowym wskaźniku kursora.
To użycie jest najbardziej odpowiednie, gdy przydzielasz obiekt PacketBuffer na potrzeby wiadomości w warstwie aplikacji.
Szczegóły | |||
---|---|---|---|
Parametry |
|
||
Zwroty |
Jeśli operacja się uda, wskaźnik do PacketBuffer w przydzielonym bloku. W przypadku niepowodzenia:
NULL . * |
NewWithAvailableSize
PacketBuffer * NewWithAvailableSize( uint16_t aReservedSize, size_t aAvailableSize )
Przydziela obiekt PacketBuffer, w którym w ładunku jest co najmniej aReservedSize
bajtów zarezerwowanych na nagłówki i co najmniej aAllocSize
B miejsca na dodatkowe dane po początkowym wskaźniku kursora.
Szczegóły | |||||
---|---|---|---|---|---|
Parametry |
|
||||
Zwroty |
Jeśli operacja się uda, wskaźnik do PacketBuffer w przydzielonym bloku. W przypadku niepowodzenia:
NULL . |
RightSize
PacketBuffer * RightSize( PacketBuffer *aPacket )
Skopiuj podany bufor do bufora o odpowiednim rozmiarze, jeśli jest to konieczne.
Ta funkcja nie jest obsługiwana w przypadku gniazd.
Szczegóły | |||
---|---|---|---|
Parametry |
|
||
Zwroty |
nowy bufor pakietów lub pierwotny bufor
|