0
0
mirror of https://gitlab.nic.cz/labs/bird.git synced 2024-11-18 17:18:42 +00:00

Fixed minor bugs in handling some route attributes

This commit is contained in:
Maria Matejka 2022-06-27 11:04:57 +02:00
parent dfb61dfcea
commit 0f2f5ac58c
3 changed files with 21 additions and 11 deletions

View File

@ -28,6 +28,9 @@ static inline u32 pair_b(u32 p) { return p & 0xFFFF; }
f_generate_complex(fi_code, sym->attribute, arg); \ f_generate_complex(fi_code, sym->attribute, arg); \
}) })
#define f_generate_complex_default(fi_code, da, arg, def) \
f_new_inst(FI_EA_SET, f_new_inst(fi_code, f_new_inst(FI_DEFAULT, f_new_inst(FI_EA_GET, da), f_new_inst(FI_CONSTANT, (struct f_val) { .type = T_INT, .val.i = def })), arg), da)
/* /*
* Sets and their items are during parsing handled as lists, linked * Sets and their items are during parsing handled as lists, linked
@ -902,10 +905,10 @@ cmd:
} }
| attr_bit '=' term ';' { | attr_bit '=' term ';' {
$$ = f_new_inst(FI_CONDITION, $3, $$ = f_new_inst(FI_CONDITION, $3,
f_generate_complex(FI_BITOR, $1.class, f_generate_complex_default(FI_BITOR, $1.class,
f_new_inst(FI_CONSTANT, (struct f_val) { .type = T_INT, .val.i = (1U << $1.bit)})), f_new_inst(FI_CONSTANT, (struct f_val) { .type = T_INT, .val.i = (1U << $1.bit)}), 0),
f_generate_complex(FI_BITAND, $1.class, f_generate_complex_default(FI_BITAND, $1.class,
f_new_inst(FI_CONSTANT, (struct f_val) { .type = T_INT, .val.i = ~(1U << $1.bit)})) f_new_inst(FI_CONSTANT, (struct f_val) { .type = T_INT, .val.i = ~(1U << $1.bit)}), 0)
); );
} }
| break_command print_list ';' { | break_command print_list ';' {

View File

@ -768,6 +768,18 @@
ea_unset_attr(fs->eattrs, 1, da); ea_unset_attr(fs->eattrs, 1, da);
} }
INST(FI_DEFAULT, 2, 1) {
ARG_ANY(1);
ARG_ANY(2);
log(L_INFO "Type of arg 1 is: %d", v1.type);
if (v1.type == T_VOID)
RESULT_VAL(v2);
else
RESULT_VAL(v1);
}
INST(FI_LENGTH, 1, 1) { /* Get length of */ INST(FI_LENGTH, 1, 1) { /* Get length of */
ARG_ANY(1); ARG_ANY(1);
switch(v1.type) { switch(v1.type) {

View File

@ -836,7 +836,7 @@ ea_normalize(ea_list *e, int overlay)
ea_merge(e, t, overlay); ea_merge(e, t, overlay);
ea_sort(t); ea_sort(t);
return t->count ? t : NULL; return t->count ? t : t->next;
} }
/** /**
@ -1075,11 +1075,6 @@ ea_show(struct cli *c, const eattr *e)
struct ea_class *cls = ea_class_global[e->id]; struct ea_class *cls = ea_class_global[e->id];
ASSERT_DIE(cls); ASSERT_DIE(cls);
pos += bsprintf(pos, "%s", cls->name);
*pos++ = ':';
*pos++ = ' ';
if (e->undef) if (e->undef)
return; return;
else if (cls->format) else if (cls->format)
@ -1115,7 +1110,7 @@ ea_show(struct cli *c, const eattr *e)
bsprintf(pos, "<type %02x>", e->type); bsprintf(pos, "<type %02x>", e->type);
} }
cli_printf(c, -1012, "\t%s", buf); cli_printf(c, -1012, "\t%s: %s", cls->name, buf);
} }
static void static void