void bmp_process_msg_route_monitor(char **bmp_packet, u_int32_t *len, struct bmp_peer *bmpp) { struct bgp_misc_structs *bms; struct bgp_peer *peer, *bmpp_bgp_peer; struct bmp_data bdata; struct bmp_peer_hdr *bph; char tstamp_str[SRVBUFLEN], peer_ip[INET6_ADDRSTRLEN]; int bgp_update_len; void *ret; if (!bmpp) return; peer = &bmpp->self; bms = bgp_select_misc_db(peer->type); if (!bms) return; if (!(bph = (struct bmp_peer_hdr *) bmp_get_and_check_length(bmp_packet, len, sizeof(struct bmp_peer_hdr)))) { Log(LOG_INFO, "INFO ( %s/core/BMP ): [%s] [route] packet discarded: failed bmp_get_and_check_length() BMP peer hdr\n", config.name, peer->addr_str); return; } bmp_peer_hdr_get_family(bph, &bdata.family); bmp_peer_hdr_get_peer_ip(bph, &bdata.peer_ip, bdata.family); bmp_peer_hdr_get_bgp_id(bph, &bdata.bgp_id); bmp_peer_hdr_get_tstamp(bph, &bdata.tstamp); bmp_peer_hdr_get_peer_asn(bph, &bdata.peer_asn); bmp_peer_hdr_get_peer_type(bph, &bdata.peer_type); if (bdata.family) { /* If no timestamp in BMP then let's generate one */ if (!bdata.tstamp.tv_sec) gettimeofday(&bdata.tstamp, NULL); compose_timestamp(tstamp_str, SRVBUFLEN, &bdata.tstamp, TRUE, config.timestamps_since_epoch); addr_to_str(peer_ip, &bdata.peer_ip); ret = pm_tfind(&bdata.peer_ip, &bmpp->bgp_peers, bmp_bmpp_bgp_peer_host_addr_cmp); if (ret) { char peer_str[] = "peer_ip", *saved_peer_str = bms->peer_str; bmpp_bgp_peer = (*(struct bgp_peer **) ret); bms->peer_str = peer_str; bgp_update_len = bgp_parse_update_msg(bmpp_bgp_peer, (*bmp_packet)); bms->peer_str = saved_peer_str; bmp_get_and_check_length(bmp_packet, len, bgp_update_len); } } }
void bmp_process_msg_route_monitor(char **bmp_packet, u_int32_t *len, struct bmp_peer *bmpp) { struct bgp_misc_structs *bms; struct bgp_peer *peer, *bmpp_bgp_peer; struct bmp_data bdata; struct bmp_peer_hdr *bph; char tstamp_str[SRVBUFLEN], peer_ip[INET6_ADDRSTRLEN]; int bgp_update_len; void *ret; if (!bmpp) return; peer = &bmpp->self; bms = bgp_select_misc_db(peer->type); if (!bms) return; if (!(bph = (struct bmp_peer_hdr *) bmp_get_and_check_length(bmp_packet, len, sizeof(struct bmp_peer_hdr)))) { Log(LOG_INFO, "INFO ( %s/%s ): [%s] [route] packet discarded: failed bmp_get_and_check_length() BMP peer hdr\n", config.name, bms->log_str, peer->addr_str); return; } bmp_peer_hdr_get_v_flag(bph, &bdata.family); bmp_peer_hdr_get_peer_ip(bph, &bdata.peer_ip, bdata.family); bmp_peer_hdr_get_l_flag(bph, &bdata.is_post); bmp_peer_hdr_get_a_flag(bph, &bdata.is_2b_asn); bmp_peer_hdr_get_bgp_id(bph, &bdata.bgp_id); bmp_peer_hdr_get_tstamp(bph, &bdata.tstamp); bmp_peer_hdr_get_peer_asn(bph, &bdata.peer_asn); bmp_peer_hdr_get_peer_type(bph, &bdata.peer_type); if (bdata.family) { /* If no timestamp in BMP then let's generate one */ if (!bdata.tstamp.tv_sec) gettimeofday(&bdata.tstamp, NULL); compose_timestamp(tstamp_str, SRVBUFLEN, &bdata.tstamp, TRUE, config.timestamps_since_epoch); addr_to_str(peer_ip, &bdata.peer_ip); ret = pm_tfind(&bdata.peer_ip, &bmpp->bgp_peers, bgp_peer_host_addr_cmp); if (ret) { char peer_str[] = "peer_ip", *saved_peer_str = bms->peer_str; struct bgp_msg_extra_data_bmp bmed_bmp; struct bgp_msg_data bmd; bmpp_bgp_peer = (*(struct bgp_peer **) ret); memset(&bmd, 0, sizeof(bmd)); memset(&bmed_bmp, 0, sizeof(bmed_bmp)); bms->peer_str = peer_str; bmed_bmp.bdata = &bdata; bmd.peer = bmpp_bgp_peer; bmd.extra.id = BGP_MSG_EXTRA_DATA_BMP; bmd.extra.len = sizeof(bmed_bmp); bmd.extra.data = &bmed_bmp; // XXX: set extra data funcs bgp_update_len = bgp_parse_update_msg(&bmd, (*bmp_packet)); bms->peer_str = saved_peer_str; bmp_get_and_check_length(bmp_packet, len, bgp_update_len); } /* missing BMP peer up message, ie. case of replay/replication of BMP messages */ else { if (!log_notification_isset(&bmpp->missing_peer_up, bdata.tstamp.tv_sec)) { log_notification_set(&bmpp->missing_peer_up, bdata.tstamp.tv_sec, BMP_MISSING_PEER_UP_LOG_TOUT); Log(LOG_INFO, "INFO ( %s/%s ): [%s] [route] packet discarded: missing peer up BMP message for peer %s\n", config.name, bms->log_str, peer->addr_str, peer_ip); } } } }