[REORG] session: move client and server address to the stream interface
This will be needed very soon for the keep-alive.
diff --git a/src/backend.c b/src/backend.c
index f3d9f09..870947a 100644
--- a/src/backend.c
+++ b/src/backend.c
@@ -530,9 +530,9 @@
switch (s->be->lbprm.algo & BE_LB_PARM) {
case BE_LB_HASH_SRC:
- if (s->cli_addr.ss_family == AF_INET)
+ if (s->req->prod->addr.c.from.ss_family == AF_INET)
len = 4;
- else if (s->cli_addr.ss_family == AF_INET6)
+ else if (s->req->prod->addr.c.from.ss_family == AF_INET6)
len = 16;
else {
/* unknown IP family */
@@ -541,7 +541,7 @@
}
s->srv = get_server_sh(s->be,
- (void *)&((struct sockaddr_in *)&s->cli_addr)->sin_addr,
+ (void *)&((struct sockaddr_in *)&s->req->prod->addr.c.from)->sin_addr,
len);
break;
@@ -614,7 +614,7 @@
}
}
else if (s->be->options & PR_O_HTTP_PROXY) {
- if (!s->srv_addr.sin_addr.s_addr) {
+ if (!s->req->cons->addr.s.to.sin_addr.s_addr) {
err = SRV_STATUS_NOSRV;
goto out;
}
@@ -670,9 +670,9 @@
if (!(s->flags & SN_ASSIGNED))
return SRV_STATUS_INTERNAL;
- s->srv_addr = s->srv->addr;
+ s->req->cons->addr.s.to = s->srv->addr;
- if (!s->srv_addr.sin_addr.s_addr) {
+ if (!s->req->cons->addr.s.to.sin_addr.s_addr) {
/* if the server has no address, we use the same address
* the client asked, which is handy for remapping ports
* locally on multiple addresses at once.
@@ -680,8 +680,8 @@
if (!(s->be->options & PR_O_TRANSP) && !(s->flags & SN_FRT_ADDR_SET))
get_frt_addr(s);
- if (s->frt_addr.ss_family == AF_INET) {
- s->srv_addr.sin_addr = ((struct sockaddr_in *)&s->frt_addr)->sin_addr;
+ if (s->req->prod->addr.c.to.ss_family == AF_INET) {
+ s->req->cons->addr.s.to.sin_addr = ((struct sockaddr_in *)&s->req->prod->addr.c.to)->sin_addr;
}
}
@@ -690,27 +690,27 @@
if (s->srv->state & SRV_MAPPORTS) {
if (!(s->be->options & PR_O_TRANSP) && !(s->flags & SN_FRT_ADDR_SET))
get_frt_addr(s);
- if (s->frt_addr.ss_family == AF_INET) {
- s->srv_addr.sin_port = htons(ntohs(s->srv_addr.sin_port) +
- ntohs(((struct sockaddr_in *)&s->frt_addr)->sin_port));
+ if (s->req->prod->addr.c.to.ss_family == AF_INET) {
+ s->req->cons->addr.s.to.sin_port = htons(ntohs(s->req->cons->addr.s.to.sin_port) +
+ ntohs(((struct sockaddr_in *)&s->req->prod->addr.c.to)->sin_port));
}
- else if (s->frt_addr.ss_family == AF_INET6) {
- s->srv_addr.sin_port = htons(ntohs(s->srv_addr.sin_port) +
- ntohs(((struct sockaddr_in6 *)&s->frt_addr)->sin6_port));
+ else if (s->req->prod->addr.c.to.ss_family == AF_INET6) {
+ s->req->cons->addr.s.to.sin_port = htons(ntohs(s->req->cons->addr.s.to.sin_port) +
+ ntohs(((struct sockaddr_in6 *)&s->req->prod->addr.c.to)->sin6_port));
}
}
}
else if (*(int *)&s->be->dispatch_addr.sin_addr) {
/* connect to the defined dispatch addr */
- s->srv_addr = s->be->dispatch_addr;
+ s->req->cons->addr.s.to = s->be->dispatch_addr;
}
else if (s->be->options & PR_O_TRANSP) {
/* in transparent mode, use the original dest addr if no dispatch specified */
if (!(s->flags & SN_FRT_ADDR_SET))
get_frt_addr(s);
- if (s->frt_addr.ss_family == AF_INET) {
- memcpy(&s->srv_addr, &s->frt_addr, MIN(sizeof(s->srv_addr), sizeof(s->frt_addr)));
+ if (s->req->prod->addr.c.to.ss_family == AF_INET) {
+ memcpy(&s->req->cons->addr.s.to, &s->req->prod->addr.c.to, MIN(sizeof(s->req->cons->addr.s.to), sizeof(s->req->prod->addr.c.to)));
}
/* when we support IPv6 on the backend, we may add other tests */
//qfprintf(stderr, "Cannot get original server address.\n");
@@ -850,7 +850,7 @@
/* If an explicit source binding is specified on the server and/or backend, and
* this source makes use of the transparent proxy, then it is extracted now and
- * assigned to the session's from_addr entry.
+ * assigned to the session's req->cons->addr.s.from entry.
*/
static void assign_tproxy_address(struct session *s)
{
@@ -858,18 +858,18 @@
if (s->srv != NULL && s->srv->state & SRV_BIND_SRC) {
switch (s->srv->state & SRV_TPROXY_MASK) {
case SRV_TPROXY_ADDR:
- s->from_addr = *(struct sockaddr_in *)&s->srv->tproxy_addr;
+ s->req->cons->addr.s.from = *(struct sockaddr_in *)&s->srv->tproxy_addr;
break;
case SRV_TPROXY_CLI:
case SRV_TPROXY_CIP:
/* FIXME: what can we do if the client connects in IPv6 or unix socket ? */
- s->from_addr = *(struct sockaddr_in *)&s->cli_addr;
+ s->req->cons->addr.s.from = *(struct sockaddr_in *)&s->req->prod->addr.c.from;
break;
case SRV_TPROXY_DYN:
if (s->srv->bind_hdr_occ) {
/* bind to the IP in a header */
- s->from_addr.sin_port = 0;
- s->from_addr.sin_addr.s_addr = htonl(get_ip_from_hdr2(&s->txn.req,
+ s->req->cons->addr.s.from.sin_port = 0;
+ s->req->cons->addr.s.from.sin_addr.s_addr = htonl(get_ip_from_hdr2(&s->txn.req,
s->srv->bind_hdr_name,
s->srv->bind_hdr_len,
&s->txn.hdr_idx,
@@ -877,24 +877,24 @@
}
break;
default:
- memset(&s->from_addr, 0, sizeof(s->from_addr));
+ memset(&s->req->cons->addr.s.from, 0, sizeof(s->req->cons->addr.s.from));
}
}
else if (s->be->options & PR_O_BIND_SRC) {
switch (s->be->options & PR_O_TPXY_MASK) {
case PR_O_TPXY_ADDR:
- s->from_addr = *(struct sockaddr_in *)&s->be->tproxy_addr;
+ s->req->cons->addr.s.from = *(struct sockaddr_in *)&s->be->tproxy_addr;
break;
case PR_O_TPXY_CLI:
case PR_O_TPXY_CIP:
/* FIXME: what can we do if the client connects in IPv6 or socket unix? */
- s->from_addr = *(struct sockaddr_in *)&s->cli_addr;
+ s->req->cons->addr.s.from = *(struct sockaddr_in *)&s->req->prod->addr.c.from;
break;
case PR_O_TPXY_DYN:
if (s->be->bind_hdr_occ) {
/* bind to the IP in a header */
- s->from_addr.sin_port = 0;
- s->from_addr.sin_addr.s_addr = htonl(get_ip_from_hdr2(&s->txn.req,
+ s->req->cons->addr.s.from.sin_port = 0;
+ s->req->cons->addr.s.from.sin_addr.s_addr = htonl(get_ip_from_hdr2(&s->txn.req,
s->be->bind_hdr_name,
s->be->bind_hdr_len,
&s->txn.hdr_idx,
@@ -902,7 +902,7 @@
}
break;
default:
- memset(&s->from_addr, 0, sizeof(s->from_addr));
+ memset(&s->req->cons->addr.s.from, 0, sizeof(s->req->cons->addr.s.from));
}
}
#endif
@@ -911,7 +911,7 @@
/*
* This function initiates a connection to the server assigned to this session
- * (s->srv, s->srv_addr). It will assign a server if none is assigned yet.
+ * (s->srv, s->req->cons->addr.s.to). It will assign a server if none is assigned yet.
* It can return one of :
* - SN_ERR_NONE if everything's OK
* - SN_ERR_SRVTO if there are no more servers
@@ -940,8 +940,8 @@
assign_tproxy_address(s);
err = s->req->cons->connect(s->req->cons, s->be, s->srv,
- (struct sockaddr *)&s->srv_addr,
- (struct sockaddr *)&s->from_addr);
+ (struct sockaddr *)&s->req->cons->addr.s.to,
+ (struct sockaddr *)&s->req->cons->addr.s.from);
if (err != SN_ERR_NONE)
return err;