5359edc160de518d8e43fdd3448365c15b912c3c galt Mon Jul 22 11:48:10 2019 -0700 Added ipv6 support. Listening processes us hybrid dual stack feature of OS to simplify implementation and use a single listening socket. Works with both TCP and UDP. Parasol working. geoIp also updated and ready for IPv6. Should be invisible to most users, while providing connections via ipv6 where available. Supports both ipv4 and ipv6. diff --git src/parasol/paraHub/sockSuck.c src/parasol/paraHub/sockSuck.c index cfc19f8..7e26be5 100644 --- src/parasol/paraHub/sockSuck.c +++ src/parasol/paraHub/sockSuck.c @@ -1,54 +1,49 @@ /* SockSuck - A process that sucks messages from a socket * and puts them in the hub queue. */ #include "paraCommon.h" #include "paraHub.h" #include "net.h" static pthread_t sockSuckThread; -boolean ipAddressOk(in_addr_t packed, struct cidr *spec) -/* Return TRUE if packed IP address matches spec. */ -{ -unsigned char unpacked[4]; -internetUnpackIp(packed, unpacked); -return internetIpInSubnetCidr(unpacked, spec); -} - static void *sockSuckDaemon(void *vptr) /* Shovel messages from short socket queue to our * larger hub message queue. */ { struct paraMessage *pm; struct rudp *ru = vptr; for (;;) { AllocVar(pm); if (pmReceive(pm, ru)) { - if (ipAddressOk(ntohl(pm->ipAddress.sin_addr.s_addr), hubSubnet) || - ipAddressOk(ntohl(pm->ipAddress.sin_addr.s_addr), localHostSubnet)) + // Listening on AF_INET6 with hybrid dual stack, ipv4 addresses are ipv4-mapped. + struct sockaddr_in6 *sai6 = (struct sockaddr_in6 *)&pm->ipAddress; + if (internetIpInSubnetCidr(&sai6->sin6_addr, hubSubnet)) { hubMessagePut(pm); } else { - char dottedQuad[17]; - internetIpToDottedQuad(ntohl(pm->ipAddress.sin_addr.s_addr), dottedQuad); - warn("unauthorized access by %s", dottedQuad); + char ipStr[INET6_ADDRSTRLEN]; + if (inet_ntop(AF_INET6, &sai6->sin6_addr, ipStr, sizeof(ipStr))) + { + warn("unauthorized access by %s", ipStr); freez(&pm); } } + } else freez(&pm); } return NULL; // avoid compiler warning } void sockSuckStart(struct rudp *ru) /* Start socket sucker deamon. */ { int err = pthread_create(&sockSuckThread, NULL, sockSuckDaemon, ru); if (err < 0) errAbort("Couldn't create sockSuckThread %s", strerror(err)); }