Skip to content

Commit 5f5db5b

Browse files
aurel32kartben
authored andcommitted
net: mqtt_sn: udp: use correct get/setsockopt parameters for IPv6
On IPv6, IPPROTO_IPV6 needs to be replaced by IPPROTO_IP and IP_MULTICAST_TTL by IPV6_MULTICAST_HOPS. Signed-off-by: Aurelien Jarno <[email protected]>
1 parent 5e3bf02 commit 5f5db5b

File tree

1 file changed

+26
-6
lines changed

1 file changed

+26
-6
lines changed

subsys/net/lib/mqtt_sn/mqtt_sn_transport_udp.c

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -152,8 +152,18 @@ static int tp_udp_init(struct mqtt_sn_transport *transport)
152152
}
153153

154154
optval = CONFIG_MQTT_SN_LIB_BROADCAST_RADIUS;
155-
err = zsock_setsockopt(udp->sock, NET_IPPROTO_IP, ZSOCK_IP_MULTICAST_TTL,
156-
&optval, sizeof(optval));
155+
if (udp->bcaddr.sa_family == NET_AF_INET && IS_ENABLED(CONFIG_NET_IPV4)) {
156+
err = zsock_setsockopt(udp->sock, NET_IPPROTO_IP,
157+
ZSOCK_IP_MULTICAST_TTL, &optval,
158+
sizeof(optval));
159+
} else if (udp->bcaddr.sa_family == NET_AF_INET6 && IS_ENABLED(CONFIG_NET_IPV6)) {
160+
err = zsock_setsockopt(udp->sock, NET_IPPROTO_IPV6,
161+
ZSOCK_IPV6_MULTICAST_HOPS, &optval,
162+
sizeof(optval));
163+
} else {
164+
LOG_ERR("Unknown AF");
165+
return -EINVAL;
166+
}
157167
if (err < 0) {
158168
return -errno;
159169
}
@@ -177,18 +187,28 @@ static int tp_udp_sendto(struct mqtt_sn_client *client, void *buf, size_t sz, co
177187
net_socklen_t ttl_len;
178188

179189
if (dest_addr == NULL) {
190+
int level, optname;
191+
180192
LOG_HEXDUMP_DBG(buf, sz, "Sending Broadcast UDP packet");
181193

182194
/* Set ttl if requested value does not match existing*/
183-
rc = zsock_getsockopt(udp->sock, NET_IPPROTO_IP, ZSOCK_IP_MULTICAST_TTL,
184-
&ttl, &ttl_len);
195+
if (udp->bcaddr.sa_family == NET_AF_INET && IS_ENABLED(CONFIG_NET_IPV4)) {
196+
level = NET_IPPROTO_IP;
197+
optname = ZSOCK_IP_MULTICAST_TTL;
198+
} else if (udp->bcaddr.sa_family == NET_AF_INET6 && IS_ENABLED(CONFIG_NET_IPV6)) {
199+
level = NET_IPPROTO_IPV6;
200+
optname = ZSOCK_IPV6_MULTICAST_HOPS;
201+
} else {
202+
LOG_ERR("Unknown AF");
203+
return -EINVAL;
204+
}
205+
rc = zsock_getsockopt(udp->sock, level, optname, &ttl, &ttl_len);
185206
if (rc < 0) {
186207
return -errno;
187208
}
188209
if (ttl != addrlen) {
189210
ttl = addrlen;
190-
rc = zsock_setsockopt(udp->sock, NET_IPPROTO_IP, ZSOCK_IP_MULTICAST_TTL,
191-
&ttl, sizeof(ttl));
211+
rc = zsock_setsockopt(udp->sock, level, optname, &ttl, sizeof(ttl));
192212
if (rc < 0) {
193213
return -errno;
194214
}

0 commit comments

Comments
 (0)