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