aboutsummaryrefslogtreecommitdiffstats
path: root/proto/static
diff options
context:
space:
mode:
authorJan Moskyto Matejka <mq@ucw.cz>2016-08-09 14:47:51 +0200
committerJan Moskyto Matejka <mq@ucw.cz>2016-12-22 21:38:33 +0100
commitd47c3d64b2733baea756f1bb37ef09f10d7f9644 (patch)
tree8812e0275fb076e0a0b3cf53b876b651ca29e7d7 /proto/static
parentd14f8c3c45f7e33a7e54ebc0d45bdb0295d70301 (diff)
downloadbird-d47c3d64b2733baea756f1bb37ef09f10d7f9644.tar.gz
MPLS: Label stack concatenation for recursive routes
Diffstat (limited to 'proto/static')
-rw-r--r--proto/static/config.Y7
-rw-r--r--proto/static/static.c6
2 files changed, 11 insertions, 2 deletions
diff --git a/proto/static/config.Y b/proto/static/config.Y
index a461bd27..2fb54448 100644
--- a/proto/static/config.Y
+++ b/proto/static/config.Y
@@ -105,7 +105,12 @@ stat_route:
this_srt->dest = RTDX_RECURSIVE;
this_srt->via = $3;
}
-
+ | stat_route0 RECURSIVE ipa MPLS label_stack {
+ this_srt->dest = RTDX_RECURSIVE;
+ this_srt->via = $3;
+ this_srt->label_count = $5[0];
+ this_srt->label_stack = &($5[1]);
+ }
| stat_route0 DROP { this_srt->dest = RTD_BLACKHOLE; }
| stat_route0 REJECT { this_srt->dest = RTD_UNREACHABLE; }
| stat_route0 BLACKHOLE { this_srt->dest = RTD_BLACKHOLE; }
diff --git a/proto/static/static.c b/proto/static/static.c
index 878248c1..3e03708c 100644
--- a/proto/static/static.c
+++ b/proto/static/static.c
@@ -128,7 +128,11 @@ drop:
r->state |= STS_INSTALLED;
if (r->dest == RTDX_RECURSIVE)
- rta_set_recursive_next_hop(p->main_channel->table, ap, p_igp_table(p), r->via, IPA_NONE);
+ {
+ ap->nh.labels_append = ap->nh.labels = r->label_count;
+ memcpy(ap->nh.label, r->label_stack, r->label_count * sizeof(u32));
+ rta_set_recursive_next_hop(p->main_channel->table, ap, p_igp_table(p), r->via, IPA_NONE);
+ }
/* We skip rta_lookup() here */