Skip to contentSkip to conversation

ip: mpls: fix printing of mpls labels

PATCH In review David Ahern 3 participants 4 messages May 9, 2017 – May 11, 2017

Subsystems (3)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 ip: mpls: fix printing of mpls labels

If the kernel returns more labels than iproute2 expects, none of the labels are printed and (null) is shown instead:

    $ ip -f mpls ro ls
    101 as to (null) via inet 172.16.2.2 dev virt12
    201 as to 202/203 via inet6 2001:db8:2::2 dev virt12

Remove the use of MPLS_MAX_LABELS and rely on buffer length that is passed to mpls_ntop. With this change ip can print the label stack returned by the kernel up to 255 characters (limit is due to size of buf passed in) which amounts to 31 labels with a separator.

With this change the above is:

    $ ip/ip -f mpls ro ls
    101 as to 102/103/104/105/106/107/108/109/110 via inet 172.16.2.2 dev virt12
---
 lib/mpls_ntop.c | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)
lib/mpls_ntop.c +6 -4
index 945d6d5e..5902f503 100644
@@ -10,18 +10,20 @@ static const char *mpls_ntop1(const struct mpls_label *addr, char *buf, size_t b
 {
 	size_t destlen = buflen;
 	char *dest = buf;
-	int count;
+	int count = 0;
 
-	for (count = 0; count < MPLS_MAX_LABELS; count++) {
-		uint32_t entry = ntohl(addr[count].entry);
+	while (1) {
+		uint32_t entry = ntohl(addr[count++].entry);
 		uint32_t label = (entry & MPLS_LS_LABEL_MASK) >> MPLS_LS_LABEL_SHIFT;
 		int len = snprintf(dest, destlen, "%u", label);
 
+		if (len >= destlen)
+			break;
+
 		/* Is this the end? */
 		if (entry & MPLS_LS_S_MASK)
 			return buf;
 
-
 		dest += len;
 		destlen -= len;
 		if (destlen) {
Signature · 1 line
2.11.0 (Apple Git-81)
Reviewed-by on v1 1/1
#1 lore raw
Quoted 11 lines · David Ahern

If the kernel returns more labels than iproute2 expects, none of the labels are printed and (null) is shown instead:

    $ ip -f mpls ro ls
    101 as to (null) via inet 172.16.2.2 dev virt12
    201 as to 202/203 via inet6 2001:db8:2::2 dev virt12

Remove the use of MPLS_MAX_LABELS and rely on buffer length that is passed to mpls_ntop. With this change ip can print the label stack returned by the kernel up to 255 characters (limit is due to size of buf passed in) which amounts to 31 labels with a separator.

Quoted 5 lines

With this change the above is:

    $ ip/ip -f mpls ro ls
    101 as to 102/103/104/105/106/107/108/109/110 via inet 172.16.2.2 dev virt12
#2 lore raw
In reply to David Ahern
Quoted 11 lines · On Mon, 8 May 2017 23:04:13 -0700 David Ahern <[email protected]> wrote:

If the kernel returns more labels than iproute2 expects, none of the labels are printed and (null) is shown instead:

    $ ip -f mpls ro ls
    101 as to (null) via inet 172.16.2.2 dev virt12
    201 as to 202/203 via inet6 2001:db8:2::2 dev virt12

Remove the use of MPLS_MAX_LABELS and rely on buffer length that is passed to mpls_ntop. With this change ip can print the label stack returned by the kernel up to 255 characters (limit is due to size of buf passed in) which amounts to 31 labels with a separator.

Quoted 5 lines

With this change the above is:

    $ ip/ip -f mpls ro ls
    101 as to 102/103/104/105/106/107/108/109/110 via inet 172.16.2.2 dev virt12

Much better. Applied thanks.

#3 lore raw
Quoted 14 lines · Stephen Hemminger
Quoted 11 lines · On Mon, 8 May 2017 23:04:13 -0700 David Ahern <[email protected]> wrote:

If the kernel returns more labels than iproute2 expects, none of the labels are printed and (null) is shown instead:

    $ ip -f mpls ro ls
    101 as to (null) via inet 172.16.2.2 dev virt12
    201 as to 202/203 via inet6 2001:db8:2::2 dev virt12

Remove the use of MPLS_MAX_LABELS and rely on buffer length that is passed to mpls_ntop. With this change ip can print the label stack returned by the kernel up to 255 characters (limit is due to size of buf passed in) which amounts to 31 labels with a separator.

Quoted 8 lines
Quoted 5 lines

With this change the above is:

    $ ip/ip -f mpls ro ls
    101 as to 102/103/104/105/106/107/108/109/110 via inet 172.16.2.2 dev virt12

Much better. Applied thanks.

This is only one-half of the solution; the install side is harder. I'll send something in the next few days.