[message] decouple message and ip6 (#2028)

This commit is contained in:
Buke Po
2017-07-25 08:46:53 -07:00
committed by Jonathan Hui
parent 7ef2bcac03
commit 1ff8824d18
17 changed files with 70 additions and 69 deletions
+5 -4
View File
@@ -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)
{
}
+1 -1
View File
@@ -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)
{
+1 -1
View File
@@ -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);
+2 -1
View File
@@ -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);
+20 -2
View File
@@ -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;
+23
View File
@@ -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
View File
@@ -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);
-25
View File
@@ -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);
+1
View File
@@ -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);
+1 -1
View File
@@ -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);
+3 -3
View File
@@ -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);
+1 -1
View File
@@ -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.
+2 -2
View File
@@ -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,
+1 -1
View File
@@ -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++)
{
+1 -1
View File
@@ -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++)
{
+2 -2
View File
@@ -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));
+1 -1
View File
@@ -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++)