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-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org