huangcm
2024-12-18 9d29be7f7249789d6ffd0440067187a9f040c2cd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <linux/mpls.h>
 
#include "utils.h"
 
 
static int mpls_pton1(const char *name, struct mpls_label *addr,
             unsigned int maxlabels)
{
   char *endp;
   unsigned count;
 
   for (count = 0; count < maxlabels; count++) {
       unsigned long label;
 
       label = strtoul(name, &endp, 0);
       /* Fail when the label value is out or range */
       if (label >= (1 << 20))
           return 0;
 
       if (endp == name) /* no digits */
           return 0;
 
       addr->entry = htonl(label << MPLS_LS_LABEL_SHIFT);
       if (*endp == '\0') {
           addr->entry |= htonl(1 << MPLS_LS_S_SHIFT);
           return 1;
       }
 
       /* Bad character in the address */
       if (*endp != '/')
           return 0;
 
       name = endp + 1;
       addr += 1;
   }
   /* The address was too long */
   fprintf(stderr, "Error: too many labels.\n");
   return 0;
}
 
int mpls_pton(int af, const char *src, void *addr, size_t alen)
{
   unsigned int maxlabels = alen / sizeof(struct mpls_label);
   int err;
 
   switch(af) {
   case AF_MPLS:
       errno = 0;
       err = mpls_pton1(src, (struct mpls_label *)addr, maxlabels);
       break;
   default:
       errno = EAFNOSUPPORT;
       err = -1;
   }
 
   return err;
}