mirror of
https://github.com/espressif/openthread.git
synced 2026-10-24 16:23:51 +00:00
Remove globals from udp6.cpp.
This commit is contained in:
@@ -750,7 +750,8 @@ typedef struct otUdpSocket
|
||||
otSockAddr mPeerName; ///< The peer IPv6 socket address.
|
||||
otUdpReceive mHandler; ///< A function pointer to the application callback.
|
||||
void *mContext; ///< A pointer to application-specific context.
|
||||
struct otUdpSocket *mNext; ///< A pointer to the next UDP socket.
|
||||
void *mTransport; ///< A pointer to the transport object (internal use only).
|
||||
struct otUdpSocket *mNext; ///< A pointer to the next UDP socket (internal use only).
|
||||
} otUdpSocket;
|
||||
|
||||
/**
|
||||
|
||||
@@ -37,7 +37,8 @@
|
||||
namespace Thread {
|
||||
namespace Coap {
|
||||
|
||||
Server::Server(uint16_t aPort)
|
||||
Server::Server(Ip6::Udp &aUdp, uint16_t aPort):
|
||||
mSocket(aUdp)
|
||||
{
|
||||
mPort = aPort;
|
||||
mResources = NULL;
|
||||
@@ -131,6 +132,11 @@ exit:
|
||||
{}
|
||||
}
|
||||
|
||||
Message *Server::NewMessage(uint16_t aReserved)
|
||||
{
|
||||
return mSocket.NewMessage(aReserved);
|
||||
}
|
||||
|
||||
ThreadError Server::SendMessage(Message &aMessage, const Ip6::MessageInfo &aMessageInfo)
|
||||
{
|
||||
return mSocket.SendTo(aMessage, aMessageInfo);
|
||||
|
||||
@@ -104,8 +104,11 @@ public:
|
||||
/**
|
||||
* This constructor initializes the object.
|
||||
*
|
||||
* @param[in] aUdp A reference to the UDP object.
|
||||
* @param[in] aPort The port to listen on.
|
||||
*
|
||||
*/
|
||||
explicit Server(uint16_t aPort);
|
||||
Server(Ip6::Udp &aUdp, uint16_t aPort);
|
||||
|
||||
/**
|
||||
* This method starts the CoAP server.
|
||||
@@ -134,6 +137,16 @@ public:
|
||||
*/
|
||||
ThreadError AddResource(Resource &aResource);
|
||||
|
||||
/**
|
||||
* This method returns a new UDP message with sufficient header space reserved.
|
||||
*
|
||||
* @param[in] aReserved The number of header bytes to reserve after the UDP header.
|
||||
*
|
||||
* @returns A pointer to the message or NULL if no buffers are available.
|
||||
*
|
||||
*/
|
||||
Message *NewMessage(uint16_t aReserved);
|
||||
|
||||
/**
|
||||
* This method sends a CoAP response from the server.
|
||||
*
|
||||
|
||||
@@ -49,6 +49,7 @@ namespace Ip6 {
|
||||
|
||||
Ip6::Ip6(void):
|
||||
mIcmp(*this),
|
||||
mUdp(*this),
|
||||
mForwardingEnabled(false),
|
||||
mReceiveIp6DatagramCallback(NULL),
|
||||
mReceiveIp6DatagramCallbackContext(NULL),
|
||||
@@ -178,7 +179,7 @@ ThreadError Ip6::SendDatagram(Message &message, MessageInfo &messageInfo, IpProt
|
||||
switch (ipproto)
|
||||
{
|
||||
case kProtoUdp:
|
||||
SuccessOrExit(error = Udp::UpdateChecksum(message, checksum));
|
||||
SuccessOrExit(error = mUdp.UpdateChecksum(message, checksum));
|
||||
break;
|
||||
|
||||
case kProtoIcmp6:
|
||||
@@ -314,7 +315,7 @@ ThreadError Ip6::HandlePayload(Message &message, MessageInfo &messageInfo, uint8
|
||||
switch (ipproto)
|
||||
{
|
||||
case kProtoUdp:
|
||||
ExitNow(error = Udp::HandleMessage(message, messageInfo));
|
||||
ExitNow(error = mUdp.HandleMessage(message, messageInfo));
|
||||
|
||||
case kProtoIcmp6:
|
||||
ExitNow(error = mIcmp.HandleMessage(message, messageInfo));
|
||||
|
||||
@@ -45,6 +45,7 @@
|
||||
#include <net/ip6_mpl.hpp>
|
||||
#include <net/netif.hpp>
|
||||
#include <net/socket.hpp>
|
||||
#include <net/udp6.hpp>
|
||||
|
||||
using Thread::Encoding::BigEndian::HostSwap16;
|
||||
using Thread::Encoding::BigEndian::HostSwap32;
|
||||
@@ -241,6 +242,7 @@ public:
|
||||
void SetForwardingEnabled(bool aEnable);
|
||||
|
||||
Icmp mIcmp;
|
||||
Udp mUdp;
|
||||
|
||||
private:
|
||||
void ProcessReceiveCallback(const Message &aMessage, const MessageInfo &aMessageInfo, uint8_t aIpProto);
|
||||
|
||||
+86
-50
@@ -41,36 +41,26 @@
|
||||
using Thread::Encoding::BigEndian::HostSwap16;
|
||||
|
||||
namespace Thread {
|
||||
|
||||
extern Ip6::Ip6 *sIp6;
|
||||
|
||||
namespace Ip6 {
|
||||
|
||||
UdpSocket *Udp::sSockets = NULL;
|
||||
uint16_t Udp::sEphemeralPort = kDynamicPortMin;
|
||||
UdpSocket::UdpSocket(Udp &aUdp)
|
||||
{
|
||||
mTransport = &aUdp;
|
||||
}
|
||||
|
||||
Message *UdpSocket::NewMessage(uint16_t aReserved)
|
||||
{
|
||||
return static_cast<Udp *>(mTransport)->NewMessage(aReserved);
|
||||
}
|
||||
|
||||
ThreadError UdpSocket::Open(otUdpReceive aHandler, void *aContext)
|
||||
{
|
||||
ThreadError error = kThreadError_None;
|
||||
|
||||
for (UdpSocket *cur = Udp::sSockets; cur; cur = cur->GetNext())
|
||||
{
|
||||
if (cur == this)
|
||||
{
|
||||
ExitNow();
|
||||
}
|
||||
}
|
||||
|
||||
memset(&mSockName, 0, sizeof(mSockName));
|
||||
memset(&mPeerName, 0, sizeof(mPeerName));
|
||||
mHandler = aHandler;
|
||||
mContext = aContext;
|
||||
|
||||
SetNext(Udp::sSockets);
|
||||
Udp::sSockets = this;
|
||||
|
||||
exit:
|
||||
return error;
|
||||
return static_cast<Udp *>(mTransport)->AddSocket(*this);
|
||||
}
|
||||
|
||||
ThreadError UdpSocket::Bind(const SockAddr &aSockAddr)
|
||||
@@ -81,27 +71,14 @@ ThreadError UdpSocket::Bind(const SockAddr &aSockAddr)
|
||||
|
||||
ThreadError UdpSocket::Close(void)
|
||||
{
|
||||
if (Udp::sSockets == this)
|
||||
{
|
||||
Udp::sSockets = Udp::sSockets->GetNext();
|
||||
}
|
||||
else
|
||||
{
|
||||
for (UdpSocket *socket = Udp::sSockets; socket; socket = socket->GetNext())
|
||||
{
|
||||
if (socket->GetNext() == this)
|
||||
{
|
||||
socket->SetNext(GetNext());
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
ThreadError error = kThreadError_None;
|
||||
|
||||
SuccessOrExit(error = static_cast<Udp *>(mTransport)->RemoveSocket(*this));
|
||||
memset(&mSockName, 0, sizeof(mSockName));
|
||||
memset(&mPeerName, 0, sizeof(mPeerName));
|
||||
SetNext(NULL);
|
||||
|
||||
return kThreadError_None;
|
||||
exit:
|
||||
return error;
|
||||
}
|
||||
|
||||
ThreadError UdpSocket::SendTo(Message &aMessage, const MessageInfo &aMessageInfo)
|
||||
@@ -119,16 +96,7 @@ ThreadError UdpSocket::SendTo(Message &aMessage, const MessageInfo &aMessageInfo
|
||||
|
||||
if (GetSockName().mPort == 0)
|
||||
{
|
||||
GetSockName().mPort = Udp::sEphemeralPort;
|
||||
|
||||
if (Udp::sEphemeralPort < Udp::kDynamicPortMax)
|
||||
{
|
||||
Udp::sEphemeralPort++;
|
||||
}
|
||||
else
|
||||
{
|
||||
Udp::sEphemeralPort = Udp::kDynamicPortMin;
|
||||
}
|
||||
GetSockName().mPort = static_cast<Udp *>(mTransport)->GetEphemeralPort();
|
||||
}
|
||||
|
||||
udpHeader.SetSourcePort(GetSockName().mPort);
|
||||
@@ -138,15 +106,83 @@ ThreadError UdpSocket::SendTo(Message &aMessage, const MessageInfo &aMessageInfo
|
||||
|
||||
SuccessOrExit(error = aMessage.Prepend(&udpHeader, sizeof(udpHeader)));
|
||||
aMessage.SetOffset(0);
|
||||
SuccessOrExit(error = sIp6->SendDatagram(aMessage, messageInfoLocal, kProtoUdp));
|
||||
SuccessOrExit(error = static_cast<Udp *>(mTransport)->SendDatagram(aMessage, messageInfoLocal, kProtoUdp));
|
||||
|
||||
exit:
|
||||
return error;
|
||||
}
|
||||
|
||||
Udp::Udp(Ip6 &aIp6):
|
||||
mEphemeralPort(kDynamicPortMin),
|
||||
mSockets(NULL),
|
||||
mIp6(aIp6)
|
||||
{
|
||||
}
|
||||
|
||||
ThreadError Udp::AddSocket(UdpSocket &aSocket)
|
||||
{
|
||||
for (UdpSocket *cur = mSockets; cur; cur = cur->GetNext())
|
||||
{
|
||||
if (cur == &aSocket)
|
||||
{
|
||||
ExitNow();
|
||||
}
|
||||
}
|
||||
|
||||
aSocket.SetNext(mSockets);
|
||||
mSockets = &aSocket;
|
||||
|
||||
exit:
|
||||
return kThreadError_None;
|
||||
}
|
||||
|
||||
ThreadError Udp::RemoveSocket(UdpSocket &aSocket)
|
||||
{
|
||||
if (mSockets == &aSocket)
|
||||
{
|
||||
mSockets = mSockets->GetNext();
|
||||
}
|
||||
else
|
||||
{
|
||||
for (UdpSocket *socket = mSockets; socket; socket = socket->GetNext())
|
||||
{
|
||||
if (socket->GetNext() == &aSocket)
|
||||
{
|
||||
socket->SetNext(socket->GetNext());
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
aSocket.SetNext(NULL);
|
||||
|
||||
return kThreadError_None;
|
||||
}
|
||||
|
||||
uint16_t Udp::GetEphemeralPort(void)
|
||||
{
|
||||
uint16_t rval = mEphemeralPort;
|
||||
|
||||
if (mEphemeralPort < kDynamicPortMax)
|
||||
{
|
||||
mEphemeralPort++;
|
||||
}
|
||||
else
|
||||
{
|
||||
mEphemeralPort = kDynamicPortMin;
|
||||
}
|
||||
|
||||
return rval;
|
||||
}
|
||||
|
||||
Message *Udp::NewMessage(uint16_t aReserved)
|
||||
{
|
||||
return sIp6->NewMessage(sizeof(UdpHeader) + aReserved);
|
||||
return mIp6.NewMessage(sizeof(UdpHeader) + aReserved);
|
||||
}
|
||||
|
||||
ThreadError Udp::SendDatagram(Message &aMessage, MessageInfo &aMessageInfo, IpProto aIpProto)
|
||||
{
|
||||
return mIp6.SendDatagram(aMessage, aMessageInfo, aIpProto);
|
||||
}
|
||||
|
||||
ThreadError Udp::HandleMessage(Message &aMessage, MessageInfo &aMessageInfo)
|
||||
@@ -173,7 +209,7 @@ ThreadError Udp::HandleMessage(Message &aMessage, MessageInfo &aMessageInfo)
|
||||
aMessageInfo.mSockPort = udpHeader.GetDestinationPort();
|
||||
|
||||
// find socket
|
||||
for (UdpSocket *socket = Udp::sSockets; socket; socket = socket->GetNext())
|
||||
for (UdpSocket *socket = mSockets; socket; socket = socket->GetNext())
|
||||
{
|
||||
if (socket->GetSockName().mPort != udpHeader.GetDestinationPort())
|
||||
{
|
||||
|
||||
+80
-9
@@ -35,11 +35,13 @@
|
||||
#define UDP6_HPP_
|
||||
|
||||
#include <openthread.h>
|
||||
#include <net/ip6.hpp>
|
||||
#include <net/ip6_headers.hpp>
|
||||
|
||||
namespace Thread {
|
||||
namespace Ip6 {
|
||||
|
||||
class Udp;
|
||||
|
||||
/**
|
||||
* @addtogroup core-udp
|
||||
*
|
||||
@@ -59,6 +61,24 @@ class UdpSocket: public otUdpSocket
|
||||
friend class Udp;
|
||||
|
||||
public:
|
||||
/**
|
||||
* This constructor initializes the object.
|
||||
*
|
||||
* @param[in] aUdp A reference to the UDP transport object.
|
||||
*
|
||||
*/
|
||||
UdpSocket(Udp &aUdp);
|
||||
|
||||
/**
|
||||
* This method returns a new UDP message with sufficient header space reserved.
|
||||
*
|
||||
* @param[in] aReserved The number of header bytes to reserve after the UDP header.
|
||||
*
|
||||
* @returns A pointer to the message or NULL if no buffers are available.
|
||||
*
|
||||
*/
|
||||
Message *NewMessage(uint16_t aReserved);
|
||||
|
||||
/**
|
||||
* This method opens the UDP socket.
|
||||
*
|
||||
@@ -124,17 +144,66 @@ class Udp
|
||||
|
||||
public:
|
||||
/**
|
||||
* This static method returns a new UDP message with sufficient header space reserved.
|
||||
* This constructor initializes the object.
|
||||
*
|
||||
* @param[in] aIp6 A reference to the IPv6 network object.
|
||||
*
|
||||
*/
|
||||
Udp(Ip6 &aIp6);
|
||||
|
||||
/**
|
||||
* This method adds a UDP socket.
|
||||
*
|
||||
* @param[in] aSocket A reference to the UDP socket.
|
||||
*
|
||||
* @retval kThreadError_None Successfully added the UDP socket.
|
||||
*
|
||||
*/
|
||||
ThreadError AddSocket(UdpSocket &aSocket);
|
||||
|
||||
/**
|
||||
* This method removes a UDP socket.
|
||||
*
|
||||
* @param[in] aSocket A reference to the UDP socket.
|
||||
*
|
||||
* @retval kThreadError_None Successfully removed the UDP socket.
|
||||
*
|
||||
*/
|
||||
ThreadError RemoveSocket(UdpSocket &aSocket);
|
||||
|
||||
/**
|
||||
* This method returns a new ephemeral port.
|
||||
*
|
||||
* @returns A new ephemeral port.
|
||||
*
|
||||
*/
|
||||
uint16_t GetEphemeralPort(void);
|
||||
|
||||
/**
|
||||
* This method returns a new UDP message with sufficient header space reserved.
|
||||
*
|
||||
* @param[in] aReserved The number of header bytes to reserve after the UDP 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 handles a received UDP message.
|
||||
* This method sends an IPv6 datagram.
|
||||
*
|
||||
* @param[in] aMessage A reference to the message.
|
||||
* @param[in] aMessageInfo A reference to the message info associated with @p aMessage.
|
||||
* @param[in] aIpProto The Internet Protocol value.
|
||||
*
|
||||
* @retval kThreadError_None Successfully enqueued the message into an output interface.
|
||||
* @retval kThreadError_NoBufs Insufficient available buffer to add the IPv6 headers.
|
||||
*
|
||||
*/
|
||||
ThreadError SendDatagram(Message &aMessage, MessageInfo &aMessageInfo, IpProto aIpProto);
|
||||
|
||||
/**
|
||||
* This method handles a received UDP message.
|
||||
*
|
||||
* @param[in] aMessage A reference to the UDP message to process.
|
||||
* @param[in] aMessageInfo A reference to the message info associated with @p aMessage.
|
||||
@@ -143,10 +212,10 @@ public:
|
||||
* @retval kThreadError_Drop Could not fully process the UDP message.
|
||||
*
|
||||
*/
|
||||
static ThreadError HandleMessage(Message &aMessage, MessageInfo &aMessageInfo);
|
||||
ThreadError HandleMessage(Message &aMessage, MessageInfo &aMessageInfo);
|
||||
|
||||
/**
|
||||
* This static method updates the UDP checksum.
|
||||
* This method updates the UDP checksum.
|
||||
*
|
||||
* @param[in] aMessage A reference to the UDP message.
|
||||
* @param[in] aPseudoHeaderChecksum The pseudo-header checksum value.
|
||||
@@ -155,7 +224,7 @@ public:
|
||||
* @retval kThreadError_InvalidArgs The message was invalid.
|
||||
*
|
||||
*/
|
||||
static ThreadError UpdateChecksum(Message &aMessage, uint16_t aPseudoHeaderChecksum);
|
||||
ThreadError UpdateChecksum(Message &aMessage, uint16_t aPseudoHeaderChecksum);
|
||||
|
||||
private:
|
||||
enum
|
||||
@@ -163,8 +232,10 @@ private:
|
||||
kDynamicPortMin = 49152, ///< Service Name and Transport Protocol Port Number Registry
|
||||
kDynamicPortMax = 65535, ///< Service Name and Transport Protocol Port Number Registry
|
||||
};
|
||||
static uint16_t sEphemeralPort;
|
||||
static UdpSocket *sSockets;
|
||||
uint16_t mEphemeralPort;
|
||||
UdpSocket *mSockets;
|
||||
|
||||
Ip6 &mIp6;
|
||||
};
|
||||
|
||||
OT_TOOL_PACKED_BEGIN
|
||||
|
||||
@@ -1070,7 +1070,7 @@ ThreadError otSendIp6Datagram(otMessage aMessage)
|
||||
|
||||
otMessage otNewUdpMessage(void)
|
||||
{
|
||||
return Ip6::Udp::NewMessage(0);
|
||||
return sIp6->mUdp.NewMessage(0);
|
||||
}
|
||||
|
||||
ThreadError otFreeMessage(otMessage aMessage)
|
||||
|
||||
@@ -54,6 +54,7 @@ AddressResolver::AddressResolver(ThreadNetif &aThreadNetif) :
|
||||
mAddressQuery(OPENTHREAD_URI_ADDRESS_QUERY, &HandleAddressQuery, this),
|
||||
mAddressNotification(OPENTHREAD_URI_ADDRESS_NOTIFY, &HandleAddressNotification, this),
|
||||
mIcmpHandler(&HandleDstUnreach, this),
|
||||
mSocket(aThreadNetif.GetIp6().mUdp),
|
||||
mTimer(&HandleTimer, this),
|
||||
mMeshForwarder(aThreadNetif.GetMeshForwarder()),
|
||||
mCoapServer(aThreadNetif.GetCoapServer()),
|
||||
@@ -175,7 +176,7 @@ ThreadError AddressResolver::SendAddressQuery(const Ip6::Address &aEid)
|
||||
mSocket.Open(&HandleUdpReceive, this);
|
||||
mSocket.Bind(sockaddr);
|
||||
|
||||
VerifyOrExit((message = Ip6::Udp::NewMessage(0)) != NULL, error = kThreadError_NoBufs);
|
||||
VerifyOrExit((message = mSocket.NewMessage(0)) != NULL, error = kThreadError_NoBufs);
|
||||
|
||||
header.Init();
|
||||
header.SetVersion(1);
|
||||
@@ -316,7 +317,7 @@ void AddressResolver::SendAddressNotificationResponse(const Coap::Header &aReque
|
||||
Coap::Header responseHeader;
|
||||
Ip6::MessageInfo responseInfo;
|
||||
|
||||
VerifyOrExit((message = Ip6::Udp::NewMessage(0)) != NULL, error = kThreadError_NoBufs);
|
||||
VerifyOrExit((message = mCoapServer.NewMessage(0)) != NULL, error = kThreadError_NoBufs);
|
||||
|
||||
responseHeader.Init();
|
||||
responseHeader.SetVersion(1);
|
||||
@@ -354,7 +355,7 @@ ThreadError AddressResolver::SendAddressError(const ThreadTargetTlv &aTarget, co
|
||||
mSocket.Open(&HandleUdpReceive, this);
|
||||
mSocket.Bind(sockaddr);
|
||||
|
||||
VerifyOrExit((message = Ip6::Udp::NewMessage(0)) != NULL, error = kThreadError_NoBufs);
|
||||
VerifyOrExit((message = mSocket.NewMessage(0)) != NULL, error = kThreadError_NoBufs);
|
||||
|
||||
header.Init();
|
||||
header.SetVersion(1);
|
||||
@@ -406,7 +407,7 @@ void AddressResolver::SendAddressErrorResponse(const Coap::Header &aRequestHeade
|
||||
Coap::Header responseHeader;
|
||||
Ip6::MessageInfo responseInfo;
|
||||
|
||||
VerifyOrExit((message = Ip6::Udp::NewMessage(0)) != NULL, error = kThreadError_NoBufs);
|
||||
VerifyOrExit((message = mCoapServer.NewMessage(0)) != NULL, error = kThreadError_NoBufs);
|
||||
|
||||
responseHeader.Init();
|
||||
responseHeader.SetVersion(1);
|
||||
@@ -585,7 +586,7 @@ void AddressResolver::SendAddressQueryResponse(const ThreadTargetTlv &aTargetTlv
|
||||
ThreadRloc16Tlv rloc16Tlv;
|
||||
Ip6::MessageInfo messageInfo;
|
||||
|
||||
VerifyOrExit((message = Ip6::Udp::NewMessage(0)) != NULL, error = kThreadError_NoBufs);
|
||||
VerifyOrExit((message = mSocket.NewMessage(0)) != NULL, error = kThreadError_NoBufs);
|
||||
|
||||
header.Init();
|
||||
header.SetVersion(1);
|
||||
|
||||
@@ -56,6 +56,7 @@ DatasetManager::DatasetManager(ThreadNetif &aThreadNetif, const char *aUriSet, c
|
||||
mResourceSet(aUriSet, &HandleSet, this),
|
||||
mResourceGet(aUriGet, &HandleGet, this),
|
||||
mTimer(&HandleTimer, this),
|
||||
mSocket(aThreadNetif.GetIp6().mUdp),
|
||||
mUriSet(aUriSet),
|
||||
mUriGet(aUriGet),
|
||||
mCoapServer(aThreadNetif.GetCoapServer())
|
||||
@@ -176,7 +177,7 @@ ThreadError DatasetManager::Register(void)
|
||||
header.AppendContentFormatOption(Coap::Header::kApplicationOctetStream);
|
||||
header.Finalize();
|
||||
|
||||
VerifyOrExit((message = Ip6::Udp::NewMessage(0)) != NULL, error = kThreadError_NoBufs);
|
||||
VerifyOrExit((message = mSocket.NewMessage(0)) != NULL, error = kThreadError_NoBufs);
|
||||
SuccessOrExit(error = message->Append(header.GetBytes(), header.GetLength()));
|
||||
|
||||
timestamp.Init();
|
||||
@@ -332,7 +333,7 @@ ThreadError DatasetManager::SendSetRequest(const otOperationalDataset &aDataset,
|
||||
header.AppendContentFormatOption(Coap::Header::kApplicationOctetStream);
|
||||
header.Finalize();
|
||||
|
||||
VerifyOrExit((message = Ip6::Udp::NewMessage(0)) != NULL, error = kThreadError_NoBufs);
|
||||
VerifyOrExit((message = mSocket.NewMessage(0)) != NULL, error = kThreadError_NoBufs);
|
||||
SuccessOrExit(error = message->Append(header.GetBytes(), header.GetLength()));
|
||||
|
||||
if (aDataset.mIsActiveTimestampSet)
|
||||
@@ -456,7 +457,7 @@ ThreadError DatasetManager::SendGetRequest(const uint8_t *aTlvTypes, const uint8
|
||||
header.AppendContentFormatOption(Coap::Header::kApplicationOctetStream);
|
||||
header.Finalize();
|
||||
|
||||
VerifyOrExit((message = Ip6::Udp::NewMessage(0)) != NULL, error = kThreadError_NoBufs);
|
||||
VerifyOrExit((message = mSocket.NewMessage(0)) != NULL, error = kThreadError_NoBufs);
|
||||
SuccessOrExit(error = message->Append(header.GetBytes(), header.GetLength()));
|
||||
|
||||
if (aLength > 0)
|
||||
@@ -492,7 +493,7 @@ void DatasetManager::SendSetResponse(const Coap::Header &aRequestHeader, const I
|
||||
Message *message;
|
||||
StateTlv state;
|
||||
|
||||
VerifyOrExit((message = Ip6::Udp::NewMessage(0)) != NULL, error = kThreadError_NoBufs);
|
||||
VerifyOrExit((message = mCoapServer.NewMessage(0)) != NULL, error = kThreadError_NoBufs);
|
||||
responseHeader.Init();
|
||||
responseHeader.SetVersion(1);
|
||||
responseHeader.SetType(Coap::Header::kTypeAcknowledgment);
|
||||
@@ -527,7 +528,7 @@ void DatasetManager::SendGetResponse(const Coap::Header &aRequestHeader, const I
|
||||
Message *message;
|
||||
uint8_t index;
|
||||
|
||||
VerifyOrExit((message = Ip6::Udp::NewMessage(0)) != NULL, error = kThreadError_NoBufs);
|
||||
VerifyOrExit((message = mCoapServer.NewMessage(0)) != NULL, error = kThreadError_NoBufs);
|
||||
responseHeader.Init();
|
||||
responseHeader.SetVersion(1);
|
||||
responseHeader.SetType(Coap::Header::kTypeAcknowledgment);
|
||||
|
||||
@@ -62,6 +62,7 @@ Mle::Mle(ThreadNetif &aThreadNetif) :
|
||||
mMleRouter(aThreadNetif.GetMle()),
|
||||
mNetworkData(aThreadNetif.GetNetworkDataLeader()),
|
||||
mParentRequestTimer(&HandleParentRequestTimer, this),
|
||||
mSocket(aThreadNetif.GetIp6().mUdp),
|
||||
mSendChildUpdateRequest(&HandleSendChildUpdateRequest, this)
|
||||
{
|
||||
mDeviceState = kDeviceStateDisabled;
|
||||
@@ -233,7 +234,7 @@ ThreadError Mle::Discover(uint32_t aScanChannels, uint16_t aScanDuration, uint16
|
||||
mDiscoverContext = aContext;
|
||||
mMesh.SetDiscoverParameters(aScanChannels, aScanDuration);
|
||||
|
||||
VerifyOrExit((message = Ip6::Udp::NewMessage(0)) != NULL, ;);
|
||||
VerifyOrExit((message = mSocket.NewMessage(0)) != NULL, ;);
|
||||
message->SetLinkSecurityEnabled(false);
|
||||
message->SetMleDiscoverRequest(true);
|
||||
message->SetPanId(aPanId);
|
||||
@@ -1079,7 +1080,7 @@ ThreadError Mle::SendParentRequest(void)
|
||||
mParentRequest.mChallenge[i] = static_cast<uint8_t>(otPlatRandomGet());
|
||||
}
|
||||
|
||||
VerifyOrExit((message = Ip6::Udp::NewMessage(0)) != NULL, ;);
|
||||
VerifyOrExit((message = mSocket.NewMessage(0)) != NULL, ;);
|
||||
message->SetLinkSecurityEnabled(false);
|
||||
SuccessOrExit(error = AppendHeader(*message, Header::kCommandParentRequest));
|
||||
SuccessOrExit(error = AppendMode(*message, mDeviceMode));
|
||||
@@ -1146,7 +1147,7 @@ ThreadError Mle::SendChildIdRequest(void)
|
||||
Message *message;
|
||||
Ip6::Address destination;
|
||||
|
||||
VerifyOrExit((message = Ip6::Udp::NewMessage(0)) != NULL, ;);
|
||||
VerifyOrExit((message = mSocket.NewMessage(0)) != NULL, ;);
|
||||
message->SetLinkSecurityEnabled(false);
|
||||
SuccessOrExit(error = AppendHeader(*message, Header::kCommandChildIdRequest));
|
||||
SuccessOrExit(error = AppendResponse(*message, mChildIdRequest.mChallenge, mChildIdRequest.mChallengeLength));
|
||||
@@ -1192,7 +1193,7 @@ ThreadError Mle::SendDataRequest(const Ip6::Address &aDestination, const uint8_t
|
||||
ThreadError error = kThreadError_None;
|
||||
Message *message;
|
||||
|
||||
VerifyOrExit((message = Ip6::Udp::NewMessage(0)) != NULL, ;);
|
||||
VerifyOrExit((message = mSocket.NewMessage(0)) != NULL, ;);
|
||||
message->SetLinkSecurityEnabled(false);
|
||||
SuccessOrExit(error = AppendHeader(*message, Header::kCommandDataRequest));
|
||||
SuccessOrExit(error = AppendTlvRequest(*message, aTlvs, aTlvsLength));
|
||||
@@ -1239,7 +1240,7 @@ ThreadError Mle::SendChildUpdateRequest(void)
|
||||
Ip6::Address destination;
|
||||
Message *message;
|
||||
|
||||
VerifyOrExit((message = Ip6::Udp::NewMessage(0)) != NULL, ;);
|
||||
VerifyOrExit((message = mSocket.NewMessage(0)) != NULL, ;);
|
||||
message->SetLinkSecurityEnabled(false);
|
||||
SuccessOrExit(error = AppendHeader(*message, Header::kCommandChildUpdateRequest));
|
||||
SuccessOrExit(error = AppendMode(*message, mDeviceMode));
|
||||
@@ -2176,7 +2177,7 @@ ThreadError Mle::SendDiscoveryResponse(const Ip6::Address &aDestination, uint16_
|
||||
MeshCoP::ExtendedPanIdTlv extPanId;
|
||||
MeshCoP::NetworkNameTlv networkName;
|
||||
|
||||
VerifyOrExit((message = Ip6::Udp::NewMessage(0)) != NULL, ;);
|
||||
VerifyOrExit((message = mSocket.NewMessage(0)) != NULL, ;);
|
||||
message->SetLinkSecurityEnabled(false);
|
||||
message->SetMleDiscoverResponse(true);
|
||||
message->SetPanId(aPanId);
|
||||
|
||||
@@ -52,6 +52,7 @@ MleRouter::MleRouter(ThreadNetif &aThreadNetif):
|
||||
Mle(aThreadNetif),
|
||||
mAdvertiseTimer(&HandleAdvertiseTimer, this),
|
||||
mStateUpdateTimer(&HandleStateUpdateTimer, this),
|
||||
mSocket(aThreadNetif.GetIp6().mUdp),
|
||||
mAddressSolicit(OPENTHREAD_URI_ADDRESS_SOLICIT, &HandleAddressSolicit, this),
|
||||
mAddressRelease(OPENTHREAD_URI_ADDRESS_RELEASE, &HandleAddressRelease, this),
|
||||
mCoapServer(aThreadNetif.GetCoapServer())
|
||||
@@ -463,7 +464,7 @@ ThreadError MleRouter::SendAdvertisement(void)
|
||||
Ip6::Address destination;
|
||||
Message *message;
|
||||
|
||||
VerifyOrExit((message = Ip6::Udp::NewMessage(0)) != NULL, ;);
|
||||
VerifyOrExit((message = mSocket.NewMessage(0)) != NULL, ;);
|
||||
message->SetLinkSecurityEnabled(false);
|
||||
SuccessOrExit(error = AppendHeader(*message, Header::kCommandAdvertisement));
|
||||
SuccessOrExit(error = AppendSourceAddress(*message));
|
||||
@@ -512,7 +513,7 @@ ThreadError MleRouter::SendLinkRequest(Neighbor *aNeighbor)
|
||||
|
||||
memset(&destination, 0, sizeof(destination));
|
||||
|
||||
VerifyOrExit((message = Ip6::Udp::NewMessage(0)) != NULL, ;);
|
||||
VerifyOrExit((message = mSocket.NewMessage(0)) != NULL, ;);
|
||||
message->SetLinkSecurityEnabled(false);
|
||||
SuccessOrExit(error = AppendHeader(*message, Header::kCommandLinkRequest));
|
||||
SuccessOrExit(error = AppendVersion(*message));
|
||||
@@ -684,7 +685,7 @@ ThreadError MleRouter::SendLinkAccept(const Ip6::MessageInfo &aMessageInfo, Neig
|
||||
command = (aNeighbor == NULL || aNeighbor->mState == Neighbor::kStateValid) ?
|
||||
Header::kCommandLinkAccept : Header::kCommandLinkAcceptAndRequest;
|
||||
|
||||
VerifyOrExit((message = Ip6::Udp::NewMessage(0)) != NULL, ;);
|
||||
VerifyOrExit((message = mSocket.NewMessage(0)) != NULL, ;);
|
||||
message->SetLinkSecurityEnabled(false);
|
||||
SuccessOrExit(error = AppendHeader(*message, command));
|
||||
SuccessOrExit(error = AppendVersion(*message));
|
||||
@@ -961,7 +962,7 @@ ThreadError MleRouter::SendLinkReject(const Ip6::Address &aDestination)
|
||||
ThreadError error = kThreadError_None;
|
||||
Message *message;
|
||||
|
||||
VerifyOrExit((message = Ip6::Udp::NewMessage(0)) != NULL, ;);
|
||||
VerifyOrExit((message = mSocket.NewMessage(0)) != NULL, ;);
|
||||
message->SetLinkSecurityEnabled(false);
|
||||
SuccessOrExit(error = AppendHeader(*message, Header::kCommandLinkReject));
|
||||
SuccessOrExit(error = AppendStatus(*message, StatusTlv::kError));
|
||||
@@ -1706,7 +1707,7 @@ ThreadError MleRouter::SendParentResponse(Child *aChild, const ChallengeTlv &cha
|
||||
Ip6::Address destination;
|
||||
Message *message;
|
||||
|
||||
VerifyOrExit((message = Ip6::Udp::NewMessage(0)) != NULL, ;);
|
||||
VerifyOrExit((message = mSocket.NewMessage(0)) != NULL, ;);
|
||||
message->SetLinkSecurityEnabled(false);
|
||||
SuccessOrExit(error = AppendHeader(*message, Header::kCommandParentResponse));
|
||||
SuccessOrExit(error = AppendSourceAddress(*message));
|
||||
@@ -2093,7 +2094,7 @@ ThreadError MleRouter::SendChildIdResponse(Child *aChild)
|
||||
Ip6::Address destination;
|
||||
Message *message;
|
||||
|
||||
VerifyOrExit((message = Ip6::Udp::NewMessage(0)) != NULL, ;);
|
||||
VerifyOrExit((message = mSocket.NewMessage(0)) != NULL, ;);
|
||||
message->SetLinkSecurityEnabled(false);
|
||||
SuccessOrExit(error = AppendHeader(*message, Header::kCommandChildIdResponse));
|
||||
SuccessOrExit(error = AppendSourceAddress(*message));
|
||||
@@ -2170,7 +2171,7 @@ ThreadError MleRouter::SendChildUpdateResponse(Child *aChild, const Ip6::Message
|
||||
ThreadError error = kThreadError_None;
|
||||
Message *message;
|
||||
|
||||
VerifyOrExit((message = Ip6::Udp::NewMessage(0)) != NULL, ;);
|
||||
VerifyOrExit((message = mSocket.NewMessage(0)) != NULL, ;);
|
||||
message->SetLinkSecurityEnabled(false);
|
||||
SuccessOrExit(error = AppendHeader(*message, Header::kCommandChildUpdateResponse));
|
||||
|
||||
@@ -2229,7 +2230,7 @@ ThreadError MleRouter::SendDataResponse(const Ip6::Address &aDestination, const
|
||||
Neighbor *neighbor;
|
||||
bool stableOnly;
|
||||
|
||||
VerifyOrExit((message = Ip6::Udp::NewMessage(0)) != NULL, ;);
|
||||
VerifyOrExit((message = mSocket.NewMessage(0)) != NULL, ;);
|
||||
message->SetLinkSecurityEnabled(false);
|
||||
SuccessOrExit(error = AppendHeader(*message, Header::kCommandDataResponse));
|
||||
SuccessOrExit(error = AppendSourceAddress(*message));
|
||||
@@ -2829,7 +2830,7 @@ ThreadError MleRouter::SendAddressSolicit(ThreadStatusTlv::Status aStatus)
|
||||
header.AppendContentFormatOption(Coap::Header::kApplicationOctetStream);
|
||||
header.Finalize();
|
||||
|
||||
VerifyOrExit((message = Ip6::Udp::NewMessage(0)) != NULL, error = kThreadError_NoBufs);
|
||||
VerifyOrExit((message = mSocket.NewMessage(0)) != NULL, error = kThreadError_NoBufs);
|
||||
SuccessOrExit(error = message->Append(header.GetBytes(), header.GetLength()));
|
||||
|
||||
macAddr64Tlv.Init();
|
||||
@@ -2882,7 +2883,7 @@ ThreadError MleRouter::SendAddressRelease(void)
|
||||
header.AppendContentFormatOption(Coap::Header::kApplicationOctetStream);
|
||||
header.Finalize();
|
||||
|
||||
VerifyOrExit((message = Ip6::Udp::NewMessage(0)) != NULL, error = kThreadError_NoBufs);
|
||||
VerifyOrExit((message = mSocket.NewMessage(0)) != NULL, error = kThreadError_NoBufs);
|
||||
SuccessOrExit(error = message->Append(header.GetBytes(), header.GetLength()));
|
||||
|
||||
rlocTlv.Init();
|
||||
@@ -3119,7 +3120,7 @@ void MleRouter::SendAddressSolicitResponse(const Coap::Header &aRequestHeader, u
|
||||
ThreadRloc16Tlv rlocTlv;
|
||||
Message *message;
|
||||
|
||||
VerifyOrExit((message = Ip6::Udp::NewMessage(0)) != NULL, error = kThreadError_NoBufs);
|
||||
VerifyOrExit((message = mCoapServer.NewMessage(0)) != NULL, error = kThreadError_NoBufs);
|
||||
responseHeader.Init();
|
||||
responseHeader.SetVersion(1);
|
||||
responseHeader.SetType(Coap::Header::kTypeAcknowledgment);
|
||||
@@ -3212,7 +3213,7 @@ void MleRouter::SendAddressReleaseResponse(const Coap::Header &aRequestHeader, c
|
||||
Coap::Header responseHeader;
|
||||
Message *message;
|
||||
|
||||
VerifyOrExit((message = Ip6::Udp::NewMessage(0)) != NULL, error = kThreadError_NoBufs);
|
||||
VerifyOrExit((message = mCoapServer.NewMessage(0)) != NULL, error = kThreadError_NoBufs);
|
||||
responseHeader.Init();
|
||||
responseHeader.SetVersion(1);
|
||||
responseHeader.SetType(Coap::Header::kTypeAcknowledgment);
|
||||
|
||||
@@ -46,7 +46,8 @@ namespace Thread {
|
||||
namespace NetworkData {
|
||||
|
||||
NetworkData::NetworkData(ThreadNetif &aThreadNetif):
|
||||
mMle(aThreadNetif.GetMle())
|
||||
mMle(aThreadNetif.GetMle()),
|
||||
mSocket(aThreadNetif.GetIp6().mUdp)
|
||||
{
|
||||
mLength = 0;
|
||||
mCoapMessageId = 0;
|
||||
@@ -608,7 +609,7 @@ ThreadError NetworkData::SendServerDataNotification(bool aLocal, uint16_t aRloc1
|
||||
header.AppendContentFormatOption(Coap::Header::kApplicationOctetStream);
|
||||
header.Finalize();
|
||||
|
||||
VerifyOrExit((message = Ip6::Udp::NewMessage(0)) != NULL, error = kThreadError_NoBufs);
|
||||
VerifyOrExit((message = mSocket.NewMessage(0)) != NULL, error = kThreadError_NoBufs);
|
||||
SuccessOrExit(error = message->Append(header.GetBytes(), header.GetLength()));
|
||||
|
||||
if (aLocal)
|
||||
|
||||
@@ -497,7 +497,7 @@ void Leader::SendServerDataResponse(const Coap::Header &aRequestHeader, const Ip
|
||||
Coap::Header responseHeader;
|
||||
Message *message;
|
||||
|
||||
VerifyOrExit((message = Ip6::Udp::NewMessage(0)) != NULL, error = kThreadError_NoBufs);
|
||||
VerifyOrExit((message = mCoapServer.NewMessage(0)) != NULL, error = kThreadError_NoBufs);
|
||||
responseHeader.Init();
|
||||
responseHeader.SetVersion(1);
|
||||
responseHeader.SetType(Coap::Header::kTypeAcknowledgment);
|
||||
|
||||
@@ -56,7 +56,7 @@ static const char name[] = "thread";
|
||||
|
||||
ThreadNetif::ThreadNetif(Ip6::Ip6 &aIp6):
|
||||
Netif(aIp6),
|
||||
mCoapServer(kCoapUdpPort),
|
||||
mCoapServer(aIp6.mUdp, kCoapUdpPort),
|
||||
mAddressResolver(*this),
|
||||
mActiveDataset(*this),
|
||||
mPendingDataset(*this),
|
||||
|
||||
Reference in New Issue
Block a user