From 036fdaad9f341e1bd380d2eb6de048b49486f912 Mon Sep 17 00:00:00 2001 From: Donald Sharp Date: Wed, 18 Apr 2018 07:06:11 -0400 Subject: [PATCH] lib, zebra: Move label conversion strings to lib The mpls_label2str and mpls_str2label functions should not be zebra exclusive functions. Move them to lib/mpls.c Signed-off-by: Donald Sharp --- lib/mpls.c | 100 +++++++++++++++++++++++++++++++++++++++++++++ lib/mpls.h | 11 +++++ lib/subdir.am | 1 + zebra/zebra_mpls.c | 77 ---------------------------------- zebra/zebra_mpls.h | 12 ------ 5 files changed, 112 insertions(+), 89 deletions(-) create mode 100644 lib/mpls.c diff --git a/lib/mpls.c b/lib/mpls.c new file mode 100644 index 0000000000..759fe1206d --- /dev/null +++ b/lib/mpls.c @@ -0,0 +1,100 @@ +/* + * mpls functions + * + * Copyright (C) 2018 Cumulus Networks, Inc. + * Donald Sharp + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; see the file COPYING; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#include +#include +#include + +/* + * String to label conversion, labels separated by '/'. + * + * @param label_str labels separated by / + * @param num_labels number of labels; zero if conversion was unsuccessful + * @param labels preallocated mpls_label_t array of size MPLS_MAX_LABELS; only + * modified if the conversion succeeded + * @return 0 on success + * -1 if the string could not be parsed as integers + * -2 if a label was inside the reserved range (0-15) + * -3 if the number of labels given exceeds MPLS_MAX_LABELS + */ +int mpls_str2label(const char *label_str, uint8_t *num_labels, + mpls_label_t *labels) +{ + char *ostr; // copy of label string (start) + char *lstr; // copy of label string + char *nump; // pointer to next segment + char *endp; // end pointer + int i; // for iterating label_str + int rc; // return code + mpls_label_t pl[MPLS_MAX_LABELS]; // parsed labels + + /* labels to zero until we have a successful parse */ + ostr = lstr = XSTRDUP(MTYPE_TMP, label_str); + *num_labels = 0; + rc = 0; + + for (i = 0; i < MPLS_MAX_LABELS && lstr && !rc; i++) { + nump = strsep(&lstr, "/"); + pl[i] = strtoul(nump, &endp, 10); + + /* format check */ + if (*endp != '\0') + rc = -1; + /* validity check */ + else if (!IS_MPLS_UNRESERVED_LABEL(pl[i])) + rc = -2; + } + + /* excess labels */ + if (!rc && i == MPLS_MAX_LABELS && lstr) + rc = -3; + + if (!rc) { + *num_labels = i; + memcpy(labels, pl, *num_labels * sizeof(mpls_label_t)); + } + + XFREE(MTYPE_TMP, ostr); + + return rc; +} + +/* + * Label to string conversion, labels in string separated by '/'. + */ +char *mpls_label2str(uint8_t num_labels, mpls_label_t *labels, char *buf, + int len, int pretty) +{ + char label_buf[BUFSIZ]; + int i; + + buf[0] = '\0'; + for (i = 0; i < num_labels; i++) { + if (i != 0) + strlcat(buf, "/", len); + if (pretty) + label2str(labels[i], label_buf, sizeof(label_buf)); + else + snprintf(label_buf, sizeof(label_buf), "%u", labels[i]); + strlcat(buf, label_buf, len); + } + + return buf; +} diff --git a/lib/mpls.h b/lib/mpls.h index 9e5d7e508d..ff6f1d6c98 100644 --- a/lib/mpls.h +++ b/lib/mpls.h @@ -196,5 +196,16 @@ static inline char *label2str(mpls_label_t label, char *buf, size_t len) } } +/* + * String to label conversion, labels separated by '/'. + */ +int mpls_str2label(const char *label_str, uint8_t *num_labels, + mpls_label_t *labels); + +/* + * Label to string conversion, labels in string separated by '/'. + */ +char *mpls_label2str(uint8_t num_labels, mpls_label_t *labels, char *buf, + int len, int pretty); #endif diff --git a/lib/subdir.am b/lib/subdir.am index 0319f7764e..3b469d4524 100644 --- a/lib/subdir.am +++ b/lib/subdir.am @@ -41,6 +41,7 @@ lib_libfrr_la_SOURCES = \ lib/memory.c \ lib/memory_vty.c \ lib/module.c \ + lib/mpls.c \ lib/network.c \ lib/nexthop.c \ lib/netns_linux.c \ diff --git a/zebra/zebra_mpls.c b/zebra/zebra_mpls.c index 3cc1848ee3..7df03efc10 100644 --- a/zebra/zebra_mpls.c +++ b/zebra/zebra_mpls.c @@ -1722,83 +1722,6 @@ void kernel_lsp_pass_fail(zebra_lsp_t *lsp, enum southbound_results res) } } -/* - * String to label conversion, labels separated by '/'. - * - * @param label_str labels separated by / - * @param num_labels number of labels; zero if conversion was unsuccessful - * @param labels preallocated mpls_label_t array of size MPLS_MAX_LABELS; only - * modified if the conversion succeeded - * @return 0 on success - * -1 if the string could not be parsed as integers - * -2 if a label was inside the reserved range (0-15) - * -3 if the number of labels given exceeds MPLS_MAX_LABELS - */ -int mpls_str2label(const char *label_str, uint8_t *num_labels, - mpls_label_t *labels) -{ - char *ostr; // copy of label string (start) - char *lstr; // copy of label string - char *nump; // pointer to next segment - char *endp; // end pointer - int i; // for iterating label_str - int rc; // return code - mpls_label_t pl[MPLS_MAX_LABELS]; // parsed labels - - /* labels to zero until we have a successful parse */ - ostr = lstr = XSTRDUP(MTYPE_TMP, label_str); - *num_labels = 0; - rc = 0; - - for (i = 0; i < MPLS_MAX_LABELS && lstr && !rc; i++) { - nump = strsep(&lstr, "/"); - pl[i] = strtoul(nump, &endp, 10); - - /* format check */ - if (*endp != '\0') - rc = -1; - /* validity check */ - else if (!IS_MPLS_UNRESERVED_LABEL(pl[i])) - rc = -2; - } - - /* excess labels */ - if (!rc && i == MPLS_MAX_LABELS && lstr) - rc = -3; - - if (!rc) { - *num_labels = i; - memcpy(labels, pl, *num_labels * sizeof(mpls_label_t)); - } - - XFREE(MTYPE_TMP, ostr); - - return rc; -} - -/* - * Label to string conversion, labels in string separated by '/'. - */ -char *mpls_label2str(uint8_t num_labels, mpls_label_t *labels, char *buf, - int len, int pretty) -{ - char label_buf[BUFSIZ]; - int i; - - buf[0] = '\0'; - for (i = 0; i < num_labels; i++) { - if (i != 0) - strlcat(buf, "/", len); - if (pretty) - label2str(labels[i], label_buf, sizeof(label_buf)); - else - snprintf(label_buf, sizeof(label_buf), "%u", labels[i]); - strlcat(buf, label_buf, len); - } - - return buf; -} - /* * Install dynamic LSP entry. */ diff --git a/zebra/zebra_mpls.h b/zebra/zebra_mpls.h index 20c7339316..98905a2831 100644 --- a/zebra/zebra_mpls.h +++ b/zebra/zebra_mpls.h @@ -163,18 +163,6 @@ struct zebra_fec_t_ { /* Function declarations. */ -/* - * String to label conversion, labels separated by '/'. - */ -int mpls_str2label(const char *label_str, uint8_t *num_labels, - mpls_label_t *labels); - -/* - * Label to string conversion, labels in string separated by '/'. - */ -char *mpls_label2str(uint8_t num_labels, mpls_label_t *labels, char *buf, - int len, int pretty); - /* * Add/update global label block. */ -- 2.39.5