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 paketlerini işlemek 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 üzerinde oluşturulur. LwIP olmadığında Weave, Malloc tabanlı bir uygulama veya derin yerleşik cihazların bellek sorunları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ılı bilgi için PacketBuffer::New() ve LwIP belgelerini inceleyin.

PacketBuffer nesneleri referans sayılır ve Weave içindeki geçerli kullanım modu "tetikle ve unut" şeklindedir. Paket (ve altındaki PacketBuffer nesnesi) çeşitli protokol katmanları aracılığıyla gönderildiğinden, katmanlar arasındaki başarılı yukarı veya aşağı çağrı, sahiplik aktarımı anlamına gelir ve arabelleğin serbest bırakılmasından aranan kişi sorumludur. Katmanlar arası aramanın başarısız olması durumunda, tamponu serbest bırakma sorumluluğu arayana aittir.

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

PacketBuffer nesneleri daha büyük yükleri kaldırabilecek şekilde zincirlenebilir. Ancak zincirleme şeffaf değildir ve sınıf kullanıcılarının, zincirlemeyi desteklemeye açıkça karar vermesi gerekir. Zincirleme desteğiyle yazılan sınıf örnekleri aşağıda verilmiştir:

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

Devralma

Devralındığı kaynak: pbuf

Kamu işlevleri

AddRef(void)
void
Mevcut arabelleğin referans sayısını artırın.
AddToEnd(PacketBuffer *aPacket)
void
Verilen paket arabelleğini arabellek zincirinin sonuna ekleyin ve zincirdeki her bir arabelleğin toplam uzunluğunu buna göre ayarlayın.
AlignPayload(uint16_t aAlignBytes)
bool
Arabellek yükünü belirtilen bayt sınırıyla hizalayın.
AllocSize(void) const
size_t
Ayrılmış ve yük veri alanları dahil ancak PacketBuffer yapısı için ayrılan alanı hariç tutarak ayırmanın boyutunu döndürür.
AvailableDataLength(void) const
uint16_t
Geçerli başlangıç konumu ve veri uzunluğuna göre mevcut arabelleğe eklenebilecek bayt sayısını alın.
CompactHead(void)
void
Zincirde bulunan takip eden arabelleklerden gelen verileri, dolana kadar mevcut arabelleğe taşıyın.
Consume(uint16_t aConsumeLength)
Verileri bir tampon zincirinde tüketin.
ConsumeHead(uint16_t aConsumeLength)
void
Tüketilen veri miktarını göstermek için mevcut arabelleği ayarlayın.
DataLength(void) const
uint16_t
Paket arabelleğindeki verilerin bayt cinsinden uzunluğunu alın.
DetachTail(void)
Mevcut arabelleği zincirinden çıkarın ve kalan arabelleklere işaretçi döndürün.
EnsureReservedSize(uint16_t aReservedSize)
bool
Arabelleğin en az belirtilen miktarda ayrılmış alana sahip olduğundan emin olun.
MaxDataLength(void) const
uint16_t
Geçerli başlangıç konumu ve arabellek boyutuna göre arabelleğe sığacak maksimum veri miktarını (bayt cinsinden) alın.
Next(void) const
Zincirdeki bir sonraki arabelleğin işaretçisini alın.
ReservedSize(void) const
uint16_t
Arabelleğin başlangıcı ile geçerli veri başlangıç konumu arasındaki geçerli arabellek içindeki bayt sayısını alın.
SetDataLength(uint16_t aNewLen, PacketBuffer *aChainHead)
void
Tampondaki verilerin uzunluğunu bayt cinsinden ayarlayın ve toplam uzunluğu buna göre ayarlayın.
SetStart(uint8_t *aNewStart)
void
Uzunluğu ve toplam uzunluğu uygun şekilde ayarlayarak başlangıç verilerini arabelleğe ayarlayın.
Start(void) const
uint8_t *
Arabelleğe alınan verilerin başlangıcına işaretçi alın.
TotalLength(void) const
uint16_t
Tampon zincirindeki paket verilerinin toplam uzunluğunu öğrenin.

Herkese açık statik işlevler

