Commit Diff


commit - 5d394e24523f08a36306342663d7036d728fb66e
commit + 37ed6014e6a950279c73fe895cfade2a997a6086
blob - e4b50292d6907c48f100eb18ca357f447f0ab75b
blob + 8fb7701d0472b2d2834fc8e4545e668e82e51a5b
--- hce.c
+++ hce.c
@@ -1,4 +1,4 @@
-/*	$OpenBSD: hce.c,v 1.78 2017/12/18 21:45:57 benno Exp $	*/
+/*	$OpenBSD: hce.c,v 1.79 2018/08/06 17:31:31 benno Exp $	*/
 
 /*
  * Copyright (c) 2006 Pierre-Yves Ritschard <pyr@openbsd.org>
@@ -197,7 +197,7 @@ hce_notify_done(struct host *host, enum host_error he)
 	struct ctl_status	 st;
 	struct timeval		 tv_now, tv_dur;
 	u_long			 duration;
-	u_int			 logopt;
+	u_int			 logopt = RELAYD_OPT_LOGHOSTCHECK;
 	struct host		*h, *hostnst;
 	int			 hostup;
 	const char		*msg;
@@ -248,8 +248,6 @@ hce_notify_done(struct host *host, enum host_error he)
 	proc_compose(env->sc_ps, PROC_PFE, IMSG_HOST_STATUS, &st, sizeof(st));
 	if (host->up != host->last_up)
 		logopt = RELAYD_OPT_LOGUPDATE;
-	else
-		logopt = RELAYD_OPT_LOGNOTIFY;
 
 	getmonotime(&tv_now);
 	timersub(&tv_now, &host->cte.tv_start, &tv_dur);
blob - 85b01d266b8d6593823f5196ccf35604f20cb3ca
blob + 2af04c27bd9fef155b8f3c34ba10bfb8bf08da82
--- parse.y
+++ parse.y
@@ -1,4 +1,4 @@
-/*	$OpenBSD: parse.y,v 1.226 2018/07/11 07:39:22 krw Exp $	*/
+/*	$OpenBSD: parse.y,v 1.227 2018/08/06 17:31:31 benno Exp $	*/
 
 /*
  * Copyright (c) 2007 - 2014 Reyk Floeter <reyk@openbsd.org>
@@ -176,7 +176,7 @@ typedef struct {
 %token	SNMP SOCKET SPLICE SSL STICKYADDR STYLE TABLE TAG TAGGED TCP TIMEOUT TLS
 %token	TO ROUTER RTLABEL TRANSPARENT TRAP UPDATES URL VIRTUAL WITH TTL RTABLE
 %token	MATCH PARAMS RANDOM LEASTSTATES SRCHASH KEY CERTIFICATE PASSWORD ECDHE
-%token	EDH TICKETS
+%token	EDH TICKETS CONNECTION CONNECTIONS ERRORS STATE CHANGES CHECKS
 %token	<v.string>	STRING
 %token  <v.number>	NUMBER
 %type	<v.string>	hostname interface table value optstring
@@ -433,8 +433,23 @@ main		: INTERVAL NUMBER	{
 trap		: /* nothing */		{ $$ = 0; }
 		| TRAP			{ $$ = 1; }
 
