[ESP32] Adding filters to the traces reported to esp-insights. (#29318)
* Adding filtering support to insights traces.
1.Provides add and remove apis to add or remove the traces as per requirement.
2.Filters the required traces and reports it to esp-insights.
* Addressed review Comments
diff --git a/examples/lighting-app/esp32/main/main.cpp b/examples/lighting-app/esp32/main/main.cpp
index 5957a68..adb2baf 100644
--- a/examples/lighting-app/esp32/main/main.cpp
+++ b/examples/lighting-app/esp32/main/main.cpp
@@ -41,7 +41,7 @@
#if CONFIG_ENABLE_ESP_INSIGHTS_SYSTEM_STATS
#include <tracing/esp32_trace/insights_sys_stats.h>
-#define START_TIMEOUT_MS 600000
+#define START_TIMEOUT_MS 60000
#endif
#if CONFIG_ENABLE_ESP32_FACTORY_DATA_PROVIDER
diff --git a/src/tracing/esp32_trace/esp32_tracing.cpp b/src/tracing/esp32_trace/esp32_tracing.cpp
index 414cdd8..24a7166 100644
--- a/src/tracing/esp32_trace/esp32_tracing.cpp
+++ b/src/tracing/esp32_trace/esp32_tracing.cpp
@@ -17,6 +17,7 @@
*/
#include "esp32_tracing.h"
+#include <algorithm>
#include <esp_heap_caps.h>
#include <esp_insights.h>
#include <esp_log.h>
@@ -26,6 +27,107 @@
namespace chip {
namespace Tracing {
namespace Insights {
+namespace {
+
+constexpr size_t kPermitListMaxSize = 10;
+using HashValue = uint32_t;
+
+// Implements a murmurhash with 0 seed.
+uint32_t MurmurHash(const void * key)
+{
+ const uint32_t kMultiplier = 0x5bd1e995;
+ const uint32_t kShift = 24;
+ const unsigned char * data = (const unsigned char *) key;
+ uint32_t hash = 0;
+
+ while (*data)
+ {
+ uint32_t value = *data++;
+ value *= kMultiplier;
+ value ^= value >> kShift;
+ value *= kMultiplier;
+ hash *= kMultiplier;
+ hash ^= value;
+ }
+
+ hash ^= hash >> 13;
+ hash *= kMultiplier;
+ hash ^= hash >> 15;
+
+ if (hash == 0)
+ {
+ ESP_LOGW("Tracing", "MurmurHash resulted in a hash value of 0");
+ }
+
+ return hash;
+}
+
+/* PASESession,CASESession,NetworkCommissioning,GeneralCommissioning,OperationalCredentials
+ * are well known permitted entries.
+ */
+
+HashValue gPermitList[kPermitListMaxSize] = {
+ MurmurHash("PASESession"),
+ MurmurHash("CASESession"),
+ MurmurHash("NetworkCommissioning"),
+ MurmurHash("GeneralCommissioning"),
+ MurmurHash("OperationalCredentials"),
+};
+
+bool IsPermitted(HashValue hashValue)
+{
+ for (HashValue permitted : gPermitList)
+ {
+ if (permitted == 0)
+ {
+ break;
+ }
+ if (hashValue == permitted)
+ {
+ return true;
+ }
+ }
+ return false;
+}
+
+} // namespace
+
+namespace ESP32Filter {
+
+CHIP_ERROR AddHashToPermitlist(const char * str)
+{
+ HashValue hashValue = MurmurHash(str);
+ if (hashValue == 0)
+ {
+ ESP_LOGW("TRC", "Hash value for '%s' is 0", str);
+ return CHIP_ERROR_INCORRECT_STATE;
+ }
+
+ for (HashValue & permitted : gPermitList)
+ {
+ if (permitted == 0)
+ {
+ permitted = hashValue;
+ return CHIP_NO_ERROR;
+ }
+ if (hashValue == permitted)
+ {
+ ESP_LOGW("TRC", "Hash value for '%s' is colliding with an existing entry", str);
+ return CHIP_ERROR_DUPLICATE_KEY_ID;
+ }
+ }
+ return CHIP_ERROR_NO_MEMORY;
+}
+
+void RemoveHashFromPermitlist(const char * str)
+{
+ HashValue hashValue = MurmurHash(str);
+
+ auto * end = gPermitList + kPermitListMaxSize;
+ std::fill(std::remove(gPermitList, end, hashValue), end, 0);
+}
+
+} // namespace ESP32Filter
#define LOG_HEAP_INFO(label, group, entry_exit) \
do \
@@ -48,12 +150,20 @@
void ESP32Backend::TraceBegin(const char * label, const char * group)
{
- LOG_HEAP_INFO(label, group, "Entry");
+ HashValue hashValue = MurmurHash(group);
+ if (IsPermitted(hashValue))
+ {
+ LOG_HEAP_INFO(label, group, "Entry");
+ }
}
void ESP32Backend::TraceEnd(const char * label, const char * group)
{
- LOG_HEAP_INFO(label, group, "Exit");
+ HashValue hashValue = MurmurHash(group);
+ if (IsPermitted(hashValue))
+ {
+ LOG_HEAP_INFO(label, group, "Exit");
+ }
}
void ESP32Backend::TraceInstant(const char * label, const char * group)
@@ -63,4 +173,3 @@
} // namespace Insights
} // namespace Tracing
} // namespace chip
-// namespace chip
diff --git a/src/tracing/esp32_trace/esp32_tracing.h b/src/tracing/esp32_trace/esp32_tracing.h
index 9857eb1..7fe783d 100644
--- a/src/tracing/esp32_trace/esp32_tracing.h
+++ b/src/tracing/esp32_trace/esp32_tracing.h
@@ -1,11 +1,18 @@
+#include <lib/core/CHIPError.h>
#include <tracing/backend.h>
#include <memory>
-
namespace chip {
namespace Tracing {
namespace Insights {
+// Provide the user the ability to add/remove trace filters.
+namespace ESP32Filter {
+
+CHIP_ERROR AddHashToPermitlist(const char * alabel);
+void RemoveHashFromPermitlist(const char * alabel);
+} // namespace ESP32Filter
+
/// A Backend that outputs data to chip logging.
///
/// Structured data is formatted as json strings.