@@ -514,7 +514,8 @@ CHIP_ERROR CASESession::EstablishSession(SessionManager & sessionManager, Fabric
514
514
515
515
// We are setting the exchange context specifically before checking for error.
516
516
// This is to make sure the exchange will get closed if Init() returned an error.
517
- mExchangeCtxt = exchangeCtxt;
517
+ ExchangeHandle ecHandle (*exchangeCtxt);
518
+ mExchangeCtxt .SetValue (ecHandle);
518
519
519
520
// From here onwards, let's go to exit on error, as some state might have already
520
521
// been initialized
@@ -527,7 +528,7 @@ CHIP_ERROR CASESession::EstablishSession(SessionManager & sessionManager, Fabric
527
528
mSessionResumptionStorage = sessionResumptionStorage;
528
529
mLocalMRPConfig = mrpLocalConfig.ValueOr (GetDefaultMRPConfig ());
529
530
530
- mExchangeCtxt ->UseSuggestedResponseTimeout (kExpectedSigma1ProcessingTime );
531
+ mExchangeCtxt . Value () ->UseSuggestedResponseTimeout (kExpectedSigma1ProcessingTime );
531
532
mPeerNodeId = peerScopedNodeId.GetNodeId ();
532
533
mLocalNodeId = fabricInfo->GetNodeId ();
533
534
@@ -549,7 +550,7 @@ void CASESession::OnResponseTimeout(ExchangeContext * ec)
549
550
{
550
551
MATTER_TRACE_SCOPE (" OnResponseTimeout" , " CASESession" );
551
552
VerifyOrReturn (ec != nullptr , ChipLogError (SecureChannel, " CASESession::OnResponseTimeout was called by null exchange" ));
552
- VerifyOrReturn (mExchangeCtxt == ec, ChipLogError (SecureChannel, " CASESession::OnResponseTimeout exchange doesn't match" ));
553
+ VerifyOrReturn (& mExchangeCtxt . Value (). Get () == ec, ChipLogError (SecureChannel, " CASESession::OnResponseTimeout exchange doesn't match" ));
553
554
ChipLogError (SecureChannel, " CASESession timed out while waiting for a response from the peer. Current state was %u" ,
554
555
to_underlying (mState ));
555
556
MATTER_TRACE_COUNTER (" CASETimeout" );
@@ -735,8 +736,8 @@ CHIP_ERROR CASESession::SendSigma1()
735
736
ReturnErrorOnFailure (mCommissioningHash .AddData (ByteSpan{ msg_R1->Start (), msg_R1->DataLength () }));
736
737
737
738
// Call delegate to send the msg to peer
738
- ReturnErrorOnFailure (mExchangeCtxt ->SendMessage (Protocols::SecureChannel::MsgType::CASE_Sigma1, std::move (msg_R1),
739
- SendFlags (SendMessageFlags::kExpectResponse )));
739
+ ReturnErrorOnFailure (mExchangeCtxt . Value () ->SendMessage (Protocols::SecureChannel::MsgType::CASE_Sigma1, std::move (msg_R1),
740
+ SendFlags (SendMessageFlags::kExpectResponse )));
740
741
741
742
mState = resuming ? State::kSentSigma1Resume : State::kSentSigma1 ;
742
743
@@ -959,8 +960,8 @@ CHIP_ERROR CASESession::SendSigma2Resume()
959
960
ReturnErrorOnFailure (tlvWriter.Finalize (&msg_R2_resume));
960
961
961
962
// Call delegate to send the msg to peer
962
- ReturnErrorOnFailure (mExchangeCtxt ->SendMessage (Protocols::SecureChannel::MsgType::CASE_Sigma2Resume, std::move (msg_R2_resume),
963
- SendFlags (SendMessageFlags::kExpectResponse )));
963
+ ReturnErrorOnFailure (mExchangeCtxt . Value () ->SendMessage (Protocols::SecureChannel::MsgType::CASE_Sigma2Resume, std::move (msg_R2_resume),
964
+ SendFlags (SendMessageFlags::kExpectResponse )));
964
965
965
966
mState = State::kSentSigma2Resume ;
966
967
@@ -1096,8 +1097,8 @@ CHIP_ERROR CASESession::SendSigma2()
1096
1097
ReturnErrorOnFailure (mCommissioningHash .AddData (ByteSpan{ msg_R2->Start (), msg_R2->DataLength () }));
1097
1098
1098
1099
// Call delegate to send the msg to peer
1099
- ReturnErrorOnFailure (mExchangeCtxt ->SendMessage (Protocols::SecureChannel::MsgType::CASE_Sigma2, std::move (msg_R2),
1100
- SendFlags (SendMessageFlags::kExpectResponse )));
1100
+ ReturnErrorOnFailure (mExchangeCtxt . Value () ->SendMessage (Protocols::SecureChannel::MsgType::CASE_Sigma2, std::move (msg_R2),
1101
+ SendFlags (SendMessageFlags::kExpectResponse )));
1101
1102
1102
1103
mState = State::kSentSigma2 ;
1103
1104
@@ -1148,7 +1149,7 @@ CHIP_ERROR CASESession::HandleSigma2Resume(System::PacketBufferHandle && msg)
1148
1149
if (tlvReader.Next () != CHIP_END_OF_TLV)
1149
1150
{
1150
1151
SuccessOrExit (err = DecodeMRPParametersIfPresent (TLV::ContextTag (4 ), tlvReader));
1151
- mExchangeCtxt ->GetSessionHandle ()->AsUnauthenticatedSession ()->SetRemoteSessionParameters (GetRemoteSessionParameters ());
1152
+ mExchangeCtxt . Value () ->GetSessionHandle ()->AsUnauthenticatedSession ()->SetRemoteSessionParameters (GetRemoteSessionParameters ());
1152
1153
}
1153
1154
1154
1155
ChipLogDetail (SecureChannel, " Peer assigned session session ID %d" , responderSessionId);
@@ -1341,7 +1342,7 @@ CHIP_ERROR CASESession::HandleSigma2(System::PacketBufferHandle && msg)
1341
1342
if (tlvReader.Next () != CHIP_END_OF_TLV)
1342
1343
{
1343
1344
SuccessOrExit (err = DecodeMRPParametersIfPresent (TLV::ContextTag (kTag_Sigma2_ResponderMRPParams ), tlvReader));
1344
- mExchangeCtxt ->GetSessionHandle ()->AsUnauthenticatedSession ()->SetRemoteSessionParameters (GetRemoteSessionParameters ());
1345
+ mExchangeCtxt . Value () ->GetSessionHandle ()->AsUnauthenticatedSession ()->SetRemoteSessionParameters (GetRemoteSessionParameters ());
1345
1346
}
1346
1347
1347
1348
exit :
@@ -1410,7 +1411,7 @@ CHIP_ERROR CASESession::SendSigma3a()
1410
1411
{
1411
1412
SuccessOrExit (err = helper->ScheduleWork ());
1412
1413
mSendSigma3Helper = helper;
1413
- mExchangeCtxt ->WillSendMessage ();
1414
+ mExchangeCtxt . Value () ->WillSendMessage ();
1414
1415
mState = State::kSendSigma3Pending ;
1415
1416
}
1416
1417
else
@@ -1537,8 +1538,8 @@ CHIP_ERROR CASESession::SendSigma3c(SendSigma3Data & data, CHIP_ERROR status)
1537
1538
SuccessOrExit (err);
1538
1539
1539
1540
// Call delegate to send the Msg3 to peer
1540
- err = mExchangeCtxt ->SendMessage (Protocols::SecureChannel::MsgType::CASE_Sigma3, std::move (msg_R3),
1541
- SendFlags (SendMessageFlags::kExpectResponse ));
1541
+ err = mExchangeCtxt . Value () ->SendMessage (Protocols::SecureChannel::MsgType::CASE_Sigma3, std::move (msg_R3),
1542
+ SendFlags (SendMessageFlags::kExpectResponse ));
1542
1543
SuccessOrExit (err);
1543
1544
1544
1545
ChipLogProgress (SecureChannel, " Sent Sigma3 msg" );
@@ -1704,7 +1705,7 @@ CHIP_ERROR CASESession::HandleSigma3a(System::PacketBufferHandle && msg)
1704
1705
1705
1706
SuccessOrExit (err = helper->ScheduleWork ());
1706
1707
mHandleSigma3Helper = helper;
1707
- mExchangeCtxt ->WillSendMessage ();
1708
+ mExchangeCtxt . Value () ->WillSendMessage ();
1708
1709
mState = State::kHandleSigma3Pending ;
1709
1710
}
1710
1711
@@ -2031,7 +2032,7 @@ CHIP_ERROR CASESession::ParseSigma1(TLV::ContiguousBufferTLVReader & tlvReader,
2031
2032
if (err == CHIP_NO_ERROR && tlvReader.GetTag () == ContextTag (kInitiatorMRPParamsTag ))
2032
2033
{
2033
2034
ReturnErrorOnFailure (DecodeMRPParametersIfPresent (TLV::ContextTag (kInitiatorMRPParamsTag ), tlvReader));
2034
- mExchangeCtxt ->GetSessionHandle ()->AsUnauthenticatedSession ()->SetRemoteSessionParameters (GetRemoteSessionParameters ());
2035
+ mExchangeCtxt . Value () ->GetSessionHandle ()->AsUnauthenticatedSession ()->SetRemoteSessionParameters (GetRemoteSessionParameters ());
2035
2036
err = tlvReader.Next ();
2036
2037
}
2037
2038
@@ -2079,26 +2080,27 @@ CHIP_ERROR CASESession::ParseSigma1(TLV::ContiguousBufferTLVReader & tlvReader,
2079
2080
return CHIP_NO_ERROR;
2080
2081
}
2081
2082
2082
- CHIP_ERROR CASESession::ValidateReceivedMessage (ExchangeContext * ec, const PayloadHeader & payloadHeader,
2083
+ CHIP_ERROR CASESession::ValidateReceivedMessage (chip::Messaging:: ExchangeContext * ec, const PayloadHeader & payloadHeader,
2083
2084
const System::PacketBufferHandle & msg)
2084
2085
{
2085
2086
VerifyOrReturnError (ec != nullptr , CHIP_ERROR_INVALID_ARGUMENT);
2086
2087
2087
2088
// mExchangeCtxt can be nullptr if this is the first message (CASE_Sigma1) received by CASESession
2088
2089
// via UnsolicitedMessageHandler. The exchange context is allocated by exchange manager and provided
2089
2090
// to the handler (CASESession object).
2090
- if (mExchangeCtxt != nullptr )
2091
+ if (mExchangeCtxt . HasValue () )
2091
2092
{
2092
- if (mExchangeCtxt != ec)
2093
+ if (& mExchangeCtxt . Value (). Get () != ec)
2093
2094
{
2094
2095
ReturnErrorOnFailure (CHIP_ERROR_INVALID_ARGUMENT);
2095
2096
}
2096
2097
}
2097
2098
else
2098
2099
{
2099
- mExchangeCtxt = ec;
2100
+ ExchangeHandle ecHandle (*ec);
2101
+ mExchangeCtxt .SetValue (ecHandle);
2100
2102
}
2101
- mExchangeCtxt ->UseSuggestedResponseTimeout (kExpectedHighProcessingTime );
2103
+ mExchangeCtxt . Value () ->UseSuggestedResponseTimeout (kExpectedHighProcessingTime );
2102
2104
2103
2105
VerifyOrReturnError (!msg.IsNull (), CHIP_ERROR_INVALID_ARGUMENT);
2104
2106
return CHIP_NO_ERROR;
@@ -2123,7 +2125,7 @@ CHIP_ERROR CASESession::OnMessageReceived(ExchangeContext * ec, const PayloadHea
2123
2125
//
2124
2126
// Should you need to resume the CASESession, you could theoretically pass along the msg to a callback that gets
2125
2127
// registered when setting mStopHandshakeAtState.
2126
- mExchangeCtxt ->WillSendMessage ();
2128
+ mExchangeCtxt . Value () ->WillSendMessage ();
2127
2129
return CHIP_NO_ERROR;
2128
2130
}
2129
2131
#endif // CONFIG_BUILD_FOR_HOST_UNIT_TEST
@@ -2133,7 +2135,7 @@ CHIP_ERROR CASESession::OnMessageReceived(ExchangeContext * ec, const PayloadHea
2133
2135
msgType == Protocols::SecureChannel::MsgType::CASE_Sigma2Resume ||
2134
2136
msgType == Protocols::SecureChannel::MsgType::CASE_Sigma3)
2135
2137
{
2136
- SuccessOrExit (err = mExchangeCtxt ->FlushAcks ());
2138
+ SuccessOrExit (err = mExchangeCtxt . Value () ->FlushAcks ());
2137
2139
}
2138
2140
#endif // CHIP_CONFIG_SLOW_CRYPTO
2139
2141
0 commit comments