-loglevel	: UPDATES		{ $$ = RELAYD_OPT_LOGUPDATE; }
-		| ALL			{ $$ = RELAYD_OPT_LOGALL; }
+loglevel	: UPDATES		{ /* remove 6.4-current */
+					  $$ = RELAYD_OPT_LOGUPDATE;
+					  log_warnx("log updates deprecated, "
+					      "update configuration");
+					}
+		| STATE CHANGES		{ $$ = RELAYD_OPT_LOGUPDATE; }
+		| HOST CHECKS		{ $$ = RELAYD_OPT_LOGHOSTCHECK; }
+		| ALL			{ /* remove 6.4-current */
+					  $$ = (RELAYD_OPT_LOGHOSTCHECK|
+						RELAYD_OPT_LOGCON|
+						RELAYD_OPT_LOGCONERR);
+					  log_warnx("log all deprecated, "
+					      "update configuration");
+					}
+		| CONNECTION		{ $$ = (RELAYD_OPT_LOGCON |
+						RELAYD_OPT_LOGCONERR); }
+		| CONNECTION ERRORS	{ $$ = RELAYD_OPT_LOGCONERR; }
 		;
 
 rdr		: REDIRECT STRING	{
@@ -2223,9 +2238,12 @@ lookup(char *s)
 		{ "ca",			CA },
 		{ "cache",		CACHE },
 		{ "cert",		CERTIFICATE },
+		{ "changes",		CHANGES },
 		{ "check",		CHECK },
+		{ "checks",		CHECKS },
 		{ "ciphers",		CIPHERS },
 		{ "code",		CODE },
+		{ "connection",		CONNECTION },
 		{ "cookie",		COOKIE },
 		{ "demote",		DEMOTE },
 		{ "destination",	DESTINATION },
@@ -2234,6 +2252,7 @@ lookup(char *s)
 		{ "ecdhe",		ECDHE },
 		{ "edh",		EDH },
 		{ "error",		ERROR },
+		{ "errors",		ERRORS },
 		{ "expect",		EXPECT },
 		{ "external",		EXTERNAL },
 		{ "file",		FILENAME },
@@ -2302,6 +2321,7 @@ lookup(char *s)
 		{ "source-hash",	SRCHASH },
 		{ "splice",		SPLICE },
 		{ "ssl",		SSL },
+		{ "state",		STATE },
 		{ "sticky-address",	STICKYADDR },
 		{ "style",		STYLE },
 		{ "table",		TABLE },
blob - 9a7f60d6f86778b9a765003378e7591a6b7265ce
blob + 8ebd0bd1c1487f179fb6fe1fecb7b9e52bafb521
--- relay.c
+++ relay.c
@@ -1,4 +1,4 @@
-/*	$OpenBSD: relay.c,v 1.239 2018/06/10 20:41:47 benno Exp $	*/
+/*	$OpenBSD: relay.c,v 1.240 2018/08/06 17:31:31 benno Exp $	*/
 
 /*
  * Copyright (c) 2006 - 2014 Reyk Floeter <reyk@openbsd.org>
@@ -397,7 +397,7 @@ relay_statistics(int fd, short events, void *arg)
 			    &rlay->rl_sessions, con);
 			timersub(&tv_now, &con->se_tv_last, &tv);
 			if (timercmp(&tv, &rlay->rl_conf.timeout, >=))
-				relay_close(con, "hard timeout");
+				relay_close(con, "hard timeout", 1);
 		}
 	}
 
@@ -700,7 +700,7 @@ relay_connected(int fd, short sig, void *arg)
 	case RELAY_PROTO_HTTP:
 		if (relay_httpdesc_init(out) == -1) {
 			relay_close(con,
-			    "failed to allocate http descriptor");
+			    "failed to allocate http descriptor", 1);
 			return;
 		}
 		con->se_out.toread = TOREAD_HTTP_HEADER;
@@ -742,7 +742,7 @@ relay_connected(int fd, short sig, void *arg)
 		bufferevent_enable(con->se_in.bev, EV_READ);
 
 	if (relay_splice(&con->se_out) == -1)
-		relay_close(con, strerror(errno));
+		relay_close(con, strerror(errno), 1);
 }
 
 void
@@ -757,7 +757,7 @@ relay_input(struct rsession *con)
 	case RELAY_PROTO_HTTP:
 		if (relay_httpdesc_init(&con->se_in) == -1) {
 			relay_close(con,
-			    "failed to allocate http descriptor");
+			    "failed to allocate http descriptor", 1);
 			return;
 		}
 		con->se_in.toread = TOREAD_HTTP_HEADER;
@@ -776,7 +776,7 @@ relay_input(struct rsession *con)
 	con->se_in.bev = bufferevent_new(con->se_in.s, inrd, inwr,
 	    relay_error, &con->se_in);
 	if (con->se_in.bev == NULL) {
-		relay_close(con, "failed to allocate input buffer event");
+		relay_close(con, "failed to allocate input buffer event", 1);
 		return;
 	}
 
@@ -791,7 +791,7 @@ relay_input(struct rsession *con)
 	bufferevent_enable(con->se_in.bev, EV_READ|EV_WRITE);
 
 	if (relay_splice(&con->se_in) == -1)
-		relay_close(con, strerror(errno));
+		relay_close(con, strerror(errno), 1);
 }
 
 void
@@ -811,10 +811,10 @@ relay_write(struct bufferevent *bev, void *arg)
 
 	return;
  done:
-	relay_close(con, "last write (done)");
+	relay_close(con, "last write (done)", 0);
 	return;
  fail:
-	relay_close(con, strerror(errno));
+	relay_close(con, strerror(errno), 1);
 }
 
 void
@@ -860,10 +860,10 @@ relay_read(struct bufferevent *bev, void *arg)
 
 	return;
  done:
-	relay_close(con, "last read (done)");
+	relay_close(con, "last read (done)", 0);
 	return;
  fail:
-	relay_close(con, strerror(errno));
+	relay_close(con, strerror(errno), 1);
 }
 
 /*
@@ -985,7 +985,7 @@ relay_error(struct bufferevent *bev, short error, void
 			case -1:
 				goto fail;
 			case 0:
-				relay_close(con, "buffer event timeout");
+				relay_close(con, "buffer event timeout", 1);
 				break;
 			case 1:
 				cre->timedout = 1;
@@ -993,7 +993,7 @@ relay_error(struct bufferevent *bev, short error, void
 				break;
 			}
 		} else {
-			relay_close(con, "buffer event timeout");
+			relay_close(con, "buffer event timeout", 1);
 		}
 		return;
 	}
@@ -1003,14 +1003,14 @@ relay_error(struct bufferevent *bev, short error, void
 			case -1:
 				goto fail;
 			case 0:
-				relay_close(con, "splice timeout");
+				relay_close(con, "splice timeout", 1);
 				return;
 			case 1:
 				bufferevent_enable(bev, EV_READ);
 				break;
 			}
 		} else if (cre->dst->timedout) {
-			relay_close(con, "splice timeout");
+			relay_close(con, "splice timeout", 1);
 			return;
 		}
 		if (relay_spliceadjust(cre) == -1)
@@ -1036,13 +1036,13 @@ relay_error(struct bufferevent *bev, short error, void
 		} else if (cre->toread == TOREAD_UNLIMITED || cre->toread == 0)
 			return;
 
-		relay_close(con, "done");
+		relay_close(con, "done", 0);
 		return;
 	}
-	relay_close(con, "buffer event error");
+	relay_close(con, "buffer event error", 1);
 	return;
  fail:
-	relay_close(con, strerror(errno));
+	relay_close(con, strerror(errno), 1);
 }
 
 void
@@ -1138,7 +1138,7 @@ relay_accept(int fd, short event, void *arg)
 	/* Pre-allocate output buffer */
 	con->se_out.output = evbuffer_new();
 	if (con->se_out.output == NULL) {
-		relay_close(con, "failed to allocate output buffer");
+		relay_close(con, "failed to allocate output buffer", 1);
 		return;
 	}
 
@@ -1146,7 +1146,7 @@ relay_accept(int fd, short event, void *arg)
 		slen = sizeof(con->se_out.ss);
 		if (getsockname(s, (struct sockaddr *)&con->se_out.ss,
 		    &slen) == -1) {
-			relay_close(con, "peer lookup failed");
+			relay_close(con, "peer lookup failed", 1);
 			return;
 		}
 		con->se_out.port = relay_socket_getport(&con->se_out.ss);
@@ -1158,7 +1158,7 @@ relay_accept(int fd, short event, void *arg)
 			con->se_out.ss.ss_family = AF_UNSPEC;
 	} else if (rlay->rl_conf.flags & F_NATLOOK) {
 		if ((cnl = calloc(1, sizeof(*cnl))) == NULL) {
-			relay_close(con, "failed to allocate nat lookup");
+			relay_close(con, "failed to allocate nat lookup", 1);
 			return;
 		}
 
@@ -1173,7 +1173,7 @@ relay_accept(int fd, short event, void *arg)
 		slen = sizeof(cnl->dst);
 		if (getsockname(s,
 		    (struct sockaddr *)&cnl->dst, &slen) == -1) {
-			relay_close(con, "failed to get local address");
+			relay_close(con, "failed to get local address", 1);
 			return;
 		}
 
@@ -1368,7 +1368,7 @@ relay_natlook(int fd, short event, void *arg)
 	if (con->se_out.ss.ss_family == AF_UNSPEC && cnl->in == -1 &&
 	    rlay->rl_conf.dstss.ss_family == AF_UNSPEC &&
 	    TAILQ_EMPTY(&rlay->rl_tables)) {
-		relay_close(con, "session NAT lookup failed");
+		relay_close(con, "session NAT lookup failed", 1);
 		return;
 	}
 	if (cnl->in != -1) {
@@ -1390,7 +1390,7 @@ relay_session(struct rsession *con)
 	if (bcmp(&rlay->rl_conf.ss, &out->ss, sizeof(out->ss)) == 0 &&
 	    out->port == rlay->rl_conf.port) {
 		log_debug("%s: session %d: looping", __func__, con->se_id);
-		relay_close(con, "session aborted");
+		relay_close(con, "session aborted", 1);
 		return;
 	}
 
@@ -1401,7 +1401,7 @@ relay_session(struct rsession *con)
 		if (rlay->rl_proto->request == NULL)
 			fatalx("invalide UDP session");
 		if ((*rlay->rl_proto->request)(con) == -1)
-			relay_close(con, "session failed");
+			relay_close(con, "session failed", 1);
 		return;
 	}
 
@@ -1414,7 +1414,7 @@ relay_session(struct rsession *con)
 		if (rlay->rl_conf.fwdmode == FWD_TRANS)
 			relay_bindanyreq(con, 0, IPPROTO_TCP);
 		else if (relay_connect(con) == -1) {
-			relay_close(con, "session failed");
+			relay_close(con, "session failed", 1);
 			return;
 		}
 	}
