You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by mt...@apache.org on 2013/09/05 11:43:12 UTC

svn commit: r1520261 - in /tomcat/jk/trunk/native/common: jk_ajp12_worker.c jk_ajp_common.c jk_ajp_common.h jk_connect.c jk_connect.h jk_global.h jk_status.c jk_util.c jk_util.h

Author: mturk
Date: Thu Sep  5 09:43:12 2013
New Revision: 1520261

URL: http://svn.apache.org/r1520261
Log:
First step in IPV6 support - use new jk_sockaddr_t structure wrapping sockaddr_in. Beside that there are no funtional changes

Modified:
    tomcat/jk/trunk/native/common/jk_ajp12_worker.c
    tomcat/jk/trunk/native/common/jk_ajp_common.c
    tomcat/jk/trunk/native/common/jk_ajp_common.h
    tomcat/jk/trunk/native/common/jk_connect.c
    tomcat/jk/trunk/native/common/jk_connect.h
    tomcat/jk/trunk/native/common/jk_global.h
    tomcat/jk/trunk/native/common/jk_status.c
    tomcat/jk/trunk/native/common/jk_util.c
    tomcat/jk/trunk/native/common/jk_util.h

Modified: tomcat/jk/trunk/native/common/jk_ajp12_worker.c
URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/native/common/jk_ajp12_worker.c?rev=1520261&r1=1520260&r2=1520261&view=diff
==============================================================================
--- tomcat/jk/trunk/native/common/jk_ajp12_worker.c (original)
+++ tomcat/jk/trunk/native/common/jk_ajp12_worker.c Thu Sep  5 09:43:12 2013
@@ -40,7 +40,7 @@
 
 struct ajp12_worker
 {
-    struct sockaddr_in worker_inet_addr;
+    jk_sockaddr_t worker_inet_addr;
     unsigned connect_retry_attempts;
     char *name;
     jk_worker_t worker;
@@ -192,7 +192,7 @@ static int JK_METHOD validate(jk_worker_
                p->name, host, port);
 
         if (host) {
-            if (jk_resolve(host, port, &p->worker_inet_addr, we->pool, l)) {
+            if (jk_resolve(host, port, &p->worker_inet_addr, we->pool, 0, l)) {
                 return JK_TRUE;
             }
             jk_log(l, JK_LOG_ERROR,

Modified: tomcat/jk/trunk/native/common/jk_ajp_common.c
URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/native/common/jk_ajp_common.c?rev=1520261&r1=1520260&r2=1520261&view=diff
==============================================================================
--- tomcat/jk/trunk/native/common/jk_ajp_common.c (original)
+++ tomcat/jk/trunk/native/common/jk_ajp_common.c Thu Sep  5 09:43:12 2013
@@ -1062,7 +1062,7 @@ void jk_ajp_pull(ajp_worker_t * aw, int 
     int address_change = JK_FALSE;
     int port = 0;
     char host[JK_SHM_STR_SIZ+1];
-    struct sockaddr_in inet_addr;
+    jk_sockaddr_t inet_addr;
     JK_TRACE_ENTER(l);
 
     if (JK_IS_DEBUG_LEVEL(l))
@@ -1095,7 +1095,7 @@ void jk_ajp_pull(ajp_worker_t * aw, int 
         aw->port = port;
         strncpy(aw->host, host, JK_SHM_STR_SIZ);
         if (!jk_resolve(host, port, &inet_addr,
-                        aw->worker.we->pool, l)) {
+                        aw->worker.we->pool, aw->prefer_ipv6, l)) {
             jk_log(l, JK_LOG_ERROR,
                    "Failed resolving address '%s:%d' for worker '%s'.",
                    host, port, aw->name);
@@ -2734,6 +2734,7 @@ int ajp_validate(jk_worker_t *pThis,
             host = "undefined";
         }
         strncpy(p->host, jk_get_worker_host(props, p->name, host), JK_SHM_STR_SIZ);
+        p->prefer_ipv6 = jk_get_worker_prefer_ipv6(props, p->name, 0);
         if (p->s->h.sequence == 0) {
             /* Initial setup.
              */
@@ -2742,7 +2743,8 @@ int ajp_validate(jk_worker_t *pThis,
                        "worker %s contact is '%s:%d'",
                        p->name, p->host, p->port);
             if (p->port > 0) {
-                if (!jk_resolve(p->host, p->port, &p->worker_inet_addr, we->pool, l)) {
+                if (!jk_resolve(p->host, p->port, &p->worker_inet_addr,
+                                we->pool, p->prefer_ipv6, l)) {
                     jk_log(l, JK_LOG_ERROR,
                            "worker %s can't resolve tomcat address %s",
                            p->name, p->host);

Modified: tomcat/jk/trunk/native/common/jk_ajp_common.h
URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/native/common/jk_ajp_common.h?rev=1520261&r1=1520260&r2=1520261&view=diff
==============================================================================
--- tomcat/jk/trunk/native/common/jk_ajp_common.h (original)
+++ tomcat/jk/trunk/native/common/jk_ajp_common.h Thu Sep  5 09:43:12 2013
@@ -294,12 +294,14 @@ struct ajp_worker
 
     JK_CRIT_SEC cs;
 
-    struct sockaddr_in worker_inet_addr;    /* Contains host and port */
+    jk_sockaddr_t worker_inet_addr;    /* Contains host and port */
     unsigned connect_retry_attempts;
     char host[JK_SHM_STR_SIZ+1];
     int port;
     int addr_sequence;  /* Whether the address is resolved */
     int maintain_time;
+    int prefer_ipv6;
+
     /*
      * Open connections cache...
      *

Modified: tomcat/jk/trunk/native/common/jk_connect.c
URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/native/common/jk_connect.c?rev=1520261&r1=1520260&r2=1520261&view=diff
==============================================================================
--- tomcat/jk/trunk/native/common/jk_connect.c (original)
+++ tomcat/jk/trunk/native/common/jk_connect.c Thu Sep  5 09:43:12 2013
@@ -148,14 +148,14 @@ static int sononblock(jk_sock_t sd)
  *                               during blocking connect
  *                 0: success
  */
-static int nb_connect(jk_sock_t sd, struct sockaddr *addr, int timeout, jk_logger_t *l)
+static int nb_connect(jk_sock_t sd, jk_sockaddr_t *addr, int timeout, jk_logger_t *l)
 {
     int rc;
 
     JK_TRACE_ENTER(l);
 
     if (timeout <= 0) {
-        rc = connect(sd, addr, sizeof(struct sockaddr_in));
+        rc = connect(sd, (const struct sockaddr *)&addr->sa.sin, addr->salen);
         JK_TRACE_EXIT(l);
         return rc;
     }
@@ -164,7 +164,7 @@ static int nb_connect(jk_sock_t sd, stru
         JK_TRACE_EXIT(l);
         return -1;
     }
-    if (JK_IS_SOCKET_ERROR(connect(sd, addr, sizeof(struct sockaddr_in)))) {
+    if (JK_IS_SOCKET_ERROR(connect(sd, (const struct sockaddr *)&addr->sa.sin, addr->salen))) {
         struct timeval tv;
         fd_set wfdset, efdset;
 
@@ -220,7 +220,7 @@ static int nb_connect(jk_sock_t sd, stru
  * @return         -1: some kind of error occured
  *                 0: success
  */
-static int nb_connect(jk_sock_t sd, struct sockaddr *addr, int timeout, jk_logger_t *l)
+static int nb_connect(jk_sock_t sd, jk_sockaddr_t *addr, int timeout, jk_logger_t *l)
 {
     int rc = 0;
 
@@ -233,7 +233,7 @@ static int nb_connect(jk_sock_t sd, stru
         }
     }
     do {
-        rc = connect(sd, addr, sizeof(struct sockaddr_in));
+        rc = connect(sd, (const struct sockaddr *)&addr->sa.sin, addr->salen);
     } while (rc == -1 && errno == EINTR);
 
     if ((rc == -1) && (errno == EINPROGRESS || errno == EALREADY)
@@ -283,13 +283,13 @@ static int nb_connect(jk_sock_t sd, stru
  * @return         -1: some kind of error occured
  *                 0: success
  */
-static int nb_connect(jk_sock_t sd, struct sockaddr *addr, int timeout, jk_logger_t *l)
+static int nb_connect(jk_sock_t sd, jk_sockaddr_t *addr, int timeout, jk_logger_t *l)
 {
     int rc;
 
     JK_TRACE_ENTER(l);
 
-    rc = connect(sd, addr, sizeof(struct sockaddr_in));
+    rc = connect(sd, (const struct sockaddr *)&addr->sa.sin, addr->salen);
     JK_TRACE_EXIT(l);
     return rc;
 }
@@ -324,16 +324,23 @@ in_addr_t jk_inet_addr(const char * addr
  * @return         JK_FALSE: some kind of error occured
  *                 JK_TRUE: success
  */
-int jk_resolve(const char *host, int port, struct sockaddr_in *rc,
-               void *pool, jk_logger_t *l)
+int jk_resolve(const char *host, int port, jk_sockaddr_t *saddr,
+               void *pool, int prefer_ipv6, jk_logger_t *l)
 {
     int x;
     struct in_addr laddr;
+    struct sockaddr_in *rc;
 
     JK_TRACE_ENTER(l);
 
-    memset(rc, 0, sizeof(struct sockaddr_in));
+    memset(saddr, 0, sizeof(jk_sockaddr_t));
+    /* TODO:
+     * This will depend on IPV4/IPV6 resolving
+     * and prefer_ipv6
+     */
+    saddr->salen = (int)sizeof(struct sockaddr_in);
 
+    rc = &saddr->sa.sin;
     rc->sin_port = htons((short)port);
     rc->sin_family = AF_INET;
 
@@ -408,6 +415,8 @@ int jk_resolve(const char *host, int por
     }
     memcpy(&(rc->sin_addr), &laddr, sizeof(laddr));
 
+    saddr->port = port;
+    saddr->host = host;
     JK_TRACE_EXIT(l);
     return JK_TRUE;
 }
@@ -424,7 +433,7 @@ int jk_resolve(const char *host, int por
  *                  created socket: success
  * @remark          Cares about errno
  */
-jk_sock_t jk_open_socket(struct sockaddr_in *addr, int keepalive,
+jk_sock_t jk_open_socket(jk_sockaddr_t *addr, int keepalive,
                          int timeout, int connect_timeout,
                          int sock_buf, jk_logger_t *l)
 {
@@ -613,9 +622,9 @@ jk_sock_t jk_open_socket(struct sockaddr
 /* Need more infos for BSD 4.4 and Unix 98 defines, for now only
 iSeries when Unix98 is required at compil time */
 #if (_XOPEN_SOURCE >= 520) && defined(AS400)
-    ((struct sockaddr *)addr)->sa_len = sizeof(struct sockaddr_in);
+    ((struct sockaddr *)addr)->sa.sin.sa_len = sizeof(struct sockaddr_in);
 #endif
-    ret = nb_connect(sd, (struct sockaddr *)addr, connect_timeout, l);
+    ret = nb_connect(sd, addr, connect_timeout, l);
 #if defined(WIN32) || (defined(NETWARE) && defined(__NOVELL_LIBC__))
     if (JK_IS_SOCKET_ERROR(ret)) {
         JK_GET_SOCKET_ERRNO();
@@ -926,10 +935,10 @@ int jk_tcp_socket_recvfull(jk_sock_t sd,
  * dump a sockaddr_in in A.B.C.D:P in ASCII buffer
  *
  */
-char *jk_dump_hinfo(struct sockaddr_in *saddr, char *buf)
+char *jk_dump_hinfo(jk_sockaddr_t *saddr, char *buf)
 {
-    unsigned long laddr = (unsigned long)htonl(saddr->sin_addr.s_addr);
-    unsigned short lport = (unsigned short)htons(saddr->sin_port);
+    unsigned long laddr = (unsigned long)htonl(saddr->sa.sin.sin_addr.s_addr);
+    unsigned short lport = (unsigned short)htons(saddr->sa.sin.sin_port);
 
     sprintf(buf, "%d.%d.%d.%d:%d",
             (int)(laddr >> 24), (int)((laddr >> 16) & 0xff),

Modified: tomcat/jk/trunk/native/common/jk_connect.h
URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/native/common/jk_connect.h?rev=1520261&r1=1520260&r2=1520261&view=diff
==============================================================================
--- tomcat/jk/trunk/native/common/jk_connect.h (original)
+++ tomcat/jk/trunk/native/common/jk_connect.h Thu Sep  5 09:43:12 2013
@@ -38,9 +38,10 @@ extern "C"
 
 #define JK_SOCKET_EOF      (-2)
 
-int jk_resolve(const char *host, int port, struct sockaddr_in *rc, void *pool, jk_logger_t *l);
+int jk_resolve(const char *host, int port, jk_sockaddr_t *rc, void *pool,
+               int prefer_ipv6, jk_logger_t *l);
 
-jk_sock_t jk_open_socket(struct sockaddr_in *addr, int keepalive,
+jk_sock_t jk_open_socket(jk_sockaddr_t *addr, int keepalive,
                          int timeout, int connect_timeout,
                          int sock_buf, jk_logger_t *l);
 
@@ -52,7 +53,7 @@ int jk_tcp_socket_sendfull(jk_sock_t sd,
 
 int jk_tcp_socket_recvfull(jk_sock_t sd, unsigned char *b, int len, jk_logger_t *l);
 
-char *jk_dump_hinfo(struct sockaddr_in *saddr, char *buf);
+char *jk_dump_hinfo(jk_sockaddr_t *saddr, char *buf);
 
 char *jk_dump_sinfo(jk_sock_t sd, char *buf);
 

Modified: tomcat/jk/trunk/native/common/jk_global.h
URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/native/common/jk_global.h?rev=1520261&r1=1520260&r2=1520261&view=diff
==============================================================================
--- tomcat/jk/trunk/native/common/jk_global.h (original)
+++ tomcat/jk/trunk/native/common/jk_global.h Thu Sep  5 09:43:12 2013
@@ -400,6 +400,37 @@ typedef int jk_sock_t;
 #define strcasecmp(a,b) apr_strnatcasecmp(a,b)
 #endif
 
+/* IPV6 support */
+#if defined(HAVE_APR)
+#define JK_HAVE_IPV6    APR_HAVE_IPV6
+#else
+#if defined(WIN32) || defined(HAVE_IPV6)
+#define JK_HAVE_IPV6    1
+#else
+#define JK_HAVE_IPV6    0
+#endif
+#endif
+
+typedef struct jk_sockaddr_t jk_sockaddr_t;
+struct jk_sockaddr_t {
+    int         family;
+    int         port;
+    const char *host;
+    int         salen;
+    /** Union of either IPv4 or IPv6 sockaddr. */
+    union {
+        /** IPv4 sockaddr structure */
+        struct sockaddr_in sin;
+#if JK_HAVE_IPV6
+        /** IPv6 sockaddr structure */
+        struct sockaddr_in6 sin6;
+#endif
+        /** Placeholder to ensure that the size of this union is not
+         * dependent on whether JK_HAVE_IPV6 is defined. */
+        char sas[128];
+    } sa;
+};
+
 #ifdef __cplusplus
 }
 #endif                          /* __cplusplus */

Modified: tomcat/jk/trunk/native/common/jk_status.c
URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/native/common/jk_status.c?rev=1520261&r1=1520260&r2=1520261&view=diff
==============================================================================
--- tomcat/jk/trunk/native/common/jk_status.c (original)
+++ tomcat/jk/trunk/native/common/jk_status.c Thu Sep  5 09:43:12 2013
@@ -3370,9 +3370,9 @@ static int commit_member(jk_ws_service_t
         }
     }
     if (resolve == JK_TRUE) {
-        struct sockaddr_in inet_addr;
+        jk_sockaddr_t inet_addr;
         if (!jk_resolve(host, port, &inet_addr,
-                        aw->worker.we->pool, l)) {
+                        aw->worker.we->pool, aw->prefer_ipv6, l)) {
             const char *msg = "Update failed (at least partially): could not resolve address '%s:%d' for sub worker '%s'.";
             size_t size = strlen(msg) + strlen(host) + strlen(aw->name) + 10 + 1;
             p->msg = jk_pool_alloc(s->pool, size);

Modified: tomcat/jk/trunk/native/common/jk_util.c
URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/native/common/jk_util.c?rev=1520261&r1=1520260&r2=1520261&view=diff
==============================================================================
--- tomcat/jk/trunk/native/common/jk_util.c (original)
+++ tomcat/jk/trunk/native/common/jk_util.c Thu Sep  5 09:43:12 2013
@@ -104,6 +104,7 @@
 #define USER_CASE_OF_WORKER         "user_case_insensitive"
 #define GOOD_RATING_OF_WORKER       "good"
 #define BAD_RATING_OF_WORKER        "bad"
+#define PREFER_IPV6_ADDRESS         "prefer_ipv6"
 
 #define DEFAULT_WORKER_TYPE         JK_AJP13_WORKER_NAME
 #define SECRET_KEY_OF_WORKER        "secretkey"
@@ -233,6 +234,7 @@ static const char *unique_properties[] =
     XML_DOCTYPE_OF_WORKER,
     PROP_PREFIX_OF_WORKER,
     USER_CASE_OF_WORKER,
+    PREFER_IPV6_ADDRESS,
     NULL
 };
 
@@ -337,6 +339,7 @@ static const char *supported_properties[
     STATUS_FAIL_OF_WORKER,
     LIST_PROPERTY_NAME,
     MAINTAIN_PROPERTY_NAME,
+    PREFER_IPV6_ADDRESS,
     NULL
 };
 
@@ -920,6 +923,18 @@ int jk_get_worker_port(jk_map_t *m, cons
     return jk_map_get_int(m, buf, def);
 }
 
+int jk_get_worker_prefer_ipv6(jk_map_t *m, const char *wname, int def)
+{
+    char buf[PARAM_BUFFER_SIZE];
+    if (!m || !wname) {
+        return def;
+    }
+
+    MAKE_WORKER_PARAM(PREFER_IPV6_ADDRESS);
+
+    return jk_map_get_bool(m, buf, def);
+}
+
 static int def_cache_size = -1;
 int jk_get_worker_def_cache_size(int protocol)
 {

Modified: tomcat/jk/trunk/native/common/jk_util.h
URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/native/common/jk_util.h?rev=1520261&r1=1520260&r2=1520261&view=diff
==============================================================================
--- tomcat/jk/trunk/native/common/jk_util.h (original)
+++ tomcat/jk/trunk/native/common/jk_util.h Thu Sep  5 09:43:12 2013
@@ -71,6 +71,8 @@ const char *jk_get_worker_type(jk_map_t 
 
 int jk_get_worker_port(jk_map_t *m, const char *wname, int def);
 
+int jk_get_worker_prefer_ipv6(jk_map_t *m, const char *wname, int def);
+
 int jk_get_worker_cache_size(jk_map_t *m, const char *wname, int def);
 
 int jk_get_worker_cache_size_min(jk_map_t *m, const char *wname, int def);



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org