@@ -30,6 +30,13 @@ 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. Requires the wolfMQTT broker
36+ # persistence layer (mqtt_broker_persist.c + MqttBroker_SetPersistHooks) from
37+ # wolfMQTT master, and ENABLE_MQTT_BROKER=1.
38+ ENABLE_MQTT_BROKER_PERSIST ?= 0
39+
3340# TFTP client demo: set ENABLE_TFTP=1 to include the wolfIP TFTP client
3441# that downloads a firmware image at boot and stages it into the
3542# wolfBoot update partition. TZEN=0 only.
@@ -310,7 +317,7 @@ SRCS += $(WOLFMQTT_SRCS)
310317
311318# wolfMQTT objects use relaxed warnings + MQTT/SSL include paths + user_settings.h
312319$(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 $@
320+ $(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 $@
314321
315322endif # ENABLE_MQTT
316323
@@ -333,13 +340,49 @@ CFLAGS += -DENABLE_MQTT_BROKER
333340CFLAGS += -DWOLFMQTT_USER_SETTINGS
334341CFLAGS += -I$(WOLFMQTT_ROOT )
335342
336- # MQTT broker wrapper
343+ # Opt-in broker persistence. Gated by ENABLE_MQTT_BROKER_PERSIST so the
344+ # default broker build stays compatible with released wolfMQTT (the
345+ # persistence layer is only in wolfMQTT PR 538 / broker_features for now).
346+ # The persistence macros are defined on the command line (not in
347+ # user_settings.h) so they are set before any wolfMQTT/wolfSSL header is
348+ # parsed - the port includes wolfmqtt/mqtt_broker.h before wolfssl/ssl.h
349+ # pulls in user_settings.h, and these also need to precede mqtt_broker.h's
350+ # #ifndef size defaults. MQTT_PERSIST_DEFS is reused by the wolfMQTT object
351+ # pattern rules below.
352+ ifeq ($(ENABLE_MQTT_BROKER_PERSIST ) ,1)
353+ # The flash KV backend writes via the non-secure FLASH register view and a
354+ # fixed flash layout, so it is TZEN=0 only.
355+ ifeq ($(TZEN ) ,1)
356+ $(error ENABLE_MQTT_BROKER_PERSIST=1 requires TZEN=0 (the flash KV backend uses the non-secure FLASH register view))
357+ endif
358+ # NOTE: WOLFMQTT_BROKER_PERSIST_ENCRYPT enables AES-256-GCM at rest, but the
359+ # backend's derive_key hook returns a FIXED DEVELOPMENT KEY (see
360+ # mqtt_broker_persist_flash.c). This is for testing only - replace derive_key
361+ # with a real key source (SE/HSM/device secret) before relying on
362+ # confidentiality.
363+ MQTT_PERSIST_DEFS := -DWOLFMQTT_BROKER_PERSIST -DWOLFMQTT_BROKER_PERSIST_ENCRYPT \
364+ -DBROKER_MAX_PERSIST_SESSIONS=8 -DBROKER_MAX_OFFLINE_MSGS_PER_SUB=8
365+ CFLAGS += $(MQTT_PERSIST_DEFS )
366+ endif
367+
368+ # MQTT broker wrapper (+ STM32H5 internal-flash persistence backend when
369+ # ENABLE_MQTT_BROKER_PERSIST=1).
337370SRCS += mqtt_broker.c
371+ ifeq ($(ENABLE_MQTT_BROKER_PERSIST ) ,1)
372+ SRCS += mqtt_broker_persist_flash.c
373+ endif
338374
339375# wolfMQTT broker source files
340376# Note: mqtt_client.c is needed by broker internals (MqttClient_Init, etc.)
377+ # mqtt_broker_persist.c is the generic persistence codec (encode/decode +
378+ # AES-GCM wrap), built only when persistence is enabled. The POSIX backend
379+ # (mqtt_broker_persist_posix.c) is never built here - it pulls in
380+ # <dirent.h>/<fcntl.h>; we supply a flash backend instead.
341381WOLFMQTT_BROKER_SRCS := \
342382 $(WOLFMQTT_ROOT ) /src/mqtt_broker.c
383+ ifeq ($(ENABLE_MQTT_BROKER_PERSIST ) ,1)
384+ WOLFMQTT_BROKER_SRCS += $(WOLFMQTT_ROOT ) /src/mqtt_broker_persist.c
385+ endif
343386
344387# Only add shared wolfMQTT sources if MQTT client is not already enabled
345388ifneq ($(ENABLE_MQTT ) ,1)
@@ -355,7 +398,7 @@ SRCS += $(WOLFMQTT_BROKER_SRCS)
355398# Only define this pattern rule if MQTT client didn't already define it
356399ifneq ($(ENABLE_MQTT ) ,1)
357400$(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 $@
401+ $(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 $@
359402endif
360403
361404endif # ENABLE_MQTT_BROKER
0 commit comments