CONN_HASH_PARAMS_TYPE_SNI = 0x1,
CONN_HASH_PARAMS_TYPE_DST_ADDR = 0x2,
CONN_HASH_PARAMS_TYPE_DST_PORT = 0x4,
+ CONN_HASH_PARAMS_TYPE_SRC_ADDR = 0x8,
+ CONN_HASH_PARAMS_TYPE_SRC_PORT = 0x10,
};
-#define CONN_HASH_PARAMS_TYPE_COUNT 3
+#define CONN_HASH_PARAMS_TYPE_COUNT 5
#define CONN_HASH_PAYLOAD_LEN \
(((sizeof(((struct connection *)0)->hash)) * 8) - CONN_HASH_PARAMS_TYPE_COUNT)
struct conn_hash_params {
struct server *srv;
XXH64_hash_t *sni_prehash;
+ struct sockaddr_storage *src_addr;
struct sockaddr_storage *dst_addr;
};
int init_mux = 0;
int err;
struct sample *sni_smp = NULL;
+ struct sockaddr_storage *bind_addr;
int64_t hash = 0;
struct conn_hash_params hash_params;
XXH64_hash_t sni_hash;
if (srv && (!is_addr(&srv->addr) || srv->flags & SRV_F_MAPPORTS))
hash_params.dst_addr = s->target_addr;
+ /* 3. source address */
+ err = alloc_bind_address(&bind_addr, srv, s);
+ if (err != SRV_STATUS_OK)
+ return SF_ERR_INTERNAL;
+
+ hash_params.src_addr = bind_addr;
+
if (srv)
hash = conn_calculate_hash(&hash_params);
/* here reuse might have been set above, indicating srv_conn finally
* is OK.
*/
- if (reuse) {
- /* Disable connection reuse if a dynamic source is used.
- * As long as we don't share connections between servers,
- * we don't need to disable connection reuse on no-idempotent
- * requests nor when PROXY protocol is used.
- */
- if (srv && srv->conn_src.opts & CO_SRC_BIND) {
- if ((srv->conn_src.opts & CO_SRC_TPROXY_MASK) == CO_SRC_TPROXY_DYN)
- reuse = 0;
- }
- else if (s->be->conn_src.opts & CO_SRC_BIND) {
- if ((s->be->conn_src.opts & CO_SRC_TPROXY_MASK) == CO_SRC_TPROXY_DYN)
- reuse = 0;
- }
- }
if (ha_used_fds > global.tune.pool_high_count && srv && srv->idle_conns_tree) {
struct connection *tokill_conn = NULL;
if (reuse_mode == PR_O_REUSE_NEVR)
conn_set_private(srv_conn);
- err = alloc_bind_address(&srv_conn->src, srv, s);
- if (err != SRV_STATUS_OK)
- return SF_ERR_INTERNAL;
+ srv_conn->src = bind_addr;
if (!sockaddr_alloc(&srv_conn->dst, 0, 0)) {
conn_free(srv_conn);
}
}
else {
+ sockaddr_free(&bind_addr);
return SF_ERR_RESOURCE;
}
}
CONN_HASH_PARAMS_TYPE_DST_PORT);
}
+ if (params->src_addr) {
+ conn_calculate_hash_sockaddr(params->src_addr,
+ buf, &idx, &hash_flags,
+ CONN_HASH_PARAMS_TYPE_SRC_ADDR,
+ CONN_HASH_PARAMS_TYPE_SRC_PORT);
+ }
+
hash = conn_hash_digest(buf, idx, hash_flags);
return hash;