Free(PacketBuffer *aPacket)
void
Bir zincirdeki tüm paket arabelleklerini serbest bırakın.
FreeHead(PacketBuffer *aPacket)
Zincirdeki ilk arabelleği serbest bırakın ve bir işaretçi kalan arabelleklere geri döndürün.
New(void)
Yüke, varsayılan maksimum boyutta tek bir PacketBuffer (WEAVE_SYSTEM_CONFIG_PACKETBUFFER_CAPACITY_MAX) ve varsayılan olarak ayrılmış boyuta (WEAVE_SYSTEM_CONFIG_HEADER_RESERVE_SIZE) sahip olur.
New(uint16_t aReservedSize)
Belirli bir başlık ayırma boyutuna sahip maksimum toplam boyutta tek bir PacketBuffer ayırır.
NewWithAvailableSize(size_t aAvailableSize)
Üstbilgiler için yükte 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)
Üstbilgiler için yükte en az aReservedSize bayt ve ilk imleç işaretçisinden sonra ek veriler için en az aAllocSize baytlık alan içeren bir PacketBuffer nesnesi ayırır.
RightSize(PacketBuffer *aPacket)
Belirtilen arabelleği (varsa) doğru boyutlu bir arabelleğe kopyalayın.

Kamu işlevleri

AddRef

void AddRef(
  void
)

Mevcut arabelleğin referans sayısını artırın.

AddToEnd

void AddToEnd(
  PacketBuffer *aPacket
)

Verilen paket arabelleğini arabellek zincirinin sonuna ekleyin ve zincirdeki her bir arabelleğin toplam uzunluğunu buna göre ayarlayın.

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ıyla hizalayın.

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

Ayrıntılar
Parametreler
[in] aAlignBytes
- yük başlangıç işaretçisi için bayt hizalaması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 ancak PacketBuffer yapısı için ayrılan alanı hariç tutarak ayırmanın 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 mevcut 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
)

Zincirde bulunan takip eden arabelleklerden gelen verileri, dolana kadar mevcut arabelleğe taşıyın.

Yalnızca geçerli arabellek sıkıştırılır: Mevcut arabellek içindeki veriler, ayrılmış alan ortadan kaldırılarak arabelleğin önüne taşınır. Kalan kullanılabilir alan, mevcut arabellek dolana kadar zincirdeki sonraki arabelleklerden taşınan verilerle doldurulur. Zincirde sonraki bir arabellek tamamen mevcut arabelleğe taşınırsa bu tampon zincirden çıkarılır ve serbest bırakılır. Yöntem hiçbir parametre almaz, sonuç döndürmez ve başarısız olamaz.

Tüketme

PacketBuffer * Consume(
  uint16_t aConsumeLength
)

Verileri bir tampon zincirinde tüketin.

Verileri mevcut tamponla başlayıp zincirdeki kalan tamponlardan geçerek devam eden 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 tüketilecek bayt sayısı.
İadeler
geçerli zincirdeki, kalan verileri içeren ilk tampon. Hiç veri kalmazsa NULL döndürülür.

ConsumeHead

void ConsumeHead(
  uint16_t aConsumeLength
)

Tüketilen veri miktarını göstermek için mevcut arabelleği ayarlayın.

Geçerli arabellekteki veri başlangıç konumunu, bayt cinsinden belirtilen miktarda arabellekteki verilerin uzunluğu kadar ilerletin. Uzunluğu ve toplam uzunluğu, tüketilen miktar kadar azaltın.

Ayrıntılar
Parametreler
[in] aConsumeLen
- geçerli arabellekten 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 cinsinden) (geçerli yük uzunluğu).

DetachTail

PacketBuffer * DetachTail(
  void
)

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

Geçerli arabellek, zincirin başı olmalıdır.

Ayrıntılar
İadeler
geçerli arabellek zincirinin kuyruğu, geçerli arabellek zincirdeki tek arabellekse NULL.

EnsureReservedSize

bool EnsureReservedSize(
  uint16_t aReservedSize
)

Arabelleğin en az belirtilen miktarda ayrılmış alana sahip olduğundan emin olun.

Gerekirse yer açmak için arabelleğin, arabelleğin içinde bulunan verileri ileriye taşımak üzere en az belirtilen miktarda ayrılmış alana sahip olduğundan emin olun.

Ayrıntılar
Parametreler
[in] aReservedSize
- üstbilgiler için istenen bayt sayısı.
İadeler
İstenen ayrılmış boyut varsa 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 maksimum veri miktarını (bayt cinsinden) alın.

Ayrıntılar
İadeler
geçerli başlangıç konumuna sığan bayt sayısıdır.

Sonraki

PacketBuffer * Next(
  void
) const 

Zincirdeki bir sonraki arabelleğin işaretçisini alın.

Ayrıntılar
İadeler
bir sonraki tampona işaret eder. Zincirde arabellek yoksa 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çindeki 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
)

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

