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