mirror of
https://github.com/espressif/openthread.git
synced 2026-08-11 05:07:47 +00:00
Remove globals from icmp6.cpp.
This commit is contained in:
+7
-3
@@ -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(×tamp, 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
@@ -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
@@ -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;
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user