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