static int local_service_migrate(struct hostctrl *hc, struct service_id *srvid, const char *to_iface) { struct ctrlmsg_migrate cm; if (!srvid) { LOG_ERR("Undefined service\n"); return -1; } if (!to_iface) { LOG_ERR("Undefined interface\n"); return -1; } memset(&cm, 0, sizeof(cm)); cm.cmh.type = CTRLMSG_TYPE_MIGRATE; cm.cmh.len = sizeof(cm); cm.cmh.xid = ++hc->xid; cm.migrate_type = CTRL_MIG_SERVICE; memcpy(&cm.from_s, srvid, sizeof(struct service_id)); strncpy(cm.to_i, to_iface, IFNAMSIZ - 1); return message_channel_send(hc->mc, &cm, cm.cmh.len); }
static int remote_service_unregister(struct hostctrl *hc, const struct service_id *srvid, unsigned short prefix_bits) { struct ctrlmsg_register req; if (!srvid) return -1; memset(&req, 0, sizeof(req)); req.cmh.type = CTRLMSG_TYPE_UNREGISTER; req.cmh.len = htons(sizeof(req)); req.cmh.xid = ++hc->xid; req.srvid_prefix_bits = (prefix_bits > SERVICE_ID_MAX_PREFIX_BITS) ? 0 : prefix_bits; memcpy(&req.srvid, srvid, sizeof(*srvid)); //memcpy(&req.address, ipaddr, sizeof(*ipaddr)); LOG_DBG("prefix_bits=%u sizeof(req)=%zu %s\n", req.srvid_prefix_bits, sizeof(req), service_id_to_str(&req.srvid)); return message_channel_send(hc->mc, &req.cmh, sizeof(req)); }
static int local_service_generic(struct hostctrl *hc, int type, const struct service_id *srvid, unsigned short prefix_bits, unsigned int priority, unsigned int weight, const struct in_addr *ipaddr) { struct { struct ctrlmsg_service cm; struct service_info service; } req; if (!srvid) return -1; memset(&req, 0, sizeof(req)); req.cm.cmh.type = type; req.cm.cmh.xid = ++hc->xid; req.cm.cmh.len = CTRLMSG_SERVICE_NUM_LEN(1); req.cm.service[0].srvid_prefix_bits = (prefix_bits > SERVICE_ID_MAX_PREFIX_BITS) ? 0 : prefix_bits; req.cm.service[0].priority = priority; req.cm.service[0].weight = weight; memcpy(&req.cm.service[0].srvid, srvid, sizeof(*srvid)); if (ipaddr) memcpy(&req.cm.service[0].address, ipaddr, sizeof(*ipaddr)); req.cm.service[0].if_index = -1; /* strncpy(req.cm.ifname, ifname, IFNAMSIZ - 1); */ LOG_DBG("op=%d prefix_bits=%u len=%u sizeof(req)=%zu %zu %s\n", type, req.cm.service[0].srvid_prefix_bits, CTRLMSG_SERVICE_LEN(&req.cm), sizeof(req), CTRLMSG_SERVICE_NUM(&req.cm), service_id_to_str(&req.cm.service[0].srvid)); return message_channel_send(hc->mc, &req.cm, req.cm.cmh.len); }
static int local_interface_migrate(struct hostctrl *hc, const char *from_iface, const char *to_iface) { struct ctrlmsg_migrate cm; if (!from_iface || !to_iface) { LOG_ERR("Undefined interface\n"); return -1; } memset(&cm, 0, sizeof(cm)); cm.cmh.type = CTRLMSG_TYPE_MIGRATE; cm.cmh.len = sizeof(cm); cm.cmh.xid = ++hc->xid; cm.migrate_type = CTRL_MIG_IFACE; strncpy(cm.from_i, from_iface, IFNAMSIZ - 1); strncpy(cm.to_i, to_iface, IFNAMSIZ - 1); return message_channel_send(hc->mc, &cm, cm.cmh.len); }
static int local_service_modify(struct hostctrl *hc, const struct service_id *srvid, unsigned short prefix_bits, unsigned int priority, unsigned int weight, const struct in_addr *old_ip, const struct in_addr *new_ip) { struct { struct ctrlmsg_service cm; struct service_info service[2]; } req; if (!srvid || !old_ip) return -1; memset(&req, 0, sizeof(req)); req.cm.cmh.type = CTRLMSG_TYPE_MOD_SERVICE; req.cm.cmh.len = CTRLMSG_SERVICE_NUM_LEN(2); req.cm.cmh.xid = ++hc->xid; req.service[0].srvid_prefix_bits = (prefix_bits > SERVICE_ID_MAX_PREFIX_BITS) ? 0 : prefix_bits; req.service[0].priority = priority; req.service[0].weight = weight; memcpy(&req.service[0].srvid, srvid, sizeof(*srvid)); memcpy(&req.service[0].address, old_ip, sizeof(*old_ip)); req.service[0].if_index = -1; req.service[1].if_index = -1; if (!new_ip) memcpy(&req.service[1].address, old_ip, sizeof(*old_ip)); else memcpy(&req.service[1].address, new_ip, sizeof(*new_ip)); /* strncpy(cm.ifname, ifname, IFNAMSIZ - 1); */ return message_channel_send(hc->mc, &req.cm, req.cm.cmh.len); }