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


Reply via email to