diff options
| author | Renato Westphal <renato@openbsd.org> | 2017-06-02 22:53:53 -0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2017-06-02 22:53:53 -0300 |
| commit | e91163e78cab7049f9bd87c7d22ac0b33c950f5f (patch) | |
| tree | 9695ca3211f5d5f193750c7ad2bafe78b5f909d4 /zebra/zebra_mpls.c | |
| parent | 2cfaf92bc86238d1baaa8f9b41f768383fb7c960 (diff) | |
| parent | 6feb1a21affd126552228bf24f79248e3c27082c (diff) | |
Merge pull request #647 from qlyoung/zebra-mpls-error-messages
zebra: more informative error messages & help strings for mpls labels
Diffstat (limited to 'zebra/zebra_mpls.c')
| -rw-r--r-- | zebra/zebra_mpls.c | 65 |
1 files changed, 40 insertions, 25 deletions
diff --git a/zebra/zebra_mpls.c b/zebra/zebra_mpls.c index db02a025f9..fb46184b62 100644 --- a/zebra/zebra_mpls.c +++ b/zebra/zebra_mpls.c @@ -1734,44 +1734,59 @@ mpls_processq_init (struct zebra_t *zebra) /* * 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, u_int8_t *num_labels, mpls_label_t *labels) { - char *endp; - int i; + 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; - for (i = 0; i < MPLS_MAX_LABELS; i++) - { - mpls_label_t label; + rc = 0; - label = strtoul(label_str, &endp, 0); - - /* validity checks */ - if (endp == label_str) - return -1; - - if (!IS_MPLS_UNRESERVED_LABEL(label)) - return -1; + for (i = 0; i < MPLS_MAX_LABELS && lstr && !rc; i++) + { + nump = strsep (&lstr, "/"); + pl[i] = strtoul(nump, &endp, 10); - labels[i] = label; - if (*endp == '\0') - { - *num_labels = i + 1; - return 0; - } + /* format check */ + if (*endp != '\0') + rc = -1; + /* validity check */ + else if (!IS_MPLS_UNRESERVED_LABEL(pl[i])) + rc = -2; + } - /* Check separator. */ - if (*endp != '/') - return -1; + /* excess labels */ + if (!rc && i == MPLS_MAX_LABELS && lstr) + rc = -3; - label_str = endp + 1; + if (!rc) + { + *num_labels = i + 1; + memcpy (labels, pl, *num_labels * sizeof (mpls_label_t)); } - /* Too many labels. */ - return -1; + XFREE (MTYPE_TMP, ostr); + + return rc; } /* |
