Commit 3ba46b25 authored by Poul-Henning Kamp's avatar Poul-Henning Kamp

Encapsulat the backend connection endpoint data in a separate structure.

parent 54419f89
......@@ -560,21 +560,22 @@ VRT_backend_vsm_need(VRT_CTX)
}
static uint64_t
vrt_hash_be(const struct vrt_backend *vrt)
vrt_hash_be(const struct vrt_endpoint *vep)
{
struct VSHA256Context cx[1];
unsigned char ident[VSHA256_DIGEST_LENGTH];
CHECK_OBJ_NOTNULL(vep, VRT_ENDPOINT_MAGIC);
VSHA256_Init(cx);
VSHA256_Update(cx, vbe_proto_ident, strlen(vbe_proto_ident));
if (vrt->ipv4_suckaddr != NULL)
VSHA256_Update(cx, vrt->ipv4_suckaddr, vsa_suckaddr_len);
if (vrt->ipv6_suckaddr != NULL)
VSHA256_Update(cx, vrt->ipv6_suckaddr, vsa_suckaddr_len);
if (vrt->path != NULL)
VSHA256_Update(cx, vrt->path, strlen(vrt->path));
if (vrt->prefix_ptr != NULL)
VSHA256_Update(cx, vrt->prefix_ptr, vrt->prefix_len);
if (vep->ipv4 != NULL)
VSHA256_Update(cx, vep->ipv4, vsa_suckaddr_len);
if (vep->ipv6 != NULL)
VSHA256_Update(cx, vep->ipv6, vsa_suckaddr_len);
if (vep->uds_path != NULL)
VSHA256_Update(cx, vep->uds_path, strlen(vep->uds_path));
if (vep->ident != NULL)
VSHA256_Update(cx, vep->ident, vep->ident_len);
VSHA256_Final(ident, cx);
return (vbe64dec(ident));
}
......@@ -586,20 +587,22 @@ VRT_new_backend_clustered(VRT_CTX, struct vsmw_cluster *vc,
struct backend *be;
struct vcl *vcl;
const struct vrt_backend_probe *vbp;
const struct vrt_endpoint *vep;
const struct vdi_methods *m;
const struct suckaddr *sa;
char abuf[VTCP_ADDRBUFSIZE];
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
CHECK_OBJ_NOTNULL(vrt, VRT_BACKEND_MAGIC);
if (vrt->path == NULL) {
if (vrt->ipv4_suckaddr == NULL && vrt->ipv6_suckaddr == NULL) {
vep = vrt->endpoint;
CHECK_OBJ_NOTNULL(vep, VRT_ENDPOINT_MAGIC);
if (vep->uds_path == NULL) {
if (vep->ipv4 == NULL && vep->ipv6 == NULL) {
VRT_fail(ctx, "%s: Illegal IP", __func__);
return (NULL);
}
} else
assert(vrt->ipv4_suckaddr == NULL &&
vrt->ipv6_suckaddr == NULL);
assert(vep->ipv4== NULL && vep->ipv6== NULL);
vcl = ctx->vcl;
AN(vcl);
......@@ -617,14 +620,14 @@ VRT_new_backend_clustered(VRT_CTX, struct vsmw_cluster *vc,
#undef DN
if (be->hosthdr == NULL) {
if (vrt->path != NULL)
if (vrt->endpoint->uds_path != NULL)
sa = bogo_ip;
else if (cache_param->prefer_ipv6 && vrt->ipv6_suckaddr != NULL)
sa = vrt->ipv6_suckaddr;
else if (vrt->ipv4_suckaddr != NULL)
sa = vrt->ipv4_suckaddr;
else if (cache_param->prefer_ipv6 && vep->ipv6 != NULL)
sa = vep->ipv6;
else if (vep->ipv4!= NULL)
sa = vep->ipv4;
else
sa = vrt->ipv6_suckaddr;
sa = vep->ipv6;
VTCP_name(sa, abuf, sizeof abuf, NULL, 0);
REPLACE(be->hosthdr, abuf);
}
......@@ -633,8 +636,8 @@ VRT_new_backend_clustered(VRT_CTX, struct vsmw_cluster *vc,
"%s.%s", VCL_Name(ctx->vcl), vrt->vcl_name);
AN(be->vsc);
be->tcp_pool = VTP_Ref(vrt->ipv4_suckaddr, vrt->ipv6_suckaddr,
vrt->path, vrt_hash_be(vrt));
be->tcp_pool = VTP_Ref(vep->ipv4, vep->ipv6,
vep->uds_path, vrt_hash_be(vrt->endpoint));
AN(be->tcp_pool);
vbp = vrt->probe;
......@@ -670,6 +673,7 @@ VRT_new_backend_clustered(VRT_CTX, struct vsmw_cluster *vc,
VCL_BACKEND
VRT_new_backend(VRT_CTX, const struct vrt_backend *vrt)
{
CHECK_OBJ_NOTNULL(vrt->endpoint, VRT_ENDPOINT_MAGIC);
return (VRT_new_backend_clustered(ctx, NULL, vrt));
}
......
......@@ -380,20 +380,27 @@ extern const void * const vrt_magic_string_unset;
* One of those things...
*/
struct vrt_endpoint {
unsigned magic;
#define VRT_ENDPOINT_MAGIC 0xcc419347
VCL_IP ipv4;
VCL_IP ipv6;
const char *uds_path;
const void *ident;
int ident_len;
};
#define VRT_BACKEND_FIELDS(rigid) \
rigid char *vcl_name; \
rigid char *ipv4_addr; \
rigid char *ipv6_addr; \
rigid char *port; \
rigid char *path; \
rigid char *hosthdr; \
vtim_dur connect_timeout; \
vtim_dur first_byte_timeout; \
vtim_dur between_bytes_timeout; \
unsigned max_connections; \
unsigned proxy_header; \
void *prefix_ptr; \
unsigned prefix_len;
unsigned proxy_header;
#define VRT_BACKEND_HANDLE() \
do { \
......@@ -401,7 +408,6 @@ extern const void * const vrt_magic_string_unset;
DA(ipv4_addr); \
DA(ipv6_addr); \
DA(port); \
DA(path); \
DA(hosthdr); \
DN(connect_timeout); \
DN(first_byte_timeout); \
......@@ -413,9 +419,8 @@ extern const void * const vrt_magic_string_unset;
struct vrt_backend {
unsigned magic;
#define VRT_BACKEND_MAGIC 0x4799ce6c
const struct vrt_endpoint *endpoint;
VRT_BACKEND_FIELDS(const)
VCL_IP ipv4_suckaddr;
VCL_IP ipv6_suckaddr;
VCL_PROBE probe;
};
......
......@@ -58,11 +58,11 @@ vcc_default_probe(struct vcc *tl)
*/
static void
Emit_Sockaddr(struct vcc *tl, const struct token *t_host,
Emit_Sockaddr(struct vcc *tl, struct vsb *vsb1, const struct token *t_host,
const struct token *t_port)
{
const char *ipv4, *ipv4a, *ipv6, *ipv6a, *pa;
char buf[256];
char buf[BUFSIZ];
AN(t_host->dec);
......@@ -74,17 +74,19 @@ Emit_Sockaddr(struct vcc *tl, const struct token *t_host,
&ipv4, &ipv4a, &ipv6, &ipv6a, &pa, 2, t_host, "Backend host");
ERRCHK(tl);
if (ipv4 != NULL) {
Fb(tl, 0, "\t.ipv4_suckaddr = (const struct suckaddr *)%s,\n",
VSB_printf(vsb1,
"\t.ipv4 = (const struct suckaddr *)%s,\n",
ipv4);
Fb(tl, 0, "\t.ipv4_addr = \"%s\",\n", ipv4a);
}
if (ipv6 != NULL) {
Fb(tl, 0, "\t.ipv6_suckaddr = (const struct suckaddr *)%s,\n",
VSB_printf(vsb1,
"\t.ipv6 = (const struct suckaddr *)%s,\n",
ipv6);
Fb(tl, 0, "\t.ipv6_addr = \"%s\",\n", ipv6a);
}
Fb(tl, 0, "\t.port = \"%s\",\n", pa);
Fb(tl, 0, "\t.path = (void *) 0,\n");
VSB_printf(vsb1, "\t.uds_path = (void *) 0,\n");
}
/*
......@@ -93,7 +95,8 @@ Emit_Sockaddr(struct vcc *tl, const struct token *t_host,
* the IP suckaddrs to NULL.
*/
static void
Emit_UDS_Path(struct vcc *tl, const struct token *t_path, const char *errid)
Emit_UDS_Path(struct vcc *tl, struct vsb *vsb1,
const struct token *t_path, const char *errid)
{
struct stat st;
......@@ -121,12 +124,11 @@ Emit_UDS_Path(struct vcc *tl, const struct token *t_path, const char *errid)
vcc_ErrWhere(tl, t_path);
return;
}
Fb(tl, 0, "\t.path = \"%s\",\n", t_path->dec);
Fb(tl, 0, "\t.ipv4_suckaddr = (void *) 0,\n");
Fb(tl, 0, "\t.ipv6_suckaddr = (void *) 0,\n");
VSB_printf(vsb1, "\t.uds_path = \"%s\",\n", t_path->dec);
VSB_printf(vsb1, "\t.ipv4 = (void *) 0,\n");
VSB_printf(vsb1, "\t.ipv6 = (void *) 0,\n");
}
/*--------------------------------------------------------------------
* Disallow mutually exclusive field definitions
*/
......@@ -346,7 +348,7 @@ vcc_ParseHostDef(struct vcc *tl, const struct token *t_be, const char *vgcname)
struct token *t_did = NULL;
struct fld_spec *fs;
struct inifin *ifp;
struct vsb *vsb;
struct vsb *vsb1, *vsb2;
char *p;
unsigned u;
double t;
......@@ -364,9 +366,11 @@ vcc_ParseHostDef(struct vcc *tl, const struct token *t_be, const char *vgcname)
"?proxy_header",
NULL);
vsb = VSB_new_auto();
AN(vsb);
tl->fb = vsb;
vsb1 = VSB_new_auto();
AN(vsb1);
vsb2 = VSB_new_auto();
AN(vsb2);
tl->fb = vsb2;
if (tl->t->tok == ID &&
(vcc_IdIs(tl->t, "none") || vcc_IdIs(tl->t, "None"))) {
......@@ -381,10 +385,16 @@ vcc_ParseHostDef(struct vcc *tl, const struct token *t_be, const char *vgcname)
SkipToken(tl, '{');
VSB_printf(vsb1,
"\nstatic const struct vrt_endpoint vgc_dir_ep_%s = {\n",
vgcname);
VSB_printf(vsb1, "\t.magic = VRT_ENDPOINT_MAGIC,\n");
Fb(tl, 0, "\nstatic const struct vrt_backend vgc_dir_priv_%s = {\n",
vgcname);
Fb(tl, 0, "\t.magic = VRT_BACKEND_MAGIC,\n");
Fb(tl, 0, "\t.endpoint = &vgc_dir_ep_%s,\n", vgcname);
Fb(tl, 0, "\t.vcl_name = \"%.*s", PF(t_be));
Fb(tl, 0, "\",\n");
......@@ -517,10 +527,10 @@ vcc_ParseHostDef(struct vcc *tl, const struct token *t_be, const char *vgcname)
assert(t_host != NULL || t_path != NULL);
if (t_host != NULL)
/* Check that the hostname makes sense */
Emit_Sockaddr(tl, t_host, t_port);
Emit_Sockaddr(tl, vsb1, t_host, t_port);
else
/* Check that the path can be a legal UDS */
Emit_UDS_Path(tl, t_path, "Backend path");
Emit_UDS_Path(tl, vsb1, t_path, "Backend path");
ERRCHK(tl);
ExpectErr(tl, '}');
......@@ -543,10 +553,15 @@ vcc_ParseHostDef(struct vcc *tl, const struct token *t_be, const char *vgcname)
vcc_NextToken(tl);
VSB_printf(vsb1, "};\n");
AZ(VSB_finish(vsb1));
Fh(tl, 0, "%s", VSB_data(vsb1));
VSB_destroy(&vsb1);
tl->fb = NULL;
AZ(VSB_finish(vsb));
Fh(tl, 0, "%s", VSB_data(vsb));
VSB_destroy(&vsb);
AZ(VSB_finish(vsb2));
Fh(tl, 0, "%s", VSB_data(vsb2));
VSB_destroy(&vsb2);
ifp = New_IniFin(tl);
VSB_printf(ifp->ini,
......
......@@ -522,10 +522,13 @@ cooldown_thread(void *priv)
static VCL_BACKEND
create_cold_backend(VRT_CTX)
{
struct vrt_endpoint vep[1];
struct vrt_backend be[1];
INIT_OBJ(vep, VRT_ENDPOINT_MAGIC);
vep->uds_path = "/";
INIT_OBJ(be, VRT_BACKEND_MAGIC);
be->path = "/";
be->endpoint = vep;
be->vcl_name = "doomed";
return (VRT_new_backend(ctx, be));
}
......
......@@ -65,13 +65,16 @@ dyn_dir_init(VRT_CTX, struct xyzzy_debug_dyn *dyn,
{
struct suckaddr *sa;
VCL_BACKEND dir, dir2;
struct vrt_endpoint vep;
struct vrt_backend vrt;
CHECK_OBJ_NOTNULL(dyn, VMOD_DEBUG_DYN_MAGIC);
XXXAN(addr);
XXXAN(port);
INIT_OBJ(&vep, VRT_ENDPOINT_MAGIC);
INIT_OBJ(&vrt, VRT_BACKEND_MAGIC);
vrt.endpoint = &vep;
vrt.port = port;
vrt.vcl_name = dyn->vcl_name;
vrt.hosthdr = addr;
......@@ -81,10 +84,10 @@ dyn_dir_init(VRT_CTX, struct xyzzy_debug_dyn *dyn,
AN(sa);
if (VSA_Get_Proto(sa) == AF_INET) {
vrt.ipv4_addr = addr;
vrt.ipv4_suckaddr = sa;
vep.ipv4 = sa;
} else if (VSA_Get_Proto(sa) == AF_INET6) {
vrt.ipv6_addr = addr;
vrt.ipv6_suckaddr = sa;
vep.ipv6 = sa;
} else
WRONG("Wrong proto family");
......@@ -171,6 +174,7 @@ static int
dyn_uds_init(VRT_CTX, struct xyzzy_debug_dyn_uds *uds, VCL_STRING path)
{
VCL_BACKEND dir, dir2;
struct vrt_endpoint vep;
struct vrt_backend vrt;
struct stat st;
......@@ -197,12 +201,14 @@ dyn_uds_init(VRT_CTX, struct xyzzy_debug_dyn_uds *uds, VCL_STRING path)
return (-1);
}
INIT_OBJ(&vep, VRT_ENDPOINT_MAGIC);
INIT_OBJ(&vrt, VRT_BACKEND_MAGIC);
vrt.path = path;
vrt.endpoint = &vep;
vep.uds_path = path;
vrt.vcl_name = uds->vcl_name;
vrt.hosthdr = "localhost";
vrt.ipv4_suckaddr = NULL;
vrt.ipv6_suckaddr = NULL;
vep.ipv4 = NULL;
vep.ipv6 = NULL;
if ((dir = VRT_new_backend(ctx, &vrt)) == NULL)
return (-1);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment