nl::Dokuma::Sistem::Paket

#include <src/system/SystemPacketBuffer.h>

Paket arabellek sınıfı, genellikle Bluetooth veya internet protokolü gibi bir veri iletişimi ağı bağlamında sekizli veri serilerinin işlenmesinde kullanılan temel yapıdır.

Özet

LwIP tabanlı ortamlarda, bu sınıf, o kitaplıkta tanımlanan pbuf yapısının üzerine inşa edilir. LwIP yoksa Weave, Malloc tabanlı bir uygulama ya da derinlemesine yerleştirilmiş cihazların bellek zorluklarını neredeyse tahmin eden havuz tabanlı bir uygulama sunar.

PacketBuffer sınıfı, katmanlı ağ yığınlarında kullanılan benzer birçok yapı gibi, yapılandırılabilir bir iletişim yığınının her katmanında protokol başlıkları için alan ayırmak üzere bir mekanizma sağlar. Ayrıntılar için PacketBuffer::New() ve LwIP dokümanlarını inceleyin.

PacketBuffer nesneleri referans sayılır ve Weave'deki baskın kullanım modu "&fire ve unut" şeklindedir. Paket (ve altındaki PacketBuffer nesnesi) çeşitli protokol katmanları aracılığıyla dağıtıldığı için katmanlar arasında başarılı geri çağırma veya geri çağırma sahiplik aktarımı anlamına gelir ve arabellek, arabelleği serbest bırakmaktan sorumludur. Katmanlar arası bir aramanın başarısız olması durumunda, arabelleği serbest bırakma sorumluluğu arayana aittir.

PacketBuffer sınıfının yeni nesneleri, dahili bir arabelleğe ait havuzdan, örneğin LwIP pbuf hedef havuzlarından, örneğin standart C kitaplığı yığın yığınından alınan bellek ayırma işleminin başında başlatılır. Basit durumda, veri arabelleğinin boyutu WEAVE_SYSTEM_PACKETBUFFER_SIZE şeklindedir. Diğer boyutlardaki veri arabelleklerinin kullanılmasına izin veren bir besteci sağlanır.

PacketBuffer nesneleri, daha büyük yükleri karşılamak için zincirlenebilir. Ancak zincirleme şeffaf değildir ve sınıfın kullanıcıları açıkça zincirlemeyi desteklemeye karar vermelidir. Zincir desteği ile yazılan sınıf örnekleri aşağıda verilmiştir:

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

Devralma

Devralma kaynağı: pbuf

Herkese açık işlevler

