0
0
mirror of https://gitlab.nic.cz/labs/bird.git synced 2025-01-15 13:31:54 +00:00

bmp: broken protocol ptr

This commit is contained in:
Katerina Kubecova 2024-08-19 15:04:13 +02:00 committed by Maria Matejka
parent d655c1ba0a
commit 1e6bc69502
4 changed files with 68 additions and 28 deletions

View File

@ -333,7 +333,6 @@ ev_run_list_limited(event_list *l, uint limit)
edlog(l, e, next, 7, EDL_RUN_LIST); edlog(l, e, next, 7, EDL_RUN_LIST);
/* Run the event */ /* Run the event */
log("lock service in event.c? locked %i", locking_stack.service);
e->hook(e->data); e->hook(e->data);
tmp_flush(); tmp_flush();

View File

@ -269,6 +269,7 @@ proto_add_main_channel(struct proto *p, struct channel_config *cf)
p->main_channel = proto_add_channel(p, cf); p->main_channel = proto_add_channel(p, cf);
ea_list *eal = proto_state_table->attrs[p->id]; ea_list *eal = proto_state_table->attrs[p->id];
ea_set_attr(&eal, EA_LITERAL_STORE_STRING(&ea_table, 0, p->main_channel->table->name)); ea_set_attr(&eal, EA_LITERAL_STORE_STRING(&ea_table, 0, p->main_channel->table->name));
log("adding main table ea_rtable added eattrs %i", eal);
proto_journal_state_push(eal, p, 1); proto_journal_state_push(eal, p, 1);
return p->main_channel; return p->main_channel;
} }
@ -3010,8 +3011,11 @@ channel_state_to_eattr(struct channel *ch, int proto_deleting)
eattrs.a[eattrs.l.count++] = EA_LITERAL_STORE_STRING(&ea_name, 0, ch->name); eattrs.a[eattrs.l.count++] = EA_LITERAL_STORE_STRING(&ea_name, 0, ch->name);
eattrs.a[eattrs.l.count++] = EA_LITERAL_EMBEDDED(&ea_proto_id, 0, ch->proto->id); eattrs.a[eattrs.l.count++] = EA_LITERAL_EMBEDDED(&ea_proto_id, 0, ch->proto->id);
eattrs.a[eattrs.l.count++] = EA_LITERAL_EMBEDDED(&ea_deleted, 0, proto_deleting); eattrs.a[eattrs.l.count++] = EA_LITERAL_EMBEDDED(&ea_deleted, 0, proto_deleting);
if (ch->table)
eattrs.a[eattrs.l.count++] = EA_LITERAL_STORE_PTR(&ea_rtable, 0, &ch->table); eattrs.a[eattrs.l.count++] = EA_LITERAL_STORE_PTR(&ea_rtable, 0, ch->table);
log("ea_rtable added (%i), eattrs %i", ch->table, eattrs.l);
if (ch->proto->proto == &proto_bgp && ch != ch->proto->mpls_channel) if (ch->proto->proto == &proto_bgp && ch != ch->proto->mpls_channel)
{ {
struct bgp_channel *bc = (struct bgp_channel *) ch; struct bgp_channel *bc = (struct bgp_channel *) ch;
@ -3043,11 +3047,12 @@ proto_journal_state_push(ea_list *attr, struct proto *p, int save_to_jour)
if (!pupdate) if (!pupdate)
{ {
UNLOCK_DOMAIN(rtable, proto_journal_domain); UNLOCK_DOMAIN(rtable, proto_journal_domain);
log("why am i not creating pupdate?");
return; return;
} }
*pupdate = (struct proto_pending_update) { *pupdate = (struct proto_pending_update) {
.li = pupdate->li, /* Keep the item's internal state */ .li = pupdate->li, /* Keep the item's internal state */
.proto_attr = proto_state_table->attrs[p->id], .proto_attr = save_to_jour ? proto_state_table->attrs[p->id] : attr,
.old_attr = old_attr, .old_attr = old_attr,
.protocol = p .protocol = p
}; };
@ -3115,14 +3120,17 @@ channel_journal_state_change(struct channel *ch, int old_state, int new_state)
void void
add_journal_channel(struct channel *ch) add_journal_channel(struct channel *ch)
{ {
log("adding channel to %s %i", ch->proto->name, ch->proto->id); log("adding channel to %s %i, table %i", ch->proto->name, ch->proto->id, ch->table);
ea_list *eal = channel_state_to_eattr(ch, 0); ea_list *eal = channel_state_to_eattr(ch, 0);
log("eal %i", eal); log("eal %i", eal);
struct channel_attrs *attr = mb_allocz(&root_pool, sizeof(struct channel_attrs)); struct channel_attrs *attr = mb_allocz(&root_pool, sizeof(struct channel_attrs));
//atomic_store(attr->attrs, eal); //atomic_store(attr->attrs, eal);
attr->attrs = eal; attr->attrs = eal;
add_tail(&proto_state_table->channels_attrs[ch->proto->id], &attr->n); add_tail(&proto_state_table->channels_attrs[ch->proto->id], &attr->n);
log("really, added %i to id %i (attr %i attrs %i)", proto_state_table->channels_attrs[ch->proto->id], ch->proto->id, attr, attr->attrs); log("really, added %i to id %i (attr %i attrs %i)", &attr->n, ch->proto->id, attr, attr->attrs);
rtable *ch_table = (rtable *) ea_get_ptr(attr->attrs, &ea_rtable, 0);
log("test presence ch_table %i", ch_table);
} }
void dummy_log_proto_attr_list(void) void dummy_log_proto_attr_list(void)

View File

@ -800,14 +800,15 @@ bgp_conn_enter_established_state(struct bgp_conn *conn)
#ifdef CONFIG_BMP #ifdef CONFIG_BMP
//TODO not to repeat done eatters //TODO not to repeat done eatters
log("in bgp nesmysl, protocol %s id %i", p->p.name, p->p.id); log("in bgp nesmysl, protocol %s id %i", p->p.name, p->p.id);
ea_list *ea = proto_state_table->attrs[p->p.id]; ea_list *ea_l = proto_state_table->attrs[p->p.id];
ea_set_attr(&ea, EA_LITERAL_STORE_ADATA(&ea_bgp_local_open_msg, 0, conn->local_open_msg, conn->local_open_length)); ea_set_attr(&ea_l, EA_LITERAL_STORE_ADATA(&ea_bgp_local_open_msg, 0, conn->local_open_msg, conn->local_open_length));
ea_set_attr(&ea, EA_LITERAL_STORE_ADATA(&ea_bgp_remote_open_msg, 0, conn->remote_open_msg, conn->remote_open_length)); ea_set_attr(&ea_l, EA_LITERAL_STORE_ADATA(&ea_bgp_remote_open_msg, 0, conn->remote_open_msg, conn->remote_open_length));
ea_set_attr(&ea, EA_LITERAL_EMBEDDED(&ea_bgp_local_open_msg_len, 0, conn->local_open_length)); ea_set_attr(&ea_l, EA_LITERAL_EMBEDDED(&ea_bgp_local_open_msg_len, 0, conn->local_open_length));
ea_set_attr(&ea, EA_LITERAL_EMBEDDED(&ea_bgp_remote_open_msg_len, 0, conn->remote_open_length)); ea_set_attr(&ea_l, EA_LITERAL_EMBEDDED(&ea_bgp_remote_open_msg_len, 0, conn->remote_open_length));
ea = ea_lookup(ea, 0, EALS_CUSTOM); ea_l = ea_lookup(ea_l, 0, EALS_CUSTOM);
proto_journal_state_push(ea, &p->p, 0); proto_journal_state_push(ea_l, &p->p, 0);
log("send to bmp locked %i (p %i)", locking_stack.service, p->p.id); log("send to bmp locked %i (p %i), msg len loc %i rem %i", locking_stack.service, p->p.id, conn->local_open_length, conn->remote_open_length);
log("in bgp id %i, tx = %i, l= %i", p->p.id, ea_get_adata(ea_l, &ea_bgp_local_open_msg)->data, ea_get_int(ea_l, &ea_bgp_local_open_msg_len, 0));
//bmp_peer_up(proto_state_table->attrs[p->p.id], conn->local_open_msg, conn->local_open_length, //bmp_peer_up(proto_state_table->attrs[p->p.id], conn->local_open_msg, conn->local_open_length,
// conn->remote_open_msg, conn->remote_open_length); // conn->remote_open_msg, conn->remote_open_length);
#endif #endif

View File

@ -295,6 +295,7 @@ bmp_schedule_tx_packet(struct bmp_proto *p, const byte *payload, const size_t si
static void static void
bmp_fire_tx(void *p_) bmp_fire_tx(void *p_)
{ {
log("fire");
struct bmp_proto *p = p_; struct bmp_proto *p = p_;
if (!p->started) if (!p->started)
@ -310,6 +311,7 @@ bmp_fire_tx(void *p_)
struct bmp_data_node *tx_data_next; struct bmp_data_node *tx_data_next;
WALK_LIST_DELSAFE(tx_data, tx_data_next, p->tx_queue) WALK_LIST_DELSAFE(tx_data, tx_data_next, p->tx_queue)
{ {
log("WALK_LIST_DELSAFE");
if (tx_data->data_size > p->sk->tbsize) if (tx_data->data_size > p->sk->tbsize)
{ {
sk_set_tbsize(p->sk, tx_data->data_size); sk_set_tbsize(p->sk, tx_data->data_size);
@ -320,6 +322,8 @@ bmp_fire_tx(void *p_)
mb_free(tx_data->data); mb_free(tx_data->data);
rem_node((node *) tx_data); rem_node((node *) tx_data);
mb_free(tx_data); mb_free(tx_data);
log("walk ifs for returns socket %i, data size %i", p->sk, data_size);
if (sk_send(p->sk, data_size) <= 0) if (sk_send(p->sk, data_size) <= 0)
return; return;
@ -487,9 +491,20 @@ bmp_find_table(struct bmp_proto *p, rtable *tab)
return HASH_FIND(p->table_map, HASH_TABLE, tab); return HASH_FIND(p->table_map, HASH_TABLE, tab);
} }
const struct channel_class channel_bmp = {
.channel_size = sizeof(struct channel),
.config_size = sizeof(struct channel_config),
/*.init =
.start =
.shutdown =
.cleanup =
.reconfigure = */
};
static struct bmp_table * static struct bmp_table *
bmp_add_table(struct bmp_proto *p, rtable *tab) bmp_add_table(struct bmp_proto *p, rtable *tab)
{ {
log("adding table");
struct bmp_table *bt = mb_allocz(p->p.pool, sizeof(struct bmp_table)); struct bmp_table *bt = mb_allocz(p->p.pool, sizeof(struct bmp_table));
bt->table = tab; bt->table = tab;
rt_lock_table(bt->table); rt_lock_table(bt->table);
@ -504,6 +519,7 @@ bmp_add_table(struct bmp_proto *p, rtable *tab)
.net_type = tab->addr_type, .net_type = tab->addr_type,
.ra_mode = RA_ANY, .ra_mode = RA_ANY,
//.bmp_hack = 1, //.bmp_hack = 1,
.class = &channel_bmp,
}; };
bt->channel = proto_add_channel(&p->p, &cc); bt->channel = proto_add_channel(&p->p, &cc);
@ -515,6 +531,7 @@ bmp_add_table(struct bmp_proto *p, rtable *tab)
static void static void
bmp_remove_table(struct bmp_proto *p, struct bmp_table *bt) bmp_remove_table(struct bmp_proto *p, struct bmp_table *bt)
{ {
log("removing table");
channel_set_state(bt->channel, CS_STOP); channel_set_state(bt->channel, CS_STOP);
channel_set_state(bt->channel, CS_DOWN); channel_set_state(bt->channel, CS_DOWN);
proto_remove_channel(&p->p, bt->channel); proto_remove_channel(&p->p, bt->channel);
@ -551,14 +568,16 @@ static inline bool bmp_stream_policy(struct bmp_stream *bs)
{ return !!(bs->key & BMP_STREAM_KEY_POLICY); } { return !!(bs->key & BMP_STREAM_KEY_POLICY); }
static struct bmp_stream * static struct bmp_stream *
bmp_find_stream(struct bmp_proto *p, struct bgp_proto *bgp_attr, u32 afi, bool policy) bmp_find_stream(struct bmp_proto *p, const struct bgp_proto *bgp, u32 afi, bool policy)
{ {
return HASH_FIND(p->stream_map, HASH_STREAM, (void*)bgp_attr, bmp_stream_key(afi, policy)); ea_list *bgp_attr = proto_state_table->attrs[bgp->p.id];
return HASH_FIND(p->stream_map, HASH_STREAM, bgp_attr, bmp_stream_key(afi, policy));
} }
static struct bmp_stream * static struct bmp_stream *
bmp_add_stream(struct bmp_proto *p, struct bmp_peer *bp, u32 afi, bool policy, rtable *tab, ea_list *sender, int in_pre_policy) bmp_add_stream(struct bmp_proto *p, struct bmp_peer *bp, u32 afi, bool policy, rtable *tab, ea_list *sender, int in_pre_policy)
{ {
log("add stream to p %i", p);
struct bmp_stream *bs = mb_allocz(p->p.pool, sizeof(struct bmp_stream)); struct bmp_stream *bs = mb_allocz(p->p.pool, sizeof(struct bmp_stream));
bs->bgp = bp->bgp; bs->bgp = bp->bgp;
bs->key = bmp_stream_key(afi, policy); bs->key = bmp_stream_key(afi, policy);
@ -579,6 +598,7 @@ bmp_add_stream(struct bmp_proto *p, struct bmp_peer *bp, u32 afi, bool policy, r
static void static void
bmp_remove_stream(struct bmp_proto *p, struct bmp_stream *bs) bmp_remove_stream(struct bmp_proto *p, struct bmp_stream *bs)
{ {
log("remove stream from p %i", p);
rem_node(&bs->n); rem_node(&bs->n);
HASH_REMOVE(p->stream_map, HASH_STREAM, bs); HASH_REMOVE(p->stream_map, HASH_STREAM, bs);
@ -596,7 +616,7 @@ bmp_remove_stream(struct bmp_proto *p, struct bmp_stream *bs)
static struct bmp_peer * static struct bmp_peer *
bmp_find_peer(struct bmp_proto *p, ea_list *bgp_attr) bmp_find_peer(struct bmp_proto *p, ea_list *bgp_attr)
{ {
return HASH_FIND(p->peer_map, HASH_PEER, (void *)bgp_attr); //TODO this is wrong, hash find is not for eattrs. but. return HASH_FIND(p->peer_map, HASH_PEER, bgp_attr);
} }
static struct bmp_peer * static struct bmp_peer *
@ -620,18 +640,19 @@ bmp_add_peer(struct bmp_proto *p, ea_list *bgp_attr)
int proto_id = ea_get_int(bgp_attr, &ea_proto_id, 0); int proto_id = ea_get_int(bgp_attr, &ea_proto_id, 0);
ea_list *chan_attr; struct channel_attrs *chan_attr;
log("before while id %i, eattrs %i", proto_id, proto_state_table->channels_attrs[proto_id]); log("before while id %i, eattrs %i", proto_id, proto_state_table->channels_attrs[proto_id]);
WALK_LIST(chan_attr, proto_state_table->channels_attrs[proto_id]) WALK_LIST(chan_attr, proto_state_table->channels_attrs[proto_id])
{ {
log("chan_attr in bmp_add_peer %i", chan_attr); log("chan_attr in bmp_add_peer %i, attrs %i", chan_attr, chan_attr->attrs);
rtable *ch_table = (rtable *) ea_get_ptr(chan_attr, &ea_rtable, 0); rtable *ch_table = (rtable *) ea_get_ptr(chan_attr->attrs, &ea_rtable, 0);
log("has table ptr %i", ch_table);
log("name %i ch_table %i first if %i second if %i", &ch_table->name, ch_table, p->monitoring_rib.in_pre_policy, p->monitoring_rib.in_post_policy);
if (p->monitoring_rib.in_pre_policy && ch_table) if (p->monitoring_rib.in_pre_policy && ch_table)
bmp_add_stream(p, bp, ea_get_int(chan_attr, &ea_bgp_afi, 0), false, ch_table, chan_attr, 1); bmp_add_stream(p, bp, ea_get_int(chan_attr->attrs, &ea_bgp_afi, 0), false, ch_table, chan_attr->attrs, 1);
if (p->monitoring_rib.in_post_policy && ch_table) if (p->monitoring_rib.in_post_policy && ch_table)
bmp_add_stream(p, bp, ea_get_int(chan_attr, &ea_bgp_afi, 0), true, ch_table, chan_attr, 0); bmp_add_stream(p, bp, ea_get_int(chan_attr->attrs, &ea_bgp_afi, 0), true, ch_table, chan_attr->attrs, 0);
} }
return bp; return bp;
@ -808,7 +829,7 @@ bmp_send_peer_up_notif_msg(struct bmp_proto *p, ea_list *bgp,
static void static void
bmp_route_monitor_put_update(struct bmp_proto *p, struct bmp_stream *bs, const byte *data, size_t length, btime timestamp) bmp_route_monitor_put_update(struct bmp_proto *p, struct bmp_stream *bs, const byte *data, size_t length, btime timestamp)
{ {
struct bmp_data_node *upd_msg = mb_alloc(p->update_msg_mem_pool, struct bmp_data_node *upd_msg = mb_allocz(p->update_msg_mem_pool,
sizeof (struct bmp_data_node)); sizeof (struct bmp_data_node));
upd_msg->data = mb_alloc(p->update_msg_mem_pool, length); upd_msg->data = mb_alloc(p->update_msg_mem_pool, length);
memcpy(upd_msg->data, data, length); memcpy(upd_msg->data, data, length);
@ -1041,8 +1062,12 @@ bmp_rt_notify(struct proto *P, struct channel *c, const net_addr *net,
struct bmp_stream *bs = bmp_find_stream(p, bgp, src->afi, policy); struct bmp_stream *bs = bmp_find_stream(p, bgp, src->afi, policy);
if (!bs) if (!bs)
{
log("bmp stream not found in p %i", p);
return; return;
}
log("bmp stream found");
bmp_route_monitor_notify(p, bgp, bs, net, new, (new ?: old)->src); bmp_route_monitor_notify(p, bgp, bs, net, new, (new ?: old)->src);
} }
@ -1053,8 +1078,12 @@ bmp_feed_end(struct channel *c)
struct bmp_table *bt = bmp_find_table(p, c->table); struct bmp_table *bt = bmp_find_table(p, c->table);
if (!bt) if (!bt)
{
log("bmp table not found");
return; return;
}
log("bmp table found");
/* /*
* Unsynced streams are added in one moment during BMP session establishment, * Unsynced streams are added in one moment during BMP session establishment,
* therefore we can assume that all unsynced streams (for given channel) * therefore we can assume that all unsynced streams (for given channel)
@ -1104,10 +1133,12 @@ bmp_startup(struct bmp_proto *p)
for (u32 i = 0; i < proto_state_table->length; i++) for (u32 i = 0; i < proto_state_table->length; i++)
{ {
ea_list *proto_attr = proto_state_table->attrs[i]; ea_list *proto_attr = proto_state_table->attrs[i];
log("startup proto attr %i", proto_attr);
if (proto_attr == NULL) if (proto_attr == NULL)
continue; continue;
struct protocol *proto = (struct protocol *) ea_get_ptr(proto_attr, &ea_protocol_type, 0); struct protocol *proto = (struct protocol *) ea_get_ptr(proto_attr, &ea_protocol_type, 0);
const int state = ea_get_int(proto_attr, &ea_state, 0); const int state = ea_get_int(proto_attr, &ea_state, 0);
log("proto bgp and up %i %i", proto != &proto_bgp, state != PS_UP);
if (proto != &proto_bgp || state != PS_UP) if (proto != &proto_bgp || state != PS_UP)
continue; continue;
bmp_peer_init(p, proto_attr); bmp_peer_init(p, proto_attr);
@ -1288,12 +1319,12 @@ fc_for_bmp_recipient(void *rec)
} }
void void
create_bmp_recipient(void) create_bmp_recipient(struct proto *P)
{ {
struct lfjour_recipient *r = mb_allocz(&root_pool, sizeof(struct lfjour_recipient)); struct lfjour_recipient *r = mb_allocz(&root_pool, sizeof(struct lfjour_recipient));
r->event = ev_new_init(&root_pool, fc_for_bmp_recipient, r); r->event = ev_new_init(&root_pool, fc_for_bmp_recipient, r);
struct birdloop *loop = birdloop_new(&root_pool, DOMAIN_ORDER(service), 1, "bmp recipient loop"); //struct birdloop *loop = birdloop_new(&root_pool, DOMAIN_ORDER(service), 1, "bmp recipient loop");
r->target = birdloop_event_list(loop); r->target = birdloop_event_list(P->loop);
LOCK_DOMAIN(rtable, proto_journal_domain); LOCK_DOMAIN(rtable, proto_journal_domain);
lfjour_register(proto_journal, r); lfjour_register(proto_journal, r);
@ -1321,7 +1352,7 @@ bmp_init(struct proto_config *CF)
strcpy(p->sys_name, cf->sys_name); strcpy(p->sys_name, cf->sys_name);
p->monitoring_rib.in_pre_policy = cf->monitoring_rib_in_pre_policy; p->monitoring_rib.in_pre_policy = cf->monitoring_rib_in_pre_policy;
p->monitoring_rib.in_post_policy = cf->monitoring_rib_in_post_policy; p->monitoring_rib.in_post_policy = cf->monitoring_rib_in_post_policy;
create_bmp_recipient(); //create_bmp_recipient(P); should be here, but.
log("new proto created locked %i", locking_stack.service); log("new proto created locked %i", locking_stack.service);
return P; return P;
@ -1359,6 +1390,7 @@ bmp_start(struct proto *P)
tm_start(p->connect_retry_timer, CONNECT_INIT_TIME); tm_start(p->connect_retry_timer, CONNECT_INIT_TIME);
log("end of start locked %i", locking_stack.service); log("end of start locked %i", locking_stack.service);
create_bmp_recipient(P);
return PS_START; return PS_START;
} }