Skip to content

Commit 366d129

Browse files
M1chacfriedt
authored andcommitted
samples: mqtt_sn: add support for IPv6
Like other samples, this moves to net_ipaddr_parse, which can handle IPv4 and IPv6. Additionally, it parses the port as well which removes the need to have separate Kconfigs for addresses and ports, thus simplifying the code. Signed-off-by: Michael Zimmermann <[email protected]>
1 parent 7f55e70 commit 366d129

File tree

3 files changed

+33
-31
lines changed

3 files changed

+33
-31
lines changed

samples/net/mqtt_sn_publisher/Kconfig

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,12 @@ mainmenu "MQTT-SN sample application"
88
config NET_SAMPLE_MQTT_SN_STATIC_GATEWAY
99
bool "Whether to statically define the Gateway. Will use Search procedure if False."
1010

11-
config NET_SAMPLE_MQTT_SN_GATEWAY_IP
12-
string "IP of the MQTT-SN gateway"
11+
config NET_SAMPLE_MQTT_SN_GATEWAY_ADDRESS
12+
string "IP and port of the MQTT-SN gateway"
1313
depends on NET_SAMPLE_MQTT_SN_STATIC_GATEWAY
1414

15-
config NET_SAMPLE_MQTT_SN_GATEWAY_PORT
16-
int "Port of the MQTT-SN gateway"
17-
18-
config NET_SAMPLE_MQTT_SN_BROADCAST_IP
19-
string "IP of the Broadcast address"
20-
21-
config NET_SAMPLE_MQTT_SN_BROADCAST_PORT
22-
int "Port of the MQTT-SN broadcast"
15+
config NET_SAMPLE_MQTT_SN_BROADCAST_ADDRESS
16+
string "IP and port of the Broadcast address"
2317

2418
config NET_SAMPLE_MQTT_SN_BUFFER_SIZE
2519
int "Size of the TX and RX buffers"

samples/net/mqtt_sn_publisher/prj.conf

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
CONFIG_NETWORKING=y
33
CONFIG_NET_UDP=y
44
CONFIG_NET_IPV4=y
5-
CONFIG_NET_IPV6=n
5+
CONFIG_NET_IPV6=y
66
CONFIG_NET_SOCKETS=y
77
CONFIG_ZVFS_OPEN_MAX=6
88
CONFIG_NET_CONNECTION_MANAGER=y
@@ -38,8 +38,7 @@ CONFIG_NET_CONFIG_MY_IPV4_ADDR="192.0.2.1"
3838
CONFIG_MQTT_SN_LIB=y
3939
CONFIG_MQTT_SN_TRANSPORT_UDP=y
4040
CONFIG_MQTT_SN_LIB_BROADCAST_RADIUS=1
41+
CONFIG_MQTT_SN_LIB_MAX_ADDR_SIZE=24
4142
CONFIG_NET_SAMPLE_MQTT_SN_STATIC_GATEWAY=y
42-
CONFIG_NET_SAMPLE_MQTT_SN_GATEWAY_IP="192.0.2.2"
43-
CONFIG_NET_SAMPLE_MQTT_SN_GATEWAY_PORT=10000
44-
CONFIG_NET_SAMPLE_MQTT_SN_BROADCAST_IP="225.1.1.1"
45-
CONFIG_NET_SAMPLE_MQTT_SN_BROADCAST_PORT=1883
43+
CONFIG_NET_SAMPLE_MQTT_SN_GATEWAY_ADDRESS="192.0.2.2:10000"
44+
CONFIG_NET_SAMPLE_MQTT_SN_BROADCAST_ADDRESS="225.1.1.1:1883"

samples/net/mqtt_sn_publisher/src/udp.c

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@
1818
LOG_MODULE_DECLARE(mqtt_sn_publisher_sample);
1919

2020
#ifdef CONFIG_NET_SAMPLE_MQTT_SN_STATIC_GATEWAY
21-
#define SAMPLE_GW_IP CONFIG_NET_SAMPLE_MQTT_SN_GATEWAY_IP
21+
#define SAMPLE_GW_ADDRESS CONFIG_NET_SAMPLE_MQTT_SN_GATEWAY_ADDRESS
2222
#else
23-
#define SAMPLE_GW_IP ""
23+
#define SAMPLE_GW_ADDRESS ""
2424
#endif
2525

