Remove globals from icmp6.cpp.

This commit is contained in:
Jonathan Hui
2016-09-07 13:30:22 -07:00
parent 7f899dc6dd
commit 2029ef62eb
9 changed files with 89 additions and 70 deletions
+7 -3
View File
@@ -42,6 +42,7 @@
#include "cli_dataset.hpp"
#include <common/encoding.hpp>
#include <common/new.hpp>
#include <net/ip6.hpp>
#include <platform/random.h>
#include <platform/uart.h>
@@ -49,6 +50,9 @@ using Thread::Encoding::BigEndian::HostSwap16;
using Thread::Encoding::BigEndian::HostSwap32;
namespace Thread {
extern Ip6::Ip6 *sIp6;
namespace Cli {
const struct Command Interpreter::sCommands[] =
@@ -116,7 +120,7 @@ static otNetifAddress sAutoAddresses[8];
void Interpreter::Init(void)
{
Ip6::Icmp::SetEchoReplyHandler(&HandleEchoResponse, NULL);
sIp6->mIcmp.SetEchoReplyHandler(&HandleEchoResponse, NULL);
sPingTimer = new(&sPingTimerBuf) Timer(&HandlePingTimer, NULL);
sLength = 8;
sCount = 1;
@@ -1045,11 +1049,11 @@ void Interpreter::HandlePingTimer(void *aContext)
uint32_t timestamp = HostSwap32(Timer::GetNow());
Message *message;
VerifyOrExit((message = Ip6::Icmp::NewMessage(0)) != NULL, error = kThreadError_NoBufs);
VerifyOrExit((message = sIp6->mIcmp.NewMessage(0)) != NULL, error = kThreadError_NoBufs);
SuccessOrExit(error = message->Append(&timestamp, sizeof(timestamp)));
SuccessOrExit(error = message->SetLength(sLength));
SuccessOrExit(error = Ip6::Icmp::SendEchoRequest(*message, sMessageInfo));
SuccessOrExit(error = sIp6->mIcmp.SendEchoRequest(*message, sMessageInfo));
sCount--;
exit:
+27 -27
View File
@@ -43,28 +43,28 @@
using Thread::Encoding::BigEndian::HostSwap16;
namespace Thread {
extern Ip6::Ip6 *sIp6;
namespace Ip6 {
bool Icmp::sIsEchoEnabled = true;
uint16_t Icmp::sEchoSequence = 1;
IcmpHandler *IcmpHandler::sHandlers = NULL;
Icmp::EchoReplyHandler Icmp::sEchoReplyHandler = NULL;
void *Icmp::sEchoReplyContext = NULL;
Icmp::Icmp(Ip6 &aIp6):
mHandlers(NULL),
mEchoSequence(1),
mEchoReplyHandler(NULL),
mEchoReplyContext(NULL),
mIsEchoEnabled(true),
mIp6(aIp6)
{
}
Message *Icmp::NewMessage(uint16_t aReserved)
{
return sIp6->NewMessage(sizeof(IcmpHeader) + aReserved);
return mIp6.NewMessage(sizeof(IcmpHeader) + aReserved);
}
ThreadError Icmp::RegisterCallbacks(IcmpHandler &aHandler)
{
ThreadError error = kThreadError_None;
for (IcmpHandler *cur = IcmpHandler::sHandlers; cur; cur = cur->mNext)
for (IcmpHandler *cur = mHandlers; cur; cur = cur->mNext)
{
if (cur == &aHandler)
{
@@ -72,8 +72,8 @@ ThreadError Icmp::RegisterCallbacks(IcmpHandler &aHandler)
}
}
aHandler.mNext = IcmpHandler::sHandlers;
IcmpHandler::sHandlers = &aHandler;
aHandler.mNext = mHandlers;
mHandlers = &aHandler;
exit:
return error;
@@ -81,8 +81,8 @@ exit:
void Icmp::SetEchoReplyHandler(EchoReplyHandler aHandler, void *aContext)
{
sEchoReplyHandler = aHandler;
sEchoReplyContext = aContext;
mEchoReplyHandler = aHandler;
mEchoReplyContext = aContext;
}
ThreadError Icmp::SendEchoRequest(Message &aMessage, const MessageInfo &aMessageInfo)
@@ -96,11 +96,11 @@ ThreadError Icmp::SendEchoRequest(Message &aMessage, const MessageInfo &aMessage
icmpHeader.Init();
icmpHeader.SetType(IcmpHeader::kTypeEchoRequest);
icmpHeader.SetId(1);
icmpHeader.SetSequence(sEchoSequence++);
icmpHeader.SetSequence(mEchoSequence++);
SuccessOrExit(error = aMessage.Prepend(&icmpHeader, sizeof(icmpHeader)));
aMessage.SetOffset(0);
SuccessOrExit(error = sIp6->SendDatagram(aMessage, messageInfoLocal, kProtoIcmp6));
SuccessOrExit(error = mIp6.SendDatagram(aMessage, messageInfoLocal, kProtoIcmp6));
otLogInfoIcmp("Sent echo request\n");
@@ -116,7 +116,7 @@ ThreadError Icmp::SendError(const Address &aDestination, IcmpHeader::Type aType,
Message *message = NULL;
IcmpHeader icmp6Header;
VerifyOrExit((message = sIp6->NewMessage(0)) != NULL, error = kThreadError_NoBufs);
VerifyOrExit((message = mIp6.NewMessage(0)) != NULL, error = kThreadError_NoBufs);
SuccessOrExit(error = message->SetLength(sizeof(icmp6Header) + sizeof(aHeader)));
message->Write(sizeof(icmp6Header), sizeof(aHeader), &aHeader);
@@ -129,7 +129,7 @@ ThreadError Icmp::SendError(const Address &aDestination, IcmpHeader::Type aType,
memset(&messageInfo, 0, sizeof(messageInfo));
messageInfo.mPeerAddr = aDestination;
SuccessOrExit(error = sIp6->SendDatagram(*message, messageInfo, kProtoIcmp6));
SuccessOrExit(error = mIp6.SendDatagram(*message, messageInfo, kProtoIcmp6));
otLogInfoIcmp("Sent ICMPv6 Error\n");
@@ -183,7 +183,7 @@ ThreadError Icmp::HandleDstUnreach(Message &aMessage, const MessageInfo &aMessag
{
aMessage.MoveOffset(sizeof(aIcmpheader));
for (IcmpHandler *handler = IcmpHandler::sHandlers; handler; handler = handler->mNext)
for (IcmpHandler *handler = mHandlers; handler; handler = handler->mNext)
{
handler->HandleDstUnreach(aMessage, aMessageInfo, aIcmpheader);
}
@@ -199,14 +199,14 @@ ThreadError Icmp::HandleEchoRequest(Message &aRequestMessage, const MessageInfo
MessageInfo replyMessageInfo;
uint16_t payloadLength;
VerifyOrExit(sIsEchoEnabled, ;);
VerifyOrExit(mIsEchoEnabled, ;);
otLogInfoIcmp("Received Echo Request\n");
icmp6Header.Init();
icmp6Header.SetType(IcmpHeader::kTypeEchoReply);
VerifyOrExit((replyMessage = sIp6->NewMessage(0)) != NULL, otLogDebgIcmp("icmp fail\n"));
VerifyOrExit((replyMessage = mIp6.NewMessage(0)) != NULL, otLogDebgIcmp("icmp fail\n"));
payloadLength = aRequestMessage.GetLength() - aRequestMessage.GetOffset() - IcmpHeader::GetDataOffset();
SuccessOrExit(replyMessage->SetLength(IcmpHeader::GetDataOffset() + payloadLength));
@@ -224,7 +224,7 @@ ThreadError Icmp::HandleEchoRequest(Message &aRequestMessage, const MessageInfo
replyMessageInfo.mInterfaceId = aMessageInfo.mInterfaceId;
SuccessOrExit(error = sIp6->SendDatagram(*replyMessage, replyMessageInfo, kProtoIcmp6));
SuccessOrExit(error = mIp6.SendDatagram(*replyMessage, replyMessageInfo, kProtoIcmp6));
otLogInfoIcmp("Sent Echo Reply\n");
@@ -240,9 +240,9 @@ exit:
ThreadError Icmp::HandleEchoReply(Message &aMessage, const MessageInfo &aMessageInfo)
{
VerifyOrExit(sIsEchoEnabled && sEchoReplyHandler, ;);
VerifyOrExit(mIsEchoEnabled && mEchoReplyHandler, ;);
sEchoReplyHandler(sEchoReplyContext, aMessage, aMessageInfo);
mEchoReplyHandler(mEchoReplyContext, aMessage, aMessageInfo);
exit:
return kThreadError_None;
@@ -265,12 +265,12 @@ ThreadError Icmp::UpdateChecksum(Message &aMessage, uint16_t aChecksum)
bool Icmp::IsEchoEnabled(void)
{
return sIsEchoEnabled;
return mIsEchoEnabled;
}
void Icmp::SetEchoEnabled(bool aEnabled)
{
sIsEchoEnabled = aEnabled;
mIsEchoEnabled = aEnabled;
}
} // namespace Ip6
+39 -30
View File
@@ -35,7 +35,7 @@
#define ICMP6_HPP_
#include <common/encoding.hpp>
#include <net/ip6.hpp>
#include <net/ip6_headers.hpp>
using Thread::Encoding::BigEndian::HostSwap16;
@@ -249,8 +249,6 @@ private:
DstUnreachHandler mDstUnreachHandler;
void *mContext;
IcmpHandler *mNext;
static IcmpHandler *sHandlers;
};
/**
@@ -261,17 +259,25 @@ class Icmp
{
public:
/**
* This static method returns a new ICMP message with sufficient header space reserved.
* This constructor initializes the object.
*
* @param[in] aIp6 A reference to the IPv6 network object.
*
*/
Icmp(Ip6 &aIp6);
/**
* This method returns a new ICMP message with sufficient header space reserved.
*
* @param[in] aReserved The number of header bytes to reserve after the ICMP header.
*
* @returns A pointer to the message or NULL if no buffers are available.
*
*/
static Message *NewMessage(uint16_t aReserved);
Message *NewMessage(uint16_t aReserved);
/**
* This static method registers ICMPv6 handlers.
* This method registers ICMPv6 handlers.
*
* @param[in] aHandler A reference to the ICMPv6 handler.
*
@@ -279,7 +285,7 @@ public:
* @retval kThreadError_Busy The ICMPv6 handler is already registered.
*
*/
static ThreadError RegisterCallbacks(IcmpHandler &aHandler);
ThreadError RegisterCallbacks(IcmpHandler &aHandler);
/**
* This function pointer is called when receiving an ICMPv6 Echo Reply in response to an Echo Request.
@@ -292,16 +298,16 @@ public:
typedef void (*EchoReplyHandler)(void *aContext, Message &aMessage, const MessageInfo &aMessageInfo);
/**
* This static method sets the Echo Reply handler.
* This method sets the Echo Reply handler.
*
* @param[in] aHandler A pointer to a function that is called when receiving an ICMPv6 Echo Reply.
* @param[in] aContext A pointer to arbitrary context information.
*
*/
static void SetEchoReplyHandler(EchoReplyHandler aHandler, void *aContext);
void SetEchoReplyHandler(EchoReplyHandler aHandler, void *aContext);
/**
* This static method sends an ICMPv6 Echo Request message.
* This method sends an ICMPv6 Echo Request message.
*
* @param[in] aMessage A reference to the Echo Request payload.
* @param[in] aMessageInfo A reference to the message info associated with @p aMessage.
@@ -310,10 +316,10 @@ public:
* @retval kThreadError_NoBufs Insufficient buffers available to generate an ICMPv6 Echo Request message.
*
*/
static ThreadError SendEchoRequest(Message &aMessage, const MessageInfo &aMessageInfo);
ThreadError SendEchoRequest(Message &aMessage, const MessageInfo &aMessageInfo);
/**
* This static method sends an ICMPv6 error message.
* This method sends an ICMPv6 error message.
*
* @param[in] aDestination The IPv6 destination address.
* @param[in] aType The ICMPv6 message type.
@@ -324,11 +330,11 @@ public:
* @retval kThreadError_NoBufs Insufficient buffers available.
*
*/
static ThreadError SendError(const Address &aDestination, IcmpHeader::Type aType, IcmpHeader::Code aCode,
const Header &aHeader);
ThreadError SendError(const Address &aDestination, IcmpHeader::Type aType, IcmpHeader::Code aCode,
const Header &aHeader);
/**
* This static method handles an ICMPv6 message.
* This method handles an ICMPv6 message.
*
* @param[in] aMessage A reference to the ICMPv6 message.
* @param[in] aMessageInfo A reference to the message info associated with @p aMessage.
@@ -338,10 +344,10 @@ public:
* @retval kThreadError_Drop The ICMPv6 message was invalid and dropped.
*
*/
static ThreadError HandleMessage(Message &aMessage, MessageInfo &aMessageInfo);
ThreadError HandleMessage(Message &aMessage, MessageInfo &aMessageInfo);
/**
* This static method updates the ICMPv6 checksum.
* This method updates the ICMPv6 checksum.
*
* @param[in] aMessage A reference to the ICMPv6 message.
* @param[in] aPseudoHeaderChecksum The pseudo-header checksum value.
@@ -350,35 +356,38 @@ public:
* @retval kThreadError_InvalidArgs The message was invalid.
*
*/
static ThreadError UpdateChecksum(Message &aMessage, uint16_t aPseudoHeaderChecksum);
ThreadError UpdateChecksum(Message &aMessage, uint16_t aPseudoHeaderChecksum);
/**
* This static method indicates whether or not ICMPv6 Echo processing is enabled.
* This method indicates whether or not ICMPv6 Echo processing is enabled.
*
* @retval TRUE ICMPv6 Echo processing is enabled.
* @retval FALSE ICMPv6 Echo processing is disabled.
*
*/
static bool IsEchoEnabled(void);
bool IsEchoEnabled(void);
/**
* This static method sets whether or not ICMPv6 Echo processing is enabled.
* This method sets whether or not ICMPv6 Echo processing is enabled.
*
* @param[in] aEnabled TRUE to enable ICMPv6 Echo processing, FALSE otherwise.
*
*/
static void SetEchoEnabled(bool aEnabled);
void SetEchoEnabled(bool aEnabled);
private:
static ThreadError HandleDstUnreach(Message &aMessage, const MessageInfo &aMessageInfo,
const IcmpHeader &aIcmpHeader);
static ThreadError HandleEchoRequest(Message &aMessage, const MessageInfo &aMessageInfo);
static ThreadError HandleEchoReply(Message &aMessage, const MessageInfo &aMessageInfo);
ThreadError HandleDstUnreach(Message &aMessage, const MessageInfo &aMessageInfo, const IcmpHeader &aIcmpHeader);
ThreadError HandleEchoRequest(Message &aMessage, const MessageInfo &aMessageInfo);
ThreadError HandleEchoReply(Message &aMessage, const MessageInfo &aMessageInfo);
static uint16_t sEchoSequence;
static EchoReplyHandler sEchoReplyHandler;
static void *sEchoReplyContext;
static bool sIsEchoEnabled;
IcmpHandler *mHandlers;
uint16_t mEchoSequence;
EchoReplyHandler mEchoReplyHandler;
void *mEchoReplyContext;
bool mIsEchoEnabled;
Ip6 &mIp6;
};
/**
+5 -4
View File
@@ -48,6 +48,7 @@ namespace Thread {
namespace Ip6 {
Ip6::Ip6(void):
mIcmp(*this),
mForwardingEnabled(false),
mReceiveIp6DatagramCallback(NULL),
mReceiveIp6DatagramCallbackContext(NULL),
@@ -181,7 +182,7 @@ ThreadError Ip6::SendDatagram(Message &message, MessageInfo &messageInfo, IpProt
break;
case kProtoIcmp6:
SuccessOrExit(error = Icmp::UpdateChecksum(message, checksum));
SuccessOrExit(error = mIcmp.UpdateChecksum(message, checksum));
break;
default:
@@ -306,7 +307,7 @@ exit:
return error;
}
ThreadError HandlePayload(Message &message, MessageInfo &messageInfo, uint8_t ipproto)
ThreadError Ip6::HandlePayload(Message &message, MessageInfo &messageInfo, uint8_t ipproto)
{
ThreadError error = kThreadError_None;
@@ -316,7 +317,7 @@ ThreadError HandlePayload(Message &message, MessageInfo &messageInfo, uint8_t ip
ExitNow(error = Udp::HandleMessage(message, messageInfo));
case kProtoIcmp6:
ExitNow(error = Icmp::HandleMessage(message, messageInfo));
ExitNow(error = mIcmp.HandleMessage(message, messageInfo));
}
exit:
@@ -339,7 +340,7 @@ void Ip6::ProcessReceiveCallback(const Message &aMessage, const MessageInfo &mes
switch (aIpProto)
{
case kProtoIcmp6:
if (Icmp::IsEchoEnabled())
if (mIcmp.IsEchoEnabled())
{
IcmpHeader icmp;
aMessage.Read(aMessage.GetOffset(), sizeof(icmp), &icmp);
+4
View File
@@ -39,6 +39,7 @@
#include <openthread-types.h>
#include <common/encoding.hpp>
#include <common/message.hpp>
#include <net/icmp6.hpp>
#include <net/ip6_address.hpp>
#include <net/ip6_headers.hpp>
#include <net/ip6_mpl.hpp>
@@ -239,12 +240,15 @@ public:
*/
void SetForwardingEnabled(bool aEnable);
Icmp mIcmp;
private:
void ProcessReceiveCallback(const Message &aMessage, const MessageInfo &aMessageInfo, uint8_t aIpProto);
ThreadError HandleExtensionHeaders(Message &message, uint8_t &nextHeader, bool receive);
ThreadError HandleFragment(Message &message);
ThreadError AddMplOption(Message &message, Header &header, IpProto nextHeader, uint16_t payloadLength);
ThreadError HandleOptions(Message &message);
ThreadError HandlePayload(Message &message, MessageInfo &messageInfo, uint8_t ipproto);
ThreadError ForwardMessage(Message &message, MessageInfo &messageInfo);
Mpl mMpl;
+2 -2
View File
@@ -1147,12 +1147,12 @@ ThreadError otSendUdp(otUdpSocket *aSocket, otMessage aMessage, const otMessageI
bool otIsIcmpEchoEnabled(void)
{
return Ip6::Icmp::IsEchoEnabled();
return sIp6->mIcmp.IsEchoEnabled();
}
void otSetIcmpEchoEnabled(bool aEnabled)
{
Ip6::Icmp::SetEchoEnabled(aEnabled);
sIp6->mIcmp.SetEchoEnabled(aEnabled);
}
uint8_t otIp6PrefixMatch(const otIp6Address *aFirst, const otIp6Address *aSecond)
+1 -1
View File
@@ -67,7 +67,7 @@ AddressResolver::AddressResolver(ThreadNetif &aThreadNetif) :
mCoapServer.AddResource(mAddressNotification);
mCoapMessageId = static_cast<uint8_t>(otPlatRandomGet());
Ip6::Icmp::RegisterCallbacks(mIcmpHandler);
mNetif.GetIp6().mIcmp.RegisterCallbacks(mIcmpHandler);
}
void AddressResolver::Clear()
+2 -1
View File
@@ -2374,7 +2374,8 @@ ThreadError Mle::CheckReachability(uint16_t aMeshSource, uint16_t aMeshDest, Ip6
memcpy(&dst, GetMeshLocal16(), kRlocPrefixLength);
dst.mFields.m16[7] = HostSwap16(aMeshSource);
Ip6::Icmp::SendError(dst, Ip6::IcmpHeader::kTypeDstUnreach, Ip6::IcmpHeader::kCodeDstUnreachNoRoute, aIp6Header);
mNetif.GetIp6().mIcmp.SendError(dst, Ip6::IcmpHeader::kTypeDstUnreach, Ip6::IcmpHeader::kCodeDstUnreachNoRoute,
aIp6Header);
exit:
return error;
+2 -2
View File
@@ -2798,8 +2798,8 @@ ThreadError MleRouter::CheckReachability(uint16_t aMeshSource, uint16_t aMeshDes
memcpy(&destination, GetMeshLocal16(), 14);
destination.mFields.m16[7] = HostSwap16(aMeshSource);
Ip6::Icmp::SendError(destination, Ip6::IcmpHeader::kTypeDstUnreach, Ip6::IcmpHeader::kCodeDstUnreachNoRoute,
aIp6Header);
mNetif.GetIp6().mIcmp.SendError(destination, Ip6::IcmpHeader::kTypeDstUnreach,
Ip6::IcmpHeader::kCodeDstUnreachNoRoute, aIp6Header);
return kThreadError_Drop;
}