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 <sys/socket.h>
30 #include <netinet/icmp6.h>
33 /* prefix flags; see kernel's net/ipv6/addrconf.c and include/net/if_inet6.h */
34 #define IF_PREFIX_ONLINK 0x01
35 #define IF_PREFIX_AUTOCONF 0x02
37 int print_prefix(const struct sockaddr_nl
*who
, struct nlmsghdr
*n
, void *arg
)
39 FILE *fp
= (FILE*)arg
;
40 struct prefixmsg
*prefix
= NLMSG_DATA(n
);
41 int len
= n
->nlmsg_len
;
42 struct rtattr
* tb
[RTA_MAX
+1];
43 int family
= preferred_family
;
45 if (n
->nlmsg_type
!= RTM_NEWPREFIX
) {
46 fprintf(stderr
, "Not a prefix: %08x %08x %08x\n",
47 n
->nlmsg_len
, n
->nlmsg_type
, n
->nlmsg_flags
);
51 len
-= NLMSG_LENGTH(sizeof(*prefix
));
53 fprintf(stderr
, "BUG: wrong nlmsg len %d\n", len
);
57 if (family
== AF_UNSPEC
)
59 if (family
!= AF_INET6
)
62 if (prefix
->prefix_family
!= AF_INET6
) {
63 fprintf(stderr
, "incorrect protocol family: %d\n", prefix
->prefix_family
);
66 if (prefix
->prefix_type
!= ND_OPT_PREFIX_INFORMATION
) {
67 fprintf(stderr
, "wrong ND type %d\n", prefix
->prefix_type
);
71 parse_rtattr(tb
, RTA_MAX
, RTM_RTA(prefix
), len
);
73 fprintf(fp
, "prefix ");
75 if (tb
[PREFIX_ADDRESS
]) {
79 pfx
= (struct in6_addr
*)RTA_DATA(tb
[PREFIX_ADDRESS
]);
81 memset(abuf
, '\0', sizeof(abuf
));
82 fprintf(fp
, "%s", rt_addr_n2a(family
, sizeof(*pfx
), pfx
,
85 fprintf(fp
, "/%u ", prefix
->prefix_len
);
87 fprintf(fp
, "dev %s ", ll_index_to_name(prefix
->prefix_ifindex
));
89 if (prefix
->prefix_flags
& IF_PREFIX_ONLINK
)
90 fprintf(fp
, "onlink ");
91 if (prefix
->prefix_flags
& IF_PREFIX_AUTOCONF
)
92 fprintf(fp
, "autoconf ");
94 if (tb
[PREFIX_CACHEINFO
]) {
95 struct prefix_cacheinfo
*pc
;
96 pc
= (struct prefix_cacheinfo
*)RTA_DATA(tb
[PREFIX_CACHEINFO
]);
98 fprintf(fp
, "valid %u ", pc
->valid_time
);
99 fprintf(fp
, "preferred %u ", pc
->preferred_time
);