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

stable but - channels and routes disabled, bgp_id needs bmp report field null for some reason, lots of remaining debugging logs

This commit is contained in:
Katerina Kubecova 2024-08-30 12:30:13 +02:00
parent ebc54950aa
commit 01e00b4755
3 changed files with 36 additions and 19 deletions

View File

@ -654,6 +654,7 @@ mem_hash_mix_f_val(u64 *h, struct f_val *v)
case T_PTR:
case T_ENUM_STATE:
case T_BTIME:
case T_BMP_CLOSING:
bug("Invalid type %s in f_val hashing", f_type_name(v->type));
}
}

View File

@ -51,7 +51,7 @@ static char *c_states[] = { "DOWN", "START", "UP", "STOP", "RESTART" };
extern struct protocol proto_unix_iface;
struct proto_attrs *proto_state_table;
struct proto_attrs *channel_state_table;
//struct proto_attrs *channel_state_table;
static void proto_rethink_goal(struct proto *p);
static char *proto_state_name(struct proto *p);
@ -1314,7 +1314,7 @@ proto_new(struct proto_config *cf)
log("protocol %s %x has id %i", p->name, p, p->id);
if (p->id >= proto_state_table->length) //TODO check
protos_attr_field_grow();
init_list(&proto_state_table->channels_attrs[p->id]);
//init_list(&proto_state_table->channels_attrs[p->id]);
//log("init chann list %x (pid %i)", &proto_state_table->channels_attrs[p->id], p->id);
init_list(&p->channels);
@ -2917,8 +2917,8 @@ protos_attr_field_init(void)
log("start of protos_attr_field_init");
int init_length = 16;
proto_state_table = mb_allocz(&root_pool, sizeof(struct proto_attrs));
proto_state_table->attrs = mb_allocz(&root_pool, sizeof(ea_list)*init_length);
proto_state_table->channels_attrs = mb_allocz(&root_pool, sizeof(list)*init_length);
proto_state_table->attrs = mb_allocz(&root_pool, sizeof(ea_list *_Atomic)*init_length);
proto_state_table->channels_attrs = mb_allocz(&root_pool, sizeof(struct channel_attrs_list) * init_length);
proto_state_table->length = init_length;
proto_state_table->proto_id_maker = mb_allocz(&root_pool, sizeof(struct hmap));
proto_state_table->channel_id_maker = mb_allocz(&root_pool, sizeof(struct hmap));
@ -2934,12 +2934,12 @@ protos_attr_field_grow(void)
log("grow");
ea_list *_Atomic * new_field = mb_allocz(&root_pool, proto_state_table->length * sizeof(ea_list *_Atomic) * 2);
log("for realocated field allocated %x", new_field);
list * new_chann = mb_allocz(&root_pool, proto_state_table->length * sizeof(list) * 2);
struct channel_attrs_list * new_chann = mb_allocz(&root_pool, proto_state_table->length * sizeof(struct channel_attrs_list) * 2);
log("for realocated chann field allocated %x", new_chann);
memcpy(new_field, proto_state_table->attrs, proto_state_table->length * (sizeof(ea_list* _Atomic)));
memcpy(new_chann, proto_state_table->channels_attrs, proto_state_table->length * (sizeof(list)));
atomic_store(&proto_state_table->attrs, new_field);
atomic_store(&proto_state_table->channels_attrs, new_chann); //TODO atomic
atomic_store(&proto_state_table->channels_attrs, new_chann);
atomic_store(&proto_state_table->length, (proto_state_table->length*2));
}
@ -3091,9 +3091,10 @@ struct channel_attrs *
get_channel_ea(struct channel *ch)
{
struct channel_attrs *chan_att;
WALK_LIST(chan_att, proto_state_table->channels_attrs[ch->proto->id])
WALK_TLIST(channel_attrs, chan_att, &proto_state_table->channels_attrs[ch->proto->id])
{
const int id = ea_get_int(chan_att->attrs, &ea_channel_id, 0);
log("%x %i", chan_att, id);
if (ch->id == id)
return chan_att;
}
@ -3106,6 +3107,8 @@ channel_journal_state_push(ea_list *attr, struct channel *ch)
attr = ea_lookup(attr, 0, EALS_CUSTOM);
return; // do we need the journal?
ea_list *old_attr = get_channel_ea(ch)->attrs;
struct channel_attrs *ch_attr = get_channel_ea(ch); //TODO is this ok? What about add new tail and delete old chan attr?
ch_attr->attrs = attr;
LOCK_DOMAIN(rtable, proto_journal_domain);
struct channel_pending_update *pupdate = SKIP_BACK(struct channel_pending_update, li, lfjour_push_prepare(channel_journal));
if (!pupdate)
@ -3113,8 +3116,6 @@ channel_journal_state_push(ea_list *attr, struct channel *ch)
UNLOCK_DOMAIN(rtable, proto_journal_domain);
return;
}
struct channel_attrs *ch_attr = get_channel_ea(ch);
atomic_store(&ch_attr->attrs, attr);
*pupdate = (struct channel_pending_update) {
.li = pupdate->li, /* Keep the item's internal state */
.channel_attr = attr,
@ -3137,15 +3138,17 @@ channel_journal_state_change(struct channel *ch, int old_state, int new_state)
void
add_journal_channel(struct channel *ch)
{
if (!NODE_VALID(HEAD(proto_state_table->channels_attrs[ch->proto->id])))
init_list(&proto_state_table->channels_attrs[ch->proto->id]); // if we realocated channels lists, earlier inicialization would be problematic. But it does not seem to be problem for nonempty lists
//if (!NODE_VALID(HEAD(proto_state_table->channels_attrs[ch->proto->id])))
// init_list(&proto_state_table->channels_attrs[ch->proto->id]); // if we realocated channels lists, earlier inicialization would be problematic. But it does not seem to be problem for nonempty lists
ea_list *eal = channel_state_to_eattr(ch, 0);
struct channel_attrs *attr = mb_allocz(&root_pool, 1230);//sizeof(struct channel_attrs));
struct channel_attrs *attr = mb_allocz(&root_pool, sizeof(struct channel_attrs)); //TODO free
log("for new channel allocated %x, eal %x", attr, eal);
attr->attrs = eal;
add_tail(&proto_state_table->channels_attrs[ch->proto->id], &attr->n);
log("added tail to lis %x ch id %i, p id %i", &proto_state_table->channels_attrs[ch->proto->id], ch->id, ch->proto->id);
log("chann id %i %x",ea_get_int(eal, &ea_channel_id, 0), eal);
channel_attrs_add_tail(&proto_state_table->channels_attrs[ch->proto->id], attr);
log("added tail to lis %x ch id %i, p id %i ",
&proto_state_table->channels_attrs[ch->proto->id], ch->id, ch->proto->id);
if (get_channel_ea(ch) == 0)
bug("channel not stored ch id %i, p id %i", ch->id, ch->proto->id);
}

View File

@ -402,9 +402,26 @@ static inline int proto_is_inactive(struct proto *p)
}
#include "lib/tlists.h"
#define TLIST_PREFIX channel_attrs
#define TLIST_TYPE struct channel_attrs
#define TLIST_ITEM n
struct channel_attrs {
TLIST_DEFAULT_NODE;
ea_list *attrs;
};
#define TLIST_WANT_ADD_TAIL
#define TLIST_WANT_WALK
#include "lib/tlists.h"
struct proto_attrs {
ea_list *_Atomic *attrs;
list *channels_attrs;
struct channel_attrs_list *channels_attrs;
_Atomic u32 length;
struct hmap *proto_id_maker;
struct hmap *channel_id_maker;
@ -415,10 +432,6 @@ extern struct lfjour *channel_journal;
extern struct proto_attrs *proto_state_table;
extern DOMAIN(rtable) proto_journal_domain;
struct channel_attrs {
node n;
ea_list *_Atomic attrs;
};
struct proto_pending_update {
LFJOUR_ITEM_INHERIT(li);