@@ -1451,11 +1451,11 @@ relay_bindany(int fd, short event, void *arg)
 	struct rsession	*con = arg;
 
 	if (con->se_bnds == -1) {
-		relay_close(con, "bindany failed, invalid socket");
+		relay_close(con, "bindany failed, invalid socket", 1);
 		return;
 	}
 	if (relay_connect(con) == -1)
-		relay_close(con, "session failed");
+		relay_close(con, "session failed", 1);
 }
 
 void
@@ -1670,7 +1670,7 @@ relay_connect(struct rsession *con)
 }
 
 void
-relay_close(struct rsession *con, const char *msg)
+relay_close(struct rsession *con, const char *msg, int err)
 {
 	char		 ibuf[128], obuf[128], *ptr = NULL;
 	struct relay	*rlay = con->se_relay;
@@ -1685,7 +1685,8 @@ relay_close(struct rsession *con, const char *msg)
 	if (con->se_out.bev != NULL)
 		bufferevent_disable(con->se_out.bev, EV_READ|EV_WRITE);
 
-	if ((env->sc_conf.opts & RELAYD_OPT_LOGUPDATE) && msg != NULL) {
+	if ((env->sc_conf.opts & (RELAYD_OPT_LOGCON|RELAYD_OPT_LOGCONERR)) &&
+	    msg != NULL) {
 		bzero(&ibuf, sizeof(ibuf));
 		bzero(&obuf, sizeof(obuf));
 		(void)print_host(&con->se_in.ss, ibuf, sizeof(ibuf));
@@ -1695,12 +1696,22 @@ relay_close(struct rsession *con, const char *msg)
 			ptr = evbuffer_readln(con->se_log, NULL,
 			    EVBUFFER_EOL_CRLF);
 		}
-		log_info("relay %s, "
-		    "session %d (%d active), %s, %s -> %s:%d, "
-		    "%s%s%s", rlay->rl_conf.name, con->se_id, relay_sessions,
-		    con->se_tag != 0 ? tag_id2name(con->se_tag) : "0", ibuf,
-		    obuf, ntohs(con->se_out.port), msg, ptr == NULL ? "" : ",",
-		    ptr == NULL ? "" : ptr);
+		if (err == 0 && (env->sc_conf.opts & RELAYD_OPT_LOGCON))
+			log_info("relay %s, "
+			    "session %d (%d active), %s, %s -> %s:%d, "
+			    "%s%s%s", rlay->rl_conf.name, con->se_id,
+			    relay_sessions, con->se_tag != 0 ?
+			    tag_id2name(con->se_tag) : "0", ibuf, obuf,
+			    ntohs(con->se_out.port), msg, ptr == NULL ?
+			    "" : ",", ptr == NULL ? "" : ptr);
+		if (err == 1 && (env->sc_conf.opts & RELAYD_OPT_LOGCONERR))
+			log_warn("relay %s, "
+			    "session %d (%d active), %s, %s -> %s:%d, "
+			    "%s%s%s", rlay->rl_conf.name, con->se_id,
+			    relay_sessions, con->se_tag != 0 ?
+			    tag_id2name(con->se_tag) : "0", ibuf, obuf,
+			    ntohs(con->se_out.port), msg, ptr == NULL ?
+			    "" : ",", ptr == NULL ? "" : ptr);
 		free(ptr);
 	}
 
@@ -2293,7 +2304,7 @@ relay_tls_transaction(struct rsession *con, struct ctl
 	return;
 
  err:
-	relay_close(con, errstr);
+	relay_close(con, errstr, 1);
 }
 
 void
@@ -2307,7 +2318,7 @@ relay_tls_handshake(int fd, short event, void *arg)
 	char			*msg;
 
 	if (event == EV_TIMEOUT) {
-		relay_close(con, "TLS handshake timeout");
+		relay_close(con, "TLS handshake timeout", 1);
 		return;
 	}
 
@@ -2344,7 +2355,7 @@ relay_tls_handshake(int fd, short event, void *arg)
 				con->se_in.tlscert = NULL;
 			if (con->se_in.tlscert == NULL)
 				relay_close(con,
-				    "could not create certificate");
+				    "could not create certificate", 1);
 			else
 				relay_session(con);
 			return;
