• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
9 
mpls_pton1(const char * name,struct mpls_label * addr)10 static int mpls_pton1(const char *name, struct mpls_label *addr)
11 {
12 	char *endp;
13 	unsigned count;
14 
15 	for (count = 0; count < MPLS_MAX_LABELS; count++) {
16 		unsigned long label;
17 
18 		label = strtoul(name, &endp, 0);
19 		/* Fail when the label value is out or range */
20 		if (label >= (1 << 20))
21 			return 0;
22 
23 		if (endp == name) /* no digits */
24 			return 0;
25 
26 		addr->entry = htonl(label << MPLS_LS_LABEL_SHIFT);
27 		if (*endp == '\0') {
28 			addr->entry |= htonl(1 << MPLS_LS_S_SHIFT);
29 			return 1;
30 		}
31 
32 		/* Bad character in the address */
33 		if (*endp != '/')
34 			return 0;
35 
36 		name = endp + 1;
37 		addr += 1;
38 	}
39 	/* The address was too long */
40 	return 0;
41 }
42 
mpls_pton(int af,const char * src,void * addr)43 int mpls_pton(int af, const char *src, void *addr)
44 {
45 	int err;
46 
47 	switch(af) {
48 	case AF_MPLS:
49 		errno = 0;
50 		err = mpls_pton1(src, (struct mpls_label *)addr);
51 		break;
52 	default:
53 		errno = EAFNOSUPPORT;
54 		err = -1;
55 	}
56 
57 	return err;
58 }
59