xref: /aosp_15_r20/external/libnl/lib/idiag/idiag_req_obj.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) 2013 Sassano Systems LLC <[email protected]>
4*4dc78e53SAndroid Build Coastguard Worker  */
5*4dc78e53SAndroid Build Coastguard Worker 
6*4dc78e53SAndroid Build Coastguard Worker #include "nl-default.h"
7*4dc78e53SAndroid Build Coastguard Worker 
8*4dc78e53SAndroid Build Coastguard Worker #include <linux/inet_diag.h>
9*4dc78e53SAndroid Build Coastguard Worker 
10*4dc78e53SAndroid Build Coastguard Worker #include <netlink/idiag/req.h>
11*4dc78e53SAndroid Build Coastguard Worker #include <netlink/idiag/idiagnl.h>
12*4dc78e53SAndroid Build Coastguard Worker #include <netlink/data.h>
13*4dc78e53SAndroid Build Coastguard Worker #include <netlink/addr.h>
14*4dc78e53SAndroid Build Coastguard Worker #include <netlink/msg.h>
15*4dc78e53SAndroid Build Coastguard Worker 
16*4dc78e53SAndroid Build Coastguard Worker #include "nl-priv-dynamic-core/object-api.h"
17*4dc78e53SAndroid Build Coastguard Worker 
18*4dc78e53SAndroid Build Coastguard Worker struct idiagnl_req {
19*4dc78e53SAndroid Build Coastguard Worker 	NLHDR_COMMON
20*4dc78e53SAndroid Build Coastguard Worker 
21*4dc78e53SAndroid Build Coastguard Worker 	uint8_t			idiag_family;
22*4dc78e53SAndroid Build Coastguard Worker 	uint8_t			idiag_ext;
23*4dc78e53SAndroid Build Coastguard Worker 	struct nl_addr *	idiag_src;
24*4dc78e53SAndroid Build Coastguard Worker 	struct nl_addr *	idiag_dst;
25*4dc78e53SAndroid Build Coastguard Worker 	uint32_t		idiag_ifindex;
26*4dc78e53SAndroid Build Coastguard Worker 	uint32_t		idiag_states;
27*4dc78e53SAndroid Build Coastguard Worker 	uint32_t		idiag_dbs;
28*4dc78e53SAndroid Build Coastguard Worker };
29*4dc78e53SAndroid Build Coastguard Worker 
30*4dc78e53SAndroid Build Coastguard Worker /**
31*4dc78e53SAndroid Build Coastguard Worker  * @ingroup idiag
32*4dc78e53SAndroid Build Coastguard Worker  * @defgroup idiagnl_req Inet Diag Requests
33*4dc78e53SAndroid Build Coastguard Worker  *
34*4dc78e53SAndroid Build Coastguard Worker  * @details
35*4dc78e53SAndroid Build Coastguard Worker  * @idiagnl_doc{idiagnl_req, Inet Diag Request Documentation}
36*4dc78e53SAndroid Build Coastguard Worker  * @{
37*4dc78e53SAndroid Build Coastguard Worker  */
idiagnl_req_alloc(void)38*4dc78e53SAndroid Build Coastguard Worker struct idiagnl_req *idiagnl_req_alloc(void)
39*4dc78e53SAndroid Build Coastguard Worker {
40*4dc78e53SAndroid Build Coastguard Worker 	return (struct idiagnl_req *) nl_object_alloc(&idiagnl_req_obj_ops);
41*4dc78e53SAndroid Build Coastguard Worker }
42*4dc78e53SAndroid Build Coastguard Worker 
idiagnl_req_get(struct idiagnl_req * req)43*4dc78e53SAndroid Build Coastguard Worker void idiagnl_req_get(struct idiagnl_req *req)
44*4dc78e53SAndroid Build Coastguard Worker {
45*4dc78e53SAndroid Build Coastguard Worker 	nl_object_get((struct nl_object *) req);
46*4dc78e53SAndroid Build Coastguard Worker }
47*4dc78e53SAndroid Build Coastguard Worker 
idiagnl_req_put(struct idiagnl_req * req)48*4dc78e53SAndroid Build Coastguard Worker void idiagnl_req_put(struct idiagnl_req *req)
49*4dc78e53SAndroid Build Coastguard Worker {
50*4dc78e53SAndroid Build Coastguard Worker 	nl_object_put((struct nl_object *) req);
51*4dc78e53SAndroid Build Coastguard Worker }
52*4dc78e53SAndroid Build Coastguard Worker 
53*4dc78e53SAndroid Build Coastguard Worker /**
54*4dc78e53SAndroid Build Coastguard Worker  * @name Attributes
55*4dc78e53SAndroid Build Coastguard Worker  * @{
56*4dc78e53SAndroid Build Coastguard Worker  */
57*4dc78e53SAndroid Build Coastguard Worker 
idiagnl_req_get_family(const struct idiagnl_req * req)58*4dc78e53SAndroid Build Coastguard Worker uint8_t idiagnl_req_get_family(const struct idiagnl_req *req)
59*4dc78e53SAndroid Build Coastguard Worker {
60*4dc78e53SAndroid Build Coastguard Worker 	return req->idiag_family;
61*4dc78e53SAndroid Build Coastguard Worker }
62*4dc78e53SAndroid Build Coastguard Worker 
idiagnl_req_set_family(struct idiagnl_req * req,uint8_t family)63*4dc78e53SAndroid Build Coastguard Worker void idiagnl_req_set_family(struct idiagnl_req *req, uint8_t family)
64*4dc78e53SAndroid Build Coastguard Worker {
65*4dc78e53SAndroid Build Coastguard Worker 	req->idiag_family = family;
66*4dc78e53SAndroid Build Coastguard Worker }
67*4dc78e53SAndroid Build Coastguard Worker 
idiagnl_req_get_ext(const struct idiagnl_req * req)68*4dc78e53SAndroid Build Coastguard Worker uint8_t idiagnl_req_get_ext(const struct idiagnl_req *req)
69*4dc78e53SAndroid Build Coastguard Worker {
70*4dc78e53SAndroid Build Coastguard Worker 	return req->idiag_ext;
71*4dc78e53SAndroid Build Coastguard Worker }
72*4dc78e53SAndroid Build Coastguard Worker 
idiagnl_req_set_ext(struct idiagnl_req * req,uint8_t ext)73*4dc78e53SAndroid Build Coastguard Worker void idiagnl_req_set_ext(struct idiagnl_req *req, uint8_t ext)
74*4dc78e53SAndroid Build Coastguard Worker {
75*4dc78e53SAndroid Build Coastguard Worker 	req->idiag_ext = ext;
76*4dc78e53SAndroid Build Coastguard Worker }
77*4dc78e53SAndroid Build Coastguard Worker 
idiagnl_req_get_ifindex(const struct idiagnl_req * req)78*4dc78e53SAndroid Build Coastguard Worker uint32_t idiagnl_req_get_ifindex(const struct idiagnl_req *req)
79*4dc78e53SAndroid Build Coastguard Worker {
80*4dc78e53SAndroid Build Coastguard Worker 	return req->idiag_ifindex;
81*4dc78e53SAndroid Build Coastguard Worker }
82*4dc78e53SAndroid Build Coastguard Worker 
idiagnl_req_set_ifindex(struct idiagnl_req * req,uint32_t ifindex)83*4dc78e53SAndroid Build Coastguard Worker void idiagnl_req_set_ifindex(struct idiagnl_req *req, uint32_t ifindex)
84*4dc78e53SAndroid Build Coastguard Worker {
85*4dc78e53SAndroid Build Coastguard Worker 	req->idiag_ifindex = ifindex;
86*4dc78e53SAndroid Build Coastguard Worker }
87*4dc78e53SAndroid Build Coastguard Worker 
idiagnl_req_get_states(const struct idiagnl_req * req)88*4dc78e53SAndroid Build Coastguard Worker uint32_t idiagnl_req_get_states(const struct idiagnl_req *req)
89*4dc78e53SAndroid Build Coastguard Worker {
90*4dc78e53SAndroid Build Coastguard Worker 	return req->idiag_states;
91*4dc78e53SAndroid Build Coastguard Worker }
92*4dc78e53SAndroid Build Coastguard Worker 
idiagnl_req_set_states(struct idiagnl_req * req,uint32_t states)93*4dc78e53SAndroid Build Coastguard Worker void idiagnl_req_set_states(struct idiagnl_req *req, uint32_t states)
94*4dc78e53SAndroid Build Coastguard Worker {
95*4dc78e53SAndroid Build Coastguard Worker 	req->idiag_states = states;
96*4dc78e53SAndroid Build Coastguard Worker }
97*4dc78e53SAndroid Build Coastguard Worker 
idiagnl_req_get_dbs(const struct idiagnl_req * req)98*4dc78e53SAndroid Build Coastguard Worker uint32_t idiagnl_req_get_dbs(const struct idiagnl_req *req)
99*4dc78e53SAndroid Build Coastguard Worker {
100*4dc78e53SAndroid Build Coastguard Worker 	return req->idiag_dbs;
101*4dc78e53SAndroid Build Coastguard Worker }
102*4dc78e53SAndroid Build Coastguard Worker 
idiagnl_req_set_dbs(struct idiagnl_req * req,uint32_t dbs)103*4dc78e53SAndroid Build Coastguard Worker void idiagnl_req_set_dbs(struct idiagnl_req *req, uint32_t dbs)
104*4dc78e53SAndroid Build Coastguard Worker {
105*4dc78e53SAndroid Build Coastguard Worker 	req->idiag_dbs = dbs;
106*4dc78e53SAndroid Build Coastguard Worker }
107*4dc78e53SAndroid Build Coastguard Worker 
idiagnl_req_get_src(const struct idiagnl_req * req)108*4dc78e53SAndroid Build Coastguard Worker struct nl_addr *idiagnl_req_get_src(const struct idiagnl_req *req)
109*4dc78e53SAndroid Build Coastguard Worker {
110*4dc78e53SAndroid Build Coastguard Worker 	return req->idiag_src;
111*4dc78e53SAndroid Build Coastguard Worker }
112*4dc78e53SAndroid Build Coastguard Worker 
idiagnl_req_set_src(struct idiagnl_req * req,struct nl_addr * addr)113*4dc78e53SAndroid Build Coastguard Worker int idiagnl_req_set_src(struct idiagnl_req *req, struct nl_addr *addr)
114*4dc78e53SAndroid Build Coastguard Worker {
115*4dc78e53SAndroid Build Coastguard Worker 	if (req->idiag_src)
116*4dc78e53SAndroid Build Coastguard Worker 		nl_addr_put(req->idiag_src);
117*4dc78e53SAndroid Build Coastguard Worker 
118*4dc78e53SAndroid Build Coastguard Worker 	nl_addr_get(addr);
119*4dc78e53SAndroid Build Coastguard Worker 	req->idiag_src = addr;
120*4dc78e53SAndroid Build Coastguard Worker 
121*4dc78e53SAndroid Build Coastguard Worker 	return 0;
122*4dc78e53SAndroid Build Coastguard Worker }
123*4dc78e53SAndroid Build Coastguard Worker 
idiagnl_req_get_dst(const struct idiagnl_req * req)124*4dc78e53SAndroid Build Coastguard Worker struct nl_addr *idiagnl_req_get_dst(const struct idiagnl_req *req)
125*4dc78e53SAndroid Build Coastguard Worker {
126*4dc78e53SAndroid Build Coastguard Worker 	return req->idiag_dst;
127*4dc78e53SAndroid Build Coastguard Worker }
128*4dc78e53SAndroid Build Coastguard Worker 
idiagnl_req_set_dst(struct idiagnl_req * req,struct nl_addr * addr)129*4dc78e53SAndroid Build Coastguard Worker int idiagnl_req_set_dst(struct idiagnl_req *req, struct nl_addr *addr)
130*4dc78e53SAndroid Build Coastguard Worker {
131*4dc78e53SAndroid Build Coastguard Worker 	if (req->idiag_dst)
132*4dc78e53SAndroid Build Coastguard Worker 		nl_addr_put(req->idiag_dst);
133*4dc78e53SAndroid Build Coastguard Worker 
134*4dc78e53SAndroid Build Coastguard Worker 	nl_addr_get(addr);
135*4dc78e53SAndroid Build Coastguard Worker 	req->idiag_dst = addr;
136*4dc78e53SAndroid Build Coastguard Worker 
137*4dc78e53SAndroid Build Coastguard Worker 	return 0;
138*4dc78e53SAndroid Build Coastguard Worker }
139*4dc78e53SAndroid Build Coastguard Worker 
140*4dc78e53SAndroid Build Coastguard Worker /** @} */
141*4dc78e53SAndroid Build Coastguard Worker 
idiag_req_dump_line(struct nl_object * a,struct nl_dump_params * p)142*4dc78e53SAndroid Build Coastguard Worker static void idiag_req_dump_line(struct nl_object *a, struct nl_dump_params *p)
143*4dc78e53SAndroid Build Coastguard Worker {
144*4dc78e53SAndroid Build Coastguard Worker 	struct idiagnl_req *req = (struct idiagnl_req *) a;
145*4dc78e53SAndroid Build Coastguard Worker 	char buf[64] = { 0 };
146*4dc78e53SAndroid Build Coastguard Worker 
147*4dc78e53SAndroid Build Coastguard Worker 	nl_dump_line(p, "%s ", nl_af2str(req->idiag_family, buf, sizeof(buf)));
148*4dc78e53SAndroid Build Coastguard Worker 	nl_dump(p, "src %s ", nl_addr2str(req->idiag_src, buf, sizeof(buf)));
149*4dc78e53SAndroid Build Coastguard Worker 	nl_dump(p, "dst %s ", nl_addr2str(req->idiag_dst, buf, sizeof(buf)));
150*4dc78e53SAndroid Build Coastguard Worker 	nl_dump(p, "iif %d ", req->idiag_ifindex);
151*4dc78e53SAndroid Build Coastguard Worker 	nl_dump(p, "\n");
152*4dc78e53SAndroid Build Coastguard Worker }
153*4dc78e53SAndroid Build Coastguard Worker 
idiag_req_dump_details(struct nl_object * a,struct nl_dump_params * p)154*4dc78e53SAndroid Build Coastguard Worker static void idiag_req_dump_details(struct nl_object *a, struct nl_dump_params *p)
155*4dc78e53SAndroid Build Coastguard Worker {
156*4dc78e53SAndroid Build Coastguard Worker 	struct idiagnl_req *req = (struct idiagnl_req *) a;
157*4dc78e53SAndroid Build Coastguard Worker 	char buf[64];
158*4dc78e53SAndroid Build Coastguard Worker 
159*4dc78e53SAndroid Build Coastguard Worker 	nl_dump_line(p, "    ");
160*4dc78e53SAndroid Build Coastguard Worker 	nl_dump(p, "%s ", nl_af2str(req->idiag_family, buf, sizeof(buf)));
161*4dc78e53SAndroid Build Coastguard Worker 	nl_dump(p, "exts %s ",
162*4dc78e53SAndroid Build Coastguard Worker 			idiagnl_exts2str(req->idiag_ext, buf, sizeof(buf)));
163*4dc78e53SAndroid Build Coastguard Worker 	nl_dump(p, "src %s ", nl_addr2str(req->idiag_src, buf, sizeof(buf)));
164*4dc78e53SAndroid Build Coastguard Worker 	nl_dump(p, "dst %s ", nl_addr2str(req->idiag_dst, buf, sizeof(buf)));
165*4dc78e53SAndroid Build Coastguard Worker 	nl_dump(p, "iif %d ", req->idiag_ifindex);
166*4dc78e53SAndroid Build Coastguard Worker 	nl_dump(p, "states %s ", idiagnl_state2str(req->idiag_states, buf,
167*4dc78e53SAndroid Build Coastguard Worker 				sizeof(buf)));
168*4dc78e53SAndroid Build Coastguard Worker 	nl_dump(p, "dbs %d", req->idiag_dbs);
169*4dc78e53SAndroid Build Coastguard Worker 	nl_dump(p, "\n");
170*4dc78e53SAndroid Build Coastguard Worker }
171*4dc78e53SAndroid Build Coastguard Worker 
idiag_req_dump_stats(struct nl_object * obj,struct nl_dump_params * p)172*4dc78e53SAndroid Build Coastguard Worker static void idiag_req_dump_stats(struct nl_object *obj, struct nl_dump_params *p)
173*4dc78e53SAndroid Build Coastguard Worker {
174*4dc78e53SAndroid Build Coastguard Worker 	idiag_req_dump_details(obj, p);
175*4dc78e53SAndroid Build Coastguard Worker }
176*4dc78e53SAndroid Build Coastguard Worker 
idiagnl_req_free(struct nl_object * a)177*4dc78e53SAndroid Build Coastguard Worker static void idiagnl_req_free(struct nl_object *a)
178*4dc78e53SAndroid Build Coastguard Worker {
179*4dc78e53SAndroid Build Coastguard Worker 	struct idiagnl_req *req = (struct idiagnl_req *) a;
180*4dc78e53SAndroid Build Coastguard Worker 	if (a == NULL)
181*4dc78e53SAndroid Build Coastguard Worker 		return;
182*4dc78e53SAndroid Build Coastguard Worker 
183*4dc78e53SAndroid Build Coastguard Worker 	nl_addr_put(req->idiag_src);
184*4dc78e53SAndroid Build Coastguard Worker 	nl_addr_put(req->idiag_dst);
185*4dc78e53SAndroid Build Coastguard Worker }
186*4dc78e53SAndroid Build Coastguard Worker 
idiagnl_req_clone(struct nl_object * _dst,struct nl_object * _src)187*4dc78e53SAndroid Build Coastguard Worker static int idiagnl_req_clone(struct nl_object *_dst, struct nl_object *_src)
188*4dc78e53SAndroid Build Coastguard Worker {
189*4dc78e53SAndroid Build Coastguard Worker 	struct idiagnl_req *dst = (struct idiagnl_req *) _dst;
190*4dc78e53SAndroid Build Coastguard Worker 	struct idiagnl_req *src = (struct idiagnl_req *) _src;
191*4dc78e53SAndroid Build Coastguard Worker 
192*4dc78e53SAndroid Build Coastguard Worker 	src->idiag_src = NULL;
193*4dc78e53SAndroid Build Coastguard Worker 	src->idiag_dst = NULL;
194*4dc78e53SAndroid Build Coastguard Worker 
195*4dc78e53SAndroid Build Coastguard Worker 	if (src->idiag_src)
196*4dc78e53SAndroid Build Coastguard Worker 		if (!(dst->idiag_src = nl_addr_clone(src->idiag_src)))
197*4dc78e53SAndroid Build Coastguard Worker 			return -NLE_NOMEM;
198*4dc78e53SAndroid Build Coastguard Worker 
199*4dc78e53SAndroid Build Coastguard Worker 	if (src->idiag_dst)
200*4dc78e53SAndroid Build Coastguard Worker 		if (!(dst->idiag_dst = nl_addr_clone(src->idiag_dst)))
201*4dc78e53SAndroid Build Coastguard Worker 			return -NLE_NOMEM;
202*4dc78e53SAndroid Build Coastguard Worker 
203*4dc78e53SAndroid Build Coastguard Worker 	return 0;
204*4dc78e53SAndroid Build Coastguard Worker }
205*4dc78e53SAndroid Build Coastguard Worker 
idiagnl_req_parse(struct nlmsghdr * nlh,struct idiagnl_req ** result)206*4dc78e53SAndroid Build Coastguard Worker int idiagnl_req_parse(struct nlmsghdr *nlh, struct idiagnl_req **result)
207*4dc78e53SAndroid Build Coastguard Worker {
208*4dc78e53SAndroid Build Coastguard Worker 	struct idiagnl_req *req = NULL;
209*4dc78e53SAndroid Build Coastguard Worker 	struct inet_diag_req *raw_req = NULL;
210*4dc78e53SAndroid Build Coastguard Worker 	struct nl_addr *src = NULL, *dst = NULL;
211*4dc78e53SAndroid Build Coastguard Worker 	int err = 0;
212*4dc78e53SAndroid Build Coastguard Worker 
213*4dc78e53SAndroid Build Coastguard Worker 	req = idiagnl_req_alloc();
214*4dc78e53SAndroid Build Coastguard Worker 	if (!req)
215*4dc78e53SAndroid Build Coastguard Worker 		goto errout_nomem;
216*4dc78e53SAndroid Build Coastguard Worker 
217*4dc78e53SAndroid Build Coastguard Worker 	raw_req = nlmsg_data(nlh);
218*4dc78e53SAndroid Build Coastguard Worker 	req->idiag_family = raw_req->idiag_family;
219*4dc78e53SAndroid Build Coastguard Worker 	req->idiag_ext = raw_req->idiag_ext;
220*4dc78e53SAndroid Build Coastguard Worker 	req->idiag_states = raw_req->idiag_states;
221*4dc78e53SAndroid Build Coastguard Worker 	req->idiag_dbs = raw_req->idiag_dbs;
222*4dc78e53SAndroid Build Coastguard Worker 	req->idiag_ifindex = raw_req->id.idiag_if;
223*4dc78e53SAndroid Build Coastguard Worker 
224*4dc78e53SAndroid Build Coastguard Worker 	dst = nl_addr_build(raw_req->idiag_family, raw_req->id.idiag_dst,
225*4dc78e53SAndroid Build Coastguard Worker 			sizeof(raw_req->id.idiag_dst));
226*4dc78e53SAndroid Build Coastguard Worker 	if (!dst)
227*4dc78e53SAndroid Build Coastguard Worker 		goto errout_nomem;
228*4dc78e53SAndroid Build Coastguard Worker 
229*4dc78e53SAndroid Build Coastguard Worker 	err = idiagnl_req_set_dst(req, dst);
230*4dc78e53SAndroid Build Coastguard Worker 	if (err < 0)
231*4dc78e53SAndroid Build Coastguard Worker 		goto errout;
232*4dc78e53SAndroid Build Coastguard Worker 
233*4dc78e53SAndroid Build Coastguard Worker 	nl_addr_put(dst);
234*4dc78e53SAndroid Build Coastguard Worker 
235*4dc78e53SAndroid Build Coastguard Worker 	src = nl_addr_build(raw_req->idiag_family, raw_req->id.idiag_src,
236*4dc78e53SAndroid Build Coastguard Worker 			sizeof(raw_req->id.idiag_src));
237*4dc78e53SAndroid Build Coastguard Worker 	if (!src)
238*4dc78e53SAndroid Build Coastguard Worker 		goto errout_nomem;
239*4dc78e53SAndroid Build Coastguard Worker 
240*4dc78e53SAndroid Build Coastguard Worker 	err = idiagnl_req_set_src(req, src);
241*4dc78e53SAndroid Build Coastguard Worker 	if (err < 0)
242*4dc78e53SAndroid Build Coastguard Worker 		goto errout;
243*4dc78e53SAndroid Build Coastguard Worker 
244*4dc78e53SAndroid Build Coastguard Worker 	nl_addr_put(src);
245*4dc78e53SAndroid Build Coastguard Worker 
246*4dc78e53SAndroid Build Coastguard Worker 	*result = req;
247*4dc78e53SAndroid Build Coastguard Worker 	return 0;
248*4dc78e53SAndroid Build Coastguard Worker 
249*4dc78e53SAndroid Build Coastguard Worker errout:
250*4dc78e53SAndroid Build Coastguard Worker 	idiagnl_req_put(req);
251*4dc78e53SAndroid Build Coastguard Worker 	return err;
252*4dc78e53SAndroid Build Coastguard Worker 
253*4dc78e53SAndroid Build Coastguard Worker errout_nomem:
254*4dc78e53SAndroid Build Coastguard Worker 	err = -NLE_NOMEM;
255*4dc78e53SAndroid Build Coastguard Worker 	goto errout;
256*4dc78e53SAndroid Build Coastguard Worker }
257*4dc78e53SAndroid Build Coastguard Worker 
258*4dc78e53SAndroid Build Coastguard Worker /** @cond SKIP */
259*4dc78e53SAndroid Build Coastguard Worker struct nl_object_ops idiagnl_req_obj_ops = {
260*4dc78e53SAndroid Build Coastguard Worker 	.oo_name		  = "idiag/idiag_req",
261*4dc78e53SAndroid Build Coastguard Worker 	.oo_size		  = sizeof(struct idiagnl_req),
262*4dc78e53SAndroid Build Coastguard Worker 	.oo_free_data		  = idiagnl_req_free,
263*4dc78e53SAndroid Build Coastguard Worker 	.oo_clone		  = idiagnl_req_clone,
264*4dc78e53SAndroid Build Coastguard Worker 	.oo_dump		  = {
265*4dc78e53SAndroid Build Coastguard Worker 		[NL_DUMP_LINE]	  = idiag_req_dump_line,
266*4dc78e53SAndroid Build Coastguard Worker 		[NL_DUMP_DETAILS] = idiag_req_dump_details,
267*4dc78e53SAndroid Build Coastguard Worker 		[NL_DUMP_STATS]	  = idiag_req_dump_stats,
268*4dc78e53SAndroid Build Coastguard Worker 	},
269*4dc78e53SAndroid Build Coastguard Worker };
270*4dc78e53SAndroid Build Coastguard Worker /** @endcond */
271*4dc78e53SAndroid Build Coastguard Worker 
272*4dc78e53SAndroid Build Coastguard Worker /** @} */
273