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);
}
示例#2
0
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);
}