nl::Weave::System::PacketBuffer

#include <src/system/SystemPacketBuffer.h>

Paket arabellek sınıfı, genellikle Bluetooth veya internet protokolü gibi bir veri iletişim ağı bağlamında sekizli serileştirilmiş veri paketlerinin işlenmesi için kullanılan temel yapıdır.

Özet

LwIP tabanlı ortamlarda bu sınıf, ilgili kitaplıkta tanımlanan pbuf yapısının üzerine oluşturulur. LwIP'nin yokluğunda Weave, Malloc tabanlı bir uygulama veya derin yerleştirilmiş cihazların bellek zorluklarını yakından tahmin eden havuz tabanlı bir uygulama sağlar.

Katmanlı ağ yığınlarında kullanılan birçok benzer yapı gibi PacketBuffer sınıfı da yapılandırılabilir bir iletişim yığınının her bir katmanında protokol başlıkları için alan ayıracak bir mekanizma sağlar. Ayrıntılar için PacketBuffer::New() ve LwIP dokümanlarına göz atın.

PacketBuffer nesneleri referansla sayılır ve Weave içindeki baskın kullanım modu "tetikle ve unut" şeklindedir. Paket (ve altındaki PacketBuffer nesnesi) çeşitli protokol katmanları üzerinden gönderilirken, katmanlar arasındaki başarılı yukarı veya aşağı çağırma, sahipliğin aktarıldığı anlamına gelir ve arabelleğin boşaltılmasından çağrılan kişi sorumludur. Katmanlar arası çağrı başarısız olursa, arabelleğin serbest bırakılmasıyla ilgili sorumluluk arayana aittir.

