Skip to content

Commit 4c41062

Browse files
committedAug 23, 2024
Mitigation to unauthenticated TCP support advertisement in DNS-SD
that made it susceptible to potential DoS attacks. As part of this resolution, Add TCP support and Max receive size info within negotiated CASE Session parameters. --Nodes publish TCP support information during CASE session(over MRP) negotiations. --Add TCP param storage logic to persist received TCP support info to storage during CASE session establishment and retrieve it during future TCP session setup. --During TCP session setup, first check if the TCP support info for peer is available in storage before, going to the DNS-SD advertised values.
1 parent 96ee61e commit 4c41062

20 files changed

+984
-18
lines changed
 

‎src/app/OperationalSessionSetup.cpp

+34-10
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
#include <lib/address_resolve/AddressResolve.h>
3434
#include <lib/core/CHIPCore.h>
3535
#include <lib/core/CHIPEncoding.h>
36+
#include <lib/dnssd/Advertiser.h>
3637
#include <lib/dnssd/Resolver.h>
3738
#include <lib/support/CodeUtils.h>
3839
#include <lib/support/logging/CHIPLogging.h>
@@ -300,19 +301,42 @@ CHIP_ERROR OperationalSessionSetup::EstablishConnection(const ResolveResult & re
300301
#if INET_CONFIG_ENABLE_TCP_ENDPOINT
301302
if (mTransportPayloadCapability == TransportPayloadCapability::kLargePayload)
302303
{
303-
if (result.supportsTcpServer)
304+
// First check if the TCPSupport information is available from prior
305+
// CASE session negotiations with peer.
306+
// Else, fall back to TCP support information from DNS-SD
307+
// advertisements.
308+
uint16_t supportedTransports;
309+
uint32_t maxTCPMessageSize;
310+
VerifyOrDie(mInitParams.sessionManager != nullptr);
311+
312+
if (mInitParams.sessionManager->GetPeerTCPParamsStorage() != nullptr &&
313+
mInitParams.sessionManager->GetPeerTCPParamsStorage()->FindByScopedNodeId(mPeerId, supportedTransports,
314+
maxTCPMessageSize) == CHIP_NO_ERROR)
304315
{
305-
// Set the transport type for carrying large payloads
306-
mDeviceAddress.SetTransportType(chip::Transport::Type::kTcp);
316+
if ((supportedTransports & to_underlying(Dnssd::TCPModeAdvertise::kTCPServer)) != 0)
317+
{
318+
// Set the transport type for carrying large payloads
319+
mDeviceAddress.SetTransportType(chip::Transport::Type::kTcp);
320+
}
307321
}
308-
else
322+
else // Failed to retrieve TCP Params from storage or TCPParamsStorage
323+
// is not set up
309324
{
310-
// we should not set the large payload while the TCP support is not enabled
311-
ChipLogError(
312-
Discovery,
313-
"LargePayload session requested but peer does not support TCP server, PeerNodeId=" ChipLogFormatScopedNodeId,
314-
ChipLogValueScopedNodeId(mPeerId));
315-
return CHIP_ERROR_INTERNAL;
325+
// Check DNS-SD advertisement values if information not available via CASE session parameters
326+
if (result.supportsTcpServer)
327+
{
328+
// Set the transport type for carrying large payloads
329+
mDeviceAddress.SetTransportType(chip::Transport::Type::kTcp);
330+
}
331+
else
332+
{
333+
// we should not set the large payload while the TCP support is not enabled from the peer's side.
334+
ChipLogError(
335+
Discovery,
336+
"LargePayload session requested but peer does not support TCP server, PeerNodeId=" ChipLogFormatScopedNodeId,
337+
ChipLogValueScopedNodeId(mPeerId));
338+
return CHIP_ERROR_INTERNAL;
339+
}
316340
}
317341
}
318342
#endif

‎src/app/server/Server.cpp

+11
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,9 @@ CHIP_ERROR Server::Init(const ServerInitParams & initParams)
140140
mOperationalKeystore = initParams.operationalKeystore;
141141
mOpCertStore = initParams.opCertStore;
142142
mSessionKeystore = initParams.sessionKeystore;
143+
#if INET_CONFIG_ENABLE_TCP_ENDPOINT
144+
mPeerTCPParamsStorage = initParams.peerTCPParamsStorage;
145+
#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT
143146

144147
if (initParams.certificateValidityPolicy)
145148
{
@@ -278,6 +281,11 @@ CHIP_ERROR Server::Init(const ServerInitParams & initParams)
278281
}
279282
#endif // CHIP_CONFIG_ENABLE_SERVER_IM_EVENT
280283

284+
#if INET_CONFIG_ENABLE_TCP_ENDPOINT
285+
// Set the TCP Params storage after initializing SessionManager
286+
mSessions.SetPeerTCPParamsStorage(mPeerTCPParamsStorage);
287+
#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT
288+
281289
// This initializes clusters, so should come after lower level initialization.
282290
InitDataModelHandler();
283291

@@ -788,5 +796,8 @@ Crypto::DefaultSessionKeystore CommonCaseDeviceServerInitParams::sSessionKeystor
788796
#if CHIP_CONFIG_ENABLE_ICD_CIP
789797
app::DefaultICDCheckInBackOffStrategy CommonCaseDeviceServerInitParams::sDefaultICDCheckInBackOffStrategy;
790798
#endif
799+
#if INET_CONFIG_ENABLE_TCP_ENDPOINT
800+
Transport::PeerTCPParamsStorage CommonCaseDeviceServerInitParams::sPeerTCPParamsStorage;
801+
#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT
791802

792803
} // namespace chip

