summaryrefslogtreecommitdiff
path: root/nest
diff options
context:
space:
mode:
Diffstat (limited to 'nest')
-rw-r--r--nest/route.h4
-rw-r--r--nest/rt-attr.c6
-rw-r--r--nest/rt-show.c7
-rw-r--r--nest/rt-table.c5
4 files changed, 18 insertions, 4 deletions
diff --git a/nest/route.h b/nest/route.h
index 6c9b00c2..c1a60ccc 100644
--- a/nest/route.h
+++ b/nest/route.h
@@ -366,12 +366,16 @@ struct nexthop {
ip_addr gw; /* Next hop */
struct iface *iface; /* Outgoing interface */
struct nexthop *next;
+ byte flags;
byte weight;
byte labels_orig; /* Number of labels before hostentry was applied */
byte labels; /* Number of all labels */
u32 label[0];
};
+#define RNF_ONLINK 0x1 /* Gateway is onlink regardless of IP ranges */
+
+
struct rte_src {
struct rte_src *next; /* Hash chain */
struct proto *proto; /* Protocol the source is based on */
diff --git a/nest/rt-attr.c b/nest/rt-attr.c
index 1b7f5836..761ba9fe 100644
--- a/nest/rt-attr.c
+++ b/nest/rt-attr.c
@@ -171,7 +171,9 @@ nexthop__same(struct nexthop *x, struct nexthop *y)
{
for (; x && y; x = x->next, y = y->next)
{
- if (!ipa_equal(x->gw, y->gw) || (x->iface != y->iface) || (x->weight != y->weight) || (x->labels != y->labels))
+ if (!ipa_equal(x->gw, y->gw) || (x->iface != y->iface) ||
+ (x->flags != y->flags) || (x->weight != y->weight) ||
+ (x->labels != y->labels))
return 0;
for (int i = 0; i < x->labels; i++)
@@ -193,6 +195,8 @@ nexthop_compare_node(struct nexthop *x, struct nexthop *y)
if (!y)
return -1;
+ /* Should we also compare flags ? */
+
r = ((int) y->weight) - ((int) x->weight);
if (r)
return r;
diff --git a/nest/rt-show.c b/nest/rt-show.c
index 3f5ef04d..afde2810 100644
--- a/nest/rt-show.c
+++ b/nest/rt-show.c
@@ -70,6 +70,7 @@ rt_show_rte(struct cli *c, byte *ia, rte *e, struct rt_show_data *d, ea_list *tm
for (nh = &(a->nh); nh; nh = nh->next)
{
char mpls[MPLS_MAX_LABEL_STACK*12 + 5], *lsp = mpls;
+ char *onlink = (nh->flags & RNF_ONLINK) ? " onlink" : "";
if (nh->labels)
{
@@ -80,9 +81,11 @@ rt_show_rte(struct cli *c, byte *ia, rte *e, struct rt_show_data *d, ea_list *tm
*lsp = '\0';
if (a->nh.next)
- cli_printf(c, -1007, "\tvia %I%s on %s weight %d", nh->gw, mpls, nh->iface->name, nh->weight + 1);
+ cli_printf(c, -1007, "\tvia %I%s on %s%s weight %d",
+ nh->gw, mpls, nh->iface->name, onlink, nh->weight + 1);
else
- cli_printf(c, -1007, "\tvia %I%s on %s", nh->gw, mpls, nh->iface->name);
+ cli_printf(c, -1007, "\tvia %I%s on %s%s",
+ nh->gw, mpls, nh->iface->name, onlink);
}
if (d->verbose)
diff --git a/nest/rt-table.c b/nest/rt-table.c
index 85a951b8..2bb78cf2 100644
--- a/nest/rt-table.c
+++ b/nest/rt-table.c
@@ -1819,7 +1819,10 @@ no_nexthop:
}
}
if (ipa_nonzero(nh->gw))
- nhp->gw = nh->gw; /* Router nexthop */
+ {
+ nhp->gw = nh->gw; /* Router nexthop */
+ nhp->flags |= (nh->flags & RNF_ONLINK);
+ }
else if (ipa_nonzero(he->link))
nhp->gw = he->link; /* Device nexthop with link-local address known */
else