void bmp_process_msg_term(char **bmp_packet, u_int32_t *len, struct bgp_peer *peer) { struct bmp_data bdata; struct bmp_term_hdr *bth; u_int16_t bmp_len, reason_type = 0; char *bmp_term_info; memset(&bdata, 0, sizeof(bdata)); gettimeofday(&bdata.tstamp, NULL); if (config.nfacctd_bmp_msglog_file || config.nfacctd_bmp_msglog_amqp_routing_key) { char event_type[] = "log"; bmp_log_msg(peer, &bdata, NULL, event_type, config.nfacctd_bmp_msglog_output, BMP_LOG_TYPE_TERM); } if (config.bmp_dump_file || config.bmp_dump_amqp_routing_key) { bmp_dump_se_ll_append(peer, &bdata, NULL, BMP_LOG_TYPE_TERM); } while (*len) { if (!(bth = (struct bmp_term_hdr *) bmp_get_and_check_length(bmp_packet, len, sizeof(struct bmp_term_hdr)))) { Log(LOG_INFO, "INFO ( %s/core/BMP ): [Id: %s] [term] packet discarded: failed bmp_get_and_check_length() BMP term hdr\n", config.name, peer->addr_str); return; } bmp_term_hdr_get_len(bth, &bmp_len); if (!(bmp_term_info = bmp_get_and_check_length(bmp_packet, len, bmp_len))) { Log(LOG_INFO, "INFO ( %s/core/BMP ): [Id: %s] [term] packet discarded: failed bmp_get_and_check_length() BMP term info\n", config.name, peer->addr_str); return; } if (bth->type == BMP_TERM_INFO_REASON && bmp_len == 2) bmp_term_hdr_get_reason_type(bmp_packet, len, &reason_type); { struct bmp_log_term blterm; blterm.type = bth->type; blterm.len = bmp_len; blterm.val = bmp_term_info; blterm.reas_type = reason_type; if (config.nfacctd_bmp_msglog_file || config.nfacctd_bmp_msglog_amqp_routing_key) { char event_type[] = "log"; bmp_log_msg(peer, &bdata, &blterm, event_type, config.nfacctd_bmp_msglog_output, BMP_LOG_TYPE_TERM); } if (config.bmp_dump_file || config.bmp_dump_amqp_routing_key) { bmp_dump_se_ll_append(peer, &bdata, &blterm, BMP_LOG_TYPE_TERM); } } } }
void bmp_process_msg_term(char **bmp_packet, u_int32_t *len, u_int32_t bmp_hdr_len, struct bmp_peer *bmpp) { struct bgp_misc_structs *bms; struct bgp_peer *peer; struct bmp_data bdata; struct bmp_term_hdr *bth; u_int16_t bmp_term_len, reason_type = 0; char *bmp_term_info; if (!bmpp) return; peer = &bmpp->self; bms = bgp_select_misc_db(peer->type); if (!bms) return; memset(&bdata, 0, sizeof(bdata)); gettimeofday(&bdata.tstamp, NULL); bmp_hdr_len -= sizeof(struct bmp_common_hdr); if (bms->msglog_backend_methods) { char event_type[] = "log"; bmp_log_msg(peer, &bdata, NULL, bms->log_seq, event_type, config.nfacctd_bmp_msglog_output, BMP_LOG_TYPE_TERM); } if (bms->dump_backend_methods) bmp_dump_se_ll_append(peer, &bdata, NULL, BMP_LOG_TYPE_TERM); if (bms->msglog_backend_methods || bms->dump_backend_methods) bgp_peer_log_seq_increment(&bms->log_seq); while (bmp_hdr_len) { if (!(bth = (struct bmp_term_hdr *) bmp_get_and_check_length(bmp_packet, len, sizeof(struct bmp_term_hdr)))) { Log(LOG_INFO, "INFO ( %s/%s ): [%s] [term] packet discarded: failed bmp_get_and_check_length() BMP term hdr\n", config.name, bms->log_str, peer->addr_str); return; } bmp_term_hdr_get_len(bth, &bmp_term_len); if (!(bmp_term_info = bmp_get_and_check_length(bmp_packet, len, bmp_term_len))) { Log(LOG_INFO, "INFO ( %s/%s ): [%s] [term] packet discarded: failed bmp_get_and_check_length() BMP term info\n", config.name, bms->log_str, peer->addr_str); return; } if (bth->type == BMP_TERM_INFO_REASON && bmp_term_len == 2) bmp_term_hdr_get_reason_type(bmp_packet, len, &reason_type); { struct bmp_log_term blterm; blterm.type = bth->type; blterm.len = bmp_term_len; blterm.val = bmp_term_info; blterm.reas_type = reason_type; if (bms->msglog_backend_methods) { char event_type[] = "log"; bmp_log_msg(peer, &bdata, &blterm, bms->log_seq, event_type, config.nfacctd_bmp_msglog_output, BMP_LOG_TYPE_TERM); } if (bms->dump_backend_methods) bmp_dump_se_ll_append(peer, &bdata, &blterm, BMP_LOG_TYPE_TERM); if (bms->msglog_backend_methods || bms->dump_backend_methods) bgp_peer_log_seq_increment(&bms->log_seq); } bmp_hdr_len -= (bmp_term_len + sizeof(struct bmp_term_hdr)); } /* BGP peers are deleted as part of bmp_peer_close() */ }