diff --git a/samples/net/mqtt_sn_publisher/prj.conf b/samples/net/mqtt_sn_publisher/prj.conf index 405b9dc3c40d1..57bc17868f1ef 100644 --- a/samples/net/mqtt_sn_publisher/prj.conf +++ b/samples/net/mqtt_sn_publisher/prj.conf @@ -37,7 +37,6 @@ CONFIG_NET_CONFIG_MY_IPV4_ADDR="192.0.2.1" CONFIG_MQTT_SN_LIB=y CONFIG_MQTT_SN_TRANSPORT_UDP=y CONFIG_MQTT_SN_LIB_BROADCAST_RADIUS=1 -CONFIG_MQTT_SN_LIB_MAX_ADDR_SIZE=24 CONFIG_NET_SAMPLE_MQTT_SN_STATIC_GATEWAY=y CONFIG_NET_SAMPLE_MQTT_SN_GATEWAY_ADDRESS="192.0.2.2:10000" CONFIG_NET_SAMPLE_MQTT_SN_BROADCAST_ADDRESS="225.1.1.1:1883" diff --git a/subsys/net/lib/mqtt_sn/Kconfig b/subsys/net/lib/mqtt_sn/Kconfig index c6265c556927f..5702fc807c706 100644 --- a/subsys/net/lib/mqtt_sn/Kconfig +++ b/subsys/net/lib/mqtt_sn/Kconfig @@ -38,6 +38,8 @@ config MQTT_SN_LIB_MAX_GATEWAYS config MQTT_SN_LIB_MAX_ADDR_SIZE int "Maximum address size for the transport" + default 24 if NET_IPV6 + default 8 if NET_IPV4 default 21 range 1 $(UINT8_MAX) help @@ -45,6 +47,11 @@ config MQTT_SN_LIB_MAX_ADDR_SIZE needs to know how long your addresses are. Set this to the maximum length in bytes of the address data structure for your implemented transport. + A UDP transport requires at least 8 bytes on IPv4 and 24 bytes on + IPv6, corresponding to the sizes of the sockaddr_in and sockaddr_in6 + structs. For an out-of-tree transport, you may need to adjust this + value. + config MQTT_SN_LIB_BROADCAST_RADIUS int "Radius for broadcast messages" default 1 diff --git a/subsys/net/lib/mqtt_sn/mqtt_sn_transport_udp.c b/subsys/net/lib/mqtt_sn/mqtt_sn_transport_udp.c index 471a0135a31b9..d9a8ef2be3cf9 100644 --- a/subsys/net/lib/mqtt_sn/mqtt_sn_transport_udp.c +++ b/subsys/net/lib/mqtt_sn/mqtt_sn_transport_udp.c @@ -19,6 +19,12 @@ #include LOG_MODULE_DECLARE(net_mqtt_sn, CONFIG_MQTT_SN_LOG_LEVEL); +BUILD_ASSERT(CONFIG_MQTT_SN_LIB_MAX_ADDR_SIZE >= sizeof(struct net_sockaddr_in) || + !IS_ENABLED(CONFIG_NET_IPV4)); + +BUILD_ASSERT(CONFIG_MQTT_SN_LIB_MAX_ADDR_SIZE >= sizeof(struct net_sockaddr_in6) || + !IS_ENABLED(CONFIG_NET_IPV6)); + static char *get_ip_str(const struct net_sockaddr *sa, char *s, size_t maxlen) { switch (sa->sa_family) {