version 1.16, 2008/12/15 21:18:37 |
version 1.17, 2009/01/08 12:52:36 |
|
|
char *any_ntoa(const struct sockaddr *); |
char *any_ntoa(const struct sockaddr *); |
char *link_print(struct sockaddr *); |
char *link_print(struct sockaddr *); |
char *label_print_op(u_int32_t); |
char *label_print_op(u_int32_t); |
char *label_print(struct sockaddr *); |
char *label_print(struct sockaddr *, struct sockaddr *); |
|
|
#define ROUNDUP(a) \ |
#define ROUNDUP(a) \ |
((a) > 0 ? (1 + (((a) - 1) | (sizeof(long) - 1))) : sizeof(long)) |
((a) > 0 ? (1 + (((a) - 1) | (sizeof(long) - 1))) : sizeof(long)) |
|
|
void p_protocol(struct sadb_protocol *, struct sockaddr *, struct |
void p_protocol(struct sadb_protocol *, struct sockaddr *, struct |
sadb_protocol *, int); |
sadb_protocol *, int); |
void p_sockaddr(struct sockaddr *, struct sockaddr *, int, int); |
void p_sockaddr(struct sockaddr *, struct sockaddr *, int, int); |
|
void p_sockaddr_mpls(struct sockaddr *, struct sockaddr *, int, int); |
void p_flags(int, char *); |
void p_flags(int, char *); |
char *routename4(in_addr_t); |
char *routename4(in_addr_t); |
char *routename6(struct sockaddr_in6 *); |
char *routename6(struct sockaddr_in6 *); |
|
|
return; |
return; |
|
|
p_sockaddr(sa, mask, rtm->rtm_flags, WID_DST(sa->sa_family)); |
p_sockaddr(sa, mask, rtm->rtm_flags, WID_DST(sa->sa_family)); |
|
p_sockaddr_mpls(sa, rti_info[RTAX_SRC], rtm->rtm_flags, |
|
WID_DST(sa->sa_family)); |
|
|
p_sockaddr(rti_info[RTAX_GATEWAY], NULL, RTF_HOST, |
p_sockaddr(rti_info[RTAX_GATEWAY], NULL, RTF_HOST, |
WID_GW(sa->sa_family)); |
WID_GW(sa->sa_family)); |
p_flags(rtm->rtm_flags, "%-6.6s "); |
p_flags(rtm->rtm_flags, "%-6.6s "); |
|
|
break; |
break; |
} |
} |
case AF_MPLS: |
case AF_MPLS: |
if (flags & RTF_HOST || mask == NULL) |
return; |
cp = routename(sa); |
|
else |
|
cp = netname(sa, mask); |
|
|
|
snprintf(cp, MAXHOSTNAMELEN, "%s %s", cp, |
|
label_print_op(flags)); |
|
|
|
break; |
|
default: |
default: |
if ((flags & RTF_HOST) || mask == NULL) |
if ((flags & RTF_HOST) || mask == NULL) |
cp = routename(sa); |
cp = routename(sa); |
|
|
} |
} |
} |
} |
|
|
|
static char line[MAXHOSTNAMELEN]; |
|
static char domain[MAXHOSTNAMELEN]; |
|
|
void |
void |
|
p_sockaddr_mpls(struct sockaddr *in, struct sockaddr *out, int flags, int width) |
|
{ |
|
char *cp; |
|
|
|
if (in->sa_family != AF_MPLS) |
|
return; |
|
|
|
if (flags & MPLS_OP_POP) |
|
cp = label_print(in, NULL); |
|
else |
|
cp = label_print(in, out); |
|
|
|
snprintf(cp, MAXHOSTNAMELEN, "%s %s", cp, |
|
label_print_op(flags)); |
|
|
|
printf("%-*s ", width, cp); |
|
} |
|
|
|
void |
p_flags(int f, char *format) |
p_flags(int f, char *format) |
{ |
{ |
char name[33], *flags; |
char name[33], *flags; |
|
|
printf(format, name); |
printf(format, name); |
} |
} |
|
|
static char line[MAXHOSTNAMELEN]; |
|
static char domain[MAXHOSTNAMELEN]; |
|
|
|
char * |
char * |
routename(struct sockaddr *sa) |
routename(struct sockaddr *sa) |
{ |
{ |
|
|
case AF_LINK: |
case AF_LINK: |
return (link_print(sa)); |
return (link_print(sa)); |
case AF_MPLS: |
case AF_MPLS: |
return (label_print(sa)); |
return (label_print(sa, NULL)); |
case AF_UNSPEC: |
case AF_UNSPEC: |
if (sa->sa_len == sizeof(struct sockaddr_rtlabel)) { |
if (sa->sa_len == sizeof(struct sockaddr_rtlabel)) { |
static char name[RTLABEL_LEN]; |
static char name[RTLABEL_LEN]; |
|
|
case AF_LINK: |
case AF_LINK: |
return (link_print(sa)); |
return (link_print(sa)); |
case AF_MPLS: |
case AF_MPLS: |
return (label_print(sa)); |
return (label_print(sa, NULL)); |
default: |
default: |
snprintf(line, sizeof(line), "af %d: %s", |
snprintf(line, sizeof(line), "af %d: %s", |
sa->sa_family, any_ntoa(sa)); |
sa->sa_family, any_ntoa(sa)); |
|
|
} |
} |
|
|
char * |
char * |
label_print(struct sockaddr *sa) |
label_print(struct sockaddr *in, struct sockaddr *out) |
{ |
{ |
struct sockaddr_mpls *smpls = (struct sockaddr_mpls *)sa; |
struct sockaddr_mpls *insmpls = (struct sockaddr_mpls *)in; |
|
struct sockaddr_mpls *outsmpls = (struct sockaddr_mpls *)out; |
char ifname_in[IF_NAMESIZE]; |
char ifname_in[IF_NAMESIZE]; |
char ifname_out[IF_NAMESIZE]; |
char ifname_out[IF_NAMESIZE]; |
char *in_label; |
char *in_label; |
char *out_label; |
char *out_label; |
|
|
if (asprintf(&in_label, "%u", |
if (asprintf(&in_label, "%u", |
ntohl(smpls->smpls_in_label) >> MPLS_LABEL_OFFSET) == -1) |
ntohl(insmpls->smpls_label) >> MPLS_LABEL_OFFSET) == -1) |
err(1, NULL); |
err(1, NULL); |
|
|
if (asprintf(&out_label, "%u", |
if (outsmpls) { |
ntohl(smpls->smpls_out_label) >> MPLS_LABEL_OFFSET) == -1) |
if (asprintf(&out_label, "%u", |
err(1, NULL); |
ntohl(outsmpls->smpls_label) >> MPLS_LABEL_OFFSET) == -1) |
|
err(1, NULL); |
|
} else { |
|
if (asprintf(&out_label, "-") == -1) |
|
err(1, NULL); |
|
} |
|
|
(void)snprintf(line, sizeof(line), "%-16s %-10s", in_label, |
(void)snprintf(line, sizeof(line), "%-16s %-10s", in_label, |
out_label); |
out_label); |