nl:: Weave:: System:: PacketBuffer
#include <src/system/SystemPacketBuffer.h>
पैकेट बफ़र क्लास एक मुख्य संरचना है, जिसका इस्तेमाल ऑक्टेट-सीरियलाइज़्ड डेटा के पैकेट में बदलाव करने के लिए किया जाता है. आम तौर पर, ऐसा ब्लूटूथ या इंटरनेट प्रोटोकॉल जैसे डेटा कम्यूनिकेशन नेटवर्क के संदर्भ में होता है.
खास जानकारी
LwIP-आधारित एनवायरमेंट में, यह क्लास उस लाइब्रेरी में तय किए गए pbuf स्ट्रक्चर पर बनाई गई है. LwIP के न होने पर, Weave मॉलिक-आधारित, या पूल के आधार पर, इंटिग्रेशन की सुविधा देता है. यह इंप्लीमेंटेशन, पूरी तरह से एम्बेड किए गए डिवाइसों की मेमोरी चुनौतियों का सटीक अनुमान लगाता है.
PacketBuffer क्लास, लेयर किए गए नेटवर्क स्टैक में इस्तेमाल किए जाने वाले कई मिलते-जुलते स्ट्रक्चर की तरह ही है. यह कॉन्फ़िगर करने लायक कम्यूनिकेशन स्टैक की हर लेयर पर, प्रोटोकॉल हेडर के लिए स्पेस रिज़र्व करने का तरीका उपलब्ध कराती है. ज़्यादा जानकारी के लिए, PacketBuffer::New()
के साथ-साथ LwIP दस्तावेज़ देखें.
PacketBuffer के ऑब्जेक्ट को रेफ़रंस के तौर पर गिना जाता है और Weave में इस्तेमाल करने का मौजूदा मोड "फ़ायर-ऐंड-फ़ोरगेट" होता है. पैकेट (और इसके PacketBuffer ऑब्जेक्ट) को अलग-अलग प्रोटोकॉल लेयर से भेजा जाता है. इसलिए, लेयर के बीच किए जाने वाले अप कॉल या डाउनकॉल का मतलब है कि पैकेट पर मालिकाना हक ट्रांसफ़र करना है. साथ ही, बफ़र को खाली करने की ज़िम्मेदारी कॉली की होती है. क्रॉस-लेयर कॉल के पूरा न हो पाने पर, बफ़र को फ़्री करने की ज़िम्मेदारी कॉलर पर होती है.
PacketBuffer क्लास के नए ऑब्जेक्ट, मौजूदा एनवायरमेंट से मिली मेमोरी के बंटवारे की शुरुआत में शुरू किए जाते हैं. उदाहरण के लिए, किसी इंटरनल बफ़र पूल से स्टैंडर्ड C लाइब्रेरी हीप के LwIP pbuf टारगेट पूल से मिलने वाले ऑब्जेक्ट. सामान्य मामले में, डेटा बफ़र का साइज़ WEAVE_SYSTEM_PACKETBUFFER_SIZE है. ऐसा कंपोज़र दिया जाता है जो दूसरे साइज़ के डेटा बफ़र के इस्तेमाल की अनुमति देता है.
PacketBuffer के ऑब्जेक्ट को बड़े पेलोड में शामिल करने के लिए जोड़ा जा सकता है. हालांकि, चेन करना पारदर्शी नहीं है और क्लास के उपयोगकर्ताओं को साफ़ तौर पर चेन लगाने की सुविधा को सपोर्ट करने का फ़ैसला लेना होगा. चेनिंग सपोर्ट के साथ लिखी गई क्लास के उदाहरण यहां दिए गए हैं:
@ref nl::Weave::WeaveTLVReader @ref nl::Weave::WeaveTLVWriter
इनहेरिटेंस
यहां से इनहेरिट किया जाता है: pbuf
सार्वजनिक फ़ंक्शन |
|
---|---|
AddRef(void)
|
void
मौजूदा बफ़र की पहचान संख्या बढ़ाएं.
|
AddToEnd(PacketBuffer *aPacket)
|
void
दिए गए पैकेट बफ़र को बफ़र चेन के आखिर में जोड़ें. इसके लिए, चेन में हर बफ़र की कुल लंबाई को ज़रूरत के मुताबिक अडजस्ट करें.
|
AlignPayload(uint16_t aAlignBytes)
|
bool
बफ़र पेलोड को तय बाइट सीमा पर अलाइन करें.
|
AllocSize(void) const
|
size_t
ऐलोकेशन का साइज़ दिखाएं. इसमें, रिज़र्व किए गए और पेलोड डेटा के स्पेस शामिल हैं. हालांकि, इसमें PacketBuffer के स्ट्रक्चर के लिए असाइन किए गए स्पेस को शामिल नहीं किया गया.
|
AvailableDataLength(void) const
|
uint16_t
डेटा शुरू होने की मौजूदा पोज़िशन और डेटा की लंबाई के हिसाब से, कितने बाइट डेटा मौजूदा बफ़र में जोड़ा जा सकता है, इसका पता लगाएं.
|
CompactHead(void)
|
void
चेन में बाद के बफ़र का डेटा मौजूदा बफ़र में तब तक ट्रांसफ़र करें, जब तक कि वह पूरा न हो जाए.
|
Consume(uint16_t aConsumeLength)
|
बफ़र की चेन में डेटा का इस्तेमाल करें.
|
ConsumeHead(uint16_t aConsumeLength)
|
void
इस्तेमाल किए गए डेटा की मात्रा बताने के लिए मौजूदा बफ़र में बदलाव करें.
|
DataLength(void) const
|
uint16_t
पैकेट बफ़र में डेटा की लंबाई बाइट में देखें.
|
DetachTail(void)
|
मौजूदा बफ़र को इसकी चेन से अलग करें और बाकी के बफ़र के लिए पॉइंटर वापस करें.
|
EnsureReservedSize(uint16_t aReservedSize)
|
bool
पक्का करें कि बफ़र में रिज़र्व की गई जगह के लिए कम से कम तय की गई जगह हो.
|
MaxDataLength(void) const
|
uint16_t
डेटा शुरू होने की मौजूदा पोज़िशन और बफ़र साइज़ के आधार पर, बफ़र में फ़िट होने वाले डेटा की ज़्यादा से ज़्यादा संख्या बाइट में देखें.
|
Next(void) const
|
चेन में अगले बफ़र पर जाने के लिए पॉइंटर पाएं.
|
ReservedSize(void) const
|
uint16_t
बफ़र की शुरुआत और डेटा के शुरू होने की मौजूदा जगह के बीच के बफ़र में बाइट की संख्या पाएं.
|
SetDataLength(uint16_t aNewLen, PacketBuffer *aChainHead)
|
void
बफ़र में डेटा की लंबाई, बाइट में सेट करें और कुल लंबाई को उसके मुताबिक एडजस्ट करें.
|
SetStart(uint8_t *aNewStart)
|
void
लम्बाई और कुल लंबाई को उसके मुताबिक एडजस्ट करते हुए, स्टार्ट डेटा को बफ़र में सेट करें.
|
Start(void) const
|
uint8_t *
बफ़र में डेटा शुरू करने के लिए पॉइंटर पाएं.
|
TotalLength(void) const
|
uint16_t
बफ़र चेन में पैकेट डेटा की कुल अवधि देखें.
|
सार्वजनिक स्टैटिक फ़ंक्शन |
|
---|---|
Free(PacketBuffer *aPacket)
|
void
चेन में सभी पैकेट बफ़र्स को मुफ़्त में आज़माएं.
|
FreeHead(PacketBuffer *aPacket)
|
किसी चेन का पहला बफ़र फ़्री करें. इससे, बाकी के बफ़र के लिए पॉइंटर वापस लाए जा सकेंगे.
|
New(void)
|
पेलोड में, डिफ़ॉल्ट तौर पर रिज़र्व किए गए साइज़ (WEAVE_SYSTEM_CONFIG_HEADER_RESERVE_SIZE) के साथ, डिफ़ॉल्ट तौर पर ज़्यादा से ज़्यादा साइज़ (WEAVE_SYSTEM_CONFIG_PACKETBUFFER_CAPACITY_MAX) का एक PacketBuffer असाइन करता है.
|
New(uint16_t aReservedSize)
|
यह हेडर रिज़र्व साइज़ के साथ, ज़्यादा से ज़्यादा कुल साइज़ का एक PacketBuffer असाइन करता है.
|
NewWithAvailableSize(size_t aAvailableSize)
|
हेडर के लिए पेलोड में, डिफ़ॉल्ट रिज़र्व साइज़ (WEAVE_SYSTEM_CONFIG_HEADER_RESERVE_SIZE) वाला PacketBuffer और शुरुआती कर्सर पॉइंटर के बाद, अतिरिक्त डेटा के लिए कम से कम
aAllocSize बाइट की जगह तय करता है. |
NewWithAvailableSize(uint16_t aReservedSize, size_t aAvailableSize)
|
यह PacketBuffer ऑब्जेक्ट के लिए, हेडर के पेलोड में कम से कम
aReservedSize बाइट रिज़र्व करता है. साथ ही, शुरुआती कर्सर पॉइंटर के बाद, अतिरिक्त डेटा के लिए कम से कम aAllocSize बाइट की जगह देता है. |
RightSize(PacketBuffer *aPacket)
|
अगर लागू हो, तो दिए गए बफ़र को दाएं आकार के बफ़र में कॉपी करें.
|
सार्वजनिक फ़ंक्शन
AddRef
void AddRef( void )
मौजूदा बफ़र की पहचान संख्या बढ़ाएं.
AddToEnd
void AddToEnd( PacketBuffer *aPacket )
दिए गए पैकेट बफ़र को बफ़र चेन के आखिर में जोड़ें. इसके लिए, चेन में हर बफ़र की कुल लंबाई को ज़रूरत के मुताबिक अडजस्ट करें.
जानकारी | |||
---|---|---|---|
पैरामीटर |
|
AlignPayload
bool AlignPayload( uint16_t aAlignBytes )
बफ़र पेलोड को तय बाइट सीमा पर अलाइन करें.
अगर ज़रूरी हो, तो पेलोड को बफ़र में आगे ले जाएं.
जानकारी | |||
---|---|---|---|
पैरामीटर |
|
||
लौटाए गए सामान |
अलाइन होने पर
true और बफ़र में जगह न होने पर false . |
AllocSize
size_t AllocSize( void ) const
ऐलोकेशन का साइज़ दिखाएं. इसमें, रिज़र्व किए गए और पेलोड डेटा के स्पेस शामिल हैं. हालांकि, इसमें PacketBuffer के स्ट्रक्चर के लिए असाइन किए गए स्पेस को शामिल नहीं किया गया.
जानकारी | |
---|---|
लौटाए गए सामान |
ऐलोकेशन का साइज़
|
AvailableDataLength
uint16_t AvailableDataLength( void ) const
डेटा शुरू होने की मौजूदा पोज़िशन और डेटा की लंबाई के हिसाब से, कितने बाइट डेटा मौजूदा बफ़र में जोड़ा जा सकता है, इसका पता लगाएं.
जानकारी | |
---|---|
लौटाए गए सामान |
डेटा की लंबाई, बाइट में, जो मौजूदा बफ़र में फ़िट होने वाले डेटा के शुरू होने की मौजूदा पोज़िशन और डेटा की लंबाई के आधार पर तय होती है.
|
CompactHead
void CompactHead( void )
चेन में बाद के बफ़र का डेटा मौजूदा बफ़र में तब तक ट्रांसफ़र करें, जब तक कि वह पूरा न हो जाए.
सिर्फ़ मौजूदा बफ़र को छोटा किया जाता है: मौजूदा बफ़र में मौजूद डेटा को बफ़र के आगे मूव कर दिया जाता है. इससे, रिज़र्व किया गया स्टोरेज खत्म हो जाता है. जब तक मौजूदा बफ़र पूरा नहीं हो जाता, तब तक बची हुई जगह में डेटा को चेन में बाद के बफ़र से ट्रांसफ़र किया गया डेटा भर दिया जाता है. अगर चेन में बाद के बफ़र को पूरी तरह से मौजूदा बफ़र में ले जाया जाता है, तो उसे चेन से हटाकर अलग कर दिया जाता है. यह तरीका कोई पैरामीटर नहीं लेता, नतीजे नहीं देता, और नतीजे देता है.
इस्तेमाल करें
PacketBuffer * Consume( uint16_t aConsumeLength )
बफ़र की चेन में डेटा का इस्तेमाल करें.
मौजूदा बफ़र से शुरू होने वाले और चेन में बाकी के बफ़र के ज़रिए आगे बढ़ाकर, बफ़र की किसी चेन में डेटा का इस्तेमाल करें. पूरी तरह इस्तेमाल किए गए हर बफ़र को खाली कर दिया जाता है. इसके बाद, फ़ंक्शन बाकी डेटा वाला पहला बफ़र (अगर कोई है) दिखाता है. मौजूदा बफ़र, बफ़र चेन का सबसे ऊपर होना चाहिए.
जानकारी | |||
---|---|---|---|
पैरामीटर |
|
||
लौटाए गए सामान |
मौजूदा चेन का पहला बफ़र, जिसमें बचा हुआ डेटा शामिल है. अगर कोई डेटा नहीं दिखता, तो NULL देता है.
|
ConsumeHead
void ConsumeHead( uint16_t aConsumeLength )
इस्तेमाल किए गए डेटा की मात्रा बताने के लिए मौजूदा बफ़र में बदलाव करें.
मौजूदा बफ़र में डेटा के शुरू होने की जगह को, तय की गई संख्या तक बाइट में बढ़ाएं. ऐसा बफ़र में मौजूद डेटा की लंबाई तक बढ़ाएं. लंबाई और कुल लंबाई को खपत की गई मात्रा से घटाएं.
जानकारी | |||
---|---|---|---|
पैरामीटर |
|
DataLength
uint16_t DataLength( void ) const
पैकेट बफ़र में डेटा की लंबाई बाइट में देखें.
जानकारी | |
---|---|
लौटाए गए सामान |
लंबाई, बाइट में (मौजूदा पेलोड लंबाई).
|
DetachTail
PacketBuffer * DetachTail( void )
मौजूदा बफ़र को इसकी चेन से अलग करें और बाकी के बफ़र के लिए पॉइंटर वापस करें.
मौजूदा बफ़र, चेन का सबसे ऊपर होना चाहिए.
जानकारी | |
---|---|
लौटाए गए सामान |
मौजूदा बफ़र चेन का टेल या तब, जब चेन में मौजूदा बफ़र ही बफ़र हो.
|
EnsureReservedSize
bool EnsureReservedSize( uint16_t aReservedSize )
पक्का करें कि बफ़र में रिज़र्व की गई जगह के लिए कम से कम तय की गई जगह हो.
पक्का करें कि बफ़र में कम से कम तय की गई जगह हो, ताकि ज़रूरत के हिसाब से जगह बनाने के लिए बफ़र में डेटा को आगे बढ़ाया जा सके.
जानकारी | |||
---|---|---|---|
पैरामीटर |
|
||
लौटाए गए सामान |
अगर रिज़र्व किया गया साइज़ उपलब्ध है, तो
true . बफ़र में जगह न होने पर false . |
MaxDataLength
uint16_t MaxDataLength( void ) const
डेटा शुरू होने की मौजूदा पोज़िशन और बफ़र साइज़ के आधार पर, बफ़र में फ़िट होने वाले डेटा की ज़्यादा से ज़्यादा संख्या बाइट में देखें.
जानकारी | |
---|---|
लौटाए गए सामान |
मौजूदा शुरुआती पोज़िशन के आधार पर, बफ़र में फ़िट होने वाले बाइट की संख्या.
|
आगे बढ़ें
PacketBuffer * Next( void ) const
चेन में अगले बफ़र पर जाने के लिए पॉइंटर पाएं.
जानकारी | |
---|---|
लौटाए गए सामान |
चेन में अगले बफ़र पर जाने के लिए एक पॉइंटर. जब चेन में कोई बफ़र नहीं होता, तब
NULL को लौटाया जाता है. |
ReservedSize
uint16_t ReservedSize( void ) const
बफ़र की शुरुआत और डेटा के शुरू होने की मौजूदा जगह के बीच के बफ़र में बाइट की संख्या पाएं.
जानकारी | |
---|---|
लौटाए गए सामान |
बफ़र की शुरुआत और डेटा के शुरू होने की मौजूदा जगह के बीच की खाली जगह. यह बाइट में दिखती है.
|
SetDataLength
void SetDataLength( uint16_t aNewLen, PacketBuffer *aChainHead )
बफ़र में डेटा की लंबाई, बाइट में सेट करें और कुल लंबाई को उसके मुताबिक एडजस्ट करें.
फ़ंक्शन, बफ़र में मौजूद डेटा की लंबाई बाइट में सेट करता है और कुल लंबाई को सही तरीके से अडजस्ट करता है. जब बफ़र, बफ़र चेन का हेड न हो (सामान्य केस: कॉलर, ऊपरी लेयर को कॉल करने से पहले, PacketBuffer चेन के आखिरी बफ़र में डेटा जोड़ता है), तो मौजूदा बफ़र से आगे हर बफ़र की कुल लंबाई को सही तरीके से अडजस्ट करने के लिए, aChainHEAD को पास किया जाना ज़रूरी है.
जानकारी | |||||
---|---|---|---|---|---|
पैरामीटर |
|
SetStart
void SetStart( uint8_t *aNewStart )
लम्बाई और कुल लंबाई को उसके मुताबिक एडजस्ट करते हुए, स्टार्ट डेटा को बफ़र में सेट करें.
जानकारी | |||
---|---|---|---|
पैरामीटर |
|
शुरू करें
uint8_t * Start( void ) const
बफ़र में डेटा शुरू करने के लिए पॉइंटर पाएं.
जानकारी | |
---|---|
लौटाए गए सामान |
पॉइंटर की मदद से डेटा की शुरुआत करें.
|
TotalLength
uint16_t TotalLength( void ) const
बफ़र चेन में पैकेट डेटा की कुल अवधि देखें.
जानकारी | |
---|---|
लौटाए गए सामान |
ऑक्टेट में कुल लंबाई.
|
सार्वजनिक स्टैटिक फ़ंक्शन
बिना किसी शुल्क के आज़माएं
void Free( PacketBuffer *aPacket )
चेन में सभी पैकेट बफ़र्स को मुफ़्त में आज़माएं.
मौजूदा चेन के सभी बफ़र के लिए पहचान फ़ाइलों की संख्या कम करें. अगर पहचान फ़ाइलों की संख्या 0 हो जाती है, तो उससे जुड़े बफ़र फ़्री कर दिए जाते हैं या ज़रूरत के मुताबिक ऐलोकेशन पूल में लौटा दिए जाते हैं. नियम के तौर पर, उपयोगकर्ताओं को इस तरीके को free()
फ़ंक्शन के बराबर मानना चाहिए और कॉल के बाद आर्ग्युमेंट का इस्तेमाल नहीं करना चाहिए.
जानकारी | |||
---|---|---|---|
पैरामीटर |
|
FreeHead
PacketBuffer * FreeHead( PacketBuffer *aPacket )
किसी चेन का पहला बफ़र फ़्री करें. इससे, बाकी के बफ़र के लिए पॉइंटर वापस लाए जा सकेंगे.
* @note When the buffer chain is referenced by multiple callers,
FreeHead()`, सिर को अलग कर देगा, लेकिन हेड बफ़र को ज़बरदस्ती नहीं हटाएगा.
जानकारी | |||
---|---|---|---|
पैरामीटर |
|
||
लौटाए गए सामान |
पैकेट बफ़र चेन, जिसमें इनपुट बफ़र का टेल टेल होता है. यह
NULL हो सकता है. |
नए दर्शक
PacketBuffer * New( void )
पेलोड में, डिफ़ॉल्ट तौर पर रिज़र्व किए गए साइज़ (WEAVE_SYSTEM_CONFIG_HEADER_RESERVE_SIZE) के साथ, डिफ़ॉल्ट तौर पर ज़्यादा से ज़्यादा साइज़ (WEAVE_SYSTEM_CONFIG_PACKETBUFFER_CAPACITY_MAX) का एक PacketBuffer असाइन करता है.
रिज़र्व किया गया साइज़ (WEAVE_SYSTEM_CONFIG_HEADER_RESERVE_SIZE), ट्रांसपोर्ट लेयर हेडर के साथ-साथ WeaveMessageLayer
और WeaveExchangeLayer
के लिए ज़रूरी हेडर को होल्ड करने के लिए काफ़ी बड़ा है.
नए दर्शक
PacketBuffer * New( uint16_t aReservedSize )
यह हेडर रिज़र्व साइज़ के साथ, ज़्यादा से ज़्यादा कुल साइज़ का एक PacketBuffer असाइन करता है.
इसमें पास किया गया पैरामीटर, वह साइज़ होता है जो अलग-अलग स्टैक लेयर में पैकेट हेडर को शामिल करने के लिए पेलोड से पहले रिज़र्व किया जाता है. हालांकि, यह बफ़र का कुल साइज़ नहीं होता. बफ़र का साइज़ WEAVE_SYSTEM_CONFIG_PACKETBUFFER_CAPACITY_MAX के अलावा, कॉल में शामिल नहीं किया गया है.
PacketBuffer::New(0)
: जब इस तरह कॉल किया जाता है, तो बफ़र बिना किसी हेडर के वापस आ जाएगा. इसका नतीजा यह होगा कि कॉलर, पूरे पेलोड का इस्तेमाल कर सकता है. यह पैटर्न खास तौर पर नेटवर्किंग स्टैक की निचली लेयर पर काम करता है. ऐसा तब होता है, जब उपयोगकर्ता को पता हो कि पेलोड को सही हेडर रिज़र्व के साथ फ़ाइनल मैसेज में कॉपी किया जाएगा. इसके अलावा, ऐसा PacketBuffer बनाने में भी किया जा सकता है जिसेPacketBuffer::AddToEnd()
से, PacketBuffer की चेन से जोड़ा जाता है. पैरामीटर[in] aReservedSize
हेडर स्पेस को रिज़र्व करने के लिए.सफल होने पर,NULL
न होने पर PacketBuffer के लिए पॉइंटर.
NewWithAvailableSize
PacketBuffer * NewWithAvailableSize( size_t aAvailableSize )
हेडर के लिए पेलोड में, डिफ़ॉल्ट रिज़र्व साइज़ (WEAVE_SYSTEM_CONFIG_HEADER_RESERVE_SIZE) वाला PacketBuffer और शुरुआती कर्सर पॉइंटर के बाद, अतिरिक्त डेटा के लिए कम से कम aAllocSize
बाइट की जगह तय करता है.
यह तरीका, ऐप्लिकेशन-लेयर मैसेज के लिए PacketBuffer को असाइन करते समय सबसे सही होता है.
जानकारी | |||
---|---|---|---|
पैरामीटर |
|
||
लौटाए गए सामान |
सफल होने पर, असाइन किए गए ब्लॉक में PacketBuffer के लिए पॉइंटर. विफल होने पर,
NULL . * |
NewWithAvailableSize
PacketBuffer * NewWithAvailableSize( uint16_t aReservedSize, size_t aAvailableSize )
यह PacketBuffer ऑब्जेक्ट के लिए, हेडर के पेलोड में कम से कम aReservedSize
बाइट रिज़र्व करता है. साथ ही, शुरुआती कर्सर पॉइंटर के बाद, अतिरिक्त डेटा के लिए कम से कम aAllocSize
बाइट की जगह देता है.
जानकारी | |||||
---|---|---|---|---|---|
पैरामीटर |
|
||||
लौटाए गए सामान |
सफल होने पर, असाइन किए गए ब्लॉक में PacketBuffer के लिए पॉइंटर. विफल होने पर,
NULL . |
RightSize
PacketBuffer * RightSize( PacketBuffer *aPacket )
अगर लागू हो, तो दिए गए बफ़र को दाएं आकार के बफ़र में कॉपी करें.
यह फ़ंक्शन, सॉकेट के लिए इस्तेमाल नहीं करता.
जानकारी | |||
---|---|---|---|
पैरामीटर |
|
||
लौटाए गए सामान |
नया पैकेट बफ़र या ओरिजनल बफ़र
|