Lines Matching defs:con

379 	struct rsession		*con, *next_con;
422 for (con = SPLAY_ROOT(&rlay->rl_sessions);
423 con != NULL; con = next_con) {
425 &rlay->rl_sessions, con);
426 timersub(&tv_now, &con->se_tv_last, &tv);
428 relay_close(con, "hard timeout", 1);
686 struct rsession *con = arg;
687 struct relay *rlay = con->se_relay;
692 struct ctl_relay_event *out = &con->se_out;
698 relay_abort_http(con, 504, "connect timeout", 0);
704 relay_abort_http(con, 500, "getsockopt failed", 0);
711 relay_abort_http(con, 500, msg, 0);
715 relay_abort_http(con, 500,
722 relay_tls_transaction(con, out);
726 DPRINTF("%s: session %d: successful", __func__, con->se_id);
729 if ((con->se_table != con->se_table0) &&
731 con->se_table0 = con->se_table;
733 (void)print_host(&con->se_out.ss, obuf, sizeof(obuf));
735 obuf, ntohs(con->se_out.port)) == -1) {
736 relay_abort_http(con, 500,
740 relay_log(con, msg);
747 relay_close(con,
751 con->se_out.toread = TOREAD_HTTP_HEADER;
764 bev = bufferevent_new(fd, outrd, outwr, relay_error, &con->se_out);
766 relay_abort_http(con, 500,
771 if (bufferevent_write_buffer(bev, con->se_out.output)) {
772 relay_abort_http(con, 500, strerror(errno), 0);
775 con->se_out.bev = bev;
786 if (con->se_in.bev)
787 bufferevent_enable(con->se_in.bev, EV_READ);
789 if (relay_splice(&con->se_out) == -1)
790 relay_close(con, strerror(errno), 1);
794 relay_input(struct rsession *con)
796 struct relay *rlay = con->se_relay;
803 if (relay_http_priv_init(con) == -1) {
804 relay_close(con,
808 con->se_in.toread = TOREAD_HTTP_HEADER;
821 con->se_in.bev = bufferevent_new(con->se_in.s, inrd, inwr,
822 relay_error, &con->se_in);
823 if (con->se_in.bev == NULL) {
824 relay_close(con, "failed to allocate input buffer event", 1);
829 if ((rlay->rl_conf.flags & F_TLS) && con->se_in.tls != NULL)
830 relay_tls_connected(&con->se_in);
832 bufferevent_settimeout(con->se_in.bev,
834 bufferevent_setwatermark(con->se_in.bev, EV_WRITE,
836 bufferevent_enable(con->se_in.bev, EV_READ|EV_WRITE);
838 if (relay_splice(&con->se_in) == -1)
839 relay_close(con, strerror(errno), 1);
846 struct rsession *con = cre->con;
848 getmonotime(&con->se_tv_last);
850 if (con->se_done && EVBUFFER_LENGTH(EVBUFFER_OUTPUT(bev)) == 0)
859 relay_close(con, "last write (done)", 0);
862 relay_close(con, strerror(errno), 1);
887 struct rsession *con = cre->con;
888 struct protocol *proto = con->se_relay->rl_proto;
891 getmonotime(&con->se_tv_last);
898 if (con->se_done)
908 relay_close(con, "last read (done)", 0);
911 relay_close(con, strerror(errno), 1);
923 struct rsession *con = cre->con;
924 struct relay *rlay = con->se_relay;
941 __func__, con->se_id, cre->dir, cre->toread);
949 __func__, con->se_id, cre->dir);
960 __func__, con->se_id, cre->dir, strerror(errno));
967 __func__, con->se_id, cre->dir, cre->toread);
975 struct rsession *con = cre->con;
985 __func__, con->se_id, cre->dir, strerror(errno));
990 __func__, con->se_id, cre->dir, len);
993 getmonotime(&con->se_tv_last);
1020 struct rsession *con = cre->con;
1024 __func__, con->se_id, cre->dir, cre->state, cre->toread, error);
1033 relay_close(con, "buffer event timeout", 1);
1041 relay_close(con, "buffer event timeout", 1);
1051 relay_close(con, "splice timeout", 1);
1058 relay_close(con, "splice timeout", 1);
1076 con->se_done = 1;
1084 relay_close(con, "done", 0);
1087 relay_close(con, "buffer event error", 1);
1090 relay_close(con, strerror(errno), 1);
1098 struct rsession *con = NULL;
1128 if ((con = calloc(1, sizeof(*con))) == NULL)
1132 con->se_haslog = 0;
1133 con->se_log = evbuffer_new();
1134 if (con->se_log == NULL)
1137 con->se_in.s = s;
1138 con->se_in.tls = NULL;
1139 con->se_out.s = -1;
1140 con->se_out.tls = NULL;
1141 con->se_in.dst = &con->se_out;
1142 con->se_out.dst = &con->se_in;
1143 con->se_in.con = con;
1144 con->se_out.con = con;
1145 con->se_in.splicelen = -1;
1146 con->se_out.splicelen = -1;
1147 con->se_in.toread = TOREAD_UNLIMITED;
1148 con->se_out.toread = TOREAD_UNLIMITED;
1149 con->se_relay = rlay;
1150 con->se_id = ++relay_conid;
1151 con->se_relayid = rlay->rl_conf.id;
1152 con->se_pid = getpid();
1153 con->se_in.dir = RELAY_DIR_REQUEST;
1154 con->se_out.dir = RELAY_DIR_RESPONSE;
1155 con->se_retry = rlay->rl_conf.dstretry;
1156 con->se_bnds = -1;
1157 con->se_out.port = rlay->rl_conf.dstport;
1160 con->se_in.port = ((struct sockaddr_in *)&ss)->sin_port;
1163 con->se_in.port = ((struct sockaddr_in6 *)&ss)->sin6_port;
1166 memcpy(&con->se_in.ss, &ss, sizeof(con->se_in.ss));
1168 slen = sizeof(con->se_sockname);
1169 if (getsockname(s, (struct sockaddr *)&con->se_sockname, &slen) == -1) {
1170 relay_close(con, "sockname lookup failed", 1);
1174 getmonotime(&con->se_tv_start);
1175 bcopy(&con->se_tv_start, &con->se_tv_last, sizeof(con->se_tv_last));
1178 SipHash24_Init(&con->se_siphashctx,
1183 SPLAY_INSERT(session_tree, &rlay->rl_sessions, con);
1184 relay_session_publish(con);
1190 con->se_out.output = evbuffer_new();
1191 if (con->se_out.output == NULL) {
1192 relay_close(con, "failed to allocate output buffer", 1);
1197 memcpy(&con->se_out.ss, &con->se_sockname,
1198 sizeof(con->se_out.ss));
1199 con->se_out.port = relay_socket_getport(&con->se_out.ss);
1202 if (bcmp(&rlay->rl_conf.ss, &con->se_out.ss,
1203 sizeof(con->se_out.ss)) == 0 &&
1204 con->se_out.port == rlay->rl_conf.port)
1205 con->se_out.ss.ss_family = AF_UNSPEC;
1208 relay_close(con, "failed to allocate nat lookup", 1);
1212 con->se_cnl = cnl;
1215 cnl->id = con->se_id;
1219 memcpy(&cnl->src, &con->se_in.ss, sizeof(cnl->src));
1220 memcpy(&cnl->dst, &con->se_sockname, sizeof(cnl->dst));
1226 evtimer_set(&con->se_ev, relay_natlook, con);
1228 evtimer_add(&con->se_ev, &tv);
1233 relay_preconnect(con);
1237 relay_session(con);
1242 free(con);
1277 relay_from_table(struct rsession *con)
1279 struct relay *rlay = con->se_relay;
1289 if (con->se_table != NULL) {
1290 rlt = con->se_table;
1310 __func__, con->se_id);
1325 relay_hash_addr(&con->se_siphashctx, &con->se_in.ss, -1);
1329 relay_hash_addr(&con->se_siphashctx, &con->se_in.ss, -1);
1333 relay_hash_addr(&con->se_siphashctx, &rlay->rl_conf.ss,
1342 p = SipHash24_End(&con->se_siphashctx);
1345 SipHash24_Init(&con->se_siphashctx,
1358 __func__, con->se_id, table->conf.name,
1369 __func__, con->se_id, table->conf.name, host->conf.name,
1375 con->se_id, host->conf.name);
1382 __func__, con->se_id, host->conf.name);
1393 con->se_retry = host->conf.retry;
1394 con->se_out.port = table->conf.port;
1395 bcopy(&host->conf.ss, &con->se_out.ss, sizeof(con->se_out.ss));
1403 struct rsession *con = arg;
1404 struct relay *rlay = con->se_relay;
1405 struct ctl_natlook *cnl = con->se_cnl;
1410 if (con->se_out.ss.ss_family == AF_UNSPEC && cnl->in == -1 &&
1413 relay_close(con, "session NAT lookup failed", 1);
1417 bcopy(&cnl->rdst, &con->se_out.ss, sizeof(con->se_out.ss));
1418 con->se_out.port = cnl->rdport;
1420 free(con->se_cnl);
1421 con->se_cnl = NULL;
1423 relay_session(con);
1427 relay_session(struct rsession *con)
1429 struct relay *rlay = con->se_relay;
1430 struct ctl_relay_event *in = &con->se_in, *out = &con->se_out;
1434 log_debug("%s: session %d: looping", __func__, con->se_id);
1435 relay_close(con, "session aborted", 1);
1445 if ((*rlay->rl_proto->request)(con) == -1)
1446 relay_close(con, "session failed", 1);
1451 relay_tls_transaction(con, in);
1457 relay_bindanyreq(con, 0, IPPROTO_TCP);
1458 else if (relay_connect(con) == -1) {
1459 relay_close(con, "session failed", 1);
1464 relay_input(con);
1468 relay_bindanyreq(struct rsession *con, in_port_t port, int proto)
1471 struct relay *rlay = con->se_relay;
1476 bnd.bnd_id = con->se_id;
1480 bcopy(&con->se_in.ss, &bnd.bnd_ss, sizeof(bnd.bnd_ss));
1485 evtimer_set(&con->se_ev, relay_bindany, con);
1487 evtimer_add(&con->se_ev, &tv);
1493 struct rsession *con = arg;
1495 if (con->se_bnds == -1) {
1496 relay_close(con, "bindany failed, invalid socket", 1);
1499 if (relay_connect(con) == -1)
1500 relay_close(con, "session failed", 1);
1504 relay_connect_state(struct rsession *con, struct ctl_relay_event *cre,
1508 __func__, con->se_id,
1518 struct rsession *con = arg;
1519 struct relay *rlay = con->se_relay;
1528 con->se_retrycount, con->se_retry, relay_inflight);
1533 evtimer_del(&con->se_inflightevt);
1544 if (con->se_retrycount < RELAY_OUTOF_FD_RETRIES) {
1545 evtimer_add(&con->se_inflightevt, &evtpause);
1550 relay_abort_http(con, 504, "connection timed out", 0);
1555 /* con->se_bnds cannot be unset */
1556 bnds = con->se_bnds;
1560 if ((con->se_out.s = relay_socket_connect(&con->se_out.ss,
1561 con->se_out.port, rlay->rl_proto, bnds)) == -1) {
1564 con->se_id, strerror(errno),
1565 con->se_retry ? "next retry" : "last retry");
1567 con->se_retrycount++;
1570 (con->se_retrycount < con->se_retry)) {
1572 evtimer_add(&con->se_inflightevt, &evtpause);
1575 } else if (con->se_retrycount < con->se_retry)
1578 relay_abort_http(con, 504, "connect failed", 0);
1583 relay_connect_state(con, &con->se_out, STATE_PRECONNECT);
1585 relay_connect_state(con, &con->se_out, STATE_CONNECTED);
1592 event_again(&con->se_ev, con->se_out.s, EV_WRITE|EV_TIMEOUT,
1593 relay_connected, &con->se_tv_start, &rlay->rl_conf.timeout,
1594 con);
1596 relay_connected(con->se_out.s, EV_WRITE, con);
1602 relay_preconnect(struct rsession *con)
1607 con->se_id, privsep_process);
1608 rv = relay_connect(con);
1609 if (con->se_out.state == STATE_CONNECTED)
1610 relay_connect_state(con, &con->se_out, STATE_PRECONNECT);
1615 relay_connect(struct rsession *con)
1617 struct relay *rlay = con->se_relay;
1622 if (con->se_out.state == STATE_CONNECTED) {
1629 con->se_out.state == STATE_PRECONNECT) {
1630 if (con->se_out.tls == NULL) {
1634 relay_connected(con->se_out.s, EV_WRITE, con);
1635 relay_connect_state(con, &con->se_out, STATE_CONNECTED);
1644 getmonotime(&con->se_tv_start);
1646 if (con->se_out.ss.ss_family == AF_UNSPEC &&
1648 if (relay_from_table(con) != 0)
1650 } else if (con->se_out.ss.ss_family == AF_UNSPEC) {
1651 bcopy(&rlay->rl_conf.dstss, &con->se_out.ss,
1652 sizeof(con->se_out.ss));
1653 con->se_out.port = rlay->rl_conf.dstport;
1657 if (con->se_bnds == -1) {
1661 bnds = con->se_bnds;
1666 if (con->se_out.ss.ss_family == AF_INET &&
1668 ret = map4to6(&con->se_out.ss, &rlay->rl_conf.dstaf);
1669 else if (con->se_out.ss.ss_family == AF_INET6 &&
1671 ret = map6to4(&con->se_out.ss);
1681 if ((con->se_out.s = relay_socket_connect(&con->se_out.ss,
1682 con->se_out.port, rlay->rl_proto, bnds)) == -1) {
1685 __func__, con->se_id, strerror(errno));
1686 evtimer_set(&con->se_inflightevt, relay_connect_retry,
1687 con);
1689 evtimer_add(&con->se_inflightevt, &evtpause);
1693 relay_connect_state(con, &con->se_out, STATE_PENDING);
1696 if (con->se_retry) {
1697 con->se_retry--;
1700 con->se_id, strerror(errno),
1701 con->se_retry ?
1706 __func__, con->se_id, strerror(errno));
1711 relay_connect_state(con, &con->se_out, STATE_CONNECTED);
1717 event_again(&con->se_ev, con->se_out.s, EV_WRITE|EV_TIMEOUT,
1718 relay_connected, &con->se_tv_start, &rlay->rl_conf.timeout,
1719 con);
1721 relay_connected(con->se_out.s, EV_WRITE, con);
1727 relay_close(struct rsession *con, const char *msg, int err)
1730 struct relay *rlay = con->se_relay;
1733 SPLAY_REMOVE(session_tree, &rlay->rl_sessions, con);
1734 relay_session_unpublish(con);
1736 event_del(&con->se_ev);
1742 (void)print_host(&con->se_in.ss, ibuf, sizeof(ibuf));
1743 (void)print_host(&con->se_out.ss, obuf, sizeof(obuf));
1744 if (EVBUFFER_LENGTH(con->se_log) &&
1745 evbuffer_add_printf(con->se_log, "\r\n") != -1) {
1746 ptr = evbuffer_readln(con->se_log, NULL,
1752 "%s%s%s", rlay->rl_conf.name, con->se_id,
1753 relay_sessions, con->se_tag != 0 ?
1754 tag_id2name(con->se_tag) : "0", ibuf, obuf,
1755 ntohs(con->se_out.port), msg, ptr == NULL ?
1760 "%s%s%s", rlay->rl_conf.name, con->se_id,
1761 relay_sessions, con->se_tag != 0 ?
1762 tag_id2name(con->se_tag) : "0", ibuf, obuf,
1763 ntohs(con->se_out.port), msg, ptr == NULL ?
1769 (*proto->close)(con);
1771 free(con->se_priv);
1773 relay_connect_state(con, &con->se_in, STATE_DONE);
1774 if (relay_reset_event(con, &con->se_in)) {
1775 if (con->se_out.s == -1) {
1785 if (con->se_in.output != NULL)
1786 evbuffer_free(con->se_in.output);
1788 relay_connect_state(con, &con->se_out, STATE_DONE);
1789 if (relay_reset_event(con, &con->se_out)) {
1796 if (con->se_out.output != NULL)
1797 evbuffer_free(con->se_out.output);
1799 if (con->se_log != NULL)
1800 evbuffer_free(con->se_log);
1802 if (con->se_cnl != NULL) {
1807 free(con->se_cnl);
1810 free(con);
1815 relay_reset_event(struct rsession *con, struct ctl_relay_event *cre)
1820 relay_connect_state(con, cre, STATE_CLOSED);
1848 struct rsession *con, se;
1929 if ((con = session_find(env, cnl.id)) == NULL ||
1930 con->se_cnl == NULL) {
1935 bcopy(&cnl, con->se_cnl, sizeof(*con->se_cnl));
1936 evtimer_del(&con->se_ev);
1937 evtimer_set(&con->se_ev, relay_natlook, con);
1939 evtimer_add(&con->se_ev, &tv);
1945 SPLAY_FOREACH(con, session_tree,
1947 memcpy(&se, con, sizeof(se));
1982 struct rsession *con;
1989 if ((con = session_find(env, id)) == NULL) {
1996 con->se_bnds = imsg_get_fd(imsg);
1998 evtimer_del(&con->se_ev);
1999 evtimer_set(&con->se_ev, relay_bindany, con);
2001 evtimer_add(&con->se_ev, &tv);
2352 relay_tls_transaction(struct rsession *con, struct ctl_relay_event *cre)
2354 struct relay *rlay = con->se_relay;
2388 log_debug("%s: session %d: scheduling on %s", __func__, con->se_id,
2390 event_again(&con->se_ev, cre->s, EV_TIMEOUT|flag, relay_tls_handshake,
2391 &con->se_tv_start, &rlay->rl_conf.timeout, cre);
2395 relay_close(con, errstr, 1);
2402 struct rsession *con = cre->con;
2403 struct relay *rlay = con->se_relay;
2409 relay_close(con, "TLS handshake timeout", 1);
2421 rlay->rl_conf.name, con->se_id,
2426 relay_session(con);
2434 servercert = tls_peer_cert_chain_pem(con->se_out.tls,
2437 con->se_in.tlscert = ssl_update_certificate(
2441 &con->se_in.tlscert_len);
2443 con->se_in.tlscert = NULL;
2444 if (con->se_in.tlscert == NULL)
2445 relay_close(con,
2448 relay_session(con);
2451 relay_connected(fd, EV_WRITE, con);
2460 relay_close(con, msg, 1);
2463 relay_close(con, "TLS handshake error", 1);
2468 DPRINTF("%s: session %d: scheduling on %s", __func__, con->se_id,
2470 event_again(&con->se_ev, fd, EV_TIMEOUT|retry_flag, relay_tls_handshake,
2471 &con->se_tv_start, &rlay->rl_conf.timeout, cre);
2713 relay_log(struct rsession *con, char *msg)
2715 if (con->se_haslog && con->se_log != NULL) {
2716 evbuffer_add(con->se_log, msg, strlen(msg));