Skip to content

Commit

Permalink
use oneshot exchange for network provisioning
Browse files Browse the repository at this point in the history
  • Loading branch information
pan-apple committed Apr 13, 2021
1 parent 72dbf4d commit 4426904
Show file tree
Hide file tree
Showing 4 changed files with 19 additions and 33 deletions.
43 changes: 16 additions & 27 deletions src/protocols/secure_channel/NetworkProvisioning.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -64,12 +64,6 @@ NetworkProvisioning::~NetworkProvisioning()
void NetworkProvisioning::OnMessageReceived(Messaging::ExchangeContext * ec, const PacketHeader & packetHeader,
const PayloadHeader & payloadHeader, System::PacketBufferHandle payload)
{
VerifyOrReturn(mExchangeCtxt == nullptr || mExchangeCtxt == ec,
ChipLogProgress(NetworkProvisioning, "Received message on invalid exchange context"));
if (mExchangeCtxt == nullptr)
{
mExchangeCtxt = ec->Retain();
}
HandleNetworkProvisioningMessage(payloadHeader.GetMessageType(), payload);
}

Expand Down Expand Up @@ -191,6 +185,16 @@ CHIP_ERROR NetworkProvisioning::DecodeString(const uint8_t * input, size_t input
return err;
}

CHIP_ERROR NetworkProvisioning::SendMessageUsingExchange(uint8_t msgType, System::PacketBufferHandle msgPayload)
{
Messaging::ExchangeContext * ctxt = mExchangeMgr->NewContext(mSession, this);
VerifyOrReturnError(ctxt != nullptr, CHIP_ERROR_INTERNAL);
CHIP_ERROR err = ctxt->SendMessage(Protocols::NetworkProvisioning::Id, msgType, std::move(msgPayload),
Messaging::SendMessageFlags::kNoAutoRequestAck);
ctxt->Release();
return err;
}

