From b3dbf285eab73b17299f81483a4ecca8bccffe24 Mon Sep 17 00:00:00 2001 From: rongli Date: Thu, 10 Aug 2017 13:22:33 +0800 Subject: [PATCH] [cli] fix udp example (#2084) --- src/cli/README_UDP.md | 2 +- src/cli/cli_udp_example.cpp | 34 ++++++++++++++++------------------ src/core/net/udp6.cpp | 13 +++++++++++++ src/core/net/udp6.hpp | 5 +++-- 4 files changed, 33 insertions(+), 21 deletions(-) diff --git a/src/cli/README_UDP.md b/src/cli/README_UDP.md index 74217cc33..29fbc54dd 100644 --- a/src/cli/README_UDP.md +++ b/src/cli/README_UDP.md @@ -33,7 +33,7 @@ On node 2, open the example UDP socket and send a simple message. On node 1, you should see a print out similar to below: ```bash -5 bytes from fdde:ad00:beef:0:dac3:6792:e2e:90d8: hello +5 bytes from fdde:ad00:beef:0:dac3:6792:e2e:90d8 49153 hello ``` ## Command List diff --git a/src/cli/cli_udp_example.cpp b/src/cli/cli_udp_example.cpp index b4b4da7ed..dcf5c0a9f 100644 --- a/src/cli/cli_udp_example.cpp +++ b/src/cli/cli_udp_example.cpp @@ -74,14 +74,14 @@ otError Udp::ProcessBind(int argc, char *argv[]) otSockAddr sockaddr; long value; - memset(&sockaddr, 0, sizeof(sockaddr)); - VerifyOrExit(argc == 2, error = OT_ERROR_PARSE); - error = otIp6AddressFromString(argv[1], &sockaddr.mAddress); + memset(&sockaddr, 0, sizeof(sockaddr)); + + error = otIp6AddressFromString(argv[0], &sockaddr.mAddress); SuccessOrExit(error); - error = Interpreter::ParseLong(argv[2], value); + error = Interpreter::ParseLong(argv[1], value); SuccessOrExit(error); sockaddr.mPort = static_cast(value); @@ -98,14 +98,14 @@ otError Udp::ProcessConnect(int argc, char *argv[]) otSockAddr sockaddr; long value; - memset(&sockaddr, 0, sizeof(sockaddr)); - VerifyOrExit(argc == 2, error = OT_ERROR_PARSE); - error = otIp6AddressFromString(argv[1], &sockaddr.mAddress); + memset(&sockaddr, 0, sizeof(sockaddr)); + + error = otIp6AddressFromString(argv[0], &sockaddr.mAddress); SuccessOrExit(error); - error = Interpreter::ParseLong(argv[2], value); + error = Interpreter::ParseLong(argv[1], value); SuccessOrExit(error); sockaddr.mPort = static_cast(value); @@ -137,7 +137,7 @@ otError Udp::ProcessSend(int argc, char *argv[]) otError error; otMessageInfo messageInfo; otMessage *message = NULL; - int curArg = 1; + int curArg = 0; memset(&messageInfo, 0, sizeof(messageInfo)); @@ -159,7 +159,7 @@ otError Udp::ProcessSend(int argc, char *argv[]) message = otUdpNewMessage(mInterpreter.mInstance, true); VerifyOrExit(message != NULL, error = OT_ERROR_NO_BUFS); - error = otMessageAppend(message, argv[curArg], static_cast(strlen(argv[3]))); + error = otMessageAppend(message, argv[curArg], static_cast(strlen(argv[curArg]))); SuccessOrExit(error); error = otUdpSend(&mSocket, message, &messageInfo); @@ -176,20 +176,17 @@ exit: otError Udp::Process(int argc, char *argv[]) { - otError error = OT_ERROR_NONE; + otError error = OT_ERROR_PARSE; for (size_t i = 0; i < sizeof(sCommands) / sizeof(sCommands[0]); i++) { if (strcmp(argv[0], sCommands[i].mName) == 0) { - (this->*sCommands[i].mCommand)(argc, argv); - ExitNow(); + error = (this->*sCommands[i].mCommand)(argc - 1, argv + 1); + break; } } - error = OT_ERROR_PARSE; - -exit: return error; } @@ -204,7 +201,7 @@ void Udp::HandleUdpReceive(otMessage *aMessage, const otMessageInfo *aMessageInf int length; mInterpreter.mServer->OutputFormat("%d bytes from ", otMessageGetLength(aMessage) - otMessageGetOffset(aMessage)); - mInterpreter.mServer->OutputFormat("%x:%x:%x:%x:%x:%x:%x:%x: ", + mInterpreter.mServer->OutputFormat("%x:%x:%x:%x:%x:%x:%x:%x %d ", HostSwap16(aMessageInfo->mPeerAddr.mFields.m16[0]), HostSwap16(aMessageInfo->mPeerAddr.mFields.m16[1]), HostSwap16(aMessageInfo->mPeerAddr.mFields.m16[2]), @@ -212,7 +209,8 @@ void Udp::HandleUdpReceive(otMessage *aMessage, const otMessageInfo *aMessageInf HostSwap16(aMessageInfo->mPeerAddr.mFields.m16[4]), HostSwap16(aMessageInfo->mPeerAddr.mFields.m16[5]), HostSwap16(aMessageInfo->mPeerAddr.mFields.m16[6]), - HostSwap16(aMessageInfo->mPeerAddr.mFields.m16[7])); + HostSwap16(aMessageInfo->mPeerAddr.mFields.m16[7]), + aMessageInfo->mPeerPort); length = otMessageRead(aMessage, otMessageGetOffset(aMessage), buf, sizeof(buf) - 1); buf[length] = '\0'; diff --git a/src/core/net/udp6.cpp b/src/core/net/udp6.cpp index 791305949..706ad35a9 100644 --- a/src/core/net/udp6.cpp +++ b/src/core/net/udp6.cpp @@ -114,6 +114,19 @@ otError UdpSocket::SendTo(Message &aMessage, const MessageInfo &aMessageInfo) GetSockName().mPort = static_cast(mTransport)->GetEphemeralPort(); } + if (messageInfoLocal.GetPeerAddr().IsUnspecified()) + { + VerifyOrExit(!GetPeerName().GetAddress().IsUnspecified(), error = OT_ERROR_INVALID_ARGS); + + messageInfoLocal.SetPeerAddr(GetPeerName().GetAddress()); + } + + if (messageInfoLocal.mPeerPort == 0) + { + VerifyOrExit(GetPeerName().mPort != 0, error = OT_ERROR_INVALID_ARGS); + messageInfoLocal.mPeerPort = GetPeerName().mPort; + } + udpHeader.SetSourcePort(GetSockName().mPort); udpHeader.SetDestinationPort(messageInfoLocal.mPeerPort); udpHeader.SetLength(sizeof(udpHeader) + aMessage.GetLength()); diff --git a/src/core/net/udp6.hpp b/src/core/net/udp6.hpp index 4cd538b7c..6b06037b8 100644 --- a/src/core/net/udp6.hpp +++ b/src/core/net/udp6.hpp @@ -126,8 +126,9 @@ public: * @param[in] aMessage The message to send. * @param[in] aMessageInfo The message info associated with @p aMessage. * - * @retval OT_ERROR_NONE Successfully sent the UDP message. - * @retval OT_ERROR_NO_BUFS Insufficient available buffer to add the UDP and IPv6 headers. + * @retval OT_ERROR_NONE Successfully sent the UDP message. + * @retval OT_ERROR_INVALID_ARGS If no peer is specified in @p aMessageInfo or by connect(). + * @retval OT_ERROR_NO_BUFS Insufficient available buffer to add the UDP and IPv6 headers. * */ otError SendTo(Message &aMessage, const MessageInfo &aMessageInfo);