xref: /aosp_15_r20/external/iproute2/lib/mpls_ntop.c (revision de1e4e894b0c224df933550f0afdecc354b238c4)
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