2626
static void process_thread(void);
@@ -126,19 +126,19 @@ static int do_work(void)
126126

127127
static void process_thread(void)
128128
{
129-
struct sockaddr_in bcaddr = {0};
129+
struct sockaddr bcaddr = {0};
130130
int err;
131-
LOG_DBG("Parsing Broadcast IP " CONFIG_NET_SAMPLE_MQTT_SN_BROADCAST_IP);
132-
bcaddr.sin_family = AF_INET;
133-
bcaddr.sin_port = htons(CONFIG_NET_SAMPLE_MQTT_SN_BROADCAST_PORT);
134-
err = zsock_inet_pton(AF_INET, CONFIG_NET_SAMPLE_MQTT_SN_BROADCAST_IP,
135-
&bcaddr.sin_addr);
136-
__ASSERT(err == 1, "inet_pton() failed %d", err);
131+
bool success;
132+
133+
LOG_DBG("Parsing Broadcast Address " CONFIG_NET_SAMPLE_MQTT_SN_BROADCAST_ADDRESS);
134+
success = net_ipaddr_parse(CONFIG_NET_SAMPLE_MQTT_SN_BROADCAST_ADDRESS,
135+
strlen(CONFIG_NET_SAMPLE_MQTT_SN_BROADCAST_ADDRESS), &bcaddr);
136+
__ASSERT(success, "net_ipaddr_parse() failed");
137137

138138
LOG_INF("Waiting for connection...");
139139
LOG_HEXDUMP_DBG(&bcaddr, sizeof(bcaddr), " broadcast address");
140140

141-
err = mqtt_sn_transport_udp_init(&tp, (struct sockaddr *)&bcaddr, sizeof((bcaddr)));
141+
err = mqtt_sn_transport_udp_init(&tp, &bcaddr, sizeof((bcaddr)));
142142
__ASSERT(err == 0, "mqtt_sn_transport_udp_init() failed %d", err);
143143

144144
err = mqtt_sn_client_init(&mqtt_client, &client_id, &tp.tp, evt_cb, tx_buf, sizeof(tx_buf),
@@ -147,15 +147,24 @@ static void process_thread(void)
147147

148148
if (IS_ENABLED(CONFIG_NET_SAMPLE_MQTT_SN_STATIC_GATEWAY)) {
149149
LOG_INF("Adding predefined Gateway");
150-
struct sockaddr_in gwaddr = {0};
150+
struct sockaddr gwaddr = {0};
151151

152-
LOG_DBG("Parsing Gateway IP %s", SAMPLE_GW_IP);
153-
gwaddr.sin_family = AF_INET;
154-
gwaddr.sin_port = htons(CONFIG_NET_SAMPLE_MQTT_SN_GATEWAY_PORT);
155-
err = zsock_inet_pton(AF_INET, SAMPLE_GW_IP, &gwaddr.sin_addr);
156-
__ASSERT(err == 1, "inet_pton() failed %d", err);
152+
LOG_DBG("Parsing Gateway address %s", SAMPLE_GW_ADDRESS);
153+
success = net_ipaddr_parse(SAMPLE_GW_ADDRESS, strlen(SAMPLE_GW_ADDRESS), &gwaddr);
154+
__ASSERT(success, "net_ipaddr_parse() failed");
157155
struct mqtt_sn_data gwaddr_data = {.data = (uint8_t *)&gwaddr,
158156
.size = sizeof(gwaddr)};
157+
/* Reduce size to allow this to work with smaller values for
158+
* CONFIG_MQTT_SN_LIB_MAX_ADDR_SIZE.
159+
*/
160+
switch (gwaddr.sa_family) {
161+
case AF_INET:
162+
gwaddr_data.size = sizeof(struct sockaddr_in);
163+
break;
164+
case AF_INET6:
165+
gwaddr_data.size = sizeof(struct sockaddr_in6);
166+
break;
167+
}
159168

160169
err = mqtt_sn_add_gw(&mqtt_client, 0x1f, gwaddr_data);
161170
__ASSERT(err == 0, "mqtt_sn_add_gw() failed %d", err);

0 commit comments

Comments
 (0)