1*4dc78e53SAndroid Build Coastguard Worker /* SPDX-License-Identifier: LGPL-2.1-only */
2*4dc78e53SAndroid Build Coastguard Worker /*
3*4dc78e53SAndroid Build Coastguard Worker * Copyright (c) 2010 Thomas Graf <[email protected]>
4*4dc78e53SAndroid Build Coastguard Worker */
5*4dc78e53SAndroid Build Coastguard Worker
6*4dc78e53SAndroid Build Coastguard Worker #include "nl-default.h"
7*4dc78e53SAndroid Build Coastguard Worker
8*4dc78e53SAndroid Build Coastguard Worker #include <linux/ipv6.h>
9*4dc78e53SAndroid Build Coastguard Worker #include <linux/snmp.h>
10*4dc78e53SAndroid Build Coastguard Worker
11*4dc78e53SAndroid Build Coastguard Worker #include <netlink/netlink.h>
12*4dc78e53SAndroid Build Coastguard Worker #include <netlink/attr.h>
13*4dc78e53SAndroid Build Coastguard Worker #include <netlink/route/rtnl.h>
14*4dc78e53SAndroid Build Coastguard Worker #include <netlink/route/link/inet6.h>
15*4dc78e53SAndroid Build Coastguard Worker
16*4dc78e53SAndroid Build Coastguard Worker #include "nl-route.h"
17*4dc78e53SAndroid Build Coastguard Worker #include "link-api.h"
18*4dc78e53SAndroid Build Coastguard Worker #include "nl-priv-static-route/nl-priv-static-route.h"
19*4dc78e53SAndroid Build Coastguard Worker
20*4dc78e53SAndroid Build Coastguard Worker #define I6_ADDR_GEN_MODE_UNKNOWN UINT8_MAX
21*4dc78e53SAndroid Build Coastguard Worker
22*4dc78e53SAndroid Build Coastguard Worker struct inet6_data
23*4dc78e53SAndroid Build Coastguard Worker {
24*4dc78e53SAndroid Build Coastguard Worker uint32_t i6_flags;
25*4dc78e53SAndroid Build Coastguard Worker struct ifla_cacheinfo i6_cacheinfo;
26*4dc78e53SAndroid Build Coastguard Worker uint32_t i6_conf[DEVCONF_MAX];
27*4dc78e53SAndroid Build Coastguard Worker struct in6_addr i6_token;
28*4dc78e53SAndroid Build Coastguard Worker uint8_t i6_conf_len;
29*4dc78e53SAndroid Build Coastguard Worker uint8_t i6_addr_gen_mode;
30*4dc78e53SAndroid Build Coastguard Worker };
31*4dc78e53SAndroid Build Coastguard Worker
inet6_alloc(struct rtnl_link * link)32*4dc78e53SAndroid Build Coastguard Worker static void *inet6_alloc(struct rtnl_link *link)
33*4dc78e53SAndroid Build Coastguard Worker {
34*4dc78e53SAndroid Build Coastguard Worker struct inet6_data *i6;
35*4dc78e53SAndroid Build Coastguard Worker
36*4dc78e53SAndroid Build Coastguard Worker i6 = calloc(1, sizeof(struct inet6_data));
37*4dc78e53SAndroid Build Coastguard Worker if (i6)
38*4dc78e53SAndroid Build Coastguard Worker i6->i6_addr_gen_mode = I6_ADDR_GEN_MODE_UNKNOWN;
39*4dc78e53SAndroid Build Coastguard Worker
40*4dc78e53SAndroid Build Coastguard Worker return i6;
41*4dc78e53SAndroid Build Coastguard Worker }
42*4dc78e53SAndroid Build Coastguard Worker
inet6_clone(struct rtnl_link * link,void * data)43*4dc78e53SAndroid Build Coastguard Worker static void *inet6_clone(struct rtnl_link *link, void *data)
44*4dc78e53SAndroid Build Coastguard Worker {
45*4dc78e53SAndroid Build Coastguard Worker struct inet6_data *i6;
46*4dc78e53SAndroid Build Coastguard Worker
47*4dc78e53SAndroid Build Coastguard Worker if ((i6 = inet6_alloc(link)))
48*4dc78e53SAndroid Build Coastguard Worker memcpy(i6, data, sizeof(*i6));
49*4dc78e53SAndroid Build Coastguard Worker
50*4dc78e53SAndroid Build Coastguard Worker return i6;
51*4dc78e53SAndroid Build Coastguard Worker }
52*4dc78e53SAndroid Build Coastguard Worker
inet6_free(struct rtnl_link * link,void * data)53*4dc78e53SAndroid Build Coastguard Worker static void inet6_free(struct rtnl_link *link, void *data)
54*4dc78e53SAndroid Build Coastguard Worker {
55*4dc78e53SAndroid Build Coastguard Worker free(data);
56*4dc78e53SAndroid Build Coastguard Worker }
57*4dc78e53SAndroid Build Coastguard Worker
58*4dc78e53SAndroid Build Coastguard Worker static struct nla_policy inet6_policy[IFLA_INET6_MAX+1] = {
59*4dc78e53SAndroid Build Coastguard Worker [IFLA_INET6_FLAGS] = { .type = NLA_U32 },
60*4dc78e53SAndroid Build Coastguard Worker [IFLA_INET6_CACHEINFO] = { .minlen = sizeof(struct ifla_cacheinfo) },
61*4dc78e53SAndroid Build Coastguard Worker [IFLA_INET6_CONF] = { .minlen = 4 },
62*4dc78e53SAndroid Build Coastguard Worker [IFLA_INET6_STATS] = { .minlen = 8 },
63*4dc78e53SAndroid Build Coastguard Worker [IFLA_INET6_ICMP6STATS] = { .minlen = 8 },
64*4dc78e53SAndroid Build Coastguard Worker [IFLA_INET6_TOKEN] = { .minlen = sizeof(struct in6_addr) },
65*4dc78e53SAndroid Build Coastguard Worker [IFLA_INET6_ADDR_GEN_MODE] = { .type = NLA_U8 },
66*4dc78e53SAndroid Build Coastguard Worker };
67*4dc78e53SAndroid Build Coastguard Worker
68*4dc78e53SAndroid Build Coastguard Worker static const uint8_t map_stat_id_from_IPSTATS_MIB_v1[__IPSTATS_MIB_MAX] = {
69*4dc78e53SAndroid Build Coastguard Worker /* 14a196807482e6fc74f15fc03176d5c08880588f^:include/linux/snmp.h
70*4dc78e53SAndroid Build Coastguard Worker * version before the API change in commit 14a196807482e6fc74f15fc03176d5c08880588f.
71*4dc78e53SAndroid Build Coastguard Worker * This version was valid since commit edf391ff17232f097d72441c9ad467bcb3b5db18, which
72*4dc78e53SAndroid Build Coastguard Worker * predates support for parsing IFLA_PROTINFO in libnl3. Such an even older meaning of
73*4dc78e53SAndroid Build Coastguard Worker * the flags is not supported in libnl3. */
74*4dc78e53SAndroid Build Coastguard Worker [ 1] = RTNL_LINK_IP6_INPKTS, /* IPSTATS_MIB_INPKTS */
75*4dc78e53SAndroid Build Coastguard Worker [ 2] = RTNL_LINK_IP6_INHDRERRORS, /* IPSTATS_MIB_INHDRERRORS */
76*4dc78e53SAndroid Build Coastguard Worker [ 3] = RTNL_LINK_IP6_INTOOBIGERRORS, /* IPSTATS_MIB_INTOOBIGERRORS */
77*4dc78e53SAndroid Build Coastguard Worker [ 4] = RTNL_LINK_IP6_INNOROUTES, /* IPSTATS_MIB_INNOROUTES */
78*4dc78e53SAndroid Build Coastguard Worker [ 5] = RTNL_LINK_IP6_INADDRERRORS, /* IPSTATS_MIB_INADDRERRORS */
79*4dc78e53SAndroid Build Coastguard Worker [ 6] = RTNL_LINK_IP6_INUNKNOWNPROTOS, /* IPSTATS_MIB_INUNKNOWNPROTOS */
80*4dc78e53SAndroid Build Coastguard Worker [ 7] = RTNL_LINK_IP6_INTRUNCATEDPKTS, /* IPSTATS_MIB_INTRUNCATEDPKTS */
81*4dc78e53SAndroid Build Coastguard Worker [ 8] = RTNL_LINK_IP6_INDISCARDS, /* IPSTATS_MIB_INDISCARDS */
82*4dc78e53SAndroid Build Coastguard Worker [ 9] = RTNL_LINK_IP6_INDELIVERS, /* IPSTATS_MIB_INDELIVERS */
83*4dc78e53SAndroid Build Coastguard Worker [10] = RTNL_LINK_IP6_OUTFORWDATAGRAMS, /* IPSTATS_MIB_OUTFORWDATAGRAMS */
84*4dc78e53SAndroid Build Coastguard Worker [11] = RTNL_LINK_IP6_OUTPKTS, /* IPSTATS_MIB_OUTPKTS */
85*4dc78e53SAndroid Build Coastguard Worker [12] = RTNL_LINK_IP6_OUTDISCARDS, /* IPSTATS_MIB_OUTDISCARDS */
86*4dc78e53SAndroid Build Coastguard Worker [13] = RTNL_LINK_IP6_OUTNOROUTES, /* IPSTATS_MIB_OUTNOROUTES */
87*4dc78e53SAndroid Build Coastguard Worker [14] = RTNL_LINK_IP6_REASMTIMEOUT, /* IPSTATS_MIB_REASMTIMEOUT */
88*4dc78e53SAndroid Build Coastguard Worker [15] = RTNL_LINK_IP6_REASMREQDS, /* IPSTATS_MIB_REASMREQDS */
89*4dc78e53SAndroid Build Coastguard Worker [16] = RTNL_LINK_IP6_REASMOKS, /* IPSTATS_MIB_REASMOKS */
90*4dc78e53SAndroid Build Coastguard Worker [17] = RTNL_LINK_IP6_REASMFAILS, /* IPSTATS_MIB_REASMFAILS */
91*4dc78e53SAndroid Build Coastguard Worker [18] = RTNL_LINK_IP6_FRAGOKS, /* IPSTATS_MIB_FRAGOKS */
92*4dc78e53SAndroid Build Coastguard Worker [19] = RTNL_LINK_IP6_FRAGFAILS, /* IPSTATS_MIB_FRAGFAILS */
93*4dc78e53SAndroid Build Coastguard Worker [20] = RTNL_LINK_IP6_FRAGCREATES, /* IPSTATS_MIB_FRAGCREATES */
94*4dc78e53SAndroid Build Coastguard Worker [21] = RTNL_LINK_IP6_INMCASTPKTS, /* IPSTATS_MIB_INMCASTPKTS */
95*4dc78e53SAndroid Build Coastguard Worker [22] = RTNL_LINK_IP6_OUTMCASTPKTS, /* IPSTATS_MIB_OUTMCASTPKTS */
96*4dc78e53SAndroid Build Coastguard Worker [23] = RTNL_LINK_IP6_INBCASTPKTS, /* IPSTATS_MIB_INBCASTPKTS */
97*4dc78e53SAndroid Build Coastguard Worker [24] = RTNL_LINK_IP6_OUTBCASTPKTS, /* IPSTATS_MIB_OUTBCASTPKTS */
98*4dc78e53SAndroid Build Coastguard Worker [25] = RTNL_LINK_IP6_INOCTETS, /* IPSTATS_MIB_INOCTETS */
99*4dc78e53SAndroid Build Coastguard Worker [26] = RTNL_LINK_IP6_OUTOCTETS, /* IPSTATS_MIB_OUTOCTETS */
100*4dc78e53SAndroid Build Coastguard Worker [27] = RTNL_LINK_IP6_INMCASTOCTETS, /* IPSTATS_MIB_INMCASTOCTETS */
101*4dc78e53SAndroid Build Coastguard Worker [28] = RTNL_LINK_IP6_OUTMCASTOCTETS, /* IPSTATS_MIB_OUTMCASTOCTETS */
102*4dc78e53SAndroid Build Coastguard Worker [29] = RTNL_LINK_IP6_INBCASTOCTETS, /* IPSTATS_MIB_INBCASTOCTETS */
103*4dc78e53SAndroid Build Coastguard Worker [30] = RTNL_LINK_IP6_OUTBCASTOCTETS, /* IPSTATS_MIB_OUTBCASTOCTETS */
104*4dc78e53SAndroid Build Coastguard Worker };
105*4dc78e53SAndroid Build Coastguard Worker
106*4dc78e53SAndroid Build Coastguard Worker static const uint8_t map_stat_id_from_IPSTATS_MIB_v2[__IPSTATS_MIB_MAX] = {
107*4dc78e53SAndroid Build Coastguard Worker /* d8ec26d7f8287f5788a494f56e8814210f0e64be:include/uapi/linux/snmp.h
108*4dc78e53SAndroid Build Coastguard Worker * version since the API change in commit 14a196807482e6fc74f15fc03176d5c08880588f */
109*4dc78e53SAndroid Build Coastguard Worker [ 1] = RTNL_LINK_IP6_INPKTS, /* IPSTATS_MIB_INPKTS */
110*4dc78e53SAndroid Build Coastguard Worker [ 2] = RTNL_LINK_IP6_INOCTETS, /* IPSTATS_MIB_INOCTETS */
111*4dc78e53SAndroid Build Coastguard Worker [ 3] = RTNL_LINK_IP6_INDELIVERS, /* IPSTATS_MIB_INDELIVERS */
112*4dc78e53SAndroid Build Coastguard Worker [ 4] = RTNL_LINK_IP6_OUTFORWDATAGRAMS, /* IPSTATS_MIB_OUTFORWDATAGRAMS */
113*4dc78e53SAndroid Build Coastguard Worker [ 5] = RTNL_LINK_IP6_OUTPKTS, /* IPSTATS_MIB_OUTPKTS */
114*4dc78e53SAndroid Build Coastguard Worker [ 6] = RTNL_LINK_IP6_OUTOCTETS, /* IPSTATS_MIB_OUTOCTETS */
115*4dc78e53SAndroid Build Coastguard Worker [ 7] = RTNL_LINK_IP6_INHDRERRORS, /* IPSTATS_MIB_INHDRERRORS */
116*4dc78e53SAndroid Build Coastguard Worker [ 8] = RTNL_LINK_IP6_INTOOBIGERRORS, /* IPSTATS_MIB_INTOOBIGERRORS */
117*4dc78e53SAndroid Build Coastguard Worker [ 9] = RTNL_LINK_IP6_INNOROUTES, /* IPSTATS_MIB_INNOROUTES */
118*4dc78e53SAndroid Build Coastguard Worker [10] = RTNL_LINK_IP6_INADDRERRORS, /* IPSTATS_MIB_INADDRERRORS */
119*4dc78e53SAndroid Build Coastguard Worker [11] = RTNL_LINK_IP6_INUNKNOWNPROTOS, /* IPSTATS_MIB_INUNKNOWNPROTOS */
120*4dc78e53SAndroid Build Coastguard Worker [12] = RTNL_LINK_IP6_INTRUNCATEDPKTS, /* IPSTATS_MIB_INTRUNCATEDPKTS */
121*4dc78e53SAndroid Build Coastguard Worker [13] = RTNL_LINK_IP6_INDISCARDS, /* IPSTATS_MIB_INDISCARDS */
122*4dc78e53SAndroid Build Coastguard Worker [14] = RTNL_LINK_IP6_OUTDISCARDS, /* IPSTATS_MIB_OUTDISCARDS */
123*4dc78e53SAndroid Build Coastguard Worker [15] = RTNL_LINK_IP6_OUTNOROUTES, /* IPSTATS_MIB_OUTNOROUTES */
124*4dc78e53SAndroid Build Coastguard Worker [16] = RTNL_LINK_IP6_REASMTIMEOUT, /* IPSTATS_MIB_REASMTIMEOUT */
125*4dc78e53SAndroid Build Coastguard Worker [17] = RTNL_LINK_IP6_REASMREQDS, /* IPSTATS_MIB_REASMREQDS */
126*4dc78e53SAndroid Build Coastguard Worker [18] = RTNL_LINK_IP6_REASMOKS, /* IPSTATS_MIB_REASMOKS */
127*4dc78e53SAndroid Build Coastguard Worker [19] = RTNL_LINK_IP6_REASMFAILS, /* IPSTATS_MIB_REASMFAILS */
128*4dc78e53SAndroid Build Coastguard Worker [20] = RTNL_LINK_IP6_FRAGOKS, /* IPSTATS_MIB_FRAGOKS */
129*4dc78e53SAndroid Build Coastguard Worker [21] = RTNL_LINK_IP6_FRAGFAILS, /* IPSTATS_MIB_FRAGFAILS */
130*4dc78e53SAndroid Build Coastguard Worker [22] = RTNL_LINK_IP6_FRAGCREATES, /* IPSTATS_MIB_FRAGCREATES */
131*4dc78e53SAndroid Build Coastguard Worker [23] = RTNL_LINK_IP6_INMCASTPKTS, /* IPSTATS_MIB_INMCASTPKTS */
132*4dc78e53SAndroid Build Coastguard Worker [24] = RTNL_LINK_IP6_OUTMCASTPKTS, /* IPSTATS_MIB_OUTMCASTPKTS */
133*4dc78e53SAndroid Build Coastguard Worker [25] = RTNL_LINK_IP6_INBCASTPKTS, /* IPSTATS_MIB_INBCASTPKTS */
134*4dc78e53SAndroid Build Coastguard Worker [26] = RTNL_LINK_IP6_OUTBCASTPKTS, /* IPSTATS_MIB_OUTBCASTPKTS */
135*4dc78e53SAndroid Build Coastguard Worker [27] = RTNL_LINK_IP6_INMCASTOCTETS, /* IPSTATS_MIB_INMCASTOCTETS */
136*4dc78e53SAndroid Build Coastguard Worker [28] = RTNL_LINK_IP6_OUTMCASTOCTETS, /* IPSTATS_MIB_OUTMCASTOCTETS */
137*4dc78e53SAndroid Build Coastguard Worker [29] = RTNL_LINK_IP6_INBCASTOCTETS, /* IPSTATS_MIB_INBCASTOCTETS */
138*4dc78e53SAndroid Build Coastguard Worker [30] = RTNL_LINK_IP6_OUTBCASTOCTETS, /* IPSTATS_MIB_OUTBCASTOCTETS */
139*4dc78e53SAndroid Build Coastguard Worker [31] = RTNL_LINK_IP6_CSUMERRORS, /* IPSTATS_MIB_CSUMERRORS */
140*4dc78e53SAndroid Build Coastguard Worker [32] = RTNL_LINK_IP6_NOECTPKTS, /* IPSTATS_MIB_NOECTPKTS */
141*4dc78e53SAndroid Build Coastguard Worker [33] = RTNL_LINK_IP6_ECT1PKTS, /* IPSTATS_MIB_ECT1PKTS */
142*4dc78e53SAndroid Build Coastguard Worker [34] = RTNL_LINK_IP6_ECT0PKTS, /* IPSTATS_MIB_ECT0PKTS */
143*4dc78e53SAndroid Build Coastguard Worker [35] = RTNL_LINK_IP6_CEPKTS, /* IPSTATS_MIB_CEPKTS */
144*4dc78e53SAndroid Build Coastguard Worker [36] = RTNL_LINK_REASM_OVERLAPS, /* IPSTATS_MIB_REASM_OVERLAPS */
145*4dc78e53SAndroid Build Coastguard Worker };
146*4dc78e53SAndroid Build Coastguard Worker
147*4dc78e53SAndroid Build Coastguard Worker const uint8_t *const _nltst_map_stat_id_from_IPSTATS_MIB_v2 = map_stat_id_from_IPSTATS_MIB_v2;
148*4dc78e53SAndroid Build Coastguard Worker
inet6_parse_protinfo(struct rtnl_link * link,struct nlattr * attr,void * data)149*4dc78e53SAndroid Build Coastguard Worker static int inet6_parse_protinfo(struct rtnl_link *link, struct nlattr *attr,
150*4dc78e53SAndroid Build Coastguard Worker void *data)
151*4dc78e53SAndroid Build Coastguard Worker {
152*4dc78e53SAndroid Build Coastguard Worker struct inet6_data *i6 = data;
153*4dc78e53SAndroid Build Coastguard Worker struct nlattr *tb[IFLA_INET6_MAX+1];
154*4dc78e53SAndroid Build Coastguard Worker int err;
155*4dc78e53SAndroid Build Coastguard Worker
156*4dc78e53SAndroid Build Coastguard Worker err = nla_parse_nested(tb, IFLA_INET6_MAX, attr, inet6_policy);
157*4dc78e53SAndroid Build Coastguard Worker if (err < 0)
158*4dc78e53SAndroid Build Coastguard Worker return err;
159*4dc78e53SAndroid Build Coastguard Worker if (tb[IFLA_INET6_CONF] && nla_len(tb[IFLA_INET6_CONF]) % 4)
160*4dc78e53SAndroid Build Coastguard Worker return -EINVAL;
161*4dc78e53SAndroid Build Coastguard Worker if (tb[IFLA_INET6_STATS] && nla_len(tb[IFLA_INET6_STATS]) % 8)
162*4dc78e53SAndroid Build Coastguard Worker return -EINVAL;
163*4dc78e53SAndroid Build Coastguard Worker if (tb[IFLA_INET6_ICMP6STATS] && nla_len(tb[IFLA_INET6_ICMP6STATS]) % 8)
164*4dc78e53SAndroid Build Coastguard Worker return -EINVAL;
165*4dc78e53SAndroid Build Coastguard Worker
166*4dc78e53SAndroid Build Coastguard Worker if (tb[IFLA_INET6_FLAGS])
167*4dc78e53SAndroid Build Coastguard Worker i6->i6_flags = nla_get_u32(tb[IFLA_INET6_FLAGS]);
168*4dc78e53SAndroid Build Coastguard Worker
169*4dc78e53SAndroid Build Coastguard Worker if (tb[IFLA_INET6_CACHEINFO])
170*4dc78e53SAndroid Build Coastguard Worker nla_memcpy(&i6->i6_cacheinfo, tb[IFLA_INET6_CACHEINFO],
171*4dc78e53SAndroid Build Coastguard Worker sizeof(i6->i6_cacheinfo));
172*4dc78e53SAndroid Build Coastguard Worker
173*4dc78e53SAndroid Build Coastguard Worker if (tb[IFLA_INET6_CONF]) {
174*4dc78e53SAndroid Build Coastguard Worker i6->i6_conf_len = _NL_MIN(ARRAY_SIZE(i6->i6_conf),
175*4dc78e53SAndroid Build Coastguard Worker nla_len(tb[IFLA_INET6_CONF]) /
176*4dc78e53SAndroid Build Coastguard Worker sizeof(i6->i6_conf[0]));
177*4dc78e53SAndroid Build Coastguard Worker nla_memcpy(&i6->i6_conf, tb[IFLA_INET6_CONF],
178*4dc78e53SAndroid Build Coastguard Worker sizeof(i6->i6_conf[0]) * i6->i6_conf_len);
179*4dc78e53SAndroid Build Coastguard Worker }
180*4dc78e53SAndroid Build Coastguard Worker
181*4dc78e53SAndroid Build Coastguard Worker if (tb[IFLA_INET6_TOKEN])
182*4dc78e53SAndroid Build Coastguard Worker nla_memcpy(&i6->i6_token, tb[IFLA_INET6_TOKEN],
183*4dc78e53SAndroid Build Coastguard Worker sizeof(struct in6_addr));
184*4dc78e53SAndroid Build Coastguard Worker
185*4dc78e53SAndroid Build Coastguard Worker if (tb[IFLA_INET6_ADDR_GEN_MODE])
186*4dc78e53SAndroid Build Coastguard Worker i6->i6_addr_gen_mode = nla_get_u8 (tb[IFLA_INET6_ADDR_GEN_MODE]);
187*4dc78e53SAndroid Build Coastguard Worker
188*4dc78e53SAndroid Build Coastguard Worker /*
189*4dc78e53SAndroid Build Coastguard Worker * Due to 32bit data alignment, these addresses must be copied to an
190*4dc78e53SAndroid Build Coastguard Worker * aligned location prior to access.
191*4dc78e53SAndroid Build Coastguard Worker */
192*4dc78e53SAndroid Build Coastguard Worker if (tb[IFLA_INET6_STATS]) {
193*4dc78e53SAndroid Build Coastguard Worker unsigned char *cnt = nla_data(tb[IFLA_INET6_STATS]);
194*4dc78e53SAndroid Build Coastguard Worker uint64_t stat;
195*4dc78e53SAndroid Build Coastguard Worker int i;
196*4dc78e53SAndroid Build Coastguard Worker int len = nla_len(tb[IFLA_INET6_STATS]) / 8;
197*4dc78e53SAndroid Build Coastguard Worker const uint8_t *map_stat_id = map_stat_id_from_IPSTATS_MIB_v2;
198*4dc78e53SAndroid Build Coastguard Worker
199*4dc78e53SAndroid Build Coastguard Worker if (len < 32 ||
200*4dc78e53SAndroid Build Coastguard Worker (tb[IFLA_INET6_ICMP6STATS] && nla_len(tb[IFLA_INET6_ICMP6STATS]) < 6)) {
201*4dc78e53SAndroid Build Coastguard Worker /* kernel commit 14a196807482e6fc74f15fc03176d5c08880588f reordered the values.
202*4dc78e53SAndroid Build Coastguard Worker * The later commit 6a5dc9e598fe90160fee7de098fa319665f5253e added values
203*4dc78e53SAndroid Build Coastguard Worker * IPSTATS_MIB_CSUMERRORS/ICMP6_MIB_CSUMERRORS. If the netlink is shorter
204*4dc78e53SAndroid Build Coastguard Worker * then this, assume that the kernel uses the previous meaning of the
205*4dc78e53SAndroid Build Coastguard Worker * enumeration. */
206*4dc78e53SAndroid Build Coastguard Worker map_stat_id = map_stat_id_from_IPSTATS_MIB_v1;
207*4dc78e53SAndroid Build Coastguard Worker }
208*4dc78e53SAndroid Build Coastguard Worker
209*4dc78e53SAndroid Build Coastguard Worker len = _NL_MIN(__IPSTATS_MIB_MAX, len);
210*4dc78e53SAndroid Build Coastguard Worker for (i = 1; i < len; i++) {
211*4dc78e53SAndroid Build Coastguard Worker memcpy(&stat, &cnt[i * sizeof(stat)], sizeof(stat));
212*4dc78e53SAndroid Build Coastguard Worker rtnl_link_set_stat(link, map_stat_id[i], stat);
213*4dc78e53SAndroid Build Coastguard Worker }
214*4dc78e53SAndroid Build Coastguard Worker }
215*4dc78e53SAndroid Build Coastguard Worker
216*4dc78e53SAndroid Build Coastguard Worker if (tb[IFLA_INET6_ICMP6STATS]) {
217*4dc78e53SAndroid Build Coastguard Worker #define _NL_ICMP6_MIB_MAX 6
218*4dc78e53SAndroid Build Coastguard Worker unsigned char *cnt = nla_data(tb[IFLA_INET6_ICMP6STATS]);
219*4dc78e53SAndroid Build Coastguard Worker uint64_t stat;
220*4dc78e53SAndroid Build Coastguard Worker int i;
221*4dc78e53SAndroid Build Coastguard Worker int len = _NL_MIN(_NL_ICMP6_MIB_MAX, nla_len(tb[IFLA_INET6_ICMP6STATS]) / 8);
222*4dc78e53SAndroid Build Coastguard Worker
223*4dc78e53SAndroid Build Coastguard Worker _NL_STATIC_ASSERT (__ICMP6_MIB_MAX >= _NL_ICMP6_MIB_MAX);
224*4dc78e53SAndroid Build Coastguard Worker _NL_STATIC_ASSERT (RTNL_LINK_ICMP6_CSUMERRORS - RTNL_LINK_ICMP6_INMSGS + 1 == 5);
225*4dc78e53SAndroid Build Coastguard Worker
226*4dc78e53SAndroid Build Coastguard Worker for (i = 1; i < len; i++) {
227*4dc78e53SAndroid Build Coastguard Worker memcpy(&stat, &cnt[i * sizeof(stat)], sizeof(stat));
228*4dc78e53SAndroid Build Coastguard Worker rtnl_link_set_stat(link, RTNL_LINK_ICMP6_INMSGS + i - 1,
229*4dc78e53SAndroid Build Coastguard Worker stat);
230*4dc78e53SAndroid Build Coastguard Worker }
231*4dc78e53SAndroid Build Coastguard Worker }
232*4dc78e53SAndroid Build Coastguard Worker
233*4dc78e53SAndroid Build Coastguard Worker return 0;
234*4dc78e53SAndroid Build Coastguard Worker }
235*4dc78e53SAndroid Build Coastguard Worker
inet6_fill_af(struct rtnl_link * link,struct nl_msg * msg,void * data)236*4dc78e53SAndroid Build Coastguard Worker static int inet6_fill_af(struct rtnl_link *link, struct nl_msg *msg, void *data)
237*4dc78e53SAndroid Build Coastguard Worker {
238*4dc78e53SAndroid Build Coastguard Worker struct inet6_data *id = data;
239*4dc78e53SAndroid Build Coastguard Worker
240*4dc78e53SAndroid Build Coastguard Worker if (id->i6_addr_gen_mode != I6_ADDR_GEN_MODE_UNKNOWN)
241*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_U8(msg, IFLA_INET6_ADDR_GEN_MODE, id->i6_addr_gen_mode);
242*4dc78e53SAndroid Build Coastguard Worker
243*4dc78e53SAndroid Build Coastguard Worker return 0;
244*4dc78e53SAndroid Build Coastguard Worker
245*4dc78e53SAndroid Build Coastguard Worker nla_put_failure:
246*4dc78e53SAndroid Build Coastguard Worker return -NLE_MSGSIZE;
247*4dc78e53SAndroid Build Coastguard Worker }
248*4dc78e53SAndroid Build Coastguard Worker
249*4dc78e53SAndroid Build Coastguard Worker /* These live in include/net/if_inet6.h and should be moved to include/linux */
250*4dc78e53SAndroid Build Coastguard Worker #define IF_RA_OTHERCONF 0x80
251*4dc78e53SAndroid Build Coastguard Worker #define IF_RA_MANAGED 0x40
252*4dc78e53SAndroid Build Coastguard Worker #define IF_RA_RCVD 0x20
253*4dc78e53SAndroid Build Coastguard Worker #define IF_RS_SENT 0x10
254*4dc78e53SAndroid Build Coastguard Worker #define IF_READY 0x80000000
255*4dc78e53SAndroid Build Coastguard Worker
256*4dc78e53SAndroid Build Coastguard Worker static const struct trans_tbl inet6_flags[] = {
257*4dc78e53SAndroid Build Coastguard Worker __ADD(IF_RA_OTHERCONF, ra_otherconf),
258*4dc78e53SAndroid Build Coastguard Worker __ADD(IF_RA_MANAGED, ra_managed),
259*4dc78e53SAndroid Build Coastguard Worker __ADD(IF_RA_RCVD, ra_rcvd),
260*4dc78e53SAndroid Build Coastguard Worker __ADD(IF_RS_SENT, rs_sent),
261*4dc78e53SAndroid Build Coastguard Worker __ADD(IF_READY, ready),
262*4dc78e53SAndroid Build Coastguard Worker };
263*4dc78e53SAndroid Build Coastguard Worker
rtnl_link_inet6_flags2str(int flags,char * buf,size_t len)264*4dc78e53SAndroid Build Coastguard Worker char *rtnl_link_inet6_flags2str(int flags, char *buf, size_t len)
265*4dc78e53SAndroid Build Coastguard Worker {
266*4dc78e53SAndroid Build Coastguard Worker return __flags2str(flags, buf, len, inet6_flags,
267*4dc78e53SAndroid Build Coastguard Worker ARRAY_SIZE(inet6_flags));
268*4dc78e53SAndroid Build Coastguard Worker }
269*4dc78e53SAndroid Build Coastguard Worker
rtnl_link_inet6_str2flags(const char * name)270*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_inet6_str2flags(const char *name)
271*4dc78e53SAndroid Build Coastguard Worker {
272*4dc78e53SAndroid Build Coastguard Worker return __str2flags(name, inet6_flags, ARRAY_SIZE(inet6_flags));
273*4dc78e53SAndroid Build Coastguard Worker }
274*4dc78e53SAndroid Build Coastguard Worker
275*4dc78e53SAndroid Build Coastguard Worker static const struct trans_tbl inet6_devconf[] = {
276*4dc78e53SAndroid Build Coastguard Worker __ADD(DEVCONF_FORWARDING, forwarding),
277*4dc78e53SAndroid Build Coastguard Worker __ADD(DEVCONF_HOPLIMIT, hoplimit),
278*4dc78e53SAndroid Build Coastguard Worker __ADD(DEVCONF_MTU6, mtu6),
279*4dc78e53SAndroid Build Coastguard Worker __ADD(DEVCONF_ACCEPT_RA, accept_ra),
280*4dc78e53SAndroid Build Coastguard Worker __ADD(DEVCONF_ACCEPT_REDIRECTS, accept_redirects),
281*4dc78e53SAndroid Build Coastguard Worker __ADD(DEVCONF_AUTOCONF, autoconf),
282*4dc78e53SAndroid Build Coastguard Worker __ADD(DEVCONF_DAD_TRANSMITS, dad_transmits),
283*4dc78e53SAndroid Build Coastguard Worker __ADD(DEVCONF_RTR_SOLICITS, rtr_solicits),
284*4dc78e53SAndroid Build Coastguard Worker __ADD(DEVCONF_RTR_SOLICIT_INTERVAL, rtr_solicit_interval),
285*4dc78e53SAndroid Build Coastguard Worker __ADD(DEVCONF_RTR_SOLICIT_DELAY, rtr_solicit_delay),
286*4dc78e53SAndroid Build Coastguard Worker __ADD(DEVCONF_USE_TEMPADDR, use_tempaddr),
287*4dc78e53SAndroid Build Coastguard Worker __ADD(DEVCONF_TEMP_VALID_LFT, temp_valid_lft),
288*4dc78e53SAndroid Build Coastguard Worker __ADD(DEVCONF_TEMP_PREFERED_LFT, temp_prefered_lft),
289*4dc78e53SAndroid Build Coastguard Worker __ADD(DEVCONF_REGEN_MAX_RETRY, regen_max_retry),
290*4dc78e53SAndroid Build Coastguard Worker __ADD(DEVCONF_MAX_DESYNC_FACTOR, max_desync_factor),
291*4dc78e53SAndroid Build Coastguard Worker __ADD(DEVCONF_MAX_ADDRESSES, max_addresses),
292*4dc78e53SAndroid Build Coastguard Worker __ADD(DEVCONF_FORCE_MLD_VERSION, force_mld_version),
293*4dc78e53SAndroid Build Coastguard Worker __ADD(DEVCONF_ACCEPT_RA_DEFRTR, accept_ra_defrtr),
294*4dc78e53SAndroid Build Coastguard Worker __ADD(DEVCONF_ACCEPT_RA_PINFO, accept_ra_pinfo),
295*4dc78e53SAndroid Build Coastguard Worker __ADD(DEVCONF_ACCEPT_RA_RTR_PREF, accept_ra_rtr_pref),
296*4dc78e53SAndroid Build Coastguard Worker __ADD(DEVCONF_RTR_PROBE_INTERVAL, rtr_probe_interval),
297*4dc78e53SAndroid Build Coastguard Worker __ADD(DEVCONF_ACCEPT_RA_RT_INFO_MAX_PLEN, accept_ra_rt_info),
298*4dc78e53SAndroid Build Coastguard Worker __ADD(DEVCONF_PROXY_NDP, proxy_ndp),
299*4dc78e53SAndroid Build Coastguard Worker __ADD(DEVCONF_OPTIMISTIC_DAD, optimistic_dad),
300*4dc78e53SAndroid Build Coastguard Worker __ADD(DEVCONF_ACCEPT_SOURCE_ROUTE, accept_source_route),
301*4dc78e53SAndroid Build Coastguard Worker __ADD(DEVCONF_MC_FORWARDING, mc_forwarding),
302*4dc78e53SAndroid Build Coastguard Worker __ADD(DEVCONF_DISABLE_IPV6, disable_ipv6),
303*4dc78e53SAndroid Build Coastguard Worker __ADD(DEVCONF_ACCEPT_DAD, accept_dad),
304*4dc78e53SAndroid Build Coastguard Worker __ADD(DEVCONF_FORCE_TLLAO, force_tllao),
305*4dc78e53SAndroid Build Coastguard Worker };
306*4dc78e53SAndroid Build Coastguard Worker
inet6_devconf2str(int type,char * buf,size_t len)307*4dc78e53SAndroid Build Coastguard Worker static char *inet6_devconf2str(int type, char *buf, size_t len)
308*4dc78e53SAndroid Build Coastguard Worker {
309*4dc78e53SAndroid Build Coastguard Worker return __type2str(type, buf, len, inet6_devconf,
310*4dc78e53SAndroid Build Coastguard Worker ARRAY_SIZE(inet6_devconf));
311*4dc78e53SAndroid Build Coastguard Worker }
312*4dc78e53SAndroid Build Coastguard Worker
313*4dc78e53SAndroid Build Coastguard Worker static const struct trans_tbl inet6_addr_gen_mode[] = {
314*4dc78e53SAndroid Build Coastguard Worker __ADD(IN6_ADDR_GEN_MODE_EUI64, eui64),
315*4dc78e53SAndroid Build Coastguard Worker __ADD(IN6_ADDR_GEN_MODE_NONE, none),
316*4dc78e53SAndroid Build Coastguard Worker __ADD(IN6_ADDR_GEN_MODE_STABLE_PRIVACY, stable_privacy),
317*4dc78e53SAndroid Build Coastguard Worker };
318*4dc78e53SAndroid Build Coastguard Worker
rtnl_link_inet6_addrgenmode2str(uint8_t mode,char * buf,size_t len)319*4dc78e53SAndroid Build Coastguard Worker const char *rtnl_link_inet6_addrgenmode2str(uint8_t mode, char *buf, size_t len)
320*4dc78e53SAndroid Build Coastguard Worker {
321*4dc78e53SAndroid Build Coastguard Worker return __type2str(mode, buf, len, inet6_addr_gen_mode,
322*4dc78e53SAndroid Build Coastguard Worker ARRAY_SIZE(inet6_addr_gen_mode));
323*4dc78e53SAndroid Build Coastguard Worker }
324*4dc78e53SAndroid Build Coastguard Worker
rtnl_link_inet6_str2addrgenmode(const char * mode)325*4dc78e53SAndroid Build Coastguard Worker uint8_t rtnl_link_inet6_str2addrgenmode(const char *mode)
326*4dc78e53SAndroid Build Coastguard Worker {
327*4dc78e53SAndroid Build Coastguard Worker return (uint8_t) __str2type(mode, inet6_addr_gen_mode,
328*4dc78e53SAndroid Build Coastguard Worker ARRAY_SIZE(inet6_addr_gen_mode));
329*4dc78e53SAndroid Build Coastguard Worker }
330*4dc78e53SAndroid Build Coastguard Worker
inet6_dump_details(struct rtnl_link * link,struct nl_dump_params * p,void * data)331*4dc78e53SAndroid Build Coastguard Worker static void inet6_dump_details(struct rtnl_link *link,
332*4dc78e53SAndroid Build Coastguard Worker struct nl_dump_params *p, void *data)
333*4dc78e53SAndroid Build Coastguard Worker {
334*4dc78e53SAndroid Build Coastguard Worker struct inet6_data *i6 = data;
335*4dc78e53SAndroid Build Coastguard Worker struct nl_addr *addr;
336*4dc78e53SAndroid Build Coastguard Worker int i, n = 0;
337*4dc78e53SAndroid Build Coastguard Worker char buf[64];
338*4dc78e53SAndroid Build Coastguard Worker
339*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, " ipv6 max-reasm-len %s",
340*4dc78e53SAndroid Build Coastguard Worker nl_size2str(i6->i6_cacheinfo.max_reasm_len, buf, sizeof(buf)));
341*4dc78e53SAndroid Build Coastguard Worker
342*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " <%s>\n",
343*4dc78e53SAndroid Build Coastguard Worker rtnl_link_inet6_flags2str(i6->i6_flags, buf, sizeof(buf)));
344*4dc78e53SAndroid Build Coastguard Worker
345*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, " create-stamp %.2fs reachable-time %s",
346*4dc78e53SAndroid Build Coastguard Worker (double) i6->i6_cacheinfo.tstamp / 100.,
347*4dc78e53SAndroid Build Coastguard Worker nl_msec2str(i6->i6_cacheinfo.reachable_time, buf, sizeof(buf)));
348*4dc78e53SAndroid Build Coastguard Worker
349*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " retrans-time %s\n",
350*4dc78e53SAndroid Build Coastguard Worker nl_msec2str(i6->i6_cacheinfo.retrans_time, buf, sizeof(buf)));
351*4dc78e53SAndroid Build Coastguard Worker
352*4dc78e53SAndroid Build Coastguard Worker addr = nl_addr_build(AF_INET6, &i6->i6_token, sizeof(i6->i6_token));
353*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " token %s\n",
354*4dc78e53SAndroid Build Coastguard Worker nl_addr2str(addr, buf, sizeof(buf)));
355*4dc78e53SAndroid Build Coastguard Worker nl_addr_put(addr);
356*4dc78e53SAndroid Build Coastguard Worker
357*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " link-local address mode %s\n",
358*4dc78e53SAndroid Build Coastguard Worker rtnl_link_inet6_addrgenmode2str(i6->i6_addr_gen_mode,
359*4dc78e53SAndroid Build Coastguard Worker buf, sizeof(buf)));
360*4dc78e53SAndroid Build Coastguard Worker
361*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, " devconf:\n");
362*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, " ");
363*4dc78e53SAndroid Build Coastguard Worker
364*4dc78e53SAndroid Build Coastguard Worker for (i = 0; i < (int) i6->i6_conf_len; i++) {
365*4dc78e53SAndroid Build Coastguard Worker char buf2[64];
366*4dc78e53SAndroid Build Coastguard Worker uint32_t value = i6->i6_conf[i];
367*4dc78e53SAndroid Build Coastguard Worker int x, offset;
368*4dc78e53SAndroid Build Coastguard Worker
369*4dc78e53SAndroid Build Coastguard Worker switch (i) {
370*4dc78e53SAndroid Build Coastguard Worker case DEVCONF_TEMP_VALID_LFT:
371*4dc78e53SAndroid Build Coastguard Worker case DEVCONF_TEMP_PREFERED_LFT:
372*4dc78e53SAndroid Build Coastguard Worker nl_msec2str((uint64_t) value * 1000., buf2, sizeof(buf2));
373*4dc78e53SAndroid Build Coastguard Worker break;
374*4dc78e53SAndroid Build Coastguard Worker
375*4dc78e53SAndroid Build Coastguard Worker case DEVCONF_RTR_PROBE_INTERVAL:
376*4dc78e53SAndroid Build Coastguard Worker case DEVCONF_RTR_SOLICIT_INTERVAL:
377*4dc78e53SAndroid Build Coastguard Worker case DEVCONF_RTR_SOLICIT_DELAY:
378*4dc78e53SAndroid Build Coastguard Worker nl_msec2str(value, buf2, sizeof(buf2));
379*4dc78e53SAndroid Build Coastguard Worker break;
380*4dc78e53SAndroid Build Coastguard Worker
381*4dc78e53SAndroid Build Coastguard Worker default:
382*4dc78e53SAndroid Build Coastguard Worker snprintf(buf2, sizeof(buf2), "%u", value);
383*4dc78e53SAndroid Build Coastguard Worker break;
384*4dc78e53SAndroid Build Coastguard Worker }
385*4dc78e53SAndroid Build Coastguard Worker
386*4dc78e53SAndroid Build Coastguard Worker inet6_devconf2str(i, buf, sizeof(buf));
387*4dc78e53SAndroid Build Coastguard Worker
388*4dc78e53SAndroid Build Coastguard Worker offset = 23 - strlen(buf2);
389*4dc78e53SAndroid Build Coastguard Worker if (offset < 0)
390*4dc78e53SAndroid Build Coastguard Worker offset = 0;
391*4dc78e53SAndroid Build Coastguard Worker
392*4dc78e53SAndroid Build Coastguard Worker for (x = strlen(buf); x < offset; x++)
393*4dc78e53SAndroid Build Coastguard Worker buf[x] = ' ';
394*4dc78e53SAndroid Build Coastguard Worker
395*4dc78e53SAndroid Build Coastguard Worker _nl_strncpy_trunc(&buf[offset], buf2, sizeof(buf) - offset);
396*4dc78e53SAndroid Build Coastguard Worker
397*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, "%s", buf);
398*4dc78e53SAndroid Build Coastguard Worker
399*4dc78e53SAndroid Build Coastguard Worker if (++n == 3) {
400*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "\n");
401*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, " ");
402*4dc78e53SAndroid Build Coastguard Worker n = 0;
403*4dc78e53SAndroid Build Coastguard Worker } else
404*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " ");
405*4dc78e53SAndroid Build Coastguard Worker }
406*4dc78e53SAndroid Build Coastguard Worker
407*4dc78e53SAndroid Build Coastguard Worker if (n != 0)
408*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "\n");
409*4dc78e53SAndroid Build Coastguard Worker }
410*4dc78e53SAndroid Build Coastguard Worker
inet6_dump_stats(struct rtnl_link * link,struct nl_dump_params * p,void * data)411*4dc78e53SAndroid Build Coastguard Worker static void inet6_dump_stats(struct rtnl_link *link,
412*4dc78e53SAndroid Build Coastguard Worker struct nl_dump_params *p, void *data)
413*4dc78e53SAndroid Build Coastguard Worker {
414*4dc78e53SAndroid Build Coastguard Worker double octets;
415*4dc78e53SAndroid Build Coastguard Worker char *octetsUnit;
416*4dc78e53SAndroid Build Coastguard Worker
417*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " IPv6: InPkts InOctets "
418*4dc78e53SAndroid Build Coastguard Worker " InDiscards InDelivers\n");
419*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " %18" PRIu64 " ", link->l_stats[RTNL_LINK_IP6_INPKTS]);
420*4dc78e53SAndroid Build Coastguard Worker
421*4dc78e53SAndroid Build Coastguard Worker octets = nl_cancel_down_bytes(link->l_stats[RTNL_LINK_IP6_INOCTETS],
422*4dc78e53SAndroid Build Coastguard Worker &octetsUnit);
423*4dc78e53SAndroid Build Coastguard Worker if (octets)
424*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "%14.2f %3s ", octets, octetsUnit);
425*4dc78e53SAndroid Build Coastguard Worker else
426*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "%16u B ", 0);
427*4dc78e53SAndroid Build Coastguard Worker
428*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "%18" PRIu64 " %18" PRIu64 "\n",
429*4dc78e53SAndroid Build Coastguard Worker link->l_stats[RTNL_LINK_IP6_INDISCARDS],
430*4dc78e53SAndroid Build Coastguard Worker link->l_stats[RTNL_LINK_IP6_INDELIVERS]);
431*4dc78e53SAndroid Build Coastguard Worker
432*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " OutPkts OutOctets "
433*4dc78e53SAndroid Build Coastguard Worker " OutDiscards OutForwards\n");
434*4dc78e53SAndroid Build Coastguard Worker
435*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " %18" PRIu64 " ", link->l_stats[RTNL_LINK_IP6_OUTPKTS]);
436*4dc78e53SAndroid Build Coastguard Worker
437*4dc78e53SAndroid Build Coastguard Worker octets = nl_cancel_down_bytes(link->l_stats[RTNL_LINK_IP6_OUTOCTETS],
438*4dc78e53SAndroid Build Coastguard Worker &octetsUnit);
439*4dc78e53SAndroid Build Coastguard Worker if (octets)
440*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "%14.2f %3s ", octets, octetsUnit);
441*4dc78e53SAndroid Build Coastguard Worker else
442*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "%16u B ", 0);
443*4dc78e53SAndroid Build Coastguard Worker
444*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "%18" PRIu64 " %18" PRIu64 "\n",
445*4dc78e53SAndroid Build Coastguard Worker link->l_stats[RTNL_LINK_IP6_OUTDISCARDS],
446*4dc78e53SAndroid Build Coastguard Worker link->l_stats[RTNL_LINK_IP6_OUTFORWDATAGRAMS]);
447*4dc78e53SAndroid Build Coastguard Worker
448*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " InMcastPkts InMcastOctets "
449*4dc78e53SAndroid Build Coastguard Worker " InBcastPkts InBcastOctests\n");
450*4dc78e53SAndroid Build Coastguard Worker
451*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " %18" PRIu64 " ", link->l_stats[RTNL_LINK_IP6_INMCASTPKTS]);
452*4dc78e53SAndroid Build Coastguard Worker
453*4dc78e53SAndroid Build Coastguard Worker octets = nl_cancel_down_bytes(link->l_stats[RTNL_LINK_IP6_INMCASTOCTETS],
454*4dc78e53SAndroid Build Coastguard Worker &octetsUnit);
455*4dc78e53SAndroid Build Coastguard Worker if (octets)
456*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "%14.2f %3s ", octets, octetsUnit);
457*4dc78e53SAndroid Build Coastguard Worker else
458*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "%16u B ", 0);
459*4dc78e53SAndroid Build Coastguard Worker
460*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "%18" PRIu64 " ", link->l_stats[RTNL_LINK_IP6_INBCASTPKTS]);
461*4dc78e53SAndroid Build Coastguard Worker octets = nl_cancel_down_bytes(link->l_stats[RTNL_LINK_IP6_INBCASTOCTETS],
462*4dc78e53SAndroid Build Coastguard Worker &octetsUnit);
463*4dc78e53SAndroid Build Coastguard Worker if (octets)
464*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "%14.2f %3s\n", octets, octetsUnit);
465*4dc78e53SAndroid Build Coastguard Worker else
466*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "%16u B\n", 0);
467*4dc78e53SAndroid Build Coastguard Worker
468*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " OutMcastPkts OutMcastOctets "
469*4dc78e53SAndroid Build Coastguard Worker " OutBcastPkts OutBcastOctests\n");
470*4dc78e53SAndroid Build Coastguard Worker
471*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " %18" PRIu64 " ", link->l_stats[RTNL_LINK_IP6_OUTMCASTPKTS]);
472*4dc78e53SAndroid Build Coastguard Worker
473*4dc78e53SAndroid Build Coastguard Worker octets = nl_cancel_down_bytes(link->l_stats[RTNL_LINK_IP6_OUTMCASTOCTETS],
474*4dc78e53SAndroid Build Coastguard Worker &octetsUnit);
475*4dc78e53SAndroid Build Coastguard Worker if (octets)
476*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "%14.2f %3s ", octets, octetsUnit);
477*4dc78e53SAndroid Build Coastguard Worker else
478*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "%16u B ", 0);
479*4dc78e53SAndroid Build Coastguard Worker
480*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "%18" PRIu64 " ", link->l_stats[RTNL_LINK_IP6_OUTBCASTPKTS]);
481*4dc78e53SAndroid Build Coastguard Worker octets = nl_cancel_down_bytes(link->l_stats[RTNL_LINK_IP6_OUTBCASTOCTETS],
482*4dc78e53SAndroid Build Coastguard Worker &octetsUnit);
483*4dc78e53SAndroid Build Coastguard Worker if (octets)
484*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "%14.2f %3s\n", octets, octetsUnit);
485*4dc78e53SAndroid Build Coastguard Worker else
486*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "%16u B\n", 0);
487*4dc78e53SAndroid Build Coastguard Worker
488*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " ReasmOKs ReasmFails "
489*4dc78e53SAndroid Build Coastguard Worker " ReasmReqds ReasmTimeout\n");
490*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " %18" PRIu64 " %18" PRIu64 " %18" PRIu64 " %18" PRIu64 "\n",
491*4dc78e53SAndroid Build Coastguard Worker link->l_stats[RTNL_LINK_IP6_REASMOKS],
492*4dc78e53SAndroid Build Coastguard Worker link->l_stats[RTNL_LINK_IP6_REASMFAILS],
493*4dc78e53SAndroid Build Coastguard Worker link->l_stats[RTNL_LINK_IP6_REASMREQDS],
494*4dc78e53SAndroid Build Coastguard Worker link->l_stats[RTNL_LINK_IP6_REASMTIMEOUT]);
495*4dc78e53SAndroid Build Coastguard Worker
496*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " FragOKs FragFails "
497*4dc78e53SAndroid Build Coastguard Worker " FragCreates\n");
498*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " %18" PRIu64 " %18" PRIu64 " %18" PRIu64 "\n",
499*4dc78e53SAndroid Build Coastguard Worker link->l_stats[RTNL_LINK_IP6_FRAGOKS],
500*4dc78e53SAndroid Build Coastguard Worker link->l_stats[RTNL_LINK_IP6_FRAGFAILS],
501*4dc78e53SAndroid Build Coastguard Worker link->l_stats[RTNL_LINK_IP6_FRAGCREATES]);
502*4dc78e53SAndroid Build Coastguard Worker
503*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " InHdrErrors InTooBigErrors "
504*4dc78e53SAndroid Build Coastguard Worker " InNoRoutes InAddrErrors\n");
505*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " %18" PRIu64 " %18" PRIu64 " %18" PRIu64 " %18" PRIu64 "\n",
506*4dc78e53SAndroid Build Coastguard Worker link->l_stats[RTNL_LINK_IP6_INHDRERRORS],
507*4dc78e53SAndroid Build Coastguard Worker link->l_stats[RTNL_LINK_IP6_INTOOBIGERRORS],
508*4dc78e53SAndroid Build Coastguard Worker link->l_stats[RTNL_LINK_IP6_INNOROUTES],
509*4dc78e53SAndroid Build Coastguard Worker link->l_stats[RTNL_LINK_IP6_INADDRERRORS]);
510*4dc78e53SAndroid Build Coastguard Worker
511*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " InUnknownProtos InTruncatedPkts "
512*4dc78e53SAndroid Build Coastguard Worker " OutNoRoutes InCsumErrors\n");
513*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " %18" PRIu64 " %18" PRIu64 " %18" PRIu64 " %18" PRIu64 "\n",
514*4dc78e53SAndroid Build Coastguard Worker link->l_stats[RTNL_LINK_IP6_INUNKNOWNPROTOS],
515*4dc78e53SAndroid Build Coastguard Worker link->l_stats[RTNL_LINK_IP6_INTRUNCATEDPKTS],
516*4dc78e53SAndroid Build Coastguard Worker link->l_stats[RTNL_LINK_IP6_OUTNOROUTES],
517*4dc78e53SAndroid Build Coastguard Worker link->l_stats[RTNL_LINK_IP6_CSUMERRORS]);
518*4dc78e53SAndroid Build Coastguard Worker
519*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " InNoECTPkts InECT1Pkts "
520*4dc78e53SAndroid Build Coastguard Worker " InECT0Pkts InCEPkts\n");
521*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " %18" PRIu64 " %18" PRIu64 " %18" PRIu64 " %18" PRIu64 "\n",
522*4dc78e53SAndroid Build Coastguard Worker link->l_stats[RTNL_LINK_IP6_NOECTPKTS],
523*4dc78e53SAndroid Build Coastguard Worker link->l_stats[RTNL_LINK_IP6_ECT1PKTS],
524*4dc78e53SAndroid Build Coastguard Worker link->l_stats[RTNL_LINK_IP6_ECT0PKTS],
525*4dc78e53SAndroid Build Coastguard Worker link->l_stats[RTNL_LINK_IP6_CEPKTS]);
526*4dc78e53SAndroid Build Coastguard Worker
527*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " ICMPv6: InMsgs InErrors "
528*4dc78e53SAndroid Build Coastguard Worker " OutMsgs OutErrors InCsumErrors\n");
529*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " %18" PRIu64 " %18" PRIu64 " %18" PRIu64 " %18" PRIu64 " %18" PRIu64 "\n",
530*4dc78e53SAndroid Build Coastguard Worker link->l_stats[RTNL_LINK_ICMP6_INMSGS],
531*4dc78e53SAndroid Build Coastguard Worker link->l_stats[RTNL_LINK_ICMP6_INERRORS],
532*4dc78e53SAndroid Build Coastguard Worker link->l_stats[RTNL_LINK_ICMP6_OUTMSGS],
533*4dc78e53SAndroid Build Coastguard Worker link->l_stats[RTNL_LINK_ICMP6_OUTERRORS],
534*4dc78e53SAndroid Build Coastguard Worker link->l_stats[RTNL_LINK_ICMP6_CSUMERRORS]);
535*4dc78e53SAndroid Build Coastguard Worker }
536*4dc78e53SAndroid Build Coastguard Worker
537*4dc78e53SAndroid Build Coastguard Worker static const struct nla_policy protinfo_policy = {
538*4dc78e53SAndroid Build Coastguard Worker .type = NLA_NESTED,
539*4dc78e53SAndroid Build Coastguard Worker };
540*4dc78e53SAndroid Build Coastguard Worker
541*4dc78e53SAndroid Build Coastguard Worker static struct rtnl_link_af_ops inet6_ops = {
542*4dc78e53SAndroid Build Coastguard Worker .ao_family = AF_INET6,
543*4dc78e53SAndroid Build Coastguard Worker .ao_alloc = &inet6_alloc,
544*4dc78e53SAndroid Build Coastguard Worker .ao_clone = &inet6_clone,
545*4dc78e53SAndroid Build Coastguard Worker .ao_free = &inet6_free,
546*4dc78e53SAndroid Build Coastguard Worker .ao_parse_protinfo = &inet6_parse_protinfo,
547*4dc78e53SAndroid Build Coastguard Worker .ao_parse_af = &inet6_parse_protinfo,
548*4dc78e53SAndroid Build Coastguard Worker .ao_fill_af = &inet6_fill_af,
549*4dc78e53SAndroid Build Coastguard Worker .ao_dump[NL_DUMP_DETAILS] = &inet6_dump_details,
550*4dc78e53SAndroid Build Coastguard Worker .ao_dump[NL_DUMP_STATS] = &inet6_dump_stats,
551*4dc78e53SAndroid Build Coastguard Worker .ao_protinfo_policy = &protinfo_policy,
552*4dc78e53SAndroid Build Coastguard Worker };
553*4dc78e53SAndroid Build Coastguard Worker
554*4dc78e53SAndroid Build Coastguard Worker /**
555*4dc78e53SAndroid Build Coastguard Worker * Return IPv6 specific flags
556*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
557*4dc78e53SAndroid Build Coastguard Worker * @arg out_flags Flags on success
558*4dc78e53SAndroid Build Coastguard Worker *
559*4dc78e53SAndroid Build Coastguard Worker * Returns the link's IPv6 flags.
560*4dc78e53SAndroid Build Coastguard Worker *
561*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success
562*4dc78e53SAndroid Build Coastguard Worker * @return -NLE_NOATTR configuration setting not available
563*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_inet6_get_flags(struct rtnl_link * link,uint32_t * out_flags)564*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_inet6_get_flags(struct rtnl_link *link, uint32_t* out_flags)
565*4dc78e53SAndroid Build Coastguard Worker {
566*4dc78e53SAndroid Build Coastguard Worker struct inet6_data *id = NULL;
567*4dc78e53SAndroid Build Coastguard Worker
568*4dc78e53SAndroid Build Coastguard Worker if (!(id = rtnl_link_af_data(link, &inet6_ops)))
569*4dc78e53SAndroid Build Coastguard Worker return -NLE_NOATTR;
570*4dc78e53SAndroid Build Coastguard Worker
571*4dc78e53SAndroid Build Coastguard Worker *out_flags = id->i6_flags;
572*4dc78e53SAndroid Build Coastguard Worker return 0;
573*4dc78e53SAndroid Build Coastguard Worker }
574*4dc78e53SAndroid Build Coastguard Worker
575*4dc78e53SAndroid Build Coastguard Worker /**
576*4dc78e53SAndroid Build Coastguard Worker * Set IPv6 specific flags
577*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
578*4dc78e53SAndroid Build Coastguard Worker * @arg flags Flags to set
579*4dc78e53SAndroid Build Coastguard Worker *
580*4dc78e53SAndroid Build Coastguard Worker * Sets the link's IPv6 specific flags. Overwrites currently set flags.
581*4dc78e53SAndroid Build Coastguard Worker *
582*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success
583*4dc78e53SAndroid Build Coastguard Worker * @return -NLE_NOMEM could not allocate inet6 data
584*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_inet6_set_flags(struct rtnl_link * link,uint32_t flags)585*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_inet6_set_flags(struct rtnl_link *link, uint32_t flags)
586*4dc78e53SAndroid Build Coastguard Worker {
587*4dc78e53SAndroid Build Coastguard Worker struct inet6_data *id;
588*4dc78e53SAndroid Build Coastguard Worker
589*4dc78e53SAndroid Build Coastguard Worker if (!(id = rtnl_link_af_alloc(link, &inet6_ops)))
590*4dc78e53SAndroid Build Coastguard Worker return -NLE_NOMEM;
591*4dc78e53SAndroid Build Coastguard Worker
592*4dc78e53SAndroid Build Coastguard Worker id->i6_flags = flags;
593*4dc78e53SAndroid Build Coastguard Worker return 0;
594*4dc78e53SAndroid Build Coastguard Worker }
595*4dc78e53SAndroid Build Coastguard Worker
596*4dc78e53SAndroid Build Coastguard Worker /**
597*4dc78e53SAndroid Build Coastguard Worker * Get IPv6 tokenized interface identifier
598*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
599*4dc78e53SAndroid Build Coastguard Worker * @arg token Tokenized interface identifier on success
600*4dc78e53SAndroid Build Coastguard Worker *
601*4dc78e53SAndroid Build Coastguard Worker * Returns the link's IPv6 tokenized interface identifier.
602*4dc78e53SAndroid Build Coastguard Worker *
603*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success
604*4dc78e53SAndroid Build Coastguard Worker * @return -NLE_NOMEM failure to allocate struct nl_addr result
605*4dc78e53SAndroid Build Coastguard Worker * @return -NLE_NOATTR configuration setting not available
606*4dc78e53SAndroid Build Coastguard Worker * @return -NLE_NOADDR tokenized interface identifier is not set
607*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_inet6_get_token(struct rtnl_link * link,struct nl_addr ** addr)608*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_inet6_get_token(struct rtnl_link *link, struct nl_addr **addr)
609*4dc78e53SAndroid Build Coastguard Worker {
610*4dc78e53SAndroid Build Coastguard Worker struct inet6_data *id;
611*4dc78e53SAndroid Build Coastguard Worker
612*4dc78e53SAndroid Build Coastguard Worker if (!(id = rtnl_link_af_data(link, &inet6_ops)))
613*4dc78e53SAndroid Build Coastguard Worker return -NLE_NOATTR;
614*4dc78e53SAndroid Build Coastguard Worker
615*4dc78e53SAndroid Build Coastguard Worker *addr = nl_addr_build(AF_INET6, &id->i6_token, sizeof(id->i6_token));
616*4dc78e53SAndroid Build Coastguard Worker if (!*addr)
617*4dc78e53SAndroid Build Coastguard Worker return -NLE_NOMEM;
618*4dc78e53SAndroid Build Coastguard Worker if (nl_addr_iszero(*addr)) {
619*4dc78e53SAndroid Build Coastguard Worker nl_addr_put(*addr);
620*4dc78e53SAndroid Build Coastguard Worker *addr = NULL;
621*4dc78e53SAndroid Build Coastguard Worker return -NLE_NOADDR;
622*4dc78e53SAndroid Build Coastguard Worker }
623*4dc78e53SAndroid Build Coastguard Worker
624*4dc78e53SAndroid Build Coastguard Worker return 0;
625*4dc78e53SAndroid Build Coastguard Worker }
626*4dc78e53SAndroid Build Coastguard Worker
627*4dc78e53SAndroid Build Coastguard Worker /**
628*4dc78e53SAndroid Build Coastguard Worker * Set IPv6 tokenized interface identifier
629*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
630*4dc78e53SAndroid Build Coastguard Worker * @arg token Tokenized interface identifier
631*4dc78e53SAndroid Build Coastguard Worker *
632*4dc78e53SAndroid Build Coastguard Worker * Sets the link's IPv6 tokenized interface identifier.
633*4dc78e53SAndroid Build Coastguard Worker *
634*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success
635*4dc78e53SAndroid Build Coastguard Worker * @return -NLE_NOMEM could not allocate inet6 data
636*4dc78e53SAndroid Build Coastguard Worker * @return -NLE_INVAL addr is not a valid inet6 address
637*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_inet6_set_token(struct rtnl_link * link,struct nl_addr * addr)638*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_inet6_set_token(struct rtnl_link *link, struct nl_addr *addr)
639*4dc78e53SAndroid Build Coastguard Worker {
640*4dc78e53SAndroid Build Coastguard Worker struct inet6_data *id;
641*4dc78e53SAndroid Build Coastguard Worker
642*4dc78e53SAndroid Build Coastguard Worker if ((nl_addr_get_family(addr) != AF_INET6) ||
643*4dc78e53SAndroid Build Coastguard Worker (nl_addr_get_len(addr) != sizeof(id->i6_token)))
644*4dc78e53SAndroid Build Coastguard Worker return -NLE_INVAL;
645*4dc78e53SAndroid Build Coastguard Worker
646*4dc78e53SAndroid Build Coastguard Worker if (!(id = rtnl_link_af_alloc(link, &inet6_ops)))
647*4dc78e53SAndroid Build Coastguard Worker return -NLE_NOMEM;
648*4dc78e53SAndroid Build Coastguard Worker
649*4dc78e53SAndroid Build Coastguard Worker memcpy(&id->i6_token, nl_addr_get_binary_addr(addr),
650*4dc78e53SAndroid Build Coastguard Worker sizeof(id->i6_token));
651*4dc78e53SAndroid Build Coastguard Worker return 0;
652*4dc78e53SAndroid Build Coastguard Worker }
653*4dc78e53SAndroid Build Coastguard Worker
654*4dc78e53SAndroid Build Coastguard Worker /**
655*4dc78e53SAndroid Build Coastguard Worker * Get IPv6 link-local address generation mode
656*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
657*4dc78e53SAndroid Build Coastguard Worker * @arg mode Generation mode on success
658*4dc78e53SAndroid Build Coastguard Worker *
659*4dc78e53SAndroid Build Coastguard Worker * Returns the link's IPv6 link-local address generation mode.
660*4dc78e53SAndroid Build Coastguard Worker *
661*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success
662*4dc78e53SAndroid Build Coastguard Worker * @return -NLE_NOATTR configuration setting not available
663*4dc78e53SAndroid Build Coastguard Worker * @return -NLE_INVAL generation mode unknown. If the link was received via
664*4dc78e53SAndroid Build Coastguard Worker * netlink, it means that address generation mode is not
665*4dc78e53SAndroid Build Coastguard Worker * supported by the kernel.
666*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_inet6_get_addr_gen_mode(struct rtnl_link * link,uint8_t * mode)667*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_inet6_get_addr_gen_mode(struct rtnl_link *link, uint8_t *mode)
668*4dc78e53SAndroid Build Coastguard Worker {
669*4dc78e53SAndroid Build Coastguard Worker struct inet6_data *id;
670*4dc78e53SAndroid Build Coastguard Worker
671*4dc78e53SAndroid Build Coastguard Worker if (!(id = rtnl_link_af_data(link, &inet6_ops)))
672*4dc78e53SAndroid Build Coastguard Worker return -NLE_NOATTR;
673*4dc78e53SAndroid Build Coastguard Worker
674*4dc78e53SAndroid Build Coastguard Worker if (id->i6_addr_gen_mode == I6_ADDR_GEN_MODE_UNKNOWN)
675*4dc78e53SAndroid Build Coastguard Worker return -NLE_INVAL;
676*4dc78e53SAndroid Build Coastguard Worker
677*4dc78e53SAndroid Build Coastguard Worker *mode = id->i6_addr_gen_mode;
678*4dc78e53SAndroid Build Coastguard Worker return 0;
679*4dc78e53SAndroid Build Coastguard Worker }
680*4dc78e53SAndroid Build Coastguard Worker
681*4dc78e53SAndroid Build Coastguard Worker /**
682*4dc78e53SAndroid Build Coastguard Worker * Set IPv6 link-local address generation mode
683*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
684*4dc78e53SAndroid Build Coastguard Worker * @arg mode Generation mode
685*4dc78e53SAndroid Build Coastguard Worker *
686*4dc78e53SAndroid Build Coastguard Worker * Sets the link's IPv6 link-local address generation mode.
687*4dc78e53SAndroid Build Coastguard Worker *
688*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success
689*4dc78e53SAndroid Build Coastguard Worker * @return -NLE_NOMEM could not allocate inet6 data
690*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_inet6_set_addr_gen_mode(struct rtnl_link * link,uint8_t mode)691*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_inet6_set_addr_gen_mode(struct rtnl_link *link, uint8_t mode)
692*4dc78e53SAndroid Build Coastguard Worker {
693*4dc78e53SAndroid Build Coastguard Worker struct inet6_data *id;
694*4dc78e53SAndroid Build Coastguard Worker
695*4dc78e53SAndroid Build Coastguard Worker if (!(id = rtnl_link_af_alloc(link, &inet6_ops)))
696*4dc78e53SAndroid Build Coastguard Worker return -NLE_NOMEM;
697*4dc78e53SAndroid Build Coastguard Worker
698*4dc78e53SAndroid Build Coastguard Worker id->i6_addr_gen_mode = mode;
699*4dc78e53SAndroid Build Coastguard Worker return 0;
700*4dc78e53SAndroid Build Coastguard Worker }
701*4dc78e53SAndroid Build Coastguard Worker
702*4dc78e53SAndroid Build Coastguard Worker /**
703*4dc78e53SAndroid Build Coastguard Worker * Get value of a ipv6 link configuration setting
704*4dc78e53SAndroid Build Coastguard Worker * @arg link Link object
705*4dc78e53SAndroid Build Coastguard Worker * @arg cfgid Configuration identifier
706*4dc78e53SAndroid Build Coastguard Worker * @arg res Result pointer
707*4dc78e53SAndroid Build Coastguard Worker *
708*4dc78e53SAndroid Build Coastguard Worker * Stores the value of the specified configuration setting in the provided
709*4dc78e53SAndroid Build Coastguard Worker * result pointer.
710*4dc78e53SAndroid Build Coastguard Worker *
711*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code.
712*4dc78e53SAndroid Build Coastguard Worker * @return -NLE_RANGE cfgid is out of range or not provided by kernel.
713*4dc78e53SAndroid Build Coastguard Worker * @return -NLE_NOATTR configuration setting not available
714*4dc78e53SAndroid Build Coastguard Worker */
rtnl_link_inet6_get_conf(struct rtnl_link * link,unsigned int cfgid,uint32_t * res)715*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_inet6_get_conf(struct rtnl_link *link, unsigned int cfgid,
716*4dc78e53SAndroid Build Coastguard Worker uint32_t *res)
717*4dc78e53SAndroid Build Coastguard Worker {
718*4dc78e53SAndroid Build Coastguard Worker struct inet6_data *id;
719*4dc78e53SAndroid Build Coastguard Worker
720*4dc78e53SAndroid Build Coastguard Worker if (!(id = rtnl_link_af_data(link, &inet6_ops)))
721*4dc78e53SAndroid Build Coastguard Worker return -NLE_NOATTR;
722*4dc78e53SAndroid Build Coastguard Worker
723*4dc78e53SAndroid Build Coastguard Worker if (cfgid >= id->i6_conf_len)
724*4dc78e53SAndroid Build Coastguard Worker return -NLE_RANGE;
725*4dc78e53SAndroid Build Coastguard Worker
726*4dc78e53SAndroid Build Coastguard Worker *res = id->i6_conf[cfgid];
727*4dc78e53SAndroid Build Coastguard Worker
728*4dc78e53SAndroid Build Coastguard Worker return 0;
729*4dc78e53SAndroid Build Coastguard Worker }
730*4dc78e53SAndroid Build Coastguard Worker
731*4dc78e53SAndroid Build Coastguard Worker
inet6_init(void)732*4dc78e53SAndroid Build Coastguard Worker static void _nl_init inet6_init(void)
733*4dc78e53SAndroid Build Coastguard Worker {
734*4dc78e53SAndroid Build Coastguard Worker rtnl_link_af_register(&inet6_ops);
735*4dc78e53SAndroid Build Coastguard Worker }
736*4dc78e53SAndroid Build Coastguard Worker
inet6_exit(void)737*4dc78e53SAndroid Build Coastguard Worker static void _nl_exit inet6_exit(void)
738*4dc78e53SAndroid Build Coastguard Worker {
739*4dc78e53SAndroid Build Coastguard Worker rtnl_link_af_unregister(&inet6_ops);
740*4dc78e53SAndroid Build Coastguard Worker }
741