CHIP_ERROR NetworkProvisioning::SendIPAddress(const Inet::IPAddress & addr)
{
char * addrStr;
Expand All @@ -200,12 +204,10 @@ CHIP_ERROR NetworkProvisioning::SendIPAddress(const Inet::IPAddress & addr)
addrStr = addr.ToString(Uint8::to_char(buffer->Start()), buffer->AvailableDataLength());
buffer->SetDataLength(static_cast<uint16_t>(strlen(addrStr) + 1));

ChipLogProgress(NetworkProvisioning, "Sending IP Address. mExchangeCtxt %p\n", mExchangeCtxt);
VerifyOrExit(mExchangeCtxt != nullptr, err = CHIP_ERROR_INCORRECT_STATE);
ChipLogProgress(NetworkProvisioning, "Sending IP Address\n");
VerifyOrExit(addrStr != nullptr, err = CHIP_ERROR_INVALID_ADDRESS);

err = mExchangeCtxt->SendMessage(Protocols::NetworkProvisioning::Id, NetworkProvisioning::MsgTypes::kIPAddressAssigned,
std::move(buffer), Messaging::SendMessageFlags::kNoAutoRequestAck);
err = SendMessageUsingExchange(NetworkProvisioning::MsgTypes::kIPAddressAssigned, std::move(buffer));
SuccessOrExit(err);

exit:
Expand Down Expand Up @@ -242,20 +244,13 @@ CHIP_ERROR NetworkProvisioning::SendNetworkCredentials(const char * ssid, const
{
Encoding::LittleEndian::PacketBufferWriter bbuf(MessagePacketBuffer::New(bufferSize), bufferSize);

ChipLogProgress(NetworkProvisioning, "Sending Network Creds. mExchangeCtxt %p\n", mExchangeCtxt);
ChipLogProgress(NetworkProvisioning, "Sending Network Creds\n");
VerifyOrExit(!bbuf.IsNull(), err = CHIP_ERROR_NO_MEMORY);
SuccessOrExit(EncodeString(ssid, bbuf));
SuccessOrExit(EncodeString(passwd, bbuf));
VerifyOrExit(bbuf.Fit(), err = CHIP_ERROR_BUFFER_TOO_SMALL);

if (mExchangeCtxt != nullptr)
{
mExchangeCtxt->Release();
}
mExchangeCtxt = mExchangeMgr->NewContext(mSession, this);
VerifyOrExit(mExchangeCtxt != nullptr, err = CHIP_ERROR_INTERNAL);
err = mExchangeCtxt->SendMessage(Protocols::NetworkProvisioning::Id, NetworkProvisioning::MsgTypes::kWiFiAssociationRequest,
bbuf.Finalize(), Messaging::SendMessageFlags::kNoAutoRequestAck);
err = SendMessageUsingExchange(NetworkProvisioning::MsgTypes::kWiFiAssociationRequest, bbuf.Finalize());
SuccessOrExit(err);
}

Expand Down Expand Up @@ -296,14 +291,8 @@ CHIP_ERROR NetworkProvisioning::SendThreadCredentials(const DeviceLayer::Interna
bbuf.Put(static_cast<uint8_t>(threadData.FieldPresent.ThreadPSKc));

VerifyOrExit(bbuf.Fit(), err = CHIP_ERROR_BUFFER_TOO_SMALL);
if (mExchangeCtxt != nullptr)
{
mExchangeCtxt->Release();
}
mExchangeCtxt = mExchangeMgr->NewContext(mSession, this);
VerifyOrExit(mExchangeCtxt != nullptr, err = CHIP_ERROR_INTERNAL);
err = mExchangeCtxt->SendMessage(Protocols::NetworkProvisioning::Id, NetworkProvisioning::MsgTypes::kThreadAssociationRequest,
bbuf.Finalize(), Messaging::SendMessageFlags::kNoAutoRequestAck);

err = SendMessageUsingExchange(NetworkProvisioning::MsgTypes::kThreadAssociationRequest, bbuf.Finalize());

exit:
if (CHIP_NO_ERROR != err)
Expand Down
5 changes: 3 additions & 2 deletions src/protocols/secure_channel/NetworkProvisioning.h
Original file line number Diff line number Diff line change
Expand Up @@ -109,8 +109,7 @@ class DLL_EXPORT NetworkProvisioning : public Messaging::ExchangeDelegate
private:
NetworkProvisioningDelegate * mDelegate = nullptr;

Messaging::ExchangeManager * mExchangeMgr = nullptr;
Messaging::ExchangeContext * mExchangeCtxt = nullptr;
Messaging::ExchangeManager * mExchangeMgr = nullptr;

Inet::IPAddress mDeviceAddress = Inet::IPAddress::Any;

Expand Down Expand Up @@ -141,6 +140,8 @@ class DLL_EXPORT NetworkProvisioning : public Messaging::ExchangeDelegate

CHIP_ERROR DecodeThreadAssociationRequest(const System::PacketBufferHandle & msgBuf);

CHIP_ERROR SendMessageUsingExchange(uint8_t msgType, System::PacketBufferHandle msgPayload);

#if CONFIG_DEVICE_LAYER
static void ConnectivityHandler(const DeviceLayer::ChipDeviceEvent * event, intptr_t arg);
#endif // CONFIG_DEVICE_LAYER
Expand Down
2 changes: 0 additions & 2 deletions src/protocols/secure_channel/PASESession.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -93,8 +93,6 @@ void PASESession::Clear()
mComputeVerifier = true;
mConnectionState.Reset();

ChipLogProgress(Ble, "PASESession::Clear() release exchange context %p", mExchangeCtxt);

if (mExchangeCtxt != nullptr)
{
mExchangeCtxt->Release();
Expand Down
2 changes: 0 additions & 2 deletions src/protocols/secure_channel/RendezvousSession.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -327,8 +327,6 @@ CHIP_ERROR RendezvousSession::Pair(uint32_t setupPINCode)
Messaging::ExchangeContext * ctxt = mExchangeManager->NewContext(SecureSessionHandle(), &mPairingSession);
ReturnErrorCodeIf(ctxt == nullptr, CHIP_ERROR_INTERNAL);

ChipLogProgress(Ble, "RendezvousSession::Pair new exchange context for pairing %p", ctxt);

UpdateState(State::kSecurePairing);
CHIP_ERROR err = mPairingSession.Pair(mParams.GetPeerAddress(), setupPINCode, mNextKeyId++, ctxt, this);
ctxt->Release();
Expand Down

0 comments on commit 4426904

Please sign in to comment.