diff --git a/include/openthread/udp.h b/include/openthread/udp.h index 5aa65c92c..489dd865f 100644 --- a/include/openthread/udp.h +++ b/include/openthread/udp.h @@ -99,6 +99,7 @@ otMessage *otUdpNewMessage(otInstance *aInstance, bool aLinkSecurityEnabled); * @sa otUdpNewMessage * @sa otUdpClose * @sa otUdpBind + * @sa otUdpConnect * @sa otUdpSend * */ @@ -114,6 +115,7 @@ ThreadError otUdpOpen(otInstance *aInstance, otUdpSocket *aSocket, otUdpReceive * @sa otUdpNewMessage * @sa otUdpOpen * @sa otUdpBind + * @sa otUdpConnect * @sa otUdpSend * */ @@ -129,12 +131,30 @@ ThreadError otUdpClose(otUdpSocket *aSocket); * * @sa otUdpNewMessage * @sa otUdpOpen + * @sa otUdpConnect * @sa otUdpClose * @sa otUdpSend * */ ThreadError otUdpBind(otUdpSocket *aSocket, otSockAddr *aSockName); +/** + * Connect a UDP/IPv6 socket. + * + * @param[in] aSocket A pointer to a UDP socket structure. + * @param[in] aSockName A pointer to an IPv6 socket address structure. + * + * @retval kThreadErrorNone Connect operation was successful. + * + * @sa otUdpNewMessage + * @sa otUdpOpen + * @sa otUdpBind + * @sa otUdpClose + * @sa otUdpSend + * + */ +ThreadError otUdpConnect(otUdpSocket *aSocket, otSockAddr *aSockName); + /** * Send a UDP/IPv6 message. * @@ -146,6 +166,7 @@ ThreadError otUdpBind(otUdpSocket *aSocket, otSockAddr *aSockName); * @sa otUdpOpen * @sa otUdpClose * @sa otUdpBind + * @sa otUdpConnect * @sa otUdpSend * */ diff --git a/src/core/api/udp_api.cpp b/src/core/api/udp_api.cpp index c45614109..8cdec01d6 100644 --- a/src/core/api/udp_api.cpp +++ b/src/core/api/udp_api.cpp @@ -91,6 +91,12 @@ ThreadError otUdpBind(otUdpSocket *aSocket, otSockAddr *aSockName) return socket->Bind(*static_cast(aSockName)); } +ThreadError otUdpConnect(otUdpSocket *aSocket, otSockAddr *aSockName) +{ + Ip6::UdpSocket *socket = static_cast(aSocket); + return socket->Connect(*static_cast(aSockName)); +} + ThreadError otUdpSend(otUdpSocket *aSocket, otMessage *aMessage, const otMessageInfo *aMessageInfo) { Ip6::UdpSocket *socket = static_cast(aSocket); diff --git a/src/core/coap/secure_coap_server.cpp b/src/core/coap/secure_coap_server.cpp index 25c17cdd1..f048e11d6 100644 --- a/src/core/coap/secure_coap_server.cpp +++ b/src/core/coap/secure_coap_server.cpp @@ -115,6 +115,11 @@ void SecureServer::Receive(Message &aMessage, const Ip6::MessageInfo &aMessageIn if (!mNetif.GetDtls().IsStarted()) { + Ip6::SockAddr sockAddr; + sockAddr.mAddress = aMessageInfo.GetPeerAddr(); + sockAddr.mPort = aMessageInfo.GetPeerPort(); + mSocket.Connect(sockAddr); + mPeerAddress.SetPeerAddr(aMessageInfo.GetPeerAddr()); mPeerAddress.SetPeerPort(aMessageInfo.GetPeerPort()); diff --git a/src/core/net/udp6.cpp b/src/core/net/udp6.cpp index 32cdb6ea1..c77ffa498 100644 --- a/src/core/net/udp6.cpp +++ b/src/core/net/udp6.cpp @@ -69,6 +69,12 @@ ThreadError UdpSocket::Bind(const SockAddr &aSockAddr) return kThreadError_None; } +ThreadError UdpSocket::Connect(const SockAddr &aSockAddr) +{ + mPeerName = aSockAddr; + return kThreadError_None; +} + ThreadError UdpSocket::Close(void) { ThreadError error = kThreadError_None; diff --git a/src/core/net/udp6.hpp b/src/core/net/udp6.hpp index c66af1da1..d91b10c31 100644 --- a/src/core/net/udp6.hpp +++ b/src/core/net/udp6.hpp @@ -102,6 +102,15 @@ public: */ ThreadError Bind(const SockAddr &aSockAddr); + /** + * This method connects the UDP socket. + * + * @param[in] aSockAddr A reference to the socket address. + * + * @retval kThreadError_None Successfully connected the socket. + */ + ThreadError Connect(const SockAddr &aSockAddr); + /** * This method closes the UDP socket. *