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) {