Exemplo n.º 1
0
int process_map_referral_locator(
        uint8_t                 **offset,
        lispd_mapping_elt       *mapping)
{
    lispd_pkt_referral_mapping_record_locator_t     *pkt_locator    = NULL;
    lispd_locator_elt                               *locator        = NULL;
    uint8_t                                         *cur_ptr        = NULL;
    uint8_t                                         status          = UP;

    cur_ptr = *offset;
    pkt_locator = (lispd_pkt_referral_mapping_record_locator_t *)(cur_ptr);

    cur_ptr = (uint8_t *)&(pkt_locator->locator_afi);

    locator = new_rmt_locator (&cur_ptr,status,
            pkt_locator->priority, pkt_locator->weight,
            pkt_locator->mpriority, pkt_locator->mweight);

    if (locator != NULL){
        if ((err=add_locator_to_mapping (mapping, locator)) != GOOD){
            free_locator(locator);
            return (BAD);
        }
    }else{
        return (BAD);
    }

    *offset = cur_ptr;
    return (GOOD);
}
Exemplo n.º 2
0
void activate_interface_address(
    lispd_iface_elt     *iface,
    lisp_addr_t         new_address)
{
    lispd_iface_mappings_list       *mapping_list               = NULL;
    lispd_mapping_elt               *mapping                    = NULL;
    lispd_locators_list             **not_init_locators_list    = NULL;
    lispd_locators_list             **locators_list             = NULL;
    lispd_locator_elt               *locator                    = NULL;

    switch(new_address.afi) {
    case AF_INET:
        iface->out_socket_v4 = open_device_binded_raw_socket(iface->iface_name,AF_INET);
        bind_socket_src_address(iface->out_socket_v4, &new_address);
        break;
    case AF_INET6:
        iface->out_socket_v6 = open_device_binded_raw_socket(iface->iface_name,AF_INET6);
        bind_socket_src_address(iface->out_socket_v6, &new_address);
        break;
    }

    mapping_list = iface->head_mappings_list;
    /*
     * Activate the locator for each mapping associated with the interface
     */
    while (mapping_list != NULL) {
        mapping = mapping_list->mapping;
        lispd_log_msg(LISP_LOG_DEBUG_2,"Activating locator %s associated to the EID %s/%d\n",
                      get_char_from_lisp_addr_t(new_address),
                      get_char_from_lisp_addr_t(mapping->eid_prefix),
                      mapping->eid_prefix_length);
        not_init_locators_list = &(((lcl_mapping_extended_info *)mapping->extended_info)->head_not_init_locators_list);
        locator = extract_locator_from_list (not_init_locators_list, new_address);
        if (locator != NULL) {
            switch(new_address.afi) {
            case AF_INET:
                mapping_list->use_ipv4_address = TRUE;
                locators_list = &mapping->head_v4_locators_list;
                break;
            case AF_INET6:
                mapping_list->use_ipv6_address = TRUE;
                locators_list = &mapping->head_v6_locators_list;
                break;
            }
            /* Add the activated locator */
            if (add_locator_to_list (locators_list,locator) == GOOD) {
                mapping->locator_count = mapping->locator_count + 1;
            } else {
                free_locator(locator);
            }
        } else {
            lispd_log_msg(LISP_LOG_DEBUG_1,"activate_interface_address: No locator with address %s has been found"
                          " in the not init locators list of the mapping %s/%d. Is priority equal to -1 for this EID and afi?",
                          get_char_from_lisp_addr_t(new_address),
                          get_char_from_lisp_addr_t(mapping->eid_prefix),
                          mapping->eid_prefix_length);
        }
        mapping_list = mapping_list->next;
    }
}
Exemplo n.º 3
0
int process_map_reply_locator(
        uint8_t                 **offset,
        lispd_mapping_elt       *mapping)
{
    lispd_pkt_mapping_record_locator_t  *pkt_locator    = NULL;
    lispd_locator_elt                   *locator        = NULL;
    uint8_t                             *cur_ptr        = NULL;
    uint8_t                             status          = UP;

    cur_ptr = *offset;
    pkt_locator = (lispd_pkt_mapping_record_locator_t *)(cur_ptr);

    cur_ptr = (uint8_t *)&(pkt_locator->locator_afi);

    /*
     * We only consider the reachable bit if the information comes from the owner of the locator (local)
     */
    if (pkt_locator->reachable == DOWN && pkt_locator->local == UP){
        status = DOWN;
    }

    locator = new_rmt_locator (&cur_ptr,status,
            pkt_locator->priority, pkt_locator->weight,
            pkt_locator->mpriority, pkt_locator->mweight);

    if (locator != NULL){
        /*
         * Use default_rloc_afi to set status of locators
         */

        if (locator->locator_addr->afi == AF_INET && default_rloc_afi == AF_INET6){
            *(locator->state) = DOWN;
        }

        if (locator->locator_addr->afi == AF_INET6 && default_rloc_afi == AF_INET){
            *(locator->state) = DOWN;
        }


        if ((err=add_locator_to_mapping (mapping, locator)) != GOOD){
            free_locator(locator);
            /* If we couldn't add the locator because it use an unsupported lcaf address, just ignore this locator */
            if (err != ERR_AFI_LCAF_TYPE){
                return (BAD);
            }
        }
    }else{
        return (BAD);
    }

    *offset = cur_ptr;
    return (GOOD);
}
Exemplo n.º 4
0
void free_locator_list(lispd_locators_list     *locator_list)
{
    lispd_locators_list  * aux_locator_list     = NULL;
    /*
     * Free the locators
     */
    while (locator_list)
    {
        aux_locator_list = locator_list->next;
        free_locator(locator_list->locator);
        free (locator_list);
        locator_list = aux_locator_list;
    }
}