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 |
|
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 |
|
||
İ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 |
|
||
İ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 |
|
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 |
|
||
İ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 |
|
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 |
|
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 |
|
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 |
|
||
İ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 veyaPacketBuffer::AddToEnd()
aracılığıyla PacketBuffer zincirine eklenen PacketBuffer oluştururken kullanışlıdır. Parametreler[in] aReservedSize
miktarıdır.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 |
|
||
İ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 |
|
||||
İ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 |
|
||
İadeler |
yeni paket arabelleği veya orijinal arabellek
|