diff options
Diffstat (limited to 'nest')
-rw-r--r-- | nest/rt-attr.c | 32 | ||||
-rw-r--r-- | nest/rt-dev.c | 2 | ||||
-rw-r--r-- | nest/rt-table.c | 8 |
3 files changed, 25 insertions, 17 deletions
diff --git a/nest/rt-attr.c b/nest/rt-attr.c index a892bfd5..39fd7db4 100644 --- a/nest/rt-attr.c +++ b/nest/rt-attr.c @@ -92,6 +92,22 @@ const char * const rta_src_names[RTS_MAX] = { [RTS_RPKI] = "RPKI", }; +static void +ea_gen_source_format(const eattr *a, byte *buf, uint size) +{ + if ((a->u.data >= RTS_MAX) || !rta_src_names[a->u.data]) + bsnprintf(buf, size, "unknown"); + else + bsnprintf(buf, size, "%s", rta_src_names[a->u.data]); +} + +struct ea_class ea_gen_source = { + .name = "source", + .type = T_ENUM_RTS, + .readonly = 1, + .format = ea_gen_source_format, +}; + const char * rta_dest_names[RTD_MAX] = { [RTD_NONE] = "", [RTD_UNICAST] = "unicast", @@ -1234,7 +1250,6 @@ rta_hash(rta *a) #define MIX(f) mem_hash_mix(&h, &(a->f), sizeof(a->f)); #define BMIX(f) mem_hash_mix_num(&h, a->f); MIX(hostentry); - BMIX(source); BMIX(dest); #undef MIX @@ -1244,8 +1259,7 @@ rta_hash(rta *a) static inline int rta_same(rta *x, rta *y) { - return (x->source == y->source && - x->dest == y->dest && + return (x->dest == y->dest && x->hostentry == y->hostentry && nexthop_same(&(x->nh), &(y->nh)) && ea_same(x->eattrs, y->eattrs)); @@ -1388,15 +1402,10 @@ rta_do_cow(rta *o, linpool *lp) void rta_dump(rta *a) { - static char *rts[] = { "", "RTS_STATIC", "RTS_INHERIT", "RTS_DEVICE", - "RTS_STAT_DEV", "RTS_REDIR", "RTS_RIP", - "RTS_OSPF", "RTS_OSPF_IA", "RTS_OSPF_EXT1", - "RTS_OSPF_EXT2", "RTS_BGP", "RTS_PIPE", "RTS_BABEL" }; static char *rtd[] = { "", " DEV", " HOLE", " UNREACH", " PROHIBIT" }; - debug("uc=%d %s %s h=%04x", - a->uc, rts[a->source], - rtd[a->dest], a->hash_key); + debug("uc=%d %s h=%04x", + a->uc, rtd[a->dest], a->hash_key); if (!a->cached) debug(" !CACHED"); if (a->dest == RTD_UNICAST) @@ -1441,8 +1450,6 @@ rta_dump_all(void) void rta_show(struct cli *c, rta *a) { - cli_printf(c, -1008, "\tType: %s", rta_src_names[a->source]); - for(ea_list *eal = a->eattrs; eal; eal=eal->next) for(int i=0; i<eal->count; i++) ea_show(c, &eal->attrs[i]); @@ -1476,6 +1483,7 @@ rta_init(void) ea_register_init(&ea_gen_preference); ea_register_init(&ea_gen_igp_metric); ea_register_init(&ea_gen_from); + ea_register_init(&ea_gen_source); } /* diff --git a/nest/rt-dev.c b/nest/rt-dev.c index ffd5afd5..af6506f6 100644 --- a/nest/rt-dev.c +++ b/nest/rt-dev.c @@ -83,12 +83,12 @@ dev_ifa_notify(struct proto *P, uint flags, struct ifa *ad) struct rte_src *src = rt_get_source(P, ad->iface->index); rta a0 = { - .source = RTS_DEVICE, .dest = RTD_UNICAST, .nh.iface = ad->iface, }; ea_set_attr_u32(&a0.eattrs, &ea_gen_preference, 0, c->preference); + ea_set_attr_u32(&a0.eattrs, &ea_gen_source, 0, RTS_DEVICE); a = rta_lookup(&a0); e = rte_get_temp(a, src); diff --git a/nest/rt-table.c b/nest/rt-table.c index e8b04e0b..4f119ac0 100644 --- a/nest/rt-table.c +++ b/nest/rt-table.c @@ -2588,7 +2588,7 @@ rt_flowspec_check(rtable *tab_ip, rtable *tab_flow, const net_addr *n, rta *a, i trie_add_prefix(tab_flow->flowspec_trie, &dst, (nb ? nb->n.addr->pxlen : 0), max_pxlen); /* No best-match BGP route -> no flowspec */ - if (!rb || (rb->attrs->source != RTS_BGP)) + if (!rb || (rt_get_source_attr(rb) != RTS_BGP)) return 0; /* Find ORIGINATOR_ID values */ @@ -2620,7 +2620,7 @@ rt_flowspec_check(rtable *tab_ip, rtable *tab_flow, const net_addr *n, rta *a, i continue; rte *rc = nc->routes; - if (rc->attrs->source != RTS_BGP) + if (rt_get_source_attr(rc) != RTS_BGP) return 0; if (rta_get_first_asn(rc->attrs) != asn_b) @@ -2637,7 +2637,7 @@ static rte * rt_flowspec_update_rte(rtable *tab, rte *r) { #ifdef CONFIG_BGP - if (r->attrs->source != RTS_BGP) + if (rt_get_source_attr(r) != RTS_BGP) return NULL; struct bgp_channel *bc = (struct bgp_channel *) r->sender; @@ -3471,7 +3471,7 @@ rt_get_igp_metric(rte *rt) if (ea) return ea->u.data; - if (rt->attrs->source == RTS_DEVICE) + if (rt_get_source_attr(rt) == RTS_DEVICE) return 0; if (rt->src->proto->rte_igp_metric) |