You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by am...@apache.org on 2011/08/19 03:30:38 UTC
svn commit: r1159471 [1/2] - in /trafficserver/traffic/trunk: ./
iocore/cluster/ iocore/dns/ iocore/eventsystem/ iocore/hostdb/ iocore/net/
lib/ts/ proxy/ proxy/http/
Author: amc
Date: Fri Aug 19 01:30:36 2011
New Revision: 1159471
URL: http://svn.apache.org/viewvc?rev=1159471&view=rev
Log:
TS-919: Make iocore IPv6 capable.
Modified:
trafficserver/traffic/trunk/CHANGES
trafficserver/traffic/trunk/iocore/cluster/ClusterHandlerBase.cc
trafficserver/traffic/trunk/iocore/dns/DNS.cc
trafficserver/traffic/trunk/iocore/eventsystem/I_SocketManager.h
trafficserver/traffic/trunk/iocore/eventsystem/P_UnixSocketManager.h
trafficserver/traffic/trunk/iocore/eventsystem/SocketManager.cc
trafficserver/traffic/trunk/iocore/hostdb/HostDB.cc
trafficserver/traffic/trunk/iocore/hostdb/P_HostDBProcessor.h
trafficserver/traffic/trunk/iocore/net/Connection.cc
trafficserver/traffic/trunk/iocore/net/I_NetProcessor.h
trafficserver/traffic/trunk/iocore/net/I_NetVConnection.h
trafficserver/traffic/trunk/iocore/net/I_UDPConnection.h
trafficserver/traffic/trunk/iocore/net/I_UDPNet.h
trafficserver/traffic/trunk/iocore/net/I_UDPPacket.h
trafficserver/traffic/trunk/iocore/net/P_Connection.h
trafficserver/traffic/trunk/iocore/net/P_NetVConnection.h
trafficserver/traffic/trunk/iocore/net/P_Socks.h
trafficserver/traffic/trunk/iocore/net/P_UDPConnection.h
trafficserver/traffic/trunk/iocore/net/P_UDPNet.h
trafficserver/traffic/trunk/iocore/net/P_UDPPacket.h
trafficserver/traffic/trunk/iocore/net/P_UnixNetProcessor.h
trafficserver/traffic/trunk/iocore/net/P_UnixNetVConnection.h
trafficserver/traffic/trunk/iocore/net/SSLNetVConnection.cc
trafficserver/traffic/trunk/iocore/net/Socks.cc
trafficserver/traffic/trunk/iocore/net/UnixConnection.cc
trafficserver/traffic/trunk/iocore/net/UnixNetAccept.cc
trafficserver/traffic/trunk/iocore/net/UnixNetPages.cc
trafficserver/traffic/trunk/iocore/net/UnixNetProcessor.cc
trafficserver/traffic/trunk/iocore/net/UnixNetVConnection.cc
trafficserver/traffic/trunk/iocore/net/UnixUDPNet.cc
trafficserver/traffic/trunk/lib/ts/MatcherUtils.cc
trafficserver/traffic/trunk/lib/ts/ink_inet.h
trafficserver/traffic/trunk/lib/ts/ink_sock.cc
trafficserver/traffic/trunk/lib/ts/ink_sock.h
trafficserver/traffic/trunk/proxy/CoreUtils.cc
trafficserver/traffic/trunk/proxy/ICP.cc
trafficserver/traffic/trunk/proxy/ICPConfig.cc
trafficserver/traffic/trunk/proxy/InkAPI.cc
trafficserver/traffic/trunk/proxy/InkAPITest.cc
trafficserver/traffic/trunk/proxy/InkAPITestTool.cc
trafficserver/traffic/trunk/proxy/InkIOCoreAPI.cc
trafficserver/traffic/trunk/proxy/PluginVC.cc
trafficserver/traffic/trunk/proxy/PluginVC.h
trafficserver/traffic/trunk/proxy/UglyLogStubs.cc
trafficserver/traffic/trunk/proxy/http/HttpProxyServerMain.cc
trafficserver/traffic/trunk/proxy/http/HttpSM.cc
Modified: trafficserver/traffic/trunk/CHANGES
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/CHANGES?rev=1159471&r1=1159470&r2=1159471&view=diff
==============================================================================
--- trafficserver/traffic/trunk/CHANGES (original)
+++ trafficserver/traffic/trunk/CHANGES Fri Aug 19 01:30:36 2011
@@ -1,6 +1,8 @@
-*- coding: utf-8 -*-
Changes with Apache Traffic Server 3.1.0
+ *) [TS-919] All of iocore is now IPv6 compatible.
+
*) [TS-867] moving to a different thread only if the pluginvc is invoked
from a non regular thread.
Modified: trafficserver/traffic/trunk/iocore/cluster/ClusterHandlerBase.cc
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/iocore/cluster/ClusterHandlerBase.cc?rev=1159471&r1=1159470&r2=1159471&view=diff
==============================================================================
--- trafficserver/traffic/trunk/iocore/cluster/ClusterHandlerBase.cc (original)
+++ trafficserver/traffic/trunk/iocore/cluster/ClusterHandlerBase.cc Fri Aug 19 01:30:36 2011
@@ -852,7 +852,7 @@ ClusterHandler::connectClusterEvent(int
opt.sockopt_flags = cluster_sockopt_flags;
opt.etype = ET_CLUSTER;
opt.addr_binding = NetVCOptions::INTF_ADDR;
- opt.local_addr = this_cluster_machine()->ip;
+ ink_inet_ip4_set(&opt.local_addr, this_cluster_machine()->ip);
// TODO: Should we check the Action* returned here?
netProcessor.connect_re(this, machine->ip,
Modified: trafficserver/traffic/trunk/iocore/dns/DNS.cc
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/iocore/dns/DNS.cc?rev=1159471&r1=1159470&r2=1159471&view=diff
==============================================================================
--- trafficserver/traffic/trunk/iocore/dns/DNS.cc (original)
+++ trafficserver/traffic/trunk/iocore/dns/DNS.cc Fri Aug 19 01:30:36 2011
@@ -65,9 +65,9 @@ namespace {
}
inline void set_loopback(sockaddr* addr) {
if (prefer_ipv6_p())
- ink_inet_ip6_set(addr, in6addr_any, DOMAIN_SERVICE_PORT);
+ ink_inet_ip6_set(addr, in6addr_loopback, htons(DOMAIN_SERVICE_PORT));
else
- ink_inet_ip4_set(addr, INADDR_LOOPBACK, DOMAIN_SERVICE_PORT);
+ ink_inet_ip4_set(addr, htonl(INADDR_LOOPBACK), htons(DOMAIN_SERVICE_PORT));
}
inline void set_loopback(ts_ip_endpoint* ip) {
set_loopback(&ip->sa);
Modified: trafficserver/traffic/trunk/iocore/eventsystem/I_SocketManager.h
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/iocore/eventsystem/I_SocketManager.h?rev=1159471&r1=1159470&r2=1159471&view=diff
==============================================================================
--- trafficserver/traffic/trunk/iocore/eventsystem/I_SocketManager.h (original)
+++ trafficserver/traffic/trunk/iocore/eventsystem/I_SocketManager.h Fri Aug 19 01:30:36 2011
@@ -72,7 +72,7 @@ struct SocketManager
int64_t pwrite(int fd, void *buf, int len, off_t offset, char *tag = NULL);
int send(int fd, void *buf, int len, int flags);
- int sendto(int fd, void *buf, int len, int flags, struct sockaddr *to, int tolen);
+ int sendto(int fd, void *buf, int len, int flags, struct sockaddr const* to, int tolen);
int sendmsg(int fd, struct msghdr *m, int flags, void *pOLP = 0);
int64_t lseek(int fd, off_t offset, int whence);
int fstat(int fd, struct stat *);
@@ -119,7 +119,7 @@ struct SocketManager
@return 0 if successful, -errno on error.
*/
int close(int sock);
- int ink_bind(int s, struct sockaddr *name, int namelen, short protocol = 0);
+ int ink_bind(int s, struct sockaddr const* name, int namelen, short protocol = 0);
int pagesize;
Modified: trafficserver/traffic/trunk/iocore/eventsystem/P_UnixSocketManager.h
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/iocore/eventsystem/P_UnixSocketManager.h?rev=1159471&r1=1159470&r2=1159471&view=diff
==============================================================================
--- trafficserver/traffic/trunk/iocore/eventsystem/P_UnixSocketManager.h (original)
+++ trafficserver/traffic/trunk/iocore/eventsystem/P_UnixSocketManager.h Fri Aug 19 01:30:36 2011
@@ -254,7 +254,7 @@ SocketManager::send(int fd, void *buf, i
}
TS_INLINE int
-SocketManager::sendto(int fd, void *buf, int len, int flags, struct sockaddr *to, int tolen)
+SocketManager::sendto(int fd, void *buf, int len, int flags, struct sockaddr const* to, int tolen)
{
int r;
do {
Modified: trafficserver/traffic/trunk/iocore/eventsystem/SocketManager.cc
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/iocore/eventsystem/SocketManager.cc?rev=1159471&r1=1159470&r2=1159471&view=diff
==============================================================================
--- trafficserver/traffic/trunk/iocore/eventsystem/SocketManager.cc (original)
+++ trafficserver/traffic/trunk/iocore/eventsystem/SocketManager.cc Fri Aug 19 01:30:36 2011
@@ -112,7 +112,7 @@ safe_mlock(caddr_t addr, size_t len, cad
}
int
-SocketManager::ink_bind(int s, struct sockaddr *name, int namelen, short Proto)
+SocketManager::ink_bind(int s, struct sockaddr const* name, int namelen, short Proto)
{
(void) Proto;
return safe_bind(s, name, namelen);
Modified: trafficserver/traffic/trunk/iocore/hostdb/HostDB.cc
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/iocore/hostdb/HostDB.cc?rev=1159471&r1=1159470&r2=1159471&view=diff
==============================================================================
--- trafficserver/traffic/trunk/iocore/hostdb/HostDB.cc (original)
+++ trafficserver/traffic/trunk/iocore/hostdb/HostDB.cc Fri Aug 19 01:30:36 2011
@@ -670,7 +670,7 @@ HostDBProcessor::getby(Continuation * co
void *pDS = 0;
EThread *thread = this_ethread();
ProxyMutex *mutex = thread->mutex;
- unsigned short port = ink_inet_port_cast(ip);
+ unsigned short port = ink_inet_get_port(ip);
ip_text_buffer ipb;
HOSTDB_INCREMENT_DYN_STAT(hostdb_total_lookups_stat);
@@ -783,7 +783,7 @@ HostDBProcessor::getbyname_re(Continuati
ProxyMutex *mutex = thread->mutex;
sockaddr_in ip;
- ink_inet_ip4_set(&ip, INADDR_ANY, port);
+ ink_inet_ip4_set(&ip, INADDR_ANY, htons(port));
if (flags & HOSTDB_FORCE_DNS_ALWAYS)
force_dns = true;
@@ -825,7 +825,7 @@ HostDBProcessor::getSRVbyname_imm(Contin
}
sockaddr_in ip;
- ink_inet_ip4_set(&ip, INADDR_ANY, port);
+ ink_inet_ip4_set(&ip, INADDR_ANY, htons(port));
if (!len)
len = strlen(hostname);
@@ -881,7 +881,7 @@ HostDBProcessor::getbyname_imm(Continuat
ProxyMutex *mutex = thread->mutex;
sockaddr_in ip_store;
sockaddr* ip = ink_inet_sa_cast(&ip_store);
- ink_inet_ip4_set(ip, INADDR_ANY, port);
+ ink_inet_ip4_set(ip, INADDR_ANY, htons(port));
if (flags & HOSTDB_FORCE_DNS_ALWAYS)
force_dns = true;
@@ -988,7 +988,7 @@ HostDBProcessor::setby(char *hostname, i
return;
INK_MD5 md5;
- unsigned short port = ink_inet_port_cast(ip);
+ unsigned short port = ink_inet_get_port(ip);
// if it is by name, INK_MD5 the name
//
@@ -1097,7 +1097,7 @@ HostDBProcessor::failed_connect_on_ip_fo
INK_MD5 md5;
char *pServerLine = 0;
void *pDS = 0;
- unsigned short port = ink_inet_port_cast(ip);
+ unsigned short port = ink_inet_get_port(ip);
#ifdef SPLIT_DNS
SplitDNS *pSD = 0;
Modified: trafficserver/traffic/trunk/iocore/hostdb/P_HostDBProcessor.h
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/iocore/hostdb/P_HostDBProcessor.h?rev=1159471&r1=1159470&r2=1159471&view=diff
==============================================================================
--- trafficserver/traffic/trunk/iocore/hostdb/P_HostDBProcessor.h (original)
+++ trafficserver/traffic/trunk/iocore/hostdb/P_HostDBProcessor.h Fri Aug 19 01:30:36 2011
@@ -41,8 +41,8 @@ inline unsigned int HOSTDB_CLIENT_IP_HAS
in_addr_t ip2 = ink_inet_ip4_addr_cast(rhs);
zret = (ip1 >> 16) ^ ip1 ^ ip2 ^ (ip2 >> 16);
} else if (ink_inet_is_ip6(lhs)) {
- uint32_t const* ip1 = ink_inet_ip_addr32_cast(lhs);
- uint32_t const* ip2 = ink_inet_ip_addr32_cast(rhs);
+ uint32_t const* ip1 = ink_inet_addr32_cast(lhs);
+ uint32_t const* ip2 = ink_inet_addr32_cast(rhs);
for ( int i = 0 ; i < 4 ; ++i, ++ip1, ++ip2 ) {
zret ^= (*ip1 >> 16) ^ *ip1 ^ *ip2 ^ (*ip2 >> 16);
}
Modified: trafficserver/traffic/trunk/iocore/net/Connection.cc
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/iocore/net/Connection.cc?rev=1159471&r1=1159470&r2=1159471&view=diff
==============================================================================
--- trafficserver/traffic/trunk/iocore/net/Connection.cc (original)
+++ trafficserver/traffic/trunk/iocore/net/Connection.cc Fri Aug 19 01:30:36 2011
@@ -69,7 +69,7 @@ Connection::Connection()
, is_bound(false)
, is_connected(false)
{
- memset(&sa, 0, sizeof(sa));
+ memset(&addr, 0, sizeof(addr));
}
@@ -83,9 +83,9 @@ int
Server::accept(Connection * c)
{
int res = 0;
- socklen_t sz = sizeof(c->sa);
+ socklen_t sz = sizeof(c->addr);
- res = socketManager.accept(fd, (struct sockaddr *)&c->sa, &sz);
+ res = socketManager.accept(fd, &c->addr.sa, &sz);
if (res < 0)
return res;
c->fd = res;
@@ -212,8 +212,8 @@ Server::setup_fd_for_listen(
if ((res = safe_nonblocking(fd)) < 0)
goto Lerror;
{
- int namelen = sizeof(sa);
- if ((res = safe_getsockname(fd, (struct sockaddr *) &sa, &namelen)))
+ int namelen = sizeof(addr);
+ if ((res = safe_getsockname(fd, &addr.sa, &namelen)))
goto Lerror;
}
@@ -241,38 +241,19 @@ Lerror:
int
-Server::listen(int port_number, int domain, bool non_blocking, int recv_bufsize, int send_bufsize, bool transparent)
+Server::listen(bool non_blocking, int recv_bufsize, int send_bufsize, bool transparent)
{
ink_assert(fd == NO_FD);
int res = 0;
- int gai_errno = 0;
+ int namelen;
- char port[6] = {'\0'};
- struct addrinfo hints;
- struct addrinfo *ai_res = NULL;
- struct addrinfo *ai = NULL;
- socklen_t addrlen = 0; // keep track of length of socket address info
- snprintf(port, sizeof(port), "%d", port_number);
-
- memset(&hints, 0, sizeof(hints));
- hints.ai_family = domain;
- hints.ai_socktype = SOCK_STREAM;
- hints.ai_flags = AI_PASSIVE|AI_NUMERICHOST;
- gai_errno = getaddrinfo(accept_ip_str, port, &hints, &ai_res);
- if(0 != gai_errno) {
- Error("getaddrinfo %s:%s error %i: %s", accept_ip_str, port, gai_errno, gai_strerror(gai_errno));
- return -1;
- }
-
- ai = ai_res;
-
- res = socketManager.socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
-
- memset(&sa, 0, sizeof(sa));
- addrlen = ai->ai_addrlen; // save value for later since ai will be freed asap
- memcpy(&sa, ai->ai_addr, ai->ai_addrlen);
+ if (!ink_inet_is_ip(&accept_addr)) {
+ ink_inet_ip4_set(&addr, INADDR_ANY,0);
+ } else {
+ ink_inet_copy(&addr, &accept_addr);
+ }
- freeaddrinfo(ai_res);
+ res = socketManager.socket(addr.sa.sa_family, SOCK_STREAM, IPPROTO_TCP);
if (res < 0)
return res;
@@ -334,13 +315,13 @@ Server::listen(int port_number, int doma
}
#endif
- if (domain == AF_INET6 && (res = safe_setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, ON, sizeof(int))) < 0)
+ if (ink_inet_is_ip6(&addr) && (res = safe_setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, ON, sizeof(int))) < 0)
goto Lerror;
if ((res = safe_setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, ON, sizeof(int))) < 0)
goto Lerror;
- if ((res = socketManager.ink_bind(fd, (struct sockaddr *) &sa, addrlen, IPPROTO_TCP)) < 0) {
+ if ((res = socketManager.ink_bind(fd, &addr.sa, ink_inet_ip_size(&addr.sa), IPPROTO_TCP)) < 0) {
goto Lerror;
}
#ifdef SET_TCP_NO_DELAY
@@ -377,16 +358,15 @@ Server::listen(int port_number, int doma
if (non_blocking)
if ((res = safe_nonblocking(fd)) < 0)
goto Lerror;
- if (!port_number) {
- int namelen = sizeof(sa);
- if ((res = safe_getsockname(fd, (struct sockaddr *) &sa, &namelen)))
+ // Original just did this on port == 0.
+ namelen = sizeof(addr);
+ if ((res = safe_getsockname(fd, &addr.sa, &namelen)))
goto Lerror;
- }
return 0;
Lerror:
if (fd != NO_FD)
close();
- Error("Could not bind or listen to port %d (error: %d)", port_number, res);
+ Error("Could not bind or listen to port %d (error: %d)", ink_inet_get_port(&addr), res);
return res;
}
Modified: trafficserver/traffic/trunk/iocore/net/I_NetProcessor.h
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/iocore/net/I_NetProcessor.h?rev=1159471&r1=1159470&r2=1159471&view=diff
==============================================================================
--- trafficserver/traffic/trunk/iocore/net/I_NetProcessor.h (original)
+++ trafficserver/traffic/trunk/iocore/net/I_NetProcessor.h Fri Aug 19 01:30:36 2011
@@ -52,6 +52,8 @@ public:
/// Should we use accept threads? If so, how many?
int accept_threads;
/// Communication domain (default: AF_INET)
+ /// @note Ignored if an explicit incoming address is set in the
+ /// the configuration (@c incoming_ip_to_bind).
int domain;
/// Event type to generate on accept.
EventType etype;
@@ -60,6 +62,13 @@ public:
or @c NET_EVENT_ACCEPT_FAILED on success and failure resp.
*/
bool f_callback_on_open;
+ /** Accept only on the loopback address.
+ Default: @c false.
+ */
+ bool localhost_only;
+ /// Are frequent accepts expected?
+ /// Default: @c false.
+ bool frequent_accept;
/// Socket receive buffer size.
/// 0 => OS default.
@@ -105,6 +114,23 @@ public:
@param cont Continuation to be called back with events this
continuation is not locked on callbacks and so the handler must
be re-entrant.
+ @param addr address and/or port to bind.
+ @param opt Accept options.
+ @return Action, that can be cancelled to cancel the accept. The
+ port becomes free immediately.
+ */
+ inkcoreapi virtual Action * accept(
+ Continuation * cont,
+ sockaddr const* addr,
+ AcceptOptions const& opt = DEFAULT_ACCEPT_OPTIONS
+ );
+
+ /**
+ @deprecated preserve backward compatibility with non-IPv6 iocore
+
+ @param cont Continuation to be called back with events this
+ continuation is not locked on callbacks and so the handler must
+ be re-entrant.
@param port port to bind for accept.
@param domain communication domain
@param frequent_accept if true, accept is done on all event
@@ -115,7 +141,6 @@ public:
@param callback_on_open if true, cont is called back with
NET_EVENT_ACCEPT_SUCCEED, or NET_EVENT_ACCEPT_FAILED on success
and failure resp.
- @param listen_socket_in if passed, used for listening.
@param accept_pool_size NT specific, better left unspecified.
@param accept_only can be used to customize accept, accept a
connection only if there is some data to be read. This works
@@ -132,6 +157,7 @@ public:
port becomes free immediately.
*/
+
inkcoreapi virtual Action * accept(Continuation * cont, int port, int domain = AF_INET, int accept_threads = -1,
bool frequent_accept = false,
// not used
@@ -142,7 +168,27 @@ public:
sockaddr * bound_sockaddr = 0,
int *bound_sockaddr_size = 0,
int recv_bufsize = 0,
- int send_bufsize = 0, uint32_t sockopt_flag = 0, EventType etype = ET_NET);
+ int send_bufsize = 0, uint32_t sockopt_flag = 0, EventType etype = ET_NET)
+ {
+ ts_ip_endpoint ip;
+ AcceptOptions opt;
+
+ if (accept_ip_str != NULL) {
+ ink_inet_pton(accept_ip_str, &ip.sa);
+ ink_inet_port_cast(&ip) = htons(port);
+ opt.domain = ip.sa.sa_family;
+ } else {
+ ink_inet_ip4_set(&ip, accept_ip, htons(port));
+ }
+
+ opt.send_bufsize = send_bufsize;
+ opt.recv_bufsize = recv_bufsize;
+ opt.sockopt_flags = sockopt_flag;
+ opt.accept_threads = accept_threads;
+ opt.etype = etype;
+ opt.frequent_accept = frequent_accept;
+ return accept(cont, &ip.sa, opt);
+ }
/**
Accepts incoming connections on port. Accept connections on port.
@@ -163,6 +209,24 @@ public:
continuation is not locked on callbacks and so the handler must
be re-entrant.
@param listen_socket_in if passed, used for listening.
+ @param opt Accept options.
+ @return Action, that can be cancelled to cancel the accept. The
+ port becomes free immediately.
+
+ */
+ virtual Action *main_accept(
+ Continuation * cont,
+ SOCKET listen_socket_in,
+ AcceptOptions const& opt = DEFAULT_ACCEPT_OPTIONS
+ );
+
+ /**
+ @deprecated preserve backward compatibility with non-IPv6 iocore
+
+ @param cont Continuation to be called back with events this
+ continuation is not locked on callbacks and so the handler must
+ be re-entrant.
+ @param listen_socket_in if passed, used for listening.
@param port port to bind for accept.
@param bound_sockaddr returns the sockaddr for the listen fd.
@param bound_sockaddr_size size of the sockaddr returned.
@@ -182,10 +246,21 @@ public:
port becomes free immediately.
*/
- virtual Action *main_accept(Continuation * cont, SOCKET listen_socket_in, sockaddr * bound_sockaddr = NULL,
- int *bound_sockaddr_size = NULL, bool accept_only = false, bool localhost_only = false,
- AcceptOptions const& opt = DEFAULT_ACCEPT_OPTIONS);
-
+ virtual Action *main_accept(
+ Continuation * cont,
+ SOCKET listen_socket_in,
+ sockaddr * bound_sockaddr = NULL,
+ int *bound_sockaddr_size = NULL,
+ bool accept_only = false,
+ bool localhost_only = false,
+ AcceptOptions const& opt = DEFAULT_ACCEPT_OPTIONS
+ )
+ {
+ AcceptOptions new_opt = opt;
+ new_opt.localhost_only = localhost_only;
+ return main_accept(cont, listen_socket_in, new_opt);
+ }
+
/**
Open a NetVConnection for connection oriented I/O. Connects
through sockserver if netprocessor is configured to use socks
@@ -202,14 +277,31 @@ public:
@see connect_s()
@param cont Continuation to be called back with events.
- @param ip machine to connect to.
- @param port port to connect to.
+ @param addr target address and port to connect to.
@param options @see NetVCOptions.
*/
- inkcoreapi Action *connect_re(Continuation * cont,
- unsigned int ip, int port, NetVCOptions * options = NULL);
+ inkcoreapi Action *connect_re(
+ Continuation * cont,
+ sockaddr const* addr,
+ NetVCOptions * options = NULL
+ );
+
+ /**
+ @deprecated preserve backward compatibility with non-IPv6 iocore
+ */
+ inkcoreapi Action *connect_re(
+ Continuation * cont,
+ unsigned int ip,
+ int port,
+ NetVCOptions * options = NULL
+ ) {
+ struct sockaddr_in addr;
+
+ ink_inet_ip4_set(&addr, ip, htons(port));
+ return connect_re(cont, ink_inet_sa_cast(&addr), options);
+ }
/**
Open a NetVConnection for connection oriented I/O. This call
@@ -221,20 +313,38 @@ public:
asynchronous type connect is desired use connect_re().
@param cont Continuation to be called back with events.
- @param ip machine to connect to.
- @param port port to connect to.
+ @param addr Address to which to connect (includes port).
@param timeout for connect, the cont will get NET_EVENT_OPEN_FAILED
- if connection could not be established for timeout secs. The
+ if connection could not be established for timeout msecs. The
default is 30 secs.
@param options @see NetVCOptions.
@see connect_re()
*/
- Action *connect_s(Continuation * cont,
- unsigned int ip,
- int port,
- int timeout = NET_CONNECT_TIMEOUT, NetVCOptions * opts = NULL);
+ Action *connect_s(
+ Continuation * cont,
+ sockaddr const* addr,
+ int timeout = NET_CONNECT_TIMEOUT,
+ NetVCOptions * opts = NULL
+ );
+
+ /**
+ @deprecated preserve backward compatibility with non-IPv6 iocore
+ */
+
+ Action *connect_s(
+ Continuation * cont,
+ unsigned int ip,
+ int port,
+ int timeout = NET_CONNECT_TIMEOUT,
+ NetVCOptions * opts = NULL
+ ) {
+ struct sockaddr_in addr;
+
+ ink_inet_ip4_set(&addr, ip, htons(port));
+ return connect_s(cont, ink_inet_sa_cast(&addr), timeout, opts);
+ }
/**
Starts the Netprocessor. This has to be called before doing any
Modified: trafficserver/traffic/trunk/iocore/net/I_NetVConnection.h
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/iocore/net/I_NetVConnection.h?rev=1159471&r1=1159470&r2=1159471&view=diff
==============================================================================
--- trafficserver/traffic/trunk/iocore/net/I_NetVConnection.h (original)
+++ trafficserver/traffic/trunk/iocore/net/I_NetVConnection.h Fri Aug 19 01:30:36 2011
@@ -48,10 +48,18 @@ enum NetDataType
This class holds various options a user can specify for
NetVConnection. Various clients need many slightly different
features. This is an attempt to prevent out of control growth of
- the connection method signatures.
+ the connection method signatures. Only options of interest need to
+ be explicitly set -- the rest get sensible default values.
- Only options of interest need to be explicitly set --
- the rest get sensible default values.
+ @note Binding addresses is a bit complex. It is not currently
+ possible to bind indiscriminately across protocols, which means
+ any connection must commit to IPv4 or IPv6. For this reason the
+ connection logic will look at the address family of @a local_addr
+ even if @a addr_binding is @c ANY_ADDR and bind to any address in
+ that protocol. If it's not an IP protocol, IPv4 will be used.
+
+ @note Port values are encoded in the address. Use a port value
+ of 0 to indicate "don't care".
*/
struct NetVCOptions {
typedef NetVCOptions self; ///< Self reference type.
@@ -67,6 +75,9 @@ struct NetVCOptions {
/** The set of ways in which the local address should be bound.
+ The protocol is set by the contents of @a local_addr regardless
+ of this value. @c ANY_ADDR will override only the address.
+
@note The difference between @c INTF_ADDR and @c FOREIGN_ADDR is
whether transparency is enabled on the socket. It is the
client's responsibility to set this correctly based on whether the
@@ -83,23 +94,10 @@ struct NetVCOptions {
FOREIGN_ADDR ///< Bind to foreign address in @a local_addr.
};
- /// The set of ways in which the local port should be bound.
- enum port_bind_style {
- ANY_PORT, ///< Bind to any available local port (don't care, default).
- FIXED_PORT ///< Bind to the port in @a local_port.
- };
-
- /// Port to use for local side of connection.
- /// @note Ignored if @a port_binding is @c ANY_PORT.
- /// @see port_binding
- uint16_t local_port;
- /// How to bind local port.
- /// @note Default is @c ANY_PORT.
- port_bind_style port_binding;
/// Address to use for local side of connection.
/// @note Ignored if @a addr_binding is @c ANY_ADDR.
/// @see addr_binding
- uint32_t local_addr;
+ ts_ip_endpoint local_addr;
/// How to bind the local address.
/// @note Default is @c ANY_ADDR.
addr_bind_style addr_binding;
@@ -371,20 +369,25 @@ public:
/** Returns local sockaddr storage. */
sockaddr const* get_local_addr();
- /** Returns local ip. */
- unsigned int get_local_ip();
+ /** Returns local ip.
+ @deprecated get_local_addr() should be used instead for AF_INET6 compatibility.
+ */
+
+ in_addr_t get_local_ip();
/** Returns local port. */
- int get_local_port();
+ uint16_t get_local_port();
/** Returns remote sockaddr storage. */
sockaddr const* get_remote_addr();
- /** Returns remote ip. */
- unsigned int get_remote_ip();
+ /** Returns remote ip.
+ @deprecated get_remote_addr() should be used instead for AF_INET6 compatibility.
+ */
+ in_addr_t get_remote_ip();
/** Returns remote port. */
- int get_remote_port();
+ uint16_t get_remote_port();
/** Structure holding user options. */
NetVCOptions options;
@@ -458,12 +461,11 @@ private:
NetVConnection & operator =(const NetVConnection &);
protected:
- // An IPv6 struct suffices for IP addresses.
- struct sockaddr_in6 local_addr;
- struct sockaddr_in6 remote_addr;
+ ts_ip_endpoint local_addr;
+ ts_ip_endpoint remote_addr;
- int got_local_addr;
- int got_remote_addr;
+ bool got_local_addr;
+ bool got_remote_addr;
bool is_internal_request;
/// Set if this connection is transparent.
Modified: trafficserver/traffic/trunk/iocore/net/I_UDPConnection.h
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/iocore/net/I_UDPConnection.h?rev=1159471&r1=1159470&r2=1159471&view=diff
==============================================================================
--- trafficserver/traffic/trunk/iocore/net/I_UDPConnection.h (original)
+++ trafficserver/traffic/trunk/iocore/net/I_UDPConnection.h Fri Aug 19 01:30:36 2011
@@ -50,8 +50,8 @@ public:
};
SOCKET getFd();
- void setBinding(struct sockaddr_in *);
- inkcoreapi int getBinding(struct sockaddr_in *);
+ void setBinding(struct sockaddr const *);
+ inkcoreapi int getBinding(struct sockaddr *);
void destroy();
int shouldDestroy();
Modified: trafficserver/traffic/trunk/iocore/net/I_UDPNet.h
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/iocore/net/I_UDPNet.h?rev=1159471&r1=1159470&r2=1159471&view=diff
==============================================================================
--- trafficserver/traffic/trunk/iocore/net/I_UDPNet.h (original)
+++ trafficserver/traffic/trunk/iocore/net/I_UDPNet.h Fri Aug 19 01:30:36 2011
@@ -34,6 +34,8 @@
#include "I_Version.h"
#include "I_EventSystem.h"
+#include "ink_inet.h"
+
/**
UDP service
@@ -47,9 +49,14 @@ public:
//this function was interanal intially.. this is required for public and
//interface probably should change.
- bool CreateUDPSocket(int *resfd, struct sockaddr_in *addr,
- Action ** status,
- int my_port, unsigned int my_ip = 0, int send_bufsize = 0, int recv_bufsize = 0);
+ bool CreateUDPSocket(
+ int *resfd,
+ sockaddr const* remote_addr,
+ sockaddr* local_addr,
+ int* local_addr_len,
+ Action ** status,
+ int send_bufsize = 0, int recv_bufsize = 0
+ );
/**
create UDPConnection
@@ -63,8 +70,7 @@ public:
@param c Continuation that is called back with newly created
socket.
- @param my_port Local port to be bound (required)
- @param my_ip Local IP to be bound (optional). Defaults to '0' (INADDR_ANY)
+ @param addr Address to bind (includes port)
@param send_bufsize (optional) Socket buffer size for sending.
Limits how much outstanding data to OS before it is able to send
to the NIC.
@@ -73,17 +79,18 @@ public:
@return Action* Always returns ACTION_RESULT_DONE if socket was
created successfuly, or ACTION_IO_ERROR if not.
*/
- inkcoreapi Action *UDPBind(Continuation * c, int my_port, int my_ip = 0, int send_bufsize = 0, int recv_bufsize = 0);
+ inkcoreapi Action *UDPBind(Continuation * c, sockaddr const* addr, int send_bufsize = 0, int recv_bufsize = 0);
// The mess again: the complier won't let me stick UDPConnection here.
- void UDPClassifyConnection(Continuation * udpConn, int destIP);
+ void UDPClassifyConnection(Continuation * udpConn, InkInetAddr const& addr);
// create pairs of UDPConnections in which the first connection is
// on a even-#'ed port and the second connection is on the next
// odd-#'ed port. Create "nPairs" of such connections.
Action *UDPCreatePortPairs(Continuation *, int nPairs,
- unsigned int myIP = 0,
- unsigned int destIP = 0, int send_bufsize = 0, int recv_bufsize = 0);
+ sockaddr const* local_addr,
+ sockaddr const* remote_addr,
+ int send_bufsize = 0, int recv_bufsize = 0);
// Regarding sendto_re, sendmsg_re, recvfrom_re:
// * You may be called back on 'c' with completion or error status.
@@ -105,13 +112,13 @@ public:
// * You can get other info about the completed operation through use
// of the completionUtil class.
Action *sendto_re(Continuation * c, void *token, int fd,
- struct sockaddr *toaddr, int toaddrlen, IOBufferBlock * buf, int len);
+ sockaddr const* toaddr, int toaddrlen, IOBufferBlock * buf, int len);
// I/O buffers referenced by msg must be pinned by the caller until
// continuation is called back.
Action *sendmsg_re(Continuation * c, void *token, int fd, struct msghdr *msg);
Action *recvfrom_re(Continuation * c, void *token, int fd,
- struct sockaddr *fromaddr, socklen_t *fromaddrlen,
+ sockaddr *fromaddr, socklen_t *fromaddrlen,
IOBufferBlock * buf, int len, bool useReadCont = true, int timeout = 0);
// Continuation is really a UDPConnection; due to the include mess, we stick in the
// base-class of UDPConnection.
Modified: trafficserver/traffic/trunk/iocore/net/I_UDPPacket.h
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/iocore/net/I_UDPPacket.h?rev=1159471&r1=1159470&r2=1159471&view=diff
==============================================================================
--- trafficserver/traffic/trunk/iocore/net/I_UDPPacket.h (original)
+++ trafficserver/traffic/trunk/iocore/net/I_UDPPacket.h Fri Aug 19 01:30:36 2011
@@ -65,8 +65,8 @@ public:
inkcoreapi void append_block(IOBufferBlock * block);
virtual void UDPPacket_is_abstract() = 0;
- struct sockaddr_in from; // what address came from
- struct sockaddr_in to; // what address to send to
+ ts_ip_endpoint from; // what address came from
+ ts_ip_endpoint to; // what address to send to
int from_size;
@@ -83,7 +83,7 @@ public:
@param buf if !NULL, then len bytes copied from buf and made into packet.
@param len # of bytes to copy from buf
*/
-TS_INLINE UDPPacket *new_UDPPacket(struct sockaddr_in *to, ink_hrtime when = 0, char *buf = NULL, int len = 0);
+TS_INLINE UDPPacket *new_UDPPacket(struct sockaddr const* to, ink_hrtime when = 0, char *buf = NULL, int len = 0);
/**
Create a new packet to be sent over UDPConnection. This clones and
makes a reference to an existing IOBufferBlock chain.
@@ -95,7 +95,7 @@ TS_INLINE UDPPacket *new_UDPPacket(struc
for packet
@param len # of bytes to reference from block
*/
-TS_INLINE UDPPacket *new_UDPPacket(struct sockaddr_in *to,
+TS_INLINE UDPPacket *new_UDPPacket(struct sockaddr const* to,
ink_hrtime when = 0, IOBufferBlock * block = NULL, int len = 0);
/**
Create a new packet to be sent over UDPConnection. Packet has no
@@ -107,7 +107,7 @@ TS_INLINE UDPPacket *new_UDPPacket();
Create a new packet to be delivered to application.
Internal function only
*/
-TS_INLINE UDPPacket *new_incoming_UDPPacket(struct sockaddr_in *from, char *buf, int len);
+TS_INLINE UDPPacket *new_incoming_UDPPacket(struct sockaddr* from, char *buf, int len);
//@}
#endif //__I_UDPPACKET_H_
Modified: trafficserver/traffic/trunk/iocore/net/P_Connection.h
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/iocore/net/P_Connection.h?rev=1159471&r1=1159470&r2=1159471&view=diff
==============================================================================
--- trafficserver/traffic/trunk/iocore/net/P_Connection.h (original)
+++ trafficserver/traffic/trunk/iocore/net/P_Connection.h Fri Aug 19 01:30:36 2011
@@ -81,7 +81,7 @@ struct NetVCOptions;
struct Connection
{
SOCKET fd; ///< Socket for connection.
- sockaddr_in6 sa; ///< Remote address.
+ ts_ip_endpoint addr; ///< Associated address.
bool is_bound; ///< Flag for already bound to a local address.
bool is_connected; ///< Flag for already connected.
@@ -111,8 +111,7 @@ struct Connection
@see open
*/
int connect(
- uint32_t addr, ///< Remote address.
- uint16_t port, ///< Remote port.
+ sockaddr const* to, ///< Remote address and port.
NetVCOptions const& opt = DEFAULT_OPTIONS ///< Socket options
);
@@ -120,20 +119,66 @@ struct Connection
/// Set the internal socket address struct.
/// @internal Used only by ICP.
void setRemote(
- uint32_t addr, ///< Remote IP address.
- uint16_t port ///< Remote port.
+ sockaddr const* remote_addr ///< Address and port.
) {
- ink_inet_ip4_set(&sa, addr, htons(port));
+ ink_inet_copy(&addr, remote_addr);
}
+
+ /**
+ @deprecated preserve backward compatibility with non-IPv6 iocore
+ */
+ void setRemote(
+ in_addr_t ip,
+ int port
+ ) {
+ ink_inet_ip4_set(&addr.sin, ip, htons(port));
+ }
+
+ int setup_mc_send(sockaddr const* mc_addr,
+ sockaddr const* my_addr,
+ bool non_blocking = NON_BLOCKING,
+ unsigned char mc_ttl = 1, bool mc_loopback = DISABLE_MC_LOOPBACK, Continuation * c = NULL);
+
+ /**
+ @deprecated preserve backward compatibility with non-IPv6 iocore
+ */
+
int setup_mc_send(unsigned int mc_ip, int mc_port,
unsigned int my_ip, int my_port,
bool non_blocking = NON_BLOCKING,
- unsigned char mc_ttl = 1, bool mc_loopback = DISABLE_MC_LOOPBACK, Continuation * c = NULL);
+ unsigned char mc_ttl = 1, bool mc_loopback = DISABLE_MC_LOOPBACK, Continuation * c = NULL)
+ {
+ struct sockaddr_in mc_addr;
+ struct sockaddr_in my_addr;
+
+ ink_inet_ip4_set(&mc_addr, mc_ip, htons(mc_port));
+ ink_inet_ip4_set(&my_addr, my_ip, htons(my_port));
+
+ return setup_mc_send(
+ ink_inet_sa_cast(&mc_addr),
+ ink_inet_sa_cast(&my_addr),
+ non_blocking, mc_ttl, mc_loopback, c);
+ }
- int setup_mc_receive(unsigned int mc_ip, int port,
+
+ int setup_mc_receive(sockaddr const* from,
bool non_blocking = NON_BLOCKING, Connection * sendchan = NULL, Continuation * c = NULL);
+ /**
+ @deprecated preserve backward compatibility with non-IPv6 iocore
+ */
+
+ int setup_mc_receive(unsigned int mc_ip, int port,
+ bool non_blocking = NON_BLOCKING, Connection * sendchan = NULL, Continuation * c = NULL)
+ {
+ struct sockaddr_in mc_addr;
+ ink_inet_ip4_set(&mc_addr, mc_ip, port);
+
+ return setup_mc_receive(ink_inet_sa_cast(&mc_addr), non_blocking, sendchan, c);
+ }
+
+
int close(); // 0 on success, -errno on failure
virtual ~ Connection();
@@ -156,8 +201,7 @@ struct Server: public Connection
//
// IP address in network byte order
//
- unsigned int accept_ip;
- char *accept_ip_str;
+ ts_ip_endpoint accept_addr;
/// If set, transparently connect to origin server for requests.
bool f_outbound_transparent;
@@ -172,12 +216,12 @@ struct Server: public Connection
int accept(Connection * c);
//
- // Listen on a socket. We assume the port is in host by orderr, but
- // that the IP address (specified by accept_ip) has already been
+ // Listen on a socket. We assume the port is in host by order, but
+ // that the IP address (specified by accept_addr) has already been
// converted into network byte order
//
- int listen(int port, int domain = AF_INET, bool non_blocking = false, int recv_bufsize = 0, int send_bufsize = 0, bool transparent = false);
+ int listen(bool non_blocking = false, int recv_bufsize = 0, int send_bufsize = 0, bool transparent = false);
int setup_fd_for_listen(
bool non_blocking = false,
int recv_bufsize = 0,
@@ -187,10 +231,10 @@ struct Server: public Connection
Server()
: Connection()
- , accept_ip(INADDR_ANY)
- , accept_ip_str(NULL)
, f_outbound_transparent(false)
- { }
+ {
+ memset(&accept_addr, 0, sizeof(accept_addr));
+ }
};
#endif /*_Connection_h*/
Modified: trafficserver/traffic/trunk/iocore/net/P_NetVConnection.h
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/iocore/net/P_NetVConnection.h?rev=1159471&r1=1159470&r2=1159471&view=diff
==============================================================================
--- trafficserver/traffic/trunk/iocore/net/P_NetVConnection.h (original)
+++ trafficserver/traffic/trunk/iocore/net/P_NetVConnection.h Fri Aug 19 01:30:36 2011
@@ -28,12 +28,12 @@ NetVConnection::get_remote_addr()
{
if (!got_remote_addr) {
set_remote_addr();
- got_remote_addr = 1;
+ got_remote_addr = true;
}
- return ink_inet_sa_cast(&remote_addr);
+ return &remote_addr.sa;
}
-TS_INLINE unsigned int
+TS_INLINE in_addr_t
NetVConnection::get_remote_ip()
{
sockaddr const* addr = this->get_remote_addr();
@@ -44,7 +44,7 @@ NetVConnection::get_remote_ip()
/// @return The remote port in host order.
-TS_INLINE int
+TS_INLINE uint16_t
NetVConnection::get_remote_port()
{
return ink_inet_get_port(this->get_remote_addr());
@@ -55,19 +55,18 @@ NetVConnection::get_local_addr()
{
if (!got_local_addr) {
set_local_addr();
- sockaddr* a = ink_inet_sa_cast(&local_addr); // cache required type.
if (
- (ink_inet_is_ip(a) && ink_inet_port_cast(a)) // IP and has a port.
- || (ink_inet_is_ip4(a) && ink_inet_ip4_addr_cast(a)) // IPv4
- || (ink_inet_is_ip6(a) && !IN6_IS_ADDR_UNSPECIFIED(&ink_inet_ip6_addr_cast(a)))
+ (ink_inet_is_ip(&local_addr) && ink_inet_port_cast(&local_addr)) // IP and has a port.
+ || (ink_inet_is_ip4(&local_addr) && INADDR_ANY != ink_inet_ip4_addr_cast(&local_addr)) // IPv4
+ || (ink_inet_is_ip6(&local_addr) && !IN6_IS_ADDR_UNSPECIFIED(&local_addr.sin6.sin6_addr))
) {
got_local_addr = 1;
}
}
- return ink_inet_sa_cast(&local_addr);
+ return &local_addr.sa;
}
-TS_INLINE unsigned int
+TS_INLINE in_addr_t
NetVConnection::get_local_ip()
{
sockaddr const* addr = this->get_local_addr();
@@ -77,7 +76,7 @@ NetVConnection::get_local_ip()
}
/// @return The local port in host order.
-TS_INLINE int
+TS_INLINE uint16_t
NetVConnection::get_local_port()
{
return ink_inet_get_port(this->get_local_addr());
Modified: trafficserver/traffic/trunk/iocore/net/P_Socks.h
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/iocore/net/P_Socks.h?rev=1159471&r1=1159470&r2=1159471&view=diff
==============================================================================
--- trafficserver/traffic/trunk/iocore/net/P_Socks.h (original)
+++ trafficserver/traffic/trunk/iocore/net/P_Socks.h Fri Aug 19 01:30:36 2011
@@ -62,14 +62,16 @@ struct socks_conf_struct
#endif
#ifndef SOCKS_WITH_TS
- unsigned int socks_server;
- int socks_server_port;
+ ts_ip_endpoint server_addr;
#endif
socks_conf_struct():socks_needed(0), server_connect_timeout(0), socks_timeout(100), default_version(5),
user_name_n_passwd(NULL), user_name_n_passwd_len(0),
per_server_connection_attempts(1), connection_attempts(0), accept_enabled(0), accept_port(0), http_port(1080)
{
+# if !defined(SOCKS_WITH_TS)
+ memset(&server_addr, 0, sizeof(server_addr));
+# endif
}
};
@@ -112,11 +114,11 @@ struct SocksEntry:public Continuation
SocksNetVC *netVConnection;
- unsigned int ip; // ip address in the original request
- int port; // port number in the original request
+ // Changed from @a ip and @a port.
+ ts_ip_endpoint target_addr; ///< Original target address.
+ // Changed from @a server_ip, @a server_port.
+ ts_ip_endpoint server_addr; ///< Origin server address.
- unsigned int server_ip;
- int server_port;
int nattempts;
Action action_;
@@ -143,9 +145,11 @@ struct SocksEntry:public Continuation
void free();
SocksEntry():Continuation(NULL), netVConnection(0),
- ip(0), port(0), server_ip(0), server_port(0), nattempts(0),
+ nattempts(0),
lerrno(0), timeout(0), version(5), write_done(false), auth_handler(NULL), socks_cmd(NORMAL_SOCKS)
{
+ memset(&target_addr, 0, sizeof(target_addr));
+ memset(&server_addr, 0, sizeof(server_addr));
}
};
Modified: trafficserver/traffic/trunk/iocore/net/P_UDPConnection.h
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/iocore/net/P_UDPConnection.h?rev=1159471&r1=1159470&r2=1159471&view=diff
==============================================================================
--- trafficserver/traffic/trunk/iocore/net/P_UDPConnection.h (original)
+++ trafficserver/traffic/trunk/iocore/net/P_UDPConnection.h Fri Aug 19 01:30:36 2011
@@ -46,7 +46,7 @@ public:
int refcount; // public for assertion
SOCKET fd;
- struct sockaddr_in binding;
+ ts_ip_endpoint binding;
int binding_valid;
int tobedestroyed;
int sendGenerationNum;
@@ -110,18 +110,18 @@ UDPConnection::getFd()
}
TS_INLINE void
-UDPConnection::setBinding(struct sockaddr_in *s)
+UDPConnection::setBinding(struct sockaddr const* s)
{
UDPConnectionInternal *p = (UDPConnectionInternal *) this;
- memcpy(&p->binding, s, sizeof(p->binding));
+ ink_inet_copy(&p->binding, s);
p->binding_valid = 1;
}
TS_INLINE int
-UDPConnection::getBinding(struct sockaddr_in *s)
+UDPConnection::getBinding(struct sockaddr *s)
{
UDPConnectionInternal *p = (UDPConnectionInternal *) this;
- memcpy(s, &p->binding, sizeof(*s));
+ ink_inet_copy(s, &p->binding);
return p->binding_valid;
}
@@ -165,7 +165,7 @@ UDPConnection::GetSendGenerationNumber()
TS_INLINE int
UDPConnection::getPortNum(void)
{
- return ((UDPConnectionInternal *) this)->binding.sin_port;
+ return ink_inet_get_port(&static_cast<UDPConnectionInternal *>(this)->binding);
}
TS_INLINE int64_t
Modified: trafficserver/traffic/trunk/iocore/net/P_UDPNet.h
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/iocore/net/P_UDPNet.h?rev=1159471&r1=1159470&r2=1159471&view=diff
==============================================================================
--- trafficserver/traffic/trunk/iocore/net/P_UDPNet.h (original)
+++ trafficserver/traffic/trunk/iocore/net/P_UDPNet.h Fri Aug 19 01:30:36 2011
@@ -399,7 +399,6 @@ struct InkSinglePipeInfo
{
wt = 0.0;
bwLimit = 0;
- destIP = 0;
count = 0;
bytesSent = pktsSent = 0;
bwAlloc = 0;
@@ -417,7 +416,7 @@ struct InkSinglePipeInfo
int64_t bwAlloc;
// this is in Mbps
double bwUsed;
- int32_t destIP;
+ InkInetAddr destIP;
uint32_t count;
uint64_t bytesSent;
uint64_t pktsSent;
@@ -437,13 +436,18 @@ extern InkPipeInfo G_inkPipeInfo;
class UDPWorkContinuation:public Continuation
{
public:
- UDPWorkContinuation():cont(NULL), numPairs(0), myIP(0), destIP(0),
+ UDPWorkContinuation():cont(NULL), numPairs(0),
sendbufsize(0), recvbufsize(0), udpConns(NULL), resultCode(NET_EVENT_DATAGRAM_OPEN)
{
+ memset(&local_ip, 0, sizeof(local_ip));
+ memset(&remote_ip, 0, sizeof(remote_ip));
};
~UDPWorkContinuation() {
};
- void init(Continuation * c, int num_pairs, unsigned int my_ip, unsigned int dest_ip, int s_bufsize, int r_bufsize);
+ void init(Continuation * c, int num_pairs,
+ sockaddr const* local_ip,
+ sockaddr const* remote_ip,
+ int s_bufsize, int r_bufsize);
int StateCreatePortPairs(int event, void *data);
int StateDoCallback(int event, void *data);
@@ -452,7 +456,8 @@ public:
private:
Continuation * cont;
int numPairs;
- unsigned int myIP, destIP;
+ ts_ip_endpoint local_ip; ///< replaces myIP.
+ ts_ip_endpoint remote_ip; ///< replaces destIP.
int sendbufsize, recvbufsize;
UnixUDPConnection **udpConns;
int resultCode;
Modified: trafficserver/traffic/trunk/iocore/net/P_UDPPacket.h
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/iocore/net/P_UDPPacket.h?rev=1159471&r1=1159470&r2=1159471&view=diff
==============================================================================
--- trafficserver/traffic/trunk/iocore/net/P_UDPPacket.h (original)
+++ trafficserver/traffic/trunk/iocore/net/P_UDPPacket.h Fri Aug 19 01:30:36 2011
@@ -210,7 +210,7 @@ UDPPacket::setArrivalTime(ink_hrtime t)
}
TS_INLINE UDPPacket *
-new_UDPPacket(struct sockaddr_in *to, ink_hrtime when, char *buf, int len)
+new_UDPPacket(struct sockaddr const* to, ink_hrtime when, char *buf, int len)
{
UDPPacketInternal *p = udpPacketAllocator.alloc();
@@ -219,7 +219,7 @@ new_UDPPacket(struct sockaddr_in *to, in
p->in_heap = 0;
#endif
p->delivery_time = when;
- memcpy(&p->to, to, sizeof(p->to));
+ ink_inet_copy(&p->to, to);
if (buf) {
IOBufferBlock *body = new_IOBufferBlock();
@@ -233,7 +233,7 @@ new_UDPPacket(struct sockaddr_in *to, in
}
TS_INLINE UDPPacket *
-new_UDPPacket(struct sockaddr_in * to, ink_hrtime when, IOBufferBlock * buf, int len)
+new_UDPPacket(struct sockaddr const* to, ink_hrtime when, IOBufferBlock * buf, int len)
{
(void) len;
UDPPacketInternal *p = udpPacketAllocator.alloc();
@@ -244,7 +244,7 @@ new_UDPPacket(struct sockaddr_in * to, i
p->in_heap = 0;
#endif
p->delivery_time = when;
- memcpy(&p->to, to, sizeof(p->to));
+ ink_inet_copy(&p->to, to);
while (buf) {
body = buf->clone();
@@ -255,7 +255,7 @@ new_UDPPacket(struct sockaddr_in * to, i
}
TS_INLINE UDPPacket *
-new_UDPPacket(struct sockaddr_in * to, ink_hrtime when, Ptr<IOBufferBlock> buf)
+new_UDPPacket(struct sockaddr const* to, ink_hrtime when, Ptr<IOBufferBlock> buf)
{
UDPPacketInternal *p = udpPacketAllocator.alloc();
@@ -265,7 +265,7 @@ new_UDPPacket(struct sockaddr_in * to, i
#endif
p->delivery_time = when;
if (to)
- memcpy(&p->to, to, sizeof(p->to));
+ ink_inet_copy(&p->to, to);
p->chain = buf;
return p;
}
@@ -277,7 +277,7 @@ new_UDPPacket(ink_hrtime when, Ptr<IOBuf
}
TS_INLINE UDPPacket *
-new_incoming_UDPPacket(struct sockaddr_in * from, char *buf, int len)
+new_incoming_UDPPacket(struct sockaddr * from, char *buf, int len)
{
UDPPacketInternal *p = udpPacketAllocator.alloc();
@@ -286,7 +286,7 @@ new_incoming_UDPPacket(struct sockaddr_i
p->in_heap = 0;
#endif
p->delivery_time = 0;
- memcpy(&p->from, from, sizeof(p->from));
+ ink_inet_copy(&p->from, from);
IOBufferBlock *body = new_IOBufferBlock();
body->alloc(iobuffer_size_to_index(len));
Modified: trafficserver/traffic/trunk/iocore/net/P_UnixNetProcessor.h
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/iocore/net/P_UnixNetProcessor.h?rev=1159471&r1=1159470&r2=1159471&view=diff
==============================================================================
--- trafficserver/traffic/trunk/iocore/net/P_UnixNetProcessor.h (original)
+++ trafficserver/traffic/trunk/iocore/net/P_UnixNetProcessor.h Fri Aug 19 01:30:36 2011
@@ -36,18 +36,24 @@ class UnixNetVConnection;
struct UnixNetProcessor:public NetProcessor
{
public:
-virtual Action *accept_internal (Continuation * cont,
- int fd,
- sockaddr * bound_sockaddr = NULL,
- int *bound_sockaddr_size = NULL,
- bool frequent_accept = true,
- AcceptFunctionPtr fn = net_accept,
- unsigned int accept_ip = INADDR_ANY,
- char *accept_ip_str = NULL,
- AcceptOptions const &opt = DEFAULT_ACCEPT_OPTIONS);
-
- Action *connect_re_internal(Continuation * cont, unsigned int ip, int port, NetVCOptions * options = NULL);
- Action *connect(Continuation * cont, UnixNetVConnection ** vc, unsigned int ip, int port, NetVCOptions * opt = NULL);
+ virtual Action *accept_internal (
+ Continuation * cont,
+ int fd,
+ sockaddr const* accept_addr, ///< Address on which to listen.
+ AcceptOptions const &opt
+ );
+
+ Action *connect_re_internal(
+ Continuation * cont,
+ sockaddr const* target,
+ NetVCOptions * options = NULL
+ );
+ Action *connect(
+ Continuation * cont,
+ UnixNetVConnection ** vc,
+ sockaddr const* target,
+ NetVCOptions * opt = NULL
+ );
// Virtual function allows etype to be upgraded to ET_SSL for SSLNetProcessor. Does
// nothing for NetProcessor
@@ -74,17 +80,19 @@ virtual Action *accept_internal (Continu
EThread **netthreads;
char *incoming_ip_to_bind;
- int incoming_ip_to_bind_saddr;
+ ts_ip_endpoint incoming_ip_to_bind_saddr;
};
TS_INLINE Action *
-NetProcessor::connect_re(Continuation * cont, unsigned int ip, int port, NetVCOptions * opts)
-{
- return static_cast<UnixNetProcessor *>(this)->connect_re_internal(cont, ip, port, opts);
+NetProcessor::connect_re(
+ Continuation * cont,
+ sockaddr const* addr,
+ NetVCOptions * opts
+) {
+ return static_cast<UnixNetProcessor *>(this)->connect_re_internal(cont, addr, opts);
}
-
extern UnixNetProcessor unix_netProcessor;
//
Modified: trafficserver/traffic/trunk/iocore/net/P_UnixNetVConnection.h
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/iocore/net/P_UnixNetVConnection.h?rev=1159471&r1=1159470&r2=1159471&view=diff
==============================================================================
--- trafficserver/traffic/trunk/iocore/net/P_UnixNetVConnection.h (original)
+++ trafficserver/traffic/trunk/iocore/net/P_UnixNetVConnection.h Fri Aug 19 01:30:36 2011
@@ -45,9 +45,7 @@ TS_INLINE void
NetVCOptions::reset()
{
ip_proto = USE_TCP;
- local_port = 0;
- port_binding = ANY_PORT;
- local_addr = 0;
+ memset(&local_addr, 0, sizeof(local_addr));
addr_binding = ANY_ADDR;
f_blocking = false;
f_blocking_connect = false;
@@ -205,10 +203,8 @@ public:
EventIO ep;
NetHandler *nh;
unsigned int id;
- unsigned int ip;
- // unsigned int _interface; // 'interface' conflicts with the C++ keyword
int accept_port;
- int port;
+ ts_ip_endpoint server_addr; /// Server address and port.
union
{
@@ -217,11 +213,10 @@ public:
#define NET_VC_SHUTDOWN_WRITE 2
struct
{
- unsigned int got_local_sa:1;
+ unsigned int got_local_addr:1;
unsigned int shutdown:2;
} f;
};
- struct sockaddr_in local_sa;
Connection con;
int recursion;
@@ -250,14 +245,14 @@ typedef int (UnixNetVConnection::*NetVCo
TS_INLINE void
UnixNetVConnection::set_remote_addr()
{
- remote_addr = con.sa;
+ ink_inet_copy(&remote_addr, &con.addr);
}
TS_INLINE void
UnixNetVConnection::set_local_addr()
{
int local_sa_size = sizeof(local_addr);
- safe_getsockname(con.fd, ink_inet_sa_cast(&local_addr), &local_sa_size);
+ safe_getsockname(con.fd, &local_addr.sa, &local_sa_size);
}
TS_INLINE ink_hrtime
Modified: trafficserver/traffic/trunk/iocore/net/SSLNetVConnection.cc
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/iocore/net/SSLNetVConnection.cc?rev=1159471&r1=1159470&r2=1159471&view=diff
==============================================================================
--- trafficserver/traffic/trunk/iocore/net/SSLNetVConnection.cc (original)
+++ trafficserver/traffic/trunk/iocore/net/SSLNetVConnection.cc Fri Aug 19 01:30:36 2011
@@ -450,18 +450,16 @@ int
SSLNetVConnection::sslStartHandShake(int event, int &err)
{
SSL_CTX *ctx = NULL;
- struct sockaddr_in sa;
- struct in_addr ia;
+ sockaddr_in6 sa;
int namelen = sizeof(sa);
- char *strAddr;
if (event == SSL_EVENT_SERVER) {
if (ssl == NULL) {
if (sslCertLookup.multipleCerts) {
- safe_getsockname(get_socket(), (struct sockaddr *) &sa, &namelen);
- ia.s_addr = sa.sin_addr.s_addr;
- strAddr = inet_ntoa(ia);
- ctx = sslCertLookup.findInfoInHash(strAddr);
+ char buff[INET6_ADDRSTRLEN];
+ safe_getsockname(get_socket(), ink_inet_sa_cast(&sa), &namelen);
+ ink_inet_ntop(&sa, buff, sizeof(buff));
+ ctx = sslCertLookup.findInfoInHash(buff);
if (ctx == NULL)
ctx = ssl_NetProcessor.ctx;
} else {
Modified: trafficserver/traffic/trunk/iocore/net/Socks.cc
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/iocore/net/Socks.cc?rev=1159471&r1=1159470&r2=1159471&view=diff
==============================================================================
--- trafficserver/traffic/trunk/iocore/net/Socks.cc (original)
+++ trafficserver/traffic/trunk/iocore/net/Socks.cc Fri Aug 19 01:30:36 2011
@@ -54,19 +54,19 @@ SocksEntry::init(ProxyMutex * m, SocksNe
SET_HANDLER(&SocksEntry::startEvent);
- ip = vc->ip;
- port = vc->port;
+ ink_inet_copy(&target_addr, vc->get_local_addr());
#ifdef SOCKS_WITH_TS
req_data.hdr = 0;
req_data.hostname_str = 0;
req_data.api_info = 0;
req_data.xact_start = time(0);
- req_data.dest_ip = ip;
+
+ assert(ink_inet_is_ip4(&target_addr));
+ req_data.dest_ip = ink_inet_ip4_addr_cast(&target_addr);
//we dont have information about the source. set to destination's
- req_data.src_ip = ip;
- req_data.incoming_port = port;
+ req_data.src_ip = ink_inet_ip4_addr_cast(&target_addr);
server_params = SocksServerConfig::acquire();
#endif
@@ -103,23 +103,33 @@ SocksEntry::findServer()
switch (server_result.r) {
case PARENT_SPECIFIED:
- server_ip = inet_addr(server_result.hostname);
- server_port = server_result.port;
+ // Original was inet_addr, but should hostnames work?
+ // ink_inet_pton only supports numeric (because other clients
+ // explicitly want to avoid hostname lookups).
+ if (0 == ink_inet_pton(server_result.hostname, &server_addr)) {
+ ink_inet_port_cast(&server_addr) = htons(server_result.port);
+ } else {
+ Debug("SocksParent", "Invalid parent server specified %s", server_result.hostname);
+ }
break;
default:
ink_debug_assert(!"Unexpected event");
case PARENT_DIRECT:
case PARENT_FAIL:
- server_ip = (unsigned int) -1;
+ memset(&server_addr, 0, sizeof(server_addr));
}
#else
- server_ip = (nattempts > netProcessor.socks_conf_stuff->connection_attempts)
- ? (unsigned int) -1 : g_socks_conf_stuff->socks_server;
- server_port = g_socks_conf_stuff->socks_server_port;
+ if (nattempts > netProcessor.socks_conf_stuff->connection_attempts)
+ memset(&server_addr, 0, sizeof(server_addr));
+ else ink_inet_copy(server_addr, g_socks_conf_stuff->socks_server);
#endif // SOCKS_WITH_TS
- Debug("SocksParents", "findServer result: %u.%u.%u.%u:%d", PRINT_IP(server_ip), server_port);
+ char buff[INET6_ADDRSTRLEN];
+ Debug("SocksParents", "findServer result: %s:%d",
+ ink_inet_ntop(&server_addr.sa, buff, sizeof(buff)),
+ ink_inet_get_port(&server_addr)
+ );
}
void
@@ -153,8 +163,7 @@ SocksEntry::free()
netVConnection->do_io_read(this, 0, 0);
netVConnection->do_io_write(this, 0, 0);
netVConnection->action_ = action_; //assign the original continuation
- netVConnection->ip = ip;
- netVConnection->port = port; // we already have the lock for the continuation
+ ink_inet_copy(&netVConnection->server_addr, &server_addr);
Debug("Socks", "Sent success to HTTP");
NET_INCREMENT_DYN_STAT(socks_connections_successful_stat);
action_.continuation->handleEvent(NET_EVENT_OPEN, netVConnection);
@@ -187,11 +196,12 @@ SocksEntry::startEvent(int event, void *
timeout = NULL;
}
- Debug("Socks", "Failed to connect to %u.%u.%u.%u:%d", PRINT_IP(server_ip), server_port);
+ char buff[INET6_ADDRPORTSTRLEN];
+ Debug("Socks", "Failed to connect to %s", ink_inet_nptop(&server_addr.sa, buff, sizeof(buff)));
findServer();
- if (server_ip == (uint32_t) - 1) {
+ if (!ink_inet_is_ip(&server_addr)) {
Debug("Socks", "Unable to open connection to the SOCKS server");
lerrno = ESOCK_NO_SOCK_SERVER_CONN;
free();
@@ -214,7 +224,7 @@ SocksEntry::startEvent(int event, void *
NetVCOptions options;
options.socks_support = NO_SOCKS;
- netProcessor.connect_re(this, server_ip, server_port, &options);
+ netProcessor.connect_re(this, &server_addr.sa, &options);
}
return EVENT_CONT;
@@ -243,28 +253,45 @@ SocksEntry::mainEvent(int event, void *d
p[n_bytes++] = version;
p[n_bytes++] = (socks_cmd == NORMAL_SOCKS) ? SOCKS_CONNECT : socks_cmd;
- ts = (unsigned short) htons(port);
+ ts = ntohs(ink_inet_port_cast(&server_addr));
if (version == SOCKS5_VERSION) {
p[n_bytes++] = 0; //Reserved
- p[n_bytes++] = 1; //IPv4 addr
- p[n_bytes++] = ((unsigned char *) &ip)[0];
- p[n_bytes++] = ((unsigned char *) &ip)[1];
- p[n_bytes++] = ((unsigned char *) &ip)[2];
- p[n_bytes++] = ((unsigned char *) &ip)[3];
+ if (ink_inet_is_ip4(&server_addr)) {
+ p[n_bytes++] = 1; //IPv4 addr
+ memcpy(p + n_bytes,
+ &server_addr.sin.sin_addr,
+ 4
+ );
+ n_bytes += 4;
+ } else if (ink_inet_is_ip6(&server_addr)) {
+ p[n_bytes++] = 4; //IPv6 addr
+ memcpy(p + n_bytes,
+ &server_addr.sin6.sin6_addr,
+ INK_IP6_SIZE
+ );
+ n_bytes += INK_IP6_SIZE;
+ } else {
+ Debug("Socks", "SOCKS supports only IP addresses.");
+ }
}
- p[n_bytes++] = ((unsigned char *) &ts)[0];
- p[n_bytes++] = ((unsigned char *) &ts)[1];
+ memcpy(p + n_bytes, &ts, 2);
+ n_bytes += 2;
if (version == SOCKS4_VERSION) {
- //for socks4, ip addr is after the port
- p[n_bytes++] = ((unsigned char *) &ip)[0];
- p[n_bytes++] = ((unsigned char *) &ip)[1];
- p[n_bytes++] = ((unsigned char *) &ip)[2];
- p[n_bytes++] = ((unsigned char *) &ip)[3];
-
- p[n_bytes++] = 0; // NULL
+ if (ink_inet_is_ip4(&server_addr)) {
+ //for socks4, ip addr is after the port
+ memcpy(p + n_bytes,
+ &server_addr.sin.sin_addr,
+ 4
+ );
+ n_bytes += 4;
+
+ p[n_bytes++] = 0; // NULL
+ } else {
+ Debug("Socks", "SOCKS v4 supports only IPv4 addresses.");
+ }
}
}
Modified: trafficserver/traffic/trunk/iocore/net/UnixConnection.cc
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/iocore/net/UnixConnection.cc?rev=1159471&r1=1159470&r2=1159471&view=diff
==============================================================================
--- trafficserver/traffic/trunk/iocore/net/UnixConnection.cc (original)
+++ trafficserver/traffic/trunk/iocore/net/UnixConnection.cc Fri Aug 19 01:30:36 2011
@@ -45,18 +45,17 @@ unsigned int const IP_TRANSPARENT = 19;
// Functions
//
int
-Connection::setup_mc_send(unsigned int mc_ip, int mc_port,
- unsigned int my_ip, int my_port,
- bool non_blocking, unsigned char mc_ttl, bool mc_loopback, Continuation * c)
-{
+Connection::setup_mc_send(
+ sockaddr const* mc_addr,
+ sockaddr const* my_addr,
+ bool non_blocking, unsigned char mc_ttl, bool mc_loopback, Continuation * c
+) {
(void) c;
ink_assert(fd == NO_FD);
int res = 0;
int enable_reuseaddr = 1;
- sockaddr_in* sa_in = ink_inet_ip4_cast(&sa);
- sockaddr_in bind_sa;
- if ((res = socketManager.mc_socket(AF_INET, SOCK_DGRAM, 0, non_blocking)) < 0)
+ if ((res = socketManager.mc_socket(my_addr->sa_family, SOCK_DGRAM, 0, non_blocking)) < 0)
goto Lerror;
fd = res;
@@ -65,12 +64,11 @@ Connection::setup_mc_send(unsigned int m
goto Lerror;
}
- ink_inet_ip4_set(&bind_sa, my_ip, htons(my_port));
- if ((res = socketManager.ink_bind(fd, (struct sockaddr *) &bind_sa, sizeof(bind_sa), IPPROTO_UDP)) < 0) {
+ if ((res = socketManager.ink_bind(fd, my_addr, ink_inet_ip_size(my_addr), IPPROTO_UDP)) < 0) {
goto Lerror;
}
- ink_inet_ip4_set(sa_in, mc_ip, htons(mc_port));
+ ink_inet_copy(&addr, mc_addr);
#ifdef SET_CLOSE_ON_EXEC
if ((res = safe_fcntl(fd, F_SETFD, 1)) < 0)
@@ -103,17 +101,17 @@ Lerror:
int
-Connection::setup_mc_receive(unsigned int mc_ip, int mc_port,
- bool non_blocking, Connection * sendChan, Continuation * c)
-{
+Connection::setup_mc_receive(
+ sockaddr const* mc_addr,
+ bool non_blocking, Connection * sendChan, Continuation * c
+) {
ink_assert(fd == NO_FD);
(void) sendChan;
(void) c;
int res = 0;
int enable_reuseaddr = 1;
- sockaddr_in* sa_in = ink_inet_ip4_cast(&sa);
- if ((res = socketManager.socket(AF_INET, SOCK_DGRAM, 0)) < 0)
+ if ((res = socketManager.socket(mc_addr->sa_family, SOCK_DGRAM, 0)) < 0)
goto Lerror;
fd = res;
@@ -126,22 +124,24 @@ Connection::setup_mc_receive(unsigned in
if ((res = safe_setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char *) &enable_reuseaddr, sizeof(enable_reuseaddr)) < 0))
goto Lerror;
- ink_inet_ip4_set(sa_in, mc_ip, htons(mc_port));
+ ink_inet_copy(&addr, mc_addr);
- if ((res = socketManager.ink_bind(fd, (struct sockaddr *) &sa, sizeof(sa), IPPROTO_TCP)) < 0)
+ if ((res = socketManager.ink_bind(fd, &addr.sa, ink_inet_ip_size(&addr.sa), IPPROTO_TCP)) < 0)
goto Lerror;
if (non_blocking)
if ((res = safe_nonblocking(fd)) < 0)
goto Lerror;
- struct ip_mreq mc_request;
- // Add ourselves to the MultiCast group
- mc_request.imr_multiaddr.s_addr = mc_ip;
- mc_request.imr_interface.s_addr = htonl(INADDR_ANY);
+ if (ink_inet_is_ip4(&addr)) {
+ struct ip_mreq mc_request;
+ // Add ourselves to the MultiCast group
+ mc_request.imr_multiaddr.s_addr = ink_inet_ip4_addr_cast(mc_addr);
+ mc_request.imr_interface.s_addr = INADDR_ANY;
- if ((res = safe_setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *) &mc_request, sizeof(mc_request)) < 0))
- goto Lerror;
+ if ((res = safe_setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *) &mc_request, sizeof(mc_request)) < 0))
+ goto Lerror;
+ }
return 0;
Lerror:
@@ -213,17 +213,28 @@ Connection::open(NetVCOptions const& opt
ink_assert(fd == NO_FD);
int enable_reuseaddr = 1; // used for sockopt setting
int res = 0; // temp result
- uint32_t local_addr = NetVCOptions::ANY_ADDR == opt.addr_binding
- ? INADDR_ANY
- : opt.local_addr;
- uint16_t local_port = NetVCOptions::ANY_PORT == opt.port_binding
- ? 0
- : opt.local_port;
+ ts_ip_endpoint local_addr;
int sock_type = NetVCOptions::USE_UDP == opt.ip_proto
? SOCK_DGRAM
: SOCK_STREAM;
+ int protocol = AF_INET;
+
+ // copy it local so we can (potentially) modify it.
+ // we initialize it first since ink_inet_copy() won't do anything if opt.local_addr is invalid.
+ memset(&local_addr, 0, sizeof(local_addr));
+ ink_inet_copy(&local_addr, &opt.local_addr);
+
+ if (ink_inet_is_ip6(&opt.local_addr)) {
+ protocol = AF_INET6;
+ if (NetVCOptions::ANY_ADDR == opt.addr_binding)
+ local_addr.sin6.sin6_addr = in6addr_any;
+ } else {
+ local_addr.sa.sa_family = AF_INET; // must be set for ink_inet_ip_size() to succeed
+ if (NetVCOptions::ANY_ADDR == opt.addr_binding)
+ ink_inet_ip4_addr_cast(&local_addr) = INADDR_ANY;
+ }
- res = socketManager.socket(AF_INET, sock_type, 0);
+ res = socketManager.socket(protocol, sock_type, 0);
if (-1 == res) return -errno;
fd = res;
@@ -272,7 +283,9 @@ Connection::open(NetVCOptions const& opt
}
}
- if (NetVCOptions::FOREIGN_ADDR == opt.addr_binding && local_addr) {
+ if (NetVCOptions::FOREIGN_ADDR == opt.addr_binding
+ && ink_inet_is_ip(&local_addr)
+ ) {
static char const * const DEBUG_TEXT = "::open setsockopt() IP_TRANSPARENT";
#if TS_USE_TPROXY
int value = 1;
@@ -289,10 +302,7 @@ Connection::open(NetVCOptions const& opt
#endif
}
- // Local address/port.
- struct sockaddr_in bind_sa;
- ink_inet_ip4_set(&bind_sa, local_addr, htons(local_port));
- if (-1==socketManager.ink_bind(fd,ink_inet_sa_cast(&bind_sa),sizeof bind_sa))
+ if (-1 == socketManager.ink_bind(fd, &local_addr.sa, ink_inet_ip_size(&local_addr.sa)))
return -errno;
cleanup.reset();
@@ -301,20 +311,19 @@ Connection::open(NetVCOptions const& opt
}
int
-Connection::connect(uint32_t addr, uint16_t port, NetVCOptions const& opt) {
+Connection::connect(sockaddr const* target, NetVCOptions const& opt) {
ink_assert(fd != NO_FD);
ink_assert(is_bound);
ink_assert(!is_connected);
int res;
- this->setRemote(addr, port);
+ this->setRemote(target);
cleaner<Connection> cleanup(this, &Connection::_cleanup); // mark for close until we succeed.
- res = ::connect(fd,
- reinterpret_cast<struct sockaddr *>(&sa),
- sizeof(struct sockaddr_in));
+ res = ::connect(fd, target, ink_inet_ip_size(target));
+
// It's only really an error if either the connect was blocking
// or it wasn't blocking and the error was other than EINPROGRESS.
// (Is EWOULDBLOCK ok? Does that start the connect?)
Modified: trafficserver/traffic/trunk/iocore/net/UnixNetAccept.cc
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/iocore/net/UnixNetAccept.cc?rev=1159471&r1=1159470&r2=1159471&view=diff
==============================================================================
--- trafficserver/traffic/trunk/iocore/net/UnixNetAccept.cc (original)
+++ trafficserver/traffic/trunk/iocore/net/UnixNetAccept.cc Fri Aug 19 01:30:36 2011
@@ -118,9 +118,8 @@ net_accept(NetAccept * na, void *ep, boo
na->alloc_cache = NULL;
vc->submit_time = ink_get_hrtime();
- vc->ip = ((struct sockaddr_in *)(&(vc->con.sa)))->sin_addr.s_addr;
- vc->port = ntohs(((struct sockaddr_in *)(&(vc->con.sa)))->sin_port);
- vc->accept_port = ntohs(((struct sockaddr_in *)(&(na->server.sa)))->sin_port);
+ ink_inet_copy(&vc->server_addr, &vc->con.addr);
+ vc->accept_port = ink_inet_get_port(&na->server.addr);
vc->mutex = new_ProxyMutex();
vc->action_ = *na->action_;
vc->set_is_transparent(na->server.f_inbound_transparent);
@@ -256,7 +255,7 @@ NetAccept::do_listen(bool non_blocking,
}
} else {
Lretry:
- if ((res = server.listen(port, domain, non_blocking, recv_bufsize, send_bufsize, transparent)))
+ if ((res = server.listen(non_blocking, recv_bufsize, send_bufsize, transparent)))
Warning("unable to listen on port %d: %d %d, %s", port, res, errno, strerror(errno));
}
if (callback_on_open && !action_->cancelled) {
@@ -322,9 +321,8 @@ NetAccept::do_blocking_accept(EThread *
NET_SUM_GLOBAL_DYN_STAT(net_connections_currently_open_stat, 1);
vc->submit_time = now;
- vc->ip = ((struct sockaddr_in *)(&(vc->con.sa)))->sin_addr.s_addr;
- vc->port = ntohs(((struct sockaddr_in *)(&(vc->con.sa)))->sin_port);
- vc->accept_port = ntohs(((struct sockaddr_in *)(&(server.sa)))->sin_port);
+ ink_inet_copy(&vc->server_addr, &vc->con.addr);
+ vc->accept_port = ink_inet_port_cast(&server.addr);
vc->set_is_transparent(server.f_inbound_transparent);
vc->set_is_other_side_transparent(server.f_outbound_transparent);
Debug("http_tproxy", "Marking accepted %sconnection on %x as%s outbound transparent.\n",
@@ -370,8 +368,12 @@ NetAccept::acceptEvent(int event, void *
if ((res = accept_fn(this, e, false)) < 0) {
NET_DECREMENT_DYN_STAT(net_accepts_currently_open_stat);
/* INKqa11179 */
- Warning("Accept on port %d failed with error no %d", ntohs(((struct sockaddr_in *)(&(server.sa)))->sin_port), res);
- Warning("Traffic Server may be unable to accept more network" "connections on %d", ntohs(((struct sockaddr_in *)(&(server.sa)))->sin_port));
+ Warning("Accept on port %d failed with error no %d",
+ ink_inet_get_port(&server.addr), res
+ );
+ Warning("Traffic Server may be unable to accept more network" "connections on %d",
+ ink_inet_get_port(&server.addr)
+ );
e->cancel();
delete this;
return EVENT_DONE;
@@ -401,8 +403,8 @@ NetAccept::acceptFastEvent(int event, vo
}
vc = allocateThread(e->ethread);
- socklen_t sz = sizeof(vc->con.sa);
- int fd = socketManager.accept(server.fd, (struct sockaddr *) &vc->con.sa, &sz);
+ socklen_t sz = sizeof(vc->con.addr);
+ int fd = socketManager.accept(server.fd, &vc->con.addr.sa, &sz);
if (likely(fd >= 0)) {
Debug("iocore_net", "accepted a new socket: %d", fd);
@@ -466,9 +468,8 @@ NetAccept::acceptFastEvent(int event, vo
vc->id = net_next_connection_number();
vc->submit_time = ink_get_hrtime();
- vc->ip = ((struct sockaddr_in *)(&(vc->con.sa)))->sin_addr.s_addr;
- vc->port = ntohs(((struct sockaddr_in *)(&(vc->con.sa)))->sin_port);
- vc->accept_port = ntohs(((struct sockaddr_in *)(&(server.sa)))->sin_port);
+ ink_inet_copy(&vc->server_addr, &vc->con.addr);
+ vc->accept_port = ink_inet_get_port(&server.addr);
vc->set_is_transparent(server.f_inbound_transparent);
vc->set_is_other_side_transparent(server.f_outbound_transparent);
Debug("http_tproxy", "Marking fast accepted %sconnection on as%s outbound transparent.\n",
Modified: trafficserver/traffic/trunk/iocore/net/UnixNetPages.cc
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/iocore/net/UnixNetPages.cc?rev=1159471&r1=1159470&r2=1159471&view=diff
==============================================================================
--- trafficserver/traffic/trunk/iocore/net/UnixNetPages.cc (original)
+++ trafficserver/traffic/trunk/iocore/net/UnixNetPages.cc Fri Aug 19 01:30:36 2011
@@ -34,8 +34,7 @@ typedef int (ShowNet::*ShowNetEventHandl
struct ShowNet: public ShowCont
{
int ithread;
- int port;
- unsigned int ip;
+ ts_ip_endpoint addr;
int showMain(int event, Event * e)
{
@@ -64,14 +63,19 @@ struct ShowNet: public ShowCont
ink_hrtime now = ink_get_hrtime();
forl_LL(UnixNetVConnection, vc, nh->open_list) {
- if (ip && ip != vc->ip)
+ uint16_t port = ink_inet_get_port(&addr.sa);
+ if (ink_inet_is_ip(&addr) && addr != vc->server_addr)
continue;
- if (port && port != vc->port && port != vc->accept_port)
+ if (port && port != ink_inet_get_port(&vc->server_addr.sa) && port != vc->accept_port)
continue;
- char ipbuf[80];
- snprintf(ipbuf, sizeof(ipbuf), "%hhu.%hhu.%hhu.%hhu", PRINT_IP(vc->ip));
+ char ipbuf[INET6_ADDRSTRLEN];
+ ink_inet_ntop(&vc->server_addr.sa, ipbuf, sizeof(ipbuf));
+ char opt_ipbuf[INET6_ADDRSTRLEN];
char interbuf[80];
- snprintf(interbuf, sizeof(interbuf), "[%s] %hhu.%hhu.%hhu.%hhu", vc->options.toString(vc->options.addr_binding), PRINT_IP(vc->options.local_addr));
+ snprintf(interbuf, sizeof(interbuf), "[%s] %s",
+ vc->options.toString(vc->options.addr_binding),
+ ink_inet_ntop(&vc->options.local_addr.sa, opt_ipbuf, sizeof(opt_ipbuf))
+ );
CHECK_SHOW(show("<tr>"
//"<td><a href=\"/connection/%d\">%d</a></td>"
"<td>%d</td>" // ID
@@ -95,7 +99,7 @@ struct ShowNet: public ShowCont
"</tr>\n",
vc->id,
ipbuf,
- vc->port,
+ ink_inet_get_port(&vc->server_addr),
vc->con.fd,
interbuf,
vc->accept_port,
@@ -200,7 +204,8 @@ struct ShowNet: public ShowCont
}
ShowNet(Continuation * c, HTTPHdr * h):
- ShowCont(c, h), ithread(0), port(0), ip(0) {
+ ShowCont(c, h), ithread(0) {
+ memset(&addr, 0, sizeof(addr));
SET_HANDLER(&ShowNet::showMain);
}
};
@@ -227,7 +232,7 @@ register_ShowNet(Continuation * c, HTTPH
if (s->sarg)
gn = (char *)memchr(s->sarg, '=', strlen(s->sarg));
if (gn)
- s->ip = ink_inet_addr(gn + 1);
+ ink_inet_pton(gn + 1, &s->addr);
SET_CONTINUATION_HANDLER(s, &ShowNet::showConnections);
} else if (STREQ_PREFIX(path, path_len, "ports")) {
int query_len;
@@ -237,7 +242,7 @@ register_ShowNet(Continuation * c, HTTPH
if (s->sarg)
gn = (char *)memchr(s->sarg, '=', strlen(s->sarg));
if (gn)
- s->port = atoi(gn + 1);
+ ink_inet_port_cast(&s->addr.sa) = htons(atoi(gn+1));
SET_CONTINUATION_HANDLER(s, &ShowNet::showConnections);
}
eventProcessor.schedule_imm(s, ET_TASK);
Modified: trafficserver/traffic/trunk/iocore/net/UnixNetProcessor.cc
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/iocore/net/UnixNetProcessor.cc?rev=1159471&r1=1159470&r2=1159471&view=diff
==============================================================================
--- trafficserver/traffic/trunk/iocore/net/UnixNetProcessor.cc (original)
+++ trafficserver/traffic/trunk/iocore/net/UnixNetProcessor.cc Fri Aug 19 01:30:36 2011
@@ -38,6 +38,8 @@ NetProcessor::AcceptOptions::reset()
domain = AF_INET;
etype = ET_NET;
f_callback_on_open = false;
+ localhost_only = false;
+ frequent_accept = false;
recv_bufsize = 0;
send_bufsize = 0;
sockopt_flags = 0;
@@ -60,94 +62,49 @@ net_next_connection_number()
}
Action *
-NetProcessor::accept(Continuation * cont,
- int port,
- int domain,
- int accept_threads,
- bool frequent_accept,
- unsigned int accept_ip,
- char *accept_ip_str,
- bool callback_on_open,
- SOCKET listen_socket_in,
- int accept_pool_size,
- bool accept_only,
- sockaddr * bound_sockaddr,
- int *bound_sockaddr_size,
- int recv_bufsize, int send_bufsize, uint32_t sockopt_flags, EventType etype)
-{
- (void) listen_socket_in; // NT only
- (void) accept_pool_size; // NT only
- (void) accept_only; // NT only
- (void) bound_sockaddr; // NT only
- (void) bound_sockaddr_size; // NT only
+NetProcessor::accept(Continuation* cont,
+ sockaddr const* accept_addr,
+ AcceptOptions const& opt
+) {
Debug("iocore_net_processor",
"NetProcessor::accept - port %d,recv_bufsize %d, send_bufsize %d, sockopt 0x%0lX",
- port, recv_bufsize, send_bufsize, sockopt_flags);
-
- AcceptOptions opt;
+ ink_inet_get_port(accept_addr), opt.recv_bufsize, opt.send_bufsize, opt.sockopt_flags);
- opt.port = port;
- opt.domain = domain;
- opt.etype = etype;
- opt.f_callback_on_open = callback_on_open;
- opt.recv_bufsize = recv_bufsize;
- opt.send_bufsize = send_bufsize;
- opt.sockopt_flags = opt.sockopt_flags;
- opt.accept_threads = accept_threads;
-
- return ((UnixNetProcessor *) this)->accept_internal(cont, NO_FD,
- bound_sockaddr,
- bound_sockaddr_size,
- frequent_accept,
- net_accept,
- accept_ip,
- accept_ip_str,
- opt);
+ return ((UnixNetProcessor *) this)->accept_internal(cont, NO_FD, accept_addr, opt);
}
Action *
-NetProcessor::main_accept(Continuation *cont, SOCKET fd, sockaddr *bound_sockaddr, int *bound_sockaddr_size,
- bool accept_only, bool localhost_only, AcceptOptions const& opt)
-{
- (void) accept_only; // NT only
+NetProcessor::main_accept(Continuation *cont,
+ SOCKET fd,
+ AcceptOptions const& opt
+) {
+ UnixNetProcessor* this_unp = static_cast<UnixNetProcessor*>(this);
+ ts_ip_endpoint addr;
+
Debug("iocore_net_processor", "NetProcessor::main_accept - port %d,recv_bufsize %d, send_bufsize %d, sockopt 0x%0lX",
opt.port, opt.recv_bufsize, opt.send_bufsize, opt.sockopt_flags);
- if (localhost_only) {
- static char localhost[] = "127.0.0.1";
-
- return ((UnixNetProcessor *) this)->accept_internal(cont, fd,
- bound_sockaddr,
- bound_sockaddr_size,
- true,
- net_accept,
- inet_addr(localhost),
- localhost,
- opt);
+ if (opt.localhost_only) {
+ ink_inet_ip4_set(&addr.sa, htonl(INADDR_LOOPBACK), htons(opt.port));
} else {
- return ((UnixNetProcessor *) this)->accept_internal(cont, fd,
- bound_sockaddr,
- bound_sockaddr_size,
- true,
- net_accept,
- ((UnixNetProcessor *) this)->incoming_ip_to_bind_saddr,
- ((UnixNetProcessor *) this)->incoming_ip_to_bind,
- opt);
+ if (ink_inet_is_ip(&this_unp->incoming_ip_to_bind_saddr)) {
+ ink_inet_copy(&addr.sa, &this_unp->incoming_ip_to_bind_saddr);
+ ink_inet_port_cast(&addr.sa) = htons(opt.port);
+ } else {
+ ink_inet_ip4_set(&addr, INADDR_ANY, htons(opt.port));
+ }
}
+ return this_unp->accept_internal(cont, fd, &addr.sa, opt);
}
Action *
-UnixNetProcessor::accept_internal(Continuation *cont,
- int fd,
- struct sockaddr * bound_sockaddr,
- int *bound_sockaddr_size,
- bool frequent_accept,
- AcceptFunction fn,
- unsigned int accept_ip,
- char *accept_ip_str,
- AcceptOptions const& opt)
-{
+UnixNetProcessor::accept_internal(
+ Continuation *cont,
+ int fd,
+ sockaddr const* accept_addr,
+ AcceptOptions const& opt
+) {
EventType et = opt.etype; // setEtype requires non-const ref.
NetAccept *na = createNetAccept();
EThread *thread = this_ethread();
@@ -162,12 +119,9 @@ UnixNetProcessor::accept_internal(Contin
IOCORE_ReadConfigInteger(accept_threads, "proxy.config.accept_threads");
NET_INCREMENT_DYN_STAT(net_accepts_currently_open_stat);
- na->port = opt.port;
- na->domain = opt.domain;
- na->accept_fn = fn;
+ na->accept_fn = net_accept; // All callers used this.
na->server.fd = fd;
- na->server.accept_ip = accept_ip;
- na->server.accept_ip_str = accept_ip_str;
+ ink_inet_copy(&na->server.accept_addr, accept_addr);
na->server.f_outbound_transparent = opt.f_outbound_transparent;
na->server.f_inbound_transparent = opt.f_inbound_transparent;
if (opt.f_outbound_transparent || opt.f_inbound_transparent) {
@@ -191,7 +145,7 @@ UnixNetProcessor::accept_internal(Contin
na->etype = opt.etype;
if (na->callback_on_open)
na->mutex = cont->mutex;
- if (frequent_accept) { // true
+ if (opt.frequent_accept) { // true
if (accept_threads > 0) {
if (0 == na->do_listen(BLOCKING, opt.f_inbound_transparent)) {
NetAccept *a;
@@ -200,10 +154,10 @@ UnixNetProcessor::accept_internal(Contin
a = createNetAccept();
*a = *na;
a->init_accept_loop();
- Debug("iocore_net_accept", "Created accept thread #%d for port %d", i, opt.port);
+ Debug("iocore_net_accept", "Created accept thread #%d for port %d", i, ink_inet_get_port(accept_addr));
}
// Start the "template" accept thread last.
- Debug("iocore_net_accept", "Created accept thread #%d for port %d", accept_threads, opt.port);
+ Debug("iocore_net_accept", "Created accept thread #%d for port %d", accept_threads, ink_inet_get_port(accept_addr));
na->init_accept_loop();
}
} else {
@@ -211,8 +165,6 @@ UnixNetProcessor::accept_internal(Contin
}
} else
na->init_accept();
- if (bound_sockaddr && bound_sockaddr_size)
- safe_getsockname(na->server.fd, bound_sockaddr, bound_sockaddr_size);
#ifdef TCP_DEFER_ACCEPT
// set tcp defer accept timeout if it is configured, this will not trigger an accept until there is
@@ -227,9 +179,11 @@ UnixNetProcessor::accept_internal(Contin
}
Action *
-UnixNetProcessor::connect_re_internal(Continuation * cont,
- unsigned int ip, int port, NetVCOptions * opt)
-{
+UnixNetProcessor::connect_re_internal(
+ Continuation * cont,
+ sockaddr const* target,
+ NetVCOptions * opt
+) {
ProxyMutex *mutex = cont->mutex;
EThread *t = mutex->thread_holding;
UnixNetVConnection *vc = allocateThread(t);
@@ -250,7 +204,7 @@ UnixNetProcessor::connect_re_internal(Co
* we need to connect using socks server even
* if this ip is in no_socks list.
*/
- !socks_conf_stuff->ip_map.contains(ip))
+ !socks_conf_stuff->ip_map.contains(target))
#endif
);
SocksEntry *socksEntry = NULL;
@@ -259,24 +213,23 @@ UnixNetProcessor::connect_re_internal(Co
vc->id = net_next_connection_number();
vc->submit_time = ink_get_hrtime();
vc->setSSLClientConnection(true);
- vc->ip = ip;
- vc->port = port;
+ ink_inet_copy(&vc->server_addr, target);
vc->mutex = cont->mutex;
Action *result = &vc->action_;
#ifndef INK_NO_SOCKS
if (using_socks) {
- Debug("Socks", "Using Socks ip: %u.%u.%u.%u:%d\n", PRINT_IP(ip), port);
+ char buff[INET6_ADDRPORTSTRLEN];
+ Debug("Socks", "Using Socks ip: %s\n", ink_inet_nptop(target, buff, sizeof(buff)));
socksEntry = socksAllocator.alloc();
socksEntry->init(cont->mutex, vc, opt->socks_support, opt->socks_version); /*XXXX remove last two args */
socksEntry->action_ = cont;
cont = socksEntry;
- if (socksEntry->server_ip == (uint32_t) - 1) {
+ if (!ink_inet_is_ip(&socksEntry->server_addr)) {
socksEntry->lerrno = ESOCK_NO_SOCK_SERVER_CONN;
socksEntry->free();
return ACTION_RESULT_DONE;
}
- vc->ip = socksEntry->server_ip;
- vc->port = socksEntry->server_port;
+ ink_inet_copy(&vc->server_addr, &socksEntry->server_addr);
result = &socksEntry->action_;
vc->action_ = socksEntry;
} else {
@@ -315,10 +268,11 @@ UnixNetProcessor::connect_re_internal(Co
Action *
UnixNetProcessor::connect(Continuation * cont,
UnixNetVConnection ** avc,
- unsigned int ip, int port, NetVCOptions * opt)
+ sockaddr const* target,
+ NetVCOptions * opt)
{
NOWARN_UNUSED(avc);
- return connect_re(cont, ip, port, opt);
+ return connect_re(cont, target, opt);
}
struct CheckConnect:public Continuation
@@ -396,13 +350,13 @@ struct CheckConnect:public Continuation
return EVENT_DONE;
}
- Action *connect_s(Continuation * cont, unsigned int ip, int port,
+ Action *connect_s(Continuation * cont, sockaddr const* target,
int _timeout, NetVCOptions * opt)
{
action_ = cont;
timeout = HRTIME_SECONDS(_timeout);
recursion++;
- netProcessor.connect_re(this, ip, port, opt);
+ netProcessor.connect_re(this, target, opt);
recursion--;
if (connect_status != NET_EVENT_OPEN_FAILED)
return &action_;
@@ -426,12 +380,12 @@ struct CheckConnect:public Continuation
};
Action *
-NetProcessor::connect_s(Continuation * cont, unsigned int ip,
- int port, int timeout, NetVCOptions * opt)
+NetProcessor::connect_s(Continuation * cont, sockaddr const* target,
+ int timeout, NetVCOptions * opt)
{
Debug("iocore_net_connect", "NetProcessor::connect_s called");
CheckConnect *c = NEW(new CheckConnect(cont->mutex));
- return c->connect_s(cont, ip, port, timeout, opt);
+ return c->connect_s(cont, target, timeout, opt);
}
@@ -456,10 +410,11 @@ UnixNetProcessor::start(int)
initialize_thread_for_net(netthreads[i], i);
}
- if ((incoming_ip_to_bind = IOCORE_ConfigReadString("proxy.local.incoming_ip_to_bind")) != 0)
- incoming_ip_to_bind_saddr = inet_addr(incoming_ip_to_bind);
- else
- incoming_ip_to_bind_saddr = 0;
+ if (
+ 0 == (incoming_ip_to_bind = IOCORE_ConfigReadString("proxy.local.incoming_ip_to_bind"))
+ || 0 != ink_inet_pton(incoming_ip_to_bind, &incoming_ip_to_bind_saddr)
+ )
+ memset(&incoming_ip_to_bind_saddr, 0, sizeof(incoming_ip_to_bind_saddr));
RecData d;
d.rec_int = 0;
Modified: trafficserver/traffic/trunk/iocore/net/UnixNetVConnection.cc
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/iocore/net/UnixNetVConnection.cc?rev=1159471&r1=1159470&r2=1159471&view=diff
==============================================================================
--- trafficserver/traffic/trunk/iocore/net/UnixNetVConnection.cc (original)
+++ trafficserver/traffic/trunk/iocore/net/UnixNetVConnection.cc Fri Aug 19 01:30:36 2011
@@ -765,10 +765,11 @@ UnixNetVConnection::UnixNetVConnection()
next_inactivity_timeout_at(0),
#endif
active_timeout(NULL), nh(NULL),
- id(0), ip(0), accept_port(0), port(0), flags(0), recursion(0), submit_time(0), oob_ptr(0),
+ id(0), accept_port(0), flags(0), recursion(0), submit_time(0), oob_ptr(0),
from_accept_thread(false)
{
- memset(&local_sa, 0, sizeof local_sa);
+ memset(&local_addr, 0, sizeof local_addr);
+ memset(&server_addr, 0, sizeof server_addr);
SET_HANDLER((NetVConnHandler) & UnixNetVConnection::startEvent);
}
@@ -1040,12 +1041,22 @@ UnixNetVConnection::connectUp(EThread *t
free(t);
return CONNECT_FAILURE;
}
+
+ // Create an AF_INET6 socket if we're going to connect to an AF_INET6
+ // address.
+ if (ink_inet_is_ip6(&server_addr) &&
+ (options.addr_binding == NetVCOptions::ANY_ADDR ||
+ !ink_inet_is_ip(&options.local_addr))) {
+ ink_inet_ip6_set(&options.local_addr, in6addr_any);
+ }
+
//
// Initialize this UnixNetVConnection
//
+ char addrbuf[INET6_ADDRSTRLEN];
int res = 0;
- Debug("iocore_net", "connectUp:: local_addr=%u.%u.%u.%u [%s]\n",
- PRINT_IP(options.local_addr),
+ Debug("iocore_net", "connectUp:: local_addr=%s [%s]\n",
+ ink_inet_ntop(&options.local_addr.sa, addrbuf, sizeof(addrbuf)),
NetVCOptions::toString(options.addr_binding)
);
@@ -1062,7 +1073,7 @@ UnixNetVConnection::connectUp(EThread *t
free(t);
return CONNECT_FAILURE;
}
- res = con.connect(ip, port, options);
+ res = con.connect(&server_addr.sa, options);
}
if (res) {