AddRef(void)
void
Mevcut arabelleğin referans sayısını artırın.
AddToEnd(PacketBuffer *aPacket)
void
Belirtilen paket arabelleğinin arabelleğe alma 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ında hizalayın.
AllocSize(void) const
size_t
Ayrılmış ve yük veri alanları dahil ancak ayırmanın boyutunu döndür, ancak PacketBuffer yapısı için ayrılan alanı döndürmeyin.
AvailableDataLength(void) const
uint16_t
Geçerli başlangıç konumu ve veri uzunluğuna göre geçerli arabelleğe eklenebilecek veri baytlarının sayısını öğrenin.
CompactHead(void)
void
Zincirdeki sonraki arabelleğe ait verileri dolu olana kadar mevcut arabelleğe taşır.
Consume(uint16_t aConsumeLength)
Verileri bir arabelleğe zincirinde kullan.
ConsumeHead(uint16_t aConsumeLength)
void
Tüketilen veri miktarını belirtmek için geçerli arabelleği ayarlayın.
DataLength(void) const
uint16_t
Paket arabelleğindeki veri uzunluğunu bayt cinsinden alın.
DetachTail(void)
Mevcut arabelleği zincirinden çıkarıp kalan arabelleğe bir işaretçi döndürün.
EnsureReservedSize(uint16_t aReservedSize)
bool
Arabellekte en azından belirtilen miktarda alan bulunduğundan emin olun.
MaxDataLength(void) const
uint16_t
Geçerli başlangıç konumu ve arabellek boyutu dikkate alınarak arabelleğe sığdıracak maksimum veri baytını bulun.
Next(void) const
Zincirdeki bir sonraki arabelleğe işaretçi ekle.
ReservedSize(void) const
uint16_t
Arabelleğe alma işleminin başlangıcı ile mevcut veri başlangıç konumu arasındaki geçerli arabellek içindeki bayt sayısını alın.
SetDataLength(uint16_t aNewLen, PacketBuffer *aChainHead)
void
Verilerin uzunluğunu arabelleğe alarak toplam uzunluğu buna göre ayarlayın.
SetStart(uint8_t *aNewStart)
void
Başlangıç verilerini arabelleğe alarak uzunluğu ve toplam uzunluğu buna göre ayarlayın.
Start(void) const
uint8_t *
Arabelleğe alınan verilerin başlangıcına dair işaretçiyi alın.
TotalLength(void) const
uint16_t
Tampon zincirinde 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.
FreeHead(PacketBuffer *aPacket)
Zincirdeki ilk arabelleği boşaltıp kalan arabelleğe bir işaretçi döndürür.
New(void)
Yükte varsayılan olarak ayrılmış boyutla (WEAVE_SYSTEM_CONFIG_HEADLINE_RESERVE_SIZE) tek bir varsayılan maksimum paket (WEAVE_SYSTEM_CONFIG_PACKETBUFFER_CAPACITY_MAX) ayırır.
New(uint16_t aReservedSize)
Belirli bir başlık koruma boyutuna sahip maksimum toplam tek bir PacketBuffer ayırır.
NewWithAvailableSize(size_t aAvailableSize)
Üstbilgiler için yükte varsayılan olarak ayrılmış boyutla (WEAVE_SYSTEM_CONFIG_ masthead_RESERVE_SIZE) ve ilk imleç işaretçisinden sonra ek veriler için en az aAllocSize baytlık bir PacketBuffer ayırır.
NewWithAvailableSize(uint16_t aReservedSize, size_t aAvailableSize)
Üstbilgiler için yükte en az aReservedSize bayt ayrılmış, ilk imleç işaretçisinden sonra ek veriler için en az aAllocSize baytlık bir PacketBuffer nesnesi ayırır.
RightSize(PacketBuffer *aPacket)
Belirtilen arabelleği mümkünse doğru boyutlu bir arabelleğe kopyalayın.

Herkese açık işlevler

Referans

void AddRef(
  void
)

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

Uç Sonu

void AddToEnd(
  PacketBuffer *aPacket
)

Belirtilen paket arabelleğinin arabelleğe alma zincirinin sonuna ekleyin ve zincirdeki her bir arabelleğin toplam uzunluğunu buna göre ayarlayın.

Ayrıntılar
Parametreler
[in] aPacket
- mevcut 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 arabelleğe alınan yükü ileri taşıyın.

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

Boya Boyutu

size_t AllocSize(
  void
) const 

Ayrılmış ve yük veri alanları dahil ancak ayırmanın boyutunu döndür, ancak PacketBuffer yapısı için ayrılan alanı döndürmeyin.

Ayrıntılar
İadeler
ayrılan payın boyutu

MevcutVeriUzunluğu

uint16_t AvailableDataLength(
  void
) const 

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

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

Kompakt Başlık

void CompactHead(
  void
)

Zincirdeki sonraki arabelleğe ait verileri dolu olana kadar mevcut arabelleğe taşır.

Yalnızca geçerli arabellek sıkıştırılır: Mevcut arabellekteki veriler arabelleğin önüne taşınır ve boşlukları ortadan kaldırır. Kalan kullanılabilir alan, geçerli tampon dolu olana kadar zincirdeki sonraki arabelleğe taşınan verilerle doldurulur. Zincirdeki takip eden bir arabelleğinin tamamı mevcut arabelleğe taşınırsa zincirden kaldırılır ve serbest bırakılır. Yöntem hiçbir parametre almaz, sonuç döndürmez ve başarısız olur.

Tüketme

PacketBuffer * Consume(
  uint16_t aConsumeLength
)

Verileri bir arabelleğe zincirinde kullan.

Verileri, geçerli arabellekten başlayıp zincirdeki kalan arabelleğe devam eden bir arabelleğe alma zincirinde kullanın. Tamamen tüketilen her bir arabellek serbest bırakılır ve işlev, kalan verileri içeren ilk arabelleği (varsa) döndürür. Mevcut arabellek, arabelleğe alma zincirinin başı olmalıdır.

