Example #1
0
int get_map_request_length (lispd_mapping_elt *requested_mapping, lispd_mapping_elt *src_mapping)
{
    int mr_len = 0;
    int locator_count = 0, aux_locator_count = 0;
    mr_len = sizeof(lispd_pkt_map_request_t);
    if (src_mapping != NULL){
        mr_len += get_mapping_length(src_mapping);
        /* Calculate locators length */
        mr_len += get_up_locators_length(src_mapping->head_v4_locators_list,&aux_locator_count);
        locator_count = aux_locator_count;
        mr_len += get_up_locators_length(src_mapping->head_v6_locators_list,&aux_locator_count);
        locator_count += aux_locator_count;
    }else{
        if (default_ctrl_iface_v4 != NULL){
            mr_len += sizeof(struct in_addr);
            locator_count ++;
        }
        if (default_ctrl_iface_v6 != NULL){
            mr_len += sizeof(struct in6_addr);
            locator_count ++;
        }
    }
    mr_len += sizeof(lispd_pkt_map_request_itr_rloc_t)*locator_count;  // ITR-RLOC-AFI field
    /* Record size */
    mr_len += sizeof(lispd_pkt_map_request_eid_prefix_record_t);
    // We supose that the requested EID has the same AFI as the source EID
    mr_len += get_mapping_length(requested_mapping);
    /* Add the Map-Reply Record */
    if (src_mapping != NULL)
        mr_len += pkt_get_mapping_record_length(src_mapping);

    return mr_len;
}
Example #2
0
uint8_t *build_map_reply_pkt(
         lispd_mapping_elt   *mapping,
         lisp_addr_t        *probed_rloc,
         map_reply_opts     opts,
         uint64_t           nonce,
         int                *map_reply_msg_len)
{
    uint8_t *packet;
    lispd_pkt_map_reply_t *map_reply_msg;
    lispd_pkt_mapping_record_t *mapping_record;


    *map_reply_msg_len = sizeof(lispd_pkt_map_reply_t) +
            pkt_get_mapping_record_length(mapping);

    if ((packet = malloc(*map_reply_msg_len)) == NULL) {
        lispd_log_msg(LISP_LOG_WARNING, "build_map_reply_pkt: Unable to allocate memory for  Map Reply message(%d) %s",
                *map_reply_msg_len, strerror(errno));
        return(NULL);
    }
    memset(packet, 0, *map_reply_msg_len);

    map_reply_msg = (lispd_pkt_map_reply_t *)packet;

    map_reply_msg->type = 2;
    if (opts.rloc_probe)
        map_reply_msg->rloc_probe = 1;
    if (opts.echo_nonce)
        map_reply_msg->echo_nonce = 1;
    map_reply_msg->record_count = 1;
    map_reply_msg->nonce = nonce;


    if (opts.send_rec) {
        mapping_record = (lispd_pkt_mapping_record_t *)
                     CO(map_reply_msg, sizeof(lispd_pkt_map_reply_t));

        if (pkt_fill_mapping_record(mapping_record, mapping, probed_rloc) == NULL) {
            free(packet);
            return(NULL);
        }
    }
    return(packet);
}