12 #include <netlink-private/netlink.h>
13 #include <netlink/netlink.h>
14 #include <netlink/attr.h>
15 #include <netlink/route/rtnl.h>
16 #include <netlink-private/route/link/api.h>
21 struct ifla_cacheinfo i6_cacheinfo;
22 uint32_t i6_conf[DEVCONF_MAX];
25 static void *inet6_alloc(
struct rtnl_link *link)
30 static void *inet6_clone(
struct rtnl_link *link,
void *data)
34 if ((i6 = inet6_alloc(link)))
35 memcpy(i6, data,
sizeof(*i6));
40 static void inet6_free(
struct rtnl_link *link,
void *data)
45 static struct nla_policy inet6_policy[IFLA_INET6_MAX+1] = {
47 [IFLA_INET6_CACHEINFO] = { .minlen =
sizeof(
struct ifla_cacheinfo) },
48 [IFLA_INET6_CONF] = { .minlen = DEVCONF_MAX * 4 },
49 [IFLA_INET6_STATS] = { .minlen = __IPSTATS_MIB_MAX * 8 },
50 [IFLA_INET6_ICMP6STATS] = { .minlen = __ICMP6_MIB_MAX * 8 },
53 static int inet6_parse_protinfo(
struct rtnl_link *link,
struct nlattr *attr,
57 struct nlattr *tb[IFLA_INET6_MAX+1];
64 if (tb[IFLA_INET6_FLAGS])
67 if (tb[IFLA_INET6_CACHEINFO])
68 nla_memcpy(&i6->i6_cacheinfo, tb[IFLA_INET6_CACHEINFO],
69 sizeof(i6->i6_cacheinfo));
71 if (tb[IFLA_INET6_CONF])
79 if (tb[IFLA_INET6_STATS]) {
80 unsigned char *cnt =
nla_data(tb[IFLA_INET6_STATS]);
84 for (i = 1; i < __IPSTATS_MIB_MAX; i++) {
85 memcpy(&stat, &cnt[i *
sizeof(stat)],
sizeof(stat));
91 if (tb[IFLA_INET6_ICMP6STATS]) {
92 unsigned char *cnt =
nla_data(tb[IFLA_INET6_ICMP6STATS]);
96 for (i = 1; i < __ICMP6_MIB_MAX; i++) {
97 memcpy(&stat, &cnt[i *
sizeof(stat)],
sizeof(stat));
107 #define IF_RA_OTHERCONF 0x80
108 #define IF_RA_MANAGED 0x40
109 #define IF_RA_RCVD 0x20
110 #define IF_RS_SENT 0x10
111 #define IF_READY 0x80000000
113 static const struct trans_tbl inet6_flags[] = {
114 __ADD(IF_RA_OTHERCONF, ra_otherconf)
115 __ADD(IF_RA_MANAGED, ra_managed)
116 __ADD(IF_RA_RCVD, ra_rcvd)
117 __ADD(IF_RS_SENT, rs_sent)
118 __ADD(IF_READY, ready)
121 static
char *inet6_flags2str(
int flags,
char *buf,
size_t len)
123 return __flags2str(flags, buf, len, inet6_flags,
124 ARRAY_SIZE(inet6_flags));
127 static const struct trans_tbl inet6_devconf[] = {
128 __ADD(DEVCONF_FORWARDING, forwarding)
129 __ADD(DEVCONF_HOPLIMIT, hoplimit)
130 __ADD(DEVCONF_MTU6, mtu6)
131 __ADD(DEVCONF_ACCEPT_RA, accept_ra)
132 __ADD(DEVCONF_ACCEPT_REDIRECTS, accept_redirects)
133 __ADD(DEVCONF_AUTOCONF, autoconf)
134 __ADD(DEVCONF_DAD_TRANSMITS, dad_transmits)
135 __ADD(DEVCONF_RTR_SOLICITS, rtr_solicits)
136 __ADD(DEVCONF_RTR_SOLICIT_INTERVAL, rtr_solicit_interval)
137 __ADD(DEVCONF_RTR_SOLICIT_DELAY, rtr_solicit_delay)
138 __ADD(DEVCONF_USE_TEMPADDR, use_tempaddr)
139 __ADD(DEVCONF_TEMP_VALID_LFT, temp_valid_lft)
140 __ADD(DEVCONF_TEMP_PREFERED_LFT, temp_prefered_lft)
141 __ADD(DEVCONF_REGEN_MAX_RETRY, regen_max_retry)
142 __ADD(DEVCONF_MAX_DESYNC_FACTOR, max_desync_factor)
143 __ADD(DEVCONF_MAX_ADDRESSES, max_addresses)
144 __ADD(DEVCONF_FORCE_MLD_VERSION, force_mld_version)
145 __ADD(DEVCONF_ACCEPT_RA_DEFRTR, accept_ra_defrtr)
146 __ADD(DEVCONF_ACCEPT_RA_PINFO, accept_ra_pinfo)
147 __ADD(DEVCONF_ACCEPT_RA_RTR_PREF, accept_ra_rtr_pref)
148 __ADD(DEVCONF_RTR_PROBE_INTERVAL, rtr_probe_interval)
149 __ADD(DEVCONF_ACCEPT_RA_RT_INFO_MAX_PLEN, accept_ra_rt_info)
150 __ADD(DEVCONF_PROXY_NDP, proxy_ndp)
151 __ADD(DEVCONF_OPTIMISTIC_DAD, optimistic_dad)
152 __ADD(DEVCONF_ACCEPT_SOURCE_ROUTE, accept_source_route)
153 __ADD(DEVCONF_MC_FORWARDING, mc_forwarding)
154 __ADD(DEVCONF_DISABLE_IPV6, disable_ipv6)
155 __ADD(DEVCONF_ACCEPT_DAD, accept_dad)
156 __ADD(DEVCONF_FORCE_TLLAO, force_tllao)
159 static
char *inet6_devconf2str(
int type,
char *buf,
size_t len)
161 return __type2str(type, buf, len, inet6_devconf,
162 ARRAY_SIZE(inet6_devconf));
166 static void inet6_dump_details(
struct rtnl_link *link,
170 char buf[64], buf2[64];
173 nl_dump_line(p,
" ipv6 max-reasm-len %s",
174 nl_size2str(i6->i6_cacheinfo.max_reasm_len, buf,
sizeof(buf)));
177 inet6_flags2str(i6->i6_flags, buf,
sizeof(buf)));
180 nl_dump_line(p,
" create-stamp %.2fs reachable-time %s",
181 (
double) i6->i6_cacheinfo.tstamp / 100.,
182 nl_msec2str(i6->i6_cacheinfo.reachable_time, buf,
sizeof(buf)));
184 nl_dump(p,
" retrans-time %s\n",
185 nl_msec2str(i6->i6_cacheinfo.retrans_time, buf,
sizeof(buf)));
187 nl_dump_line(p,
" devconf:\n");
188 nl_dump_line(p,
" ");
190 for (i = 0; i < DEVCONF_MAX; i++) {
191 uint32_t value = i6->i6_conf[i];
195 case DEVCONF_TEMP_VALID_LFT:
196 case DEVCONF_TEMP_PREFERED_LFT:
197 nl_msec2str((uint64_t) value * 1000., buf2,
sizeof(buf2));
200 case DEVCONF_RTR_PROBE_INTERVAL:
201 case DEVCONF_RTR_SOLICIT_INTERVAL:
202 case DEVCONF_RTR_SOLICIT_DELAY:
207 snprintf(buf2,
sizeof(buf2),
"%u", value);
212 inet6_devconf2str(i, buf,
sizeof(buf));
214 offset = 23 - strlen(buf2);
218 for (x = strlen(buf); x < offset; x++)
221 strncpy(&buf[offset], buf2, strlen(buf2));
223 nl_dump_line(p,
"%s", buf);
227 nl_dump_line(p,
" ");
237 static void inet6_dump_stats(
struct rtnl_link *link,
243 nl_dump(p,
" IPv6: InPkts InOctets "
244 " InDiscards InDelivers\n");
250 nl_dump(p,
"%14.2f %3s ", octets, octetsUnit);
252 nl_dump(p,
"%16" PRIu64
" B ", 0);
254 nl_dump(p,
"%18" PRIu64
" %18" PRIu64
"\n",
258 nl_dump(p,
" OutPkts OutOctets "
259 " OutDiscards OutForwards\n");
266 nl_dump(p,
"%14.2f %3s ", octets, octetsUnit);
268 nl_dump(p,
"%16" PRIu64
" B ", 0);
270 nl_dump(p,
"%18" PRIu64
" %18" PRIu64
"\n",
274 nl_dump(p,
" InMcastPkts InMcastOctets "
275 " InBcastPkts InBcastOctests\n");
282 nl_dump(p,
"%14.2f %3s ", octets, octetsUnit);
284 nl_dump(p,
"%16" PRIu64
" B ", 0);
290 nl_dump(p,
"%14.2f %3s\n", octets, octetsUnit);
292 nl_dump(p,
"%16" PRIu64
" B\n", 0);
294 nl_dump(p,
" OutMcastPkts OutMcastOctets "
295 " OutBcastPkts OutBcastOctests\n");
302 nl_dump(p,
"%14.2f %3s ", octets, octetsUnit);
304 nl_dump(p,
"%16" PRIu64
" B ", 0);
310 nl_dump(p,
"%14.2f %3s\n", octets, octetsUnit);
312 nl_dump(p,
"%16" PRIu64
" B\n", 0);
314 nl_dump(p,
" ReasmOKs ReasmFails "
315 " ReasmReqds ReasmTimeout\n");
316 nl_dump(p,
" %18" PRIu64
" %18" PRIu64
" %18" PRIu64
" %18" PRIu64
"\n",
322 nl_dump(p,
" FragOKs FragFails "
324 nl_dump(p,
" %18" PRIu64
" %18" PRIu64
" %18" PRIu64
"\n",
329 nl_dump(p,
" InHdrErrors InTooBigErrors "
330 " InNoRoutes InAddrErrors\n");
331 nl_dump(p,
" %18" PRIu64
" %18" PRIu64
" %18" PRIu64
" %18" PRIu64
"\n",
337 nl_dump(p,
" InUnknownProtos InTruncatedPkts "
339 nl_dump(p,
" %18" PRIu64
" %18" PRIu64
" %18" PRIu64
"\n",
344 nl_dump(p,
" ICMPv6: InMsgs InErrors "
345 " OutMsgs OutErrors\n");
346 nl_dump(p,
" %18" PRIu64
" %18" PRIu64
" %18" PRIu64
" %18" PRIu64
"\n",
353 static const struct nla_policy protinfo_policy = {
357 static struct rtnl_link_af_ops inet6_ops = {
358 .ao_family = AF_INET6,
359 .ao_alloc = &inet6_alloc,
360 .ao_clone = &inet6_clone,
361 .ao_free = &inet6_free,
362 .ao_parse_protinfo = &inet6_parse_protinfo,
363 .ao_parse_af = &inet6_parse_protinfo,
366 .ao_protinfo_policy = &protinfo_policy,
369 static void __init inet6_init(
void)
374 static void __exit inet6_exit(
void)