diff options
author | Daniel Walton <dwalton@cumulusnetworks.com> | 2017-05-10 15:42:00 +0200 |
---|---|---|
committer | Donald Sharp <sharpd@cumulusnetworks.com> | 2017-05-10 16:06:47 +0200 |
commit | 4caac24b23148a1ed37dd389b13e4475dc40bb64 (patch) | |
tree | 1ebda6b30cb49a5c6c8c4124b9e06ec78b7e06fc /zebra | |
parent | zebra: ZEBRA_MIN_FEC_LENGTH should be 5 (diff) | |
download | frr-4caac24b23148a1ed37dd389b13e4475dc40bb64.tar.xz frr-4caac24b23148a1ed37dd389b13e4475dc40bb64.zip |
zebra: lsp_install() failed due to ZEBRA_FLAG_SELECTED check
ZEBRA_FLAG_SELECTED hasn't been set yet by the time lsp_install is
called. The call path is:
rib_process -> rib_process_add_fib -> zebra_mpls_lsp_install -> lsp_install
but ZEBRA_FLAG_SELECTED is set in rib_process after it calls
rib_process_add_fib. I can't think of anything that it would hurt to
install the LSP regardless of whether ZEBRA_FLAG_SELECTED is set later.
I also cleaned up some UI (json and display the pretty label names
instead of their numeric values).
Signed-off-by: Daniel Walton <dwalton@cumulusnetworks.com>
Diffstat (limited to 'zebra')
-rw-r--r-- | zebra/zebra_mpls.c | 30 | ||||
-rw-r--r-- | zebra/zebra_mpls.h | 2 | ||||
-rw-r--r-- | zebra/zebra_mpls_null.c | 2 | ||||
-rw-r--r-- | zebra/zebra_vty.c | 23 |
4 files changed, 40 insertions, 17 deletions
diff --git a/zebra/zebra_mpls.c b/zebra/zebra_mpls.c index 76263024c..bb9c913e3 100644 --- a/zebra/zebra_mpls.c +++ b/zebra/zebra_mpls.c @@ -185,10 +185,6 @@ lsp_install (struct zebra_vrf *zvrf, mpls_label_t label, if (!lsp_table) return -1; - /* See if route entry is selected; we really expect only 1 entry here. */ - if (!CHECK_FLAG (rib->flags, ZEBRA_FLAG_SELECTED)) - return 0; - lsp_type = lsp_type_from_rib_type (rib->type); added = changed = 0; @@ -1766,13 +1762,29 @@ mpls_str2label (const char *label_str, u_int8_t *num_labels, */ char * mpls_label2str (u_int8_t num_labels, mpls_label_t *labels, - char *buf, int len) + char *buf, int len, int pretty) { + char *buf_ptr = buf; buf[0] = '\0'; - if (num_labels == 1) - snprintf (buf, len, "%u", labels[0]); - else if (num_labels == 2) - snprintf (buf, len, "%u/%u", labels[0], labels[1]); + + if (pretty) { + if (num_labels == 1) { + label2str(labels[0], buf, len); + } else if (num_labels == 2) { + label2str(labels[0], buf, len); + buf_ptr += strlen(buf); + + snprintf (buf_ptr, len, "/"); + buf_ptr++; + + label2str(labels[1], buf_ptr, len); + } + } else { + if (num_labels == 1) + snprintf (buf, len, "%u", labels[0]); + else if (num_labels == 2) + snprintf (buf, len, "%u/%u", labels[0], labels[1]); + } return buf; } diff --git a/zebra/zebra_mpls.h b/zebra/zebra_mpls.h index e271edd2e..b5a8f3173 100644 --- a/zebra/zebra_mpls.h +++ b/zebra/zebra_mpls.h @@ -184,7 +184,7 @@ mpls_str2label (const char *label_str, u_int8_t *num_labels, */ char * mpls_label2str (u_int8_t num_labels, mpls_label_t *labels, - char *buf, int len); + char *buf, int len, int pretty); /* * Add/update global label block. diff --git a/zebra/zebra_mpls_null.c b/zebra/zebra_mpls_null.c index 168c8d003..0333b6e6b 100644 --- a/zebra/zebra_mpls_null.c +++ b/zebra/zebra_mpls_null.c @@ -32,7 +32,7 @@ int mpls_enabled; char * mpls_label2str (u_int8_t num_labels, mpls_label_t *labels, - char *buf, int len) + char *buf, int len, int pretty) { return NULL; } diff --git a/zebra/zebra_vty.c b/zebra/zebra_vty.c index 1708138d8..186a2d022 100644 --- a/zebra/zebra_vty.c +++ b/zebra/zebra_vty.c @@ -781,9 +781,9 @@ vty_show_ip_route_detail (struct vty *vty, struct route_node *rn, int mcast) /* Label information */ if (nexthop->nh_label && nexthop->nh_label->num_labels) { - vty_out (vty, " label %s", + vty_out (vty, ", label %s", mpls_label2str (nexthop->nh_label->num_labels, - nexthop->nh_label->label, buf, BUFSIZ)); + nexthop->nh_label->label, buf, BUFSIZ, 1)); } vty_out (vty, "%s", VTY_NEWLINE); @@ -803,6 +803,7 @@ vty_show_ip_route (struct vty *vty, struct route_node *rn, struct rib *rib, json_object *json_nexthops = NULL; json_object *json_nexthop = NULL; json_object *json_route = NULL; + json_object *json_labels = NULL; if (json) { @@ -932,6 +933,16 @@ vty_show_ip_route (struct vty *vty, struct route_node *rn, struct rib *rib, break; } + if (nexthop->nh_label && nexthop->nh_label->num_labels) + { + json_labels = json_object_new_array(); + + for (int label_index = 0; label_index < nexthop->nh_label->num_labels; label_index++) + json_object_array_add(json_labels, json_object_new_int(nexthop->nh_label->label[label_index])); + + json_object_object_add(json_nexthop, "labels", json_labels); + } + json_object_array_add(json_nexthops, json_nexthop); } @@ -1030,9 +1041,9 @@ vty_show_ip_route (struct vty *vty, struct route_node *rn, struct rib *rib, /* Label information */ if (nexthop->nh_label && nexthop->nh_label->num_labels) { - vty_out (vty, " label %s", + vty_out (vty, ", label %s", mpls_label2str (nexthop->nh_label->num_labels, - nexthop->nh_label->label, buf, BUFSIZ)); + nexthop->nh_label->label, buf, BUFSIZ, 1)); } if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_BLACKHOLE)) @@ -2319,7 +2330,7 @@ static_config_ipv4 (struct vty *vty, safi_t safi, const char *cmd) if (si->snh_label.num_labels) vty_out (vty, " label %s", mpls_label2str (si->snh_label.num_labels, - si->snh_label.label, buf, sizeof buf)); + si->snh_label.label, buf, sizeof buf, 0)); vty_out (vty, "%s", VTY_NEWLINE); @@ -3812,7 +3823,7 @@ static_config_ipv6 (struct vty *vty) if (si->snh_label.num_labels) vty_out (vty, " label %s", mpls_label2str (si->snh_label.num_labels, - si->snh_label.label, buf, sizeof buf)); + si->snh_label.label, buf, sizeof buf, 0)); vty_out (vty, "%s", VTY_NEWLINE); |