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); }
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; } }
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); }
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; } }