Ayrıntılar
Parametreler
[in] aConsumeLength
- mevcut zincirden kullanılabilecek bayt sayısı.
İadeler
geçerli zincirden kalan tüm verileri içeren ilk arabellek. Veri kalmazsa NULL döndürülür.

Tüketim Başlığı

void ConsumeHead(
  uint16_t aConsumeLength
)

Tüketilen veri miktarını belirtmek için geçerli arabelleği ayarlayın.

Geçerli arabellekteki veri başlangıç konumunu, arabelleğe alınan veri uzunluğuna kadar, belirtilen miktarda bayt cinsinden artırın. Süreyi ve toplam uzunluğu tüketilen tutara göre azaltın.

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

VeriUzunluğu

uint16_t DataLength(
  void
) const 

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

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

Ayrıştırma

PacketBuffer * DetachTail(
  void
)

Mevcut arabelleği zincirinden çıkarıp kalan arabelleğe bir işaretçi döndürün.

Mevcut arabellek zincirin başı olmalıdır.

Ayrıntılar
İadeler
Mevcut arabellek zincirinin kuyruğu veya geçerli arabelleğe, zincirdeki tek arabellek varsa NULL.

Ayrılmış Boyut

bool EnsureReservedSize(
  uint16_t aReservedSize
)

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

Tamponun, arabellekteki verileri ileriye taşımak için en azından belirtilen miktarda boş alana sahip olduğundan emin olun.

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

Maks.VeriUzunluğu

uint16_t MaxDataLength(
  void
) const 

Geçerli başlangıç konumu ve arabellek boyutu dikkate alınarak arabelleğe sığdıracak maksimum veri baytını bulun.

Ayrıntılar
İadeler
geçerli başlangıç konumu dikkate alınarak arabelleğe sığan bayt sayısı.

İleri

PacketBuffer * Next(
  void
) const 

Zincirdeki bir sonraki arabelleğe işaretçi ekle.

Ayrıntılar
İadeler
zincirdeki bir sonraki arabelleğin işaretçisi olur. Zincirde arabelleğe alma olmadığında NULL döndürülür.

AyrılmışBoyut

uint16_t ReservedSize(
  void
) const 

Arabelleğe alma işleminin başlangıcı ile mevcut veri başlangıç konumu arasındaki geçerli arabellek içindeki bayt sayısını alın.

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

Veri Kümesi Uzunluğu

void SetDataLength(
  uint16_t aNewLen,
  PacketBuffer *aChainHead
)

Verilerin uzunluğunu arabelleğe alarak toplam uzunluğu buna göre ayarlayın.

İşlev, arabelleğe alınan verilerin uzunluğunu bayt cinsinden ayarlar ve toplam uzunluğu uygun şekilde ayarlar. Arabelleğe alma arabelleğe alma zincirinin başı olmadığında (yaygın durum: arayan, daha yüksek katman arama yapmadan önce PacketBuffer zincirindeki son arabelleğe veri ekler) her bir arabelleğin toplam uzunluklarını geçerli arabelleden önce düzgün şekilde ayarlamak için aChainHead aktarılmalıdır .

Ayrıntılar
Parametreler
[in] aNewLen
- bayt cinsinden yeni uzunluk.
[in,out] aChainHead
- geçerli arabelleğin ait olduğu arabelleğe alma zincirinin başlığı. Mevcut arabellek, arabelleğe alma zincirinin başıysa BOŞ olabilir.

SetBaşlangıç

void SetStart(
  uint8_t *aNewStart
)

Başlangıç verilerini arabelleğe alarak uzunluğu ve toplam uzunluğu buna göre ayarlayın.

Ayrıntılar
Parametreler
[in] aNewStart
- Yeni yükün başlaması gereken işaretçi. newStart, PacketBuffer zincirindeki ilk arabellek sınırları içinde yer alacak şekilde dahili olarak ayarlanır.

Başlat

uint8_t * Start(
  void
) const 

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

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

ToplamUzunluk

uint16_t TotalLength(
  void
) const 

Tampon zincirinde paket verilerinin toplam uzunluğunu alın.

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