@@ -2358,10 +2369,10 @@ relay_tls_handshake(int fd, short event, void *arg)
 	} else {
 		if (asprintf(&msg, "TLS handshake error: %s",
 		    tls_error(cre->tls)) >= 0) {
-			relay_close(con, msg);
+			relay_close(con, msg, 1);
 			free(msg);
 		} else {
-			relay_close(con, "TLS handshake error");
+			relay_close(con, "TLS handshake error", 1);
 		}
 		return;
 	}
blob - cf493f8c887622cda08ce7c9b1171d686d47e251
blob + a9d27bfe60517ded05c87a6c524ffce4099e62ac
--- relay_http.c
+++ relay_http.c
@@ -1,4 +1,4 @@
-/*	$OpenBSD: relay_http.c,v 1.70 2017/11/27 16:25:50 benno Exp $	*/
+/*	$OpenBSD: relay_http.c,v 1.71 2018/08/06 17:31:31 benno Exp $	*/
 
 /*
  * Copyright (c) 2006 - 2016 Reyk Floeter <reyk@openbsd.org>
@@ -406,7 +406,7 @@ relay_read_http(struct bufferevent *bev, void *arg)
 		action = relay_test(proto, cre);
 		switch (action) {
 		case RES_FAIL:
-			relay_close(con, "filter rule failed");
+			relay_close(con, "filter rule failed", 1);
 			return;
 		case RES_BAD:
 			relay_abort_http(con, 400, "Bad Request",
@@ -512,12 +512,12 @@ relay_read_http(struct bufferevent *bev, void *arg)
 		}
 	}
 	if (con->se_done) {
-		relay_close(con, "last http read (done)");
+		relay_close(con, "last http read (done)", 0);
 		return;
 	}
 	switch (relay_splice(cre)) {
 	case -1:
-		relay_close(con, strerror(errno));
+		relay_close(con, strerror(errno), 1);
 	case 1:
 		return;
 	case 0:
@@ -589,10 +589,10 @@ relay_read_httpcontent(struct bufferevent *bev, void *
 	/* The callback readcb() might have freed the session. */
 	return;
  done:
