mirror of
https://github.com/espressif/openthread.git
synced 2026-07-28 14:47:46 +00:00
[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:
committed by
Jonathan Hui
parent
39b796fa52
commit
e41fec73cb
@@ -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);
|
||||
|
||||
@@ -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));
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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));
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
@@ -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));
|
||||
|
||||
|
||||
@@ -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.
|
||||
*
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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())
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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));
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user