int Dtls::HandleMbedtlsTransmit(const unsigned char *aBuf, size_t aLength) { otError error; int rval = 0; if (mCipherSuites[0] == MBEDTLS_TLS_ECJPAKE_WITH_AES_128_CCM_8) { otLogDebgMeshCoP("Dtls::HandleMbedtlsTransmit"); } #if OPENTHREAD_ENABLE_APPLICATION_COAP_SECURE else { otLogDebgCoap("Dtls::ApplicationCoapSecure HandleMbedtlsTransmit"); } #endif // OPENTHREAD_ENABLE_APPLICATION_COAP_SECURE error = HandleDtlsSend(aBuf, static_cast<uint16_t>(aLength), mMessageSubType); // Restore default sub type. mMessageSubType = mMessageDefaultSubType; switch (error) { case OT_ERROR_NONE: rval = static_cast<int>(aLength); break; case OT_ERROR_NO_BUFS: rval = MBEDTLS_ERR_SSL_WANT_WRITE; break; default: otLogWarnMeshCoP("Dtls::HandleMbedtlsTransmit: %s error", otThreadErrorToString(error)); rval = MBEDTLS_ERR_NET_SEND_FAILED; break; } return rval; }
void Joiner::HandleJoinerEntrust(Coap::Message &aMessage, const Ip6::MessageInfo &aMessageInfo) { ThreadNetif & netif = GetNetif(); otError error; NetworkMasterKeyTlv masterKey; MeshLocalPrefixTlv meshLocalPrefix; ExtendedPanIdTlv extendedPanId; NetworkNameTlv networkName; ActiveTimestampTlv activeTimestamp; NetworkKeySequenceTlv networkKeySeq; VerifyOrExit(mState == OT_JOINER_STATE_ENTRUST && aMessage.GetType() == OT_COAP_TYPE_CONFIRMABLE && aMessage.GetCode() == OT_COAP_CODE_POST, error = OT_ERROR_DROP); otLogInfoMeshCoP("Received joiner 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); SuccessOrExit(error = Tlv::GetTlv(aMessage, Tlv::kMeshLocalPrefix, sizeof(meshLocalPrefix), meshLocalPrefix)); VerifyOrExit(meshLocalPrefix.IsValid(), error = OT_ERROR_PARSE); SuccessOrExit(error = Tlv::GetTlv(aMessage, Tlv::kExtendedPanId, sizeof(extendedPanId), extendedPanId)); VerifyOrExit(extendedPanId.IsValid(), error = OT_ERROR_PARSE); SuccessOrExit(error = Tlv::GetTlv(aMessage, Tlv::kNetworkName, sizeof(networkName), networkName)); VerifyOrExit(networkName.IsValid(), error = OT_ERROR_PARSE); SuccessOrExit(error = Tlv::GetTlv(aMessage, Tlv::kActiveTimestamp, sizeof(activeTimestamp), activeTimestamp)); VerifyOrExit(activeTimestamp.IsValid(), error = OT_ERROR_PARSE); SuccessOrExit(error = Tlv::GetTlv(aMessage, Tlv::kNetworkKeySequence, sizeof(networkKeySeq), networkKeySeq)); VerifyOrExit(networkKeySeq.IsValid(), error = OT_ERROR_PARSE); netif.GetKeyManager().SetMasterKey(masterKey.GetNetworkMasterKey()); netif.GetKeyManager().SetCurrentKeySequence(networkKeySeq.GetNetworkKeySequence()); netif.GetMle().SetMeshLocalPrefix(meshLocalPrefix.GetMeshLocalPrefix()); netif.GetMac().SetExtendedPanId(extendedPanId.GetExtendedPanId()); { otNetworkName name; memcpy(name.m8, networkName.GetNetworkName(), networkName.GetLength()); name.m8[networkName.GetLength()] = '\0'; netif.GetMac().SetNetworkName(name.m8); } otLogInfoMeshCoP("join success!"); // Send dummy response. SendJoinerEntrustResponse(aMessage, aMessageInfo); // Delay extended address configuration to allow DTLS wrap up. mTimer.Start(kConfigExtAddressDelay); exit: if (error != OT_ERROR_NONE) { otLogWarnMeshCoP("Error while processing joiner entrust: %s", otThreadErrorToString(error)); } }
otError Dataset::ApplyConfiguration(Instance &aInstance) const { ThreadNetif &netif = aInstance.GetThreadNetif(); Mac::Mac & mac = netif.GetMac(); otError error = OT_ERROR_NONE; const Tlv * cur = reinterpret_cast<const Tlv *>(mTlvs); const Tlv * end = reinterpret_cast<const Tlv *>(mTlvs + mLength); VerifyOrExit(IsValid(), error = OT_ERROR_PARSE); while (cur < end) { switch (cur->GetType()) { case Tlv::kChannel: { uint8_t channel = static_cast<uint8_t>(static_cast<const ChannelTlv *>(cur)->GetChannel()); error = mac.SetPanChannel(channel); if (error != OT_ERROR_NONE) { otLogWarnMeshCoP(aInstance, "DatasetManager::ApplyConfiguration() Failed to set channel to %d (%s)", channel, otThreadErrorToString(error)); ExitNow(); } break; } case Tlv::kChannelMask: { const ChannelMask0Entry *mask0Entry = static_cast<const ChannelMaskTlv *>(cur)->GetMask0Entry(); if (mask0Entry != NULL) { mac.SetSupportedChannelMask(mask0Entry->GetMask()); } break; } case Tlv::kPanId: mac.SetPanId(static_cast<const PanIdTlv *>(cur)->GetPanId()); break; case Tlv::kExtendedPanId: mac.SetExtendedPanId(static_cast<const ExtendedPanIdTlv *>(cur)->GetExtendedPanId()); break; case Tlv::kNetworkName: { const NetworkNameTlv *name = static_cast<const NetworkNameTlv *>(cur); mac.SetNetworkName(name->GetNetworkName(), name->GetLength()); break; } case Tlv::kNetworkMasterKey: { const NetworkMasterKeyTlv *key = static_cast<const NetworkMasterKeyTlv *>(cur); netif.GetKeyManager().SetMasterKey(key->GetNetworkMasterKey()); break; } #if OPENTHREAD_FTD case Tlv::kPSKc: { const PSKcTlv *pskc = static_cast<const PSKcTlv *>(cur); netif.GetKeyManager().SetPSKc(pskc->GetPSKc()); break; } #endif case Tlv::kMeshLocalPrefix: { const MeshLocalPrefixTlv *prefix = static_cast<const MeshLocalPrefixTlv *>(cur); netif.GetMle().SetMeshLocalPrefix(prefix->GetMeshLocalPrefix()); break; } case Tlv::kSecurityPolicy: { const SecurityPolicyTlv *securityPolicy = static_cast<const SecurityPolicyTlv *>(cur); netif.GetKeyManager().SetKeyRotation(securityPolicy->GetRotationTime()); netif.GetKeyManager().SetSecurityPolicyFlags(securityPolicy->GetFlags()); break; } default: { break; } } cur = cur->GetNext(); } exit: return error; }