Skip to content

Commit a518945

Browse files
committed
TCP connection setup/management and CASESession association.
Add TCPConnect()/TCPDisconnect() API for explicit connection setup. Currently, connecting to a peer is coupled with sending a message to the peer. This decouples the two and creates a clear API for connecting to a peer address. Goes along with the existing Disconnect() API. This would be essential during activation of retained sessions by solely connecting to the peer and associating with the retained session. Surface Connection completion and Closure callbacks and hook them through SessionManager(TransportMgr delegate) and CASESession. Mark SecureSession as defunct on connection closures. Modify ActiveConnectionState in TCPBase to hold state for each connection, so that it is able to handle the various control flow paths. Associate a session with a connection object. Associate the PeerAddress with the session early. Pass the PeerAddress in the Find APIs. This helps check against the correct TransportType when searching for a Sesssion in the SessionTable. Add a `large payload` flag in EstablishSession() and Session lookup functions to create/associate with the correct session and transport. Have default configurations for TCP in a separate TCPConfig.h. Refactor echo_requester.cpp and echo_responder.cpp to use the session associated with the connection. Handle Connection closure at ExchangeMgr and uplevel to corresponding ExchangeContext using the corresponding session handle. Add tests around connection establishment in TestTCP.
1 parent aec50d4 commit a518945

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+2077
-371
lines changed

examples/shell/shell_common/include/Globals.h

+2
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,9 @@
2424
#include <protocols/secure_channel/MessageCounterManager.h>
2525
#include <transport/SessionHolder.h>
2626
#include <transport/SessionManager.h>
27+
#if INET_CONFIG_ENABLE_TCP_ENDPOINT
2728
#include <transport/raw/TCP.h>
29+
#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT
2830
#include <transport/raw/UDP.h>
2931

3032
#if INET_CONFIG_ENABLE_TCP_ENDPOINT

src/app/CASESessionManager.cpp

+30-35
Original file line numberDiff line numberDiff line change
@@ -30,62 +30,55 @@ CHIP_ERROR CASESessionManager::Init(chip::System::Layer * systemLayer, const CAS
3030
}
3131

3232
void CASESessionManager::FindOrEstablishSession(const ScopedNodeId & peerId, Callback::Callback<OnDeviceConnected> * onConnection,
33-
Callback::Callback<OnDeviceConnectionFailure> * onFailure
33+
Callback::Callback<OnDeviceConnectionFailure> * onFailure,
3434
#if CHIP_DEVICE_CONFIG_ENABLE_AUTOMATIC_CASE_RETRIES
35-
,
36-
uint8_t attemptCount, Callback::Callback<OnDeviceConnectionRetry> * onRetry
35+
uint8_t attemptCount, Callback::Callback<OnDeviceConnectionRetry> * onRetry,
3736
#endif // CHIP_DEVICE_CONFIG_ENABLE_AUTOMATIC_CASE_RETRIES
38-
)
37+
TransportPayloadCapability transportPayloadCapability)
3938
{
40-
FindOrEstablishSessionHelper(peerId, onConnection, onFailure, nullptr
39+
FindOrEstablishSessionHelper(peerId, onConnection, onFailure, nullptr,
4140
#if CHIP_DEVICE_CONFIG_ENABLE_AUTOMATIC_CASE_RETRIES
42-
,
43-
attemptCount, onRetry
41+
attemptCount, onRetry,
4442
#endif
45-
);
43+
transportPayloadCapability);
4644
}
4745

