1 #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
mpls_ntop1(const struct mpls_label * addr,char * buf,size_t buflen)9 static 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
mpls_ntop(int af,const void * addr,char * buf,size_t buflen)37 const 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 }
49