[meshcop-tlvs] simplify processing of simple MeshCoP TLVs (#4635)

This commit changes the processing of the following TLVs: PAN ID,
Extended PAN ID, PSKc, Network Master Key, Network Key Sequence, Mesh
Local Prefix, Border Agent Locator, Commissioner Session ID,
Commissioner UDP Port, State, Joiner UDP Port, Joiner IID, Joiner
Router Locator, Joiner Router KEK, Delay Timer, Count, Period, Scan
Duration, and IP6 Address.
This commit is contained in:
Abtin Keshavarzian
2020-03-09 11:39:09 -07:00
committed by Jonathan Hui
parent 39b796fa52
commit e41fec73cb
17 changed files with 222 additions and 758 deletions
+8 -18
View File
@@ -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<MeshCoP::Commissioner>().IsActive(), error = OT_ERROR_INVALID_STATE);
VerifyOrExit((message = MeshCoP::NewMeshCoPMessage(Get<Coap::Coap>())) != 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<MeshCoP::Commissioner>().GetSessionId());
SuccessOrExit(error = sessionId.AppendTo(*message));
SuccessOrExit(error = Tlv::AppendUint16Tlv(*message, MeshCoP::Tlv::kCommissionerSessionId,
Get<MeshCoP::Commissioner>().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<Mle::MleRouter>().GetMeshLocal16());
messageInfo.SetPeerAddr(aAddress);
+17 -31
View File
@@ -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<Mle::MleRouter>().GetCommissionerAloc(borderAgent.mCommissionerAloc.GetAddress(),
sessionIdTlv.GetCommissionerSessionId());
instance.Get<Mle::MleRouter>().GetCommissionerAloc(borderAgent.mCommissionerAloc.GetAddress(), sessionId);
instance.Get<ThreadNetif>().AddUnicastAddress(borderAgent.mCommissionerAloc);
instance.Get<Ip6::Udp>().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<Ip6::Udp>().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<Coap::CoapSecure>().SendMessage(*message, Get<Coap::CoapSecure>().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<Coap::Coap>())) != NULL, error = OT_ERROR_NO_BUFS);
@@ -549,7 +535,7 @@ void BorderAgent::HandleRelayTransmit(const Coap::Message &aMessage)
messageInfo.SetSockAddr(Get<Mle::MleRouter>().GetMeshLocal16());
messageInfo.SetPeerPort(kCoapUdpPort);
messageInfo.SetPeerAddr(Get<Mle::MleRouter>().GetMeshLocal16());
messageInfo.GetPeerAddr().mFields.m16[7] = HostSwap16(joinerRouterRloc.GetJoinerRouterLocator());
messageInfo.GetPeerAddr().mFields.m16[7] = HostSwap16(joinerRouterRloc);
SuccessOrExit(error = Get<Coap::Coap>().SendMessage(*message, messageInfo));
+51 -91
View File
@@ -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<Mle::MleRouter>().GetCommissionerAloc(mCommissionerAloc.GetAddress(), mSessionId);
Get<ThreadNetif>().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<Coap::Coap>())) != 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<Mle::MleRouter>().GetMeshLocal16());
SuccessOrExit(error = Get<Mle::MleRouter>().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<Coap::CoapSecure>().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<Coap::CoapSecure>())) != 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<uint8_t>(aState)));
joinerMessageInfo.SetPeerAddr(Get<Mle::MleRouter>().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<Coap::Coap>())) != 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<KeyManager>().GetKek());
SuccessOrExit(error = kek.AppendTo(*message));
SuccessOrExit(error = Tlv::AppendTlv(*message, Tlv::kJoinerRouterKek, Get<KeyManager>().GetKek(),
KeyManager::kMaxKeyLength));
}
tlv.SetType(Tlv::kJoinerDtlsEncapsulation);
+11 -28
View File
@@ -439,10 +439,8 @@ otError DatasetManager::SendSetRequest(const otOperationalDataset &aDataset, con
if (!hasSessionId)
{
CommissionerSessionIdTlv sessionId;
sessionId.Init();
sessionId.SetCommissionerSessionId(Get<Commissioner>().GetSessionId());
SuccessOrExit(error = sessionId.AppendTo(*message));
SuccessOrExit(error = Tlv::AppendUint16Tlv(*message, Tlv::kCommissionerSessionId,
Get<Commissioner>().GetSessionId()));
}
}
@@ -468,10 +466,8 @@ otError DatasetManager::SendSetRequest(const otOperationalDataset &aDataset, con
if (aDataset.mComponents.mIsMasterKeyPresent)
{
NetworkMasterKeyTlv masterkey;
masterkey.Init();
masterkey.SetNetworkMasterKey(static_cast<const MasterKey &>(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<const Mac::ExtendedPanId &>(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<const Pskc &>(aDataset.mPskc));
SuccessOrExit(error = pskc.AppendTo(*message));
SuccessOrExit(error = Tlv::AppendTlv(*message, Tlv::kPskc, aDataset.mPskc.m8, sizeof(Pskc)));
}
if (aDataset.mComponents.mIsSecurityPolicyPresent)
+23 -30
View File
@@ -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<Mle::MleRouter>().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<Mac::Mac>().GetPanId())
if (Tlv::ReadUint16Tlv(aMessage, Tlv::kPanId, panId) == OT_ERROR_NONE && panId != Get<Mac::Mac>().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<Mle::MleRouter>().GetMeshLocalPrefix(),
meshLocalPrefix.GetMeshLocalPrefixLength()))
if (Tlv::ReadTlv(aMessage, Tlv::kMeshLocalPrefix, &meshLocalPrefix, sizeof(meshLocalPrefix)) == OT_ERROR_NONE &&
memcmp(&meshLocalPrefix, &Get<Mle::MleRouter>().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<KeyManager>().GetMasterKey()))
if (Tlv::ReadTlv(aMessage, Tlv::kNetworkMasterKey, &masterKey, sizeof(masterKey)) == OT_ERROR_NONE)
{
doesAffectConnectivity = true;
doesAffectMasterKey = true;
hasMasterKey = true;
if (masterKey != Get<KeyManager>().GetMasterKey())
{
doesAffectConnectivity = true;
doesAffectMasterKey = true;
}
}
// check active timestamp rollback
if (type == Tlv::kPendingTimestamp &&
((masterKey.GetLength() == 0) || (masterKey.GetNetworkMasterKey() == Get<KeyManager>().GetMasterKey())))
if (type == Tlv::kPendingTimestamp && (!hasMasterKey || (masterKey == Get<KeyManager>().GetMasterKey())))
{
// no change to master key, active timestamp must be ahead
const Timestamp *localActiveTimestamp = Get<ActiveDataset>().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<CommissionerSessionIdTlv *>(
Get<NetworkData::Leader>().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<Coap::Coap>())) != 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<uint8_t>(aState)));
SuccessOrExit(error = Get<Coap::Coap>().SendMessage(*message, aMessageInfo));
+9 -22
View File
@@ -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<MeshCoP::Commissioner>().IsActive(), error = OT_ERROR_INVALID_STATE);
VerifyOrExit((message = MeshCoP::NewMeshCoPMessage(Get<Coap::Coap>())) != 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<MeshCoP::Commissioner>().GetSessionId());
SuccessOrExit(error = sessionId.AppendTo(*message));
SuccessOrExit(error = Tlv::AppendUint16Tlv(*message, MeshCoP::Tlv::kCommissionerSessionId,
Get<MeshCoP::Commissioner>().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<Mle::MleRouter>().GetMeshLocal16());
messageInfo.SetPeerAddr(aAddress);
+5 -13
View File
@@ -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<uint8_t>(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<Mac::Mac>().GetPanChannel();
+36 -57
View File
@@ -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<Mle::MleRouter>().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<Mle::MleRouter>().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<otMessagePriority>(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<otMessagePriority>(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<KeyManager>().GetMasterKey());
SuccessOrExit(error = masterKey.AppendTo(*message));
SuccessOrExit(error = Tlv::AppendTlv(*message, Tlv::kNetworkMasterKey, Get<KeyManager>().GetMasterKey().m8,
sizeof(MasterKey)));
meshLocalPrefix.Init();
meshLocalPrefix.SetMeshLocalPrefix(Get<Mle::MleRouter>().GetMeshLocalPrefix());
SuccessOrExit(error = meshLocalPrefix.AppendTo(*message));
SuccessOrExit(error = Tlv::AppendTlv(*message, Tlv::kMeshLocalPrefix, Get<Mle::MleRouter>().GetMeshLocalPrefix().m8,
sizeof(otMeshLocalPrefix)));
extendedPanId.Init();
extendedPanId.SetExtendedPanId(Get<Mac::Mac>().GetExtendedPanId());
SuccessOrExit(error = extendedPanId.AppendTo(*message));
SuccessOrExit(error = Tlv::AppendTlv(*message, Tlv::kExtendedPanId, Get<Mac::Mac>().GetExtendedPanId().m8,
sizeof(Mac::ExtendedPanId)));
networkName.Init();
networkName.SetNetworkName(Get<Mac::Mac>().GetNetworkName().GetAsData());
@@ -330,14 +310,13 @@ otError JoinerRouter::DelaySendingJoinerEntrust(const Ip6::MessageInfo &aMessage
SuccessOrExit(error = securityPolicy.AppendTo(*message));
}
networkKeySequence.Init();
networkKeySequence.SetNetworkKeySequence(Get<KeyManager>().GetCurrentKeySequence());
SuccessOrExit(error = networkKeySequence.AppendTo(*message));
SuccessOrExit(
error = Tlv::AppendUint32Tlv(*message, Tlv::kNetworkKeySequence, Get<KeyManager>().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);
+1 -1
View File
@@ -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);
+13 -24
View File
@@ -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<Coap::Coap>())) != 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<uint8_t>(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<Coap::Coap>().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<BorderAgentLocatorTlv *>(
Get<NetworkData::Leader>().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<Coap::Coap>())) != 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<uint8_t>(aState)));
SuccessOrExit(error = Get<Coap::Coap>().SendMessage(*message, aMessageInfo));
+3 -370
View File
@@ -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.
*
+12 -18
View File
@@ -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<MeshCoP::Commissioner>().IsActive(), error = OT_ERROR_INVALID_STATE);
VerifyOrExit((message = MeshCoP::NewMeshCoPMessage(Get<Coap::Coap>())) != 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<MeshCoP::Commissioner>().GetSessionId());
SuccessOrExit(error = sessionId.AppendTo(*message));
SuccessOrExit(error = Tlv::AppendUint16Tlv(*message, MeshCoP::Tlv::kCommissionerSessionId,
Get<MeshCoP::Commissioner>().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<Mle::MleRouter>().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<Coap::Coap>().SendEmptyAck(aMessage, responseInfo));
+7 -10
View File
@@ -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())
{
+11 -16
View File
@@ -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);
+6 -13
View File
@@ -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<KeyManager>().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<Mac::Mac>().GetExtendedPanId());
SuccessOrExit(error = extPanId.AppendTo(*message));
SuccessOrExit(error = Tlv::AppendTlv(*message, MeshCoP::Tlv::kExtendedPanId, Get<Mac::Mac>().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<MeshCoP::JoinerRouter>().GetJoinerUdpPort());
SuccessOrExit(error = joinerUdpPort.AppendTo(*message));
SuccessOrExit(error = Tlv::AppendUint16Tlv(*message, MeshCoP::Tlv::kJoinerUdpPort,
Get<MeshCoP::JoinerRouter>().GetJoinerUdpPort()));
tlv.SetLength(static_cast<uint8_t>(message->GetLength() - startOffset));
message->Write(startOffset - sizeof(tlv), sizeof(tlv), &tlv);
+3 -6
View File
@@ -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<Coap::Coap>())) != 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<uint8_t>(aState)));
SuccessOrExit(error = Get<Coap::Coap>().SendMessage(*message, aMessageInfo));
+6 -10
View File
@@ -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<Mle::MleRouter>().GetMeshLocal16());
messageInfo.SetPeerAddr(mCommissioner);