@@ -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,8 @@ 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,
554
+ ChipLogError (SecureChannel, " CASESession::OnResponseTimeout exchange doesn't match" ));
553
555
ChipLogError (SecureChannel, " CASESession timed out while waiting for a response from the peer. Current state was %u" ,
554
556
to_underlying (mState ));
555
557
MATTER_TRACE_COUNTER (" CASETimeout" );
@@ -735,8 +737,8 @@ CHIP_ERROR CASESession::SendSigma1()
735
737
ReturnErrorOnFailure (mCommissioningHash .AddData (ByteSpan{ msg_R1->Start (), msg_R1->DataLength () }));
736
738
737
739
// 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 )));
740
+ ReturnErrorOnFailure (mExchangeCtxt . Value () ->SendMessage (Protocols::SecureChannel::MsgType::CASE_Sigma1, std::move (msg_R1),
741
+ SendFlags (SendMessageFlags::kExpectResponse )));
740
742
741
743
mState = resuming ? State::kSentSigma1Resume : State::kSentSigma1 ;
742
744
@@ -959,8 +961,9 @@ CHIP_ERROR CASESession::SendSigma2Resume()
959
961
ReturnErrorOnFailure (tlvWriter.Finalize (&msg_R2_resume));
960
962
961
963
// 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 )));
964
+ ReturnErrorOnFailure (mExchangeCtxt .Value ()->SendMessage (Protocols::SecureChannel::MsgType::CASE_Sigma2Resume,
965
+ std::move (msg_R2_resume),
966
+ SendFlags (SendMessageFlags::kExpectResponse )));
964
967
965
968
mState = State::kSentSigma2Resume ;
966
969
@@ -1096,8 +1099,8 @@ CHIP_ERROR CASESession::SendSigma2()
1096
1099
ReturnErrorOnFailure (mCommissioningHash .AddData (ByteSpan{ msg_R2->Start (), msg_R2->DataLength () }));
1097
1100
1098
1101
// 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 )));
1102
+ ReturnErrorOnFailure (mExchangeCtxt . Value () ->SendMessage (Protocols::SecureChannel::MsgType::CASE_Sigma2, std::move (msg_R2),
1103
+ SendFlags (SendMessageFlags::kExpectResponse )));
1101
1104
1102
1105
mState = State::kSentSigma2 ;
1103
1106
@@ -1148,7 +1151,8 @@ CHIP_ERROR CASESession::HandleSigma2Resume(System::PacketBufferHandle && msg)
1148
1151
if (tlvReader.Next () != CHIP_END_OF_TLV)
1149
1152
{
1150
1153
SuccessOrExit (err = DecodeMRPParametersIfPresent (TLV::ContextTag (4 ), tlvReader));
1151
- mExchangeCtxt ->GetSessionHandle ()->AsUnauthenticatedSession ()->SetRemoteSessionParameters (GetRemoteSessionParameters ());
1154
+ mExchangeCtxt .Value ()->GetSessionHandle ()->AsUnauthenticatedSession ()->SetRemoteSessionParameters (
1155
+ GetRemoteSessionParameters ());
1152
1156
}
1153
1157
1154
1158
ChipLogDetail (SecureChannel, " Peer assigned session session ID %d" , responderSessionId);
@@ -1341,7 +1345,8 @@ CHIP_ERROR CASESession::HandleSigma2(System::PacketBufferHandle && msg)
1341
1345
if (tlvReader.Next () != CHIP_END_OF_TLV)
1342
1346
{
1343
1347
SuccessOrExit (err = DecodeMRPParametersIfPresent (TLV::ContextTag (kTag_Sigma2_ResponderMRPParams ), tlvReader));
1344
- mExchangeCtxt ->GetSessionHandle ()->AsUnauthenticatedSession ()->SetRemoteSessionParameters (GetRemoteSessionParameters ());
1348
+ mExchangeCtxt .Value ()->GetSessionHandle ()->AsUnauthenticatedSession ()->SetRemoteSessionParameters (
1349
+ GetRemoteSessionParameters ());
1345
1350
}
1346
1351
1347
1352
exit :
@@ -1410,7 +1415,7 @@ CHIP_ERROR CASESession::SendSigma3a()
1410
1415
{
1411
1416
SuccessOrExit (err = helper->ScheduleWork ());
1412
1417
mSendSigma3Helper = helper;
1413
- mExchangeCtxt ->WillSendMessage ();
1418
+ mExchangeCtxt . Value () ->WillSendMessage ();
1414
1419
mState = State::kSendSigma3Pending ;
1415
1420
}
1416
1421
else
@@ -1537,8 +1542,8 @@ CHIP_ERROR CASESession::SendSigma3c(SendSigma3Data & data, CHIP_ERROR status)
1537
1542
SuccessOrExit (err);
1538
1543
1539
1544
// 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 ));
1545
+ err = mExchangeCtxt . Value () ->SendMessage (Protocols::SecureChannel::MsgType::CASE_Sigma3, std::move (msg_R3),
1546
+ SendFlags (SendMessageFlags::kExpectResponse ));
1542
1547
SuccessOrExit (err);
1543
1548
1544
1549
ChipLogProgress (SecureChannel, " Sent Sigma3 msg" );
@@ -1704,7 +1709,7 @@ CHIP_ERROR CASESession::HandleSigma3a(System::PacketBufferHandle && msg)
1704
1709
1705
1710
SuccessOrExit (err = helper->ScheduleWork ());
1706
1711
mHandleSigma3Helper = helper;
1707
- mExchangeCtxt ->WillSendMessage ();
1712
+ mExchangeCtxt . Value () ->WillSendMessage ();
1708
1713
mState = State::kHandleSigma3Pending ;
1709
1714
}
1710
1715
@@ -2036,7 +2041,8 @@ CHIP_ERROR CASESession::ParseSigma1(TLV::ContiguousBufferTLVReader & tlvReader,
2036
2041
if (err == CHIP_NO_ERROR && tlvReader.GetTag () == ContextTag (kInitiatorMRPParamsTag ))
2037
2042
{
2038
2043
ReturnErrorOnFailure (DecodeMRPParametersIfPresent (TLV::ContextTag (kInitiatorMRPParamsTag ), tlvReader));
2039
- mExchangeCtxt ->GetSessionHandle ()->AsUnauthenticatedSession ()->SetRemoteSessionParameters (GetRemoteSessionParameters ());
2044
+ mExchangeCtxt .Value ()->GetSessionHandle ()->AsUnauthenticatedSession ()->SetRemoteSessionParameters (
2045
+ GetRemoteSessionParameters ());
2040
2046
err = tlvReader.Next ();
2041
2047
}
2042
2048
@@ -2084,26 +2090,27 @@ CHIP_ERROR CASESession::ParseSigma1(TLV::ContiguousBufferTLVReader & tlvReader,
2084
2090
return CHIP_NO_ERROR;
2085
2091
}
2086
2092
2087
- CHIP_ERROR CASESession::ValidateReceivedMessage (ExchangeContext * ec, const PayloadHeader & payloadHeader,
2093
+ CHIP_ERROR CASESession::ValidateReceivedMessage (chip::Messaging:: ExchangeContext * ec, const PayloadHeader & payloadHeader,
2088
2094
const System::PacketBufferHandle & msg)
2089
2095
{
2090
2096
VerifyOrReturnError (ec != nullptr , CHIP_ERROR_INVALID_ARGUMENT);
2091
2097
2092
2098
// mExchangeCtxt can be nullptr if this is the first message (CASE_Sigma1) received by CASESession
2093
2099
// via UnsolicitedMessageHandler. The exchange context is allocated by exchange manager and provided
2094
2100
// to the handler (CASESession object).
2095
- if (mExchangeCtxt != nullptr )
2101
+ if (mExchangeCtxt . HasValue () )
2096
2102
{
2097
- if (mExchangeCtxt != ec)
2103
+ if (& mExchangeCtxt . Value (). Get () != ec)
2098
2104
{
2099
2105
ReturnErrorOnFailure (CHIP_ERROR_INVALID_ARGUMENT);
2100
2106
}
2101
2107
}
2102
2108
else
2103
2109
{
2104
- mExchangeCtxt = ec;
2110
+ ExchangeHandle ecHandle (*ec);
2111
+ mExchangeCtxt .SetValue (ecHandle);
2105
2112
}
2106
- mExchangeCtxt ->UseSuggestedResponseTimeout (kExpectedHighProcessingTime );
2113
+ mExchangeCtxt . Value () ->UseSuggestedResponseTimeout (kExpectedHighProcessingTime );
2107
2114
2108
2115
VerifyOrReturnError (!msg.IsNull (), CHIP_ERROR_INVALID_ARGUMENT);
2109
2116
return CHIP_NO_ERROR;
@@ -2128,7 +2135,7 @@ CHIP_ERROR CASESession::OnMessageReceived(ExchangeContext * ec, const PayloadHea
2128
2135
//
2129
2136
// Should you need to resume the CASESession, you could theoretically pass along the msg to a callback that gets
2130
2137
// registered when setting mStopHandshakeAtState.
2131
- mExchangeCtxt ->WillSendMessage ();
2138
+ mExchangeCtxt . Value () ->WillSendMessage ();
2132
2139
return CHIP_NO_ERROR;
2133
2140
}
2134
2141
#endif // CONFIG_BUILD_FOR_HOST_UNIT_TEST
@@ -2138,7 +2145,7 @@ CHIP_ERROR CASESession::OnMessageReceived(ExchangeContext * ec, const PayloadHea
2138
2145
msgType == Protocols::SecureChannel::MsgType::CASE_Sigma2Resume ||
2139
2146
msgType == Protocols::SecureChannel::MsgType::CASE_Sigma3)
2140
2147
{
2141
- SuccessOrExit (err = mExchangeCtxt ->FlushAcks ());
2148
+ SuccessOrExit (err = mExchangeCtxt . Value () ->FlushAcks ());
2142
2149
}
2143
2150
#endif // CHIP_CONFIG_SLOW_CRYPTO
2144
2151
0 commit comments