static int process_overlapping_pfx(struct bgpcorsaro_pfxmonitor_state_t *state, const bgpstream_record_t *bs_record, const bgpstream_elem_t *elem) { char log_buffer[MAX_LOG_BUFFER_LEN] = ""; bgpstream_as_path_seg_t *origin_seg = NULL; uint32_t origin_asn = 0; if (elem->type == BGPSTREAM_ELEM_TYPE_WITHDRAWAL) { /* remove pfx/peer from state structure */ rm_pfx_peer(state, &elem->prefix, elem->peer_asnumber); } else /* (announcement or rib) */ { /* get the origin asn (sets and confederations are ignored) */ origin_seg = bgpstream_as_path_get_origin_seg(elem->aspath); if (origin_seg == NULL || origin_seg->type != BGPSTREAM_AS_PATH_SEG_ASN) { fprintf(stderr, "WARN: ignoring AS sets and confederations\n"); } else { /* valid origin ASN */ origin_asn = ((bgpstream_as_path_seg_asn_t *)origin_seg)->asn; if (set_pfx_peer_origin(state, &elem->prefix, elem->peer_asnumber, origin_asn) != 0) { return -1; } } } /* we always print all the info to the log */ bgpstream_record_elem_snprintf(log_buffer, MAX_LOG_BUFFER_LEN, bs_record, elem); wandio_printf(state->outfile, "%s\n", log_buffer); return 0; }
static int print_elem(bgpstream_record_t *bs_record, bgpstream_elem_t *elem) { assert(bs_record); assert(elem); int len = 65536; if(bgpstream_record_elem_snprintf(elem_buf, len, bs_record, elem) != NULL) { printf("%s\n", elem_buf); return 0; } return -1; }