Line data Source code
1 : /*
2 : *
3 : * Copyright (c) 2021,2024 Project CHIP Authors
4 : *
5 : * Licensed under the Apache License, Version 2.0 (the "License");
6 : * you may not use this file except in compliance with the License.
7 : * You may obtain a copy of the License at
8 : *
9 : * http://www.apache.org/licenses/LICENSE-2.0
10 : *
11 : * Unless required by applicable law or agreed to in writing, software
12 : * distributed under the License is distributed on an "AS IS" BASIS,
13 : * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 : * See the License for the specific language governing permissions and
15 : * limitations under the License.
16 : */
17 :
18 : /**
19 : * @file
20 : * Defines the public interface for the Device Layer DiagnosticDataProvider object.
21 : */
22 :
23 : #pragma once
24 :
25 : #include <app-common/zap-generated/cluster-objects.h>
26 : #include <inet/InetInterface.h>
27 : #include <lib/core/ClusterEnums.h>
28 : #include <platform/CHIPDeviceConfig.h>
29 : #include <platform/GeneralFaults.h>
30 :
31 : namespace chip {
32 : namespace DeviceLayer {
33 :
34 : // Maximum length of vendor defined name or prefix of the software thread that is
35 : // static for the duration of the thread.
36 : static constexpr size_t kMaxThreadNameLength = 8;
37 : // 48-bit IEEE MAC Address or a 64-bit IEEE MAC Address (e.g. EUI-64).
38 : inline constexpr size_t kMaxHardwareAddrSize = 8;
39 :
40 : inline constexpr size_t kMaxIPv4AddrSize = 4;
41 : inline constexpr size_t kMaxIPv6AddrSize = 16;
42 : inline constexpr size_t kMaxIPv4AddrCount = 4;
43 : inline constexpr size_t kMaxIPv6AddrCount = 8;
44 :
45 : using BootReasonType = app::Clusters::GeneralDiagnostics::BootReasonEnum;
46 :
47 : struct ThreadMetrics : public app::Clusters::SoftwareDiagnostics::Structs::ThreadMetricsStruct::Type
48 : {
49 : char NameBuf[kMaxThreadNameLength + 1];
50 : ThreadMetrics * Next; /* Pointer to the next structure. */
51 : };
52 :
53 : struct NetworkInterface : public app::Clusters::GeneralDiagnostics::Structs::NetworkInterface::Type
54 : {
55 : char Name[Inet::InterfaceId::kMaxIfNameLength];
56 : uint8_t MacAddress[kMaxHardwareAddrSize];
57 : uint8_t Ipv4AddressesBuffer[kMaxIPv4AddrCount][kMaxIPv4AddrSize];
58 : uint8_t Ipv6AddressesBuffer[kMaxIPv6AddrCount][kMaxIPv6AddrSize];
59 : chip::ByteSpan Ipv4AddressSpans[kMaxIPv4AddrCount];
60 : chip::ByteSpan Ipv6AddressSpans[kMaxIPv6AddrCount];
61 : NetworkInterface * Next = nullptr; /* Pointer to the next structure. */
62 : };
63 :
64 : class DiagnosticDataProviderImpl;
65 :
66 : /**
67 : * Defines the WiFi Diagnostics Delegate class to notify WiFi network events.
68 : */
69 : class WiFiDiagnosticsDelegate
70 : {
71 : public:
72 : virtual ~WiFiDiagnosticsDelegate() {}
73 :
74 : /**
75 : * @brief
76 : * Called when the Node detects Node’s Wi-Fi connection has been disconnected.
77 : */
78 : virtual void OnDisconnectionDetected(uint16_t reasonCode) {}
79 :
80 : /**
81 : * @brief
82 : * Called when the Node fails to associate or authenticate an access point.
83 : */
84 : virtual void OnAssociationFailureDetected(uint8_t associationFailureCause, uint16_t status) {}
85 :
86 : /**
87 : * @brief
88 : * Called when the Node’s connection status to a Wi-Fi network has changed.
89 : */
90 : virtual void OnConnectionStatusChanged(uint8_t connectionStatus) {}
91 : };
92 :
93 : /**
94 : * Defines the Thread Diagnostics Delegate class to notify Thread network events.
95 : */
96 : class ThreadDiagnosticsDelegate
97 : {
98 : public:
99 : virtual ~ThreadDiagnosticsDelegate() {}
100 :
101 : /**
102 : * @brief
103 : * Called when the Node’s connection status to a Thread network has changed.
104 : */
105 : virtual void OnConnectionStatusChanged(app::Clusters::ThreadNetworkDiagnostics::ConnectionStatusEnum newConnectionStatus) {}
106 :
107 : /**
108 : * @brief
109 : * Called when the Node detects change in the set of current Thread network faults.
110 : */
111 : virtual void OnNetworkFaultChanged(const GeneralFaults<kMaxNetworkFaults> & previous,
112 : const GeneralFaults<kMaxNetworkFaults> & current)
113 : {}
114 : };
115 :
116 : /**
117 : * Provides access to runtime and build-time configuration information for a chip device.
118 : */
119 : class DiagnosticDataProvider
120 : {
121 : public:
122 : void SetWiFiDiagnosticsDelegate(WiFiDiagnosticsDelegate * delegate) { mWiFiDiagnosticsDelegate = delegate; }
123 0 : WiFiDiagnosticsDelegate * GetWiFiDiagnosticsDelegate() const { return mWiFiDiagnosticsDelegate; }
124 : void SetThreadDiagnosticsDelegate(ThreadDiagnosticsDelegate * delegate) { mThreadDiagnosticsDelegate = delegate; }
125 : ThreadDiagnosticsDelegate * GetThreadDiagnosticsDelegate() const { return mThreadDiagnosticsDelegate; }
126 :
127 : /**
128 : * General Diagnostics methods.
129 : */
130 :
131 : /**
132 : * @brief Obtain the number of times the node has rebooted.
133 : * The reboot count value will be reset only upon a factory reset of the node.
134 : *
135 : * @param[out] rebootCount Reference to location where the reboot count integer will be copied.
136 : */
137 : virtual CHIP_ERROR GetRebootCount(uint16_t & rebootCount);
138 :
139 : /**
140 : * @brief Obtain the time (in seconds) since the node's last reboot.
141 : * The up time value will be reset upon a node reboot.
142 : *
143 : * @param[out] upTime Reference to location where the up time integer will be copied.
144 : */
145 : virtual CHIP_ERROR GetUpTime(uint64_t & upTime);
146 :
147 : /**
148 : * @brief Obtain the total time (in hours) the node has been operational.
149 : * The total operational hours value will be reset only upon a factory reset of the node.
150 : *
151 : * @param[out] totalOperationalHours Reference to location where the total operation hours integer will be copied.
152 : */
153 : virtual CHIP_ERROR GetTotalOperationalHours(uint32_t & totalOperationalHours);
154 :
155 : /**
156 : * @brief Obtain the reason for the node's most recent reboot.
157 : *
158 : * @param[out] bootReason Reference to location where the boot reason enum value will be copied.
159 : */
160 : virtual CHIP_ERROR GetBootReason(BootReasonType & bootReason);
161 :
162 : /**
163 : * @brief Obtain the set of hardware faults currently detected by the node.
164 : *
165 : * @param[out] hardwareFaults Reference to location of a GeneralFaults instance.
166 : * The instance can be populated by sequentially calling add method.
167 : */
168 : virtual CHIP_ERROR GetActiveHardwareFaults(GeneralFaults<kMaxHardwareFaults> & hardwareFaults);
169 :
170 : /**
171 : * @brief Obtain the set of radio faults currently detected by the node.
172 : *
173 : * @param[out] radioFaults Reference to location of a GeneralFaults instance.
174 : * The instance can be populated by sequentially calling add method.
175 : */
176 : virtual CHIP_ERROR GetActiveRadioFaults(GeneralFaults<kMaxRadioFaults> & radioFaults);
177 :
178 : /**
179 : * @brief Obtain the set of network faults currently detected by the node.
180 : *
181 : * @param[out] networkFaults Reference to location of a GeneralFaults instance.
182 : * The instance can be populated by sequentially calling add method.
183 : */
184 : virtual CHIP_ERROR GetActiveNetworkFaults(GeneralFaults<kMaxNetworkFaults> & networkFaults);
185 :
186 : /**
187 : * @brief Obtain the average wear count of the node's persistent storage backend.
188 : *
189 : * @param[out] averageWearCount Reference to location where the average wear count integer will be copied.
190 : */
191 : virtual CHIP_ERROR GetAverageWearCount(uint32_t & averageWearCount);
192 :
193 : /*
194 : * Get the linked list of network interfaces of the current plaform. After usage, each caller of GetNetworkInterfaces
195 : * needs to release the network interface list it gets via ReleaseNetworkInterfaces.
196 : *
197 : */
198 : virtual CHIP_ERROR GetNetworkInterfaces(NetworkInterface ** netifpp);
199 : virtual void ReleaseNetworkInterfaces(NetworkInterface * netifp);
200 :
201 : /**
202 : * Software Diagnostics methods.
203 : */
204 :
205 : /// Feature support - this returns support gor GetCurrentHeapHighWatermark and ResetWatermarks()
206 0 : virtual bool SupportsWatermarks() { return false; }
207 :
208 : virtual CHIP_ERROR GetCurrentHeapFree(uint64_t & currentHeapFree);
209 : virtual CHIP_ERROR GetCurrentHeapUsed(uint64_t & currentHeapUsed);
210 : virtual CHIP_ERROR GetCurrentHeapHighWatermark(uint64_t & currentHeapHighWatermark);
211 : virtual CHIP_ERROR ResetWatermarks();
212 :
213 : /*
214 : * Get the linked list of thread metrics of the current plaform. After usage, each caller of GetThreadMetrics
215 : * needs to release the thread metrics list it gets via ReleaseThreadMetrics.
216 : *
217 : */
218 : virtual CHIP_ERROR GetThreadMetrics(ThreadMetrics ** threadMetricsOut);
219 : virtual void ReleaseThreadMetrics(ThreadMetrics * threadMetrics);
220 :
221 : /**
222 : * Ethernet network diagnostics methods
223 : */
224 : virtual CHIP_ERROR GetEthPHYRate(app::Clusters::EthernetNetworkDiagnostics::PHYRateEnum & pHYRate);
225 : virtual CHIP_ERROR GetEthFullDuplex(bool & fullDuplex);
226 : virtual CHIP_ERROR GetEthCarrierDetect(bool & carrierDetect);
227 : virtual CHIP_ERROR GetEthTimeSinceReset(uint64_t & timeSinceReset);
228 : virtual CHIP_ERROR GetEthPacketRxCount(uint64_t & packetRxCount);
229 : virtual CHIP_ERROR GetEthPacketTxCount(uint64_t & packetTxCount);
230 : virtual CHIP_ERROR GetEthTxErrCount(uint64_t & txErrCount);
231 : virtual CHIP_ERROR GetEthCollisionCount(uint64_t & collisionCount);
232 : virtual CHIP_ERROR GetEthOverrunCount(uint64_t & overrunCount);
233 : virtual CHIP_ERROR ResetEthNetworkDiagnosticsCounts();
234 :
235 : /**
236 : * Wi-Fi network diagnostics methods
237 : */
238 :
239 : /**
240 : * The MutableByteSpan provided to GetWiFiBssId must have size at least
241 : * kMaxHardwareAddrSize. Its size will be set to the actual size of the
242 : * BSSID.
243 : */
244 : virtual CHIP_ERROR GetWiFiBssId(MutableByteSpan & value);
245 : virtual CHIP_ERROR GetWiFiSecurityType(app::Clusters::WiFiNetworkDiagnostics::SecurityTypeEnum & securityType);
246 : virtual CHIP_ERROR GetWiFiVersion(app::Clusters::WiFiNetworkDiagnostics::WiFiVersionEnum & wiFiVersion);
247 : virtual CHIP_ERROR GetWiFiChannelNumber(uint16_t & channelNumber);
248 : virtual CHIP_ERROR GetWiFiRssi(int8_t & rssi);
249 : virtual CHIP_ERROR GetWiFiBeaconLostCount(uint32_t & beaconLostCount);
250 : virtual CHIP_ERROR GetWiFiBeaconRxCount(uint32_t & beaconRxCount);
251 : virtual CHIP_ERROR GetWiFiPacketMulticastRxCount(uint32_t & packetMulticastRxCount);
252 : virtual CHIP_ERROR GetWiFiPacketMulticastTxCount(uint32_t & packetMulticastTxCount);
253 : virtual CHIP_ERROR GetWiFiPacketUnicastRxCount(uint32_t & packetUnicastRxCount);
254 : virtual CHIP_ERROR GetWiFiPacketUnicastTxCount(uint32_t & packetUnicastTxCount);
255 : virtual CHIP_ERROR GetWiFiCurrentMaxRate(uint64_t & currentMaxRate);
256 : virtual CHIP_ERROR GetWiFiOverrunCount(uint64_t & overrunCount);
257 : virtual CHIP_ERROR ResetWiFiNetworkDiagnosticsCounts();
258 :
259 : protected:
260 : // Construction/destruction limited to subclasses.
261 5 : DiagnosticDataProvider() = default;
262 48 : virtual ~DiagnosticDataProvider() = default;
263 :
264 : private:
265 : WiFiDiagnosticsDelegate * mWiFiDiagnosticsDelegate = nullptr;
266 : ThreadDiagnosticsDelegate * mThreadDiagnosticsDelegate = nullptr;
267 :
268 : // No copy, move or assignment.
269 : DiagnosticDataProvider(const DiagnosticDataProvider &) = delete;
270 : DiagnosticDataProvider(const DiagnosticDataProvider &&) = delete;
271 : DiagnosticDataProvider & operator=(const DiagnosticDataProvider &) = delete;
272 : };
273 :
274 : /**
275 : * Returns a reference to the public interface of the DiagnosticDataProvider singleton object.
276 : *
277 : * Applications should use this to access features of the DiagnosticDataProvider object
278 : * that are common to all platforms.
279 : */
280 : DiagnosticDataProvider & GetDiagnosticDataProvider();
281 :
282 : /**
283 : * Returns the platform-specific implementation of the DiagnosticDataProvider singleton object.
284 : *
285 : * Applications can use this to gain access to features of the DiagnosticDataProvider
286 : * that are specific to the selected platform.
287 : */
288 : extern DiagnosticDataProvider & GetDiagnosticDataProviderImpl();
289 :
290 : /**
291 : * Sets a reference to a DiagnosticDataProvider object.
292 : *
293 : * This must be called before any calls to GetDiagnosticDataProvider. If a nullptr is passed in,
294 : * no changes will be made.
295 : */
296 : void SetDiagnosticDataProvider(DiagnosticDataProvider * diagnosticDataProvider);
297 :
298 0 : inline CHIP_ERROR DiagnosticDataProvider::GetCurrentHeapFree(uint64_t & currentHeapFree)
299 : {
300 0 : return CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE;
301 : }
302 :
303 0 : inline CHIP_ERROR DiagnosticDataProvider::GetCurrentHeapUsed(uint64_t & currentHeapUsed)
304 : {
305 0 : return CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE;
306 : }
307 :
308 0 : inline CHIP_ERROR DiagnosticDataProvider::GetCurrentHeapHighWatermark(uint64_t & currentHeapHighWatermark)
309 : {
310 0 : return CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE;
311 : }
312 :
313 0 : inline CHIP_ERROR DiagnosticDataProvider::ResetWatermarks()
314 : {
315 0 : return CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE;
316 : }
317 :
318 0 : inline CHIP_ERROR DiagnosticDataProvider::GetThreadMetrics(ThreadMetrics ** threadMetricsOut)
319 : {
320 0 : return CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE;
321 : }
322 :
323 0 : inline void DiagnosticDataProvider::ReleaseThreadMetrics(ThreadMetrics * threadMetrics) {}
324 :
325 0 : inline CHIP_ERROR DiagnosticDataProvider::GetRebootCount(uint16_t & rebootCount)
326 : {
327 0 : return CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE;
328 : }
329 :
330 0 : inline CHIP_ERROR DiagnosticDataProvider::GetUpTime(uint64_t & upTime)
331 : {
332 0 : return CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE;
333 : }
334 :
335 0 : inline CHIP_ERROR DiagnosticDataProvider::GetTotalOperationalHours(uint32_t & totalOperationalHours)
336 : {
337 0 : return CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE;
338 : }
339 :
340 0 : inline CHIP_ERROR DiagnosticDataProvider::GetBootReason(BootReasonType & bootReason)
341 : {
342 0 : return CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE;
343 : }
344 :
345 0 : inline CHIP_ERROR DiagnosticDataProvider::GetActiveHardwareFaults(GeneralFaults<kMaxHardwareFaults> & hardwareFaults)
346 : {
347 0 : return CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE;
348 : }
349 :
350 0 : inline CHIP_ERROR DiagnosticDataProvider::GetActiveRadioFaults(GeneralFaults<kMaxRadioFaults> & radioFaults)
351 : {
352 0 : return CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE;
353 : }
354 :
355 0 : inline CHIP_ERROR DiagnosticDataProvider::GetActiveNetworkFaults(GeneralFaults<kMaxNetworkFaults> & networkFaults)
356 : {
357 0 : return CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE;
358 : }
359 :
360 0 : inline CHIP_ERROR DiagnosticDataProvider::GetAverageWearCount(uint32_t & averageWearCount)
361 : {
362 0 : return CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE;
363 : }
364 :
365 0 : inline CHIP_ERROR DiagnosticDataProvider::GetNetworkInterfaces(NetworkInterface ** netifpp)
366 : {
367 0 : return CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE;
368 : }
369 :
370 0 : inline void DiagnosticDataProvider::ReleaseNetworkInterfaces(NetworkInterface * netifp) {}
371 :
372 0 : inline CHIP_ERROR DiagnosticDataProvider::GetEthPHYRate(app::Clusters::EthernetNetworkDiagnostics::PHYRateEnum & pHYRate)
373 : {
374 0 : return CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE;
375 : }
376 :
377 0 : inline CHIP_ERROR DiagnosticDataProvider::GetEthFullDuplex(bool & fullDuplex)
378 : {
379 0 : return CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE;
380 : }
381 :
382 0 : inline CHIP_ERROR DiagnosticDataProvider::GetEthCarrierDetect(bool & carrierDetect)
383 : {
384 0 : return CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE;
385 : }
386 :
387 0 : inline CHIP_ERROR DiagnosticDataProvider::GetEthTimeSinceReset(uint64_t & timeSinceReset)
388 : {
389 0 : return CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE;
390 : }
391 :
392 0 : inline CHIP_ERROR DiagnosticDataProvider::GetEthPacketRxCount(uint64_t & packetRxCount)
393 : {
394 0 : return CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE;
395 : }
396 :
397 0 : inline CHIP_ERROR DiagnosticDataProvider::GetEthPacketTxCount(uint64_t & packetTxCount)
398 : {
399 0 : return CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE;
400 : }
401 :
402 0 : inline CHIP_ERROR DiagnosticDataProvider::GetEthTxErrCount(uint64_t & txErrCount)
403 : {
404 0 : return CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE;
405 : }
406 :
407 0 : inline CHIP_ERROR DiagnosticDataProvider::GetEthCollisionCount(uint64_t & collisionCount)
408 : {
409 0 : return CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE;
410 : }
411 :
412 0 : inline CHIP_ERROR DiagnosticDataProvider::GetEthOverrunCount(uint64_t & overrunCount)
413 : {
414 0 : return CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE;
415 : }
416 :
417 0 : inline CHIP_ERROR DiagnosticDataProvider::ResetEthNetworkDiagnosticsCounts()
418 : {
419 0 : return CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE;
420 : }
421 :
422 0 : inline CHIP_ERROR DiagnosticDataProvider::GetWiFiBssId(MutableByteSpan & value)
423 : {
424 0 : return CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE;
425 : }
426 :
427 : inline CHIP_ERROR
428 0 : DiagnosticDataProvider::GetWiFiSecurityType(app::Clusters::WiFiNetworkDiagnostics::SecurityTypeEnum & securityType)
429 : {
430 0 : return CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE;
431 : }
432 :
433 0 : inline CHIP_ERROR DiagnosticDataProvider::GetWiFiVersion(app::Clusters::WiFiNetworkDiagnostics::WiFiVersionEnum & wiFiVersion)
434 : {
435 0 : return CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE;
436 : }
437 :
438 0 : inline CHIP_ERROR DiagnosticDataProvider::GetWiFiChannelNumber(uint16_t & channelNumber)
439 : {
440 0 : return CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE;
441 : }
442 :
443 0 : inline CHIP_ERROR DiagnosticDataProvider::GetWiFiRssi(int8_t & rssi)
444 : {
445 0 : return CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE;
446 : }
447 :
448 0 : inline CHIP_ERROR DiagnosticDataProvider::GetWiFiBeaconLostCount(uint32_t & beaconLostCount)
449 : {
450 0 : return CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE;
451 : }
452 :
453 0 : inline CHIP_ERROR DiagnosticDataProvider::GetWiFiBeaconRxCount(uint32_t & beaconRxCount)
454 : {
455 0 : return CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE;
456 : }
457 :
458 0 : inline CHIP_ERROR DiagnosticDataProvider::GetWiFiPacketMulticastRxCount(uint32_t & packetMulticastRxCount)
459 : {
460 0 : return CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE;
461 : }
462 :
463 0 : inline CHIP_ERROR DiagnosticDataProvider::GetWiFiPacketMulticastTxCount(uint32_t & packetMulticastTxCount)
464 : {
465 0 : return CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE;
466 : }
467 :
468 0 : inline CHIP_ERROR DiagnosticDataProvider::GetWiFiPacketUnicastRxCount(uint32_t & packetUnicastRxCount)
469 : {
470 0 : return CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE;
471 : }
472 :
473 0 : inline CHIP_ERROR DiagnosticDataProvider::GetWiFiPacketUnicastTxCount(uint32_t & packetUnicastTxCount)
474 : {
475 0 : return CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE;
476 : }
477 :
478 0 : inline CHIP_ERROR DiagnosticDataProvider::GetWiFiCurrentMaxRate(uint64_t & currentMaxRate)
479 : {
480 0 : return CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE;
481 : }
482 :
483 0 : inline CHIP_ERROR DiagnosticDataProvider::GetWiFiOverrunCount(uint64_t & overrunCount)
484 : {
485 0 : return CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE;
486 : }
487 :
488 0 : inline CHIP_ERROR DiagnosticDataProvider::ResetWiFiNetworkDiagnosticsCounts()
489 : {
490 0 : return CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE;
491 : }
492 :
493 : } // namespace DeviceLayer
494 : } // namespace chip
|