xref: /aosp_15_r20/external/libnl/lib/route/neightbl.c (revision 4dc78e53d49367fa8e61b07018507c90983a077d)
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