1*4dc78e53SAndroid Build Coastguard Worker /* SPDX-License-Identifier: LGPL-2.1-only */
2*4dc78e53SAndroid Build Coastguard Worker /*
3*4dc78e53SAndroid Build Coastguard Worker * Copyright (c) 2003-2008 Thomas Graf <[email protected]>
4*4dc78e53SAndroid Build Coastguard Worker */
5*4dc78e53SAndroid Build Coastguard Worker
6*4dc78e53SAndroid Build Coastguard Worker /**
7*4dc78e53SAndroid Build Coastguard Worker * @ingroup rtnl
8*4dc78e53SAndroid Build Coastguard Worker * @defgroup neightbl Neighbour Tables
9*4dc78e53SAndroid Build Coastguard Worker * @brief
10*4dc78e53SAndroid Build Coastguard Worker * @{
11*4dc78e53SAndroid Build Coastguard Worker */
12*4dc78e53SAndroid Build Coastguard Worker
13*4dc78e53SAndroid Build Coastguard Worker #include "nl-default.h"
14*4dc78e53SAndroid Build Coastguard Worker
15*4dc78e53SAndroid Build Coastguard Worker #include <netlink/netlink.h>
16*4dc78e53SAndroid Build Coastguard Worker #include <netlink/utils.h>
17*4dc78e53SAndroid Build Coastguard Worker #include <netlink/route/rtnl.h>
18*4dc78e53SAndroid Build Coastguard Worker #include <netlink/route/neightbl.h>
19*4dc78e53SAndroid Build Coastguard Worker #include <netlink/route/link.h>
20*4dc78e53SAndroid Build Coastguard Worker
21*4dc78e53SAndroid Build Coastguard Worker #include "nl-route.h"
22*4dc78e53SAndroid Build Coastguard Worker #include "nl-priv-dynamic-core/nl-core.h"
23*4dc78e53SAndroid Build Coastguard Worker #include "nl-priv-dynamic-core/cache-api.h"
24*4dc78e53SAndroid Build Coastguard Worker
25*4dc78e53SAndroid Build Coastguard Worker struct rtnl_neightbl_parms {
26*4dc78e53SAndroid Build Coastguard Worker /**
27*4dc78e53SAndroid Build Coastguard Worker * Interface index of the device this parameter set is assigned
28*4dc78e53SAndroid Build Coastguard Worker * to or 0 for the default set.
29*4dc78e53SAndroid Build Coastguard Worker */
30*4dc78e53SAndroid Build Coastguard Worker uint32_t ntp_ifindex;
31*4dc78e53SAndroid Build Coastguard Worker
32*4dc78e53SAndroid Build Coastguard Worker /**
33*4dc78e53SAndroid Build Coastguard Worker * Number of references to this parameter set.
34*4dc78e53SAndroid Build Coastguard Worker */
35*4dc78e53SAndroid Build Coastguard Worker uint32_t ntp_refcnt;
36*4dc78e53SAndroid Build Coastguard Worker
37*4dc78e53SAndroid Build Coastguard Worker /**
38*4dc78e53SAndroid Build Coastguard Worker * Queue length for pending arp requests, i.e. the number of
39*4dc78e53SAndroid Build Coastguard Worker * packets which are accepted from other layers while the
40*4dc78e53SAndroid Build Coastguard Worker * neighbour address is still being resolved
41*4dc78e53SAndroid Build Coastguard Worker */
42*4dc78e53SAndroid Build Coastguard Worker uint32_t ntp_queue_len;
43*4dc78e53SAndroid Build Coastguard Worker
44*4dc78e53SAndroid Build Coastguard Worker /**
45*4dc78e53SAndroid Build Coastguard Worker * Number of requests to send to the user level ARP daemon.
46*4dc78e53SAndroid Build Coastguard Worker * Specify 0 to disable.
47*4dc78e53SAndroid Build Coastguard Worker */
48*4dc78e53SAndroid Build Coastguard Worker uint32_t ntp_app_probes;
49*4dc78e53SAndroid Build Coastguard Worker
50*4dc78e53SAndroid Build Coastguard Worker /**
51*4dc78e53SAndroid Build Coastguard Worker * Maximum number of retries for unicast solicitation.
52*4dc78e53SAndroid Build Coastguard Worker */
53*4dc78e53SAndroid Build Coastguard Worker uint32_t ntp_ucast_probes;
54*4dc78e53SAndroid Build Coastguard Worker
55*4dc78e53SAndroid Build Coastguard Worker /**
56*4dc78e53SAndroid Build Coastguard Worker * Maximum number of retries for multicast solicitation.
57*4dc78e53SAndroid Build Coastguard Worker */
58*4dc78e53SAndroid Build Coastguard Worker uint32_t ntp_mcast_probes;
59*4dc78e53SAndroid Build Coastguard Worker
60*4dc78e53SAndroid Build Coastguard Worker /**
61*4dc78e53SAndroid Build Coastguard Worker * Base value in milliseconds to ompute reachable time, see RFC2461.
62*4dc78e53SAndroid Build Coastguard Worker */
63*4dc78e53SAndroid Build Coastguard Worker uint64_t ntp_base_reachable_time;
64*4dc78e53SAndroid Build Coastguard Worker
65*4dc78e53SAndroid Build Coastguard Worker /**
66*4dc78e53SAndroid Build Coastguard Worker * Actual reachable time (read-only)
67*4dc78e53SAndroid Build Coastguard Worker */
68*4dc78e53SAndroid Build Coastguard Worker uint64_t ntp_reachable_time; /* secs */
69*4dc78e53SAndroid Build Coastguard Worker
70*4dc78e53SAndroid Build Coastguard Worker /**
71*4dc78e53SAndroid Build Coastguard Worker * The time in milliseconds between retransmitted Neighbor
72*4dc78e53SAndroid Build Coastguard Worker * Solicitation messages.
73*4dc78e53SAndroid Build Coastguard Worker */
74*4dc78e53SAndroid Build Coastguard Worker uint64_t ntp_retrans_time;
75*4dc78e53SAndroid Build Coastguard Worker
76*4dc78e53SAndroid Build Coastguard Worker /**
77*4dc78e53SAndroid Build Coastguard Worker * Interval in milliseconds to check for stale neighbour
78*4dc78e53SAndroid Build Coastguard Worker * entries.
79*4dc78e53SAndroid Build Coastguard Worker */
80*4dc78e53SAndroid Build Coastguard Worker uint64_t ntp_gc_stale_time; /* secs */
81*4dc78e53SAndroid Build Coastguard Worker
82*4dc78e53SAndroid Build Coastguard Worker /**
83*4dc78e53SAndroid Build Coastguard Worker * Delay in milliseconds for the first time probe if
84*4dc78e53SAndroid Build Coastguard Worker * the neighbour is reachable.
85*4dc78e53SAndroid Build Coastguard Worker */
86*4dc78e53SAndroid Build Coastguard Worker uint64_t ntp_probe_delay; /* secs */
87*4dc78e53SAndroid Build Coastguard Worker
88*4dc78e53SAndroid Build Coastguard Worker /**
89*4dc78e53SAndroid Build Coastguard Worker * Maximum delay in milliseconds of an answer to a neighbour
90*4dc78e53SAndroid Build Coastguard Worker * solicitation message.
91*4dc78e53SAndroid Build Coastguard Worker */
92*4dc78e53SAndroid Build Coastguard Worker uint64_t ntp_anycast_delay;
93*4dc78e53SAndroid Build Coastguard Worker
94*4dc78e53SAndroid Build Coastguard Worker /**
95*4dc78e53SAndroid Build Coastguard Worker * Minimum age in milliseconds before a neighbour entry
96*4dc78e53SAndroid Build Coastguard Worker * may be replaced.
97*4dc78e53SAndroid Build Coastguard Worker */
98*4dc78e53SAndroid Build Coastguard Worker uint64_t ntp_locktime;
99*4dc78e53SAndroid Build Coastguard Worker
100*4dc78e53SAndroid Build Coastguard Worker /**
101*4dc78e53SAndroid Build Coastguard Worker * Delay in milliseconds before answering to an ARP request
102*4dc78e53SAndroid Build Coastguard Worker * for which a proxy ARP entry exists.
103*4dc78e53SAndroid Build Coastguard Worker */
104*4dc78e53SAndroid Build Coastguard Worker uint64_t ntp_proxy_delay;
105*4dc78e53SAndroid Build Coastguard Worker
106*4dc78e53SAndroid Build Coastguard Worker /**
107*4dc78e53SAndroid Build Coastguard Worker * Queue length for the delayed proxy arp requests.
108*4dc78e53SAndroid Build Coastguard Worker */
109*4dc78e53SAndroid Build Coastguard Worker uint32_t ntp_proxy_qlen;
110*4dc78e53SAndroid Build Coastguard Worker
111*4dc78e53SAndroid Build Coastguard Worker /**
112*4dc78e53SAndroid Build Coastguard Worker * Mask of available parameter attributes
113*4dc78e53SAndroid Build Coastguard Worker */
114*4dc78e53SAndroid Build Coastguard Worker uint32_t ntp_mask;
115*4dc78e53SAndroid Build Coastguard Worker };
116*4dc78e53SAndroid Build Coastguard Worker
117*4dc78e53SAndroid Build Coastguard Worker #define NTBLNAMSIZ 32
118*4dc78e53SAndroid Build Coastguard Worker
119*4dc78e53SAndroid Build Coastguard Worker /**
120*4dc78e53SAndroid Build Coastguard Worker * Neighbour table
121*4dc78e53SAndroid Build Coastguard Worker * @ingroup neightbl
122*4dc78e53SAndroid Build Coastguard Worker */
123*4dc78e53SAndroid Build Coastguard Worker struct rtnl_neightbl {
124*4dc78e53SAndroid Build Coastguard Worker NLHDR_COMMON
125*4dc78e53SAndroid Build Coastguard Worker
126*4dc78e53SAndroid Build Coastguard Worker char nt_name[NTBLNAMSIZ];
127*4dc78e53SAndroid Build Coastguard Worker uint32_t nt_family;
128*4dc78e53SAndroid Build Coastguard Worker uint32_t nt_gc_thresh1;
129*4dc78e53SAndroid Build Coastguard Worker uint32_t nt_gc_thresh2;
130*4dc78e53SAndroid Build Coastguard Worker uint32_t nt_gc_thresh3;
131*4dc78e53SAndroid Build Coastguard Worker uint64_t nt_gc_interval;
132*4dc78e53SAndroid Build Coastguard Worker struct ndt_config nt_config;
133*4dc78e53SAndroid Build Coastguard Worker struct rtnl_neightbl_parms nt_parms;
134*4dc78e53SAndroid Build Coastguard Worker struct ndt_stats nt_stats;
135*4dc78e53SAndroid Build Coastguard Worker };
136*4dc78e53SAndroid Build Coastguard Worker
137*4dc78e53SAndroid Build Coastguard Worker /** @cond SKIP */
138*4dc78e53SAndroid Build Coastguard Worker #define NEIGHTBL_ATTR_FAMILY 0x001
139*4dc78e53SAndroid Build Coastguard Worker #define NEIGHTBL_ATTR_STATS 0x002
140*4dc78e53SAndroid Build Coastguard Worker #define NEIGHTBL_ATTR_NAME 0x004
141*4dc78e53SAndroid Build Coastguard Worker #define NEIGHTBL_ATTR_THRESH1 0x008
142*4dc78e53SAndroid Build Coastguard Worker #define NEIGHTBL_ATTR_THRESH2 0x010
143*4dc78e53SAndroid Build Coastguard Worker #define NEIGHTBL_ATTR_THRESH3 0x020
144*4dc78e53SAndroid Build Coastguard Worker #define NEIGHTBL_ATTR_CONFIG 0x040
145*4dc78e53SAndroid Build Coastguard Worker #define NEIGHTBL_ATTR_PARMS 0x080
146*4dc78e53SAndroid Build Coastguard Worker #define NEIGHTBL_ATTR_GC_INTERVAL 0x100
147*4dc78e53SAndroid Build Coastguard Worker
148*4dc78e53SAndroid Build Coastguard Worker #define NEIGHTBLPARM_ATTR_IFINDEX 0x0001
149*4dc78e53SAndroid Build Coastguard Worker #define NEIGHTBLPARM_ATTR_REFCNT 0x0002
150*4dc78e53SAndroid Build Coastguard Worker #define NEIGHTBLPARM_ATTR_QUEUE_LEN 0x0004
151*4dc78e53SAndroid Build Coastguard Worker #define NEIGHTBLPARM_ATTR_APP_PROBES 0x0008
152*4dc78e53SAndroid Build Coastguard Worker #define NEIGHTBLPARM_ATTR_UCAST_PROBES 0x0010
153*4dc78e53SAndroid Build Coastguard Worker #define NEIGHTBLPARM_ATTR_MCAST_PROBES 0x0020
154*4dc78e53SAndroid Build Coastguard Worker #define NEIGHTBLPARM_ATTR_PROXY_QLEN 0x0040
155*4dc78e53SAndroid Build Coastguard Worker #define NEIGHTBLPARM_ATTR_REACHABLE_TIME 0x0080
156*4dc78e53SAndroid Build Coastguard Worker #define NEIGHTBLPARM_ATTR_BASE_REACHABLE_TIME 0x0100
157*4dc78e53SAndroid Build Coastguard Worker #define NEIGHTBLPARM_ATTR_RETRANS_TIME 0x0200
158*4dc78e53SAndroid Build Coastguard Worker #define NEIGHTBLPARM_ATTR_GC_STALETIME 0x0400
159*4dc78e53SAndroid Build Coastguard Worker #define NEIGHTBLPARM_ATTR_DELAY_PROBE_TIME 0x0800
160*4dc78e53SAndroid Build Coastguard Worker #define NEIGHTBLPARM_ATTR_ANYCAST_DELAY 0x1000
161*4dc78e53SAndroid Build Coastguard Worker #define NEIGHTBLPARM_ATTR_PROXY_DELAY 0x2000
162*4dc78e53SAndroid Build Coastguard Worker #define NEIGHTBLPARM_ATTR_LOCKTIME 0x4000
163*4dc78e53SAndroid Build Coastguard Worker
164*4dc78e53SAndroid Build Coastguard Worker static struct nl_cache_ops rtnl_neightbl_ops;
165*4dc78e53SAndroid Build Coastguard Worker static struct nl_object_ops neightbl_obj_ops;
166*4dc78e53SAndroid Build Coastguard Worker /** @endcond */
167*4dc78e53SAndroid Build Coastguard Worker
neightbl_compare(struct nl_object * _a,struct nl_object * _b,uint64_t attrs,int flags)168*4dc78e53SAndroid Build Coastguard Worker static uint64_t neightbl_compare(struct nl_object *_a, struct nl_object *_b,
169*4dc78e53SAndroid Build Coastguard Worker uint64_t attrs, int flags)
170*4dc78e53SAndroid Build Coastguard Worker {
171*4dc78e53SAndroid Build Coastguard Worker struct rtnl_neightbl *a = (struct rtnl_neightbl *)_a;
172*4dc78e53SAndroid Build Coastguard Worker struct rtnl_neightbl *b = (struct rtnl_neightbl *)_b;
173*4dc78e53SAndroid Build Coastguard Worker uint64_t diff = 0;
174*4dc78e53SAndroid Build Coastguard Worker
175*4dc78e53SAndroid Build Coastguard Worker #define _DIFF(ATTR, EXPR) ATTR_DIFF(attrs, ATTR, a, b, EXPR)
176*4dc78e53SAndroid Build Coastguard Worker diff |= _DIFF(NEIGHTBL_ATTR_FAMILY, a->nt_family != b->nt_family);
177*4dc78e53SAndroid Build Coastguard Worker diff |= _DIFF(NEIGHTBL_ATTR_NAME, strcmp(a->nt_name, b->nt_name));
178*4dc78e53SAndroid Build Coastguard Worker diff |= _DIFF(NEIGHTBL_ATTR_THRESH1,
179*4dc78e53SAndroid Build Coastguard Worker a->nt_gc_thresh1 != b->nt_gc_thresh1);
180*4dc78e53SAndroid Build Coastguard Worker diff |= _DIFF(NEIGHTBL_ATTR_THRESH2,
181*4dc78e53SAndroid Build Coastguard Worker a->nt_gc_thresh2 != b->nt_gc_thresh2);
182*4dc78e53SAndroid Build Coastguard Worker diff |= _DIFF(NEIGHTBL_ATTR_THRESH3,
183*4dc78e53SAndroid Build Coastguard Worker a->nt_gc_thresh3 != b->nt_gc_thresh3);
184*4dc78e53SAndroid Build Coastguard Worker diff |= _DIFF(NEIGHTBL_ATTR_GC_INTERVAL,
185*4dc78e53SAndroid Build Coastguard Worker a->nt_gc_interval != b->nt_gc_interval);
186*4dc78e53SAndroid Build Coastguard Worker #undef _DIFF
187*4dc78e53SAndroid Build Coastguard Worker
188*4dc78e53SAndroid Build Coastguard Worker if (!(a->ce_mask & NEIGHTBL_ATTR_PARMS) &&
189*4dc78e53SAndroid Build Coastguard Worker !(b->ce_mask & NEIGHTBL_ATTR_PARMS))
190*4dc78e53SAndroid Build Coastguard Worker return diff;
191*4dc78e53SAndroid Build Coastguard Worker
192*4dc78e53SAndroid Build Coastguard Worker /* XXX: FIXME: Compare parameter table */
193*4dc78e53SAndroid Build Coastguard Worker
194*4dc78e53SAndroid Build Coastguard Worker #if 0
195*4dc78e53SAndroid Build Coastguard Worker #define REQ(F) (fp->ntp_mask & NEIGHTBLPARM_ATTR_##F)
196*4dc78e53SAndroid Build Coastguard Worker #define AVAIL(F) (op->ntp_mask & NEIGHTBLPARM_ATTR_##F)
197*4dc78e53SAndroid Build Coastguard Worker #define _C(F, N) (REQ(F) && (!AVAIL(F) || (op->N != fp->N)))
198*4dc78e53SAndroid Build Coastguard Worker if (_C(IFINDEX, ntp_ifindex) ||
199*4dc78e53SAndroid Build Coastguard Worker _C(QUEUE_LEN, ntp_queue_len) ||
200*4dc78e53SAndroid Build Coastguard Worker _C(APP_PROBES, ntp_app_probes) ||
201*4dc78e53SAndroid Build Coastguard Worker _C(UCAST_PROBES, ntp_ucast_probes) ||
202*4dc78e53SAndroid Build Coastguard Worker _C(MCAST_PROBES, ntp_mcast_probes) ||
203*4dc78e53SAndroid Build Coastguard Worker _C(PROXY_QLEN, ntp_proxy_qlen) ||
204*4dc78e53SAndroid Build Coastguard Worker _C(LOCKTIME, ntp_locktime) ||
205*4dc78e53SAndroid Build Coastguard Worker _C(RETRANS_TIME, ntp_retrans_time) ||
206*4dc78e53SAndroid Build Coastguard Worker _C(BASE_REACHABLE_TIME, ntp_base_reachable_time) ||
207*4dc78e53SAndroid Build Coastguard Worker _C(GC_STALETIME, ntp_gc_stale_time) ||
208*4dc78e53SAndroid Build Coastguard Worker _C(DELAY_PROBE_TIME, ntp_probe_delay) ||
209*4dc78e53SAndroid Build Coastguard Worker _C(ANYCAST_DELAY, ntp_anycast_delay) ||
210*4dc78e53SAndroid Build Coastguard Worker _C(PROXY_DELAY, ntp_proxy_delay))
211*4dc78e53SAndroid Build Coastguard Worker return 0;
212*4dc78e53SAndroid Build Coastguard Worker #undef REQ
213*4dc78e53SAndroid Build Coastguard Worker #undef AVAIL
214*4dc78e53SAndroid Build Coastguard Worker #undef _C
215*4dc78e53SAndroid Build Coastguard Worker #endif
216*4dc78e53SAndroid Build Coastguard Worker
217*4dc78e53SAndroid Build Coastguard Worker return diff;
218*4dc78e53SAndroid Build Coastguard Worker }
219*4dc78e53SAndroid Build Coastguard Worker
220*4dc78e53SAndroid Build Coastguard Worker static struct nla_policy neightbl_policy[NDTA_MAX + 1] = {
221*4dc78e53SAndroid Build Coastguard Worker [NDTA_NAME] = { .type = NLA_STRING, .maxlen = NTBLNAMSIZ },
222*4dc78e53SAndroid Build Coastguard Worker [NDTA_THRESH1] = { .type = NLA_U32 },
223*4dc78e53SAndroid Build Coastguard Worker [NDTA_THRESH2] = { .type = NLA_U32 },
224*4dc78e53SAndroid Build Coastguard Worker [NDTA_THRESH3] = { .type = NLA_U32 },
225*4dc78e53SAndroid Build Coastguard Worker [NDTA_GC_INTERVAL] = { .type = NLA_U32 },
226*4dc78e53SAndroid Build Coastguard Worker [NDTA_CONFIG] = { .minlen = sizeof(struct ndt_config) },
227*4dc78e53SAndroid Build Coastguard Worker [NDTA_STATS] = { .minlen = sizeof(struct ndt_stats) },
228*4dc78e53SAndroid Build Coastguard Worker [NDTA_PARMS] = { .type = NLA_NESTED },
229*4dc78e53SAndroid Build Coastguard Worker };
230*4dc78e53SAndroid Build Coastguard Worker
neightbl_msg_parser(struct nl_cache_ops * ops,struct sockaddr_nl * who,struct nlmsghdr * n,struct nl_parser_param * pp)231*4dc78e53SAndroid Build Coastguard Worker static int neightbl_msg_parser(struct nl_cache_ops *ops,
232*4dc78e53SAndroid Build Coastguard Worker struct sockaddr_nl *who, struct nlmsghdr *n,
233*4dc78e53SAndroid Build Coastguard Worker struct nl_parser_param *pp)
234*4dc78e53SAndroid Build Coastguard Worker {
235*4dc78e53SAndroid Build Coastguard Worker struct rtnl_neightbl *ntbl;
236*4dc78e53SAndroid Build Coastguard Worker struct nlattr *tb[NDTA_MAX + 1];
237*4dc78e53SAndroid Build Coastguard Worker struct rtgenmsg *rtmsg;
238*4dc78e53SAndroid Build Coastguard Worker int err;
239*4dc78e53SAndroid Build Coastguard Worker
240*4dc78e53SAndroid Build Coastguard Worker ntbl = rtnl_neightbl_alloc();
241*4dc78e53SAndroid Build Coastguard Worker if (!ntbl) {
242*4dc78e53SAndroid Build Coastguard Worker err = -NLE_NOMEM;
243*4dc78e53SAndroid Build Coastguard Worker goto errout;
244*4dc78e53SAndroid Build Coastguard Worker }
245*4dc78e53SAndroid Build Coastguard Worker
246*4dc78e53SAndroid Build Coastguard Worker ntbl->ce_msgtype = n->nlmsg_type;
247*4dc78e53SAndroid Build Coastguard Worker rtmsg = nlmsg_data(n);
248*4dc78e53SAndroid Build Coastguard Worker
249*4dc78e53SAndroid Build Coastguard Worker err = nlmsg_parse(n, sizeof(*rtmsg), tb, NDTA_MAX, neightbl_policy);
250*4dc78e53SAndroid Build Coastguard Worker if (err < 0)
251*4dc78e53SAndroid Build Coastguard Worker goto errout;
252*4dc78e53SAndroid Build Coastguard Worker
253*4dc78e53SAndroid Build Coastguard Worker ntbl->nt_family = rtmsg->rtgen_family;
254*4dc78e53SAndroid Build Coastguard Worker
255*4dc78e53SAndroid Build Coastguard Worker if (tb[NDTA_NAME] == NULL) {
256*4dc78e53SAndroid Build Coastguard Worker err = -NLE_MISSING_ATTR;
257*4dc78e53SAndroid Build Coastguard Worker goto errout;
258*4dc78e53SAndroid Build Coastguard Worker }
259*4dc78e53SAndroid Build Coastguard Worker
260*4dc78e53SAndroid Build Coastguard Worker nla_strlcpy(ntbl->nt_name, tb[NDTA_NAME], NTBLNAMSIZ);
261*4dc78e53SAndroid Build Coastguard Worker ntbl->ce_mask |= NEIGHTBL_ATTR_NAME;
262*4dc78e53SAndroid Build Coastguard Worker
263*4dc78e53SAndroid Build Coastguard Worker if (tb[NDTA_THRESH1]) {
264*4dc78e53SAndroid Build Coastguard Worker ntbl->nt_gc_thresh1 = nla_get_u32(tb[NDTA_THRESH1]);
265*4dc78e53SAndroid Build Coastguard Worker ntbl->ce_mask |= NEIGHTBL_ATTR_THRESH1;
266*4dc78e53SAndroid Build Coastguard Worker }
267*4dc78e53SAndroid Build Coastguard Worker
268*4dc78e53SAndroid Build Coastguard Worker if (tb[NDTA_THRESH2]) {
269*4dc78e53SAndroid Build Coastguard Worker ntbl->nt_gc_thresh2 = nla_get_u32(tb[NDTA_THRESH2]);
270*4dc78e53SAndroid Build Coastguard Worker ntbl->ce_mask |= NEIGHTBL_ATTR_THRESH2;
271*4dc78e53SAndroid Build Coastguard Worker }
272*4dc78e53SAndroid Build Coastguard Worker
273*4dc78e53SAndroid Build Coastguard Worker if (tb[NDTA_THRESH3]) {
274*4dc78e53SAndroid Build Coastguard Worker ntbl->nt_gc_thresh3 = nla_get_u32(tb[NDTA_THRESH3]);
275*4dc78e53SAndroid Build Coastguard Worker ntbl->ce_mask |= NEIGHTBL_ATTR_THRESH3;
276*4dc78e53SAndroid Build Coastguard Worker }
277*4dc78e53SAndroid Build Coastguard Worker
278*4dc78e53SAndroid Build Coastguard Worker if (tb[NDTA_GC_INTERVAL]) {
279*4dc78e53SAndroid Build Coastguard Worker ntbl->nt_gc_interval = nla_get_u32(tb[NDTA_GC_INTERVAL]);
280*4dc78e53SAndroid Build Coastguard Worker ntbl->ce_mask |= NEIGHTBL_ATTR_GC_INTERVAL;
281*4dc78e53SAndroid Build Coastguard Worker }
282*4dc78e53SAndroid Build Coastguard Worker
283*4dc78e53SAndroid Build Coastguard Worker if (tb[NDTA_CONFIG]) {
284*4dc78e53SAndroid Build Coastguard Worker nla_memcpy(&ntbl->nt_config, tb[NDTA_CONFIG],
285*4dc78e53SAndroid Build Coastguard Worker sizeof(ntbl->nt_config));
286*4dc78e53SAndroid Build Coastguard Worker ntbl->ce_mask |= NEIGHTBL_ATTR_CONFIG;
287*4dc78e53SAndroid Build Coastguard Worker }
288*4dc78e53SAndroid Build Coastguard Worker
289*4dc78e53SAndroid Build Coastguard Worker if (tb[NDTA_STATS]) {
290*4dc78e53SAndroid Build Coastguard Worker nla_memcpy(&ntbl->nt_stats, tb[NDTA_STATS],
291*4dc78e53SAndroid Build Coastguard Worker sizeof(ntbl->nt_stats));
292*4dc78e53SAndroid Build Coastguard Worker ntbl->ce_mask |= NEIGHTBL_ATTR_STATS;
293*4dc78e53SAndroid Build Coastguard Worker }
294*4dc78e53SAndroid Build Coastguard Worker
295*4dc78e53SAndroid Build Coastguard Worker if (tb[NDTA_PARMS]) {
296*4dc78e53SAndroid Build Coastguard Worker struct nlattr *tbp[NDTPA_MAX + 1];
297*4dc78e53SAndroid Build Coastguard Worker struct rtnl_neightbl_parms *p = &ntbl->nt_parms;
298*4dc78e53SAndroid Build Coastguard Worker
299*4dc78e53SAndroid Build Coastguard Worker err = nla_parse_nested(tbp, NDTPA_MAX, tb[NDTA_PARMS], NULL);
300*4dc78e53SAndroid Build Coastguard Worker if (err < 0)
301*4dc78e53SAndroid Build Coastguard Worker goto errout;
302*4dc78e53SAndroid Build Coastguard Worker
303*4dc78e53SAndroid Build Coastguard Worker #define COPY_ENTRY(name, var) \
304*4dc78e53SAndroid Build Coastguard Worker if (tbp[NDTPA_##name]) { \
305*4dc78e53SAndroid Build Coastguard Worker p->ntp_##var = nla_get_u32(tbp[NDTPA_##name]); \
306*4dc78e53SAndroid Build Coastguard Worker p->ntp_mask |= NEIGHTBLPARM_ATTR_##name; \
307*4dc78e53SAndroid Build Coastguard Worker }
308*4dc78e53SAndroid Build Coastguard Worker
309*4dc78e53SAndroid Build Coastguard Worker COPY_ENTRY(IFINDEX, ifindex);
310*4dc78e53SAndroid Build Coastguard Worker COPY_ENTRY(REFCNT, refcnt);
311*4dc78e53SAndroid Build Coastguard Worker COPY_ENTRY(QUEUE_LEN, queue_len);
312*4dc78e53SAndroid Build Coastguard Worker COPY_ENTRY(APP_PROBES, app_probes);
313*4dc78e53SAndroid Build Coastguard Worker COPY_ENTRY(UCAST_PROBES, ucast_probes);
314*4dc78e53SAndroid Build Coastguard Worker COPY_ENTRY(MCAST_PROBES, mcast_probes);
315*4dc78e53SAndroid Build Coastguard Worker COPY_ENTRY(PROXY_QLEN, proxy_qlen);
316*4dc78e53SAndroid Build Coastguard Worker COPY_ENTRY(PROXY_DELAY, proxy_delay);
317*4dc78e53SAndroid Build Coastguard Worker COPY_ENTRY(ANYCAST_DELAY, anycast_delay);
318*4dc78e53SAndroid Build Coastguard Worker COPY_ENTRY(LOCKTIME, locktime);
319*4dc78e53SAndroid Build Coastguard Worker COPY_ENTRY(REACHABLE_TIME, reachable_time);
320*4dc78e53SAndroid Build Coastguard Worker COPY_ENTRY(BASE_REACHABLE_TIME, base_reachable_time);
321*4dc78e53SAndroid Build Coastguard Worker COPY_ENTRY(RETRANS_TIME, retrans_time);
322*4dc78e53SAndroid Build Coastguard Worker COPY_ENTRY(GC_STALETIME, gc_stale_time);
323*4dc78e53SAndroid Build Coastguard Worker COPY_ENTRY(DELAY_PROBE_TIME, probe_delay);
324*4dc78e53SAndroid Build Coastguard Worker #undef COPY_ENTRY
325*4dc78e53SAndroid Build Coastguard Worker
326*4dc78e53SAndroid Build Coastguard Worker ntbl->ce_mask |= NEIGHTBL_ATTR_PARMS;
327*4dc78e53SAndroid Build Coastguard Worker }
328*4dc78e53SAndroid Build Coastguard Worker
329*4dc78e53SAndroid Build Coastguard Worker err = pp->pp_cb((struct nl_object *)ntbl, pp);
330*4dc78e53SAndroid Build Coastguard Worker errout:
331*4dc78e53SAndroid Build Coastguard Worker rtnl_neightbl_put(ntbl);
332*4dc78e53SAndroid Build Coastguard Worker return err;
333*4dc78e53SAndroid Build Coastguard Worker }
334*4dc78e53SAndroid Build Coastguard Worker
neightbl_request_update(struct nl_cache * c,struct nl_sock * h)335*4dc78e53SAndroid Build Coastguard Worker static int neightbl_request_update(struct nl_cache *c, struct nl_sock *h)
336*4dc78e53SAndroid Build Coastguard Worker {
337*4dc78e53SAndroid Build Coastguard Worker return nl_rtgen_request(h, RTM_GETNEIGHTBL, AF_UNSPEC, NLM_F_DUMP);
338*4dc78e53SAndroid Build Coastguard Worker }
339*4dc78e53SAndroid Build Coastguard Worker
neightbl_dump_line(struct nl_object * arg,struct nl_dump_params * p)340*4dc78e53SAndroid Build Coastguard Worker static void neightbl_dump_line(struct nl_object *arg, struct nl_dump_params *p)
341*4dc78e53SAndroid Build Coastguard Worker {
342*4dc78e53SAndroid Build Coastguard Worker struct rtnl_neightbl *ntbl = (struct rtnl_neightbl *)arg;
343*4dc78e53SAndroid Build Coastguard Worker
344*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, "%s", ntbl->nt_name);
345*4dc78e53SAndroid Build Coastguard Worker
346*4dc78e53SAndroid Build Coastguard Worker if (ntbl->nt_parms.ntp_mask & NEIGHTBLPARM_ATTR_IFINDEX) {
347*4dc78e53SAndroid Build Coastguard Worker struct nl_cache *link_cache;
348*4dc78e53SAndroid Build Coastguard Worker
349*4dc78e53SAndroid Build Coastguard Worker link_cache = nl_cache_mngt_require_safe("route/link");
350*4dc78e53SAndroid Build Coastguard Worker
351*4dc78e53SAndroid Build Coastguard Worker if (link_cache) {
352*4dc78e53SAndroid Build Coastguard Worker char buf[32];
353*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "<%s> ",
354*4dc78e53SAndroid Build Coastguard Worker rtnl_link_i2name(link_cache,
355*4dc78e53SAndroid Build Coastguard Worker ntbl->nt_parms.ntp_ifindex,
356*4dc78e53SAndroid Build Coastguard Worker buf, sizeof(buf)));
357*4dc78e53SAndroid Build Coastguard Worker nl_cache_put(link_cache);
358*4dc78e53SAndroid Build Coastguard Worker } else
359*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "<%u> ", ntbl->nt_parms.ntp_ifindex);
360*4dc78e53SAndroid Build Coastguard Worker } else
361*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " ");
362*4dc78e53SAndroid Build Coastguard Worker
363*4dc78e53SAndroid Build Coastguard Worker if (ntbl->ce_mask & NEIGHTBL_ATTR_CONFIG)
364*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "entries %u ", ntbl->nt_config.ndtc_entries);
365*4dc78e53SAndroid Build Coastguard Worker
366*4dc78e53SAndroid Build Coastguard Worker if (ntbl->ce_mask & NEIGHTBL_ATTR_PARMS) {
367*4dc78e53SAndroid Build Coastguard Worker char rt[32], rt2[32];
368*4dc78e53SAndroid Build Coastguard Worker struct rtnl_neightbl_parms *pa = &ntbl->nt_parms;
369*4dc78e53SAndroid Build Coastguard Worker
370*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "reachable-time %s retransmit-time %s",
371*4dc78e53SAndroid Build Coastguard Worker nl_msec2str(pa->ntp_reachable_time, rt, sizeof(rt)),
372*4dc78e53SAndroid Build Coastguard Worker nl_msec2str(pa->ntp_retrans_time, rt2, sizeof(rt2)));
373*4dc78e53SAndroid Build Coastguard Worker }
374*4dc78e53SAndroid Build Coastguard Worker
375*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "\n");
376*4dc78e53SAndroid Build Coastguard Worker }
377*4dc78e53SAndroid Build Coastguard Worker
neightbl_dump_details(struct nl_object * arg,struct nl_dump_params * p)378*4dc78e53SAndroid Build Coastguard Worker static void neightbl_dump_details(struct nl_object *arg,
379*4dc78e53SAndroid Build Coastguard Worker struct nl_dump_params *p)
380*4dc78e53SAndroid Build Coastguard Worker {
381*4dc78e53SAndroid Build Coastguard Worker char x[32], y[32], z[32];
382*4dc78e53SAndroid Build Coastguard Worker struct rtnl_neightbl *ntbl = (struct rtnl_neightbl *)arg;
383*4dc78e53SAndroid Build Coastguard Worker
384*4dc78e53SAndroid Build Coastguard Worker neightbl_dump_line(arg, p);
385*4dc78e53SAndroid Build Coastguard Worker
386*4dc78e53SAndroid Build Coastguard Worker if (ntbl->ce_mask & NEIGHTBL_ATTR_CONFIG) {
387*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, " key-len %u entry-size %u last-flush %s\n",
388*4dc78e53SAndroid Build Coastguard Worker ntbl->nt_config.ndtc_key_len,
389*4dc78e53SAndroid Build Coastguard Worker ntbl->nt_config.ndtc_entry_size,
390*4dc78e53SAndroid Build Coastguard Worker nl_msec2str(ntbl->nt_config.ndtc_last_flush, x,
391*4dc78e53SAndroid Build Coastguard Worker sizeof(x)));
392*4dc78e53SAndroid Build Coastguard Worker
393*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p,
394*4dc78e53SAndroid Build Coastguard Worker " gc threshold %u/%u/%u interval %s "
395*4dc78e53SAndroid Build Coastguard Worker "chain-position %u\n",
396*4dc78e53SAndroid Build Coastguard Worker ntbl->nt_gc_thresh1, ntbl->nt_gc_thresh2,
397*4dc78e53SAndroid Build Coastguard Worker ntbl->nt_gc_thresh3,
398*4dc78e53SAndroid Build Coastguard Worker nl_msec2str(ntbl->nt_gc_interval, x, sizeof(x)),
399*4dc78e53SAndroid Build Coastguard Worker ntbl->nt_config.ndtc_hash_chain_gc);
400*4dc78e53SAndroid Build Coastguard Worker
401*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, " hash-rand 0x%08X/0x%08X last-rand %s\n",
402*4dc78e53SAndroid Build Coastguard Worker ntbl->nt_config.ndtc_hash_rnd,
403*4dc78e53SAndroid Build Coastguard Worker ntbl->nt_config.ndtc_hash_mask,
404*4dc78e53SAndroid Build Coastguard Worker nl_msec2str(ntbl->nt_config.ndtc_last_rand, x,
405*4dc78e53SAndroid Build Coastguard Worker sizeof(x)));
406*4dc78e53SAndroid Build Coastguard Worker }
407*4dc78e53SAndroid Build Coastguard Worker
408*4dc78e53SAndroid Build Coastguard Worker if (ntbl->ce_mask & NEIGHTBL_ATTR_PARMS) {
409*4dc78e53SAndroid Build Coastguard Worker struct rtnl_neightbl_parms *pa = &ntbl->nt_parms;
410*4dc78e53SAndroid Build Coastguard Worker
411*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p,
412*4dc78e53SAndroid Build Coastguard Worker " refcnt %u pending-queue-limit %u "
413*4dc78e53SAndroid Build Coastguard Worker "proxy-delayed-queue-limit %u\n",
414*4dc78e53SAndroid Build Coastguard Worker pa->ntp_refcnt, pa->ntp_queue_len,
415*4dc78e53SAndroid Build Coastguard Worker pa->ntp_proxy_qlen);
416*4dc78e53SAndroid Build Coastguard Worker
417*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p,
418*4dc78e53SAndroid Build Coastguard Worker " num-userspace-probes %u num-unicast-probes "
419*4dc78e53SAndroid Build Coastguard Worker "%u num-multicast-probes %u\n",
420*4dc78e53SAndroid Build Coastguard Worker pa->ntp_app_probes, pa->ntp_ucast_probes,
421*4dc78e53SAndroid Build Coastguard Worker pa->ntp_mcast_probes);
422*4dc78e53SAndroid Build Coastguard Worker
423*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p,
424*4dc78e53SAndroid Build Coastguard Worker " min-age %s base-reachable-time %s "
425*4dc78e53SAndroid Build Coastguard Worker "stale-check-interval %s\n",
426*4dc78e53SAndroid Build Coastguard Worker nl_msec2str(pa->ntp_locktime, x, sizeof(x)),
427*4dc78e53SAndroid Build Coastguard Worker nl_msec2str(pa->ntp_base_reachable_time, y,
428*4dc78e53SAndroid Build Coastguard Worker sizeof(y)),
429*4dc78e53SAndroid Build Coastguard Worker nl_msec2str(pa->ntp_gc_stale_time, z, sizeof(z)));
430*4dc78e53SAndroid Build Coastguard Worker
431*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p,
432*4dc78e53SAndroid Build Coastguard Worker " initial-probe-delay %s answer-delay %s "
433*4dc78e53SAndroid Build Coastguard Worker "proxy-answer-delay %s\n",
434*4dc78e53SAndroid Build Coastguard Worker nl_msec2str(pa->ntp_probe_delay, x, sizeof(x)),
435*4dc78e53SAndroid Build Coastguard Worker nl_msec2str(pa->ntp_anycast_delay, y, sizeof(y)),
436*4dc78e53SAndroid Build Coastguard Worker nl_msec2str(pa->ntp_proxy_delay, z, sizeof(z)));
437*4dc78e53SAndroid Build Coastguard Worker }
438*4dc78e53SAndroid Build Coastguard Worker }
439*4dc78e53SAndroid Build Coastguard Worker
neightbl_dump_stats(struct nl_object * arg,struct nl_dump_params * p)440*4dc78e53SAndroid Build Coastguard Worker static void neightbl_dump_stats(struct nl_object *arg, struct nl_dump_params *p)
441*4dc78e53SAndroid Build Coastguard Worker {
442*4dc78e53SAndroid Build Coastguard Worker struct rtnl_neightbl *ntbl = (struct rtnl_neightbl *)arg;
443*4dc78e53SAndroid Build Coastguard Worker
444*4dc78e53SAndroid Build Coastguard Worker neightbl_dump_details(arg, p);
445*4dc78e53SAndroid Build Coastguard Worker
446*4dc78e53SAndroid Build Coastguard Worker if (!(ntbl->ce_mask & NEIGHTBL_ATTR_STATS))
447*4dc78e53SAndroid Build Coastguard Worker return;
448*4dc78e53SAndroid Build Coastguard Worker
449*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p,
450*4dc78e53SAndroid Build Coastguard Worker " "
451*4dc78e53SAndroid Build Coastguard Worker " lookups %llu hits %llu failed %llu"
452*4dc78e53SAndroid Build Coastguard Worker " allocations %llu destroys %llu\n",
453*4dc78e53SAndroid Build Coastguard Worker (long long unsigned)ntbl->nt_stats.ndts_lookups,
454*4dc78e53SAndroid Build Coastguard Worker (long long unsigned)ntbl->nt_stats.ndts_hits,
455*4dc78e53SAndroid Build Coastguard Worker (long long unsigned)ntbl->nt_stats.ndts_res_failed,
456*4dc78e53SAndroid Build Coastguard Worker (long long unsigned)ntbl->nt_stats.ndts_allocs,
457*4dc78e53SAndroid Build Coastguard Worker (long long unsigned)ntbl->nt_stats.ndts_destroys);
458*4dc78e53SAndroid Build Coastguard Worker
459*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p,
460*4dc78e53SAndroid Build Coastguard Worker " "
461*4dc78e53SAndroid Build Coastguard Worker " hash-grows %llu forced-gc-runs %llu"
462*4dc78e53SAndroid Build Coastguard Worker " periodic-gc-runs %llu\n",
463*4dc78e53SAndroid Build Coastguard Worker (long long unsigned)ntbl->nt_stats.ndts_hash_grows,
464*4dc78e53SAndroid Build Coastguard Worker (long long unsigned)ntbl->nt_stats.ndts_forced_gc_runs,
465*4dc78e53SAndroid Build Coastguard Worker (long long unsigned)ntbl->nt_stats.ndts_periodic_gc_runs);
466*4dc78e53SAndroid Build Coastguard Worker
467*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p,
468*4dc78e53SAndroid Build Coastguard Worker " "
469*4dc78e53SAndroid Build Coastguard Worker " rcv-unicast-probes %llu"
470*4dc78e53SAndroid Build Coastguard Worker " rcv-multicast-probes %llu"
471*4dc78e53SAndroid Build Coastguard Worker "\n",
472*4dc78e53SAndroid Build Coastguard Worker (long long unsigned)ntbl->nt_stats.ndts_rcv_probes_ucast,
473*4dc78e53SAndroid Build Coastguard Worker (long long unsigned)ntbl->nt_stats.ndts_rcv_probes_mcast);
474*4dc78e53SAndroid Build Coastguard Worker }
475*4dc78e53SAndroid Build Coastguard Worker
476*4dc78e53SAndroid Build Coastguard Worker /**
477*4dc78e53SAndroid Build Coastguard Worker * @name Allocation/Freeing
478*4dc78e53SAndroid Build Coastguard Worker * @{
479*4dc78e53SAndroid Build Coastguard Worker */
480*4dc78e53SAndroid Build Coastguard Worker
rtnl_neightbl_alloc(void)481*4dc78e53SAndroid Build Coastguard Worker struct rtnl_neightbl *rtnl_neightbl_alloc(void)
482*4dc78e53SAndroid Build Coastguard Worker {
483*4dc78e53SAndroid Build Coastguard Worker return (struct rtnl_neightbl *)nl_object_alloc(&neightbl_obj_ops);
484*4dc78e53SAndroid Build Coastguard Worker }
485*4dc78e53SAndroid Build Coastguard Worker
rtnl_neightbl_put(struct rtnl_neightbl * neightbl)486*4dc78e53SAndroid Build Coastguard Worker void rtnl_neightbl_put(struct rtnl_neightbl *neightbl)
487*4dc78e53SAndroid Build Coastguard Worker {
488*4dc78e53SAndroid Build Coastguard Worker nl_object_put((struct nl_object *)neightbl);
489*4dc78e53SAndroid Build Coastguard Worker }
490*4dc78e53SAndroid Build Coastguard Worker
491*4dc78e53SAndroid Build Coastguard Worker /** @} */
492*4dc78e53SAndroid Build Coastguard Worker
493*4dc78e53SAndroid Build Coastguard Worker /**
494*4dc78e53SAndroid Build Coastguard Worker * @name Neighbour Table Cache Management
495*4dc78e53SAndroid Build Coastguard Worker * @{
496*4dc78e53SAndroid Build Coastguard Worker */
497*4dc78e53SAndroid Build Coastguard Worker
498*4dc78e53SAndroid Build Coastguard Worker /**
499*4dc78e53SAndroid Build Coastguard Worker * Build a neighbour table cache including all neighbour tables currently configured in the kernel.
500*4dc78e53SAndroid Build Coastguard Worker * @arg sk Netlink socket.
501*4dc78e53SAndroid Build Coastguard Worker * @arg result Pointer to store resulting cache.
502*4dc78e53SAndroid Build Coastguard Worker *
503*4dc78e53SAndroid Build Coastguard Worker * Allocates a new neighbour table cache, initializes it properly and
504*4dc78e53SAndroid Build Coastguard Worker * updates it to include all neighbour tables currently configured in
505*4dc78e53SAndroid Build Coastguard Worker * the kernel.
506*4dc78e53SAndroid Build Coastguard Worker *
507*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code.
508*4dc78e53SAndroid Build Coastguard Worker */
rtnl_neightbl_alloc_cache(struct nl_sock * sk,struct nl_cache ** result)509*4dc78e53SAndroid Build Coastguard Worker int rtnl_neightbl_alloc_cache(struct nl_sock *sk, struct nl_cache **result)
510*4dc78e53SAndroid Build Coastguard Worker {
511*4dc78e53SAndroid Build Coastguard Worker return nl_cache_alloc_and_fill(&rtnl_neightbl_ops, sk, result);
512*4dc78e53SAndroid Build Coastguard Worker }
513*4dc78e53SAndroid Build Coastguard Worker
514*4dc78e53SAndroid Build Coastguard Worker /**
515*4dc78e53SAndroid Build Coastguard Worker * Lookup neighbour table by name and optional interface index
516*4dc78e53SAndroid Build Coastguard Worker * @arg cache neighbour table cache
517*4dc78e53SAndroid Build Coastguard Worker * @arg name name of table
518*4dc78e53SAndroid Build Coastguard Worker * @arg ifindex optional interface index
519*4dc78e53SAndroid Build Coastguard Worker *
520*4dc78e53SAndroid Build Coastguard Worker * Looks up the neighbour table matching the specified name and
521*4dc78e53SAndroid Build Coastguard Worker * optionally the specified ifindex to retrieve device specific
522*4dc78e53SAndroid Build Coastguard Worker * parameter sets.
523*4dc78e53SAndroid Build Coastguard Worker *
524*4dc78e53SAndroid Build Coastguard Worker * @return ptr to neighbour table inside the cache or NULL if no
525*4dc78e53SAndroid Build Coastguard Worker * match was found.
526*4dc78e53SAndroid Build Coastguard Worker */
rtnl_neightbl_get(struct nl_cache * cache,const char * name,int ifindex)527*4dc78e53SAndroid Build Coastguard Worker struct rtnl_neightbl *rtnl_neightbl_get(struct nl_cache *cache,
528*4dc78e53SAndroid Build Coastguard Worker const char *name, int ifindex)
529*4dc78e53SAndroid Build Coastguard Worker {
530*4dc78e53SAndroid Build Coastguard Worker struct rtnl_neightbl *nt;
531*4dc78e53SAndroid Build Coastguard Worker
532*4dc78e53SAndroid Build Coastguard Worker if (cache->c_ops != &rtnl_neightbl_ops)
533*4dc78e53SAndroid Build Coastguard Worker return NULL;
534*4dc78e53SAndroid Build Coastguard Worker
535*4dc78e53SAndroid Build Coastguard Worker nl_list_for_each_entry(nt, &cache->c_items, ce_list) {
536*4dc78e53SAndroid Build Coastguard Worker if (!strcasecmp(nt->nt_name, name) &&
537*4dc78e53SAndroid Build Coastguard Worker ((unsigned)ifindex) == nt->nt_parms.ntp_ifindex) {
538*4dc78e53SAndroid Build Coastguard Worker nl_object_get((struct nl_object *)nt);
539*4dc78e53SAndroid Build Coastguard Worker return nt;
540*4dc78e53SAndroid Build Coastguard Worker }
541*4dc78e53SAndroid Build Coastguard Worker }
542*4dc78e53SAndroid Build Coastguard Worker
543*4dc78e53SAndroid Build Coastguard Worker return NULL;
544*4dc78e53SAndroid Build Coastguard Worker }
545*4dc78e53SAndroid Build Coastguard Worker
546*4dc78e53SAndroid Build Coastguard Worker /** @} */
547*4dc78e53SAndroid Build Coastguard Worker
548*4dc78e53SAndroid Build Coastguard Worker /**
549*4dc78e53SAndroid Build Coastguard Worker * @name Neighbour Table Modifications
550*4dc78e53SAndroid Build Coastguard Worker * @{
551*4dc78e53SAndroid Build Coastguard Worker */
552*4dc78e53SAndroid Build Coastguard Worker
553*4dc78e53SAndroid Build Coastguard Worker /**
554*4dc78e53SAndroid Build Coastguard Worker * Builds a netlink change request message to change neighbour table attributes
555*4dc78e53SAndroid Build Coastguard Worker * @arg old neighbour table to change
556*4dc78e53SAndroid Build Coastguard Worker * @arg tmpl template with requested changes
557*4dc78e53SAndroid Build Coastguard Worker * @arg result Pointer to store resulting message.
558*4dc78e53SAndroid Build Coastguard Worker *
559*4dc78e53SAndroid Build Coastguard Worker * Builds a new netlink message requesting a change of neighbour table
560*4dc78e53SAndroid Build Coastguard Worker * attributes. The netlink message header isn't fully equipped with all
561*4dc78e53SAndroid Build Coastguard Worker * relevant fields and must be sent out via nl_send_auto_complete() or
562*4dc78e53SAndroid Build Coastguard Worker * supplemented as needed.
563*4dc78e53SAndroid Build Coastguard Worker * \a old must point to a neighbour table currently configured in the
564*4dc78e53SAndroid Build Coastguard Worker * kernel and \a tmpl must contain the attributes to be changed set via
565*4dc78e53SAndroid Build Coastguard Worker * \c rtnl_neightbl_set_* functions.
566*4dc78e53SAndroid Build Coastguard Worker *
567*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code.
568*4dc78e53SAndroid Build Coastguard Worker */
rtnl_neightbl_build_change_request(struct rtnl_neightbl * old,struct rtnl_neightbl * tmpl,struct nl_msg ** result)569*4dc78e53SAndroid Build Coastguard Worker int rtnl_neightbl_build_change_request(struct rtnl_neightbl *old,
570*4dc78e53SAndroid Build Coastguard Worker struct rtnl_neightbl *tmpl,
571*4dc78e53SAndroid Build Coastguard Worker struct nl_msg **result)
572*4dc78e53SAndroid Build Coastguard Worker {
573*4dc78e53SAndroid Build Coastguard Worker struct nl_msg *m, *parms = NULL;
574*4dc78e53SAndroid Build Coastguard Worker struct ndtmsg ndt = {
575*4dc78e53SAndroid Build Coastguard Worker .ndtm_family = old->nt_family,
576*4dc78e53SAndroid Build Coastguard Worker };
577*4dc78e53SAndroid Build Coastguard Worker
578*4dc78e53SAndroid Build Coastguard Worker m = nlmsg_alloc_simple(RTM_SETNEIGHTBL, 0);
579*4dc78e53SAndroid Build Coastguard Worker if (!m)
580*4dc78e53SAndroid Build Coastguard Worker return -NLE_NOMEM;
581*4dc78e53SAndroid Build Coastguard Worker
582*4dc78e53SAndroid Build Coastguard Worker if (nlmsg_append(m, &ndt, sizeof(ndt), NLMSG_ALIGNTO) < 0)
583*4dc78e53SAndroid Build Coastguard Worker goto nla_put_failure;
584*4dc78e53SAndroid Build Coastguard Worker
585*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_STRING(m, NDTA_NAME, old->nt_name);
586*4dc78e53SAndroid Build Coastguard Worker
587*4dc78e53SAndroid Build Coastguard Worker if (tmpl->ce_mask & NEIGHTBL_ATTR_THRESH1)
588*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_U32(m, NDTA_THRESH1, tmpl->nt_gc_thresh1);
589*4dc78e53SAndroid Build Coastguard Worker
590*4dc78e53SAndroid Build Coastguard Worker if (tmpl->ce_mask & NEIGHTBL_ATTR_THRESH2)
591*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_U32(m, NDTA_THRESH2, tmpl->nt_gc_thresh2);
592*4dc78e53SAndroid Build Coastguard Worker
593*4dc78e53SAndroid Build Coastguard Worker if (tmpl->ce_mask & NEIGHTBL_ATTR_THRESH2)
594*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_U32(m, NDTA_THRESH2, tmpl->nt_gc_thresh2);
595*4dc78e53SAndroid Build Coastguard Worker
596*4dc78e53SAndroid Build Coastguard Worker if (tmpl->ce_mask & NEIGHTBL_ATTR_GC_INTERVAL)
597*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_U64(m, NDTA_GC_INTERVAL, tmpl->nt_gc_interval);
598*4dc78e53SAndroid Build Coastguard Worker
599*4dc78e53SAndroid Build Coastguard Worker if (tmpl->ce_mask & NEIGHTBL_ATTR_PARMS) {
600*4dc78e53SAndroid Build Coastguard Worker struct rtnl_neightbl_parms *p = &tmpl->nt_parms;
601*4dc78e53SAndroid Build Coastguard Worker
602*4dc78e53SAndroid Build Coastguard Worker parms = nlmsg_alloc();
603*4dc78e53SAndroid Build Coastguard Worker if (!parms)
604*4dc78e53SAndroid Build Coastguard Worker goto nla_put_failure;
605*4dc78e53SAndroid Build Coastguard Worker
606*4dc78e53SAndroid Build Coastguard Worker if (old->nt_parms.ntp_mask & NEIGHTBLPARM_ATTR_IFINDEX)
607*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_U32(parms, NDTPA_IFINDEX,
608*4dc78e53SAndroid Build Coastguard Worker old->nt_parms.ntp_ifindex);
609*4dc78e53SAndroid Build Coastguard Worker
610*4dc78e53SAndroid Build Coastguard Worker if (p->ntp_mask & NEIGHTBLPARM_ATTR_QUEUE_LEN)
611*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_U32(parms, NDTPA_QUEUE_LEN, p->ntp_queue_len);
612*4dc78e53SAndroid Build Coastguard Worker
613*4dc78e53SAndroid Build Coastguard Worker if (p->ntp_mask & NEIGHTBLPARM_ATTR_APP_PROBES)
614*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_U32(parms, NDTPA_APP_PROBES, p->ntp_app_probes);
615*4dc78e53SAndroid Build Coastguard Worker
616*4dc78e53SAndroid Build Coastguard Worker if (p->ntp_mask & NEIGHTBLPARM_ATTR_UCAST_PROBES)
617*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_U32(parms, NDTPA_UCAST_PROBES,
618*4dc78e53SAndroid Build Coastguard Worker p->ntp_ucast_probes);
619*4dc78e53SAndroid Build Coastguard Worker
620*4dc78e53SAndroid Build Coastguard Worker if (p->ntp_mask & NEIGHTBLPARM_ATTR_MCAST_PROBES)
621*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_U32(parms, NDTPA_MCAST_PROBES,
622*4dc78e53SAndroid Build Coastguard Worker p->ntp_mcast_probes);
623*4dc78e53SAndroid Build Coastguard Worker
624*4dc78e53SAndroid Build Coastguard Worker if (p->ntp_mask & NEIGHTBLPARM_ATTR_PROXY_QLEN)
625*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_U32(parms, NDTPA_PROXY_QLEN, p->ntp_proxy_qlen);
626*4dc78e53SAndroid Build Coastguard Worker
627*4dc78e53SAndroid Build Coastguard Worker if (p->ntp_mask & NEIGHTBLPARM_ATTR_BASE_REACHABLE_TIME)
628*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_U64(parms, NDTPA_BASE_REACHABLE_TIME,
629*4dc78e53SAndroid Build Coastguard Worker p->ntp_base_reachable_time);
630*4dc78e53SAndroid Build Coastguard Worker
631*4dc78e53SAndroid Build Coastguard Worker if (p->ntp_mask & NEIGHTBLPARM_ATTR_RETRANS_TIME)
632*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_U64(parms, NDTPA_RETRANS_TIME,
633*4dc78e53SAndroid Build Coastguard Worker p->ntp_retrans_time);
634*4dc78e53SAndroid Build Coastguard Worker
635*4dc78e53SAndroid Build Coastguard Worker if (p->ntp_mask & NEIGHTBLPARM_ATTR_GC_STALETIME)
636*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_U64(parms, NDTPA_GC_STALETIME,
637*4dc78e53SAndroid Build Coastguard Worker p->ntp_gc_stale_time);
638*4dc78e53SAndroid Build Coastguard Worker
639*4dc78e53SAndroid Build Coastguard Worker if (p->ntp_mask & NEIGHTBLPARM_ATTR_DELAY_PROBE_TIME)
640*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_U64(parms, NDTPA_DELAY_PROBE_TIME,
641*4dc78e53SAndroid Build Coastguard Worker p->ntp_proxy_delay);
642*4dc78e53SAndroid Build Coastguard Worker
643*4dc78e53SAndroid Build Coastguard Worker if (p->ntp_mask & NEIGHTBLPARM_ATTR_ANYCAST_DELAY)
644*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_U64(parms, NDTPA_ANYCAST_DELAY,
645*4dc78e53SAndroid Build Coastguard Worker p->ntp_anycast_delay);
646*4dc78e53SAndroid Build Coastguard Worker
647*4dc78e53SAndroid Build Coastguard Worker if (p->ntp_mask & NEIGHTBLPARM_ATTR_PROXY_DELAY)
648*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_U64(parms, NDTPA_PROXY_DELAY,
649*4dc78e53SAndroid Build Coastguard Worker p->ntp_proxy_delay);
650*4dc78e53SAndroid Build Coastguard Worker
651*4dc78e53SAndroid Build Coastguard Worker if (p->ntp_mask & NEIGHTBLPARM_ATTR_LOCKTIME)
652*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_U64(parms, NDTPA_LOCKTIME, p->ntp_locktime);
653*4dc78e53SAndroid Build Coastguard Worker
654*4dc78e53SAndroid Build Coastguard Worker if (nla_put_nested(m, NDTA_PARMS, parms) < 0)
655*4dc78e53SAndroid Build Coastguard Worker goto nla_put_failure;
656*4dc78e53SAndroid Build Coastguard Worker
657*4dc78e53SAndroid Build Coastguard Worker nlmsg_free(parms);
658*4dc78e53SAndroid Build Coastguard Worker }
659*4dc78e53SAndroid Build Coastguard Worker
660*4dc78e53SAndroid Build Coastguard Worker *result = m;
661*4dc78e53SAndroid Build Coastguard Worker return 0;
662*4dc78e53SAndroid Build Coastguard Worker
663*4dc78e53SAndroid Build Coastguard Worker nla_put_failure:
664*4dc78e53SAndroid Build Coastguard Worker if (parms)
665*4dc78e53SAndroid Build Coastguard Worker nlmsg_free(parms);
666*4dc78e53SAndroid Build Coastguard Worker nlmsg_free(m);
667*4dc78e53SAndroid Build Coastguard Worker return -NLE_MSGSIZE;
668*4dc78e53SAndroid Build Coastguard Worker }
669*4dc78e53SAndroid Build Coastguard Worker
670*4dc78e53SAndroid Build Coastguard Worker /**
671*4dc78e53SAndroid Build Coastguard Worker * Change neighbour table attributes
672*4dc78e53SAndroid Build Coastguard Worker * @arg sk Netlink socket.
673*4dc78e53SAndroid Build Coastguard Worker * @arg old neighbour table to be changed
674*4dc78e53SAndroid Build Coastguard Worker * @arg tmpl template with requested changes
675*4dc78e53SAndroid Build Coastguard Worker *
676*4dc78e53SAndroid Build Coastguard Worker * Builds a new netlink message by calling
677*4dc78e53SAndroid Build Coastguard Worker * rtnl_neightbl_build_change_request(), sends the request to the
678*4dc78e53SAndroid Build Coastguard Worker * kernel and waits for the next ACK to be received, i.e. blocks
679*4dc78e53SAndroid Build Coastguard Worker * until the request has been processed.
680*4dc78e53SAndroid Build Coastguard Worker *
681*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code
682*4dc78e53SAndroid Build Coastguard Worker */
rtnl_neightbl_change(struct nl_sock * sk,struct rtnl_neightbl * old,struct rtnl_neightbl * tmpl)683*4dc78e53SAndroid Build Coastguard Worker int rtnl_neightbl_change(struct nl_sock *sk, struct rtnl_neightbl *old,
684*4dc78e53SAndroid Build Coastguard Worker struct rtnl_neightbl *tmpl)
685*4dc78e53SAndroid Build Coastguard Worker {
686*4dc78e53SAndroid Build Coastguard Worker struct nl_msg *msg;
687*4dc78e53SAndroid Build Coastguard Worker int err;
688*4dc78e53SAndroid Build Coastguard Worker
689*4dc78e53SAndroid Build Coastguard Worker if ((err = rtnl_neightbl_build_change_request(old, tmpl, &msg)) < 0)
690*4dc78e53SAndroid Build Coastguard Worker return err;
691*4dc78e53SAndroid Build Coastguard Worker
692*4dc78e53SAndroid Build Coastguard Worker err = nl_send_auto_complete(sk, msg);
693*4dc78e53SAndroid Build Coastguard Worker nlmsg_free(msg);
694*4dc78e53SAndroid Build Coastguard Worker if (err < 0)
695*4dc78e53SAndroid Build Coastguard Worker return err;
696*4dc78e53SAndroid Build Coastguard Worker
697*4dc78e53SAndroid Build Coastguard Worker return wait_for_ack(sk);
698*4dc78e53SAndroid Build Coastguard Worker }
699*4dc78e53SAndroid Build Coastguard Worker
700*4dc78e53SAndroid Build Coastguard Worker /** @} */
701*4dc78e53SAndroid Build Coastguard Worker
702*4dc78e53SAndroid Build Coastguard Worker /**
703*4dc78e53SAndroid Build Coastguard Worker * @name Attribute Modification
704*4dc78e53SAndroid Build Coastguard Worker * @{
705*4dc78e53SAndroid Build Coastguard Worker */
706*4dc78e53SAndroid Build Coastguard Worker
rtnl_neightbl_set_family(struct rtnl_neightbl * ntbl,int family)707*4dc78e53SAndroid Build Coastguard Worker void rtnl_neightbl_set_family(struct rtnl_neightbl *ntbl, int family)
708*4dc78e53SAndroid Build Coastguard Worker {
709*4dc78e53SAndroid Build Coastguard Worker ntbl->nt_family = family;
710*4dc78e53SAndroid Build Coastguard Worker ntbl->ce_mask |= NEIGHTBL_ATTR_FAMILY;
711*4dc78e53SAndroid Build Coastguard Worker }
712*4dc78e53SAndroid Build Coastguard Worker
rtnl_neightbl_set_gc_interval(struct rtnl_neightbl * ntbl,uint64_t ms)713*4dc78e53SAndroid Build Coastguard Worker void rtnl_neightbl_set_gc_interval(struct rtnl_neightbl *ntbl, uint64_t ms)
714*4dc78e53SAndroid Build Coastguard Worker {
715*4dc78e53SAndroid Build Coastguard Worker ntbl->nt_gc_interval = ms;
716*4dc78e53SAndroid Build Coastguard Worker ntbl->ce_mask |= NEIGHTBL_ATTR_GC_INTERVAL;
717*4dc78e53SAndroid Build Coastguard Worker }
718*4dc78e53SAndroid Build Coastguard Worker
rtnl_neightbl_set_gc_tresh1(struct rtnl_neightbl * ntbl,int thresh)719*4dc78e53SAndroid Build Coastguard Worker void rtnl_neightbl_set_gc_tresh1(struct rtnl_neightbl *ntbl, int thresh)
720*4dc78e53SAndroid Build Coastguard Worker {
721*4dc78e53SAndroid Build Coastguard Worker ntbl->nt_gc_thresh1 = thresh;
722*4dc78e53SAndroid Build Coastguard Worker ntbl->ce_mask |= NEIGHTBL_ATTR_THRESH1;
723*4dc78e53SAndroid Build Coastguard Worker }
724*4dc78e53SAndroid Build Coastguard Worker
rtnl_neightbl_set_gc_tresh2(struct rtnl_neightbl * ntbl,int thresh)725*4dc78e53SAndroid Build Coastguard Worker void rtnl_neightbl_set_gc_tresh2(struct rtnl_neightbl *ntbl, int thresh)
726*4dc78e53SAndroid Build Coastguard Worker {
727*4dc78e53SAndroid Build Coastguard Worker ntbl->nt_gc_thresh2 = thresh;
728*4dc78e53SAndroid Build Coastguard Worker ntbl->ce_mask |= NEIGHTBL_ATTR_THRESH2;
729*4dc78e53SAndroid Build Coastguard Worker }
730*4dc78e53SAndroid Build Coastguard Worker
rtnl_neightbl_set_gc_tresh3(struct rtnl_neightbl * ntbl,int thresh)731*4dc78e53SAndroid Build Coastguard Worker void rtnl_neightbl_set_gc_tresh3(struct rtnl_neightbl *ntbl, int thresh)
732*4dc78e53SAndroid Build Coastguard Worker {
733*4dc78e53SAndroid Build Coastguard Worker ntbl->nt_gc_thresh3 = thresh;
734*4dc78e53SAndroid Build Coastguard Worker ntbl->ce_mask |= NEIGHTBL_ATTR_THRESH3;
735*4dc78e53SAndroid Build Coastguard Worker }
736*4dc78e53SAndroid Build Coastguard Worker
rtnl_neightbl_set_name(struct rtnl_neightbl * ntbl,const char * name)737*4dc78e53SAndroid Build Coastguard Worker void rtnl_neightbl_set_name(struct rtnl_neightbl *ntbl, const char *name)
738*4dc78e53SAndroid Build Coastguard Worker {
739*4dc78e53SAndroid Build Coastguard Worker _nl_strncpy_trunc(ntbl->nt_name, name, sizeof(ntbl->nt_name));
740*4dc78e53SAndroid Build Coastguard Worker ntbl->ce_mask |= NEIGHTBL_ATTR_NAME;
741*4dc78e53SAndroid Build Coastguard Worker }
742*4dc78e53SAndroid Build Coastguard Worker
rtnl_neightbl_set_dev(struct rtnl_neightbl * ntbl,int ifindex)743*4dc78e53SAndroid Build Coastguard Worker void rtnl_neightbl_set_dev(struct rtnl_neightbl *ntbl, int ifindex)
744*4dc78e53SAndroid Build Coastguard Worker {
745*4dc78e53SAndroid Build Coastguard Worker ntbl->nt_parms.ntp_ifindex = ifindex;
746*4dc78e53SAndroid Build Coastguard Worker ntbl->nt_parms.ntp_mask |= NEIGHTBLPARM_ATTR_IFINDEX;
747*4dc78e53SAndroid Build Coastguard Worker ntbl->ce_mask |= NEIGHTBL_ATTR_PARMS;
748*4dc78e53SAndroid Build Coastguard Worker }
749*4dc78e53SAndroid Build Coastguard Worker
750*4dc78e53SAndroid Build Coastguard Worker /**
751*4dc78e53SAndroid Build Coastguard Worker * Set the queue length for pending requests of a neighbour table to the specified value
752*4dc78e53SAndroid Build Coastguard Worker * @arg ntbl neighbour table to change
753*4dc78e53SAndroid Build Coastguard Worker * @arg len new queue len
754*4dc78e53SAndroid Build Coastguard Worker */
rtnl_neightbl_set_queue_len(struct rtnl_neightbl * ntbl,int len)755*4dc78e53SAndroid Build Coastguard Worker void rtnl_neightbl_set_queue_len(struct rtnl_neightbl *ntbl, int len)
756*4dc78e53SAndroid Build Coastguard Worker {
757*4dc78e53SAndroid Build Coastguard Worker ntbl->nt_parms.ntp_queue_len = len;
758*4dc78e53SAndroid Build Coastguard Worker ntbl->nt_parms.ntp_mask |= NEIGHTBLPARM_ATTR_QUEUE_LEN;
759*4dc78e53SAndroid Build Coastguard Worker ntbl->ce_mask |= NEIGHTBL_ATTR_PARMS;
760*4dc78e53SAndroid Build Coastguard Worker }
761*4dc78e53SAndroid Build Coastguard Worker
762*4dc78e53SAndroid Build Coastguard Worker /**
763*4dc78e53SAndroid Build Coastguard Worker * Set the queue length for delay proxy arp requests of a neighbour table to the specified value
764*4dc78e53SAndroid Build Coastguard Worker * @arg ntbl neighbour table to change
765*4dc78e53SAndroid Build Coastguard Worker * @arg len new queue len
766*4dc78e53SAndroid Build Coastguard Worker */
rtnl_neightbl_set_proxy_queue_len(struct rtnl_neightbl * ntbl,int len)767*4dc78e53SAndroid Build Coastguard Worker void rtnl_neightbl_set_proxy_queue_len(struct rtnl_neightbl *ntbl, int len)
768*4dc78e53SAndroid Build Coastguard Worker {
769*4dc78e53SAndroid Build Coastguard Worker ntbl->nt_parms.ntp_proxy_qlen = len;
770*4dc78e53SAndroid Build Coastguard Worker ntbl->nt_parms.ntp_mask |= NEIGHTBLPARM_ATTR_PROXY_QLEN;
771*4dc78e53SAndroid Build Coastguard Worker ntbl->ce_mask |= NEIGHTBL_ATTR_PARMS;
772*4dc78e53SAndroid Build Coastguard Worker }
773*4dc78e53SAndroid Build Coastguard Worker
774*4dc78e53SAndroid Build Coastguard Worker /**
775*4dc78e53SAndroid Build Coastguard Worker * Set the number of application probes of a neighbour table to the specified value
776*4dc78e53SAndroid Build Coastguard Worker * @arg ntbl neighbour table to change
777*4dc78e53SAndroid Build Coastguard Worker * @arg probes new probes value
778*4dc78e53SAndroid Build Coastguard Worker */
rtnl_neightbl_set_app_probes(struct rtnl_neightbl * ntbl,int probes)779*4dc78e53SAndroid Build Coastguard Worker void rtnl_neightbl_set_app_probes(struct rtnl_neightbl *ntbl, int probes)
780*4dc78e53SAndroid Build Coastguard Worker {
781*4dc78e53SAndroid Build Coastguard Worker ntbl->nt_parms.ntp_app_probes = probes;
782*4dc78e53SAndroid Build Coastguard Worker ntbl->nt_parms.ntp_mask |= NEIGHTBLPARM_ATTR_APP_PROBES;
783*4dc78e53SAndroid Build Coastguard Worker ntbl->ce_mask |= NEIGHTBL_ATTR_PARMS;
784*4dc78e53SAndroid Build Coastguard Worker }
785*4dc78e53SAndroid Build Coastguard Worker
786*4dc78e53SAndroid Build Coastguard Worker /**
787*4dc78e53SAndroid Build Coastguard Worker * Set the number of unicast probes of a neighbour table to the specified value
788*4dc78e53SAndroid Build Coastguard Worker * @arg ntbl neighbour table to change
789*4dc78e53SAndroid Build Coastguard Worker * @arg probes new probes value
790*4dc78e53SAndroid Build Coastguard Worker */
rtnl_neightbl_set_ucast_probes(struct rtnl_neightbl * ntbl,int probes)791*4dc78e53SAndroid Build Coastguard Worker void rtnl_neightbl_set_ucast_probes(struct rtnl_neightbl *ntbl, int probes)
792*4dc78e53SAndroid Build Coastguard Worker {
793*4dc78e53SAndroid Build Coastguard Worker ntbl->nt_parms.ntp_ucast_probes = probes;
794*4dc78e53SAndroid Build Coastguard Worker ntbl->nt_parms.ntp_mask |= NEIGHTBLPARM_ATTR_UCAST_PROBES;
795*4dc78e53SAndroid Build Coastguard Worker ntbl->ce_mask |= NEIGHTBL_ATTR_PARMS;
796*4dc78e53SAndroid Build Coastguard Worker }
797*4dc78e53SAndroid Build Coastguard Worker
798*4dc78e53SAndroid Build Coastguard Worker /**
799*4dc78e53SAndroid Build Coastguard Worker * Set the number of multicast probes of a neighbour table to the specified value
800*4dc78e53SAndroid Build Coastguard Worker * @arg ntbl neighbour table to change
801*4dc78e53SAndroid Build Coastguard Worker * @arg probes new probes value
802*4dc78e53SAndroid Build Coastguard Worker */
rtnl_neightbl_set_mcast_probes(struct rtnl_neightbl * ntbl,int probes)803*4dc78e53SAndroid Build Coastguard Worker void rtnl_neightbl_set_mcast_probes(struct rtnl_neightbl *ntbl, int probes)
804*4dc78e53SAndroid Build Coastguard Worker {
805*4dc78e53SAndroid Build Coastguard Worker ntbl->nt_parms.ntp_mcast_probes = probes;
806*4dc78e53SAndroid Build Coastguard Worker ntbl->nt_parms.ntp_mask |= NEIGHTBLPARM_ATTR_MCAST_PROBES;
807*4dc78e53SAndroid Build Coastguard Worker ntbl->ce_mask |= NEIGHTBL_ATTR_PARMS;
808*4dc78e53SAndroid Build Coastguard Worker }
809*4dc78e53SAndroid Build Coastguard Worker
810*4dc78e53SAndroid Build Coastguard Worker /**
811*4dc78e53SAndroid Build Coastguard Worker * Set the base reachable time of a neighbour table to the specified value
812*4dc78e53SAndroid Build Coastguard Worker * @arg ntbl neighbour table to change
813*4dc78e53SAndroid Build Coastguard Worker * @arg ms new base reachable time in milliseconds
814*4dc78e53SAndroid Build Coastguard Worker */
rtnl_neightbl_set_base_reachable_time(struct rtnl_neightbl * ntbl,uint64_t ms)815*4dc78e53SAndroid Build Coastguard Worker void rtnl_neightbl_set_base_reachable_time(struct rtnl_neightbl *ntbl,
816*4dc78e53SAndroid Build Coastguard Worker uint64_t ms)
817*4dc78e53SAndroid Build Coastguard Worker {
818*4dc78e53SAndroid Build Coastguard Worker ntbl->nt_parms.ntp_base_reachable_time = ms;
819*4dc78e53SAndroid Build Coastguard Worker ntbl->nt_parms.ntp_mask |= NEIGHTBLPARM_ATTR_BASE_REACHABLE_TIME;
820*4dc78e53SAndroid Build Coastguard Worker ntbl->ce_mask |= NEIGHTBL_ATTR_PARMS;
821*4dc78e53SAndroid Build Coastguard Worker }
822*4dc78e53SAndroid Build Coastguard Worker
823*4dc78e53SAndroid Build Coastguard Worker /**
824*4dc78e53SAndroid Build Coastguard Worker * Set the retransmit time of a neighbour table to the specified value
825*4dc78e53SAndroid Build Coastguard Worker * @arg ntbl neighbour table to change
826*4dc78e53SAndroid Build Coastguard Worker * @arg ms new retransmit time
827*4dc78e53SAndroid Build Coastguard Worker */
rtnl_neightbl_set_retrans_time(struct rtnl_neightbl * ntbl,uint64_t ms)828*4dc78e53SAndroid Build Coastguard Worker void rtnl_neightbl_set_retrans_time(struct rtnl_neightbl *ntbl, uint64_t ms)
829*4dc78e53SAndroid Build Coastguard Worker {
830*4dc78e53SAndroid Build Coastguard Worker ntbl->nt_parms.ntp_retrans_time = ms;
831*4dc78e53SAndroid Build Coastguard Worker ntbl->nt_parms.ntp_mask |= NEIGHTBLPARM_ATTR_RETRANS_TIME;
832*4dc78e53SAndroid Build Coastguard Worker ntbl->ce_mask |= NEIGHTBL_ATTR_PARMS;
833*4dc78e53SAndroid Build Coastguard Worker }
834*4dc78e53SAndroid Build Coastguard Worker
835*4dc78e53SAndroid Build Coastguard Worker /**
836*4dc78e53SAndroid Build Coastguard Worker * Set the gc stale time of a neighbour table to the specified value
837*4dc78e53SAndroid Build Coastguard Worker * @arg ntbl neighbour table to change
838*4dc78e53SAndroid Build Coastguard Worker * @arg ms new gc stale time in milliseconds
839*4dc78e53SAndroid Build Coastguard Worker */
rtnl_neightbl_set_gc_stale_time(struct rtnl_neightbl * ntbl,uint64_t ms)840*4dc78e53SAndroid Build Coastguard Worker void rtnl_neightbl_set_gc_stale_time(struct rtnl_neightbl *ntbl, uint64_t ms)
841*4dc78e53SAndroid Build Coastguard Worker {
842*4dc78e53SAndroid Build Coastguard Worker ntbl->nt_parms.ntp_gc_stale_time = ms;
843*4dc78e53SAndroid Build Coastguard Worker ntbl->nt_parms.ntp_mask |= NEIGHTBLPARM_ATTR_GC_STALETIME;
844*4dc78e53SAndroid Build Coastguard Worker ntbl->ce_mask |= NEIGHTBL_ATTR_PARMS;
845*4dc78e53SAndroid Build Coastguard Worker }
846*4dc78e53SAndroid Build Coastguard Worker
847*4dc78e53SAndroid Build Coastguard Worker /**
848*4dc78e53SAndroid Build Coastguard Worker * Set the first probe delay time of a neighbour table to the specified value
849*4dc78e53SAndroid Build Coastguard Worker * @arg ntbl neighbour table to change
850*4dc78e53SAndroid Build Coastguard Worker * @arg ms new first probe delay time in milliseconds
851*4dc78e53SAndroid Build Coastguard Worker */
rtnl_neightbl_set_delay_probe_time(struct rtnl_neightbl * ntbl,uint64_t ms)852*4dc78e53SAndroid Build Coastguard Worker void rtnl_neightbl_set_delay_probe_time(struct rtnl_neightbl *ntbl, uint64_t ms)
853*4dc78e53SAndroid Build Coastguard Worker {
854*4dc78e53SAndroid Build Coastguard Worker ntbl->nt_parms.ntp_probe_delay = ms;
855*4dc78e53SAndroid Build Coastguard Worker ntbl->nt_parms.ntp_mask |= NEIGHTBLPARM_ATTR_DELAY_PROBE_TIME;
856*4dc78e53SAndroid Build Coastguard Worker ntbl->ce_mask |= NEIGHTBL_ATTR_PARMS;
857*4dc78e53SAndroid Build Coastguard Worker }
858*4dc78e53SAndroid Build Coastguard Worker
859*4dc78e53SAndroid Build Coastguard Worker /**
860*4dc78e53SAndroid Build Coastguard Worker * Set the anycast delay of a neighbour table to the specified value
861*4dc78e53SAndroid Build Coastguard Worker * @arg ntbl neighbour table to change
862*4dc78e53SAndroid Build Coastguard Worker * @arg ms new anycast delay in milliseconds
863*4dc78e53SAndroid Build Coastguard Worker */
rtnl_neightbl_set_anycast_delay(struct rtnl_neightbl * ntbl,uint64_t ms)864*4dc78e53SAndroid Build Coastguard Worker void rtnl_neightbl_set_anycast_delay(struct rtnl_neightbl *ntbl, uint64_t ms)
865*4dc78e53SAndroid Build Coastguard Worker {
866*4dc78e53SAndroid Build Coastguard Worker ntbl->nt_parms.ntp_anycast_delay = ms;
867*4dc78e53SAndroid Build Coastguard Worker ntbl->nt_parms.ntp_mask |= NEIGHTBLPARM_ATTR_ANYCAST_DELAY;
868*4dc78e53SAndroid Build Coastguard Worker ntbl->ce_mask |= NEIGHTBL_ATTR_PARMS;
869*4dc78e53SAndroid Build Coastguard Worker }
870*4dc78e53SAndroid Build Coastguard Worker
871*4dc78e53SAndroid Build Coastguard Worker /**
872*4dc78e53SAndroid Build Coastguard Worker * Set the proxy delay of a neighbour table to the specified value
873*4dc78e53SAndroid Build Coastguard Worker * @arg ntbl neighbour table to change
874*4dc78e53SAndroid Build Coastguard Worker * @arg ms new proxy delay in milliseconds
875*4dc78e53SAndroid Build Coastguard Worker */
rtnl_neightbl_set_proxy_delay(struct rtnl_neightbl * ntbl,uint64_t ms)876*4dc78e53SAndroid Build Coastguard Worker void rtnl_neightbl_set_proxy_delay(struct rtnl_neightbl *ntbl, uint64_t ms)
877*4dc78e53SAndroid Build Coastguard Worker {
878*4dc78e53SAndroid Build Coastguard Worker ntbl->nt_parms.ntp_proxy_delay = ms;
879*4dc78e53SAndroid Build Coastguard Worker ntbl->nt_parms.ntp_mask |= NEIGHTBLPARM_ATTR_PROXY_DELAY;
880*4dc78e53SAndroid Build Coastguard Worker ntbl->ce_mask |= NEIGHTBL_ATTR_PARMS;
881*4dc78e53SAndroid Build Coastguard Worker }
882*4dc78e53SAndroid Build Coastguard Worker
883*4dc78e53SAndroid Build Coastguard Worker /**
884*4dc78e53SAndroid Build Coastguard Worker * Set the locktime of a neighbour table to the specified value
885*4dc78e53SAndroid Build Coastguard Worker * @arg ntbl neighbour table to change
886*4dc78e53SAndroid Build Coastguard Worker * @arg ms new locktime in milliseconds
887*4dc78e53SAndroid Build Coastguard Worker */
rtnl_neightbl_set_locktime(struct rtnl_neightbl * ntbl,uint64_t ms)888*4dc78e53SAndroid Build Coastguard Worker void rtnl_neightbl_set_locktime(struct rtnl_neightbl *ntbl, uint64_t ms)
889*4dc78e53SAndroid Build Coastguard Worker {
890*4dc78e53SAndroid Build Coastguard Worker ntbl->nt_parms.ntp_locktime = ms;
891*4dc78e53SAndroid Build Coastguard Worker ntbl->nt_parms.ntp_mask |= NEIGHTBLPARM_ATTR_LOCKTIME;
892*4dc78e53SAndroid Build Coastguard Worker ntbl->ce_mask |= NEIGHTBL_ATTR_PARMS;
893*4dc78e53SAndroid Build Coastguard Worker }
894*4dc78e53SAndroid Build Coastguard Worker
895*4dc78e53SAndroid Build Coastguard Worker /** @} */
896*4dc78e53SAndroid Build Coastguard Worker
897*4dc78e53SAndroid Build Coastguard Worker static struct nl_object_ops neightbl_obj_ops = {
898*4dc78e53SAndroid Build Coastguard Worker .oo_name = "route/neightbl",
899*4dc78e53SAndroid Build Coastguard Worker .oo_size = sizeof(struct rtnl_neightbl),
900*4dc78e53SAndroid Build Coastguard Worker .oo_dump = {
901*4dc78e53SAndroid Build Coastguard Worker [NL_DUMP_LINE] = neightbl_dump_line,
902*4dc78e53SAndroid Build Coastguard Worker [NL_DUMP_DETAILS] = neightbl_dump_details,
903*4dc78e53SAndroid Build Coastguard Worker [NL_DUMP_STATS] = neightbl_dump_stats,
904*4dc78e53SAndroid Build Coastguard Worker },
905*4dc78e53SAndroid Build Coastguard Worker .oo_compare = neightbl_compare,
906*4dc78e53SAndroid Build Coastguard Worker };
907*4dc78e53SAndroid Build Coastguard Worker
908*4dc78e53SAndroid Build Coastguard Worker static struct nl_cache_ops rtnl_neightbl_ops = {
909*4dc78e53SAndroid Build Coastguard Worker .co_name = "route/neightbl",
910*4dc78e53SAndroid Build Coastguard Worker .co_hdrsize = sizeof(struct rtgenmsg),
911*4dc78e53SAndroid Build Coastguard Worker .co_msgtypes = {
912*4dc78e53SAndroid Build Coastguard Worker { RTM_NEWNEIGHTBL, NL_ACT_NEW, "new" },
913*4dc78e53SAndroid Build Coastguard Worker { RTM_SETNEIGHTBL, NL_ACT_SET, "set" },
914*4dc78e53SAndroid Build Coastguard Worker { RTM_GETNEIGHTBL, NL_ACT_GET, "get" },
915*4dc78e53SAndroid Build Coastguard Worker END_OF_MSGTYPES_LIST,
916*4dc78e53SAndroid Build Coastguard Worker },
917*4dc78e53SAndroid Build Coastguard Worker .co_protocol = NETLINK_ROUTE,
918*4dc78e53SAndroid Build Coastguard Worker .co_request_update = neightbl_request_update,
919*4dc78e53SAndroid Build Coastguard Worker .co_msg_parser = neightbl_msg_parser,
920*4dc78e53SAndroid Build Coastguard Worker .co_obj_ops = &neightbl_obj_ops,
921*4dc78e53SAndroid Build Coastguard Worker };
922*4dc78e53SAndroid Build Coastguard Worker
neightbl_init(void)923*4dc78e53SAndroid Build Coastguard Worker static void _nl_init neightbl_init(void)
924*4dc78e53SAndroid Build Coastguard Worker {
925*4dc78e53SAndroid Build Coastguard Worker nl_cache_mngt_register(&rtnl_neightbl_ops);
926*4dc78e53SAndroid Build Coastguard Worker }
927*4dc78e53SAndroid Build Coastguard Worker
neightbl_exit(void)928*4dc78e53SAndroid Build Coastguard Worker static void _nl_exit neightbl_exit(void)
929*4dc78e53SAndroid Build Coastguard Worker {
930*4dc78e53SAndroid Build Coastguard Worker nl_cache_mngt_unregister(&rtnl_neightbl_ops);
931*4dc78e53SAndroid Build Coastguard Worker }
932*4dc78e53SAndroid Build Coastguard Worker
933*4dc78e53SAndroid Build Coastguard Worker /** @} */
934