4846
void CASESessionManager::FindOrEstablishSession(const ScopedNodeId & peerId, Callback::Callback<OnDeviceConnected> * onConnection,
49-
Callback::Callback<OperationalSessionSetup::OnSetupFailure> * onSetupFailure
47+
Callback::Callback<OperationalSessionSetup::OnSetupFailure> * onSetupFailure,
5048
#if CHIP_DEVICE_CONFIG_ENABLE_AUTOMATIC_CASE_RETRIES
51-
,
52-
uint8_t attemptCount, Callback::Callback<OnDeviceConnectionRetry> * onRetry
49+
uint8_t attemptCount, Callback::Callback<OnDeviceConnectionRetry> * onRetry,
5350
#endif
54-
)
51+
TransportPayloadCapability transportPayloadCapability)
5552
{
56-
FindOrEstablishSessionHelper(peerId, onConnection, nullptr, onSetupFailure
53+
FindOrEstablishSessionHelper(peerId, onConnection, nullptr, onSetupFailure,
5754
#if CHIP_DEVICE_CONFIG_ENABLE_AUTOMATIC_CASE_RETRIES
58-
,
59-
attemptCount, onRetry
55+
attemptCount, onRetry,
6056
#endif
61-
);
57+
transportPayloadCapability);
6258
}
6359

6460
void CASESessionManager::FindOrEstablishSession(const ScopedNodeId & peerId, Callback::Callback<OnDeviceConnected> * onConnection,
65-
std::nullptr_t
61+
std::nullptr_t,
6662
#if CHIP_DEVICE_CONFIG_ENABLE_AUTOMATIC_CASE_RETRIES
67-
,
68-
uint8_t attemptCount, Callback::Callback<OnDeviceConnectionRetry> * onRetry
63+
uint8_t attemptCount, Callback::Callback<OnDeviceConnectionRetry> * onRetry,
6964
#endif
70-
)
65+
TransportPayloadCapability transportPayloadCapability)
7166
{
72-
FindOrEstablishSessionHelper(peerId, onConnection, nullptr, nullptr
67+
FindOrEstablishSessionHelper(peerId, onConnection, nullptr, nullptr,
7368
#if CHIP_DEVICE_CONFIG_ENABLE_AUTOMATIC_CASE_RETRIES
74-
,
75-
attemptCount, onRetry
69+
attemptCount, onRetry,
7670
#endif
77-
);
71+
transportPayloadCapability);
7872
}
7973

8074
void CASESessionManager::FindOrEstablishSessionHelper(const ScopedNodeId & peerId,
8175
Callback::Callback<OnDeviceConnected> * onConnection,
8276
Callback::Callback<OnDeviceConnectionFailure> * onFailure,
83-
Callback::Callback<OperationalSessionSetup::OnSetupFailure> * onSetupFailure
77+
Callback::Callback<OperationalSessionSetup::OnSetupFailure> * onSetupFailure,
8478
#if CHIP_DEVICE_CONFIG_ENABLE_AUTOMATIC_CASE_RETRIES
85-
,
86-
uint8_t attemptCount, Callback::Callback<OnDeviceConnectionRetry> * onRetry
79+
uint8_t attemptCount, Callback::Callback<OnDeviceConnectionRetry> * onRetry,
8780
#endif
88-
)
81+
TransportPayloadCapability transportPayloadCapability)
8982
{
9083
ChipLogDetail(CASESessionManager, "FindOrEstablishSession: PeerId = [%d:" ChipLogFormatX64 "]", peerId.GetFabricIndex(),
9184
ChipLogValueX64(peerId.GetNodeId()));
@@ -124,12 +117,12 @@ void CASESessionManager::FindOrEstablishSessionHelper(const ScopedNodeId & peerI
124117

125118
if (onFailure != nullptr)
126119
{
127-
session->Connect(onConnection, onFailure);
120+
session->Connect(onConnection, onFailure, transportPayloadCapability);
128121
}
129122

130123
if (onSetupFailure != nullptr)
131124
{
132-
session->Connect(onConnection, onSetupFailure);
125+
session->Connect(onConnection, onSetupFailure, transportPayloadCapability);
133126
}
134127
}
135128

@@ -143,10 +136,11 @@ void CASESessionManager::ReleaseAllSessions()
143136
mConfig.sessionSetupPool->ReleaseAllSessionSetup();
144137
}
145138