Herkese açık statik işlevler

Ücretsiz

void Free(
  PacketBuffer *aPacket
)

Zincirdeki tüm paket arabelleklerini serbest bırak.

Referans sayısını, mevcut zincirdeki tüm arabelleklere azalt. Referans sayısı 0'a ulaşırsa ilgili tamponlar serbest bırakılır veya ayırma havuzlarına uygun şekilde döndürülür. Kural olarak, kullanıcılar bu yöntemi free() işlevinin eşdeğeri olarak ele almalı 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.

Serbest Başlık

PacketBuffer * FreeHead(
  PacketBuffer *aPacket
)

Zincirdeki ilk arabelleği boşaltıp kalan arabelleğe bir işaretçi döndürür.

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

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

Yeni

PacketBuffer * New(
  void
)

Yükte varsayılan olarak ayrılmış boyutla (WEAVE_SYSTEM_CONFIG_HEADLINE_RESERVE_SIZE) tek bir varsayılan maksimum paket (WEAVE_SYSTEM_CONFIG_PACKETBUFFER_CAPACITY_MAX) ayırır.

Ayrılmış boyut (WEAVE_SYSTEM_CONFIG_ifmobile_RESERVE_SIZE), WeaveMessageLayer ve WeaveExchangeLayer tarafından gerekli kılınan taşıma katmanı başlıklarının tutulacağı kadar büyüktür.

Yeni

PacketBuffer * New(
  uint16_t aReservedSize
)

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

Aktarılan parametre, ayrılacak arabellek genel boyutunu değil, farklı yığın katmanlarındaki paket başlıklarını karşılamak için yükten önce ayrılan boyuttur. Görüşmede belirtilen WEAVE_SYSTEM_CONFIG_PACKETBUFFER_CAPACITY_MAX arabellek boyutu.

  • PacketBuffer::New(0): Bu şekilde çağrıldığında, arabelleğe herhangi bir başlık ayrılmadan döndürülür ve sonuç olarak, yük tamamen arayan tarafından kullanılabilir. Bu kalıp, özellikle ağın yığın yığınlarının alt katmanlarında, kullanıcının yük uygun başlık istisnaları ile kopyalanacağını biliyorsa veya PacketBuffer::AddToEnd() aracılığıyla bir PacketBuffer zincirine eklenen PacketBuffer oluşturmada yararlıdır. Parametreler
    [in] aReservedSize
    ayrılacak başlık alanı.
    İadeler
    Başarılı olduğunda, NULL hatasında PacketBuffer işaretçisi.

YeniBoyuta UygunBoyut

PacketBuffer * NewWithAvailableSize(
  size_t aAvailableSize
)

Üstbilgiler için yükte varsayılan olarak ayrılmış boyutla (WEAVE_SYSTEM_CONFIG_ masthead_RESERVE_SIZE) ve ilk imleç işaretçisinden sonra ek veriler için en az aAllocSize baytlık bir PacketBuffer ayırır.

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

Ayrıntılar
Parametreler
[in] aAvailableSize
İmleçten sonra ayrılacak sekizli sayısı.
İadeler
Başarı olduğunda, ayrılan blokta PacketBuffer işaretçisi olur. Başarısız olduğunda NULL. *

YeniBoyuta UygunBoyut

PacketBuffer * NewWithAvailableSize(
  uint16_t aReservedSize,
  size_t aAvailableSize
)

Üstbilgiler için yükte en az aReservedSize bayt ayrılmış, ilk imleç işaretçisinden sonra ek veriler için en az aAllocSize baytlık bir PacketBuffer nesnesi ayırır.

Ayrıntılar
Parametreler
[in] aReservedSize
İmlecin arkasında tutulacak sekizli sayısı.
[in] aAvailableSize
İmleçten sonra ayrılacak sekizli sayısı.
İadeler
Başarı olduğunda, ayrılan blokta PacketBuffer işaretçisi olur. Başarısız olduğunda NULL.

RightSize

PacketBuffer * RightSize(
  PacketBuffer *aPacket
)

Belirtilen arabelleği mümkünse doğru boyutlu bir arabelleğe kopyalayın.

Bu işlev soketler için bir işlem değildir.

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