diff --git a/include/openthread-types.h b/include/openthread-types.h index 7bfa3a3d5..b243e30a2 100644 --- a/include/openthread-types.h +++ b/include/openthread-types.h @@ -142,7 +142,7 @@ typedef struct otMasterKey uint8_t m8[OT_MASTER_KEY_SIZE]; } otMasterKey; -#define OT_NETWORK_NAME_SIZE 16 ///< Size of the Thread Network Name field (bytes) +#define OT_NETWORK_NAME_MAX_SIZE 16 ///< Maximum size of the Thread Network Name field (bytes) /** * This structure represents a Network Name. @@ -150,7 +150,7 @@ typedef struct otMasterKey */ typedef struct otNetworkName { - char m8[OT_NETWORK_NAME_SIZE]; + char m8[OT_NETWORK_NAME_MAX_SIZE + 1]; } otNetworkName; #define OT_EXT_PAN_ID_SIZE 8 ///< Size of a Thread PAN ID (bytes) @@ -247,16 +247,16 @@ typedef OT_TOOL_PACKED_BEGIN struct otIp6Address */ typedef struct otActiveScanResult { - otExtAddress mExtAddress; ///< IEEE 802.15.4 Extended Address - const char *mNetworkName; ///< Thread Network Name - const uint8_t *mExtPanId; ///< Thread Extended PAN ID - uint16_t mPanId; ///< IEEE 802.15.4 PAN ID - uint8_t mChannel; ///< IEEE 802.15.4 Channel - int8_t mRssi; ///< RSSI (dBm) - uint8_t mLqi; ///< LQI - unsigned int mVersion : 4; ///< Version - bool mIsNative : 1; ///< Native Commissioner flag - bool mIsJoinable : 1; ///< Joining Permitted flag + otExtAddress mExtAddress; ///< IEEE 802.15.4 Extended Address + otNetworkName mNetworkName; ///< Thread Network Name + otExtendedPanId mExtendedPanId; ///< Thread Extended PAN ID + uint16_t mPanId; ///< IEEE 802.15.4 PAN ID + uint8_t mChannel; ///< IEEE 802.15.4 Channel + int8_t mRssi; ///< RSSI (dBm) + uint8_t mLqi; ///< LQI + unsigned int mVersion : 4; ///< Version + bool mIsNative : 1; ///< Native Commissioner flag + bool mIsJoinable : 1; ///< Joining Permitted flag } otActiveScanResult; /** diff --git a/src/cli/cli.cpp b/src/cli/cli.cpp index 5df10b8d6..1ba605312 100644 --- a/src/cli/cli.cpp +++ b/src/cli/cli.cpp @@ -883,7 +883,7 @@ void Interpreter::ProcessNetworkName(int argc, char *argv[]) if (argc == 0) { - sServer->OutputFormat("%.*s\r\n", OT_NETWORK_NAME_SIZE, otGetNetworkName()); + sServer->OutputFormat("%.*s\r\n", OT_NETWORK_NAME_MAX_SIZE, otGetNetworkName()); } else { @@ -1456,25 +1456,11 @@ void Interpreter::HandleActiveScanResult(otActiveScanResult *aResult) sServer->OutputFormat("| %d ", aResult->mIsJoinable); - if (aResult->mNetworkName != NULL) - { - sServer->OutputFormat("| %-16s ", aResult->mNetworkName); - } - else - { - sServer->OutputFormat("| ---------------- "); - } + sServer->OutputFormat("| %-16s ", aResult->mNetworkName.m8); - if (aResult->mExtPanId != NULL) - { - sServer->OutputFormat("| "); - OutputBytes(aResult->mExtPanId, OT_EXT_PAN_ID_SIZE); - sServer->OutputFormat(" "); - } - else - { - sServer->OutputFormat("| ---------------- "); - } + sServer->OutputFormat("| "); + OutputBytes(aResult->mExtendedPanId.m8, OT_EXT_PAN_ID_SIZE); + sServer->OutputFormat(" "); sServer->OutputFormat("| %04x | ", aResult->mPanId); OutputBytes(aResult->mExtAddress.m8, OT_EXT_ADDRESS_SIZE); diff --git a/src/cli/cli_dataset.cpp b/src/cli/cli_dataset.cpp index e95ced93b..3092b65c3 100644 --- a/src/cli/cli_dataset.cpp +++ b/src/cli/cli_dataset.cpp @@ -306,7 +306,7 @@ ThreadError Dataset::ProcessNetworkName(int argc, char *argv[]) size_t length; VerifyOrExit(argc > 0, error = kThreadError_Parse); - VerifyOrExit((length = strlen(argv[0])) <= OT_NETWORK_NAME_SIZE, error = kThreadError_Parse); + VerifyOrExit((length = strlen(argv[0])) <= OT_NETWORK_NAME_MAX_SIZE, error = kThreadError_Parse); memset(&sDataset.mNetworkName, 0, sizeof(sDataset.mNetworkName)); memcpy(sDataset.mNetworkName.m8, argv[0], length); diff --git a/src/core/mac/mac.cpp b/src/core/mac/mac.cpp index 74ed3ad53..7587918a4 100644 --- a/src/core/mac/mac.cpp +++ b/src/core/mac/mac.cpp @@ -85,7 +85,6 @@ Mac::Mac(ThreadNetif &aThreadNetif): mCsmaAttempts = 0; mTransmitAttempts = 0; mTransmitBeacon = false; - mBeacon.Init(); mActiveScanRequest = false; mScanChannel = kPhyMinChannel; @@ -241,13 +240,20 @@ ThreadError Mac::SetChannel(uint8_t aChannel) const char *Mac::GetNetworkName(void) const { - return mBeacon.GetNetworkName(); + return mNetworkName.m8; } ThreadError Mac::SetNetworkName(const char *aNetworkName) { - mBeacon.SetNetworkName(aNetworkName); - return kThreadError_None; + ThreadError error = kThreadError_None; + + VerifyOrExit(strlen(aNetworkName) <= OT_NETWORK_NAME_MAX_SIZE, error = kThreadError_InvalidArgs); + + memset(&mNetworkName, 0, sizeof(mNetworkName)); + strncpy(mNetworkName.m8, aNetworkName, sizeof(mNetworkName)); + +exit: + return error; } PanId Mac::GetPanId(void) const @@ -263,12 +269,12 @@ ThreadError Mac::SetPanId(PanId aPanId) const uint8_t *Mac::GetExtendedPanId(void) const { - return mBeacon.GetExtendedPanId(); + return mExtendedPanId.m8; } ThreadError Mac::SetExtendedPanId(const uint8_t *aExtPanId) { - mBeacon.SetExtendedPanId(aExtPanId); + memcpy(mExtendedPanId.m8, aExtPanId, sizeof(mExtendedPanId)); return kThreadError_None; } @@ -382,6 +388,7 @@ void Mac::SendBeaconRequest(Frame &aFrame) void Mac::SendBeacon(Frame &aFrame) { uint8_t numUnsecurePorts; + Beacon *beacon; uint16_t fcf; // initialize MAC header @@ -390,21 +397,26 @@ void Mac::SendBeacon(Frame &aFrame) aFrame.SetSrcPanId(mPanId); aFrame.SetSrcAddr(mExtAddress); + // write payload + beacon = reinterpret_cast(aFrame.GetPayload()); + beacon->Init(); + // set the Joining Permitted flag mNetif.GetIp6Filter().GetUnsecurePorts(numUnsecurePorts); if (numUnsecurePorts) { - mBeacon.SetJoiningPermitted(); + beacon->SetJoiningPermitted(); } else { - mBeacon.ClearJoiningPermitted(); + beacon->ClearJoiningPermitted(); } - // write payload - memcpy(aFrame.GetPayload(), &mBeacon, sizeof(mBeacon)); - aFrame.SetPayloadLength(sizeof(mBeacon)); + beacon->SetNetworkName(mNetworkName.m8); + beacon->SetExtendedPanId(mExtendedPanId.m8); + + aFrame.SetPayloadLength(sizeof(*beacon)); otLogInfoMac("Sent Beacon\n"); } diff --git a/src/core/mac/mac.hpp b/src/core/mac/mac.hpp index 50a16cca7..64cb6f4a8 100644 --- a/src/core/mac/mac.hpp +++ b/src/core/mac/mac.hpp @@ -471,7 +471,8 @@ private: PanId mPanId; uint8_t mChannel; - Beacon mBeacon; + otNetworkName mNetworkName; + otExtendedPanId mExtendedPanId; Sender *mSendHead, *mSendTail; Receiver *mReceiveHead, *mReceiveTail; diff --git a/src/core/openthread.cpp b/src/core/openthread.cpp index 235b184d4..1773b1bfb 100644 --- a/src/core/openthread.cpp +++ b/src/core/openthread.cpp @@ -928,8 +928,8 @@ void HandleActiveScanResult(void *aContext, Mac::Frame *aFrame) result.mVersion = beacon->GetProtocolVersion(); result.mIsJoinable = beacon->IsJoiningPermitted(); result.mIsNative = beacon->IsNative(); - result.mNetworkName = beacon->GetNetworkName(); - result.mExtPanId = beacon->GetExtendedPanId(); + memcpy(&result.mNetworkName, beacon->GetNetworkName(), sizeof(result.mNetworkName)); + memcpy(&result.mExtendedPanId, beacon->GetExtendedPanId(), sizeof(result.mExtendedPanId)); } handler(&result); diff --git a/src/core/thread/meshcop_tlvs.hpp b/src/core/thread/meshcop_tlvs.hpp index b30185789..73354bd0f 100644 --- a/src/core/thread/meshcop_tlvs.hpp +++ b/src/core/thread/meshcop_tlvs.hpp @@ -321,10 +321,11 @@ public: void SetNetworkName(const char *aNetworkName) { size_t length = strnlen(aNetworkName, sizeof(mNetworkName)); memcpy(mNetworkName, aNetworkName, length); + SetLength(static_cast(length)); } private: - char mNetworkName[OT_NETWORK_NAME_SIZE]; + char mNetworkName[OT_NETWORK_NAME_MAX_SIZE]; } OT_TOOL_PACKED_END; /** diff --git a/src/core/thread/mle.cpp b/src/core/thread/mle.cpp index 5abea457b..abd3d8229 100644 --- a/src/core/thread/mle.cpp +++ b/src/core/thread/mle.cpp @@ -2235,7 +2235,6 @@ ThreadError Mle::HandleDiscoveryResponse(const Message &aMessage, const Ip6::Mes otActiveScanResult result; uint16_t offset; uint16_t end; - char networkNameBuf[OT_NETWORK_NAME_SIZE]; otLogInfoMle("Handle discovery response\n"); @@ -2284,15 +2283,13 @@ ThreadError Mle::HandleDiscoveryResponse(const Message &aMessage, const Ip6::Mes case MeshCoP::Tlv::kExtendedPanId: aMessage.Read(offset, sizeof(extPanId), &extPanId); VerifyOrExit(extPanId.IsValid(), error = kThreadError_Parse); - result.mExtPanId = extPanId.GetExtendedPanId(); + memcpy(&result.mExtendedPanId, extPanId.GetExtendedPanId(), sizeof(result.mExtendedPanId)); break; case MeshCoP::Tlv::kNetworkName: aMessage.Read(offset, sizeof(networkName), &networkName); VerifyOrExit(networkName.IsValid(), error = kThreadError_Parse); - memcpy(networkNameBuf, networkName.GetNetworkName(), networkName.GetLength()); - memset(networkNameBuf + networkName.GetLength(), 0, sizeof(networkNameBuf) - networkName.GetLength()); - result.mNetworkName = networkNameBuf; + memcpy(&result.mNetworkName, networkName.GetNetworkName(), networkName.GetLength()); break; default: diff --git a/src/ncp/ncp_base.cpp b/src/ncp/ncp_base.cpp index f8816aaab..2f1f4b2a5 100644 --- a/src/ncp/ncp_base.cpp +++ b/src/ncp/ncp_base.cpp @@ -455,8 +455,8 @@ void NcpBase::HandleActiveScanResult(otActiveScanResult *result) result->mLqi, SPINEL_PROTOCOL_TYPE_THREAD, flags, - result->mNetworkName, - result->mExtPanId, OT_EXT_PAN_ID_SIZE + result->mNetworkName.m8, + result->mExtendedPanId.m8, OT_EXT_PAN_ID_SIZE ); } else