Skip to content

Commit c664ba2

Browse files
committed
Support for MQTT Broker persist on STM32H5 demo
1 parent 57a879b commit c664ba2

9 files changed

Lines changed: 917 additions & 7 deletions

File tree

.github/workflows/stm32h563-m33mu.yml

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,9 +140,16 @@ jobs:
140140
set -euo pipefail
141141
make -C src/port/stm32h563 \
142142
WOLFSSL_ROOT=../../../../wolfssl \
143-
ENABLE_HTTPS=1 ENABLE_MQTT_BROKER=1 ENABLE_SSH=1 \
143+
ENABLE_HTTPS=1 ENABLE_MQTT_BROKER=1 ENABLE_MQTT_BROKER_PERSIST=1 \
144+
ENABLE_SSH=1 \
144145
WOLFSSL_SP_NO_ASM=1 \
145146
CC=arm-none-eabi-gcc OBJCOPY=arm-none-eabi-objcopy
147+
# Confirm the broker persistence backend is compiled in. Write strings
148+
# to a file first: piping into 'grep -q' makes grep close the pipe
149+
# early, so 'strings' takes SIGPIPE (141) which 'set -o pipefail'
150+
# would turn into a spurious job failure.
151+
strings src/port/stm32h563/app.bin > /tmp/app.strings
152+
grep -q "flash persistence enabled" /tmp/app.strings
146153
147154
- name: Run m33mu + DHCP + full test
148155
timeout-minutes: 15

src/port/stm32h563/Makefile

Lines changed: 46 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,13 @@ ENABLE_MQTT ?= 0
3030
# MQTT Broker: set ENABLE_MQTT_BROKER=1 to include wolfMQTT broker (requires TLS)
3131
ENABLE_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

315322
endif # ENABLE_MQTT
316323

@@ -333,13 +340,49 @@ CFLAGS += -DENABLE_MQTT_BROKER
333340
CFLAGS += -DWOLFMQTT_USER_SETTINGS
334341
CFLAGS += -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).
337370
SRCS += 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.
341381
WOLFMQTT_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
345388
ifneq ($(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
356399
ifneq ($(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 $@
359402
endif
360403

361404
endif # ENABLE_MQTT_BROKER

src/port/stm32h563/mqtt_broker.c

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@
2626
#include <string.h>
2727

2828
#include "certs.h"
29+
#ifdef WOLFMQTT_BROKER_PERSIST
30+
#include "mqtt_broker_persist_flash.h"
31+
#endif
2932

3033
/* Configuration defaults */
3134
#define DEFAULT_BROKER_PORT_TLS 8883
@@ -49,6 +52,9 @@ static struct {
4952
MqttBroker broker;
5053
MqttBrokerNet net;
5154
WOLFSSL_CTX *ssl_ctx;
55+
#ifdef WOLFMQTT_BROKER_PERSIST
56+
MqttBrokerPersistHooks persist_hooks;
57+
#endif
5258
broker_state_t state;
5359
mqtt_broker_debug_cb debug_cb;
5460
uint16_t port;
@@ -164,6 +170,19 @@ static int handle_init(void)
164170
/* Configure broker */
165171
ctx.broker.port = ctx.port;
166172

173+
#ifdef WOLFMQTT_BROKER_PERSIST
174+
/* Install the STM32H5 internal-flash persistence backend before
175+
* MqttBroker_Start (restore runs inside Start). On failure the broker
176+
* still runs, just without durable state. */
177+
if (MqttBrokerNet_PersistFlash_Init(&ctx.persist_hooks) == 0) {
178+
(void)MqttBroker_SetPersistHooks(&ctx.broker, &ctx.persist_hooks);
179+
debug_print("MQTT Broker: flash persistence enabled\n");
180+
}
181+
else {
182+
debug_print("MQTT Broker: persist init failed (in-memory only)\n");
183+
}
184+
#endif
185+
167186
/* Set up TLS if enabled */
168187
if (ctx.use_tls) {
169188
ctx.broker.use_tls = 1;

0 commit comments

Comments
 (0)