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 |
|
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 |
|
||
İ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 |
|
||
İ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 |
|
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 |
|
||
İ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 |
|
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 |
|
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 |
|
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 |
|
||
İ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 veyaPacketBuffer::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ı.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 |
|
||
İ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 |
|
||||
İ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 |
|
||
İadeler |
yeni paket arabelleği veya orijinal arabellek
|