コード例 #1
0
ファイル: ipvswrapper.c プロジェクト: Addision/LVS
/* 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;
}
コード例 #2
0
ファイル: ipvswrapper.c プロジェクト: millken/zhuxianB30
/* 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;
}
コード例 #3
0
ファイル: ipvswrapper.c プロジェクト: millken/zhuxianB30
/* 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;
}