-	relay_close(con, "last http content read");
+	relay_close(con, "last http content read", 0);
 	return;
  fail:
-	relay_close(con, strerror(errno));
+	relay_close(con, strerror(errno), 1);
 }
 
 void
@@ -652,7 +652,7 @@ relay_read_httpchunks(struct bufferevent *bev, void *a
 		 */
 		if (sscanf(line, "%llx", &llval) != 1 || llval < 0) {
 			free(line);
-			relay_close(con, "invalid chunk size");
+			relay_close(con, "invalid chunk size", 1);
 			return;
 		}
 
@@ -713,10 +713,10 @@ relay_read_httpchunks(struct bufferevent *bev, void *a
 	return;
 
  done:
-	relay_close(con, "last http chunk read (done)");
+	relay_close(con, "last http chunk read (done)", 0);
 	return;
  fail:
-	relay_close(con, strerror(errno));
+	relay_close(con, strerror(errno), 1);
 }
 
 void
@@ -991,7 +991,7 @@ relay_abort_http(struct rsession *con, u_int code, con
 	/* In some cases this function may be called from generic places */
 	if (rlay->rl_proto->type != RELAY_PROTO_HTTP ||
 	    (rlay->rl_proto->flags & F_RETURN) == 0) {
-		relay_close(con, msg);
+		relay_close(con, msg, 0);
 		return;
 	}
 
@@ -1060,9 +1060,9 @@ relay_abort_http(struct rsession *con, u_int code, con
  done:
 	free(body);
 	if (asprintf(&httpmsg, "%s (%03d %s)", msg, code, httperr) == -1)
-		relay_close(con, msg);
+		relay_close(con, msg, 1);
 	else {
-		relay_close(con, httpmsg);
+		relay_close(con, httpmsg, 1);
 		free(httpmsg);
 	}
 }
blob - fe5a1d587eda423cff74feeef6c08e8eab10d67b
blob + 74d55feb794c4b796882e2b5af937eba57b7a208
--- relay_udp.c
+++ relay_udp.c
@@ -1,4 +1,4 @@
-/*	$OpenBSD: relay_udp.c,v 1.48 2018/04/18 12:10:54 claudio Exp $	*/
+/*	$OpenBSD: relay_udp.c,v 1.49 2018/08/06 17:31:31 benno Exp $	*/
 
 /*
  * Copyright (c) 2007 - 2013 Reyk Floeter <reyk@openbsd.org>
@@ -204,7 +204,7 @@ relay_udp_response(int fd, short sig, void *arg)
 	    (priv = (*proto->validate)(con, rlay, &ss, buf, len)) == NULL)
 		return;
 
-	relay_close(con, "unknown response");
+	relay_close(con, "unknown response", 1);
 	free(priv);
 }
 
@@ -281,7 +281,7 @@ relay_udp_server(int fd, short sig, void *arg)
 	/* Pre-allocate output buffer */
 	con->se_out.output = evbuffer_new();
 	if (con->se_out.output == NULL) {
-		relay_close(con, "failed to allocate output buffer");
+		relay_close(con, "failed to allocate output buffer", 1);
 		return;
 	}
 
@@ -289,20 +289,20 @@ relay_udp_server(int fd, short sig, void *arg)
 	con->se_haslog = 0;
 	con->se_log = evbuffer_new();
 	if (con->se_log == NULL) {
-		relay_close(con, "failed to allocate log buffer");
+		relay_close(con, "failed to allocate log buffer", 1);
 		return;
 	}
 
 	if (rlay->rl_conf.flags & F_NATLOOK) {
 		if ((cnl = calloc(1, sizeof(*cnl))) == NULL) {
-			relay_close(con, "failed to allocate natlookup");
+			relay_close(con, "failed to allocate natlookup", 1);
 			return;
 		}
 	}
 
 	/* Save the received data */
 	if (evbuffer_add(con->se_out.output, buf, len) == -1) {
-		relay_close(con, "failed to store buffer");
+		relay_close(con, "failed to store buffer", 1);
 		free(cnl);
 		return;
 	}
@@ -337,7 +337,7 @@ relay_udp_timeout(int fd, short sig, void *arg)
 	if (sig != EV_TIMEOUT)
 		fatalx("invalid timeout event");
 
-	relay_close(con, "udp timeout");
+	relay_close(con, "udp timeout", 1);
 }
 
 /*
@@ -440,7 +440,7 @@ relay_dns_validate(struct rsession *con, struct relay 
 	} else {
 		priv = con->se_priv;
 		if (priv == NULL || key != priv->dp_inkey) {
-			relay_close(con, "invalid response");
+			relay_close(con, "invalid response", 1);
 			return (NULL);
 		}
 		relay_dns_result(con, buf, len);
@@ -531,11 +531,11 @@ relay_dns_result(struct rsession *con, u_int8_t *buf, 
 	slen = con->se_out.ss.ss_len;
 	if (sendto(rlay->rl_s, buf, len, 0,
 	    (struct sockaddr *)&con->se_in.ss, slen) == -1) {
-		relay_close(con, "response failed");
+		relay_close(con, "response failed", 1);
 		return;
 	}
 
-	relay_close(con, "session closed");
+	relay_close(con, "session closed", 0);
 }
 
 int
blob - 0ce53b41d5db8dd7b730a17dc00d1e05a36a8cdc
blob + c2e675adf671cc213fce308ee970c637ac193d08
--- relayd.c
+++ relayd.c
@@ -1,4 +1,4 @@
-/*	$OpenBSD: relayd.c,v 1.171 2017/11/29 15:24:50 benno Exp $	*/
+/*	$OpenBSD: relayd.c,v 1.172 2018/08/06 17:31:31 benno Exp $	*/
 
 /*
  * Copyright (c) 2007 - 2016 Reyk Floeter <reyk@openbsd.org>
@@ -558,7 +558,7 @@ purge_relay(struct relayd *env, struct relay *rlay)
 	/* cleanup sessions */
 	while ((con =
 	    SPLAY_ROOT(&rlay->rl_sessions)) != NULL)
-		relay_close(con, NULL);
+		relay_close(con, NULL, 0);
 
 	/* cleanup relay */
 	if (rlay->rl_bev != NULL)
blob - 125bd685bb2627ae4d52987b63df4942e669621c
blob + dd40a50946be46513af2f3ad1ef3eb457ae17ea9
--- relayd.conf.5
+++ relayd.conf.5
@@ -1,4 +1,4 @@
-.\"	$OpenBSD: relayd.conf.5,v 1.185 2018/06/18 06:04:25 jmc Exp $
+.\"	$OpenBSD: relayd.conf.5,v 1.186 2018/08/06 17:31:31 benno Exp $
 .\"
 .\" Copyright (c) 2006 - 2016 Reyk Floeter <reyk@openbsd.org>
 .\" Copyright (c) 2006, 2007 Pierre-Yves Ritschard <pyr@openbsd.org>
@@ -15,7 +15,7 @@
 .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 .\"
-.Dd $Mdocdate: June 18 2018 $
+.Dd $Mdocdate: August 6 2018 $
 .Dt RELAYD.CONF 5
 .Os
 .Sh NAME
@@ -123,14 +123,14 @@ Set the interval in seconds at which the hosts will be
 The default interval is 10 seconds.
 .It Xo
 .Ic log
-.Pq Ic updates Ns | Ns Ic all
+.Pq Ic state changes Ns | Ns Ic host checks
 .Xc
-Log state notifications after completed host checks.
-Either only log the
-.Ic updates
-to new states or log
-.Ic all
-state notifications, even if the state didn't change.
+Log host checks:
+Either log only the
+.Ic state changes
+of hosts or log all
+.Ic host checks
+that were run, even if the state didn't change.
 The host state can be
 .Dq up
 (the health check completed successfully),
@@ -139,6 +139,12 @@ The host state can be
 or
 .Dq unknown
 (the host is disabled or has not been checked yet).
+.It Xo
+.Ic log connection Op Ic errors
+.Xc
+When using relays, log all TCP connections.
+Optionally log only
+.Ic connection errors.
 .It Ic prefork Ar number
 When using relays, run the specified number of processes to handle
 relayed connections.
blob - bcf47a6f709cb539de1d4aa5d60814e1946e8639
blob + ac43aa50608b45d8ab7ba0f9699b9a07b556e819
--- relayd.h
+++ relayd.h
@@ -1,4 +1,4 @@
-/*	$OpenBSD: relayd.h,v 1.249 2018/04/18 12:10:54 claudio Exp $	*/
+/*	$OpenBSD: relayd.h,v 1.250 2018/08/06 17:31:31 benno Exp $	*/
 
 /*
  * Copyright (c) 2006 - 2016 Reyk Floeter <reyk@openbsd.org>
@@ -1107,8 +1107,9 @@ struct relayd {
 #define RELAYD_OPT_VERBOSE		0x01
 #define RELAYD_OPT_NOACTION		0x04
 #define RELAYD_OPT_LOGUPDATE		0x08
-#define RELAYD_OPT_LOGNOTIFY		0x10
-#define RELAYD_OPT_LOGALL		0x18
+#define RELAYD_OPT_LOGHOSTCHECK		0x10
+#define RELAYD_OPT_LOGCON		0x20
+#define RELAYD_OPT_LOGCONERR		0x40
 
 /* control.c */
 int	 control_init(struct privsep *, struct control_sock *);
@@ -1173,7 +1174,7 @@ void	 relay_notify_done(struct host *, const char *);
 int	 relay_session_cmp(struct rsession *, struct rsession *);
 char	*relay_load_fd(int, off_t *);
 int	 relay_load_certfiles(struct relay *);
-void	 relay_close(struct rsession *, const char *);
+void	 relay_close(struct rsession *, const char *, int);
 int	 relay_reset_event(struct ctl_relay_event *);
 void	 relay_natlook(int, short, void *);
 void	 relay_session(struct rsession *);