mirror of
https://github.com/espressif/openthread.git
synced 2026-09-13 04:30:08 +00:00
[message] decouple message and ip6 (#2028)
This commit is contained in:
@@ -86,16 +86,17 @@ otInstance::otInstance(void) :
|
||||
#if OPENTHREAD_CONFIG_ENABLE_PLATFORM_USEC_TIMER
|
||||
mTimerMicroScheduler(this),
|
||||
#endif
|
||||
mThreadNetif(mIp6)
|
||||
mThreadNetif(mIp6),
|
||||
#if OPENTHREAD_ENABLE_RAW_LINK_API
|
||||
, mLinkRaw(*this)
|
||||
mLinkRaw(*this),
|
||||
#endif // OPENTHREAD_ENABLE_RAW_LINK_API
|
||||
#if OPENTHREAD_ENABLE_APPLICATION_COAP
|
||||
, mApplicationCoap(mThreadNetif)
|
||||
mApplicationCoap(mThreadNetif),
|
||||
#endif // OPENTHREAD_ENABLE_APPLICATION_COAP
|
||||
#if OPENTHREAD_CONFIG_ENABLE_DYNAMIC_LOG_LEVEL
|
||||
, mLogLevel(static_cast<otLogLevel>(OPENTHREAD_CONFIG_LOG_LEVEL))
|
||||
mLogLevel(static_cast<otLogLevel>(OPENTHREAD_CONFIG_LOG_LEVEL)),
|
||||
#endif // OPENTHREAD_CONFIG_ENABLE_DYNAMIC_LOG_LEVEL
|
||||
mMessagePool(this)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
@@ -172,7 +172,7 @@ otError otIp6Send(otInstance *aInstance, otMessage *aMessage)
|
||||
|
||||
otMessage *otIp6NewMessage(otInstance *aInstance, bool aLinkSecurityEnabled)
|
||||
{
|
||||
Message *message = aInstance->mIp6.mMessagePool.New(Message::kTypeIp6, 0);
|
||||
Message *message = aInstance->mMessagePool.New(Message::kTypeIp6, 0);
|
||||
|
||||
if (message)
|
||||
{
|
||||
|
||||
@@ -154,7 +154,7 @@ void otMessageGetBufferInfo(otInstance *aInstance, otBufferInfo *aBufferInfo)
|
||||
{
|
||||
aBufferInfo->mTotalBuffers = OPENTHREAD_CONFIG_NUM_MESSAGE_BUFFERS;
|
||||
|
||||
aBufferInfo->mFreeBuffers = aInstance->mThreadNetif.GetIp6().mMessagePool.GetFreeBufferCount();
|
||||
aBufferInfo->mFreeBuffers = aInstance->mMessagePool.GetFreeBufferCount();
|
||||
|
||||
aInstance->mThreadNetif.GetMeshForwarder().GetSendQueue().GetInfo(aBufferInfo->m6loSendMessages,
|
||||
aBufferInfo->m6loSendBuffers);
|
||||
|
||||
@@ -34,6 +34,7 @@
|
||||
|
||||
#include "common/logging.hpp"
|
||||
#include "meshcop/dtls.hpp"
|
||||
#include "openthread-instance.h"
|
||||
#include "thread/thread_netif.hpp"
|
||||
|
||||
#if OPENTHREAD_ENABLE_DTLS
|
||||
@@ -218,7 +219,7 @@ void CoapSecure::HandleDtlsReceive(uint8_t *aBuf, uint16_t aLength)
|
||||
|
||||
otLogFuncEntry();
|
||||
|
||||
VerifyOrExit((message = GetNetif().GetIp6().mMessagePool.New(Message::kTypeIp6, 0)) != NULL);
|
||||
VerifyOrExit((message = GetInstance()->mMessagePool.New(Message::kTypeIp6, 0)) != NULL);
|
||||
SuccessOrExit(message->Append(aBuf, aLength));
|
||||
|
||||
Coap::Receive(*message, mPeerAddress);
|
||||
|
||||
@@ -710,6 +710,24 @@ exit:
|
||||
return rval;
|
||||
}
|
||||
|
||||
uint16_t Message::UpdateChecksum(uint16_t aChecksum, uint16_t aValue)
|
||||
{
|
||||
uint16_t result = aChecksum + aValue;
|
||||
return result + (result < aChecksum);
|
||||
}
|
||||
|
||||
uint16_t Message::UpdateChecksum(uint16_t aChecksum, const void *aBuf, uint16_t aLength)
|
||||
{
|
||||
const uint8_t *bytes = reinterpret_cast<const uint8_t *>(aBuf);
|
||||
|
||||
for (int i = 0; i < aLength; i++)
|
||||
{
|
||||
aChecksum = UpdateChecksum(aChecksum, (i & 1) ? bytes[i] : static_cast<uint16_t>(bytes[i] << 8));
|
||||
}
|
||||
|
||||
return aChecksum;
|
||||
}
|
||||
|
||||
uint16_t Message::UpdateChecksum(uint16_t aChecksum, uint16_t aOffset, uint16_t aLength) const
|
||||
{
|
||||
Buffer *curBuffer;
|
||||
@@ -730,7 +748,7 @@ uint16_t Message::UpdateChecksum(uint16_t aChecksum, uint16_t aOffset, uint16_t
|
||||
bytesToCover = aLength;
|
||||
}
|
||||
|
||||
aChecksum = Ip6::Ip6::UpdateChecksum(aChecksum, GetFirstData() + aOffset, bytesToCover);
|
||||
aChecksum = Message::UpdateChecksum(aChecksum, GetFirstData() + aOffset, bytesToCover);
|
||||
|
||||
aLength -= bytesToCover;
|
||||
bytesCovered += bytesToCover;
|
||||
@@ -765,7 +783,7 @@ uint16_t Message::UpdateChecksum(uint16_t aChecksum, uint16_t aOffset, uint16_t
|
||||
bytesToCover = aLength;
|
||||
}
|
||||
|
||||
aChecksum = Ip6::Ip6::UpdateChecksum(aChecksum, curBuffer->GetData() + aOffset, bytesToCover);
|
||||
aChecksum = Message::UpdateChecksum(aChecksum, curBuffer->GetData() + aOffset, bytesToCover);
|
||||
|
||||
aLength -= bytesToCover;
|
||||
bytesCovered += bytesToCover;
|
||||
|
||||
@@ -645,6 +645,29 @@ public:
|
||||
*/
|
||||
const RssAverager &GetRssAverager(void) const { return mBuffer.mHead.mInfo.mRssAverager; }
|
||||
|
||||
/**
|
||||
* This static method updates a checksum.
|
||||
*
|
||||
* @param[in] aChecksum The checksum value to update.
|
||||
* @param[in] aValue The 16-bit value to update @p aChecksum with.
|
||||
*
|
||||
* @returns The updated checksum.
|
||||
*
|
||||
*/
|
||||
static uint16_t UpdateChecksum(uint16_t aChecksum, uint16_t aValue);
|
||||
|
||||
/**
|
||||
* This static method updates a checksum.
|
||||
*
|
||||
* @param[in] aChecksum The checksum value to update.
|
||||
* @param[in] aBuf A pointer to a buffer.
|
||||
* @param[in] aLength The number of bytes in @p aBuf.
|
||||
*
|
||||
* @returns The updated checksum.
|
||||
*
|
||||
*/
|
||||
static uint16_t UpdateChecksum(uint16_t aChecksum, const void *aBuf, uint16_t aLength);
|
||||
|
||||
/**
|
||||
* This method is used to update a checksum value.
|
||||
*
|
||||
|
||||
+5
-23
@@ -57,7 +57,6 @@ Ip6::Ip6(void):
|
||||
mIcmp(*this),
|
||||
mUdp(*this),
|
||||
mMpl(*this),
|
||||
mMessagePool(GetInstance()),
|
||||
mForwardingEnabled(false),
|
||||
mSendQueueTask(GetInstance(), HandleSendQueue, this),
|
||||
mReceiveIp6DatagramCallback(NULL),
|
||||
@@ -69,30 +68,13 @@ Ip6::Ip6(void):
|
||||
|
||||
Message *Ip6::NewMessage(uint16_t aReserved)
|
||||
{
|
||||
return mMessagePool.New(Message::kTypeIp6, sizeof(Header) + sizeof(HopByHopHeader) + sizeof(OptionMpl) + aReserved);
|
||||
}
|
||||
|
||||
uint16_t Ip6::UpdateChecksum(uint16_t aChecksum, uint16_t aValue)
|
||||
{
|
||||
uint16_t result = aChecksum + aValue;
|
||||
return result + (result < aChecksum);
|
||||
}
|
||||
|
||||
uint16_t Ip6::UpdateChecksum(uint16_t aChecksum, const void *aBuf, uint16_t aLength)
|
||||
{
|
||||
const uint8_t *bytes = reinterpret_cast<const uint8_t *>(aBuf);
|
||||
|
||||
for (int i = 0; i < aLength; i++)
|
||||
{
|
||||
aChecksum = Ip6::UpdateChecksum(aChecksum, (i & 1) ? bytes[i] : static_cast<uint16_t>(bytes[i] << 8));
|
||||
}
|
||||
|
||||
return aChecksum;
|
||||
return GetInstance()->mMessagePool.New(Message::kTypeIp6,
|
||||
sizeof(Header) + sizeof(HopByHopHeader) + sizeof(OptionMpl) + aReserved);
|
||||
}
|
||||
|
||||
uint16_t Ip6::UpdateChecksum(uint16_t aChecksum, const Address &aAddress)
|
||||
{
|
||||
return Ip6::UpdateChecksum(aChecksum, aAddress.mFields.m8, sizeof(aAddress));
|
||||
return Message::UpdateChecksum(aChecksum, aAddress.mFields.m8, sizeof(aAddress));
|
||||
}
|
||||
|
||||
uint16_t Ip6::ComputePseudoheaderChecksum(const Address &aSource, const Address &aDestination, uint16_t aLength,
|
||||
@@ -100,8 +82,8 @@ uint16_t Ip6::ComputePseudoheaderChecksum(const Address &aSource, const Address
|
||||
{
|
||||
uint16_t checksum;
|
||||
|
||||
checksum = Ip6::UpdateChecksum(0, aLength);
|
||||
checksum = Ip6::UpdateChecksum(checksum, static_cast<uint16_t>(aProto));
|
||||
checksum = Message::UpdateChecksum(0, aLength);
|
||||
checksum = Message::UpdateChecksum(checksum, static_cast<uint16_t>(aProto));
|
||||
checksum = UpdateChecksum(checksum, aSource);
|
||||
checksum = UpdateChecksum(checksum, aDestination);
|
||||
|
||||
|
||||
@@ -168,29 +168,6 @@ public:
|
||||
*/
|
||||
void EnqueueDatagram(Message &aMessage);
|
||||
|
||||
/**
|
||||
* This static method updates a checksum.
|
||||
*
|
||||
* @param[in] aChecksum The checksum value to update.
|
||||
* @param[in] aValue The 16-bit value to update @p aChecksum with.
|
||||
*
|
||||
* @returns The updated checksum.
|
||||
*
|
||||
*/
|
||||
static uint16_t UpdateChecksum(uint16_t aChecksum, uint16_t aValue);
|
||||
|
||||
/**
|
||||
* This static method updates a checksum.
|
||||
*
|
||||
* @param[in] aChecksum The checksum value to update.
|
||||
* @param[in] aBuf A pointer to a buffer.
|
||||
* @param[in] aLength The number of bytes in @p aBuf.
|
||||
*
|
||||
* @returns The updated checksum.
|
||||
*
|
||||
*/
|
||||
static uint16_t UpdateChecksum(uint16_t aChecksum, const void *aBuf, uint16_t aLength);
|
||||
|
||||
/**
|
||||
* This static method updates a checksum.
|
||||
*
|
||||
@@ -372,8 +349,6 @@ public:
|
||||
Udp mUdp;
|
||||
Mpl mMpl;
|
||||
|
||||
MessagePool mMessagePool;
|
||||
|
||||
private:
|
||||
static void HandleSendQueue(Tasklet &aTasklet);
|
||||
void HandleSendQueue(void);
|
||||
|
||||
@@ -102,6 +102,7 @@ typedef struct otInstance
|
||||
#if OPENTHREAD_CONFIG_ENABLE_DYNAMIC_LOG_LEVEL
|
||||
otLogLevel mLogLevel;
|
||||
#endif // OPENTHREAD_CONFIG_ENABLE_DYNAMIC_LOG_LEVEL
|
||||
ot::MessagePool mMessagePool;
|
||||
|
||||
// Constructor
|
||||
otInstance(void);
|
||||
|
||||
@@ -108,7 +108,7 @@ otError DataPollManager::SendDataPoll(void)
|
||||
VerifyOrExit(message->GetType() != Message::kTypeMacDataPoll, error = OT_ERROR_ALREADY);
|
||||
}
|
||||
|
||||
message = meshForwarder.GetNetif().GetIp6().mMessagePool.New(Message::kTypeMacDataPoll, 0);
|
||||
message = meshForwarder.GetInstance()->mMessagePool.New(Message::kTypeMacDataPoll, 0);
|
||||
VerifyOrExit(message != NULL, error = OT_ERROR_NO_BUFS);
|
||||
|
||||
error = meshForwarder.SendMessage(*message);
|
||||
|
||||
@@ -1921,7 +1921,7 @@ void MeshForwarder::HandleMesh(uint8_t *aFrame, uint8_t aFrameLength, const Mac:
|
||||
meshHeader.SetHopsLeft(meshHeader.GetHopsLeft() - 1);
|
||||
meshHeader.AppendTo(aFrame);
|
||||
|
||||
VerifyOrExit((message = netif.GetIp6().mMessagePool.New(Message::kType6lowpan, 0)) != NULL,
|
||||
VerifyOrExit((message = netif.GetInstance()->mMessagePool.New(Message::kType6lowpan, 0)) != NULL,
|
||||
error = OT_ERROR_NO_BUFS);
|
||||
SuccessOrExit(error = message->SetLength(aFrameLength));
|
||||
message->Write(0, aFrameLength, aFrame);
|
||||
@@ -2009,7 +2009,7 @@ void MeshForwarder::HandleFragment(uint8_t *aFrame, uint8_t aFrameLength,
|
||||
aFrame += fragmentHeader->GetHeaderLength();
|
||||
aFrameLength -= fragmentHeader->GetHeaderLength();
|
||||
|
||||
VerifyOrExit((message = netif.GetIp6().mMessagePool.New(Message::kTypeIp6, 0)) != NULL,
|
||||
VerifyOrExit((message = netif.GetInstance()->mMessagePool.New(Message::kTypeIp6, 0)) != NULL,
|
||||
error = OT_ERROR_NO_BUFS);
|
||||
message->SetLinkSecurityEnabled(aMessageInfo.mLinkSecurity);
|
||||
message->SetPanId(aMessageInfo.mPanId);
|
||||
@@ -2190,7 +2190,7 @@ void MeshForwarder::HandleLowpanHC(uint8_t *aFrame, uint8_t aFrameLength,
|
||||
Message *message;
|
||||
int headerLength;
|
||||
|
||||
VerifyOrExit((message = netif.GetIp6().mMessagePool.New(Message::kTypeIp6, 0)) != NULL,
|
||||
VerifyOrExit((message = netif.GetInstance()->mMessagePool.New(Message::kTypeIp6, 0)) != NULL,
|
||||
error = OT_ERROR_NO_BUFS);
|
||||
message->SetLinkSecurityEnabled(aMessageInfo.mLinkSecurity);
|
||||
message->SetPanId(aMessageInfo.mPanId);
|
||||
|
||||
@@ -104,7 +104,7 @@ void ChildSupervisor::SendMessage(Child &aChild)
|
||||
|
||||
VerifyOrExit(aChild.GetIndirectMessageCount() == 0);
|
||||
|
||||
message = netif.GetIp6().mMessagePool.New(Message::kTypeSupervision, sizeof(uint8_t));
|
||||
message = netif.GetInstance()->mMessagePool.New(Message::kTypeSupervision, sizeof(uint8_t));
|
||||
VerifyOrExit(message != NULL);
|
||||
|
||||
// Supervision message is an empty payload 15.4 data frame.
|
||||
|
||||
@@ -176,7 +176,7 @@ static void Test(TestIphcVector &aVector, bool aCompress, bool aDecompress)
|
||||
|
||||
if (aCompress)
|
||||
{
|
||||
VerifyOrQuit((message = sIp6->mMessagePool.New(Message::kTypeIp6, 0)) != NULL,
|
||||
VerifyOrQuit((message = sInstance->mMessagePool.New(Message::kTypeIp6, 0)) != NULL,
|
||||
"6lo: Ip6::NewMessage failed");
|
||||
|
||||
aVector.GetUncompressedStream(*message);
|
||||
@@ -211,7 +211,7 @@ static void Test(TestIphcVector &aVector, bool aCompress, bool aDecompress)
|
||||
|
||||
if (aDecompress)
|
||||
{
|
||||
VerifyOrQuit((message = sIp6->mMessagePool.New(Message::kTypeIp6, 0)) != NULL,
|
||||
VerifyOrQuit((message = sInstance->mMessagePool.New(Message::kTypeIp6, 0)) != NULL,
|
||||
"6lo: Ip6::NewMessage failed");
|
||||
|
||||
int decompressedBytes = sLowpan->Decompress(*message, aVector.mMacSource, aVector.mMacDestination,
|
||||
|
||||
@@ -47,7 +47,7 @@ void TestMessage(void)
|
||||
instance = testInitInstance();
|
||||
VerifyOrQuit(instance != NULL, "Null OpenThread instance\n");
|
||||
|
||||
messagePool = &instance->mIp6.mMessagePool;
|
||||
messagePool = &instance->mMessagePool;
|
||||
|
||||
for (unsigned i = 0; i < sizeof(writeBuffer); i++)
|
||||
{
|
||||
|
||||
@@ -87,7 +87,7 @@ void TestMessageQueue(void)
|
||||
sInstance = testInitInstance();
|
||||
VerifyOrQuit(sInstance != NULL, "Null instance");
|
||||
|
||||
sMessagePool = &sInstance->mIp6.mMessagePool;
|
||||
sMessagePool = &sInstance->mMessagePool;
|
||||
|
||||
for (int i = 0; i < kNumTestMessages; i++)
|
||||
{
|
||||
|
||||
@@ -377,7 +377,7 @@ void TestNcpFrameBuffer(void)
|
||||
NcpFrameBuffer::WritePosition pos1, pos2;
|
||||
|
||||
sInstance = testInitInstance();
|
||||
sMessagePool = &sInstance->mIp6.mMessagePool;
|
||||
sMessagePool = &sInstance->mMessagePool;
|
||||
|
||||
for (i = 0; i < sizeof(buffer); i++)
|
||||
{
|
||||
@@ -1000,7 +1000,7 @@ void TestFuzzNcpFrameBuffer(void)
|
||||
uint32_t lensArrayCount[kNumPrios];
|
||||
|
||||
sInstance = testInitInstance();
|
||||
sMessagePool = &sInstance->mIp6.mMessagePool;
|
||||
sMessagePool = &sInstance->mMessagePool;
|
||||
|
||||
memset(buffer, 0, sizeof(buffer));
|
||||
|
||||
|
||||
@@ -221,7 +221,7 @@ void TestPriorityQueue(void)
|
||||
instance = testInitInstance();
|
||||
VerifyOrQuit(instance != NULL, "Null OpenThread instance\n");
|
||||
|
||||
messagePool = &instance->mIp6.mMessagePool;
|
||||
messagePool = &instance->mMessagePool;
|
||||
|
||||
// Allocate messages with different priorities.
|
||||
for (int i = 0; i < kNumTestMessages; i++)
|
||||
|
||||
Reference in New Issue
Block a user