switch (s->be->lbprm.algo & BE_LB_PARM) {
case BE_LB_HASH_SRC:
- conn = objt_conn(s->si[0].end);
+ conn = objt_conn(strm_sess(s)->origin);
if (conn && conn->addr.from.ss_family == AF_INET) {
srv = get_server_sh(s->be,
(void *)&((struct sockaddr_in *)&conn->addr.from)->sin_addr,
*/
int assign_server_address(struct stream *s)
{
- struct connection *cli_conn = objt_conn(s->si[0].end);
+ struct connection *cli_conn = objt_conn(strm_sess(s)->origin);
struct connection *srv_conn = objt_conn(s->si[1].end);
#ifdef DEBUG_FULL
case CO_SRC_TPROXY_CLI:
case CO_SRC_TPROXY_CIP:
/* FIXME: what can we do if the client connects in IPv6 or unix socket ? */
- cli_conn = objt_conn(s->si[0].end);
+ cli_conn = objt_conn(strm_sess(s)->origin);
if (cli_conn)
srv_conn->addr.from = cli_conn->addr.from;
else
srv_conn->send_proxy_ofs = 0;
if (objt_server(s->target) && objt_server(s->target)->pp_opts) {
srv_conn->send_proxy_ofs = 1; /* must compute size */
- cli_conn = objt_conn(s->si[0].end);
+ cli_conn = objt_conn(strm_sess(s)->origin);
if (cli_conn)
conn_get_to_addr(cli_conn);
}
sess->uniq_id,
strm_sess(sess)->listener && strm_sess(sess)->listener->proto->name ? strm_sess(sess)->listener->proto->name : "?");
- conn = objt_conn(sess->si[0].end);
+ conn = objt_conn(strm_sess(sess)->origin);
switch (conn ? addr_to_str(&conn->addr.from, pn, sizeof(pn)) : AF_UNSPEC) {
case AF_INET:
case AF_INET6:
strm_sess(curr_sess)->listener->proto->name);
- conn = objt_conn(curr_sess->si[0].end);
+ conn = objt_conn(strm_sess(curr_sess)->origin);
switch (conn ? addr_to_str(&conn->addr.from, pn, sizeof(pn)) : AF_UNSPEC) {
case AF_INET:
case AF_INET6:
int frontend_accept(struct stream *s)
{
struct session *sess = s->sess;
- struct connection *conn = __objt_conn(s->si[0].end);
+ struct connection *conn = __objt_conn(sess->origin);
struct listener *l = sess->listener;
struct proxy *fe = sess->fe;
htxn = MAY_LJMP(hlua_checktxn(L, 1));
tos = MAY_LJMP(luaL_checkinteger(L, 2));
- if ((cli_conn = objt_conn(htxn->s->si[0].end)) && conn_ctrl_ready(cli_conn))
+ if ((cli_conn = objt_conn(htxn->s->sess->origin)) && conn_ctrl_ready(cli_conn))
inet_set_tos(cli_conn->t.sock.fd, cli_conn->addr.from, tos);
return 0;
htxn = MAY_LJMP(hlua_checktxn(L, 1));
mark = MAY_LJMP(luaL_checkinteger(L, 2));
- if ((cli_conn = objt_conn(htxn->s->si[0].end)) && conn_ctrl_ready(cli_conn))
+ if ((cli_conn = objt_conn(htxn->s->sess->origin)) && conn_ctrl_ready(cli_conn))
setsockopt(cli_conn->t.sock.fd, SOL_SOCKET, SO_MARK, &mark, sizeof(mark));
#endif
return 0;
break;
case LOG_FMT_CLIENTIP: // %ci
- conn = objt_conn(s->si[0].end);
+ conn = objt_conn(sess->origin);
if (conn)
ret = lf_ip(tmplog, (struct sockaddr *)&conn->addr.from, dst + maxsize - tmplog, tmp);
else
break;
case LOG_FMT_CLIENTPORT: // %cp
- conn = objt_conn(s->si[0].end);
+ conn = objt_conn(sess->origin);
if (conn) {
if (conn->addr.from.ss_family == AF_UNIX) {
ret = ltoa_o(sess->listener->luid, tmplog, dst + maxsize - tmplog);
break;
case LOG_FMT_FRONTENDIP: // %fi
- conn = objt_conn(s->si[0].end);
+ conn = objt_conn(sess->origin);
if (conn) {
conn_get_to_addr(conn);
ret = lf_ip(tmplog, (struct sockaddr *)&conn->addr.to, dst + maxsize - tmplog, tmp);
break;
case LOG_FMT_FRONTENDPORT: // %fp
- conn = objt_conn(s->si[0].end);
+ conn = objt_conn(sess->origin);
if (conn) {
conn_get_to_addr(conn);
if (conn->addr.to.ss_family == AF_UNIX)
#ifdef USE_OPENSSL
case LOG_FMT_SSL_CIPHER: // %sslc
src = NULL;
- conn = objt_conn(s->si[0].end);
+ conn = objt_conn(sess->origin);
if (conn) {
if (sess->listener->xprt == &ssl_sock)
src = ssl_sock_get_cipher_name(conn);
case LOG_FMT_SSL_VERSION: // %sslv
src = NULL;
- conn = objt_conn(s->si[0].end);
+ conn = objt_conn(sess->origin);
if (conn) {
if (sess->listener->xprt == &ssl_sock)
src = ssl_sock_get_proto_version(conn);
req->flags |= CF_READ_DONTWAIT; /* try to get back here ASAP */
s->res.flags &= ~CF_EXPECT_MORE; /* speed up sending a previous response */
#ifdef TCP_QUICKACK
- if (sess->listener->options & LI_O_NOQUICKACK && req->buf->i && objt_conn(s->si[0].end) && conn_ctrl_ready(__objt_conn(s->si[0].end))) {
+ if (sess->listener->options & LI_O_NOQUICKACK && req->buf->i &&
+ objt_conn(sess->origin) && conn_ctrl_ready(__objt_conn(sess->origin))) {
/* We need more data, we have to re-enable quick-ack in case we
* previously disabled it, otherwise we might cause the client
* to delay next data.
*/
- setsockopt(__objt_conn(s->si[0].end)->t.sock.fd, IPPROTO_TCP, TCP_QUICKACK, &one, sizeof(one));
+ setsockopt(__objt_conn(sess->origin)->t.sock.fd, IPPROTO_TCP, TCP_QUICKACK, &one, sizeof(one));
}
#endif
enum rule_result
http_req_get_intercept_rule(struct proxy *px, struct list *rules, struct stream *s, struct http_txn *txn)
{
+ struct session *sess = strm_sess(s);
struct connection *cli_conn;
struct http_req_rule *rule;
struct hdr_ctx ctx;
break;
case HTTP_REQ_ACT_SET_TOS:
- if ((cli_conn = objt_conn(s->si[0].end)) && conn_ctrl_ready(cli_conn))
+ if ((cli_conn = objt_conn(sess->origin)) && conn_ctrl_ready(cli_conn))
inet_set_tos(cli_conn->t.sock.fd, cli_conn->addr.from, rule->arg.tos);
break;
case HTTP_REQ_ACT_SET_MARK:
#ifdef SO_MARK
- if ((cli_conn = objt_conn(s->si[0].end)) && conn_ctrl_ready(cli_conn))
+ if ((cli_conn = objt_conn(sess->origin)) && conn_ctrl_ready(cli_conn))
setsockopt(cli_conn->t.sock.fd, SOL_SOCKET, SO_MARK, &rule->arg.mark, sizeof(rule->arg.mark));
#endif
break;
t->data_arg[STKTABLE_DT_HTTP_REQ_RATE].u, 1);
stkctr_set_flags(&s->stkctr[http_req_trk_idx(rule->action)], STKCTR_TRACK_CONTENT);
- if (strm_sess(s)->fe != s->be)
+ if (sess->fe != s->be)
stkctr_set_flags(&s->stkctr[http_req_trk_idx(rule->action)], STKCTR_TRACK_BACKEND);
}
}
static enum rule_result
http_res_get_intercept_rule(struct proxy *px, struct list *rules, struct stream *s, struct http_txn *txn)
{
+ struct session *sess = strm_sess(s);
struct connection *cli_conn;
struct http_res_rule *rule;
struct hdr_ctx ctx;
break;
case HTTP_RES_ACT_SET_TOS:
- if ((cli_conn = objt_conn(s->si[0].end)) && conn_ctrl_ready(cli_conn))
+ if ((cli_conn = objt_conn(sess->origin)) && conn_ctrl_ready(cli_conn))
inet_set_tos(cli_conn->t.sock.fd, cli_conn->addr.from, rule->arg.tos);
break;
case HTTP_RES_ACT_SET_MARK:
#ifdef SO_MARK
- if ((cli_conn = objt_conn(s->si[0].end)) && conn_ctrl_ready(cli_conn))
+ if ((cli_conn = objt_conn(sess->origin)) && conn_ctrl_ready(cli_conn))
setsockopt(cli_conn->t.sock.fd, SOL_SOCKET, SO_MARK, &rule->arg.mark, sizeof(rule->arg.mark));
#endif
break;
struct http_msg *msg,
enum ht_state state, struct proxy *other_end)
{
+ struct session *sess = strm_sess(s);
struct channel *chn = msg->chn;
int len1, len2;
es->sid = s->uniq_id;
es->srv = objt_server(s->target);
es->oe = other_end;
- if (objt_conn(s->si[0].end))
- es->src = __objt_conn(s->si[0].end)->addr.from;
+ if (objt_conn(sess->origin))
+ es->src = __objt_conn(sess->origin)->addr.from;
else
memset(&es->src, 0, sizeof(es->src));
*/
void debug_hdr(const char *dir, struct stream *s, const char *start, const char *end)
{
+ struct session *sess = strm_sess(s);
int max;
+
chunk_printf(&trash, "%08x:%s.%s[%04x:%04x]: ", s->uniq_id, s->be->id,
dir,
- objt_conn(s->si[0].end) ? (unsigned short)objt_conn(s->si[0].end)->t.sock.fd : -1,
+ objt_conn(sess->origin) ? (unsigned short)objt_conn(sess->origin)->t.sock.fd : -1,
objt_conn(s->si[1].end) ? (unsigned short)objt_conn(s->si[1].end)->t.sock.fd : -1);
for (max = 0; start + max < end; max++)
const struct arg *args, struct sample *smp, const char *kw, void *private)
{
struct chunk *temp;
- struct connection *cli_conn = objt_conn(l4->si[0].end);
+ struct session *sess = strm_sess(l4);
+ struct connection *cli_conn = objt_conn(sess->origin);
if (!cli_conn)
return 0;
const struct arg *args, struct sample *smp, const char *kw, void *private)
{
struct chunk *temp;
- struct connection *cli_conn = objt_conn(l4->si[0].end);
+ struct session *sess = strm_sess(l4);
+ struct connection *cli_conn = objt_conn(sess->origin);
if (!smp_fetch_url32(px, l4, l7, opt, args, smp, kw, private))
return 0;
struct tcp_rule *rule;
struct stksess *ts;
struct stktable *t = NULL;
- struct connection *conn = objt_conn(s->si[0].end);
+ struct connection *conn = objt_conn(sess->origin);
int result = 1;
enum acl_test_res ret;
smp_fetch_src(struct proxy *px, struct stream *l4, void *l7, unsigned int opt,
const struct arg *args, struct sample *smp, const char *kw, void *private)
{
- struct connection *cli_conn = objt_conn(l4->si[0].end);
+ struct session *sess = strm_sess(l4);
+ struct connection *cli_conn = objt_conn(sess->origin);
if (!cli_conn)
return 0;
smp_fetch_sport(struct proxy *px, struct stream *l4, void *l7, unsigned int opt,
const struct arg *args, struct sample *smp, const char *k, void *private)
{
- struct connection *cli_conn = objt_conn(l4->si[0].end);
+ struct session *sess = strm_sess(l4);
+ struct connection *cli_conn = objt_conn(sess->origin);
if (!cli_conn)
return 0;
smp_fetch_dst(struct proxy *px, struct stream *l4, void *l7, unsigned int opt,
const struct arg *args, struct sample *smp, const char *kw, void *private)
{
- struct connection *cli_conn = objt_conn(l4->si[0].end);
+ struct session *sess = strm_sess(l4);
+ struct connection *cli_conn = objt_conn(sess->origin);
if (!cli_conn)
return 0;
smp_fetch_dport(struct proxy *px, struct stream *l4, void *l7, unsigned int opt,
const struct arg *args, struct sample *smp, const char *kw, void *private)
{
- struct connection *cli_conn = objt_conn(l4->si[0].end);
+ struct session *sess = strm_sess(l4);
+ struct connection *cli_conn = objt_conn(sess->origin);
if (!cli_conn)
return 0;
#include <proto/proxy.h>
#include <proto/shctx.h>
#include <proto/ssl_sock.h>
+#include <proto/stream.h>
#include <proto/task.h>
/* Warning, these are bits, not integers! */
const struct arg *args, struct sample *smp, const char *kw, void *private)
{
struct connection *conn;
+ struct session *sess = l4->sess;
if (!l4)
return 0;
- conn = objt_conn(l4->si[0].end);
+ conn = objt_conn(sess->origin);
if (!conn || conn->xprt != &ssl_sock)
return 0;
X509 *crt = NULL;
int ret = 0;
struct chunk *smp_trash;
+ struct session *sess = strm_sess(l4);
struct connection *conn;
if (!l4)
return 0;
- conn = objt_conn(l4->si[0].end);
+ conn = objt_conn(sess->origin);
if (!conn || conn->xprt != &ssl_sock)
return 0;
X509 *crt = NULL;
int ret = 0;
struct chunk *smp_trash;
+ struct session *sess = strm_sess(l4);
struct connection *conn;
if (!l4)
return 0;
- conn = objt_conn(l4->si[0].end);
+ conn = objt_conn(sess->origin);
if (!conn || conn->xprt != &ssl_sock)
return 0;
const EVP_MD *digest;
int ret = 0;
struct chunk *smp_trash;
+ struct session *sess = strm_sess(l4);
struct connection *conn;
if (!l4)
return 0;
- conn = objt_conn(l4->si[0].end);
+ conn = objt_conn(sess->origin);
if (!conn || conn->xprt != &ssl_sock)
return 0;
X509 *crt = NULL;
int ret = 0;
struct chunk *smp_trash;
+ struct session *sess = strm_sess(l4);
struct connection *conn;
if (!l4)
return 0;
- conn = objt_conn(l4->si[0].end);
+ conn = objt_conn(sess->origin);
if (!conn || conn->xprt != &ssl_sock)
return 0;
X509_NAME *name;
int ret = 0;
struct chunk *smp_trash;
+ struct session *sess = strm_sess(l4);
struct connection *conn;
if (!l4)
return 0;
- conn = objt_conn(l4->si[0].end);
+ conn = objt_conn(sess->origin);
if (!conn || conn->xprt != &ssl_sock)
return 0;
X509 *crt = NULL;
int ret = 0;
struct chunk *smp_trash;
+ struct session *sess = strm_sess(l4);
struct connection *conn;
if (!l4)
return 0;
- conn = objt_conn(l4->si[0].end);
+ conn = objt_conn(sess->origin);
if (!conn || conn->xprt != &ssl_sock)
return 0;
X509_NAME *name;
int ret = 0;
struct chunk *smp_trash;
+ struct session *sess = strm_sess(l4);
struct connection *conn;
if (!l4)
return 0;
- conn = objt_conn(l4->si[0].end);
+ conn = objt_conn(sess->origin);
if (!conn || conn->xprt != &ssl_sock)
return 0;
const struct arg *args, struct sample *smp, const char *kw, void *private)
{
X509 *crt;
+ struct session *sess = strm_sess(l4);
struct connection *conn;
if (!l4)
return 0;
- conn = objt_conn(l4->si[0].end);
+ conn = objt_conn(sess->origin);
if (!conn || conn->xprt != &ssl_sock)
return 0;
{
int cert_peer = (kw[4] == 'c') ? 1 : 0;
X509 *crt;
+ struct session *sess = strm_sess(l4);
struct connection *conn;
if (!l4)
return 0;
- conn = objt_conn(l4->si[0].end);
+ conn = objt_conn(sess->origin);
if (!conn || conn->xprt != &ssl_sock)
return 0;
int cert_peer = (kw[4] == 'c') ? 1 : 0;
X509 *crt;
int nid;
+ struct session *sess = strm_sess(l4);
struct connection *conn;
if (!l4)
return 0;
- conn = objt_conn(l4->si[0].end);
+ conn = objt_conn(sess->origin);
if (!conn || conn->xprt != &ssl_sock)
return 0;
int cert_peer = (kw[4] == 'c') ? 1 : 0;
X509 *crt;
int nid;
+ struct session *sess = strm_sess(l4);
struct connection *conn;
if (!l4)
return 0;
- conn = objt_conn(l4->si[0].end);
+ conn = objt_conn(sess->origin);
if (!conn || conn->xprt != &ssl_sock)
return 0;
const struct arg *args, struct sample *smp, const char *kw, void *private)
{
#ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME
- struct connection *conn = objt_conn(l4->si[0].end);
+ struct session *sess = strm_sess(l4);
+ struct connection *conn = objt_conn(sess->origin);
smp->type = SMP_T_BOOL;
smp->data.uint = (conn && conn->xprt == &ssl_sock) &&
const struct arg *args, struct sample *smp, const char *kw, void *private)
{
struct connection *conn;
+ struct session *sess = strm_sess(l4);
smp->flags = SMP_F_CONST;
smp->type = SMP_T_STR;
if (!l4)
return 0;
- conn = objt_conn(l4->si[0].end);
+ conn = objt_conn(sess->origin);
if (!conn || !conn->xprt_ctx || conn->xprt != &ssl_sock)
return 0;
const struct arg *args, struct sample *smp, const char *kw, void *private)
{
struct connection *conn;
+ struct session *sess = strm_sess(l4);
smp->flags = SMP_F_CONST;
smp->type = SMP_T_STR;
if (!l4)
return 0;
- conn = objt_conn(l4->si[0].end);
+ conn = objt_conn(sess->origin);
if (!conn || !conn->xprt_ctx || conn->xprt != &ssl_sock)
return 0;
{
#ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME
struct connection *conn;
+ struct session *sess = strm_sess(l4);
smp->flags = SMP_F_CONST;
smp->type = SMP_T_STR;
if (!l4)
return 0;
- conn = objt_conn(l4->si[0].end);
+ conn = objt_conn(sess->origin);
if (!conn || !conn->xprt_ctx || conn->xprt != &ssl_sock)
return 0;
smp_fetch_ssl_c_ca_err(struct proxy *px, struct stream *l4, void *l7, unsigned int opt,
const struct arg *args, struct sample *smp, const char *kw, void *private)
{
+ struct session *sess = strm_sess(l4);
struct connection *conn;
if (!l4)
return 0;
- conn = objt_conn(l4->si[0].end);
+ conn = objt_conn(sess->origin);
if (!conn || conn->xprt != &ssl_sock)
return 0;
smp_fetch_ssl_c_ca_err_depth(struct proxy *px, struct stream *l4, void *l7, unsigned int opt,
const struct arg *args, struct sample *smp, const char *kw, void *private)
{
+ struct session *sess = strm_sess(l4);
struct connection *conn;
if (!l4)
return 0;
- conn = objt_conn(l4->si[0].end);
+ conn = objt_conn(sess->origin);
if (!conn || conn->xprt != &ssl_sock)
return 0;
smp_fetch_ssl_c_err(struct proxy *px, struct stream *l4, void *l7, unsigned int opt,
const struct arg *args, struct sample *smp, const char *kw, void *private)
{
+ struct session *sess = strm_sess(l4);
struct connection *conn;
if (!l4)
return 0;
- conn = objt_conn(l4->si[0].end);
+ conn = objt_conn(sess->origin);
if (!conn || conn->xprt != &ssl_sock)
return 0;
smp_fetch_ssl_c_verify(struct proxy *px, struct stream *l4, void *l7, unsigned int opt,
const struct arg *args, struct sample *smp, const char *kw, void *private)
{
+ struct session *sess = strm_sess(l4);
struct connection *conn;
if (!l4)
return 0;
- conn = objt_conn(l4->si[0].end);
+ conn = objt_conn(sess->origin);
if (!conn || conn->xprt != &ssl_sock)
return 0;
static void stream_free(struct stream *s)
{
struct http_txn *txn = &s->txn;
- struct proxy *fe = strm_sess(s)->fe;
+ struct session *sess = strm_sess(s);
+ struct proxy *fe = sess->fe;
struct bref *bref, *back;
- struct connection *cli_conn = objt_conn(s->si[0].end);
+ struct connection *cli_conn = objt_conn(sess->origin);
int i;
if (s->pend_pos)
struct stkctr *
smp_fetch_sc_stkctr(struct stream *l4, const struct arg *args, const char *kw)
{
+ struct session *sess = strm_sess(l4);
static struct stkctr stkctr;
struct stksess *stksess;
unsigned int num = kw[2] - '0';
}
else if (num > 9) { /* src_* variant, args[0] = table */
struct stktable_key *key;
- struct connection *conn = objt_conn(l4->si[0].end);
+ struct connection *conn = objt_conn(sess->origin);
if (!conn)
return NULL;
smp_fetch_src_updt_conn_cnt(struct proxy *px, struct stream *l4, void *l7, unsigned int opt,
const struct arg *args, struct sample *smp, const char *kw, void *private)
{
- struct connection *conn = objt_conn(l4->si[0].end);
+ struct session *sess = strm_sess(l4);
+ struct connection *conn = objt_conn(sess->origin);
struct stksess *ts;
struct stktable_key *key;
void *ptr;