5656/* -------------------------------------------------------------------------- */
5757#ifndef WOLFMQTT_BROKER_GET_TIME_S
5858 #if defined(WOLFMQTT_WOLFIP )
59- /* wolfIP: override WOLFMQTT_BROKER_GET_TIME_S in user_settings.h */
60- #define WOLFMQTT_BROKER_GET_TIME_S () ((WOLFMQTT_BROKER_TIME_T)0)
59+ /* wolfIP has no default time source. Define
60+ * WOLFMQTT_BROKER_GET_TIME_S in user_settings.h to provide one.
61+ * Example: #define WOLFMQTT_BROKER_GET_TIME_S() myGetTimeSec() */
62+ #error "WOLFMQTT_WOLFIP requires WOLFMQTT_BROKER_GET_TIME_S to be defined"
6163 #else
6264 #define WOLFMQTT_BROKER_GET_TIME_S () \
6365 ((WOLFMQTT_BROKER_TIME_T)time(NULL))
6971/* -------------------------------------------------------------------------- */
7072#ifndef BROKER_SLEEP_MS
7173 #if defined(WOLFMQTT_WOLFIP )
72- #define BROKER_SLEEP_MS (ms ) /* no-op: cooperative scheduling - Step() returns to caller for task switching */
74+ /* No-op: wolfIP uses cooperative scheduling via MqttBroker_Step().
75+ * Do not use MqttBroker_Run() on wolfIP - it will busy-spin.
76+ * Override BROKER_SLEEP_MS in user_settings.h if a yield/delay
77+ * primitive is available on your platform. */
78+ #define BROKER_SLEEP_MS (ms ) do {} while(0)
7379 #elif defined(USE_WINDOWS_API )
7480 #define BROKER_SLEEP_MS (ms ) Sleep(ms)
7581 #else
@@ -183,108 +189,112 @@ static void BrokerStore_String(char** dst_ptr,
183189static int BrokerTls_Init (MqttBroker * broker )
184190{
185191 WOLFSSL_CTX * ctx = NULL ;
186- int rc ;
192+ int wolf_rc ; /* wolfSSL return codes (compared against WOLFSSL_SUCCESS) */
193+ int mqtt_rc = MQTT_CODE_SUCCESS ; /* normalized MQTT return code */
187194
188- rc = wolfSSL_Init ();
189- if (rc != WOLFSSL_SUCCESS ) {
190- WBLOG_ERR (broker , "broker: wolfSSL_Init failed %d" , rc );
191- rc = MQTT_CODE_ERROR_BAD_ARG ;
195+ wolf_rc = wolfSSL_Init ();
196+ if (wolf_rc != WOLFSSL_SUCCESS ) {
197+ WBLOG_ERR (broker , "broker: wolfSSL_Init failed %d" , wolf_rc );
198+ return MQTT_CODE_ERROR_BAD_ARG ;
192199 }
193200
194201 /* Select TLS method based on version preference */
195- if (rc == WOLFSSL_SUCCESS ) {
196- if (broker -> tls_version == 12 ) {
197- ctx = wolfSSL_CTX_new (wolfTLSv1_2_server_method ());
198- }
199- else if (broker -> tls_version == 13 ) {
200- ctx = wolfSSL_CTX_new (wolfTLSv1_3_server_method ());
201- }
202- else {
203- ctx = wolfSSL_CTX_new (wolfSSLv23_server_method ());
204- }
205- if (ctx == NULL ) {
206- WBLOG_ERR (broker , "broker: wolfSSL_CTX_new failed" );
207- rc = MQTT_CODE_ERROR_MEMORY ;
208- }
202+ if (broker -> tls_version == 12 ) {
203+ ctx = wolfSSL_CTX_new (wolfTLSv1_2_server_method ());
204+ }
205+ else if (broker -> tls_version == 13 ) {
206+ ctx = wolfSSL_CTX_new (wolfTLSv1_3_server_method ());
207+ }
208+ else {
209+ ctx = wolfSSL_CTX_new (wolfSSLv23_server_method ());
210+ }
211+ if (ctx == NULL ) {
212+ WBLOG_ERR (broker , "broker: wolfSSL_CTX_new failed" );
213+ mqtt_rc = MQTT_CODE_ERROR_MEMORY ;
209214 }
210215
211216 /* Load server certificate */
212- if (rc == WOLFSSL_SUCCESS ) {
217+ if (mqtt_rc == MQTT_CODE_SUCCESS ) {
213218 if (broker -> tls_cert == NULL ) {
214219 WBLOG_ERR (broker , "broker: TLS cert not set (-c)" );
215- rc = MQTT_CODE_ERROR_BAD_ARG ;
220+ mqtt_rc = MQTT_CODE_ERROR_BAD_ARG ;
216221 }
217222 }
218- if (rc == WOLFSSL_SUCCESS ) {
223+ if (mqtt_rc == MQTT_CODE_SUCCESS ) {
219224#ifndef NO_FILESYSTEM
220- rc = wolfSSL_CTX_use_certificate_file (ctx , broker -> tls_cert ,
225+ wolf_rc = wolfSSL_CTX_use_certificate_file (ctx , broker -> tls_cert ,
221226 WOLFSSL_FILETYPE_PEM );
222- if (rc != WOLFSSL_SUCCESS ) {
223- WBLOG_ERR (broker , "broker: load cert failed %d (%s)" , rc , broker -> tls_cert );
224- rc = MQTT_CODE_ERROR_BAD_ARG ;
227+ if (wolf_rc != WOLFSSL_SUCCESS ) {
228+ WBLOG_ERR (broker , "broker: load cert failed %d (%s)" ,
229+ wolf_rc , broker -> tls_cert );
230+ mqtt_rc = MQTT_CODE_ERROR_BAD_ARG ;
225231 }
226232#else
227233 /* File operations not available in NO_FILESYSTEM builds */
228- rc = MQTT_CODE_ERROR_BAD_ARG ;
234+ mqtt_rc = MQTT_CODE_ERROR_BAD_ARG ;
229235#endif
230236 }
231237
232238 /* Load server private key */
233- if (rc == WOLFSSL_SUCCESS ) {
239+ if (mqtt_rc == MQTT_CODE_SUCCESS ) {
234240 if (broker -> tls_key == NULL ) {
235241 WBLOG_ERR (broker , "broker: TLS key not set (-K)" );
236- rc = MQTT_CODE_ERROR_BAD_ARG ;
242+ mqtt_rc = MQTT_CODE_ERROR_BAD_ARG ;
237243 }
238244 }
239- if (rc == WOLFSSL_SUCCESS ) {
245+ if (mqtt_rc == MQTT_CODE_SUCCESS ) {
240246#ifndef NO_FILESYSTEM
241- rc = wolfSSL_CTX_use_PrivateKey_file (ctx , broker -> tls_key ,
247+ wolf_rc = wolfSSL_CTX_use_PrivateKey_file (ctx , broker -> tls_key ,
242248 WOLFSSL_FILETYPE_PEM );
243- if (rc != WOLFSSL_SUCCESS ) {
244- WBLOG_ERR (broker , "broker: load key failed %d (%s)" , rc , broker -> tls_key );
245- rc = MQTT_CODE_ERROR_BAD_ARG ;
249+ if (wolf_rc != WOLFSSL_SUCCESS ) {
250+ WBLOG_ERR (broker , "broker: load key failed %d (%s)" ,
251+ wolf_rc , broker -> tls_key );
252+ mqtt_rc = MQTT_CODE_ERROR_BAD_ARG ;
246253 }
247254#else
248- rc = MQTT_CODE_ERROR_BAD_ARG ;
255+ mqtt_rc = MQTT_CODE_ERROR_BAD_ARG ;
249256#endif
250257 }
251258
252259 /* Set wolfSSL IO callbacks */
253- if (rc == WOLFSSL_SUCCESS ) {
260+ if (mqtt_rc == MQTT_CODE_SUCCESS ) {
254261 wolfSSL_CTX_SetIORecv (ctx , MqttSocket_TlsSocketReceive );
255262 wolfSSL_CTX_SetIOSend (ctx , MqttSocket_TlsSocketSend );
256263 }
257264
258265 /* Mutual TLS: load CA and require client certificate */
259- if (rc == WOLFSSL_SUCCESS && broker -> tls_ca != NULL ) {
266+ if (mqtt_rc == MQTT_CODE_SUCCESS && broker -> tls_ca != NULL ) {
260267#ifndef NO_FILESYSTEM
261- rc = wolfSSL_CTX_load_verify_locations (ctx , broker -> tls_ca , NULL );
268+ wolf_rc = wolfSSL_CTX_load_verify_locations (ctx , broker -> tls_ca ,
269+ NULL );
270+ if (wolf_rc != WOLFSSL_SUCCESS ) {
271+ WBLOG_ERR (broker , "broker: load CA failed %d (%s)" ,
272+ wolf_rc , broker -> tls_ca );
273+ mqtt_rc = MQTT_CODE_ERROR_BAD_ARG ;
274+ }
262275#else
263- rc = MQTT_CODE_ERROR_BAD_ARG ;
276+ mqtt_rc = MQTT_CODE_ERROR_BAD_ARG ;
264277#endif
265- if (rc != WOLFSSL_SUCCESS ) {
266- WBLOG_ERR (broker , "broker: load CA failed %d (%s)" , rc , broker -> tls_ca );
267- rc = MQTT_CODE_ERROR_BAD_ARG ;
268- }
269- else {
278+ if (mqtt_rc == MQTT_CODE_SUCCESS ) {
270279 wolfSSL_CTX_set_verify (ctx ,
271280 WOLFSSL_VERIFY_PEER | WOLFSSL_VERIFY_FAIL_IF_NO_PEER_CERT ,
272281 NULL );
273- WBLOG_INFO (broker , "broker: mutual TLS enabled (CA=%s)" , broker -> tls_ca );
282+ WBLOG_INFO (broker , "broker: mutual TLS enabled (CA=%s)" ,
283+ broker -> tls_ca );
274284 }
275285 }
276286
277- if (rc == WOLFSSL_SUCCESS ) {
287+ if (mqtt_rc == MQTT_CODE_SUCCESS ) {
278288 broker -> tls_ctx = ctx ;
279- rc = MQTT_CODE_SUCCESS ;
289+ broker -> tls_ctx_owned = 1 ;
280290 }
281291 else {
282292 if (ctx != NULL ) {
283293 wolfSSL_CTX_free (ctx );
284294 }
285295 wolfSSL_Cleanup ();
286296 }
287- return rc ;
297+ return mqtt_rc ;
288298}
289299
290300static void BrokerTls_Free (MqttBroker * broker )
@@ -310,6 +320,9 @@ typedef struct BrokerWolfIP_Ctx {
310320} BrokerWolfIP_Ctx ;
311321#endif
312322
323+ /* Single-instance context: wolfIP targets are typically embedded systems
324+ * with one broker instance. For multiple instances, use
325+ * WOLFMQTT_BROKER_CUSTOM_NET and provide per-instance context. */
313326static BrokerWolfIP_Ctx broker_wolfip_ctx ;
314327
315328static int BrokerWolfIP_Listen (void * ctx , BROKER_SOCKET_T * sock ,
@@ -358,10 +371,13 @@ static int BrokerWolfIP_Accept(void* ctx, BROKER_SOCKET_T listen_sock,
358371 }
359372
360373 fd = wolfIP_sock_accept (wctx -> stack , listen_sock , NULL , NULL );
361- if (fd < 0 ) {
362- /* EAGAIN / no pending connection */
374+ if (fd == - WOLFIP_EAGAIN ) {
375+ /* No pending connection */
363376 return MQTT_CODE_CONTINUE ;
364377 }
378+ if (fd < 0 ) {
379+ return MQTT_CODE_ERROR_NETWORK ;
380+ }
365381
366382 * client_sock = fd ;
367383 return MQTT_CODE_SUCCESS ;
@@ -379,12 +395,12 @@ static int BrokerWolfIP_Read(void* ctx, BROKER_SOCKET_T sock,
379395 }
380396
381397 rc = wolfIP_sock_recv (wctx -> stack , sock , buf , (size_t )buf_len , 0 );
382- if ( rc < 0 ) {
383- /* EAGAIN / would block */
398+ /* -WOLFIP_EAGAIN: no data yet; -1: socket not yet in ESTABLISHED state */
399+ if ( rc == - WOLFIP_EAGAIN || rc == -1 ) {
384400 return MQTT_CODE_CONTINUE ;
385401 }
386- if (rc = = 0 ) {
387- return MQTT_CODE_ERROR_NETWORK ; /* Connection closed */
402+ if (rc < = 0 ) {
403+ return MQTT_CODE_ERROR_NETWORK ;
388404 }
389405 return rc ;
390406}
@@ -401,11 +417,11 @@ static int BrokerWolfIP_Write(void* ctx, BROKER_SOCKET_T sock,
401417 }
402418
403419 rc = wolfIP_sock_send (wctx -> stack , sock , buf , (size_t )buf_len , 0 );
404- if ( rc < 0 ) {
405- /* EAGAIN / would block */
420+ /* -WOLFIP_EAGAIN: send buffer full; -1: socket not yet in ESTABLISHED state */
421+ if ( rc == - WOLFIP_EAGAIN || rc == -1 ) {
406422 return MQTT_CODE_CONTINUE ;
407423 }
408- if (rc = = 0 ) {
424+ if (rc < = 0 ) {
409425 return MQTT_CODE_ERROR_NETWORK ;
410426 }
411427 return rc ;
@@ -3707,14 +3723,16 @@ int MqttBroker_Free(MqttBroker* broker)
37073723
37083724#ifdef ENABLE_MQTT_TLS
37093725 if (broker -> tls_ctx != NULL ) {
3710- #if !defined(WOLFMQTT_WOLFIP ) && !defined(WOLFMQTT_BROKER_CUSTOM_NET )
3711- BrokerTls_Free (broker );
3712- #else
3713- /* Application-provided TLS context: free ctx but skip
3714- * wolfSSL_Cleanup() since wolfSSL may be shared */
3715- wolfSSL_CTX_free (broker -> tls_ctx );
3716- broker -> tls_ctx = NULL ;
3717- #endif
3726+ if (broker -> tls_ctx_owned ) {
3727+ /* Context was created by BrokerTls_Init: full cleanup */
3728+ BrokerTls_Free (broker );
3729+ }
3730+ else {
3731+ /* Application-provided TLS context: free ctx but skip
3732+ * wolfSSL_Cleanup() since wolfSSL may be shared */
3733+ wolfSSL_CTX_free (broker -> tls_ctx );
3734+ broker -> tls_ctx = NULL ;
3735+ }
37183736 }
37193737#endif
37203738
0 commit comments