/* 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; }
/* 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; }
/* 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; }