summaryrefslogtreecommitdiffstats
path: root/src/SocketAddr.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/SocketAddr.c')
-rw-r--r--src/SocketAddr.c31
1 files changed, 21 insertions, 10 deletions
diff --git a/src/SocketAddr.c b/src/SocketAddr.c
index 4322475..b42d272 100644
--- a/src/SocketAddr.c
+++ b/src/SocketAddr.c
@@ -62,6 +62,16 @@
extern "C" {
#endif
+int SockAddr_getAFdomain (iperf_sockaddr *inSockAddr) {
+ return (SockAddr_isIPv6(inSockAddr) ?
+#if HAVE_IPV6
+ AF_INET6
+#else
+ AF_INET
+#endif
+ : AF_INET);
+}
+
/* -------------------------------------------------------------------
* Create a socket address. If inHostname is not null, resolve that
* address and fill it in. Fill in the port number. Use IPv6 ADDR_ANY
@@ -70,7 +80,7 @@ extern "C" {
void SockAddr_remoteAddr (struct thread_Settings *inSettings) {
if (SockAddr_isZeroAddress(&inSettings->peer) == 0) {
if (inSettings->mHost != NULL) {
- SockAddr_setHostname(inSettings->mHost, &inSettings->peer, isIPV6(inSettings));
+ SockAddr_setHostname(inSettings->mHost, &inSettings->peer, &inSettings->size_peer, isIPV6(inSettings));
if (inSettings->incrdstip)
SockAddr_incrAddress(&inSettings->peer, inSettings->incrdstip);
} else {
@@ -100,11 +110,10 @@ void SockAddr_localAddr (struct thread_Settings *inSettings) {
SockAddr_zeroAddress(&inSettings->local);
if (inSettings->mLocalhost != NULL) {
- SockAddr_setHostname(inSettings->mLocalhost, &inSettings->local,
+ SockAddr_setHostname(inSettings->mLocalhost, &inSettings->local, &inSettings->size_local,
isIPV6(inSettings));
if (inSettings->incrsrcip)
SockAddr_incrAddress(&inSettings->local, inSettings->incrsrcip);
-
} else {
#if HAVE_IPV6
if (isIPV6(inSettings)) {
@@ -158,11 +167,6 @@ void SockAddr_localAddr (struct thread_Settings *inSettings) {
/*
* User specified port so use it
*/
-#if HAVE_DECL_SO_REUSEPORT
- int boolean = 1;
- Socklen_t len = sizeof(boolean);
- setsockopt(inSettings->mSock, SOL_SOCKET, SO_REUSEPORT, (char*) &boolean, len);
-#endif
SockAddr_setPort(&inSettings->local, (inSettings->mBindPort + inSettings->incrsrcport));
} else {
/*
@@ -179,12 +183,13 @@ void SockAddr_localAddr (struct thread_Settings *inSettings) {
}
}
}
+
// end SocketAddr
/* -------------------------------------------------------------------
* Resolve the hostname address and fill it in.
* ------------------------------------------------------------------- */
-void SockAddr_setHostname (const char* inHostname, iperf_sockaddr *inSockAddr, int isIPv6) {
+void SockAddr_setHostname (const char* inHostname, iperf_sockaddr *inSockAddr, Socklen_t *addr_size, int isIPv6) {
// ..I think this works for both ipv6 & ipv4... we'll see
bool found = false;
int ret_ga;
@@ -201,6 +206,7 @@ void SockAddr_setHostname (const char* inHostname, iperf_sockaddr *inSockAddr, i
while (itr != NULL) {
if (itr->ai_family == AF_INET) {
memcpy(inSockAddr, (itr->ai_addr), (itr->ai_addrlen));
+ *addr_size = (Socklen_t) sizeof(struct sockaddr_in);
freeaddrinfo(res);
found = true;
break;
@@ -223,6 +229,7 @@ void SockAddr_setHostname (const char* inHostname, iperf_sockaddr *inSockAddr, i
if (itr->ai_family == AF_INET6) {
memcpy(inSockAddr, (itr->ai_addr), (itr->ai_addrlen));
freeaddrinfo(res);
+ *addr_size = (Socklen_t) sizeof(struct sockaddr_in6);
found = true;
break;
} else {
@@ -271,7 +278,11 @@ void SockAddr_setHostname (const char* inHostname, iperf_sockaddr *inSockAddr, i
}
}
if (!found) {
- fprintf(stderr, "ERROR: failed to find an ip address for host '%s'\n", inHostname);
+ if (!isIPv6) {
+ fprintf(stderr, "ERROR: failed to find an ip address for host '%s'\n", inHostname);
+ } else {
+ fprintf(stderr, "ERROR: failed to find an ipv6 address for host '%s'\n", inHostname);
+ }
exit(1);
}
}