ripngd: add ECMP support
* Each node in the routing table is changed into a list, holding
the multiple equal-cost paths.
* If one of the multiple entries gets less-preferred (greater
metric or greater distance), it will be directly deleted instead
of starting a garbage-collection timer for it.
The garbage-collection timer is started only when the last entry
in the list gets INFINITY.
* Some new functions are used to maintain the ECMP list. And hence
ripng_route_process(), ripng_redistribute_add() and ripng_timeout()
are significantly simplified.
* ripng_zebra_ipv6_add() and ripng_zebra_ipv6_delete() now can share
the common code. The common part is moved to ripng_zebra_ipv6_send().
Signed-off-by: Feng Lu <lu.feng@6wind.com>
Reviewed-by: Alain Ritoux <alain.ritoux@6wind.com>
Signed-off-by: Nicolas Dichtel <nicolas.dichtel@6wind.com>
Acked-by: Vincent Jardin <vincent.jardin@6wind.com>
Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
diff --git a/ripngd/ripng_route.h b/ripngd/ripng_route.h
index 2f5b757..fe65c88 100644
--- a/ripngd/ripng_route.h
+++ b/ripngd/ripng_route.h
@@ -48,7 +48,10 @@
struct ripng_info *rinfo);
extern void ripng_aggregate_decrement (struct route_node *rp,
struct ripng_info *rinfo);
+extern void ripng_aggregate_decrement_list (struct route_node *rp,
+ struct list *list);
extern int ripng_aggregate_add (struct prefix *p);
extern int ripng_aggregate_delete (struct prefix *p);
+extern void ripng_aggregate_free (struct ripng_aggregate *aggregate);
#endif /* _ZEBRA_RIPNG_ROUTE_H */