mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-08-06 15:17:01 +02:00
MINOR: peers: Make outgoing connection to SSL/TLS peers work.
This patch adds pointer to a struct server to peer structure which is initialized after having parsed a remote "peer" line. After having parsed all peers section we run ->prepare_srv to initialize all SSL/TLS stuff of remote perr (or server). Remaining thing to do to completely support peer protocol over SSL/TLS: make "bind" keyword be supported in "peers" sections to make SSL/TLS incoming connections to local peers work. May be backported to 1.5 and newer.
This commit is contained in:
parent
c06b5d4f74
commit
1055e687a2
@ -25,9 +25,35 @@
|
|||||||
#include <common/config.h>
|
#include <common/config.h>
|
||||||
#include <common/ticks.h>
|
#include <common/ticks.h>
|
||||||
#include <common/time.h>
|
#include <common/time.h>
|
||||||
|
#include <proto/connection.h>
|
||||||
#include <types/stream.h>
|
#include <types/stream.h>
|
||||||
#include <types/peers.h>
|
#include <types/peers.h>
|
||||||
|
|
||||||
|
#if defined(USE_OPENSSL)
|
||||||
|
static inline enum obj_type *peer_session_target(struct peer *p, struct stream *s)
|
||||||
|
{
|
||||||
|
if (p->srv->use_ssl)
|
||||||
|
return &p->srv->obj_type;
|
||||||
|
else
|
||||||
|
return &s->be->obj_type;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline struct xprt_ops *peer_xprt(struct peer *p)
|
||||||
|
{
|
||||||
|
return p->srv->use_ssl ? xprt_get(XPRT_SSL) : xprt_get(XPRT_RAW);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
static inline enum obj_type *peer_session_target(struct peer *p, struct stream *s)
|
||||||
|
{
|
||||||
|
return &s->be->obj_type;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline struct xprt_ops *peer_xprt(struct peer *p)
|
||||||
|
{
|
||||||
|
return xprt_get(XPRT_RAW);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
int peers_init_sync(struct peers *peers);
|
int peers_init_sync(struct peers *peers);
|
||||||
void peers_register_table(struct peers *, struct stktable *table);
|
void peers_register_table(struct peers *, struct stktable *table);
|
||||||
void peers_setup_frontend(struct proxy *fe);
|
void peers_setup_frontend(struct proxy *fe);
|
||||||
|
@ -67,6 +67,7 @@ struct peer {
|
|||||||
struct shared_table *remote_table;
|
struct shared_table *remote_table;
|
||||||
struct shared_table *last_local_table;
|
struct shared_table *last_local_table;
|
||||||
struct shared_table *tables;
|
struct shared_table *tables;
|
||||||
|
struct server *srv;
|
||||||
__decl_hathreads(HA_SPINLOCK_T lock); /* lock used to handle this peer section */
|
__decl_hathreads(HA_SPINLOCK_T lock); /* lock used to handle this peer section */
|
||||||
struct peer *next; /* next peer in the list */
|
struct peer *next; /* next peer in the list */
|
||||||
};
|
};
|
||||||
|
@ -513,6 +513,7 @@ static int init_peers_frontend(const char *file, int linenum,
|
|||||||
out:
|
out:
|
||||||
if (id && !p->id)
|
if (id && !p->id)
|
||||||
p->id = strdup(id);
|
p->id = strdup(id);
|
||||||
|
free(p->conf.file);
|
||||||
p->conf.args.file = p->conf.file = strdup(file);
|
p->conf.args.file = p->conf.file = strdup(file);
|
||||||
p->conf.args.line = p->conf.line = linenum;
|
p->conf.args.line = p->conf.line = linenum;
|
||||||
|
|
||||||
@ -623,9 +624,10 @@ int cfg_parse_peers(const char *file, int linenum, char **args, int kwm)
|
|||||||
newpeer->sock_init_arg = NULL;
|
newpeer->sock_init_arg = NULL;
|
||||||
HA_SPIN_INIT(&newpeer->lock);
|
HA_SPIN_INIT(&newpeer->lock);
|
||||||
|
|
||||||
if (strcmp(newpeer->id, localpeer) != 0)
|
if (strcmp(newpeer->id, localpeer) != 0) {
|
||||||
/* We are done. */
|
newpeer->srv = curpeers->peers_fe->srv;
|
||||||
goto out;
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
if (cfg_peers->local) {
|
if (cfg_peers->local) {
|
||||||
ha_alert("parsing [%s:%d] : '%s %s' : local peer name already referenced at %s:%d.\n",
|
ha_alert("parsing [%s:%d] : '%s %s' : local peer name already referenced at %s:%d.\n",
|
||||||
@ -3633,6 +3635,13 @@ int check_config_validity()
|
|||||||
curpeers->peers_fe = NULL;
|
curpeers->peers_fe = NULL;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
p = curpeers->remote;
|
||||||
|
while (p) {
|
||||||
|
if (p->srv && p->srv->use_ssl &&
|
||||||
|
xprt_get(XPRT_SSL) && xprt_get(XPRT_SSL)->prepare_srv)
|
||||||
|
cfgerr += xprt_get(XPRT_SSL)->prepare_srv(p->srv);
|
||||||
|
p = p->next;
|
||||||
|
}
|
||||||
if (!peers_init_sync(curpeers)) {
|
if (!peers_init_sync(curpeers)) {
|
||||||
ha_alert("Peers section '%s': out of memory, giving up on peers.\n",
|
ha_alert("Peers section '%s': out of memory, giving up on peers.\n",
|
||||||
curpeers->id);
|
curpeers->id);
|
||||||
|
@ -39,6 +39,7 @@
|
|||||||
#include <proto/log.h>
|
#include <proto/log.h>
|
||||||
#include <proto/hdr_idx.h>
|
#include <proto/hdr_idx.h>
|
||||||
#include <proto/mux_pt.h>
|
#include <proto/mux_pt.h>
|
||||||
|
#include <proto/peers.h>
|
||||||
#include <proto/proxy.h>
|
#include <proto/proxy.h>
|
||||||
#include <proto/session.h>
|
#include <proto/session.h>
|
||||||
#include <proto/stream.h>
|
#include <proto/stream.h>
|
||||||
@ -1996,10 +1997,10 @@ static struct appctx *peer_session_create(struct peers *peers, struct peer *peer
|
|||||||
if (unlikely((cs = cs_new(conn)) == NULL))
|
if (unlikely((cs = cs_new(conn)) == NULL))
|
||||||
goto out_free_conn;
|
goto out_free_conn;
|
||||||
|
|
||||||
conn->target = s->target = &s->be->obj_type;
|
conn->target = s->target = peer_session_target(peer, s);
|
||||||
memcpy(&conn->addr.to, &peer->addr, sizeof(conn->addr.to));
|
memcpy(&conn->addr.to, &peer->addr, sizeof(conn->addr.to));
|
||||||
|
|
||||||
conn_prepare(conn, peer->proto, peer->xprt);
|
conn_prepare(conn, peer->proto, peer_xprt(peer));
|
||||||
conn_install_mux(conn, &mux_pt_ops, cs, s->be, NULL);
|
conn_install_mux(conn, &mux_pt_ops, cs, s->be, NULL);
|
||||||
si_attach_cs(&s->si[1], cs);
|
si_attach_cs(&s->si[1], cs);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user