146-
CHIP_ERROR CASESessionManager::GetPeerAddress(const ScopedNodeId & peerId, Transport::PeerAddress & addr)
139+
CHIP_ERROR CASESessionManager::GetPeerAddress(const ScopedNodeId & peerId, Transport::PeerAddress & addr,
140+
TransportPayloadCapability transportPayloadCapability)
147141
{
148142
ReturnErrorOnFailure(mConfig.sessionInitParams.Validate());
149-
auto optionalSessionHandle = FindExistingSession(peerId);
143+
auto optionalSessionHandle = FindExistingSession(peerId, transportPayloadCapability);
150144
ReturnErrorCodeIf(!optionalSessionHandle.HasValue(), CHIP_ERROR_NOT_CONNECTED);
151145
addr = optionalSessionHandle.Value()->AsSecureSession()->GetPeerAddress();
152146
return CHIP_NO_ERROR;
@@ -182,10 +176,11 @@ OperationalSessionSetup * CASESessionManager::FindExistingSessionSetup(const Sco
182176
return mConfig.sessionSetupPool->FindSessionSetup(peerId, forAddressUpdate);
183177
}
184178

185-
Optional<SessionHandle> CASESessionManager::FindExistingSession(const ScopedNodeId & peerId) const
179+
Optional<SessionHandle> CASESessionManager::FindExistingSession(const ScopedNodeId & peerId,
180+
const TransportPayloadCapability transportPayloadCapability) const
186181
{
187-
return mConfig.sessionInitParams.sessionManager->FindSecureSessionForNode(peerId,
188-
MakeOptional(Transport::SecureSession::Type::kCASE));
182+
return mConfig.sessionInitParams.sessionManager->FindSecureSessionForNode(
183+
peerId, MakeOptional(Transport::SecureSession::Type::kCASE), transportPayloadCapability);
189184
}
190185

191186
void CASESessionManager::ReleaseSession(OperationalSessionSetup * session)

src/app/CASESessionManager.h

+19-16
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include <lib/support/Pool.h>
2727
#include <platform/CHIPDeviceLayer.h>
2828
#include <transport/SessionDelegate.h>
29+
#include <transport/SessionManager.h>
2930
#include <transport/SessionUpdateDelegate.h>
3031

3132
namespace chip {
@@ -78,12 +79,11 @@ class CASESessionManager : public OperationalSessionReleaseDelegate, public Sess
7879
* setup is not successful.
7980
*/
8081
void FindOrEstablishSession(const ScopedNodeId & peerId, Callback::Callback<OnDeviceConnected> * onConnection,
81-
Callback::Callback<OnDeviceConnectionFailure> * onFailure
82+
Callback::Callback<OnDeviceConnectionFailure> * onFailure,
8283
#if CHIP_DEVICE_CONFIG_ENABLE_AUTOMATIC_CASE_RETRIES
83-
,
84-
uint8_t attemptCount = 1, Callback::Callback<OnDeviceConnectionRetry> * onRetry = nullptr
84+
uint8_t attemptCount = 1, Callback::Callback<OnDeviceConnectionRetry> * onRetry = nullptr,
8585
#endif // CHIP_DEVICE_CONFIG_ENABLE_AUTOMATIC_CASE_RETRIES
86-
);
86+
TransportPayloadCapability transportPayloadCapability = TransportPayloadCapability::kMRPPayload);
8787

8888
/**
8989
* Find an existing session for the given node ID or trigger a new session request.
@@ -106,14 +106,14 @@ class CASESessionManager : public OperationalSessionReleaseDelegate, public Sess
106106
* @param onSetupFailure A callback to be called upon an extended device connection failure.
107107
* @param attemptCount The number of retry attempts if session setup fails (default is 1).
108108
* @param onRetry A callback to be called on a retry attempt (enabled by a config flag).
109+
* @param transportPayloadCapability An indicator of what payload types the session needs to be able to transport.
109110
*/
110111
void FindOrEstablishSession(const ScopedNodeId & peerId, Callback::Callback<OnDeviceConnected> * onConnection,
111-
Callback::Callback<OperationalSessionSetup::OnSetupFailure> * onSetupFailure
112+
Callback::Callback<OperationalSessionSetup::OnSetupFailure> * onSetupFailure,
112113
#if CHIP_DEVICE_CONFIG_ENABLE_AUTOMATIC_CASE_RETRIES
113-
,
114-
uint8_t attemptCount = 1, Callback::Callback<OnDeviceConnectionRetry> * onRetry = nullptr
114+
uint8_t attemptCount = 1, Callback::Callback<OnDeviceConnectionRetry> * onRetry = nullptr,
115115
#endif // CHIP_DEVICE_CONFIG_ENABLE_AUTOMATIC_CASE_RETRIES
116-
);
116+
TransportPayloadCapability transportPayloadCapability = TransportPayloadCapability::kMRPPayload);
117117

