11#include <linux/mpls.h>
13#include <netlink/netlink-compat.h>
17static const char *mpls_ntop1(
const struct mpls_label *addr,
18 char *buf,
size_t buflen)
20 size_t destlen = buflen;
25 uint32_t entry = ntohl(addr[count++].entry);
26 uint32_t label = (entry & MPLS_LS_LABEL_MASK) >> MPLS_LS_LABEL_SHIFT;
27 int len = snprintf(dest, destlen,
"%u", label);
33 if (entry & MPLS_LS_S_MASK)
49const char *mpls_ntop(
int af,
const void *addr,
char *buf,
size_t buflen)
54 return mpls_ntop1((
struct mpls_label *)addr, buf, buflen);
61static int mpls_pton1(
const char *name,
struct mpls_label *addr,
62 unsigned int maxlabels)
67 for (count = 0; count < maxlabels; count++) {
70 label = strtoul(name, &endp, 0);
72 if (label >= (1 << 20))
78 addr->entry = htonl(label << MPLS_LS_LABEL_SHIFT);
80 addr->entry |= htonl(1 << MPLS_LS_S_SHIFT);
81 return (count + 1) *
sizeof(
struct mpls_label);
96int mpls_pton(
int af,
const char *src,
void *addr,
size_t alen)
98 unsigned int maxlabels = alen /
sizeof(
struct mpls_label);
104 err = mpls_pton1(src, (
struct mpls_label *)addr, maxlabels);
107 errno = EAFNOSUPPORT;