From d2142ad4050c64991f856734bafadd527c28e74b Mon Sep 17 00:00:00 2001 From: Maria Matejka Date: Mon, 27 Jun 2022 12:14:05 +0200 Subject: [PATCH] Fixed displaying BGP and RIP attributes after recent reworks --- filter/test.conf | 4 ---- lib/route.h | 1 + nest/rt-attr.c | 41 +++++++++++++++++++++++------------------ proto/bgp/attrs.c | 4 ++++ proto/rip/rip.c | 2 +- 5 files changed, 29 insertions(+), 23 deletions(-) diff --git a/filter/test.conf b/filter/test.conf index eb9cc30c..cd2fa8db 100644 --- a/filter/test.conf +++ b/filter/test.conf @@ -1470,11 +1470,7 @@ bool t; bgp_community = -empty-; bgp_originator_id = 9.7.5.3; bgp_cluster_list = -empty-; - t = defined(bgp_mp_reach_nlri); - t = defined(bgp_mp_unreach_nlri); bgp_ext_community = --empty--; - bgp_as4_path = +empty+; - t = defined(bgp_as4_aggregator); t = defined(bgp_aigp); bgp_large_community = ---empty---; t = defined(bgp_mpls_label_stack); diff --git a/lib/route.h b/lib/route.h index f7b089d9..130465f9 100644 --- a/lib/route.h +++ b/lib/route.h @@ -172,6 +172,7 @@ struct ea_class { btype type; /* Data type ID */ \ uint readonly:1; /* This attribute can't be changed by filters */ \ uint conf:1; /* Requested by config */ \ + uint hidden:1; /* Technical attribute, do not show, do not expose to filters */ \ void (*format)(const eattr *ea, byte *buf, uint size); \ void (*stored)(const eattr *ea); /* When stored into global hash */ \ void (*freed)(const eattr *ea); /* When released from global hash */ \ diff --git a/nest/rt-attr.c b/nest/rt-attr.c index cec1d7cf..0881b61b 100644 --- a/nest/rt-attr.c +++ b/nest/rt-attr.c @@ -436,7 +436,8 @@ ea_class_free(struct ea_class *cl) /* No more ea class references. Unregister the attribute. */ idm_free(&ea_class_idm, cl->id); ea_class_global[cl->id] = NULL; - ea_lex_unregister(cl); + if (!cl->hidden) + ea_lex_unregister(cl); } static void @@ -492,7 +493,8 @@ ea_register(pool *p, struct ea_class *def) ASSERT_DIE(def->id < ea_class_max); ea_class_global[def->id] = def; - ea_lex_register(def); + if (!def->hidden) + ea_lex_register(def); return ea_ref_class(p, def); } @@ -1017,37 +1019,40 @@ opaque_format(const struct adata *ad, byte *buf, uint size) } static inline void -ea_show_int_set(struct cli *c, const struct adata *ad, int way, byte *pos, byte *buf, byte *end) +ea_show_int_set(struct cli *c, const char *name, const struct adata *ad, int way, byte *buf) { - int i = int_set_format(ad, way, 0, pos, end - pos); - cli_printf(c, -1012, "\t%s", buf); + int nlen = strlen(name); + int i = int_set_format(ad, way, 0, buf, CLI_MSG_SIZE - nlen - 3); + cli_printf(c, -1012, "\t%s: %s", name, buf); while (i) { - i = int_set_format(ad, way, i, buf, end - buf - 1); + i = int_set_format(ad, way, i, buf, CLI_MSG_SIZE - 1); cli_printf(c, -1012, "\t\t%s", buf); } } static inline void -ea_show_ec_set(struct cli *c, const struct adata *ad, byte *pos, byte *buf, byte *end) +ea_show_ec_set(struct cli *c, const char *name, const struct adata *ad, byte *buf) { - int i = ec_set_format(ad, 0, pos, end - pos); - cli_printf(c, -1012, "\t%s", buf); + int nlen = strlen(name); + int i = ec_set_format(ad, 0, buf, CLI_MSG_SIZE - nlen - 3); + cli_printf(c, -1012, "\t%s: %s", name, buf); while (i) { - i = ec_set_format(ad, i, buf, end - buf - 1); + i = ec_set_format(ad, i, buf, CLI_MSG_SIZE - 1); cli_printf(c, -1012, "\t\t%s", buf); } } static inline void -ea_show_lc_set(struct cli *c, const struct adata *ad, byte *pos, byte *buf, byte *end) +ea_show_lc_set(struct cli *c, const char *name, const struct adata *ad, byte *buf) { - int i = lc_set_format(ad, 0, pos, end - pos); - cli_printf(c, -1012, "\t%s", buf); + int nlen = strlen(name); + int i = lc_set_format(ad, 0, buf, CLI_MSG_SIZE - nlen - 3); + cli_printf(c, -1012, "\t%s: %s", name, buf); while (i) { - i = lc_set_format(ad, i, buf, end - buf - 1); + i = lc_set_format(ad, i, buf, CLI_MSG_SIZE - 1); cli_printf(c, -1012, "\t\t%s", buf); } } @@ -1075,7 +1080,7 @@ ea_show(struct cli *c, const eattr *e) struct ea_class *cls = ea_class_global[e->id]; ASSERT_DIE(cls); - if (e->undef) + if (e->undef || cls->hidden) return; else if (cls->format) cls->format(e, buf, end - buf); @@ -1098,13 +1103,13 @@ ea_show(struct cli *c, const eattr *e) as_path_format(ad, pos, end - pos); break; case T_CLIST: - ea_show_int_set(c, ad, 1, pos, buf, end); + ea_show_int_set(c, cls->name, ad, 1, buf); return; case T_ECLIST: - ea_show_ec_set(c, ad, pos, buf, end); + ea_show_ec_set(c, cls->name, ad, buf); return; case T_LCLIST: - ea_show_lc_set(c, ad, pos, buf, end); + ea_show_lc_set(c, cls->name, ad, buf); return; default: bsprintf(pos, "", e->type); diff --git a/proto/bgp/attrs.c b/proto/bgp/attrs.c index 46e949bf..22a53dce 100644 --- a/proto/bgp/attrs.c +++ b/proto/bgp/attrs.c @@ -1122,12 +1122,14 @@ static union bgp_attr_desc bgp_attr_table[BGP_ATTR_MAX] = { [BA_MP_REACH_NLRI] = { .name = "bgp_mp_reach_nlri", .type = T_OPAQUE, + .hidden = 1, .flags = BAF_OPTIONAL, .decode = bgp_decode_mp_reach_nlri, }, [BA_MP_UNREACH_NLRI] = { .name = "bgp_mp_unreach_nlri", .type = T_OPAQUE, + .hidden = 1, .flags = BAF_OPTIONAL, .decode = bgp_decode_mp_unreach_nlri, }, @@ -1142,6 +1144,7 @@ static union bgp_attr_desc bgp_attr_table[BGP_ATTR_MAX] = { [BA_AS4_PATH] = { .name = "bgp_as4_path", .type = T_PATH, + .hidden = 1, .flags = BAF_OPTIONAL | BAF_TRANSITIVE, .encode = bgp_encode_raw, .decode = bgp_decode_as4_path, @@ -1149,6 +1152,7 @@ static union bgp_attr_desc bgp_attr_table[BGP_ATTR_MAX] = { [BA_AS4_AGGREGATOR] = { .name = "bgp_as4_aggregator", .type = T_OPAQUE, + .hidden = 1, .flags = BAF_OPTIONAL | BAF_TRANSITIVE, .encode = bgp_encode_raw, .decode = bgp_decode_as4_aggregator, diff --git a/proto/rip/rip.c b/proto/rip/rip.c index d6edac14..f5c01380 100644 --- a/proto/rip/rip.c +++ b/proto/rip/rip.c @@ -1240,7 +1240,7 @@ rip_get_route_info(rte *rte, byte *buf) static void rip_tag_format(const eattr *a, byte *buf, uint buflen) { - bsnprintf(buf, buflen, "tag: %04x", a->u.data); + bsnprintf(buf, buflen, "%04x", a->u.data); } static struct ea_class ea_rip_metric = {