MEDIUM: Move proto and addr fields struct check
The motivation for this is to make checks more independent of each
other to allow further reuse of their infrastructure.
For nowserver->check and server->agent still always use the same values
for the addr and proto fields so this patch should not introduce any
behavioural changes.
Signed-off-by: Simon Horman <horms@verge.net.au>
diff --git a/include/types/checks.h b/include/types/checks.h
index 831166e..04d79c4 100644
--- a/include/types/checks.h
+++ b/include/types/checks.h
@@ -179,6 +179,8 @@
char **argv; /* the arguments to use if running a process-based check */
char **envp; /* the environment to use if running a process-based check */
struct pid_list *curpid; /* entry in pid_list used for current process-based test, or -1 if not in test */
+ struct protocol *proto; /* server address protocol for health checks */
+ struct sockaddr_storage addr; /* the address to check, if different from <addr> */
};
struct check_status {
diff --git a/include/types/server.h b/include/types/server.h
index 1cabb83..4f97e17 100644
--- a/include/types/server.h
+++ b/include/types/server.h
@@ -202,11 +202,6 @@
int puid; /* proxy-unique server ID, used for SNMP, and "first" LB algo */
- struct { /* configuration used by health-check and agent-check */
- struct protocol *proto; /* server address protocol for health checks */
- struct sockaddr_storage addr; /* the address to check, if different from <addr> */
- } check_common;
-
struct check check; /* health-check specific configuration */
struct check agent; /* agent specific configuration */
diff --git a/src/checks.c b/src/checks.c
index b2f89a5..6624714 100644
--- a/src/checks.c
+++ b/src/checks.c
@@ -1437,18 +1437,18 @@
/* prepare a new connection */
conn_init(conn);
- conn_prepare(conn, s->check_common.proto, check->xprt);
+ conn_prepare(conn, check->proto, check->xprt);
conn_attach(conn, check, &check_conn_cb);
conn->target = &s->obj_type;
/* no client address */
clear_addr(&conn->addr.from);
- if (is_addr(&s->check_common.addr)) {
+ if (is_addr(&check->addr)) {
/* we'll connect to the check addr specified on the server */
- conn->addr.to = s->check_common.addr;
- proto = s->check_common.proto;
+ conn->addr.to = check->addr;
+ proto = check->proto;
}
else {
/* we'll connect to the addr on the server */
@@ -2498,10 +2498,10 @@
/* no client address */
clear_addr(&conn->addr.from);
- if (is_addr(&s->check_common.addr)) {
+ if (is_addr(&check->addr)) {
/* we'll connect to the check addr specified on the server */
- conn->addr.to = s->check_common.addr;
- proto = s->check_common.proto;
+ conn->addr.to = check->addr;
+ proto = check->proto;
}
else {
/* we'll connect to the addr on the server */
diff --git a/src/server.c b/src/server.c
index 8554e75..31f319b 100644
--- a/src/server.c
+++ b/src/server.c
@@ -901,7 +901,7 @@
}
newsrv->addr = *sk;
- newsrv->proto = newsrv->check_common.proto = protocol_by_family(newsrv->addr.ss_family);
+ newsrv->proto = newsrv->check.proto = newsrv->agent.proto = protocol_by_family(newsrv->addr.ss_family);
newsrv->xprt = newsrv->check.xprt = newsrv->agent.xprt = &raw_sock;
if (!newsrv->proto) {
@@ -1109,8 +1109,8 @@
goto out;
}
- newsrv->check_common.addr = *sk;
- newsrv->check_common.proto = protocol_by_family(sk->ss_family);
+ newsrv->check.addr = newsrv->agent.addr = *sk;
+ newsrv->check.proto = newsrv->agent.proto = protocol_by_family(sk->ss_family);
cur_arg += 2;
}
else if (!strcmp(args[cur_arg], "port")) {
@@ -1578,7 +1578,7 @@
* same as for the production traffic. Otherwise we use raw_sock by
* default, unless one is specified.
*/
- if (!newsrv->check.port && !is_addr(&newsrv->check_common.addr)) {
+ if (!newsrv->check.port && !is_addr(&newsrv->check.addr)) {
#ifdef USE_OPENSSL
newsrv->check.use_ssl |= (newsrv->use_ssl || (newsrv->proxy->options & PR_O_TCPCHK_SSL));
#endif
@@ -1586,7 +1586,7 @@
}
/* try to get the port from check_core.addr if check.port not set */
if (!newsrv->check.port)
- newsrv->check.port = get_host_port(&newsrv->check_common.addr);
+ newsrv->check.port = get_host_port(&newsrv->check.addr);
if (!newsrv->check.port)
newsrv->check.port = realport; /* by default */
@@ -1609,8 +1609,8 @@
* be a 'connect' one when checking an IPv4/IPv6 server.
*/
if (!newsrv->check.port &&
- (is_inet_addr(&newsrv->check_common.addr) ||
- (!is_addr(&newsrv->check_common.addr) && is_inet_addr(&newsrv->addr)))) {
+ (is_inet_addr(&newsrv->check.addr) ||
+ (!is_addr(&newsrv->check.addr) && is_inet_addr(&newsrv->addr)))) {
struct tcpcheck_rule *n = NULL, *r = NULL;
struct list *l;