Ejemplo n.º 1
0
/* Remove a specific vs group entry */
int
ipvs_group_remove_entry(virtual_server *vs, virtual_server_group_entry *vsge)
{
    real_server *rs;
    int err = 0;
    element e;
    list l = vs->rs;

    /* Clean target rules */
    memset(urule, 0, sizeof (struct ip_vs_rule_user));

    /* Process realserver queue */
    for (e = LIST_HEAD(l); e; ELEMENT_NEXT(e)) {
        rs = ELEMENT_DATA(e);

        if (rs->alive) {
            /* Prepare the IPVS rule */
            if (urule->daddr) {
                /* Setting IPVS rule with vs root rs */
                ipvs_set_rule(IP_VS_SO_SET_DELDEST, vs, rs);
            } else {
                urule->weight = rs->weight;
                urule->daddr = SVR_IP(rs);
                urule->dport = SVR_PORT(rs);
            }

            /* Set vs rule */
            if (vsge->range) {
                ipvs_group_range_cmd(IP_VS_SO_SET_DELDEST, vsge);
            } else {
                urule->vfwmark = vsge->vfwmark;
                urule->vaddr = SVR_IP(vsge);
                urule->vport = SVR_PORT(vsge);

                /* Talk to the IPVS channel */
                err = ipvs_talk(IP_VS_SO_SET_DELDEST);
            }
        }
    }

    /* Remove VS entry */
    if (vsge->range)
        err = ipvs_group_range_cmd(IP_VS_SO_SET_DEL, vsge);
    else
        err = ipvs_talk(IP_VS_SO_SET_DEL);
    return err;
}
Ejemplo n.º 2
0
/* Set/Remove a RS or a local address group from a VS */
int
ipvs_cmd(int cmd, list vs_group, virtual_server * vs, real_server * rs)
{
	/* Set/Remove local address */
	if (cmd == IP_VS_SO_SET_ADDLADDR || cmd == IP_VS_SO_SET_DELLADDR)	
		return ipvs_laddr_cmd(cmd, vs_group, vs);

	/* Allocate the room */
	memset(srule, 0, sizeof(ipvs_service_t));
	ipvs_set_rule(cmd, vs, rs);

	/* Does the service use inhibit flag ? */
	if (cmd == IP_VS_SO_SET_DELDEST && rs->inhibit) {
		drule->weight = 0;
		cmd = IP_VS_SO_SET_EDITDEST;
	}
	if (cmd == IP_VS_SO_SET_ADDDEST && rs->inhibit && rs->set)
		cmd = IP_VS_SO_SET_EDITDEST;

	/* Set flag */
	if (cmd == IP_VS_SO_SET_ADDDEST && !rs->set)
		rs->set = 1;
	if (cmd == IP_VS_SO_SET_DELDEST && rs->set)
		rs->set = 0;

	/* Set vs rule and send to kernel */
	if (vs->vsgname) {
		ipvs_group_cmd(cmd, vs_group, rs, vs->vsgname);
	} else {
		if (vs->vfwmark) {
			srule->af = AF_INET;
			srule->fwmark = vs->vfwmark;
		} else {
			srule->af = vs->addr.ss_family;
			if (vs->addr.ss_family == AF_INET6)
				inet_sockaddrip6(&vs->addr, &srule->addr.in6);
			else
				srule->addr.ip = inet_sockaddrip4(&vs->addr);
			srule->port = inet_sockaddrport(&vs->addr);
		}

		/* Talk to the IPVS channel */
		ipvs_talk(cmd);
	}

	return IPVS_SUCCESS;
}
Ejemplo n.º 3
0
/* Set/Remove a RS from a VS */
int
ipvs_cmd(int cmd, list vs_group, virtual_server * vs, real_server * rs)
{
    int err = 0;

    /* Prepare target rule */
    ipvs_set_rule(cmd, vs, rs);

    /* Does the service use inhibit flag ? */
    if (cmd == IP_VS_SO_SET_DELDEST && rs->inhibit) {
        urule->weight = 0;
        cmd = IP_VS_SO_SET_EDITDEST;
    }
    if (cmd == IP_VS_SO_SET_ADDDEST && rs->inhibit && rs->set)
        cmd = IP_VS_SO_SET_EDITDEST;

    /* Set flag */
    if (cmd == IP_VS_SO_SET_ADDDEST && !rs->set)
        rs->set = 1;
    if (cmd == IP_VS_SO_SET_DELDEST && rs->set)
        rs->set = 0;

    /* Set vs rule and send to kernel */
    if (vs->vsgname) {
        err = ipvs_group_cmd(cmd, vs_group, rs, vs->vsgname);
    } else {
        if (vs->vfwmark) {
            urule->vfwmark = vs->vfwmark;
        } else {
            urule->vaddr = SVR_IP(vs);
            urule->vport = SVR_PORT(vs);
        }

        /* Talk to the IPVS channel */
        err = ipvs_talk(cmd);
    }

    return err;
}
Ejemplo n.º 4
0
/* Set/Remove a RS from a VS */
int
ipvs_cmd(int cmd, list vs_group, virtual_server * vs, real_server * rs)
{
    /* Allocate the room */
    memset(srule, 0, sizeof (struct ip_vs_service_user));
    ipvs_set_rule(cmd, vs, rs);

    /* Does the service use inhibit flag ? */
    if (cmd == IP_VS_SO_SET_DELDEST && rs->inhibit) {
        drule->weight = 0;
        cmd = IP_VS_SO_SET_EDITDEST;
    }
    if (cmd == IP_VS_SO_SET_ADDDEST && rs->inhibit && rs->set)
        cmd = IP_VS_SO_SET_EDITDEST;

    /* Set flag */
    if (cmd == IP_VS_SO_SET_ADDDEST && !rs->set)
        rs->set = 1;
    if (cmd == IP_VS_SO_SET_DELDEST && rs->set)
        rs->set = 0;

    /* Set vs rule and send to kernel */
    if (vs->vsgname) {
        ipvs_group_cmd(cmd, vs_group, rs, vs->vsgname);
    } else {
        if (vs->vfwmark) {
            srule->fwmark = vs->vfwmark;
        } else {
            srule->addr = SVR_IP(vs);
            srule->port = SVR_PORT(vs);
        }

        /* Talk to the IPVS channel */
        ipvs_talk(cmd);
    }

    return IPVS_SUCCESS;
}
Ejemplo n.º 5
0
/* Remove a specific vs group entry */
int
ipvs_group_remove_entry(virtual_server *vs, virtual_server_group_entry *vsge)
{
	real_server *rs;
	element e;
	list l = vs->rs;

	/* Clean target rules */
	memset(srule, 0, sizeof(ipvs_service_t));
	memset(drule, 0, sizeof(ipvs_dest_t));

	/* Process realserver queue */
	for (e = LIST_HEAD(l); e; ELEMENT_NEXT(e)) {
		rs = ELEMENT_DATA(e);

		if (rs->alive) {
			/* Prepare the IPVS rule */
			if (!drule->addr.ip) {
				/* Setting IPVS rule with vs root rs */
				ipvs_set_rule(IP_VS_SO_SET_DELDEST, vs, rs);
			} else {
				drule->af = rs->addr.ss_family;
				if (rs->addr.ss_family == AF_INET6)
					inet_sockaddrip6(&rs->addr, &drule->addr.in6);
				else
					drule->addr.ip = inet_sockaddrip4(&rs->addr);
				drule->port = inet_sockaddrport(&rs->addr);
				drule->weight = rs->weight;
			}

			/* Set vs rule */
			if (vsge->range) {
				ipvs_group_range_cmd(IP_VS_SO_SET_DELDEST, vsge);
			} else {
				srule->af = vsge->addr.ss_family;
				if (vsge->addr.ss_family == AF_INET6)
					inet_sockaddrip6(&vsge->addr, &srule->addr.in6);
				else
					srule->addr.ip = inet_sockaddrip4(&vsge->addr);
				srule->port = inet_sockaddrport(&vsge->addr);
				srule->fwmark = vsge->vfwmark;
				drule->u_threshold = rs->u_threshold;
				drule->l_threshold = rs->l_threshold;

				/* Talk to the IPVS channel */
				ipvs_talk(IP_VS_SO_SET_DELDEST);
			}
		}
	}

	/* In case of all rs is unalive */
	ipvs_set_rule(IP_VS_SO_SET_DEL, vs, NULL);

	/* Remove VS entry */
	if (vsge->range)
		ipvs_group_range_cmd(IP_VS_SO_SET_DEL, vsge);
	else {
		srule->af = vsge->addr.ss_family;
		if (vsge->addr.ss_family == AF_INET6)
			inet_sockaddrip6(&vsge->addr, &srule->addr.in6);
		else
			srule->addr.ip = inet_sockaddrip4(&vsge->addr);
		srule->port = inet_sockaddrport(&vsge->addr);
		srule->fwmark = vsge->vfwmark;

		ipvs_talk(IP_VS_SO_SET_DEL);
	}

	return IPVS_SUCCESS;
}