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_init(char **bmp_packet, u_int32_t *len, struct bgp_peer *peer) { struct bmp_data bdata; struct bmp_init_hdr *bih; u_int16_t bmp_len; char *bmp_init_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_INIT); } if (config.bmp_dump_file || config.bmp_dump_amqp_routing_key) { bmp_dump_se_ll_append(peer, &bdata, NULL, BMP_LOG_TYPE_INIT); } while (*len) { if (!(bih = (struct bmp_init_hdr *) bmp_get_and_check_length(bmp_packet, len, sizeof(struct bmp_init_hdr)))) { Log(LOG_INFO, "INFO ( %s/core/BMP ): [Id: %s] [init] packet discarded: failed bmp_get_and_check_length() BMP init hdr\n", config.name, peer->addr_str); return; } bmp_init_hdr_get_len(bih, &bmp_len); if (!(bmp_init_info = bmp_get_and_check_length(bmp_packet, len, bmp_len))) { Log(LOG_INFO, "INFO ( %s/core/BMP ): [Id: %s] [init] packet discarded: failed bmp_get_and_check_length() BMP init info\n", config.name, peer->addr_str); return; } { struct bmp_log_init blinit; blinit.type = bih->type; blinit.len = bmp_len; blinit.val = bmp_init_info; if (config.nfacctd_bmp_msglog_file || config.nfacctd_bmp_msglog_amqp_routing_key) { char event_type[] = "log"; bmp_log_msg(peer, &bdata, &blinit, event_type, config.nfacctd_bmp_msglog_output, BMP_LOG_TYPE_INIT); } if (config.bmp_dump_file || config.bmp_dump_amqp_routing_key) { bmp_dump_se_ll_append(peer, &bdata, &blinit, BMP_LOG_TYPE_INIT); } } } }
void bmp_process_msg_peer_down(char **bmp_packet, u_int32_t *len, struct bgp_peer *peer) { struct bmp_data bdata; struct bmp_peer_hdr *bph; struct bmp_peer_down_hdr *bpdh; memset(&bdata, 0, sizeof(bdata)); 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 ): [Id: %s] [peer down] packet discarded: failed bmp_get_and_check_length() BMP peer hdr\n", config.name, peer->addr_str); return; } if (!(bpdh = (struct bmp_peer_down_hdr *) bmp_get_and_check_length(bmp_packet, len, sizeof(struct bmp_peer_down_hdr)))) { Log(LOG_INFO, "INFO ( %s/core/BMP ): [Id: %s] [peer down] packet discarded: failed bmp_get_and_check_length() BMP peer down 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 no timestamp in BMP then let's generate one */ if (!bdata.tstamp.tv_sec) gettimeofday(&bdata.tstamp, NULL); { struct bmp_log_peer_down blpd; bmp_peer_down_hdr_get_reason(bpdh, &blpd.reason); if (blpd.reason == BMP_PEER_DOWN_LOC_CODE) bmp_peer_down_hdr_get_loc_code(bmp_packet, len, &blpd.loc_code); if (config.nfacctd_bmp_msglog_file || config.nfacctd_bmp_msglog_amqp_routing_key) { char event_type[] = "log"; bmp_log_msg(peer, &bdata, &blpd, event_type, config.nfacctd_bmp_msglog_output, BMP_LOG_TYPE_PEER_DOWN); } if (config.bmp_dump_file || config.bmp_dump_amqp_routing_key) { bmp_dump_se_ll_append(peer, &bdata, &blpd, BMP_LOG_TYPE_PEER_DOWN); } } // XXX: withdraw routes from peer }
void bmp_process_msg_peer_up(char **bmp_packet, u_int32_t *len, struct bgp_peer *peer) { struct bmp_data bdata; struct bmp_peer_hdr *bph; struct bmp_peer_up_hdr *bpuh; memset(&bdata, 0, sizeof(bdata)); 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 ): [Id: %s] [peer up] packet discarded: failed bmp_get_and_check_length() BMP peer hdr\n", config.name, peer->addr_str); return; } if (!(bpuh = (struct bmp_peer_up_hdr *) bmp_get_and_check_length(bmp_packet, len, sizeof(struct bmp_peer_up_hdr)))) { Log(LOG_INFO, "INFO ( %s/core/BMP ): [Id: %s] [peer up] packet discarded: failed bmp_get_and_check_length() BMP peer up 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 no timestamp in BMP then let's generate one */ if (!bdata.tstamp.tv_sec) gettimeofday(&bdata.tstamp, NULL); { struct bmp_log_peer_up blpu; bmp_peer_up_hdr_get_loc_port(bpuh, &blpu.loc_port); bmp_peer_up_hdr_get_rem_port(bpuh, &blpu.rem_port); bmp_peer_up_hdr_get_local_ip(bpuh, &blpu.local_ip, bdata.family); if (config.nfacctd_bmp_msglog_file || config.nfacctd_bmp_msglog_amqp_routing_key) { char event_type[] = "log"; bmp_log_msg(peer, &bdata, &blpu, event_type, config.nfacctd_bmp_msglog_output, BMP_LOG_TYPE_PEER_UP); } if (config.bmp_dump_file || config.bmp_dump_amqp_routing_key) { bmp_dump_se_ll_append(peer, &bdata, &blpu, BMP_LOG_TYPE_PEER_UP); } } }
void bmp_process_msg_stats(char **bmp_packet, u_int32_t *len, struct bmp_peer *bmpp) { struct bgp_misc_structs *bms; struct bgp_peer *peer; struct bmp_data bdata; struct bmp_peer_hdr *bph; struct bmp_stats_hdr *bsh; struct bmp_stats_cnt_hdr *bsch; u_int64_t cnt_data64; u_int32_t index, count = 0, cnt_data32; u_int16_t cnt_type, cnt_len; u_int8_t got_data; if (!bmpp) return; peer = &bmpp->self; bms = bgp_select_misc_db(peer->type); if (!bms) return; memset(&bdata, 0, sizeof(bdata)); 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] [stats] packet discarded: failed bmp_get_and_check_length() BMP peer hdr\n", config.name, bms->log_str, peer->addr_str); return; } if (!(bsh = (struct bmp_stats_hdr *) bmp_get_and_check_length(bmp_packet, len, sizeof(struct bmp_stats_hdr)))) { Log(LOG_INFO, "INFO ( %s/%s ): [%s] [stats] packet discarded: failed bmp_get_and_check_length() BMP stats 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_bgp_id(bph, &bdata.bgp_id); bmp_peer_hdr_get_l_flag(bph, &bdata.is_post); 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); bmp_stats_hdr_get_count(bsh, &count); if (bdata.family) { /* If no timestamp in BMP then let's generate one */ if (!bdata.tstamp.tv_sec) gettimeofday(&bdata.tstamp, NULL); for (index = 0; index < count; index++) { if (!(bsch = (struct bmp_stats_cnt_hdr *) bmp_get_and_check_length(bmp_packet, len, sizeof(struct bmp_stats_cnt_hdr)))) { Log(LOG_INFO, "INFO ( %s/%s ): [%s] [stats] packet discarded: failed bmp_get_and_check_length() BMP stats cnt hdr #%u\n", config.name, bms->log_str, peer->addr_str, index); return; } bmp_stats_cnt_hdr_get_type(bsch, &cnt_type); bmp_stats_cnt_hdr_get_len(bsch, &cnt_len); cnt_data32 = 0; cnt_data64 = 0, got_data = TRUE; switch (cnt_type) { case BMP_STATS_TYPE0: if (cnt_len == 4) bmp_stats_cnt_get_data32(bmp_packet, len, &cnt_data32); break; case BMP_STATS_TYPE1: if (cnt_len == 4) bmp_stats_cnt_get_data32(bmp_packet, len, &cnt_data32); break; case BMP_STATS_TYPE2: if (cnt_len == 4) bmp_stats_cnt_get_data32(bmp_packet, len, &cnt_data32); break; case BMP_STATS_TYPE3: if (cnt_len == 4) bmp_stats_cnt_get_data32(bmp_packet, len, &cnt_data32); break; case BMP_STATS_TYPE4: if (cnt_len == 4) bmp_stats_cnt_get_data32(bmp_packet, len, &cnt_data32); break; case BMP_STATS_TYPE5: if (cnt_len == 4) bmp_stats_cnt_get_data32(bmp_packet, len, &cnt_data32); break; case BMP_STATS_TYPE6: if (cnt_len == 4) bmp_stats_cnt_get_data32(bmp_packet, len, &cnt_data32); break; case BMP_STATS_TYPE7: if (cnt_len == 8) bmp_stats_cnt_get_data64(bmp_packet, len, &cnt_data64); break; case BMP_STATS_TYPE8: if (cnt_len == 8) bmp_stats_cnt_get_data64(bmp_packet, len, &cnt_data64); break; default: if (cnt_len == 4) bmp_stats_cnt_get_data32(bmp_packet, len, &cnt_data32); else if (cnt_len == 8) bmp_stats_cnt_get_data64(bmp_packet, len, &cnt_data64); else { bmp_get_and_check_length(bmp_packet, len, cnt_len); got_data = FALSE; } break; } if (cnt_data32 && !cnt_data64) cnt_data64 = cnt_data32; { struct bmp_log_stats blstats; blstats.cnt_type = cnt_type; blstats.cnt_data = cnt_data64; blstats.got_data = got_data; if (bms->msglog_backend_methods) { char event_type[] = "log"; bmp_log_msg(peer, &bdata, &blstats, bms->log_seq, event_type, config.nfacctd_bmp_msglog_output, BMP_LOG_TYPE_STATS); } if (bms->dump_backend_methods) bmp_dump_se_ll_append(peer, &bdata, &blstats, BMP_LOG_TYPE_STATS); if (bms->msglog_backend_methods || bms->dump_backend_methods) bgp_peer_log_seq_increment(&bms->log_seq); } } } }
void bmp_process_msg_peer_down(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; struct bmp_peer_down_hdr *bpdh; void *ret; if (!bmpp) return; peer = &bmpp->self; bms = bgp_select_misc_db(peer->type); if (!bms) return; memset(&bdata, 0, sizeof(bdata)); 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] [peer down] packet discarded: failed bmp_get_and_check_length() BMP peer hdr\n", config.name, bms->log_str, peer->addr_str); return; } if (!(bpdh = (struct bmp_peer_down_hdr *) bmp_get_and_check_length(bmp_packet, len, sizeof(struct bmp_peer_down_hdr)))) { Log(LOG_INFO, "INFO ( %s/%s ): [%s] [peer down] packet discarded: failed bmp_get_and_check_length() BMP peer down 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_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); { struct bmp_log_peer_down blpd; bmp_peer_down_hdr_get_reason(bpdh, &blpd.reason); if (blpd.reason == BMP_PEER_DOWN_LOC_CODE) bmp_peer_down_hdr_get_loc_code(bmp_packet, len, &blpd.loc_code); if (bms->msglog_backend_methods) { char event_type[] = "log"; bmp_log_msg(peer, &bdata, &blpd, bms->log_seq, event_type, config.nfacctd_bmp_msglog_output, BMP_LOG_TYPE_PEER_DOWN); } if (bms->dump_backend_methods) bmp_dump_se_ll_append(peer, &bdata, &blpd, BMP_LOG_TYPE_PEER_DOWN); if (bms->msglog_backend_methods || bms->dump_backend_methods) bgp_peer_log_seq_increment(&bms->log_seq); } 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; bmpp_bgp_peer = (*(struct bgp_peer **) ret); bms->peer_str = peer_str; bgp_peer_info_delete(bmpp_bgp_peer); bms->peer_str = saved_peer_str; pm_tdelete(&bdata.peer_ip, &bmpp->bgp_peers, bgp_peer_host_addr_cmp); } /* missing BMP peer up message, ie. case of replay/replication of BMP messages */ else { char peer_ip[INET6_ADDRSTRLEN]; addr_to_str(peer_ip, &bdata.peer_ip); 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] [peer down] packet discarded: missing peer up BMP message for peer %s\n", config.name, bms->log_str, peer->addr_str, peer_ip); } } } }
void bmp_process_msg_peer_up(char **bmp_packet, u_int32_t *len, struct bmp_peer *bmpp) { struct bgp_misc_structs *bms; struct bgp_peer *peer; struct bmp_data bdata; struct bmp_peer_hdr *bph; struct bmp_peer_up_hdr *bpuh; if (!bmpp) return; peer = &bmpp->self; bms = bgp_select_misc_db(peer->type); if (!bms) return; memset(&bdata, 0, sizeof(bdata)); 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] [peer up] packet discarded: failed bmp_get_and_check_length() BMP peer hdr\n", config.name, bms->log_str, peer->addr_str); return; } if (!(bpuh = (struct bmp_peer_up_hdr *) bmp_get_and_check_length(bmp_packet, len, sizeof(struct bmp_peer_up_hdr)))) { Log(LOG_INFO, "INFO ( %s/%s ): [%s] [peer up] packet discarded: failed bmp_get_and_check_length() BMP peer up 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); { struct bmp_log_peer_up blpu; struct bgp_peer bgp_peer_loc, bgp_peer_rem, *bmpp_bgp_peer; struct bgp_msg_extra_data_bmp bmed_bmp; struct bgp_msg_data bmd; int bgp_open_len; void *ret, *alloc_key; memset(&bgp_peer_loc, 0, sizeof(bgp_peer_loc)); memset(&bgp_peer_rem, 0, sizeof(bgp_peer_rem)); memset(&bmd, 0, sizeof(bmd)); memset(&bmed_bmp, 0, sizeof(bmed_bmp)); bmp_peer_up_hdr_get_loc_port(bpuh, &blpu.loc_port); bmp_peer_up_hdr_get_rem_port(bpuh, &blpu.rem_port); bmp_peer_up_hdr_get_local_ip(bpuh, &blpu.local_ip, bdata.family); bmed_bmp.bdata = &bdata; bmd.peer = &bgp_peer_loc; 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_open_len = bgp_parse_open_msg(&bmd, (*bmp_packet), FALSE, FALSE); bmp_get_and_check_length(bmp_packet, len, bgp_open_len); memcpy(&bgp_peer_loc.addr, &blpu.local_ip, sizeof(struct host_addr)); bmd.peer = &bgp_peer_rem; bgp_open_len = bgp_parse_open_msg(&bmd, (*bmp_packet), FALSE, FALSE); bmp_get_and_check_length(bmp_packet, len, bgp_open_len); memcpy(&bgp_peer_rem.addr, &bdata.peer_ip, sizeof(struct host_addr)); bmpp_bgp_peer = bmp_sync_loc_rem_peers(&bgp_peer_loc, &bgp_peer_rem); bmpp_bgp_peer->log = bmpp->self.log; bmpp_bgp_peer->bmp_se = bmpp; /* using bmp_se field to back-point a BGP peer to its parent BMP peer */ ret = pm_tsearch(bmpp_bgp_peer, &bmpp->bgp_peers, bgp_peer_cmp, sizeof(struct bgp_peer)); if (!ret) Log(LOG_WARNING, "WARN ( %s/%s ): [%s] [peer up] tsearch() unable to insert.\n", config.name, bms->log_str, peer->addr_str); if (bms->msglog_backend_methods) { char event_type[] = "log"; bmp_log_msg(peer, &bdata, &blpu, bms->log_seq, event_type, config.nfacctd_bmp_msglog_output, BMP_LOG_TYPE_PEER_UP); } if (bms->dump_backend_methods) bmp_dump_se_ll_append(peer, &bdata, &blpu, BMP_LOG_TYPE_PEER_UP); if (bms->msglog_backend_methods || bms->dump_backend_methods) bgp_peer_log_seq_increment(&bms->log_seq); } } }
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() */ }
void bmp_process_msg_init(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_init_hdr *bih; u_int16_t bmp_init_len; char *bmp_init_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_INIT); } if (bms->dump_backend_methods) bmp_dump_se_ll_append(peer, &bdata, NULL, BMP_LOG_TYPE_INIT); if (bms->msglog_backend_methods || bms->dump_backend_methods) bgp_peer_log_seq_increment(&bms->log_seq); while (bmp_hdr_len) { if (!(bih = (struct bmp_init_hdr *) bmp_get_and_check_length(bmp_packet, len, sizeof(struct bmp_init_hdr)))) { Log(LOG_INFO, "INFO ( %s/%s ): [%s] [init] packet discarded: failed bmp_get_and_check_length() BMP init hdr\n", config.name, bms->log_str, peer->addr_str); return; } bmp_init_hdr_get_len(bih, &bmp_init_len); if (!(bmp_init_info = bmp_get_and_check_length(bmp_packet, len, bmp_init_len))) { Log(LOG_INFO, "INFO ( %s/%s ): [%s] [init] packet discarded: failed bmp_get_and_check_length() BMP init info\n", config.name, bms->log_str, peer->addr_str); return; } { struct bmp_log_init blinit; blinit.type = bih->type; blinit.len = bmp_init_len; blinit.val = bmp_init_info; if (bms->msglog_backend_methods) { char event_type[] = "log"; bmp_log_msg(peer, &bdata, &blinit, bms->log_seq, event_type, config.nfacctd_bmp_msglog_output, BMP_LOG_TYPE_INIT); } if (bms->dump_backend_methods) bmp_dump_se_ll_append(peer, &bdata, &blinit, BMP_LOG_TYPE_INIT); if (bms->msglog_backend_methods || bms->dump_backend_methods) bgp_peer_log_seq_increment(&bms->log_seq); } bmp_hdr_len -= (bmp_init_len + sizeof(struct bmp_init_hdr)); } }
void bmp_process_msg_peer_down(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; struct bmp_peer_down_hdr *bpdh; void *ret; if (!bmpp) return; peer = &bmpp->self; bms = bgp_select_misc_db(peer->type); if (!bms) return; memset(&bdata, 0, sizeof(bdata)); 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] [peer down] packet discarded: failed bmp_get_and_check_length() BMP peer hdr\n", config.name, peer->addr_str); return; } if (!(bpdh = (struct bmp_peer_down_hdr *) bmp_get_and_check_length(bmp_packet, len, sizeof(struct bmp_peer_down_hdr)))) { Log(LOG_INFO, "INFO ( %s/core/BMP ): [%s] [peer down] packet discarded: failed bmp_get_and_check_length() BMP peer down 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); { struct bmp_log_peer_down blpd; bmp_peer_down_hdr_get_reason(bpdh, &blpd.reason); if (blpd.reason == BMP_PEER_DOWN_LOC_CODE) bmp_peer_down_hdr_get_loc_code(bmp_packet, len, &blpd.loc_code); if (bms->msglog_backend_methods) { char event_type[] = "log"; bmp_log_msg(peer, &bdata, &blpd, event_type, config.nfacctd_bmp_msglog_output, BMP_LOG_TYPE_PEER_DOWN); } if (bms->dump_backend_methods) bmp_dump_se_ll_append(peer, &bdata, &blpd, BMP_LOG_TYPE_PEER_DOWN); } 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_peer_info_delete(bmpp_bgp_peer); bms->peer_str = saved_peer_str; pm_tdelete(&bdata.peer_ip, &bmpp->bgp_peers, bmp_bmpp_bgp_peer_host_addr_cmp); } } }