void
VBP_Insert(struct backend *b, const struct vrt_backend_probe *vp,
    struct tcp_pool *tp)
{
	struct vbp_target *vt;

	CHECK_OBJ_NOTNULL(b, BACKEND_MAGIC);
	CHECK_OBJ_NOTNULL(vp, VRT_BACKEND_PROBE_MAGIC);

	AZ(b->probe);

	ALLOC_OBJ(vt, VBP_TARGET_MAGIC);
	XXXAN(vt);

	vt->tcp_pool = tp;
	VTP_AddRef(vt->tcp_pool);
	vt->backend = b;
	b->probe = vt;

	vbp_set_defaults(vt, vp);
	vbp_build_req(vt, vp, b);

	vbp_reset(vt);
	VBP_Update_Backend(vt);
}
Esempio n. 2
0
void
VBP_Insert(struct backend *b, const struct vrt_backend_probe *p,
    const char *hosthdr)
{
	struct vbp_target *vt;
	unsigned u;

	ASSERT_CLI();
	CHECK_OBJ_NOTNULL(b, BACKEND_MAGIC);
	CHECK_OBJ_NOTNULL(p, VRT_BACKEND_PROBE_MAGIC);

	AZ(b->probe);

	ALLOC_OBJ(vt, VBP_TARGET_MAGIC);
	XXXAN(vt);
	VTAILQ_INSERT_TAIL(&vbp_list, vt, list);
	Lck_New(&vt->mtx, lck_backend);
	vt->disable = -1;

	vt->tcp_pool = VBT_Ref(b->ipv4, b->ipv6);
	AN(vt->tcp_pool);

	vt->probe = *p;

	vbp_set_defaults(vt);
	vbp_build_req(vt, hosthdr);

	for (u = 0; u < vt->probe.initial; u++) {
		if (u)
			vbp_has_poked(vt);
		vbp_start_poke(vt);
		vt->happy |= 1;
		vbp_has_poked(vt);
	}
	vt->backend = b;
	b->probe = vt;
	vbp_has_poked(vt);
}