İşlev, arabellekteki verilerin uzunluğunu bayt cinsinden ayarlayarak toplam uzunluğu uygun şekilde ayarlar. Arabellek, arabellek zincirinin başı olmadığında (genel durum: çağrı yapan kişi, daha yüksek katmanları çağırmadan önce PacketBuffer zincirindeki son arabelleğe veri eklerse) mevcut arabelleğin önündeki her bir arabelleğin toplam uzunluğunu düzgün bir şekilde ayarlamak için aChainHead bir şekilde aktarılmalıdır.

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şı. Geçerli arabellek, arabellek zincirinin başıysa NULL olabilir.

SetStart

void SetStart(
  uint8_t *aNewStart
)

Uzunluğu ve toplam uzunluğu uygun şekilde ayarlayarak başlangıç verilerini arabelleğe 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ı içinde kalacak şekilde dahili olarak ayarlanır.

Başlat

uint8_t * Start(
  void
) const 

Arabelleğe alınan verilerin başlangıcına işaretçi alın.

Ayrıntılar
İadeler
imleci de gösterebilir.

TotalLength

uint16_t TotalLength(
  void
) const 

Tampon zincirindeki paket verilerinin toplam uzunluğunu öğrenin.

Ayrıntılar
İadeler
sekizlik toplam uzunluk.

Herkese açık statik işlevler

Ücretsiz

void Free(
  PacketBuffer *aPacket
)

Bir zincirdeki tüm paket arabelleklerini serbest bırakın.

Referans sayısını geçerli zincirdeki tüm tamponlara kadar azaltın. Referans sayısı 0'a ulaşırsa ilgili tamponlar serbest bırakılır veya uygun şekilde ayırma havuzlarına geri 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 arabelleği serbest bırakın ve bir işaretçi kalan arabelleklere geri döndürün.

* @note When the buffer chain is referenced by multiple callers,FreeHead()" kafayı ayırır, ancak kafa 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üke, varsayılan maksimum boyutta tek bir PacketBuffer (WEAVE_SYSTEM_CONFIG_PACKETBUFFER_CAPACITY_MAX) ve varsayılan olarak ayrılmış boyuta (WEAVE_SYSTEM_CONFIG_HEADER_RESERVE_SIZE) sahip olur.

Ayrılmış boyut (WEAVE_SYSTEM_CONFIG_HEADER_RESERVE_SIZE), aktarım katmanı başlıklarını ve WeaveMessageLayer ile WeaveExchangeLayer için gereken başlıkları içerecek kadar büyüktür.

Yeni

PacketBuffer * New(
  uint16_t aReservedSize
)

Belirli bir başlık ayırma boyutuna sahip maksimum toplam boyutta tek bir PacketBuffer ayırır.

Aktarılan parametre, farklı yığın katmanlarından gelen paket başlıklarını karşılamak için yükten önce ayrılan boyuttur, ayrılacak arabelleğin toplam boyutu değildir. Çağrıda belirtildiği gibi, WEAVE_SYSTEM_CONFIG_PACKETBUFFER_CAPACITY_MAX arabelleğinin boyutu.

  • PacketBuffer::New(0) : Bu şekilde çağrıldığında arabellek, herhangi bir başlık ayrılmadan döndürülür ve sonuç olarak, yükün tamamı arayan tarafından kullanılabilir. Bu kalıp özellikle ağ yığınlarının alt katmanlarında, kullanıcının yükün uygun üstbilgi yedekleriyle nihai iletiye kopyalanacağını bildiği durumlarda veya PacketBuffer::AddToEnd() aracılığıyla PacketBuffer zincirine eklenen PacketBuffer oluştururken kullanışlıdır. Parametreler
    [in] aReservedSize
    miktarıdır.
    İadeler
    Başarılı olduğunda, NULL hatasında PacketBuffer'a yönlendiren bir işaretçi.

NewWithAvailableSize

PacketBuffer * NewWithAvailableSize(
  size_t aAvailableSize
)

Üstbilgiler için yükte 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 sekizli sayısı.
İadeler
Başarılı olduğunda, ayrılan bloktaki PacketBuffer işaretçisi. Başarısız olursa NULL. *

NewWithAvailableSize

PacketBuffer * NewWithAvailableSize(
  uint16_t aReservedSize,
  size_t aAvailableSize
)

Üstbilgiler için yükte en az aReservedSize bayt ve ilk imleç işaretçisinden sonra ek veriler için en az aAllocSize baytlık alan içeren 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 sekizli sayısı.
İadeler
Başarılı olduğunda, ayrılan bloktaki PacketBuffer işaretçisi. Başarısız olursa NULL.

RightSize

PacketBuffer * RightSize(
  PacketBuffer *aPacket
)

Belirtilen arabelleği (varsa) doğru boyutlu bir arabelleğe kopyalayın.

Bu işlev, yuvalar için kullanılamaz.

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