PacketBuffer sınıfının yeni nesneleri, temel ortamdan elde edilen bellek tahsisinin başında başlatılır (ör. dahili bir arabellek havuzundan standart C kitaplığı yığınından LwIP pbuf hedef havuzlarından alınır. Basit durumda, veri arabelleğinin boyutu WEAVE_SYSTEM_PACKETBUFFER_SIZE şeklindedir. Başka boyutlardaki veri arabelleklerinin kullanımına izin veren bir oluşturucu sağlanmıştır.

PacketBuffer nesneleri, daha büyük yükleri karşılayacak şekilde zincirlenebilir. Bununla birlikte, zincir oluşturma şeffaf değildir ve sınıfın kullanıcılarının, zincirlemeyi desteklemeye açıkça karar vermesi gerekir. Zincirleme desteğiyle yazılan sınıfların örnekleri aşağıda verilmiştir:

@ref nl::Weave::WeaveTLVReader
@ref nl::Weave::WeaveTLVWriter

Devralma

Devralındığı kaynak: pbuf

Herkese açık işlevler

AddRef(void)
void
Mevcut tamponun referans sayısını artırın.
AddToEnd(PacketBuffer *aPacket)
void
Verilen paket arabelleğini, zincirdeki her arabelleğin toplam uzunluğunu uygun şekilde ayarlayarak arabellek zincirinin sonuna ekleyin.
AlignPayload(uint16_t aAlignBytes)
bool
Arabellek yükünü belirtilen bayt sınırında hizalayın.
AllocSize(void) const
size_t
Ayrılmış ve yük veri alanları dahil olmak üzere ancak PacketBuffer yapısı için ayrılan alanı içermeyen ayırma boyutunu döndürür.
AvailableDataLength(void) const
uint16_t
Geçerli başlangıç konumu ve veri uzunluğuna göre geçerli arabelleğe eklenebilecek bayt sayısını alın.
CompactHead(void)
void
Verileri, zincirde bulunan sonraki arabelleklerden dolana kadar mevcut arabelleğe taşıyın.
Consume(uint16_t aConsumeLength)
Verileri bir tampon zincirinde kullanın.
ConsumeHead(uint16_t aConsumeLength)
void
Mevcut arabelleği, tüketilen veri miktarını gösterecek şekilde ayarlayın.
DataLength(void) const
uint16_t
Paket arabelleğindeki verilerin bayt cinsinden uzunluğunu alın.
DetachTail(void)
Mevcut arabelleği zincirinden ayırın ve bir işaretçiyi kalan arabelleklere döndürün.
EnsureReservedSize(uint16_t aReservedSize)
bool
Arabellekte en azından belirtilen miktarda ayrılmış alan bulunduğundan emin olun.
MaxDataLength(void) const
uint16_t
Geçerli başlangıç konumu ve arabellek boyutuna göre arabelleğe sığacak verinin bayt cinsinden maksimum miktarını alın.
Next(void) const
Zincirdeki bir sonraki tamponu işaret eder.
ReservedSize(void) const
uint16_t
Arabelleğin başlangıcı ile geçerli veri başlangıç konumu arasındaki geçerli arabellek içinde bulunan bayt sayısını alın.
SetDataLength(uint16_t aNewLen, PacketBuffer *aChainHead)
void
Arabellekteki verilerin uzunluğunu bayt cinsinden, toplam uzunluğu buna göre ayarlayın.
SetStart(uint8_t *aNewStart)
void
Başlangıç verilerini arabellekte ayarlayın, uzunluğu ve toplam uzunluğu uygun şekilde ayarlayın.
Start(void) const
uint8_t *
Arabellekteki verilerin başlangıcı için işaretçi alın.
TotalLength(void) const
uint16_t
Arabellek zincirindeki paket verilerinin toplam uzunluğunu alın.

Herkese açık statik işlevler

Free(PacketBuffer *aPacket)
void
Zincirdeki tüm paket arabelleklerini serbest bırakın.
FreeHead(PacketBuffer *aPacket)
Zincirdeki ilk tamponu serbest bırakarak kalan tamponlara bir işaretçi döndürür.
New(void)
Yükte varsayılan maksimum boyutta (WEAVE_SYSTEM_CONFIG_PACKETBUFFER_CAPACITY_MAX) ve varsayılan olarak ayrılmış boyuta (WEAVE_SYSTEM_CONFIG_HEADER_RESERVE_SIZE) sahip tek bir PacketBuffer ayırır.
New(uint16_t aReservedSize)
Belirli bir üstbilgi rezervasyon boyutuyla maksimum toplam boyutta tek bir PacketBuffer ayırır.
NewWithAvailableSize(size_t aAvailableSize)
Başlık yükünde varsayılan olarak ayrılmış boyuta (WEAVE_SYSTEM_CONFIG_HEADER_RESERVE_SIZE) sahip bir PacketBuffer ve ilk imleç işaretçisinden sonra ek veriler için en az aAllocSize bayt alan ayırır.
NewWithAvailableSize(uint16_t aReservedSize, size_t aAvailableSize)
İlk imleç işaretçisinden sonra yükte en az aReservedSize bayt ve ek veriler için en az aAllocSize bayt boşluğa sahip bir PacketBuffer nesnesi ayırır.
RightSize(PacketBuffer *aPacket)
Varsa belirtilen arabelleği doğru boyutlu bir arabelleğe kopyalayın.

Herkese açık işlevler

AddRef

void AddRef(
  void
)

Mevcut tamponun referans sayısını artırın.

AddToEnd

void AddToEnd(
  PacketBuffer *aPacket
)

Verilen paket arabelleğini, zincirdeki her arabelleğin toplam uzunluğunu uygun şekilde ayarlayarak arabellek zincirinin sonuna ekleyin.

Ayrıntılar
Parametreler
[in] aPacket
- geçerli zincirin sonuna eklenecek paket arabelleği.

AlignPayload

bool AlignPayload(
  uint16_t aAlignBytes
)

Arabellek yükünü belirtilen bayt sınırında hizalayın.

Gerekirse tampondaki yükü ileri taşımak.

Ayrıntılar
Parametreler
[in] aAlignBytes
- yük başlangıç işaretçisi için bayt hizalama sayısını belirtir.
İadeler
Hizalama başarılı olursa true, arabellekte yeterli alan yoksa false.

AllocSize

size_t AllocSize(
  void
) const 

Ayrılmış ve yük veri alanları dahil olmak üzere ancak PacketBuffer yapısı için ayrılan alanı içermeyen ayırma boyutunu döndürür.

Ayrıntılar
İadeler
ayırma boyutu

AvailableDataLength

uint16_t AvailableDataLength(
  void
) const 

Geçerli başlangıç konumu ve veri uzunluğuna göre geçerli arabelleğe eklenebilecek bayt sayısını alın.

Ayrıntılar
İadeler
geçerli başlangıç konumuna ve veri uzunluğuna göre geçerli arabelleğe sığacak verilerin bayt cinsinden uzunluğu.

CompactHead

void CompactHead(
  void
)

Verileri, zincirde bulunan sonraki arabelleklerden dolana kadar mevcut arabelleğe taşıyın.

Yalnızca mevcut arabellek sıkıştırılır: Mevcut arabellekteki veriler arabelleğin önüne taşınır ve böylece ayrılmış alan ortadan kalkar. Kalan kullanılabilir alan, mevcut tampon dolana kadar zincirde daha sonra bulunan tamponlardan taşınan verilerle doldurulur. Zincirde bulunan sonraki bir tampon mevcut arabelleğe tamamen taşınırsa zincirden çıkarılır ve serbest bırakılır. Yöntem parametre almaz, sonuç döndürmez ve başarısız olamaz.

Tüketme

PacketBuffer * Consume(
  uint16_t aConsumeLength
)

Verileri bir tampon zincirinde kullanın.

Mevcut tamponla başlayıp zincirde kalan tamponlar boyunca ilerleyerek verileri bir tampon zincirinde tüketin. Tamamen kullanılan her arabellek serbest bırakılır ve işlev, kalan verileri içeren ilk arabelleği (varsa) döndürür. Mevcut tampon, tampon zincirinin başı olmalıdır.

Ayrıntılar
Parametreler
[in] aConsumeLength
- geçerli zincirden alınacak bayt sayısı.
İadeler
mevcut zincirde kalan verileri içeren ilk tampon. Herhangi bir veri kalmazsa NULL döndürülür.

ConsumeHead

void ConsumeHead(
  uint16_t aConsumeLength
)

Mevcut arabelleği, tüketilen veri miktarını gösterecek şekilde ayarlayın.

Geçerli arabellekteki veri başlangıç konumunu, bayt cinsinden arabellekteki verilerin uzunluğu kadar olacak şekilde, bayt cinsinden ilerletir. Uzunluğu ve toplam uzunluğu tüketilen tutar kadar azaltın.

Ayrıntılar
Parametreler
[in] aConsumeLen
- geçerli arabellekte tüketilecek bayt sayısı.

DataLength

uint16_t DataLength(
  void
) const 

Paket arabelleğindeki verilerin bayt cinsinden uzunluğunu alın.

Ayrıntılar
İadeler
uzunluk, bayt (geçerli yük uzunluğu) olarak belirtilir.

DetachTail

PacketBuffer * DetachTail(
  void
)

Mevcut arabelleği zincirinden ayırın ve bir işaretçiyi kalan arabelleklere döndürün.

Mevcut tampon, zincirin başı olmalıdır.

Ayrıntılar
İadeler
mevcut tampon zincirinin kuyruğunu veya zincirdeki tek tamponsa NULL arabelleğini gösterir.

EnsureReservedSize

bool EnsureReservedSize(
  uint16_t aReservedSize
)

Arabellekte en azından belirtilen miktarda ayrılmış alan bulunduğundan emin olun.

Arabellekte en azından belirtilen miktarda ayrılmış alan bulunduğundan emin olun. Gerekirse yer açmak için arabellekteki verileri ileri taşıyın.

Ayrıntılar
Parametreler
[in] aReservedSize
- başlıklar için istenen bayt sayısı.
İadeler
İstenen ayrılmış boyut kullanılabiliyorsa true, arabellekte yeterli alan yoksa false.

MaxDataLength

uint16_t MaxDataLength(
  void
) const 

Geçerli başlangıç konumu ve arabellek boyutuna göre arabelleğe sığacak verinin bayt cinsinden maksimum miktarını alın.

Ayrıntılar
İadeler
geçerli başlangıç konumuna göre arabelleğe sığan bayt sayısı.

Sonraki

PacketBuffer * Next(
  void
) const 

Zincirdeki bir sonraki tamponu işaret eder.

Ayrıntılar
İadeler
zincirdeki bir sonraki tamponu işaret eder. Zincirde tampon olmadığında NULL döndürülür.

ReservedSize

uint16_t ReservedSize(
  void
) const 

Arabelleğin başlangıcı ile geçerli veri başlangıç konumu arasındaki geçerli arabellek içinde bulunan bayt sayısını alın.

Ayrıntılar
İadeler
arabelleğin başlangıcı ile geçerli veri başlangıç konumu arasındaki alanın bayt cinsinden miktarı.

SetDataLength

void SetDataLength(
  uint16_t aNewLen,
  PacketBuffer *aChainHead
)

Arabellekteki verilerin uzunluğunu bayt cinsinden belirleyerek toplam uzunluğu buna göre ayarlayın.

İşlev, arabellekteki verilerin uzunluğunu bayt cinsinden belirleyerek toplam uzunluğu uygun şekilde ayarlar. Arabellek, arabellek zincirinin başı olmadığında (genel durum: arayan, daha yüksek katmanların çağrılmasından önce PacketBuffer zincirindeki son arabelleğe veri ekler.) mevcut arabelleğin önündeki her arabelleğin toplam uzunluğunun doğru şekilde ayarlanması için aChainHead gönderilmelidir.

Ayrıntılar
Parametreler
[in] aNewLen
- bu arabelleğin bayt cinsinden yeni uzunluğu.
[in,out] aChainHead
- mevcut tamponun ait olduğu tampon zincirinin başı. Mevcut arabellek, tampon zincirinin başıysa NULL olabilir.

SetStart

void SetStart(
  uint8_t *aNewStart
)

Başlangıç verilerini arabellekte ayarlayın, uzunluğu ve toplam uzunluğu uygun şekilde ayarlayın.

Ayrıntılar
Parametreler
[in] aNewStart
- Yeni yükün başlaması gereken yeri gösteren bir işaretçi. newStart, PacketBuffer zincirindeki ilk arabelleğin sınırlarına denk gelecek şekilde dahili olarak ayarlanır.

Başlangıç

uint8_t * Start(
  void
) const 

Arabellekteki verilerin başlangıcı için işaretçi alın.

Ayrıntılar
İadeler
verilerin başlangıcına işaret eder.

TotalLength

uint16_t TotalLength(
  void
) const 

Arabellek zincirindeki paket verilerinin toplam uzunluğunu alın.

Ayrıntılar
İadeler
sekizli cinsinden toplam uzunluk.

Herkese açık statik işlevler

Ücretsiz

void Free(
  PacketBuffer *aPacket
)

Zincirdeki tüm paket arabelleklerini serbest bırakın.

Mevcut zincirdeki tüm tamponlarda referans sayısını azaltın. Referans sayısı 0'a ulaşırsa ilgili tamponlar serbest bırakılır veya uygun şekilde ayırma havuzlarına döndürülür. Kural olarak, kullanıcılar bu yöntemi free() işlevinin eşdeğeri olarak değerlendirmeli ve çağrıdan sonra bağımsız değişkeni kullanmamalıdır.

Ayrıntılar
Parametreler
[in] aPacket
- serbest bırakılacak paket arabelleği.

FreeHead

PacketBuffer * FreeHead(
  PacketBuffer *aPacket
)

Zincirdeki ilk tamponu serbest bırakarak kalan tamponlara bir işaretçi döndürür.

* @note When the buffer chain is referenced by multiple callers,FreeHead()" kafayı ayırır ancak başlık arabelleğini zorla ayırmaz.

Ayrıntılar
Parametreler
[in] aPacket
- tampon zinciri.
İadeler
giriş arabelleğinin kuyruğundan oluşan paket arabellek zinciri (NULL olabilir).

Yeni

PacketBuffer * New(
  void
)

Yükte varsayılan maksimum boyutta (WEAVE_SYSTEM_CONFIG_PACKETBUFFER_CAPACITY_MAX) ve varsayılan olarak ayrılmış boyuta (WEAVE_SYSTEM_CONFIG_HEADER_RESERVE_SIZE) sahip tek bir PacketBuffer ayırır.

Ayrılmış boyut (WEAVE_SYSTEM_CONFIG_HEADER_RESERVE_SIZE), WeaveMessageLayer ve WeaveExchangeLayer tarafından gereken başlıkların yanı sıra aktarım katmanı başlıklarını da barındıracak kadar büyük.

Yeni

PacketBuffer * New(
  uint16_t aReservedSize
)

Belirli bir üstbilgi rezervasyon boyutuyla maksimum toplam boyutta tek bir PacketBuffer ayırır.

Aktarılan parametre, ayrılacak arabelleğin toplam boyutu değil, farklı yığın katmanlarından paket başlıkları için yükten önce ayrılmış olan boyuttur. Çağrıda belirtilmeyen WEAVE_SYSTEM_CONFIG_PACKETBUFFER_CAPACITY_MAX arabelleğin boyutu.

  • PacketBuffer::New(0) : Bu şekilde çağrıldığında, tampon herhangi bir başlık ayrılmadan döndürülür. Bunun sonucunda, yükün tamamı çağrı tarafından kullanılabilir. Bu kalıp, özellikle kullanıcının yükün uygun başlık rezervleriyle son iletiye kopyalanacağını bildiği durumlarda veya PacketBuffer::AddToEnd() aracılığıyla bir PacketBuffer zincirine eklenmiş PacketBuffer'ın oluşturulduğu durumlarda ağ yığınının alt katmanlarında faydalıdır. Parametreler
    [in] aReservedSize
    başlık alanı miktarı.
    İadeler
    Başarılı olursa, NULL hatasında PacketBuffer'a işaretçi.

NewWithAvailableSize

PacketBuffer * NewWithAvailableSize(
  size_t aAvailableSize
)

Başlık yükünde varsayılan olarak ayrılmış boyuta (WEAVE_SYSTEM_CONFIG_HEADER_RESERVE_SIZE) sahip bir PacketBuffer ve ilk imleç işaretçisinden sonra ek veriler için en az aAllocSize bayt alan ayırır.

Bu kullanım, en çok uygulama katmanı mesajı için PacketBuffer ayrılırken uygundur.

Ayrıntılar
Parametreler
[in] aAvailableSize
İmleçten sonra ayrılacak sekizlik sayısı.
İadeler
İşlem başarılı olursa, ayrılan bloktaki PacketBuffer'a işaret eder. Hata durumunda NULL. *

NewWithAvailableSize

PacketBuffer * NewWithAvailableSize(
  uint16_t aReservedSize,
  size_t aAvailableSize
)

İlk imleç işaretçisinden sonra yükte en az aReservedSize bayt ve ek veriler için en az aAllocSize bayt boşluğa sahip bir PacketBuffer nesnesi ayırır.

Ayrıntılar
Parametreler
[in] aReservedSize
İmlecin arkasında ayrılacak sekizlik sayısı.
[in] aAvailableSize
İmleçten sonra ayrılacak sekizlik sayısı.
İadeler
İşlem başarılı olursa, ayrılan bloktaki PacketBuffer'a işaret eder. Hata durumunda NULL.

RightSize

PacketBuffer * RightSize(
  PacketBuffer *aPacket
)

Varsa belirtilen arabelleği doğru boyutlu bir arabelleğe kopyalayın.

Bu işlev, yuvalar için işlemsizdir.

Ayrıntılar
Parametreler
[in] aPacket
- tampon ya da tampon zinciri.
İadeler
yeni paket arabelleği veya orijinal arabellek