void Joiner::SendJoinerFinalize(void) { Coap::Header header; StateTlv *stateTlv; uint8_t length; uint8_t buf[128]; uint8_t *cur = buf; otLogFuncEntry(); header.Init(kCoapTypeConfirmable, kCoapRequestPost); header.SetMessageId(0); header.SetToken(NULL, 0); header.AppendUriPathOptions(OPENTHREAD_URI_JOINER_FINALIZE); header.SetPayloadMarker(); memcpy(cur, header.GetBytes(), header.GetLength()); cur += header.GetLength(); stateTlv = reinterpret_cast<MeshCoP::StateTlv *>(cur); stateTlv->Init(); stateTlv->SetState(MeshCoP::StateTlv::kAccept); cur += sizeof(*stateTlv); length = mNetif.GetDtls().mProvisioningUrl.GetLength(); if (length > 0) { length += sizeof(Tlv); memcpy(cur, &mNetif.GetDtls().mProvisioningUrl, length); cur += length; } mNetif.GetDtls().Send(buf, static_cast<uint16_t>(cur - buf)); otLogInfoMeshCoP("Sent joiner finalize"); otDumpCertMeshCoP("[THCI] direction=send | type=JOIN_FIN.req |", buf + header.GetLength(), cur - buf - header.GetLength()); otLogFuncExit(); }
ThreadError Local::Register(const Ip6::Address &aDestination) { ThreadError error = kThreadError_None; Coap::Header header; Message *message; Ip6::MessageInfo messageInfo; UpdateRloc(); mSocket.Open(&HandleUdpReceive, this); for (size_t i = 0; i < sizeof(mCoapToken); i++) { mCoapToken[i] = otPlatRandomGet(); } header.Init(); header.SetVersion(1); header.SetType(Coap::Header::kTypeConfirmable); header.SetCode(Coap::Header::kCodePost); header.SetMessageId(++mCoapMessageId); header.SetToken(mCoapToken, sizeof(mCoapToken)); header.AppendUriPathOptions(OPENTHREAD_URI_SERVER_DATA); header.AppendContentFormatOption(Coap::Header::kApplicationOctetStream); header.Finalize(); VerifyOrExit((message = Ip6::Udp::NewMessage(0)) != NULL, error = kThreadError_NoBufs); SuccessOrExit(error = message->Append(header.GetBytes(), header.GetLength())); SuccessOrExit(error = message->Append(mTlvs, mLength)); memset(&messageInfo, 0, sizeof(messageInfo)); memcpy(&messageInfo.mPeerAddr, &aDestination, sizeof(messageInfo.mPeerAddr)); messageInfo.mPeerPort = kCoapUdpPort; SuccessOrExit(error = mSocket.SendTo(*message, messageInfo)); otLogInfoNetData("Sent network data registration\n"); exit: if (error != kThreadError_None && message != NULL) { Message::Free(*message); } return error; }