you perfectly understood what I wanted to do. I know it's not the normal behavior or anything. I didn't send this as a patch but rather as a quick hack to fulfill a need. I just needed endhosts behind lispmob to be able to interrogate mapping servers (for an experiment). That's the easiest way I found so far but if you have any other idea, I take it.
Matt On Mon, Mar 25, 2013 at 9:14 AM, Albert López <[email protected]> wrote: > Dear Matt, > > I don't understand why do you want this behavior. LISPmob is an > implementation of an XTR and not of a Map Resolver. When you send a map > request to it, you could only obtain answer to the mapping of the EIDs > belonging to this XTR. If I understood correctly, you are modifying > LISPmob to be used as a proxy of the map resolver (the one configured in > LISPmob) not a Map Resolver. > Moreover, when you are using "handle_map_cache_miss", What you are doing is > generating a new entry to the map cache databse. The control plane of > LISPmob generate a map request and add map cache entry to the data base > that will be filled from the obtained map reply. When you are sending a map > request to LISPmob, it checks his local database (information of the EIDs > configured in LISPmob) and not the map cache database (mapping of exteranl > EIDs). > > Best regards > > Albert > > > > > On 03/24/2013 02:20 PM, Teto wrote: >> >> ok sorry to have bothered you, it seems like I got it working via >> further modification of the function: >> >> >> >> int process_map_request_record( >> uint8_t **cur_ptr, >> lisp_addr_t *local_rloc, >> lisp_addr_t *remote_rloc, >> uint16_t dst_port, >> uint8_t rloc_probe, >> uint64_t nonce) >> { >> lispd_pkt_map_request_eid_prefix_record_t *record; >> lispd_identifier_elt requested_identifier; >> lispd_identifier_elt *identifier; >> map_reply_opts opts; >> >> // added by matt >> lispd_map_cache_entry *entry = NULL; >> >> /* Get the requested EID prefix */ >> record = (lispd_pkt_map_request_eid_prefix_record_t *)*cur_ptr; >> init_identifier(&requested_identifier); >> *cur_ptr = (uint8_t *)&(record->eid_prefix_afi); >> if ((err=pkt_process_eid_afi(cur_ptr, >> &requested_identifier))!=GOOD){ >> lispd_log_msg(LISP_LOG_DEBUG_2,"%s: Requested EID could not >> be processed",__func__); >> return (err); >> } >> requested_identifier.eid_prefix_length = record->eid_prefix_length; >> >> /* Check the existence of the requested EID */ >> /* XXX aloepz: We don't use prefix mask and use by default 32 or >> 128*/ >> identifier = lookup_eid_in_db(requested_identifier.eid_prefix); >> >> // >> // >> // if (!identifier){ >> // lispd_log_msg(LISP_LOG_DEBUG_1,"The requested EID doesn't >> belong to this node: %s/%d", >> // >> get_char_from_lisp_addr_t(requested_identifier.eid_prefix), >> // requested_identifier.eid_prefix_length); >> // return (BAD); >> // } >> // >> >> /* Modifications by matt */ >> >> if (!identifier){ >> lispd_log_msg(LISP_LOG_DEBUG_1,"requested EID doesn't belong >> to this node but will try to answer: %s/%d", >> >> get_char_from_lisp_addr_t(requested_identifier.eid_prefix), >> requested_identifier.eid_prefix_length); >> >> >> >> entry = lookup_map_cache(requested_identifier.eid_prefix); >> >> //arnatal XXX: is this the correct error type? >> if (entry == NULL){ /* There is no entry in the map cache */ >> lispd_log_msg(LISP_LOG_DEBUG_1, "No map cache >> retrieved for eid >> %s",get_char_from_lisp_addr_t(requested_identifier.eid_prefix)); >> >> // handle_map_cache_miss(&original_dst_addr, >> &original_src_addr); >> >> handle_map_cache_miss(&requested_identifier.eid_prefix, remote_rloc); >> lispd_log_msg(LISP_LOG_DEBUG_1,"handle cache miss >> with source : %s and dest %s", >> get_char_from_lisp_addr_t( >> requested_identifier.eid_prefix ), >> get_char_from_lisp_addr_t(*remote_rloc) >> ); >> } >> /* Packets with negative map cache entry, no active map >> cache entry or no map cache entry are forwarded to PETR */ >> if ((entry == NULL) || (entry->active == NO_ACTIVE) || >> (entry->identifier->locator_count == 0) ){ /* There is no entry or is >> not active*/ >> lispd_log_msg(LISP_LOG_DEBUG_1,"Could not retrieve >> EID: %s/%d", >> >> get_char_from_lisp_addr_t(requested_identifier.eid_prefix), >> requested_identifier.eid_prefix_length); >> return(GOOD); >> } >> >> >> // update identifier >> identifier = entry->identifier; >> >> >> } >> >> >> /* Set flags for Map-Reply */ >> opts.send_rec = 1; >> opts.echo_nonce = 0; >> opts.rloc_probe = rloc_probe; >> >> err = build_and_send_map_reply_msg(identifier, local_rloc, >> remote_rloc, dst_port, nonce, opts); >> if (rloc_probe){ >> if (err == GOOD){ >> lispd_log_msg(LISP_LOG_DEBUG_1, "Sent RLOC-probe reply to >> %s", get_char_from_lisp_addr_t(*remote_rloc)); >> }else { >> lispd_log_msg(LISP_LOG_DEBUG_1, "process_map_request_msg: >> couldn't build/send RLOC-probe reply"); >> return(BAD); >> } >> }else { >> if (err == GOOD){ >> lispd_log_msg(LISP_LOG_DEBUG_1, "Sent Map reply to %s", >> get_char_from_lisp_addr_t(*remote_rloc)); >> }else { >> lispd_log_msg(LISP_LOG_DEBUG_1, "process_map_request_msg: >> couldn't build/send map-reply"); >> return(BAD); >> } >> } >> return (GOOD); >> } >> >> On Sun, Mar 24, 2013 at 1:28 PM, Teto <[email protected]> wrote: >>> >>> Hi, >>> >>> I would like to be able from my computer to be able to use lig (more >>> precisely to get the rlocs for a specific EID) while LISPmob being >>> active. I wonder what's the best way would be. My current idea is to >>> use LISPmob as a mapping server. With lig, I ask LISPmob which returns >>> me a result for the EID this xTR is responsible (153.16.49.112 being >>> my EID space): >>> teto@tatooine:~/lig$ lig -m 153.16.49.112 153.16.49.112 >>> Send map-request to 153.16.49.112 for 153.16.49.112 ... >>> Received map-reply from 82.121.110.51 with rtt 0.00000 secs >>> >>> Mapping entry for EID '153.16.49.112': >>> 153.16.49.112/28, instance ID: 0, via map-reply, record ttl: 10, >>> auth, not mobile >>> Locator State Priority/Weight >>> 82.121.110.51 up 1/100 >>> >>> >>> but not for the other EIDs: >>> teto@tatooine:~/lig$ lig -m 153.16.49.112 153.16.11.0 >>> Send map-request to 153.16.49.112 for 153.16.11.0 ... >>> Send map-request to 153.16.49.112 for 153.16.11.0 ... >>> >>> >>> I would like lispmob to answer for all EIDs, that is if I ask it an >>> EID lispmob doesn't know , it should ask its configured mapping >>> resolver, get the reply and then "forwards" it to my lig. >>> I've started modifying process_map_request_record to use >>> "handle_map_cache_miss" but I wonder if that's the best option. >>> Here is the original code: >>> /* Check the existence of the requested EID */ >>> /* XXX aloepz: We don't use prefix mask and use by default 32 or >>> 128*/ >>> identifier = lookup_eid_in_db(requested_identifier.eid_prefix); >>> >>> >>> >>> if (!identifier){ >>> lispd_log_msg(LISP_LOG_DEBUG_1,"The requested EID doesn't >>> belong to this node: %s/%d", >>> >>> get_char_from_lisp_addr_t(requested_identifier.eid_prefix), >>> requested_identifier.eid_prefix_length); >>> return (BAD); >>> } >>> >>> to which I added something like but I need more modifications since it >>> doesn't work yet. >>> if( >>> handle_map_cache_miss(&requested_identifier.eid_prefix, remote_rloc) >>> != GOOD){ >>> lispd_log_msg(LISP_LOG_DEBUG_1,"Could not retrieve EID: >>> %s/%d", >>> >>> get_char_from_lisp_addr_t(requested_identifier.eid_prefix), >>> requested_identifier.eid_prefix_length); >>> return (BAD); >>> } >>> >>> Regards >>> >>> MAtt > > >
