2 * Copyright (C)2005 USAGI/WIDE Project
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 * based on ip.c, iproute.c
23 * Masahide NAKAMURA @USAGI
29 #include <netinet/icmp6.h>
32 /* prefix flags; see kernel's net/ipv6/addrconf.c and include/net/if_inet6.h */
33 #define IF_PREFIX_ONLINK 0x01
34 #define IF_PREFIX_AUTOCONF 0x02
36 int print_prefix(const struct sockaddr_nl
*who
, struct nlmsghdr
*n
, void *arg
)
38 FILE *fp
= (FILE*)arg
;
39 struct prefixmsg
*prefix
= NLMSG_DATA(n
);
40 int len
= n
->nlmsg_len
;
41 struct rtattr
* tb
[RTA_MAX
+1];
42 int family
= preferred_family
;
44 if (n
->nlmsg_type
!= RTM_NEWPREFIX
) {
45 fprintf(stderr
, "Not a prefix: %08x %08x %08x\n",
46 n
->nlmsg_len
, n
->nlmsg_type
, n
->nlmsg_flags
);
50 len
-= NLMSG_LENGTH(sizeof(*prefix
));
52 fprintf(stderr
, "BUG: wrong nlmsg len %d\n", len
);
56 if (family
== AF_UNSPEC
)
58 if (family
!= AF_INET6
)
61 if (prefix
->prefix_family
!= AF_INET6
) {
62 fprintf(stderr
, "wrong family %d\n", prefix
->prefix_family
);
65 if (prefix
->prefix_type
!= ND_OPT_PREFIX_INFORMATION
) {
66 fprintf(stderr
, "wrong ND type %d\n", prefix
->prefix_type
);
70 parse_rtattr(tb
, RTA_MAX
, RTM_RTA(prefix
), len
);
72 fprintf(fp
, "prefix ");
74 if (tb
[PREFIX_ADDRESS
]) {
78 pfx
= (struct in6_addr
*)RTA_DATA(tb
[PREFIX_ADDRESS
]);
80 memset(abuf
, '\0', sizeof(abuf
));
81 fprintf(fp
, "%s", rt_addr_n2a(family
, sizeof(*pfx
), pfx
,
84 fprintf(fp
, "/%u ", prefix
->prefix_len
);
86 fprintf(fp
, "dev %s ", ll_index_to_name(prefix
->prefix_ifindex
));
88 if (prefix
->prefix_flags
& IF_PREFIX_ONLINK
)
89 fprintf(fp
, "onlink ");
90 if (prefix
->prefix_flags
& IF_PREFIX_AUTOCONF
)
91 fprintf(fp
, "autoconf ");
93 if (tb
[PREFIX_CACHEINFO
]) {
94 struct prefix_cacheinfo
*pc
;
95 pc
= (struct prefix_cacheinfo
*)tb
[PREFIX_CACHEINFO
];
97 fprintf(fp
, "valid %u ", pc
->valid_time
);
98 fprintf(fp
, "preferred %u ", pc
->preferred_time
);