static mrb_value mrb_ipvs_dest_set_weight(mrb_state *mrb, mrb_value self){ struct mrb_ipvs_entry *svc, *dest; mrb_int weight; dest = DATA_PTR(self); mrb_get_args(mrb, "i", &weight); dest->dest.weight = weight; if (mrb_nil_p(mrb_iv_get(mrb, self, mrb_intern_lit(mrb, "@service")))) { svc = DATA_PTR(mrb_iv_get(mrb, self, mrb_intern_lit(mrb, "@service"))); ipvs_update_dest(&svc->svc, &dest->dest); } return mrb_nil_value(); }
/* Send user rules to IPVS module */ static void ipvs_talk(int cmd) { int result = -1; switch (cmd) { case IP_VS_SO_SET_STARTDAEMON: result = ipvs_start_daemon(daemonrule); break; case IP_VS_SO_SET_STOPDAEMON: result = ipvs_stop_daemon(daemonrule); break; case IP_VS_SO_SET_ADD: result = ipvs_add_service(srule); break; case IP_VS_SO_SET_DEL: result = ipvs_del_service(srule); break; case IP_VS_SO_SET_EDIT: result = ipvs_update_service(srule); break; case IP_VS_SO_SET_ZERO: result = ipvs_zero_service(srule); break; case IP_VS_SO_SET_ADDLADDR: result = ipvs_add_laddr(srule, laddr_rule); break; case IP_VS_SO_SET_DELLADDR: result = ipvs_del_laddr(srule, laddr_rule); break; case IP_VS_SO_SET_ADDDEST: result = ipvs_add_dest(srule, drule); break; case IP_VS_SO_SET_DELDEST: result = ipvs_del_dest(srule, drule); break; case IP_VS_SO_SET_EDITDEST: if ((result = ipvs_update_dest(srule, drule)) && (errno == ENOENT)) result = ipvs_add_dest(srule, drule); break; } if (result) log_message(LOG_INFO, "IPVS: %s", ipvs_strerror(errno)); }
/* ------------------------------------------------------------ */ int ipvsfuncs_update_dest(ipvs_service_t *svc, ipvs_dest_t *dest) { int ret; gchar *s1 = g_strdup_printf("%s:%d proto=%d fwmark=%d", INETTXTADDR(svc->addr.ip), ntohs(svc->port), svc->protocol, svc->fwmark); gchar *s2 = g_strdup_printf("%s:%d proto=%d fwmark=%d", INETTXTADDR(dest->addr.ip), ntohs(dest->port), svc->protocol, svc->fwmark); LOGDEBUG(" * update_dest: [%s :: %s]", s1, s2); ret = ipvs_update_dest(svc, dest); if (ret) { LOGDEBUG(" * ERROR update_dest: [%s :: %s] [%s]", s1, s2, ipvs_strerror(errno)); free(s1); free(s2); return -1; } free(s1); free(s2); return 0; }