diff options
author | Jan Moskyto Matejka <mq@ucw.cz> | 2016-08-09 14:47:51 +0200 |
---|---|---|
committer | Jan Moskyto Matejka <mq@ucw.cz> | 2016-12-22 21:38:33 +0100 |
commit | d47c3d64b2733baea756f1bb37ef09f10d7f9644 (patch) | |
tree | 8812e0275fb076e0a0b3cf53b876b651ca29e7d7 /proto | |
parent | d14f8c3c45f7e33a7e54ebc0d45bdb0295d70301 (diff) |
MPLS: Label stack concatenation for recursive routes
Diffstat (limited to 'proto')
-rw-r--r-- | proto/static/config.Y | 7 | ||||
-rw-r--r-- | proto/static/static.c | 6 |
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 */ |