blob: 945d6d5e453516419ef2bd2587e9ffe80f4c6a4d [file] [log] [blame]
Eric W. Biedermandacc5d42015-03-15 14:53:45 -05001#include <errno.h>
2#include <string.h>
3#include <sys/types.h>
4#include <netinet/in.h>
5#include <linux/mpls.h>
6
7#include "utils.h"
8
9static const char *mpls_ntop1(const struct mpls_label *addr, char *buf, size_t buflen)
10{
11 size_t destlen = buflen;
12 char *dest = buf;
13 int count;
14
15 for (count = 0; count < MPLS_MAX_LABELS; count++) {
16 uint32_t entry = ntohl(addr[count].entry);
17 uint32_t label = (entry & MPLS_LS_LABEL_MASK) >> MPLS_LS_LABEL_SHIFT;
18 int len = snprintf(dest, destlen, "%u", label);
19
20 /* Is this the end? */
21 if (entry & MPLS_LS_S_MASK)
22 return buf;
23
24
25 dest += len;
26 destlen -= len;
27 if (destlen) {
28 *dest = '/';
29 dest++;
30 destlen--;
31 }
32 }
33 errno = -E2BIG;
34 return NULL;
35}
36
37const char *mpls_ntop(int af, const void *addr, char *buf, size_t buflen)
38{
39 switch(af) {
40 case AF_MPLS:
41 errno = 0;
42 return mpls_ntop1((struct mpls_label *)addr, buf, buflen);
43 default:
44 errno = EAFNOSUPPORT;
45 }
46
47 return NULL;
48}