@@ -30,6 +30,14 @@ ENABLE_MQTT ?= 0
3030# MQTT Broker: set ENABLE_MQTT_BROKER=1 to include wolfMQTT broker (requires TLS)
3131ENABLE_MQTT_BROKER ?= 0
3232
33+ # MQTT Broker persistence: set ENABLE_MQTT_BROKER_PERSIST=1 to persist broker
34+ # state (sessions/subs/retained/offline-queue) to STM32H5 internal flash,
35+ # AES-256-GCM encrypted at rest. OFF by default because it requires the
36+ # wolfMQTT broker persistence layer (mqtt_broker_persist.c +
37+ # MqttBroker_SetPersistHooks) from wolfMQTT PR 538 (broker_features), which is
38+ # not yet in wolfMQTT master. Requires ENABLE_MQTT_BROKER=1.
39+ ENABLE_MQTT_BROKER_PERSIST ?= 0
40+
3341# TFTP client demo: set ENABLE_TFTP=1 to include the wolfIP TFTP client
3442# that downloads a firmware image at boot and stages it into the
3543# wolfBoot update partition. TZEN=0 only.
@@ -310,7 +318,7 @@ SRCS += $(WOLFMQTT_SRCS)
310318
311319# wolfMQTT objects use relaxed warnings + MQTT/SSL include paths + user_settings.h
312320$(WOLFMQTT_ROOT ) /% .o : $(WOLFMQTT_ROOT ) /% .c
313- $(CC ) $(CFLAGS_WOLFSSL ) -DENABLE_MQTT -DWOLFSSL_USER_SETTINGS -DWOLFMQTT_USER_SETTINGS $(if $(filter 1,$(ENABLE_MQTT_BROKER ) ) ,-DENABLE_MQTT_BROKER) -I$(WOLFMQTT_ROOT ) -I$(WOLFSSL_ROOT ) -I$(ROOT ) /src -c $< -o $@
321+ $(CC ) $(CFLAGS_WOLFSSL ) -DENABLE_MQTT -DWOLFSSL_USER_SETTINGS -DWOLFMQTT_USER_SETTINGS $(if $(filter 1,$(ENABLE_MQTT_BROKER ) ) ,-DENABLE_MQTT_BROKER) $( MQTT_PERSIST_DEFS ) -I$(WOLFMQTT_ROOT ) -I$(WOLFSSL_ROOT ) -I$(ROOT ) /src -c $< -o $@
314322
315323endif # ENABLE_MQTT
316324
@@ -333,13 +341,49 @@ CFLAGS += -DENABLE_MQTT_BROKER
333341CFLAGS += -DWOLFMQTT_USER_SETTINGS
334342CFLAGS += -I$(WOLFMQTT_ROOT )
335343
336- # MQTT broker wrapper
344+ # Opt-in broker persistence. Gated by ENABLE_MQTT_BROKER_PERSIST so the
345+ # default broker build stays compatible with released wolfMQTT (the
346+ # persistence layer is only in wolfMQTT PR 538 / broker_features for now).
347+ # The persistence macros are defined on the command line (not in
348+ # user_settings.h) so they are set before any wolfMQTT/wolfSSL header is
349+ # parsed - the port includes wolfmqtt/mqtt_broker.h before wolfssl/ssl.h
350+ # pulls in user_settings.h, and these also need to precede mqtt_broker.h's
351+ # #ifndef size defaults. MQTT_PERSIST_DEFS is reused by the wolfMQTT object
352+ # pattern rules below.
353+ ifeq ($(ENABLE_MQTT_BROKER_PERSIST ) ,1)
354+ # The flash KV backend writes via the non-secure FLASH register view and a
355+ # fixed flash layout, so it is TZEN=0 only.
356+ ifeq ($(TZEN ) ,1)
357+ $(error ENABLE_MQTT_BROKER_PERSIST=1 requires TZEN=0 (the flash KV backend uses the non-secure FLASH register view))
358+ endif
359+ # NOTE: WOLFMQTT_BROKER_PERSIST_ENCRYPT enables AES-256-GCM at rest, but the
360+ # backend's derive_key hook returns a FIXED DEVELOPMENT KEY (see
361+ # mqtt_broker_persist_flash.c). This is for testing only - replace derive_key
362+ # with a real key source (SE/HSM/device secret) before relying on
363+ # confidentiality.
364+ MQTT_PERSIST_DEFS := -DWOLFMQTT_BROKER_PERSIST -DWOLFMQTT_BROKER_PERSIST_ENCRYPT \
365+ -DBROKER_MAX_PERSIST_SESSIONS=8 -DBROKER_MAX_OFFLINE_MSGS_PER_SUB=8
366+ CFLAGS += $(MQTT_PERSIST_DEFS )
367+ endif
368+
369+ # MQTT broker wrapper (+ STM32H5 internal-flash persistence backend when
370+ # ENABLE_MQTT_BROKER_PERSIST=1).
337371SRCS += mqtt_broker.c
372+ ifeq ($(ENABLE_MQTT_BROKER_PERSIST ) ,1)
373+ SRCS += mqtt_broker_persist_flash.c
374+ endif
338375
339376# wolfMQTT broker source files
340377# Note: mqtt_client.c is needed by broker internals (MqttClient_Init, etc.)
378+ # mqtt_broker_persist.c is the generic persistence codec (encode/decode +
379+ # AES-GCM wrap), built only when persistence is enabled. The POSIX backend
380+ # (mqtt_broker_persist_posix.c) is never built here - it pulls in
381+ # <dirent.h>/<fcntl.h>; we supply a flash backend instead.
341382WOLFMQTT_BROKER_SRCS := \
342383 $(WOLFMQTT_ROOT ) /src/mqtt_broker.c
384+ ifeq ($(ENABLE_MQTT_BROKER_PERSIST ) ,1)
385+ WOLFMQTT_BROKER_SRCS += $(WOLFMQTT_ROOT ) /src/mqtt_broker_persist.c
386+ endif
343387
344388# Only add shared wolfMQTT sources if MQTT client is not already enabled
345389ifneq ($(ENABLE_MQTT ) ,1)
@@ -355,7 +399,7 @@ SRCS += $(WOLFMQTT_BROKER_SRCS)
355399# Only define this pattern rule if MQTT client didn't already define it
356400ifneq ($(ENABLE_MQTT ) ,1)
357401$(WOLFMQTT_ROOT ) /% .o : $(WOLFMQTT_ROOT ) /% .c
358- $(CC ) $(CFLAGS_WOLFSSL ) -DENABLE_MQTT_BROKER -DWOLFSSL_USER_SETTINGS -DWOLFMQTT_USER_SETTINGS -I$(WOLFMQTT_ROOT ) -I$(WOLFSSL_ROOT ) -I$(ROOT ) /src -c $< -o $@
402+ $(CC ) $(CFLAGS_WOLFSSL ) -DENABLE_MQTT_BROKER $( MQTT_PERSIST_DEFS ) -DWOLFSSL_USER_SETTINGS -DWOLFMQTT_USER_SETTINGS -I$(WOLFMQTT_ROOT ) -I$(WOLFSSL_ROOT ) -I$(ROOT ) /src -c $< -o $@
359403endif
360404
361405endif # ENABLE_MQTT_BROKER
0 commit comments