Skip to content

Commit 7d16119

Browse files
committed
fix(client): Fix NetworkClient::localIP()
It was returning zero, because it was not able to handle IPv4 mapped address into IPv6 address
1 parent e382746 commit 7d16119

File tree

1 file changed

+18
-2
lines changed

1 file changed

+18
-2
lines changed

Diff for: libraries/Network/src/NetworkClient.cpp

+18-2
Original file line numberDiff line numberDiff line change
@@ -589,8 +589,24 @@ IPAddress NetworkClient::localIP(int fd) const {
589589
struct sockaddr_storage addr;
590590
socklen_t len = sizeof addr;
591591
getsockname(fd, (struct sockaddr *)&addr, &len);
592-
struct sockaddr_in *s = (struct sockaddr_in *)&addr;
593-
return IPAddress((uint32_t)(s->sin_addr.s_addr));
592+
593+
// IPv4 socket, old way
594+
if (((struct sockaddr *)&addr)->sa_family == AF_INET) {
595+
struct sockaddr_in *s = (struct sockaddr_in *)&addr;
596+
return IPAddress((uint32_t)(s->sin_addr.s_addr));
597+
}
598+
599+
// IPv6, but it might be IPv4 mapped address
600+
if (((struct sockaddr *)&addr)->sa_family == AF_INET6) {
601+
struct sockaddr_in6 *saddr6 = (struct sockaddr_in6 *)&addr;
602+
if (IN6_IS_ADDR_V4MAPPED(saddr6->sin6_addr.un.u32_addr)) {
603+
return IPAddress(IPv4, (uint8_t *)saddr6->sin6_addr.s6_addr + IPADDRESS_V4_BYTES_INDEX);
604+
} else {
605+
return IPAddress(IPv6, (uint8_t *)(saddr6->sin6_addr.s6_addr), saddr6->sin6_scope_id);
606+
}
607+
}
608+
log_e("NetworkClient::localIP Not AF_INET or AF_INET6?");
609+
return (IPAddress(0, 0, 0, 0));
594610
}
595611

596612
uint16_t NetworkClient::localPort(int fd) const {

0 commit comments

Comments
 (0)