diff --git a/include/openthread-types.h b/include/openthread-types.h index 8b929c329..828d8fdce 100644 --- a/include/openthread-types.h +++ b/include/openthread-types.h @@ -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; /** diff --git a/src/core/coap/coap_server.cpp b/src/core/coap/coap_server.cpp index d17a0eabc..407c4c625 100644 --- a/src/core/coap/coap_server.cpp +++ b/src/core/coap/coap_server.cpp @@ -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); diff --git a/src/core/coap/coap_server.hpp b/src/core/coap/coap_server.hpp index 1c929829a..433d45e71 100644 --- a/src/core/coap/coap_server.hpp +++ b/src/core/coap/coap_server.hpp @@ -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. * diff --git a/src/core/net/ip6.cpp b/src/core/net/ip6.cpp index 8db139651..2003d8b3b 100644 --- a/src/core/net/ip6.cpp +++ b/src/core/net/ip6.cpp @@ -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)); diff --git a/src/core/net/ip6.hpp b/src/core/net/ip6.hpp index b3010b3f0..a7ee3577b 100644 --- a/src/core/net/ip6.hpp +++ b/src/core/net/ip6.hpp @@ -45,6 +45,7 @@ #include #include #include +#include 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); diff --git a/src/core/net/udp6.cpp b/src/core/net/udp6.cpp index 7f7cca990..9706940ae 100644 --- a/src/core/net/udp6.cpp +++ b/src/core/net/udp6.cpp @@ -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(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(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(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(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(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()) { diff --git a/src/core/net/udp6.hpp b/src/core/net/udp6.hpp index 93391c44c..385b79efa 100644 --- a/src/core/net/udp6.hpp +++ b/src/core/net/udp6.hpp @@ -35,11 +35,13 @@ #define UDP6_HPP_ #include -#include +#include 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 diff --git a/src/core/openthread.cpp b/src/core/openthread.cpp index 69a411aca..1f46a35c2 100644 --- a/src/core/openthread.cpp +++ b/src/core/openthread.cpp @@ -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) diff --git a/src/core/thread/address_resolver.cpp b/src/core/thread/address_resolver.cpp index d087c2ff6..043a7f663 100644 --- a/src/core/thread/address_resolver.cpp +++ b/src/core/thread/address_resolver.cpp @@ -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); diff --git a/src/core/thread/meshcop_dataset_manager.cpp b/src/core/thread/meshcop_dataset_manager.cpp index df176e036..791d4c780 100644 --- a/src/core/thread/meshcop_dataset_manager.cpp +++ b/src/core/thread/meshcop_dataset_manager.cpp @@ -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); diff --git a/src/core/thread/mle.cpp b/src/core/thread/mle.cpp index fb555f403..8511a0faa 100644 --- a/src/core/thread/mle.cpp +++ b/src/core/thread/mle.cpp @@ -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(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); diff --git a/src/core/thread/mle_router.cpp b/src/core/thread/mle_router.cpp index 5303177a5..5cc593935 100644 --- a/src/core/thread/mle_router.cpp +++ b/src/core/thread/mle_router.cpp @@ -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); diff --git a/src/core/thread/network_data.cpp b/src/core/thread/network_data.cpp index 67d3c34d5..085739822 100644 --- a/src/core/thread/network_data.cpp +++ b/src/core/thread/network_data.cpp @@ -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) diff --git a/src/core/thread/network_data_leader.cpp b/src/core/thread/network_data_leader.cpp index 760b5d79e..c2ac98077 100644 --- a/src/core/thread/network_data_leader.cpp +++ b/src/core/thread/network_data_leader.cpp @@ -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); diff --git a/src/core/thread/thread_netif.cpp b/src/core/thread/thread_netif.cpp index d4f8ea349..0a4ef4037 100644 --- a/src/core/thread/thread_netif.cpp +++ b/src/core/thread/thread_netif.cpp @@ -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),