118118
/**
119119
* Find an existing session for the given node ID or trigger a new session request.
@@ -134,13 +134,13 @@ class CASESessionManager : public OperationalSessionReleaseDelegate, public Sess
134134
* @param onConnection A callback to be called upon successful connection establishment.
135135
* @param attemptCount The number of retry attempts if session setup fails (default is 1).
136136
* @param onRetry A callback to be called on a retry attempt (enabled by a config flag).
137+
* @param transportPayloadCapability An indicator of what payload types the session needs to be able to transport.
137138
*/
138-
void FindOrEstablishSession(const ScopedNodeId & peerId, Callback::Callback<OnDeviceConnected> * onConnection, std::nullptr_t
139+
void FindOrEstablishSession(const ScopedNodeId & peerId, Callback::Callback<OnDeviceConnected> * onConnection, std::nullptr_t,
139140
#if CHIP_DEVICE_CONFIG_ENABLE_AUTOMATIC_CASE_RETRIES
140-
,
141-
uint8_t attemptCount = 1, Callback::Callback<OnDeviceConnectionRetry> * onRetry = nullptr
141+
uint8_t attemptCount = 1, Callback::Callback<OnDeviceConnectionRetry> * onRetry = nullptr,
142142
#endif // CHIP_DEVICE_CONFIG_ENABLE_AUTOMATIC_CASE_RETRIES
143-
);
143+
TransportPayloadCapability transportPayloadCapability = TransportPayloadCapability::kMRPPayload);
144144

145145
void ReleaseSessionsForFabric(FabricIndex fabricIndex);
146146

@@ -154,7 +154,8 @@ class CASESessionManager : public OperationalSessionReleaseDelegate, public Sess
154154
* an ongoing session with the peer node. If the session doesn't exist, the API will return
155155
* `CHIP_ERROR_NOT_CONNECTED` error.
156156
*/
157-
CHIP_ERROR GetPeerAddress(const ScopedNodeId & peerId, Transport::PeerAddress & addr);
157+
CHIP_ERROR GetPeerAddress(const ScopedNodeId & peerId, Transport::PeerAddress & addr,
158+
TransportPayloadCapability transportPayloadCapability = TransportPayloadCapability::kMRPPayload);
158159

159160
//////////// OperationalSessionReleaseDelegate Implementation ///////////////
160161
void ReleaseSession(OperationalSessionSetup * device) override;
@@ -165,15 +166,17 @@ class CASESessionManager : public OperationalSessionReleaseDelegate, public Sess
165166
private:
166167
OperationalSessionSetup * FindExistingSessionSetup(const ScopedNodeId & peerId, bool forAddressUpdate = false) const;
167168

168-
Optional<SessionHandle> FindExistingSession(const ScopedNodeId & peerId) const;
169+
Optional<SessionHandle> FindExistingSession(
170+
const ScopedNodeId & peerId,
171+
const TransportPayloadCapability transportPayloadCapability = TransportPayloadCapability::kMRPPayload) const;
169172

170173
void FindOrEstablishSessionHelper(const ScopedNodeId & peerId, Callback::Callback<OnDeviceConnected> * onConnection,
171174
Callback::Callback<OnDeviceConnectionFailure> * onFailure,
172175
Callback::Callback<OperationalSessionSetup::OnSetupFailure> * onSetupFailure,
173176
#if CHIP_DEVICE_CONFIG_ENABLE_AUTOMATIC_CASE_RETRIES
174-
uint8_t attemptCount, Callback::Callback<OnDeviceConnectionRetry> * onRetry
177+
uint8_t attemptCount, Callback::Callback<OnDeviceConnectionRetry> * onRetry,
175178
#endif
176-
);
179+
TransportPayloadCapability transportPayloadCapability);
177180

