static void *server_socket_thread(void * arg)
{
int serverfd, fd;
- struct sockaddr_in addr;
socklen_t alen;
int port = (intptr_t)arg;
+ const char *addr_str;
+ struct sockaddr_storage addr;
+ struct sockaddr_in *addr_v4;
+ struct sockaddr_in6 *addr_v6;
D("transport: server_socket_thread() starting\n");
serverfd = sdb_port_get_tcp_listenfd();
}
disable_tcp_nagle(fd);
+ if (addr.ss_family == AF_INET) {
+ addr_v4 = (struct sockaddr_in *)(&addr);
+ addr_str = inet_ntoa(addr_v4->sin_addr);
+ D("IPv4 connection (addr %s)\n", addr_str);
+ } else if (addr.ss_family == AF_INET6) {
+ struct in_addr in;
+ addr_v6 = (struct sockaddr_in6 *)(&addr);
+ memcpy(&in, addr_v6->sin6_addr.s6_addr + 12, sizeof(in));
+ addr_str = inet_ntoa(in);
+ D("IPv6 connection, mapped IPv4 addr: %s\n", addr_str);
+ } else {
+ D("Unknown socket family %d\n", addr.ss_family);
+ continue;
+ }
+
// Check the peer ip validation.
if (!is_emulator()
- && !request_validity_to_plugin(PLUGIN_SYNC_CMD_VERIFY_PEERIP, inet_ntoa(addr.sin_addr))) {
+ && !request_validity_to_plugin(PLUGIN_SYNC_CMD_VERIFY_PEERIP, addr_str)) {
sdb_close(fd);
} else {
int ret = -1;