‎src/app/server/Server.h

+19
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,9 @@
7171
#include <app/TimerDelegates.h>
7272
#include <app/reporting/ReportSchedulerImpl.h>
7373
#include <transport/raw/UDP.h>
74+
#if INET_CONFIG_ENABLE_TCP_ENDPOINT
75+
#include <transport/raw/PeerTCPParamsStorage.h>
76+
#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT
7477

7578
#include <app/icd/server/ICDCheckInBackOffStrategy.h>
7679
#if CHIP_CONFIG_ENABLE_ICD_SERVER
@@ -179,6 +182,11 @@ struct ServerInitParams
179182
// Optional. Support for the ICD Check-In BackOff strategy. Must be initialized before being provided.
180183
// If the ICD Check-In protocol use-case is supported and no strategy is provided, server will use the default strategy.
181184
app::ICDCheckInBackOffStrategy * icdCheckInBackOffStrategy = nullptr;
185+
#if INET_CONFIG_ENABLE_TCP_ENDPOINT
186+
// Optional. Support Peer node's TCP Params when provided.
187+
// Must be initialized before being provided.
188+
chip::Transport::TCPParamsStorageInterface * peerTCPParamsStorage = nullptr;
189+
#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT
182190
};
183191

184192
/**
@@ -300,6 +308,11 @@ struct CommonCaseDeviceServerInitParams : public ServerInitParams
300308
}
301309
#endif
302310

311+
#if INET_CONFIG_ENABLE_TCP_ENDPOINT
312+
ReturnErrorOnFailure(sPeerTCPParamsStorage.Init(this->persistentStorageDelegate));
313+
this->peerTCPParamsStorage = &sPeerTCPParamsStorage;
314+
#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT
315+
303316
return CHIP_NO_ERROR;
304317
}
305318

@@ -311,6 +324,9 @@ struct CommonCaseDeviceServerInitParams : public ServerInitParams
311324
static chip::app::DefaultTimerDelegate sTimerDelegate;
312325
static app::reporting::ReportSchedulerImpl sReportScheduler;
313326

327+
#if INET_CONFIG_ENABLE_TCP_ENDPOINT
328+
static chip::Transport::PeerTCPParamsStorage sPeerTCPParamsStorage;
329+
#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT
314330
#if CHIP_CONFIG_ENABLE_SESSION_RESUMPTION
315331
static SimpleSessionResumptionStorage sSessionResumptionStorage;
316332
#endif
@@ -675,6 +691,9 @@ class Server
675691
GroupDataProviderListener mListener;
676692
ServerFabricDelegate mFabricDelegate;
677693
app::reporting::ReportScheduler * mReportScheduler;
694+
#if INET_CONFIG_ENABLE_TCP_ENDPOINT
695+
chip::Transport::TCPParamsStorageInterface * mPeerTCPParamsStorage;
696+
#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT
678697

679698
Access::AccessControl mAccessControl;
680699
app::AclStorage * mAclStorage;

‎src/controller/CHIPDeviceControllerFactory.cpp

+32-1
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@
3939
#include <app/server/Dnssd.h>
4040
#include <protocols/secure_channel/CASEServer.h>
4141
#include <protocols/secure_channel/SimpleSessionResumptionStorage.h>
42+
#if INET_CONFIG_ENABLE_TCP_ENDPOINT
43+
#include <transport/raw/PeerTCPParamsStorage.h>
44+
#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT
4245

4346
using namespace chip::Inet;
4447
using namespace chip::System;
@@ -68,6 +71,9 @@ CHIP_ERROR DeviceControllerFactory::Init(FactoryInitParams params)
6871
mSessionResumptionStorage = params.sessionResumptionStorage;
6972
mEnableServerInteractions = params.enableServerInteractions;
7073

74+
#if INET_CONFIG_ENABLE_TCP_ENDPOINT
75+
mPeerTCPParamsStorage = params.peerTCPParamsStorage;
76+
#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT
7177
// Initialize the system state. Note that it is left in a somewhat
7278
// special state where it is initialized, but has a ref count of 0.
7379
CHIP_ERROR err = InitSystemState(params);
@@ -84,7 +90,8 @@ CHIP_ERROR DeviceControllerFactory::ReinitSystemStateIfNecessary()
8490
params.systemLayer = mSystemState->SystemLayer();
8591
params.udpEndPointManager = mSystemState->UDPEndPointManager();
8692
#if INET_CONFIG_ENABLE_TCP_ENDPOINT
87-
params.tcpEndPointManager = mSystemState->TCPEndPointManager();
93+
params.tcpEndPointManager = mSystemState->TCPEndPointManager();
94+
params.peerTCPParamsStorage = mPeerTCPParamsStorage;
8895
#endif
8996
#if CONFIG_NETWORK_LAYER_BLE
9097
params.bleLayer = mSystemState->BleLayer();
@@ -238,6 +245,27 @@ CHIP_ERROR DeviceControllerFactory::InitSystemState(FactoryInitParams params)
238245
ReturnErrorOnFailure(stateParams.unsolicitedStatusHandler->Init(stateParams.exchangeMgr));
239246
ReturnErrorOnFailure(stateParams.bdxTransferServer->Init(stateParams.systemLayer, stateParams.exchangeMgr));
240247

248+
#if INET_CONFIG_ENABLE_TCP_ENDPOINT
249+
chip::Transport::TCPParamsStorageInterface * peerTCPParamsStorage;
250+
if (params.peerTCPParamsStorage == nullptr)
251+
{
252+
auto ownedPeerTCPParamStorage = chip::Platform::MakeUnique<chip::Transport::PeerTCPParamsStorage>();
253+
ReturnErrorOnFailure(ownedPeerTCPParamStorage->Init(params.fabricIndependentStorage));
254+
stateParams.ownedPeerTCPParamsStorage = std::move(ownedPeerTCPParamStorage);
255+
stateParams.peerTCPParamsStorage = nullptr;
256+
peerTCPParamsStorage = stateParams.ownedPeerTCPParamsStorage.get();
257+
}
258+
else
259+
{
260+
stateParams.ownedPeerTCPParamsStorage = nullptr;
261+
stateParams.peerTCPParamsStorage = params.peerTCPParamsStorage;
262+
peerTCPParamsStorage = stateParams.peerTCPParamsStorage;
263+
}
264+
265+
// Set the TCP Params storage after initializing SessionManager
266+
stateParams.sessionMgr->SetPeerTCPParamsStorage(peerTCPParamsStorage);
267+
#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT
268+
241269
InitDataModelHandler();
242270

243271
ReturnErrorOnFailure(Dnssd::Resolver::Instance().Init(stateParams.udpEndPointManager));
@@ -429,6 +457,9 @@ void DeviceControllerFactory::Shutdown()
429457
mOpCertStore = nullptr;
430458
mCertificateValidityPolicy = nullptr;
431459
mSessionResumptionStorage = nullptr;
460+
#if INET_CONFIG_ENABLE_TCP_ENDPOINT
461+
mPeerTCPParamsStorage = nullptr;
462+
#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT
432463
}
433464

434465
void DeviceControllerSystemState::Shutdown()

‎src/controller/CHIPDeviceControllerFactory.h

+10-1
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,9 @@
3535
#include <credentials/OperationalCertificateStore.h>
3636
#include <credentials/attestation_verifier/DeviceAttestationVerifier.h>
3737
#include <protocols/secure_channel/SessionResumptionStorage.h>
38+
#if INET_CONFIG_ENABLE_TCP_ENDPOINT
39+
#include <transport/raw/TCPParamsStorageInterface.h>
40+
#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT
3841

3942
namespace chip {
4043

@@ -148,6 +151,9 @@ struct FactoryInitParams
148151
#if CHIP_DEVICE_CONFIG_ENABLE_WIFIPAF
149152
Transport::WiFiPAFLayer * wifipaf_layer = nullptr;
150153
#endif
154+
#if INET_CONFIG_ENABLE_TCP_ENDPOINT
155+
chip::Transport::TCPParamsStorageInterface * peerTCPParamsStorage = nullptr;
156+
#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT
151157

152158
//
153159
// Controls enabling server cluster interactions on a controller. This in turn
@@ -292,7 +298,10 @@ class DeviceControllerFactory
292298
Credentials::OperationalCertificateStore * mOpCertStore = nullptr;
293299
Credentials::CertificateValidityPolicy * mCertificateValidityPolicy = nullptr;
294300
SessionResumptionStorage * mSessionResumptionStorage = nullptr;
295-
bool mEnableServerInteractions = false;
301+
#if INET_CONFIG_ENABLE_TCP_ENDPOINT
302+
chip::Transport::TCPParamsStorageInterface * mPeerTCPParamsStorage = nullptr;
303+
#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT
304+
bool mEnableServerInteractions = false;
296305
};
297306

298307
} // namespace Controller

‎src/controller/CHIPDeviceControllerSystemState.h

+22
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,9 @@
4141
#include <protocols/secure_channel/MessageCounterManager.h>
4242
#include <protocols/secure_channel/SimpleSessionResumptionStorage.h>
4343
#include <protocols/secure_channel/UnsolicitedStatusHandler.h>
44+
#if INET_CONFIG_ENABLE_TCP_ENDPOINT
45+
#include <transport/raw/PeerTCPParamsStorage.h>
46+
#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT
4447

4548
#include <transport/TransportMgr.h>
4649
#include <transport/raw/UDP.h>
@@ -135,6 +138,10 @@ struct DeviceControllerSystemStateParams
135138
FabricTable::Delegate * fabricTableDelegate = nullptr;
136139
chip::app::reporting::ReportScheduler::TimerDelegate * timerDelegate = nullptr;
137140
chip::app::reporting::ReportScheduler * reportScheduler = nullptr;
141+
#if INET_CONFIG_ENABLE_TCP_ENDPOINT
142+
chip::Transport::TCPParamsStorageInterface * peerTCPParamsStorage = nullptr;
143+
Platform::UniquePtr<chip::Transport::PeerTCPParamsStorage> ownedPeerTCPParamsStorage;
144+
#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT
138145
};
139146

140147
// A representation of the internal state maintained by the DeviceControllerFactory.
@@ -182,6 +189,17 @@ class DeviceControllerSystemState
182189
#if CONFIG_NETWORK_LAYER_BLE
183190
mBleLayer = params.bleLayer;
184191
#endif
192+
#if INET_CONFIG_ENABLE_TCP_ENDPOINT
193+
mOwnedPeerTCPParamsStorage = std::move(params.ownedPeerTCPParamsStorage);
194+
if (mOwnedPeerTCPParamsStorage)
195+
{
196+
mPeerTCPParamsStorage = mOwnedPeerTCPParamsStorage.get();
197+
}
198+
else
199+
{
200+
mPeerTCPParamsStorage = params.peerTCPParamsStorage;
201+
}
202+
#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT
185203
VerifyOrDie(IsInitialized());
186204
};
187205

@@ -273,6 +291,10 @@ class DeviceControllerSystemState
273291
FabricTable::Delegate * mFabricTableDelegate = nullptr;
274292
SessionResumptionStorage * mSessionResumptionStorage = nullptr;
275293
Platform::UniquePtr<SimpleSessionResumptionStorage> mOwnedSessionResumptionStorage;
294+
#if INET_CONFIG_ENABLE_TCP_ENDPOINT
295+
chip::Transport::TCPParamsStorageInterface * mPeerTCPParamsStorage = nullptr;
296+
Platform::UniquePtr<chip::Transport::PeerTCPParamsStorage> mOwnedPeerTCPParamsStorage;
297+
#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT
276298

277299
// If mTempFabricTable is not null, it was created during
278300
// DeviceControllerFactory::InitSystemState and needs to be

‎src/controller/python/chip/utils/DeviceProxyUtils.cpp

+9
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,10 @@ struct __attribute__((packed)) SessionParametersStruct
4444
uint16_t interactionModelRevision = 0;
4545
uint32_t specificationVersion = 0;
4646
uint16_t maxPathsPerInvoke = 0;
47+
#if INET_CONFIG_ENABLE_TCP_ENDPOINT
48+
uint16_t supportedTransports = 0;
49+
uint32_t maxTCPMessageSize = 0;
50+
#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT
4751
};
4852

4953
} // namespace python
@@ -99,6 +103,11 @@ PyChipError pychip_DeviceProxy_GetRemoteSessionParameters(DeviceProxy * device,
99103
sessionParam->interactionModelRevision = remoteSessionParameters.GetInteractionModelRevision().ValueOr(0);
100104
sessionParam->specificationVersion = remoteSessionParameters.GetSpecificationVersion().ValueOr(0);
101105
sessionParam->maxPathsPerInvoke = remoteSessionParameters.GetMaxPathsPerInvoke();
106+
#if INET_CONFIG_ENABLE_TCP_ENDPOINT
107+
sessionParam->supportedTransports = remoteSessionParameters.GetSupportedTransports().ValueOr(0);
108+
sessionParam->maxTCPMessageSize =
109+
remoteSessionParameters.GetMaxTCPMessageSize().ValueOr(System::PacketBuffer::kLargeBufMaxSizeWithoutReserve - 4);
110+
#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT
102111
return ToPyChipError(CHIP_NO_ERROR);
103112
}
104113
}

‎src/lib/support/DefaultStorageKeyAllocator.h

+8
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,14 @@ class DefaultStorageKeyAllocator
256256
// when new fabric is created, this list needs to be updated,
257257
// when client init DefaultICDClientStorage, this table needs to be loaded.
258258
static StorageKeyName ICDFabricList() { return StorageKeyName::FromConst("g/icdfl"); }
259+
260+
// TCP peer parameters
261+
static StorageKeyName TCPPeerParams(FabricIndex fabric, NodeId nodeId)
262+
{
263+
return StorageKeyName::Formatted("f/%x/tcp/%08" PRIX32 "%08" PRIX32, fabric, static_cast<uint32_t>(nodeId >> 32),
264+
static_cast<uint32_t>(nodeId));
265+
}
266+
static StorageKeyName TCPPeerList() { return StorageKeyName::FromConst("g/tcpl"); }
259267
};
260268

261269
} // namespace chip

‎src/messaging/SessionParameters.h

+24-1
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,19 @@ class SessionParameters
4141
static constexpr size_t kSizeOfInteractionModelRevision = sizeof(uint16_t);
4242
static constexpr size_t kSizeOfSpecificationVersion = sizeof(uint32_t);
4343
static constexpr size_t kSizeOfMaxPathsPerInvoke = sizeof(uint16_t);
44+
#if INET_CONFIG_ENABLE_TCP_ENDPOINT
45+
static constexpr size_t kSizeOfSupportedTransports = sizeof(uint16_t);
46+
static constexpr size_t kSizeOfMaxTCPMessageSize = sizeof(uint32_t);
47+
#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT
4448

4549
static constexpr size_t kEstimatedTLVSize = TLV::EstimateStructOverhead(
4650
kSizeOfSessionIdleInterval, kSizeOfSessionActiveInterval, kSizeOfSessionActiveThreshold, kSizeOfDataModelRevision,
47-
kSizeOfInteractionModelRevision, kSizeOfSpecificationVersion, kSizeOfMaxPathsPerInvoke);
51+
kSizeOfInteractionModelRevision, kSizeOfSpecificationVersion, kSizeOfMaxPathsPerInvoke
52+
#if INET_CONFIG_ENABLE_TCP_ENDPOINT
53+
,
54+
kSizeOfSupportedTransports, kSizeOfMaxTCPMessageSize
55+
#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT
56+
);
4857

4958
// From Section 4.12.8 "Parameters and Constants" in chapter "Secure Channel".
5059
enum Tag : uint32_t
@@ -56,6 +65,8 @@ class SessionParameters
5665
kInteractionModelRevision = 5,
5766
kSpecificationVersion = 6,
5867
kMaxPathsPerInvoke = 7,
68+
kSupportedTransports = 8,
69+
kMaxTCPMessageSize = 9,
5970
};
6071

6172
const ReliableMessageProtocolConfig & GetMRPConfig() const { return mMRPConfig; }
@@ -91,6 +102,13 @@ class SessionParameters
91102
uint16_t GetMaxPathsPerInvoke() const { return mMaxPathsPerInvoke; }
92103
void SetMaxPathsPerInvoke(const uint16_t maxPathsPerInvoke) { mMaxPathsPerInvoke = maxPathsPerInvoke; }
93104

105+
#if INET_CONFIG_ENABLE_TCP_ENDPOINT
106+
const Optional<uint16_t> & GetSupportedTransports() const { return mSupportedTransports; }
107+
void SetSupportedTransports(const uint16_t supportedTransports) { mSupportedTransports = MakeOptional(supportedTransports); }
108+
109+
const Optional<uint32_t> & GetMaxTCPMessageSize() const { return mMaxTCPMessageSize; }
110+
void SetMaxTCPMessageSize(const uint32_t maxTCPMessageSize) { mMaxTCPMessageSize = MakeOptional(maxTCPMessageSize); }
111+
#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT
94112
private:
95113
ReliableMessageProtocolConfig mMRPConfig;
96114
// For legacy reasons if we do not get DataModelRevision it means either 16 or 17. But there isn't
@@ -104,6 +122,11 @@ class SessionParameters
104122
Optional<uint32_t> mSpecificationVersion;
105123
// When maxPathsPerInvoke is not provided legacy is always 1
106124
uint16_t mMaxPathsPerInvoke = 1;
125+
126+
#if INET_CONFIG_ENABLE_TCP_ENDPOINT
127+
Optional<uint16_t> mSupportedTransports;
128+
Optional<uint32_t> mMaxTCPMessageSize;
129+
#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT
107130
};
108131

109132
} // namespace chip

0 commit comments

Comments
 (0)