178181
CASESessionManagerConfig mConfig;
179182
};

src/app/OperationalSessionSetup.cpp

+21-7
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,8 @@ bool OperationalSessionSetup::AttachToExistingSecureSession()
7676
mState == State::WaitingForRetry,
7777
false);
7878

79-
auto sessionHandle =
80-
mInitParams.sessionManager->FindSecureSessionForNode(mPeerId, MakeOptional(Transport::SecureSession::Type::kCASE));
79+
auto sessionHandle = mInitParams.sessionManager->FindSecureSessionForNode(
80+
mPeerId, MakeOptional(Transport::SecureSession::Type::kCASE), mTransportPayloadCapability);
8181
if (!sessionHandle.HasValue())
8282
return false;
8383

@@ -93,11 +93,13 @@ bool OperationalSessionSetup::AttachToExistingSecureSession()
9393

9494
void OperationalSessionSetup::Connect(Callback::Callback<OnDeviceConnected> * onConnection,
9595
Callback::Callback<OnDeviceConnectionFailure> * onFailure,
96-
Callback::Callback<OnSetupFailure> * onSetupFailure)
96+
Callback::Callback<OnSetupFailure> * onSetupFailure,
97+
TransportPayloadCapability transportPayloadCapability)
9798
{
9899
CHIP_ERROR err = CHIP_NO_ERROR;
99100
bool isConnected = false;
100101

102+
mTransportPayloadCapability = transportPayloadCapability;
101103
//
102104
// Always enqueue our user provided callbacks into our callback list.
103105
// If anything goes wrong below, we'll trigger failures (including any queued from
@@ -180,15 +182,17 @@ void OperationalSessionSetup::Connect(Callback::Callback<OnDeviceConnected> * on
180182
}
181183

182184
void OperationalSessionSetup::Connect(Callback::Callback<OnDeviceConnected> * onConnection,
183-
Callback::Callback<OnDeviceConnectionFailure> * onFailure)
185+
Callback::Callback<OnDeviceConnectionFailure> * onFailure,
186+
TransportPayloadCapability transportPayloadCapability)
184187
{
185-
Connect(onConnection, onFailure, nullptr);
188+
Connect(onConnection, onFailure, nullptr, transportPayloadCapability);
186189
}
187190

188191
void OperationalSessionSetup::Connect(Callback::Callback<OnDeviceConnected> * onConnection,
189-
Callback::Callback<OnSetupFailure> * onSetupFailure)
192+
Callback::Callback<OnSetupFailure> * onSetupFailure,
193+
TransportPayloadCapability transportPayloadCapability)
190194
{
191-
Connect(onConnection, nullptr, onSetupFailure);
195+
Connect(onConnection, nullptr, onSetupFailure, transportPayloadCapability);
192196
}
193197

194198
void OperationalSessionSetup::UpdateDeviceData(const Transport::PeerAddress & addr, const ReliableMessageProtocolConfig & config)
@@ -288,6 +292,16 @@ void OperationalSessionSetup::UpdateDeviceData(const Transport::PeerAddress & ad
288292

289293
CHIP_ERROR OperationalSessionSetup::EstablishConnection(const ReliableMessageProtocolConfig & config)
290294
{
295+
#if INET_CONFIG_ENABLE_TCP_ENDPOINT
296+
// TODO: Combine LargePayload flag with DNS-SD advertisements from peer.
297+
// Issue #32348.
298+
if (mTransportPayloadCapability == TransportPayloadCapability::kLargePayload)
299+
{
300+
// Set the transport type for carrying large payloads
301+
mDeviceAddress.SetTransportType(chip::Transport::Type::kTcp);
302+
}
303+
#endif
304+
291305
mCASEClient = mClientPool->Allocate();
292306
ReturnErrorCodeIf(mCASEClient == nullptr, CHIP_ERROR_NO_MEMORY);
293307

0 commit comments

Comments
 (0)