diff --git a/src/core/meshcop/announce_begin_client.cpp b/src/core/meshcop/announce_begin_client.cpp index e12676cee..610227d58 100644 --- a/src/core/meshcop/announce_begin_client.cpp +++ b/src/core/meshcop/announce_begin_client.cpp @@ -58,14 +58,10 @@ otError AnnounceBeginClient::SendRequest(uint32_t aChannelMask, uint16_t aPeriod, const Ip6::Address &aAddress) { - otError error = OT_ERROR_NONE; - MeshCoP::CommissionerSessionIdTlv sessionId; - MeshCoP::ChannelMaskTlv channelMask; - MeshCoP::CountTlv count; - MeshCoP::PeriodTlv period; - - Ip6::MessageInfo messageInfo; - Coap::Message * message = NULL; + otError error = OT_ERROR_NONE; + MeshCoP::ChannelMaskTlv channelMask; + Ip6::MessageInfo messageInfo; + Coap::Message * message = NULL; VerifyOrExit(Get().IsActive(), error = OT_ERROR_INVALID_STATE); VerifyOrExit((message = MeshCoP::NewMeshCoPMessage(Get())) != NULL, error = OT_ERROR_NO_BUFS); @@ -75,21 +71,15 @@ otError AnnounceBeginClient::SendRequest(uint32_t aChannelMask, OT_COAP_CODE_POST, OT_URI_PATH_ANNOUNCE_BEGIN)); SuccessOrExit(error = message->SetPayloadMarker()); - sessionId.Init(); - sessionId.SetCommissionerSessionId(Get().GetSessionId()); - SuccessOrExit(error = sessionId.AppendTo(*message)); + SuccessOrExit(error = Tlv::AppendUint16Tlv(*message, MeshCoP::Tlv::kCommissionerSessionId, + Get().GetSessionId())); channelMask.Init(); channelMask.SetChannelMask(aChannelMask); SuccessOrExit(error = channelMask.AppendTo(*message)); - count.Init(); - count.SetCount(aCount); - SuccessOrExit(error = count.AppendTo(*message)); - - period.Init(); - period.SetPeriod(aPeriod); - SuccessOrExit(error = period.AppendTo(*message)); + SuccessOrExit(error = Tlv::AppendUint8Tlv(*message, MeshCoP::Tlv::kCount, aCount)); + SuccessOrExit(error = Tlv::AppendUint16Tlv(*message, MeshCoP::Tlv::kPeriod, aPeriod)); messageInfo.SetSockAddr(Get().GetMeshLocal16()); messageInfo.SetPeerAddr(aAddress); diff --git a/src/core/meshcop/border_agent.cpp b/src/core/meshcop/border_agent.cpp index f97ed5c3f..e7a5e9004 100644 --- a/src/core/meshcop/border_agent.cpp +++ b/src/core/meshcop/border_agent.cpp @@ -242,21 +242,17 @@ void BorderAgent::HandleCoapResponse(void * aContext, if (forwardContext.IsPetition() && response->GetCode() == OT_COAP_CODE_CHANGED) { - StateTlv stateTlv; + uint8_t state; - SuccessOrExit(error = Tlv::GetTlv(*response, Tlv::kState, sizeof(stateTlv), stateTlv)); - VerifyOrExit(stateTlv.IsValid(), error = OT_ERROR_PARSE); + SuccessOrExit(error = Tlv::ReadUint8Tlv(*response, Tlv::kState, state)); - if (stateTlv.GetState() == StateTlv::kAccept) + if (state == StateTlv::kAccept) { - CommissionerSessionIdTlv sessionIdTlv; + uint16_t sessionId; - SuccessOrExit(error = - Tlv::GetTlv(*response, Tlv::kCommissionerSessionId, sizeof(sessionIdTlv), sessionIdTlv)); - VerifyOrExit(sessionIdTlv.IsValid(), error = OT_ERROR_PARSE); + SuccessOrExit(error = Tlv::ReadUint16Tlv(*response, Tlv::kCommissionerSessionId, sessionId)); - instance.Get().GetCommissionerAloc(borderAgent.mCommissionerAloc.GetAddress(), - sessionIdTlv.GetCommissionerSessionId()); + instance.Get().GetCommissionerAloc(borderAgent.mCommissionerAloc.GetAddress(), sessionId); instance.Get().AddUnicastAddress(borderAgent.mCommissionerAloc); instance.Get().AddReceiver(borderAgent.mUdpReceiver); } @@ -385,12 +381,8 @@ void BorderAgent::HandleProxyTransmit(const Coap::Message &aMessage) messageInfo.SetPeerPort(tlv.GetDestinationPort()); } - { - IPv6AddressTlv tlv; - - SuccessOrExit(error = Tlv::Get(aMessage, Tlv::kIPv6Address, sizeof(tlv), tlv)); - messageInfo.SetPeerAddr(tlv.GetAddress()); - } + SuccessOrExit( + error = Tlv::ReadTlv(aMessage, Tlv::kIPv6Address, messageInfo.GetPeerAddr().mFields.m8, sizeof(Ip6::Address))); SuccessOrExit(error = Get().SendDatagram(*message, messageInfo, Ip6::kProtoUdp)); otLogInfoMeshCoP("Proxy transmit sent"); @@ -439,13 +431,8 @@ bool BorderAgent::HandleUdpReceive(const Message &aMessage, const Ip6::MessageIn aMessage.CopyTo(aMessage.GetOffset(), offset, udpLength, *message); } - { - IPv6AddressTlv tlv; - - tlv.Init(); - tlv.SetAddress(aMessageInfo.GetPeerAddr()); - SuccessOrExit(error = tlv.AppendTo(*message)); - } + SuccessOrExit(error = Tlv::AppendTlv(*message, Tlv::kIPv6Address, aMessageInfo.GetPeerAddr().mFields.m8, + sizeof(Ip6::Address))); SuccessOrExit(error = Get().SendMessage(*message, Get().GetPeerAddress())); @@ -525,16 +512,15 @@ void BorderAgent::HandleKeepAlive(const Coap::Message &aMessage, const Ip6::Mess void BorderAgent::HandleRelayTransmit(const Coap::Message &aMessage) { - otError error = OT_ERROR_NONE; - JoinerRouterLocatorTlv joinerRouterRloc; - Coap::Message * message = NULL; - Ip6::MessageInfo messageInfo; - uint16_t offset = 0; + otError error = OT_ERROR_NONE; + uint16_t joinerRouterRloc; + Coap::Message * message = NULL; + Ip6::MessageInfo messageInfo; + uint16_t offset = 0; VerifyOrExit(aMessage.GetType() == OT_COAP_TYPE_NON_CONFIRMABLE && aMessage.GetCode() == OT_COAP_CODE_POST); - SuccessOrExit(error = Tlv::GetTlv(aMessage, Tlv::kJoinerRouterLocator, sizeof(joinerRouterRloc), joinerRouterRloc)); - VerifyOrExit(joinerRouterRloc.IsValid(), error = OT_ERROR_PARSE); + SuccessOrExit(error = Tlv::ReadUint16Tlv(aMessage, Tlv::kJoinerRouterLocator, joinerRouterRloc)); VerifyOrExit((message = NewMeshCoPMessage(Get())) != NULL, error = OT_ERROR_NO_BUFS); @@ -549,7 +535,7 @@ void BorderAgent::HandleRelayTransmit(const Coap::Message &aMessage) messageInfo.SetSockAddr(Get().GetMeshLocal16()); messageInfo.SetPeerPort(kCoapUdpPort); messageInfo.SetPeerAddr(Get().GetMeshLocal16()); - messageInfo.GetPeerAddr().mFields.m16[7] = HostSwap16(joinerRouterRloc.GetJoinerRouterLocator()); + messageInfo.GetPeerAddr().mFields.m16[7] = HostSwap16(joinerRouterRloc); SuccessOrExit(error = Get().SendMessage(*message, messageInfo)); diff --git a/src/core/meshcop/commissioner.cpp b/src/core/meshcop/commissioner.cpp index 06578bd74..3c8ec5dbd 100644 --- a/src/core/meshcop/commissioner.cpp +++ b/src/core/meshcop/commissioner.cpp @@ -567,18 +567,13 @@ otError Commissioner::SendMgmtCommissionerSetRequest(const otCommissioningDatase if (aDataset.mIsLocatorSet) { - MeshCoP::BorderAgentLocatorTlv locator; - locator.Init(); - locator.SetBorderAgentLocator(aDataset.mLocator); - SuccessOrExit(error = locator.AppendTo(*message)); + SuccessOrExit(error = Tlv::AppendUint16Tlv(*message, MeshCoP::Tlv::kBorderAgentLocator, aDataset.mLocator)); } if (aDataset.mIsSessionIdSet) { - MeshCoP::CommissionerSessionIdTlv sessionId; - sessionId.Init(); - sessionId.SetCommissionerSessionId(aDataset.mSessionId); - SuccessOrExit(error = sessionId.AppendTo(*message)); + SuccessOrExit(error = + Tlv::AppendUint16Tlv(*message, MeshCoP::Tlv::kCommissionerSessionId, aDataset.mSessionId)); } if (aDataset.mIsSteeringDataSet) @@ -592,10 +587,7 @@ otError Commissioner::SendMgmtCommissionerSetRequest(const otCommissioningDatase if (aDataset.mIsJoinerUdpPortSet) { - MeshCoP::JoinerUdpPortTlv joinerUdpPort; - joinerUdpPort.Init(); - joinerUdpPort.SetUdpPort(aDataset.mJoinerUdpPort); - SuccessOrExit(error = joinerUdpPort.AppendTo(*message)); + SuccessOrExit(error = Tlv::AppendUint16Tlv(*message, Tlv::kJoinerUdpPort, aDataset.mJoinerUdpPort)); } if (aLength > 0) @@ -701,23 +693,18 @@ void Commissioner::HandleLeaderPetitionResponse(Coap::Message * aMessage { OT_UNUSED_VARIABLE(aMessageInfo); - StateTlv state; - CommissionerSessionIdTlv sessionId; - bool retransmit = false; + uint8_t state; + bool retransmit = false; VerifyOrExit(mState == OT_COMMISSIONER_STATE_PETITION, SetState(OT_COMMISSIONER_STATE_DISABLED)); VerifyOrExit(aResult == OT_ERROR_NONE && aMessage->GetCode() == OT_COAP_CODE_CHANGED, retransmit = true); otLogInfoMeshCoP("received Leader Petition response"); - SuccessOrExit(Tlv::GetTlv(*aMessage, Tlv::kState, sizeof(state), state)); - VerifyOrExit(state.IsValid()); + SuccessOrExit(Tlv::ReadUint8Tlv(*aMessage, Tlv::kState, state)); + VerifyOrExit(state == StateTlv::kAccept, SetState(OT_COMMISSIONER_STATE_DISABLED)); - VerifyOrExit(state.GetState() == StateTlv::kAccept, SetState(OT_COMMISSIONER_STATE_DISABLED)); - - SuccessOrExit(Tlv::GetTlv(*aMessage, Tlv::kCommissionerSessionId, sizeof(sessionId), sessionId)); - VerifyOrExit(sessionId.IsValid()); - mSessionId = sessionId.GetCommissionerSessionId(); + SuccessOrExit(Tlv::ReadUint16Tlv(*aMessage, Tlv::kCommissionerSessionId, mSessionId)); Get().GetCommissionerAloc(mCommissionerAloc.GetAddress(), mSessionId); Get().AddUnicastAddress(mCommissionerAloc); @@ -745,24 +732,20 @@ exit: otError Commissioner::SendKeepAlive(void) { - otError error = OT_ERROR_NONE; - Coap::Message * message = NULL; - Ip6::MessageInfo messageInfo; - StateTlv state; - CommissionerSessionIdTlv sessionId; + otError error = OT_ERROR_NONE; + Coap::Message * message = NULL; + Ip6::MessageInfo messageInfo; VerifyOrExit((message = NewMeshCoPMessage(Get())) != NULL, error = OT_ERROR_NO_BUFS); SuccessOrExit(error = message->Init(OT_COAP_TYPE_CONFIRMABLE, OT_COAP_CODE_POST, OT_URI_PATH_LEADER_KEEP_ALIVE)); SuccessOrExit(error = message->SetPayloadMarker()); - state.Init(); - state.SetState(mState == OT_COMMISSIONER_STATE_ACTIVE ? StateTlv::kAccept : StateTlv::kReject); - SuccessOrExit(error = state.AppendTo(*message)); + SuccessOrExit( + error = Tlv::AppendUint8Tlv(*message, Tlv::kState, + (mState == OT_COMMISSIONER_STATE_ACTIVE) ? StateTlv::kAccept : StateTlv::kReject)); - sessionId.Init(); - sessionId.SetCommissionerSessionId(mSessionId); - SuccessOrExit(error = sessionId.AppendTo(*message)); + SuccessOrExit(error = Tlv::AppendUint16Tlv(*message, Tlv::kCommissionerSessionId, mSessionId)); messageInfo.SetSockAddr(Get().GetMeshLocal16()); SuccessOrExit(error = Get().GetLeaderAloc(messageInfo.GetPeerAddr())); @@ -797,7 +780,7 @@ void Commissioner::HandleLeaderKeepAliveResponse(Coap::Message * aMessag { OT_UNUSED_VARIABLE(aMessageInfo); - StateTlv state; + uint8_t state; VerifyOrExit(mState == OT_COMMISSIONER_STATE_ACTIVE, SetState(OT_COMMISSIONER_STATE_DISABLED)); VerifyOrExit(aResult == OT_ERROR_NONE && aMessage->GetCode() == OT_COAP_CODE_CHANGED, @@ -805,10 +788,8 @@ void Commissioner::HandleLeaderKeepAliveResponse(Coap::Message * aMessag otLogInfoMeshCoP("received Leader keep-alive response"); - SuccessOrExit(Tlv::GetTlv(*aMessage, Tlv::kState, sizeof(state), state)); - VerifyOrExit(state.IsValid()); - - VerifyOrExit(state.GetState() == StateTlv::kAccept, SetState(OT_COMMISSIONER_STATE_DISABLED)); + SuccessOrExit(Tlv::ReadUint8Tlv(*aMessage, Tlv::kState, state)); + VerifyOrExit(state == StateTlv::kAccept, SetState(OT_COMMISSIONER_STATE_DISABLED)); mTimer.Start(Time::SecToMsec(kKeepAliveTimeout) / 2); @@ -831,36 +812,31 @@ void Commissioner::HandleRelayReceive(Coap::Message &aMessage, const Ip6::Messag { OT_UNUSED_VARIABLE(aMessageInfo); - otError error; - JoinerUdpPortTlv joinerPort; - JoinerIidTlv joinerIid; - JoinerRouterLocatorTlv joinerRloc; - Ip6::MessageInfo joinerMessageInfo; - uint16_t offset; - uint16_t length; - bool enableJoiner = false; - Mac::ExtAddress receivedId; - Mac::ExtAddress joinerId; + otError error; + uint16_t joinerPort; + uint8_t joinerIid[Ip6::Address::kInterfaceIdentifierSize]; + uint16_t joinerRloc; + Ip6::MessageInfo joinerMessageInfo; + uint16_t offset; + uint16_t length; + bool enableJoiner = false; + Mac::ExtAddress receivedId; + Mac::ExtAddress joinerId; VerifyOrExit(mState == OT_COMMISSIONER_STATE_ACTIVE, error = OT_ERROR_INVALID_STATE); VerifyOrExit(aMessage.GetType() == OT_COAP_TYPE_NON_CONFIRMABLE && aMessage.GetCode() == OT_COAP_CODE_POST); - SuccessOrExit(error = Tlv::GetTlv(aMessage, Tlv::kJoinerUdpPort, sizeof(joinerPort), joinerPort)); - VerifyOrExit(joinerPort.IsValid(), error = OT_ERROR_PARSE); - - SuccessOrExit(error = Tlv::GetTlv(aMessage, Tlv::kJoinerIid, sizeof(joinerIid), joinerIid)); - VerifyOrExit(joinerIid.IsValid(), error = OT_ERROR_PARSE); - - SuccessOrExit(error = Tlv::GetTlv(aMessage, Tlv::kJoinerRouterLocator, sizeof(joinerRloc), joinerRloc)); - VerifyOrExit(joinerRloc.IsValid(), error = OT_ERROR_PARSE); + SuccessOrExit(error = Tlv::ReadUint16Tlv(aMessage, Tlv::kJoinerUdpPort, joinerPort)); + SuccessOrExit(error = Tlv::ReadTlv(aMessage, Tlv::kJoinerIid, joinerIid, sizeof(joinerIid))); + SuccessOrExit(error = Tlv::ReadUint16Tlv(aMessage, Tlv::kJoinerRouterLocator, joinerRloc)); SuccessOrExit(error = Tlv::GetValueOffset(aMessage, Tlv::kJoinerDtlsEncapsulation, offset, length)); VerifyOrExit(length <= aMessage.GetLength() - offset, error = OT_ERROR_PARSE); if (!Get().IsConnectionActive()) { - memcpy(mJoinerIid, joinerIid.GetIid(), sizeof(mJoinerIid)); + memcpy(mJoinerIid, joinerIid, sizeof(mJoinerIid)); receivedId.Set(mJoinerIid); receivedId.ToggleLocal(); @@ -891,13 +867,13 @@ void Commissioner::HandleRelayReceive(Coap::Message &aMessage, const Ip6::Messag } else { - enableJoiner = (memcmp(mJoinerIid, joinerIid.GetIid(), sizeof(mJoinerIid)) == 0); + enableJoiner = (memcmp(mJoinerIid, joinerIid, sizeof(mJoinerIid)) == 0); } VerifyOrExit(enableJoiner); - mJoinerPort = joinerPort.GetUdpPort(); - mJoinerRloc = joinerRloc.GetJoinerRouterLocator(); + mJoinerPort = joinerPort; + mJoinerRloc = joinerRloc; otLogInfoMeshCoP("Remove Relay Receive (%02x%02x%02x%02x%02x%02x%02x%02x, 0x%04x)", mJoinerIid[0], mJoinerIid[1], mJoinerIid[2], mJoinerIid[3], mJoinerIid[4], mJoinerIid[5], mJoinerIid[6], mJoinerIid[7], @@ -978,11 +954,10 @@ void Commissioner::HandleJoinerFinalize(Coap::Message &aMessage, const Ip6::Mess void Commissioner::SendJoinFinalizeResponse(const Coap::Message &aRequest, StateTlv::State aState) { - otError error = OT_ERROR_NONE; - Ip6::MessageInfo joinerMessageInfo; - MeshCoP::StateTlv stateTlv; - Coap::Message * message; - Mac::ExtAddress joinerId; + otError error = OT_ERROR_NONE; + Ip6::MessageInfo joinerMessageInfo; + Coap::Message * message; + Mac::ExtAddress joinerId; VerifyOrExit((message = NewMeshCoPMessage(Get())) != NULL, error = OT_ERROR_NO_BUFS); @@ -991,9 +966,7 @@ void Commissioner::SendJoinFinalizeResponse(const Coap::Message &aRequest, State message->SetOffset(message->GetLength()); message->SetSubType(Message::kSubTypeJoinerFinalizeResponse); - stateTlv.Init(); - stateTlv.SetState(aState); - SuccessOrExit(error = stateTlv.AppendTo(*message)); + SuccessOrExit(error = Tlv::AppendUint8Tlv(*message, Tlv::kState, static_cast(aState))); joinerMessageInfo.SetPeerAddr(Get().GetMeshLocal64()); joinerMessageInfo.GetPeerAddr().SetIid(mJoinerIid); @@ -1038,14 +1011,11 @@ otError Commissioner::SendRelayTransmit(Message &aMessage, const Ip6::MessageInf { OT_UNUSED_VARIABLE(aMessageInfo); - otError error = OT_ERROR_NONE; - JoinerUdpPortTlv udpPort; - JoinerIidTlv iid; - JoinerRouterLocatorTlv rloc; - ExtendedTlv tlv; - Coap::Message * message; - uint16_t offset; - Ip6::MessageInfo messageInfo; + otError error = OT_ERROR_NONE; + ExtendedTlv tlv; + Coap::Message * message; + uint16_t offset; + Ip6::MessageInfo messageInfo; VerifyOrExit((message = NewMeshCoPMessage(Get())) != NULL, error = OT_ERROR_NO_BUFS); @@ -1053,24 +1023,14 @@ otError Commissioner::SendRelayTransmit(Message &aMessage, const Ip6::MessageInf SuccessOrExit(error = message->AppendUriPathOptions(OT_URI_PATH_RELAY_TX)); SuccessOrExit(error = message->SetPayloadMarker()); - udpPort.Init(); - udpPort.SetUdpPort(mJoinerPort); - SuccessOrExit(error = udpPort.AppendTo(*message)); - - iid.Init(); - iid.SetIid(mJoinerIid); - SuccessOrExit(error = iid.AppendTo(*message)); - - rloc.Init(); - rloc.SetJoinerRouterLocator(mJoinerRloc); - SuccessOrExit(error = rloc.AppendTo(*message)); + SuccessOrExit(error = Tlv::AppendUint16Tlv(*message, Tlv::kJoinerUdpPort, mJoinerPort)); + SuccessOrExit(error = Tlv::AppendTlv(*message, Tlv::kJoinerIid, mJoinerIid, sizeof(mJoinerIid))); + SuccessOrExit(error = Tlv::AppendUint16Tlv(*message, Tlv::kJoinerRouterLocator, mJoinerRloc)); if (aMessage.GetSubType() == Message::kSubTypeJoinerFinalizeResponse) { - JoinerRouterKekTlv kek; - kek.Init(); - kek.SetKek(Get().GetKek()); - SuccessOrExit(error = kek.AppendTo(*message)); + SuccessOrExit(error = Tlv::AppendTlv(*message, Tlv::kJoinerRouterKek, Get().GetKek(), + KeyManager::kMaxKeyLength)); } tlv.SetType(Tlv::kJoinerDtlsEncapsulation); diff --git a/src/core/meshcop/dataset_manager.cpp b/src/core/meshcop/dataset_manager.cpp index 6053ddac7..6c06ee43e 100644 --- a/src/core/meshcop/dataset_manager.cpp +++ b/src/core/meshcop/dataset_manager.cpp @@ -439,10 +439,8 @@ otError DatasetManager::SendSetRequest(const otOperationalDataset &aDataset, con if (!hasSessionId) { - CommissionerSessionIdTlv sessionId; - sessionId.Init(); - sessionId.SetCommissionerSessionId(Get().GetSessionId()); - SuccessOrExit(error = sessionId.AppendTo(*message)); + SuccessOrExit(error = Tlv::AppendUint16Tlv(*message, Tlv::kCommissionerSessionId, + Get().GetSessionId())); } } @@ -468,10 +466,8 @@ otError DatasetManager::SendSetRequest(const otOperationalDataset &aDataset, con if (aDataset.mComponents.mIsMasterKeyPresent) { - NetworkMasterKeyTlv masterkey; - masterkey.Init(); - masterkey.SetNetworkMasterKey(static_cast(aDataset.mMasterKey)); - SuccessOrExit(error = masterkey.AppendTo(*message)); + SuccessOrExit(error = + Tlv::AppendTlv(*message, Tlv::kNetworkMasterKey, aDataset.mMasterKey.m8, sizeof(MasterKey))); } if (aDataset.mComponents.mIsNetworkNamePresent) @@ -484,34 +480,24 @@ otError DatasetManager::SendSetRequest(const otOperationalDataset &aDataset, con if (aDataset.mComponents.mIsExtendedPanIdPresent) { - ExtendedPanIdTlv extpanid; - extpanid.Init(); - extpanid.SetExtendedPanId(static_cast(aDataset.mExtendedPanId)); - SuccessOrExit(error = extpanid.AppendTo(*message)); + SuccessOrExit(error = Tlv::AppendTlv(*message, Tlv::kExtendedPanId, aDataset.mExtendedPanId.m8, + sizeof(Mac::ExtendedPanId))); } if (aDataset.mComponents.mIsMeshLocalPrefixPresent) { - MeshLocalPrefixTlv localprefix; - localprefix.Init(); - localprefix.SetMeshLocalPrefix(aDataset.mMeshLocalPrefix); - SuccessOrExit(error = localprefix.AppendTo(*message)); + SuccessOrExit(error = Tlv::AppendTlv(*message, Tlv::kMeshLocalPrefix, aDataset.mMeshLocalPrefix.m8, + sizeof(otMeshLocalPrefix))); } if (aDataset.mComponents.mIsDelayPresent) { - DelayTimerTlv delaytimer; - delaytimer.Init(); - delaytimer.SetDelayTimer(aDataset.mDelay); - SuccessOrExit(error = delaytimer.AppendTo(*message)); + SuccessOrExit(error = Tlv::AppendUint32Tlv(*message, Tlv::kDelayTimer, aDataset.mDelay)); } if (aDataset.mComponents.mIsPanIdPresent) { - PanIdTlv panid; - panid.Init(); - panid.SetPanId(aDataset.mPanId); - SuccessOrExit(error = panid.AppendTo(*message)); + SuccessOrExit(error = Tlv::AppendUint16Tlv(*message, Tlv::kPanId, aDataset.mPanId)); } if (aDataset.mComponents.mIsChannelPresent) @@ -532,10 +518,7 @@ otError DatasetManager::SendSetRequest(const otOperationalDataset &aDataset, con if (aDataset.mComponents.mIsPskcPresent) { - PskcTlv pskc; - pskc.Init(); - pskc.SetPskc(static_cast(aDataset.mPskc)); - SuccessOrExit(error = pskc.AppendTo(*message)); + SuccessOrExit(error = Tlv::AppendTlv(*message, Tlv::kPskc, aDataset.mPskc.m8, sizeof(Pskc))); } if (aDataset.mComponents.mIsSecurityPolicyPresent) diff --git a/src/core/meshcop/dataset_manager_ftd.cpp b/src/core/meshcop/dataset_manager_ftd.cpp index 0b72546b0..cafb1e66e 100644 --- a/src/core/meshcop/dataset_manager_ftd.cpp +++ b/src/core/meshcop/dataset_manager_ftd.cpp @@ -75,25 +75,22 @@ otError DatasetManager::HandleSet(Coap::Message &aMessage, const Ip6::MessageInf bool isUpdateFromCommissioner = false; bool doesAffectConnectivity = false; bool doesAffectMasterKey = false; + bool hasMasterKey = false; StateTlv::State state = StateTlv::kReject; Dataset dataset(mLocal.GetType()); - ActiveTimestampTlv activeTimestamp; - PendingTimestampTlv pendingTimestamp; - ChannelTlv channel; - CommissionerSessionIdTlv sessionId; - MeshLocalPrefixTlv meshLocalPrefix; - NetworkMasterKeyTlv masterKey; - PanIdTlv panId; + ActiveTimestampTlv activeTimestamp; + PendingTimestampTlv pendingTimestamp; + ChannelTlv channel; + uint16_t sessionId; + otMeshLocalPrefix meshLocalPrefix; + MasterKey masterKey; + uint16_t panId; activeTimestamp.SetLength(0); pendingTimestamp.SetLength(0); channel.SetLength(0); - masterKey.SetLength(0); - meshLocalPrefix.SetLength(0); - panId.SetLength(0); pendingTimestamp.SetLength(0); - sessionId.SetLength(0); VerifyOrExit(Get().GetRole() == OT_DEVICE_ROLE_LEADER); @@ -140,32 +137,32 @@ otError DatasetManager::HandleSet(Coap::Message &aMessage, const Ip6::MessageInf } // check PAN ID - if (Tlv::GetTlv(aMessage, Tlv::kPanId, sizeof(panId), panId) == OT_ERROR_NONE && panId.IsValid() && - panId.GetPanId() != Get().GetPanId()) + if (Tlv::ReadUint16Tlv(aMessage, Tlv::kPanId, panId) == OT_ERROR_NONE && panId != Get().GetPanId()) { doesAffectConnectivity = true; } // check mesh local prefix - if (Tlv::GetTlv(aMessage, Tlv::kMeshLocalPrefix, sizeof(meshLocalPrefix), meshLocalPrefix) == OT_ERROR_NONE && - meshLocalPrefix.IsValid() && - memcmp(&meshLocalPrefix.GetMeshLocalPrefix(), &Get().GetMeshLocalPrefix(), - meshLocalPrefix.GetMeshLocalPrefixLength())) + if (Tlv::ReadTlv(aMessage, Tlv::kMeshLocalPrefix, &meshLocalPrefix, sizeof(meshLocalPrefix)) == OT_ERROR_NONE && + memcmp(&meshLocalPrefix, &Get().GetMeshLocalPrefix(), sizeof(meshLocalPrefix))) { doesAffectConnectivity = true; } // check network master key - if (Tlv::GetTlv(aMessage, Tlv::kNetworkMasterKey, sizeof(masterKey), masterKey) == OT_ERROR_NONE && - masterKey.IsValid() && (masterKey.GetNetworkMasterKey() != Get().GetMasterKey())) + if (Tlv::ReadTlv(aMessage, Tlv::kNetworkMasterKey, &masterKey, sizeof(masterKey)) == OT_ERROR_NONE) { - doesAffectConnectivity = true; - doesAffectMasterKey = true; + hasMasterKey = true; + + if (masterKey != Get().GetMasterKey()) + { + doesAffectConnectivity = true; + doesAffectMasterKey = true; + } } // check active timestamp rollback - if (type == Tlv::kPendingTimestamp && - ((masterKey.GetLength() == 0) || (masterKey.GetNetworkMasterKey() == Get().GetMasterKey()))) + if (type == Tlv::kPendingTimestamp && (!hasMasterKey || (masterKey == Get().GetMasterKey()))) { // no change to master key, active timestamp must be ahead const Timestamp *localActiveTimestamp = Get().GetTimestamp(); @@ -174,7 +171,7 @@ otError DatasetManager::HandleSet(Coap::Message &aMessage, const Ip6::MessageInf } // check commissioner session id - if (Tlv::GetTlv(aMessage, Tlv::kCommissionerSessionId, sizeof(sessionId), sessionId) == OT_ERROR_NONE) + if (Tlv::ReadUint16Tlv(aMessage, Tlv::kCommissionerSessionId, sessionId) == OT_ERROR_NONE) { CommissionerSessionIdTlv *localId; @@ -183,8 +180,7 @@ otError DatasetManager::HandleSet(Coap::Message &aMessage, const Ip6::MessageInf localId = static_cast( Get().GetCommissioningDataSubTlv(Tlv::kCommissionerSessionId)); - VerifyOrExit(sessionId.IsValid() && localId != NULL && - localId->GetCommissionerSessionId() == sessionId.GetCommissionerSessionId()); + VerifyOrExit(localId != NULL && localId->GetCommissionerSessionId() == sessionId); } // verify an MGMT_ACTIVE_SET.req from a Commissioner does not affect connectivity @@ -288,16 +284,13 @@ void DatasetManager::SendSetResponse(const Coap::Message & aRequest, { otError error = OT_ERROR_NONE; Coap::Message *message; - StateTlv state; VerifyOrExit((message = NewMeshCoPMessage(Get())) != NULL, error = OT_ERROR_NO_BUFS); SuccessOrExit(error = message->SetDefaultResponseHeader(aRequest)); SuccessOrExit(error = message->SetPayloadMarker()); - state.Init(); - state.SetState(aState); - SuccessOrExit(error = state.AppendTo(*message)); + SuccessOrExit(error = Tlv::AppendUint8Tlv(*message, Tlv::kState, static_cast(aState))); SuccessOrExit(error = Get().SendMessage(*message, aMessageInfo)); diff --git a/src/core/meshcop/energy_scan_client.cpp b/src/core/meshcop/energy_scan_client.cpp index d4471e24d..907d2c850 100644 --- a/src/core/meshcop/energy_scan_client.cpp +++ b/src/core/meshcop/energy_scan_client.cpp @@ -66,14 +66,10 @@ otError EnergyScanClient::SendQuery(uint32_t aChannelM otCommissionerEnergyReportCallback aCallback, void * aContext) { - otError error = OT_ERROR_NONE; - MeshCoP::CommissionerSessionIdTlv sessionId; - MeshCoP::ChannelMaskTlv channelMask; - MeshCoP::CountTlv count; - MeshCoP::PeriodTlv period; - MeshCoP::ScanDurationTlv scanDuration; - Ip6::MessageInfo messageInfo; - Coap::Message * message = NULL; + otError error = OT_ERROR_NONE; + MeshCoP::ChannelMaskTlv channelMask; + Ip6::MessageInfo messageInfo; + Coap::Message * message = NULL; VerifyOrExit(Get().IsActive(), error = OT_ERROR_INVALID_STATE); VerifyOrExit((message = MeshCoP::NewMeshCoPMessage(Get())) != NULL, error = OT_ERROR_NO_BUFS); @@ -83,25 +79,16 @@ otError EnergyScanClient::SendQuery(uint32_t aChannelM OT_COAP_CODE_POST, OT_URI_PATH_ENERGY_SCAN)); SuccessOrExit(error = message->SetPayloadMarker()); - sessionId.Init(); - sessionId.SetCommissionerSessionId(Get().GetSessionId()); - SuccessOrExit(error = sessionId.AppendTo(*message)); + SuccessOrExit(error = Tlv::AppendUint16Tlv(*message, MeshCoP::Tlv::kCommissionerSessionId, + Get().GetSessionId())); channelMask.Init(); channelMask.SetChannelMask(aChannelMask); SuccessOrExit(error = channelMask.AppendTo(*message)); - count.Init(); - count.SetCount(aCount); - SuccessOrExit(error = count.AppendTo(*message)); - - period.Init(); - period.SetPeriod(aPeriod); - SuccessOrExit(error = period.AppendTo(*message)); - - scanDuration.Init(); - scanDuration.SetScanDuration(aScanDuration); - SuccessOrExit(error = scanDuration.AppendTo(*message)); + SuccessOrExit(error = Tlv::AppendUint8Tlv(*message, MeshCoP::Tlv::kCount, aCount)); + SuccessOrExit(error = Tlv::AppendUint16Tlv(*message, MeshCoP::Tlv::kPeriod, aPeriod)); + SuccessOrExit(error = Tlv::AppendUint16Tlv(*message, MeshCoP::Tlv::kScanDuration, aScanDuration)); messageInfo.SetSockAddr(Get().GetMeshLocal16()); messageInfo.SetPeerAddr(aAddress); diff --git a/src/core/meshcop/joiner.cpp b/src/core/meshcop/joiner.cpp index 0f623003a..fb15c1ccc 100644 --- a/src/core/meshcop/joiner.cpp +++ b/src/core/meshcop/joiner.cpp @@ -386,7 +386,6 @@ otError Joiner::PrepareJoinerFinalizeMessage(const char *aProvisioningUrl, const char *aVendorData) { otError error = OT_ERROR_NONE; - StateTlv stateTlv; VendorNameTlv vendorNameTlv; VendorModelTlv vendorModelTlv; VendorSwVersionTlv vendorSwVersionTlv; @@ -400,9 +399,7 @@ otError Joiner::PrepareJoinerFinalizeMessage(const char *aProvisioningUrl, SuccessOrExit(error = mFinalizeMessage->SetPayloadMarker()); mFinalizeMessage->SetOffset(mFinalizeMessage->GetLength()); - stateTlv.Init(); - stateTlv.SetState(MeshCoP::StateTlv::kAccept); - SuccessOrExit(error = stateTlv.AppendTo(*mFinalizeMessage)); + SuccessOrExit(error = Tlv::AppendUint8Tlv(*mFinalizeMessage, Tlv::kState, StateTlv::kAccept)); vendorNameTlv.Init(); vendorNameTlv.SetVendorName(aVendorName); @@ -491,18 +488,17 @@ void Joiner::HandleJoinerFinalizeResponse(Coap::Message & aMessage, { OT_UNUSED_VARIABLE(aMessageInfo); - StateTlv state; + uint8_t state; VerifyOrExit(mState == OT_JOINER_STATE_CONNECTED && aResult == OT_ERROR_NONE && aMessage.GetType() == OT_COAP_TYPE_ACKNOWLEDGMENT && aMessage.GetCode() == OT_COAP_CODE_CHANGED); - SuccessOrExit(Tlv::GetTlv(aMessage, Tlv::kState, sizeof(state), state)); - VerifyOrExit(state.IsValid()); + SuccessOrExit(Tlv::ReadUint8Tlv(aMessage, Tlv::kState, state)); SetState(OT_JOINER_STATE_ENTRUST); mTimer.Start(kReponseTimeout); - otLogInfoMeshCoP("Joiner received finalize response %d", static_cast(state.GetState())); + otLogInfoMeshCoP("Joiner received finalize response %d", state); #if OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE LogCertMessage("[THCI] direction=recv | type=JOIN_FIN.rsp |", aMessage); @@ -522,7 +518,6 @@ void Joiner::HandleJoinerEntrust(void *aContext, otMessage *aMessage, const otMe void Joiner::HandleJoinerEntrust(Coap::Message &aMessage, const Ip6::MessageInfo &aMessageInfo) { otError error; - NetworkMasterKeyTlv masterKey; otOperationalDataset dataset; VerifyOrExit(mState == OT_JOINER_STATE_ENTRUST && aMessage.GetType() == OT_COAP_TYPE_CONFIRMABLE && @@ -532,12 +527,9 @@ void Joiner::HandleJoinerEntrust(Coap::Message &aMessage, const Ip6::MessageInfo otLogInfoMeshCoP("Joiner received entrust"); otLogCertMeshCoP("[THCI] direction=recv | type=JOIN_ENT.ntf"); - SuccessOrExit(error = Tlv::GetTlv(aMessage, Tlv::kNetworkMasterKey, sizeof(masterKey), masterKey)); - VerifyOrExit(masterKey.IsValid(), error = OT_ERROR_PARSE); - memset(&dataset, 0, sizeof(dataset)); - dataset.mMasterKey = masterKey.GetNetworkMasterKey(); + SuccessOrExit(error = Tlv::ReadTlv(aMessage, Tlv::kNetworkMasterKey, &dataset.mMasterKey, sizeof(MasterKey))); dataset.mComponents.mIsMasterKeyPresent = true; dataset.mChannel = Get().GetPanChannel(); diff --git a/src/core/meshcop/joiner_router.cpp b/src/core/meshcop/joiner_router.cpp index eb9439480..c9f4acc55 100644 --- a/src/core/meshcop/joiner_router.cpp +++ b/src/core/meshcop/joiner_router.cpp @@ -132,15 +132,12 @@ void JoinerRouter::HandleUdpReceive(void *aContext, otMessage *aMessage, const o void JoinerRouter::HandleUdpReceive(Message &aMessage, const Ip6::MessageInfo &aMessageInfo) { - otError error; - Coap::Message * message = NULL; - Ip6::MessageInfo messageInfo; - JoinerUdpPortTlv udpPort; - JoinerIidTlv iid; - JoinerRouterLocatorTlv rloc; - ExtendedTlv tlv; - uint16_t borderAgentRloc; - uint16_t offset; + otError error; + Coap::Message * message = NULL; + Ip6::MessageInfo messageInfo; + ExtendedTlv tlv; + uint16_t borderAgentRloc; + uint16_t offset; otLogInfoMeshCoP("JoinerRouter::HandleUdpReceive"); @@ -151,17 +148,10 @@ void JoinerRouter::HandleUdpReceive(Message &aMessage, const Ip6::MessageInfo &a SuccessOrExit(error = message->Init(OT_COAP_TYPE_NON_CONFIRMABLE, OT_COAP_CODE_POST, OT_URI_PATH_RELAY_RX)); SuccessOrExit(error = message->SetPayloadMarker()); - udpPort.Init(); - udpPort.SetUdpPort(aMessageInfo.GetPeerPort()); - SuccessOrExit(error = udpPort.AppendTo(*message)); - - iid.Init(); - iid.SetIid(aMessageInfo.GetPeerAddr().mFields.m8 + 8); - SuccessOrExit(error = iid.AppendTo(*message)); - - rloc.Init(); - rloc.SetJoinerRouterLocator(Get().GetRloc16()); - SuccessOrExit(error = rloc.AppendTo(*message)); + SuccessOrExit(error = Tlv::AppendUint16Tlv(*message, Tlv::kJoinerUdpPort, aMessageInfo.GetPeerPort())); + SuccessOrExit(error = Tlv::AppendTlv(*message, Tlv::kJoinerIid, aMessageInfo.GetPeerAddr().mFields.m8 + 8, + Ip6::Address::kInterfaceIdentifierSize)); + SuccessOrExit(error = Tlv::AppendUint16Tlv(*message, Tlv::kJoinerRouterLocator, Get().GetRloc16())); tlv.SetType(Tlv::kJoinerDtlsEncapsulation); tlv.SetLength(aMessage.GetLength() - aMessage.GetOffset()); @@ -197,26 +187,23 @@ void JoinerRouter::HandleRelayTransmit(Coap::Message &aMessage, const Ip6::Messa { OT_UNUSED_VARIABLE(aMessageInfo); - otError error; - JoinerUdpPortTlv joinerPort; - JoinerIidTlv joinerIid; - JoinerRouterKekTlv kek; - uint16_t offset; - uint16_t length; - Message * message = NULL; - otMessageSettings settings = {false, static_cast(kMeshCoPMessagePriority)}; - Ip6::MessageInfo messageInfo; + otError error; + uint16_t joinerPort; + uint8_t joinerIid[Ip6::Address::kInterfaceIdentifierSize]; + uint8_t kek[KeyManager::kMaxKeyLength]; + uint16_t offset; + uint16_t length; + Message * message = NULL; + otMessageSettings settings = {false, static_cast(kMeshCoPMessagePriority)}; + Ip6::MessageInfo messageInfo; VerifyOrExit(aMessage.GetType() == OT_COAP_TYPE_NON_CONFIRMABLE && aMessage.GetCode() == OT_COAP_CODE_POST, error = OT_ERROR_DROP); otLogInfoMeshCoP("Received relay transmit"); - SuccessOrExit(error = Tlv::GetTlv(aMessage, Tlv::kJoinerUdpPort, sizeof(joinerPort), joinerPort)); - VerifyOrExit(joinerPort.IsValid(), error = OT_ERROR_PARSE); - - SuccessOrExit(error = Tlv::GetTlv(aMessage, Tlv::kJoinerIid, sizeof(joinerIid), joinerIid)); - VerifyOrExit(joinerIid.IsValid(), error = OT_ERROR_PARSE); + SuccessOrExit(error = Tlv::ReadUint16Tlv(aMessage, Tlv::kJoinerUdpPort, joinerPort)); + SuccessOrExit(error = Tlv::ReadTlv(aMessage, Tlv::kJoinerIid, joinerIid, sizeof(joinerIid))); SuccessOrExit(error = Tlv::GetValueOffset(aMessage, Tlv::kJoinerDtlsEncapsulation, offset, length)); @@ -226,12 +213,12 @@ void JoinerRouter::HandleRelayTransmit(Coap::Message &aMessage, const Ip6::Messa aMessage.CopyTo(offset, 0, length, *message); messageInfo.mPeerAddr.mFields.m16[0] = HostSwap16(0xfe80); - memcpy(messageInfo.mPeerAddr.mFields.m8 + 8, joinerIid.GetIid(), 8); - messageInfo.SetPeerPort(joinerPort.GetUdpPort()); + memcpy(messageInfo.mPeerAddr.mFields.m8 + 8, joinerIid, 8); + messageInfo.SetPeerPort(joinerPort); SuccessOrExit(error = mSocket.SendTo(*message, messageInfo)); - if (Tlv::GetTlv(aMessage, Tlv::kJoinerRouterKek, sizeof(kek), kek) == OT_ERROR_NONE) + if (Tlv::ReadTlv(aMessage, Tlv::kJoinerRouterKek, kek, sizeof(kek)) == OT_ERROR_NONE) { otLogInfoMeshCoP("Received kek"); @@ -245,19 +232,15 @@ exit: } } -otError JoinerRouter::DelaySendingJoinerEntrust(const Ip6::MessageInfo &aMessageInfo, const JoinerRouterKekTlv &aKek) +otError JoinerRouter::DelaySendingJoinerEntrust(const Ip6::MessageInfo &aMessageInfo, const uint8_t *aKek) { otError error; Coap::Message * message = NULL; Ip6::MessageInfo messageInfo; Dataset dataset(MeshCoP::Tlv::kActiveTimestamp); - NetworkMasterKeyTlv masterKey; - MeshLocalPrefixTlv meshLocalPrefix; - ExtendedPanIdTlv extendedPanId; - NetworkNameTlv networkName; - NetworkKeySequenceTlv networkKeySequence; - const Tlv * tlv; + NetworkNameTlv networkName; + const Tlv * tlv; DelayedJoinEntHeader delayedMessage; @@ -268,17 +251,14 @@ otError JoinerRouter::DelaySendingJoinerEntrust(const Ip6::MessageInfo &aMessage SuccessOrExit(error = message->SetPayloadMarker()); message->SetSubType(Message::kSubTypeJoinerEntrust); - masterKey.Init(); - masterKey.SetNetworkMasterKey(Get().GetMasterKey()); - SuccessOrExit(error = masterKey.AppendTo(*message)); + SuccessOrExit(error = Tlv::AppendTlv(*message, Tlv::kNetworkMasterKey, Get().GetMasterKey().m8, + sizeof(MasterKey))); - meshLocalPrefix.Init(); - meshLocalPrefix.SetMeshLocalPrefix(Get().GetMeshLocalPrefix()); - SuccessOrExit(error = meshLocalPrefix.AppendTo(*message)); + SuccessOrExit(error = Tlv::AppendTlv(*message, Tlv::kMeshLocalPrefix, Get().GetMeshLocalPrefix().m8, + sizeof(otMeshLocalPrefix))); - extendedPanId.Init(); - extendedPanId.SetExtendedPanId(Get().GetExtendedPanId()); - SuccessOrExit(error = extendedPanId.AppendTo(*message)); + SuccessOrExit(error = Tlv::AppendTlv(*message, Tlv::kExtendedPanId, Get().GetExtendedPanId().m8, + sizeof(Mac::ExtendedPanId))); networkName.Init(); networkName.SetNetworkName(Get().GetNetworkName().GetAsData()); @@ -330,14 +310,13 @@ otError JoinerRouter::DelaySendingJoinerEntrust(const Ip6::MessageInfo &aMessage SuccessOrExit(error = securityPolicy.AppendTo(*message)); } - networkKeySequence.Init(); - networkKeySequence.SetNetworkKeySequence(Get().GetCurrentKeySequence()); - SuccessOrExit(error = networkKeySequence.AppendTo(*message)); + SuccessOrExit( + error = Tlv::AppendUint32Tlv(*message, Tlv::kNetworkKeySequence, Get().GetCurrentKeySequence())); messageInfo = aMessageInfo; messageInfo.SetPeerPort(kCoapUdpPort); - delayedMessage.Init(TimerMilli::GetNow() + kDelayJoinEnt, messageInfo, aKek.GetKek()); + delayedMessage.Init(TimerMilli::GetNow() + kDelayJoinEnt, messageInfo, aKek); SuccessOrExit(error = delayedMessage.AppendTo(*message)); mDelayedJoinEnts.Enqueue(*message); diff --git a/src/core/meshcop/joiner_router.hpp b/src/core/meshcop/joiner_router.hpp index c562c4255..2680f3ba8 100644 --- a/src/core/meshcop/joiner_router.hpp +++ b/src/core/meshcop/joiner_router.hpp @@ -102,7 +102,7 @@ private: static void HandleTimer(Timer &aTimer); void HandleTimer(void); - otError DelaySendingJoinerEntrust(const Ip6::MessageInfo &aMessageInfo, const JoinerRouterKekTlv &aKek); + otError DelaySendingJoinerEntrust(const Ip6::MessageInfo &aMessageInfo, const uint8_t *aKek); void SendDelayedJoinerEntrust(void); otError SendJoinerEntrust(Coap::Message &aMessage, const Ip6::MessageInfo &aMessageInfo); diff --git a/src/core/meshcop/leader.cpp b/src/core/meshcop/leader.cpp index 29996ad58..8d341c9b8 100644 --- a/src/core/meshcop/leader.cpp +++ b/src/core/meshcop/leader.cpp @@ -123,19 +123,15 @@ otError Leader::SendPetitionResponse(const Coap::Message & aRequest, const Ip6::MessageInfo &aMessageInfo, StateTlv::State aState) { - otError error = OT_ERROR_NONE; - StateTlv state; - CommissionerSessionIdTlv sessionId; - Coap::Message * message; + otError error = OT_ERROR_NONE; + Coap::Message *message; VerifyOrExit((message = NewMeshCoPMessage(Get())) != NULL, error = OT_ERROR_NO_BUFS); SuccessOrExit(error = message->SetDefaultResponseHeader(aRequest)); SuccessOrExit(error = message->SetPayloadMarker()); - state.Init(); - state.SetState(aState); - SuccessOrExit(error = state.AppendTo(*message)); + SuccessOrExit(error = Tlv::AppendUint8Tlv(*message, Tlv::kState, static_cast(aState))); if (mTimer.IsRunning()) { @@ -144,9 +140,7 @@ otError Leader::SendPetitionResponse(const Coap::Message & aRequest, if (aState == StateTlv::kAccept) { - sessionId.Init(); - sessionId.SetCommissionerSessionId(mSessionId); - SuccessOrExit(error = sessionId.AppendTo(*message)); + SuccessOrExit(error = Tlv::AppendUint16Tlv(*message, Tlv::kCommissionerSessionId, mSessionId)); } SuccessOrExit(error = Get().SendMessage(*message, aMessageInfo)); @@ -171,27 +165,25 @@ void Leader::HandleKeepAlive(void *aContext, otMessage *aMessage, const otMessag void Leader::HandleKeepAlive(Coap::Message &aMessage, const Ip6::MessageInfo &aMessageInfo) { - StateTlv state; - CommissionerSessionIdTlv sessionId; - BorderAgentLocatorTlv * borderAgentLocator; - StateTlv::State responseState; + uint8_t state; + uint16_t sessionId; + BorderAgentLocatorTlv *borderAgentLocator; + StateTlv::State responseState; otLogInfoMeshCoP("received keep alive"); - SuccessOrExit(Tlv::GetTlv(aMessage, Tlv::kState, sizeof(state), state)); - VerifyOrExit(state.IsValid()); + SuccessOrExit(Tlv::ReadUint8Tlv(aMessage, Tlv::kState, state)); - SuccessOrExit(Tlv::GetTlv(aMessage, Tlv::kCommissionerSessionId, sizeof(sessionId), sessionId)); - VerifyOrExit(sessionId.IsValid()); + SuccessOrExit(Tlv::ReadUint16Tlv(aMessage, Tlv::kCommissionerSessionId, sessionId)); borderAgentLocator = static_cast( Get().GetCommissioningDataSubTlv(Tlv::kBorderAgentLocator)); - if ((borderAgentLocator == NULL) || (sessionId.GetCommissionerSessionId() != mSessionId)) + if ((borderAgentLocator == NULL) || (sessionId != mSessionId)) { responseState = StateTlv::kReject; } - else if (state.GetState() != StateTlv::kAccept) + else if (state != StateTlv::kAccept) { responseState = StateTlv::kReject; ResignCommissioner(); @@ -221,7 +213,6 @@ otError Leader::SendKeepAliveResponse(const Coap::Message & aRequest, StateTlv::State aState) { otError error = OT_ERROR_NONE; - StateTlv state; Coap::Message *message; VerifyOrExit((message = NewMeshCoPMessage(Get())) != NULL, error = OT_ERROR_NO_BUFS); @@ -229,9 +220,7 @@ otError Leader::SendKeepAliveResponse(const Coap::Message & aRequest, SuccessOrExit(error = message->SetDefaultResponseHeader(aRequest)); SuccessOrExit(error = message->SetPayloadMarker()); - state.Init(); - state.SetState(aState); - SuccessOrExit(error = state.AppendTo(*message)); + SuccessOrExit(error = Tlv::AppendUint8Tlv(*message, Tlv::kState, static_cast(aState))); SuccessOrExit(error = Get().SendMessage(*message, aMessageInfo)); diff --git a/src/core/meshcop/meshcop_tlvs.hpp b/src/core/meshcop/meshcop_tlvs.hpp index eb7c53a12..61ce5d966 100644 --- a/src/core/meshcop/meshcop_tlvs.hpp +++ b/src/core/meshcop/meshcop_tlvs.hpp @@ -1007,53 +1007,6 @@ public: bool IsValid(void) const { return GetLength() >= sizeof(*this) - sizeof(Tlv); } } OT_TOOL_PACKED_END; -/** - * This class implements Commissioner UDP Port TLV generation and parsing. - * - */ -OT_TOOL_PACKED_BEGIN -class CommissionerUdpPortTlv : public Tlv -{ -public: - /** - * This method initializes the TLV. - * - */ - void Init(void) - { - SetType(kCommissionerUdpPort); - SetLength(sizeof(*this) - sizeof(Tlv)); - } - - /** - * This method indicates whether or not the TLV appears to be well-formed. - * - * @retval TRUE If the TLV appears to be well-formed. - * @retval FALSE If the TLV does not appear to be well-formed. - * - */ - bool IsValid(void) const { return GetLength() >= sizeof(*this) - sizeof(Tlv); } - - /** - * This method returns the UDP Port value. - * - * @returns The UDP Port value. - * - */ - uint16_t GetUdpPort(void) const { return HostSwap16(mUdpPort); } - - /** - * This method sets the UDP Port value. - * - * @param[in] aUdpPort The UDP Port value. - * - */ - void SetUdpPort(uint16_t aUdpPort) { mUdpPort = HostSwap16(aUdpPort); } - -private: - uint16_t mUdpPort; -} OT_TOOL_PACKED_END; - /** * This class implements State TLV generation and parsing. * @@ -1087,9 +1040,9 @@ public: */ enum State { - kReject = -1, ///< Reject - kPending = 0, ///< Pending - kAccept = 1, ///< Accept + kReject = 0xff, ///< Reject (-1) + kPending = 0, ///< Pending + kAccept = 1, ///< Accept }; /** @@ -1159,147 +1112,6 @@ private: uint16_t mUdpPort; } OT_TOOL_PACKED_END; -/** - * This class implements Joiner IID TLV generation and parsing. - * - */ -OT_TOOL_PACKED_BEGIN -class JoinerIidTlv : public Tlv -{ -public: - /** - * This method initializes the TLV. - * - */ - void Init(void) - { - SetType(kJoinerIid); - SetLength(sizeof(*this) - sizeof(Tlv)); - } - - /** - * This method indicates whether or not the TLV appears to be well-formed. - * - * @retval TRUE If the TLV appears to be well-formed. - * @retval FALSE If the TLV does not appear to be well-formed. - * - */ - bool IsValid(void) const { return GetLength() >= sizeof(*this) - sizeof(Tlv); } - - /** - * This method returns a pointer to the Joiner IID. - * - * @returns A pointer to the Joiner IID. - * - */ - const uint8_t *GetIid(void) const { return mIid; } - - /** - * This method sets the Joiner IID. - * - * @param[in] aIid A pointer to the Joiner IID. - * - */ - void SetIid(const uint8_t *aIid) { memcpy(mIid, aIid, sizeof(mIid)); } - -private: - uint8_t mIid[8]; -} OT_TOOL_PACKED_END; - -/** - * This class implements Joiner Router Locator TLV generation and parsing. - * - */ -OT_TOOL_PACKED_BEGIN -class JoinerRouterLocatorTlv : public Tlv -{ -public: - /** - * This method initializes the TLV. - * - */ - void Init(void) - { - SetType(kJoinerRouterLocator); - SetLength(sizeof(*this) - sizeof(Tlv)); - } - - /** - * This method indicates whether or not the TLV appears to be well-formed. - * - * @retval TRUE If the TLV appears to be well-formed. - * @retval FALSE If the TLV does not appear to be well-formed. - * - */ - bool IsValid(void) const { return GetLength() >= sizeof(*this) - sizeof(Tlv); } - - /** - * This method returns the Joiner Router Locator value. - * - * @returns The Joiner Router Locator value. - * - */ - uint16_t GetJoinerRouterLocator(void) const { return HostSwap16(mLocator); } - - /** - * This method sets the Joiner Router Locator value. - * - * @param[in] aJoinerRouterLocator The Joiner Router Locator value. - * - */ - void SetJoinerRouterLocator(uint16_t aLocator) { mLocator = HostSwap16(aLocator); } - -private: - uint16_t mLocator; -} OT_TOOL_PACKED_END; - -/** - * This class implements Joiner Router KEK TLV generation and parsing. - * - */ -OT_TOOL_PACKED_BEGIN -class JoinerRouterKekTlv : public Tlv -{ -public: - /** - * This method initializes the TLV. - * - */ - void Init(void) - { - SetType(kJoinerRouterKek); - SetLength(sizeof(*this) - sizeof(Tlv)); - } - - /** - * This method indicates whether or not the TLV appears to be well-formed. - * - * @retval TRUE If the TLV appears to be well-formed. - * @retval FALSE If the TLV does not appear to be well-formed. - * - */ - bool IsValid(void) const { return GetLength() >= sizeof(*this) - sizeof(Tlv); } - - /** - * This method returns a pointer to the Joiner Router KEK. - * - * @returns A pointer to the Joiner Router KEK. - * - */ - const uint8_t *GetKek(void) const { return mKek; } - - /** - * This method sets the Joiner Router KEK. - * - * @param[in] aIid A pointer to the Joiner Router KEK. - * - */ - void SetKek(const uint8_t *aKek) { memcpy(mKek, aKek, sizeof(mKek)); } - -private: - uint8_t mKek[16]; -} OT_TOOL_PACKED_END; - /** * This class implements Pending Timestamp TLV generation and parsing. * @@ -1652,147 +1464,6 @@ private: ChannelMaskEntry mEntries[kNumMaskEntries]; } OT_TOOL_PACKED_END; -/** - * This class implements Count TLV generation and parsing. - * - */ -OT_TOOL_PACKED_BEGIN -class CountTlv : public Tlv -{ -public: - /** - * This method initializes the TLV. - * - */ - void Init(void) - { - SetType(kCount); - SetLength(sizeof(*this) - sizeof(Tlv)); - } - - /** - * This method indicates whether or not the TLV appears to be well-formed. - * - * @retval TRUE If the TLV appears to be well-formed. - * @retval FALSE If the TLV does not appear to be well-formed. - * - */ - bool IsValid(void) const { return GetLength() >= sizeof(*this) - sizeof(Tlv); } - - /** - * This method returns the Count value. - * - * @returns The Count value. - * - */ - uint8_t GetCount(void) const { return mCount; } - - /** - * This method sets the Count value. - * - * @param[in] aCount The Count value. - * - */ - void SetCount(uint8_t aCount) { mCount = aCount; } - -private: - uint8_t mCount; -} OT_TOOL_PACKED_END; - -/** - * This class implements Period TLV generation and parsing. - * - */ -OT_TOOL_PACKED_BEGIN -class PeriodTlv : public Tlv -{ -public: - /** - * This method initializes the TLV. - * - */ - void Init(void) - { - SetType(kPeriod); - SetLength(sizeof(*this) - sizeof(Tlv)); - } - - /** - * This method indicates whether or not the TLV appears to be well-formed. - * - * @retval TRUE If the TLV appears to be well-formed. - * @retval FALSE If the TLV does not appear to be well-formed. - * - */ - bool IsValid(void) const { return GetLength() >= sizeof(*this) - sizeof(Tlv); } - - /** - * This method returns the Period value. - * - * @returns The Period value. - * - */ - uint16_t GetPeriod(void) const { return HostSwap16(mPeriod); } - - /** - * This method sets the Period value. - * - * @param[in] aPeriod The Period value. - * - */ - void SetPeriod(uint16_t aPeriod) { mPeriod = HostSwap16(aPeriod); } - -private: - uint16_t mPeriod; -} OT_TOOL_PACKED_END; - -/** - * This class implements Scan Duration TLV generation and parsing. - * - */ -OT_TOOL_PACKED_BEGIN -class ScanDurationTlv : public Tlv -{ -public: - /** - * This method initializes the TLV. - * - */ - void Init(void) - { - SetType(kScanDuration); - SetLength(sizeof(*this) - sizeof(Tlv)); - } - - /** - * This method indicates whether or not the TLV appears to be well-formed. - * - * @retval TRUE If the TLV appears to be well-formed. - * @retval FALSE If the TLV does not appear to be well-formed. - * - */ - bool IsValid(void) const { return GetLength() >= sizeof(*this) - sizeof(Tlv); } - - /** - * This method returns the Scan Duration value. - * - * @returns The Scan Duration value. - * - */ - uint16_t GetScanDuration(void) const { return HostSwap16(mScanDuration); } - - /** - * This method sets the Scan Duration value. - * - * @param[in] aScanDuration The Scan Duration value. - * - */ - void SetScanDuration(uint16_t aScanDuration) { mScanDuration = HostSwap16(aScanDuration); } - -private: - uint16_t mScanDuration; -} OT_TOOL_PACKED_END; - /** * This class implements Energy List TLV generation and parsing. * @@ -2302,44 +1973,6 @@ private: uint8_t mMinorMajor; } OT_TOOL_PACKED_END; -/** - * This class implements IPv6 Address TLV generation and parsing. - * - */ -OT_TOOL_PACKED_BEGIN -class IPv6AddressTlv : public Tlv -{ -public: - /** - * This method initializes the TLV. - * - */ - void Init(void) - { - SetType(kIPv6Address); - SetLength(sizeof(mAddress)); - } - - /** - * This method returns the IPv6 Address. - * - * @returns A reference to the IPv6 Address. - * - */ - const Ip6::Address &GetAddress(void) const { return mAddress; } - - /** - * This method sets the IPv6 Address. - * - * @param[in] aAddress A reference to the IPv6 Address. - * - */ - void SetAddress(const Ip6::Address &aAddress) { mAddress = aAddress; } - -private: - Ip6::Address mAddress; -} OT_TOOL_PACKED_END; - /** * This class implements UDP Encapsulation TLV generation and parsing. * diff --git a/src/core/meshcop/panid_query_client.cpp b/src/core/meshcop/panid_query_client.cpp index da76a4257..30dfc274a 100644 --- a/src/core/meshcop/panid_query_client.cpp +++ b/src/core/meshcop/panid_query_client.cpp @@ -63,12 +63,10 @@ otError PanIdQueryClient::SendQuery(uint16_t aPanId, otCommissionerPanIdConflictCallback aCallback, void * aContext) { - otError error = OT_ERROR_NONE; - MeshCoP::CommissionerSessionIdTlv sessionId; - MeshCoP::ChannelMaskTlv channelMask; - MeshCoP::PanIdTlv panId; - Ip6::MessageInfo messageInfo; - Coap::Message * message = NULL; + otError error = OT_ERROR_NONE; + MeshCoP::ChannelMaskTlv channelMask; + Ip6::MessageInfo messageInfo; + Coap::Message * message = NULL; VerifyOrExit(Get().IsActive(), error = OT_ERROR_INVALID_STATE); VerifyOrExit((message = MeshCoP::NewMeshCoPMessage(Get())) != NULL, error = OT_ERROR_NO_BUFS); @@ -78,17 +76,14 @@ otError PanIdQueryClient::SendQuery(uint16_t aPanId, OT_COAP_CODE_POST, OT_URI_PATH_PANID_QUERY)); SuccessOrExit(error = message->SetPayloadMarker()); - sessionId.Init(); - sessionId.SetCommissionerSessionId(Get().GetSessionId()); - SuccessOrExit(error = sessionId.AppendTo(*message)); + SuccessOrExit(error = Tlv::AppendUint16Tlv(*message, MeshCoP::Tlv::kCommissionerSessionId, + Get().GetSessionId())); channelMask.Init(); channelMask.SetChannelMask(aChannelMask); SuccessOrExit(error = channelMask.AppendTo(*message)); - panId.Init(); - panId.SetPanId(aPanId); - SuccessOrExit(error = panId.AppendTo(*message)); + SuccessOrExit(error = Tlv::AppendUint16Tlv(*message, MeshCoP::Tlv::kPanId, aPanId)); messageInfo.SetSockAddr(Get().GetMeshLocal16()); messageInfo.SetPeerAddr(aAddress); @@ -118,22 +113,21 @@ void PanIdQueryClient::HandleConflict(void *aContext, otMessage *aMessage, const void PanIdQueryClient::HandleConflict(Coap::Message &aMessage, const Ip6::MessageInfo &aMessageInfo) { - MeshCoP::PanIdTlv panId; - Ip6::MessageInfo responseInfo(aMessageInfo); - uint32_t mask; + uint16_t panId; + Ip6::MessageInfo responseInfo(aMessageInfo); + uint32_t mask; VerifyOrExit(aMessage.GetType() == OT_COAP_TYPE_CONFIRMABLE && aMessage.GetCode() == OT_COAP_CODE_POST); otLogInfoMeshCoP("received panid conflict"); - SuccessOrExit(MeshCoP::Tlv::GetTlv(aMessage, MeshCoP::Tlv::kPanId, sizeof(panId), panId)); - VerifyOrExit(panId.IsValid()); + SuccessOrExit(Tlv::ReadUint16Tlv(aMessage, MeshCoP::Tlv::kPanId, panId)); VerifyOrExit((mask = MeshCoP::ChannelMaskTlv::GetChannelMask(aMessage)) != 0); if (mCallback != NULL) { - mCallback(panId.GetPanId(), mask, mContext); + mCallback(panId, mask, mContext); } SuccessOrExit(Get().SendEmptyAck(aMessage, responseInfo)); diff --git a/src/core/thread/announce_begin_server.cpp b/src/core/thread/announce_begin_server.cpp index 1921614e4..52f176a31 100644 --- a/src/core/thread/announce_begin_server.cpp +++ b/src/core/thread/announce_begin_server.cpp @@ -72,21 +72,18 @@ void AnnounceBeginServer::HandleRequest(void *aContext, otMessage *aMessage, con void AnnounceBeginServer::HandleRequest(Coap::Message &aMessage, const Ip6::MessageInfo &aMessageInfo) { - uint32_t mask; - MeshCoP::CountTlv count; - MeshCoP::PeriodTlv period; - Ip6::MessageInfo responseInfo(aMessageInfo); + uint32_t mask; + uint8_t count; + uint16_t period; + Ip6::MessageInfo responseInfo(aMessageInfo); VerifyOrExit(aMessage.GetCode() == OT_COAP_CODE_POST); VerifyOrExit((mask = MeshCoP::ChannelMaskTlv::GetChannelMask(aMessage)) != 0); - SuccessOrExit(MeshCoP::Tlv::GetTlv(aMessage, MeshCoP::Tlv::kCount, sizeof(count), count)); - VerifyOrExit(count.IsValid()); + SuccessOrExit(Tlv::ReadUint8Tlv(aMessage, MeshCoP::Tlv::kCount, count)); + SuccessOrExit(Tlv::ReadUint16Tlv(aMessage, MeshCoP::Tlv::kPeriod, period)); - SuccessOrExit(MeshCoP::Tlv::GetTlv(aMessage, MeshCoP::Tlv::kPeriod, sizeof(period), period)); - VerifyOrExit(period.IsValid()); - - SendAnnounce(mask, count.GetCount(), period.GetPeriod()); + SendAnnounce(mask, count, period); if (aMessage.IsConfirmable() && !aMessageInfo.GetSockAddr().IsMulticast()) { diff --git a/src/core/thread/energy_scan_server.cpp b/src/core/thread/energy_scan_server.cpp index 0f5e44aa4..46fe46bb9 100644 --- a/src/core/thread/energy_scan_server.cpp +++ b/src/core/thread/energy_scan_server.cpp @@ -70,30 +70,25 @@ void EnergyScanServer::HandleRequest(void *aContext, otMessage *aMessage, const void EnergyScanServer::HandleRequest(Coap::Message &aMessage, const Ip6::MessageInfo &aMessageInfo) { - MeshCoP::CountTlv count; - MeshCoP::PeriodTlv period; - MeshCoP::ScanDurationTlv scanDuration; - Ip6::MessageInfo responseInfo(aMessageInfo); - uint32_t mask; + uint8_t count; + uint16_t period; + uint16_t scanDuration; + Ip6::MessageInfo responseInfo(aMessageInfo); + uint32_t mask; VerifyOrExit(aMessage.GetCode() == OT_COAP_CODE_POST); - SuccessOrExit(MeshCoP::Tlv::GetTlv(aMessage, MeshCoP::Tlv::kCount, sizeof(count), count)); - VerifyOrExit(count.IsValid()); - - SuccessOrExit(MeshCoP::Tlv::GetTlv(aMessage, MeshCoP::Tlv::kPeriod, sizeof(period), period)); - VerifyOrExit(period.IsValid()); - - SuccessOrExit(MeshCoP::Tlv::GetTlv(aMessage, MeshCoP::Tlv::kScanDuration, sizeof(scanDuration), scanDuration)); - VerifyOrExit(scanDuration.IsValid()); + SuccessOrExit(Tlv::ReadUint8Tlv(aMessage, MeshCoP::Tlv::kCount, count)); + SuccessOrExit(Tlv::ReadUint16Tlv(aMessage, MeshCoP::Tlv::kPeriod, period)); + SuccessOrExit(Tlv::ReadUint16Tlv(aMessage, MeshCoP::Tlv::kScanDuration, scanDuration)); VerifyOrExit((mask = MeshCoP::ChannelMaskTlv::GetChannelMask(aMessage)) != 0); mChannelMask = mask; mChannelMaskCurrent = mChannelMask; - mCount = count.GetCount(); - mPeriod = period.GetPeriod(); - mScanDuration = scanDuration.GetScanDuration(); + mCount = count; + mPeriod = period; + mScanDuration = scanDuration; mScanResultsLength = 0; mActive = true; mTimer.Start(kScanDelay); diff --git a/src/core/thread/mle_router.cpp b/src/core/thread/mle_router.cpp index 1e023d4e1..fc77959f5 100644 --- a/src/core/thread/mle_router.cpp +++ b/src/core/thread/mle_router.cpp @@ -2816,9 +2816,7 @@ otError MleRouter::SendDiscoveryResponse(const Ip6::Address &aDestination, uint1 uint16_t startOffset; Tlv tlv; MeshCoP::DiscoveryResponseTlv discoveryResponse; - MeshCoP::ExtendedPanIdTlv extPanId; MeshCoP::NetworkNameTlv networkName; - MeshCoP::JoinerUdpPortTlv joinerUdpPort; MeshCoP::Tlv * steeringData; uint16_t delay; @@ -2839,11 +2837,8 @@ otError MleRouter::SendDiscoveryResponse(const Ip6::Address &aDestination, uint1 if (Get().GetSecurityPolicyFlags() & OT_SECURITY_POLICY_NATIVE_COMMISSIONING) { - MeshCoP::CommissionerUdpPortTlv commissionerUdpPort; - - commissionerUdpPort.Init(); - commissionerUdpPort.SetUdpPort(MeshCoP::kBorderAgentUdpPort); - SuccessOrExit(error = commissionerUdpPort.AppendTo(*message)); + SuccessOrExit( + error = Tlv::AppendUint16Tlv(*message, MeshCoP::Tlv::kCommissionerUdpPort, MeshCoP::kBorderAgentUdpPort)); discoveryResponse.SetNativeCommissioner(true); } @@ -2855,9 +2850,8 @@ otError MleRouter::SendDiscoveryResponse(const Ip6::Address &aDestination, uint1 SuccessOrExit(error = discoveryResponse.AppendTo(*message)); // Extended PAN ID TLV - extPanId.Init(); - extPanId.SetExtendedPanId(Get().GetExtendedPanId()); - SuccessOrExit(error = extPanId.AppendTo(*message)); + SuccessOrExit(error = Tlv::AppendTlv(*message, MeshCoP::Tlv::kExtendedPanId, Get().GetExtendedPanId().m8, + sizeof(Mac::ExtendedPanId))); // Network Name TLV networkName.Init(); @@ -2885,9 +2879,8 @@ otError MleRouter::SendDiscoveryResponse(const Ip6::Address &aDestination, uint1 } // Joiner UDP Port TLV - joinerUdpPort.Init(); - joinerUdpPort.SetUdpPort(Get().GetJoinerUdpPort()); - SuccessOrExit(error = joinerUdpPort.AppendTo(*message)); + SuccessOrExit(error = Tlv::AppendUint16Tlv(*message, MeshCoP::Tlv::kJoinerUdpPort, + Get().GetJoinerUdpPort())); tlv.SetLength(static_cast(message->GetLength() - startOffset)); message->Write(startOffset - sizeof(tlv), sizeof(tlv), &tlv); diff --git a/src/core/thread/network_data_leader_ftd.cpp b/src/core/thread/network_data_leader_ftd.cpp index f0eeb47cf..7c6f8423f 100644 --- a/src/core/thread/network_data_leader_ftd.cpp +++ b/src/core/thread/network_data_leader_ftd.cpp @@ -377,18 +377,15 @@ void Leader::SendCommissioningSetResponse(const Coap::Message & aRequest, const Ip6::MessageInfo & aMessageInfo, MeshCoP::StateTlv::State aState) { - otError error = OT_ERROR_NONE; - Coap::Message * message; - MeshCoP::StateTlv state; + otError error = OT_ERROR_NONE; + Coap::Message *message; VerifyOrExit((message = MeshCoP::NewMeshCoPMessage(Get())) != NULL, error = OT_ERROR_NO_BUFS); SuccessOrExit(error = message->SetDefaultResponseHeader(aRequest)); SuccessOrExit(error = message->SetPayloadMarker()); - state.Init(); - state.SetState(aState); - SuccessOrExit(error = state.AppendTo(*message)); + SuccessOrExit(error = Tlv::AppendUint8Tlv(*message, MeshCoP::Tlv::kState, static_cast(aState))); SuccessOrExit(error = Get().SendMessage(*message, aMessageInfo)); diff --git a/src/core/thread/panid_query_server.cpp b/src/core/thread/panid_query_server.cpp index 15165ecab..7870da332 100644 --- a/src/core/thread/panid_query_server.cpp +++ b/src/core/thread/panid_query_server.cpp @@ -64,19 +64,18 @@ void PanIdQueryServer::HandleQuery(void *aContext, otMessage *aMessage, const ot void PanIdQueryServer::HandleQuery(Coap::Message &aMessage, const Ip6::MessageInfo &aMessageInfo) { - MeshCoP::PanIdTlv panId; - Ip6::MessageInfo responseInfo(aMessageInfo); - uint32_t mask; + uint16_t panId; + Ip6::MessageInfo responseInfo(aMessageInfo); + uint32_t mask; VerifyOrExit(aMessage.GetCode() == OT_COAP_CODE_POST); VerifyOrExit((mask = MeshCoP::ChannelMaskTlv::GetChannelMask(aMessage)) != 0); - SuccessOrExit(MeshCoP::Tlv::GetTlv(aMessage, MeshCoP::Tlv::kPanId, sizeof(panId), panId)); - VerifyOrExit(panId.IsValid()); + SuccessOrExit(Tlv::ReadUint16Tlv(aMessage, MeshCoP::Tlv::kPanId, panId)); mChannelMask = mask; mCommissioner = aMessageInfo.GetPeerAddr(); - mPanId = panId.GetPanId(); + mPanId = panId; mTimer.Start(kScanDelay); if (aMessage.IsConfirmable() && !aMessageInfo.GetSockAddr().IsMulticast()) @@ -113,7 +112,6 @@ otError PanIdQueryServer::SendConflict(void) { otError error = OT_ERROR_NONE; MeshCoP::ChannelMaskTlv channelMask; - MeshCoP::PanIdTlv panId; Ip6::MessageInfo messageInfo; Coap::Message * message; @@ -126,9 +124,7 @@ otError PanIdQueryServer::SendConflict(void) channelMask.SetChannelMask(mChannelMask); SuccessOrExit(error = channelMask.AppendTo(*message)); - panId.Init(); - panId.SetPanId(mPanId); - SuccessOrExit(error = panId.AppendTo(*message)); + SuccessOrExit(error = Tlv::AppendUint16Tlv(*message, MeshCoP::Tlv::kPanId, mPanId)); messageInfo.SetSockAddr(Get().GetMeshLocal16()); messageInfo.SetPeerAddr(mCommissioner);