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/hashtable.h>
11*4dc78e53SAndroid Build Coastguard Worker #include <netlink/idiag/msg.h>
12*4dc78e53SAndroid Build Coastguard Worker #include <netlink/idiag/meminfo.h>
13*4dc78e53SAndroid Build Coastguard Worker #include <netlink/idiag/vegasinfo.h>
14*4dc78e53SAndroid Build Coastguard Worker #include <netlink/idiag/idiagnl.h>
15*4dc78e53SAndroid Build Coastguard Worker
16*4dc78e53SAndroid Build Coastguard Worker #include "nl-idiag.h"
17*4dc78e53SAndroid Build Coastguard Worker #include "nl-priv-dynamic-core/nl-core.h"
18*4dc78e53SAndroid Build Coastguard Worker #include "nl-aux-core/nl-core.h"
19*4dc78e53SAndroid Build Coastguard Worker #include "nl-priv-dynamic-core/cache-api.h"
20*4dc78e53SAndroid Build Coastguard Worker
21*4dc78e53SAndroid Build Coastguard Worker /** @cond SKIP */
22*4dc78e53SAndroid Build Coastguard Worker struct idiagnl_msg {
23*4dc78e53SAndroid Build Coastguard Worker NLHDR_COMMON
24*4dc78e53SAndroid Build Coastguard Worker
25*4dc78e53SAndroid Build Coastguard Worker uint8_t idiag_family;
26*4dc78e53SAndroid Build Coastguard Worker uint8_t idiag_state;
27*4dc78e53SAndroid Build Coastguard Worker uint8_t idiag_timer;
28*4dc78e53SAndroid Build Coastguard Worker uint8_t idiag_retrans;
29*4dc78e53SAndroid Build Coastguard Worker uint16_t idiag_sport;
30*4dc78e53SAndroid Build Coastguard Worker uint16_t idiag_dport;
31*4dc78e53SAndroid Build Coastguard Worker struct nl_addr * idiag_src;
32*4dc78e53SAndroid Build Coastguard Worker struct nl_addr * idiag_dst;
33*4dc78e53SAndroid Build Coastguard Worker uint32_t idiag_ifindex;
34*4dc78e53SAndroid Build Coastguard Worker uint32_t idiag_expires;
35*4dc78e53SAndroid Build Coastguard Worker uint32_t idiag_rqueue;
36*4dc78e53SAndroid Build Coastguard Worker uint32_t idiag_wqueue;
37*4dc78e53SAndroid Build Coastguard Worker uint32_t idiag_uid;
38*4dc78e53SAndroid Build Coastguard Worker uint32_t idiag_inode;
39*4dc78e53SAndroid Build Coastguard Worker
40*4dc78e53SAndroid Build Coastguard Worker uint8_t idiag_tos;
41*4dc78e53SAndroid Build Coastguard Worker uint8_t idiag_tclass;
42*4dc78e53SAndroid Build Coastguard Worker uint8_t idiag_shutdown;
43*4dc78e53SAndroid Build Coastguard Worker char * idiag_cong;
44*4dc78e53SAndroid Build Coastguard Worker struct idiagnl_meminfo * idiag_meminfo;
45*4dc78e53SAndroid Build Coastguard Worker struct idiagnl_vegasinfo * idiag_vegasinfo;
46*4dc78e53SAndroid Build Coastguard Worker struct tcp_info idiag_tcpinfo;
47*4dc78e53SAndroid Build Coastguard Worker uint32_t idiag_skmeminfo[SK_MEMINFO_VARS];
48*4dc78e53SAndroid Build Coastguard Worker };
49*4dc78e53SAndroid Build Coastguard Worker
50*4dc78e53SAndroid Build Coastguard Worker #define IDIAGNL_ATTR_FAMILY (0x1 << 1)
51*4dc78e53SAndroid Build Coastguard Worker #define IDIAGNL_ATTR_STATE (0x1 << 2)
52*4dc78e53SAndroid Build Coastguard Worker #define IDIAGNL_ATTR_TIMER (0x1 << 3)
53*4dc78e53SAndroid Build Coastguard Worker #define IDIAGNL_ATTR_RETRANS (0x1 << 4)
54*4dc78e53SAndroid Build Coastguard Worker #define IDIAGNL_ATTR_SPORT (0x1 << 5)
55*4dc78e53SAndroid Build Coastguard Worker #define IDIAGNL_ATTR_DPORT (0x1 << 6)
56*4dc78e53SAndroid Build Coastguard Worker #define IDIAGNL_ATTR_SRC (0x1 << 7)
57*4dc78e53SAndroid Build Coastguard Worker #define IDIAGNL_ATTR_DST (0x1 << 8)
58*4dc78e53SAndroid Build Coastguard Worker #define IDIAGNL_ATTR_IFINDEX (0x1 << 9)
59*4dc78e53SAndroid Build Coastguard Worker #define IDIAGNL_ATTR_EXPIRES (0x1 << 10)
60*4dc78e53SAndroid Build Coastguard Worker #define IDIAGNL_ATTR_RQUEUE (0x1 << 11)
61*4dc78e53SAndroid Build Coastguard Worker #define IDIAGNL_ATTR_WQUEUE (0x1 << 12)
62*4dc78e53SAndroid Build Coastguard Worker #define IDIAGNL_ATTR_UID (0x1 << 13)
63*4dc78e53SAndroid Build Coastguard Worker #define IDIAGNL_ATTR_INODE (0x1 << 14)
64*4dc78e53SAndroid Build Coastguard Worker #define IDIAGNL_ATTR_TOS (0x1 << 15)
65*4dc78e53SAndroid Build Coastguard Worker #define IDIAGNL_ATTR_TCLASS (0x1 << 16)
66*4dc78e53SAndroid Build Coastguard Worker #define IDIAGNL_ATTR_SHUTDOWN (0x1 << 17)
67*4dc78e53SAndroid Build Coastguard Worker #define IDIAGNL_ATTR_CONG (0x1 << 18)
68*4dc78e53SAndroid Build Coastguard Worker #define IDIAGNL_ATTR_MEMINFO (0x1 << 19)
69*4dc78e53SAndroid Build Coastguard Worker #define IDIAGNL_ATTR_VEGASINFO (0x1 << 20)
70*4dc78e53SAndroid Build Coastguard Worker #define IDIAGNL_ATTR_TCPINFO (0x1 << 21)
71*4dc78e53SAndroid Build Coastguard Worker #define IDIAGNL_ATTR_SKMEMINFO (0x1 << 22)
72*4dc78e53SAndroid Build Coastguard Worker
73*4dc78e53SAndroid Build Coastguard Worker #define _INET_DIAG_ALL ((1<<(INET_DIAG_MAX+1))-1)
74*4dc78e53SAndroid Build Coastguard Worker /** @endcond */
75*4dc78e53SAndroid Build Coastguard Worker
76*4dc78e53SAndroid Build Coastguard Worker /**
77*4dc78e53SAndroid Build Coastguard Worker * @ingroup idiag
78*4dc78e53SAndroid Build Coastguard Worker * @defgroup idiagnl_msg Inet Diag Messages
79*4dc78e53SAndroid Build Coastguard Worker *
80*4dc78e53SAndroid Build Coastguard Worker * @details
81*4dc78e53SAndroid Build Coastguard Worker * @idiagnl_doc{idiagnl_msg, Inet Diag Message Documentation}
82*4dc78e53SAndroid Build Coastguard Worker * @{
83*4dc78e53SAndroid Build Coastguard Worker */
idiagnl_msg_alloc(void)84*4dc78e53SAndroid Build Coastguard Worker struct idiagnl_msg *idiagnl_msg_alloc(void)
85*4dc78e53SAndroid Build Coastguard Worker {
86*4dc78e53SAndroid Build Coastguard Worker return (struct idiagnl_msg *) nl_object_alloc(&idiagnl_msg_obj_ops);
87*4dc78e53SAndroid Build Coastguard Worker }
88*4dc78e53SAndroid Build Coastguard Worker
idiagnl_msg_get(struct idiagnl_msg * msg)89*4dc78e53SAndroid Build Coastguard Worker void idiagnl_msg_get(struct idiagnl_msg *msg)
90*4dc78e53SAndroid Build Coastguard Worker {
91*4dc78e53SAndroid Build Coastguard Worker nl_object_get((struct nl_object *) msg);
92*4dc78e53SAndroid Build Coastguard Worker }
93*4dc78e53SAndroid Build Coastguard Worker
idiagnl_msg_put(struct idiagnl_msg * msg)94*4dc78e53SAndroid Build Coastguard Worker void idiagnl_msg_put(struct idiagnl_msg *msg)
95*4dc78e53SAndroid Build Coastguard Worker {
96*4dc78e53SAndroid Build Coastguard Worker nl_object_put((struct nl_object *) msg);
97*4dc78e53SAndroid Build Coastguard Worker }
98*4dc78e53SAndroid Build Coastguard Worker
99*4dc78e53SAndroid Build Coastguard Worker static struct nl_cache_ops idiagnl_msg_ops;
100*4dc78e53SAndroid Build Coastguard Worker
idiagnl_msg_parser(struct nl_cache_ops * ops,struct sockaddr_nl * who,struct nlmsghdr * nlh,struct nl_parser_param * pp)101*4dc78e53SAndroid Build Coastguard Worker static int idiagnl_msg_parser(struct nl_cache_ops *ops, struct sockaddr_nl *who,
102*4dc78e53SAndroid Build Coastguard Worker struct nlmsghdr *nlh, struct nl_parser_param *pp)
103*4dc78e53SAndroid Build Coastguard Worker {
104*4dc78e53SAndroid Build Coastguard Worker struct idiagnl_msg *msg = NULL;
105*4dc78e53SAndroid Build Coastguard Worker int err = 0;
106*4dc78e53SAndroid Build Coastguard Worker
107*4dc78e53SAndroid Build Coastguard Worker if ((err = idiagnl_msg_parse(nlh, &msg)) < 0)
108*4dc78e53SAndroid Build Coastguard Worker return err;
109*4dc78e53SAndroid Build Coastguard Worker
110*4dc78e53SAndroid Build Coastguard Worker err = pp->pp_cb((struct nl_object *) msg, pp);
111*4dc78e53SAndroid Build Coastguard Worker idiagnl_msg_put(msg);
112*4dc78e53SAndroid Build Coastguard Worker
113*4dc78e53SAndroid Build Coastguard Worker return err;
114*4dc78e53SAndroid Build Coastguard Worker }
115*4dc78e53SAndroid Build Coastguard Worker
idiagnl_request_update(struct nl_cache * cache,struct nl_sock * sk)116*4dc78e53SAndroid Build Coastguard Worker static int idiagnl_request_update(struct nl_cache *cache, struct nl_sock *sk)
117*4dc78e53SAndroid Build Coastguard Worker {
118*4dc78e53SAndroid Build Coastguard Worker int family = cache->c_iarg1;
119*4dc78e53SAndroid Build Coastguard Worker int states = cache->c_iarg2;
120*4dc78e53SAndroid Build Coastguard Worker
121*4dc78e53SAndroid Build Coastguard Worker /* idiagnl_send_simple()'s "ext" argument is u16, which is too small for _INET_DIAG_ALL,
122*4dc78e53SAndroid Build Coastguard Worker * which is more than 16 bits on recent kernels.
123*4dc78e53SAndroid Build Coastguard Worker *
124*4dc78e53SAndroid Build Coastguard Worker * Actually, internally idiagnl_send_simple() sets "struct inet_diag_req"'s "idiag_ext"
125*4dc78e53SAndroid Build Coastguard Worker * field, which is only 8 bits. So, it's even worse.
126*4dc78e53SAndroid Build Coastguard Worker *
127*4dc78e53SAndroid Build Coastguard Worker * FIXME: this probably should be fixed (by adding idiagnl_send_simple2() function), but for
128*4dc78e53SAndroid Build Coastguard Worker * the moment it means we cannot request more than 0xFF.
129*4dc78e53SAndroid Build Coastguard Worker */
130*4dc78e53SAndroid Build Coastguard Worker
131*4dc78e53SAndroid Build Coastguard Worker return idiagnl_send_simple(sk, 0, family, states, (uint16_t) _INET_DIAG_ALL);
132*4dc78e53SAndroid Build Coastguard Worker }
133*4dc78e53SAndroid Build Coastguard Worker
134*4dc78e53SAndroid Build Coastguard Worker static struct nl_cache_ops idiagnl_msg_ops = {
135*4dc78e53SAndroid Build Coastguard Worker .co_name = "idiag/idiag",
136*4dc78e53SAndroid Build Coastguard Worker .co_hdrsize = sizeof(struct inet_diag_msg),
137*4dc78e53SAndroid Build Coastguard Worker .co_msgtypes = {
138*4dc78e53SAndroid Build Coastguard Worker { TCPDIAG_GETSOCK, NL_ACT_NEW, "new" },
139*4dc78e53SAndroid Build Coastguard Worker { DCCPDIAG_GETSOCK, NL_ACT_NEW, "new" },
140*4dc78e53SAndroid Build Coastguard Worker END_OF_MSGTYPES_LIST,
141*4dc78e53SAndroid Build Coastguard Worker },
142*4dc78e53SAndroid Build Coastguard Worker .co_protocol = NETLINK_INET_DIAG,
143*4dc78e53SAndroid Build Coastguard Worker .co_request_update = idiagnl_request_update,
144*4dc78e53SAndroid Build Coastguard Worker .co_msg_parser = idiagnl_msg_parser,
145*4dc78e53SAndroid Build Coastguard Worker .co_obj_ops = &idiagnl_msg_obj_ops,
146*4dc78e53SAndroid Build Coastguard Worker };
147*4dc78e53SAndroid Build Coastguard Worker
idiagnl_init(void)148*4dc78e53SAndroid Build Coastguard Worker static void _nl_init idiagnl_init(void)
149*4dc78e53SAndroid Build Coastguard Worker {
150*4dc78e53SAndroid Build Coastguard Worker nl_cache_mngt_register(&idiagnl_msg_ops);
151*4dc78e53SAndroid Build Coastguard Worker }
152*4dc78e53SAndroid Build Coastguard Worker
idiagnl_exit(void)153*4dc78e53SAndroid Build Coastguard Worker static void _nl_exit idiagnl_exit(void)
154*4dc78e53SAndroid Build Coastguard Worker {
155*4dc78e53SAndroid Build Coastguard Worker nl_cache_mngt_unregister(&idiagnl_msg_ops);
156*4dc78e53SAndroid Build Coastguard Worker }
157*4dc78e53SAndroid Build Coastguard Worker
158*4dc78e53SAndroid Build Coastguard Worker /**
159*4dc78e53SAndroid Build Coastguard Worker * @name Cache Management
160*4dc78e53SAndroid Build Coastguard Worker * @{
161*4dc78e53SAndroid Build Coastguard Worker */
162*4dc78e53SAndroid Build Coastguard Worker
163*4dc78e53SAndroid Build Coastguard Worker /**
164*4dc78e53SAndroid Build Coastguard Worker * Build an inetdiag cache to hold socket state information.
165*4dc78e53SAndroid Build Coastguard Worker * @arg sk Netlink socket
166*4dc78e53SAndroid Build Coastguard Worker * @arg family The address family to query
167*4dc78e53SAndroid Build Coastguard Worker * @arg states Socket states to query
168*4dc78e53SAndroid Build Coastguard Worker * @arg result Result pointer
169*4dc78e53SAndroid Build Coastguard Worker *
170*4dc78e53SAndroid Build Coastguard Worker * @note The caller is responsible for destroying and free the cache after using
171*4dc78e53SAndroid Build Coastguard Worker * it.
172*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success of a negative error code.
173*4dc78e53SAndroid Build Coastguard Worker */
idiagnl_msg_alloc_cache(struct nl_sock * sk,int family,int states,struct nl_cache ** result)174*4dc78e53SAndroid Build Coastguard Worker int idiagnl_msg_alloc_cache(struct nl_sock *sk, int family, int states,
175*4dc78e53SAndroid Build Coastguard Worker struct nl_cache **result)
176*4dc78e53SAndroid Build Coastguard Worker {
177*4dc78e53SAndroid Build Coastguard Worker struct nl_cache *cache = NULL;
178*4dc78e53SAndroid Build Coastguard Worker int err;
179*4dc78e53SAndroid Build Coastguard Worker
180*4dc78e53SAndroid Build Coastguard Worker if (!(cache = nl_cache_alloc(&idiagnl_msg_ops)))
181*4dc78e53SAndroid Build Coastguard Worker return -NLE_NOMEM;
182*4dc78e53SAndroid Build Coastguard Worker
183*4dc78e53SAndroid Build Coastguard Worker cache->c_iarg1 = family;
184*4dc78e53SAndroid Build Coastguard Worker cache->c_iarg2 = states;
185*4dc78e53SAndroid Build Coastguard Worker
186*4dc78e53SAndroid Build Coastguard Worker if (sk && (err = nl_cache_refill(sk, cache)) < 0) {
187*4dc78e53SAndroid Build Coastguard Worker free(cache);
188*4dc78e53SAndroid Build Coastguard Worker return err;
189*4dc78e53SAndroid Build Coastguard Worker }
190*4dc78e53SAndroid Build Coastguard Worker
191*4dc78e53SAndroid Build Coastguard Worker *result = cache;
192*4dc78e53SAndroid Build Coastguard Worker return 0;
193*4dc78e53SAndroid Build Coastguard Worker }
194*4dc78e53SAndroid Build Coastguard Worker
195*4dc78e53SAndroid Build Coastguard Worker /** @} */
196*4dc78e53SAndroid Build Coastguard Worker
197*4dc78e53SAndroid Build Coastguard Worker /**
198*4dc78e53SAndroid Build Coastguard Worker * @name Attributes
199*4dc78e53SAndroid Build Coastguard Worker * @{
200*4dc78e53SAndroid Build Coastguard Worker */
201*4dc78e53SAndroid Build Coastguard Worker
idiagnl_msg_get_family(const struct idiagnl_msg * msg)202*4dc78e53SAndroid Build Coastguard Worker uint8_t idiagnl_msg_get_family(const struct idiagnl_msg *msg)
203*4dc78e53SAndroid Build Coastguard Worker {
204*4dc78e53SAndroid Build Coastguard Worker return msg->idiag_family;
205*4dc78e53SAndroid Build Coastguard Worker }
206*4dc78e53SAndroid Build Coastguard Worker
idiagnl_msg_set_family(struct idiagnl_msg * msg,uint8_t family)207*4dc78e53SAndroid Build Coastguard Worker void idiagnl_msg_set_family(struct idiagnl_msg *msg, uint8_t family)
208*4dc78e53SAndroid Build Coastguard Worker {
209*4dc78e53SAndroid Build Coastguard Worker msg->idiag_family = family;
210*4dc78e53SAndroid Build Coastguard Worker msg->ce_mask |= IDIAGNL_ATTR_FAMILY;
211*4dc78e53SAndroid Build Coastguard Worker }
212*4dc78e53SAndroid Build Coastguard Worker
idiagnl_msg_get_state(const struct idiagnl_msg * msg)213*4dc78e53SAndroid Build Coastguard Worker uint8_t idiagnl_msg_get_state(const struct idiagnl_msg *msg)
214*4dc78e53SAndroid Build Coastguard Worker {
215*4dc78e53SAndroid Build Coastguard Worker return msg->idiag_state;
216*4dc78e53SAndroid Build Coastguard Worker }
217*4dc78e53SAndroid Build Coastguard Worker
idiagnl_msg_set_state(struct idiagnl_msg * msg,uint8_t state)218*4dc78e53SAndroid Build Coastguard Worker void idiagnl_msg_set_state(struct idiagnl_msg *msg, uint8_t state)
219*4dc78e53SAndroid Build Coastguard Worker {
220*4dc78e53SAndroid Build Coastguard Worker msg->idiag_state = state;
221*4dc78e53SAndroid Build Coastguard Worker msg->ce_mask |= IDIAGNL_ATTR_STATE;
222*4dc78e53SAndroid Build Coastguard Worker }
223*4dc78e53SAndroid Build Coastguard Worker
idiagnl_msg_get_timer(const struct idiagnl_msg * msg)224*4dc78e53SAndroid Build Coastguard Worker uint8_t idiagnl_msg_get_timer(const struct idiagnl_msg *msg)
225*4dc78e53SAndroid Build Coastguard Worker {
226*4dc78e53SAndroid Build Coastguard Worker return msg->idiag_timer;
227*4dc78e53SAndroid Build Coastguard Worker }
228*4dc78e53SAndroid Build Coastguard Worker
idiagnl_msg_set_timer(struct idiagnl_msg * msg,uint8_t timer)229*4dc78e53SAndroid Build Coastguard Worker void idiagnl_msg_set_timer(struct idiagnl_msg *msg, uint8_t timer)
230*4dc78e53SAndroid Build Coastguard Worker {
231*4dc78e53SAndroid Build Coastguard Worker msg->idiag_timer = timer;
232*4dc78e53SAndroid Build Coastguard Worker msg->ce_mask |= IDIAGNL_ATTR_TIMER;
233*4dc78e53SAndroid Build Coastguard Worker }
234*4dc78e53SAndroid Build Coastguard Worker
idiagnl_msg_get_retrans(const struct idiagnl_msg * msg)235*4dc78e53SAndroid Build Coastguard Worker uint8_t idiagnl_msg_get_retrans(const struct idiagnl_msg *msg)
236*4dc78e53SAndroid Build Coastguard Worker {
237*4dc78e53SAndroid Build Coastguard Worker return msg->idiag_retrans;
238*4dc78e53SAndroid Build Coastguard Worker }
239*4dc78e53SAndroid Build Coastguard Worker
idiagnl_msg_set_retrans(struct idiagnl_msg * msg,uint8_t retrans)240*4dc78e53SAndroid Build Coastguard Worker void idiagnl_msg_set_retrans(struct idiagnl_msg *msg, uint8_t retrans)
241*4dc78e53SAndroid Build Coastguard Worker {
242*4dc78e53SAndroid Build Coastguard Worker msg->idiag_retrans = retrans;
243*4dc78e53SAndroid Build Coastguard Worker msg->ce_mask |= IDIAGNL_ATTR_RETRANS;
244*4dc78e53SAndroid Build Coastguard Worker }
245*4dc78e53SAndroid Build Coastguard Worker
idiagnl_msg_get_sport(struct idiagnl_msg * msg)246*4dc78e53SAndroid Build Coastguard Worker uint16_t idiagnl_msg_get_sport(struct idiagnl_msg *msg)
247*4dc78e53SAndroid Build Coastguard Worker {
248*4dc78e53SAndroid Build Coastguard Worker return msg->idiag_sport;
249*4dc78e53SAndroid Build Coastguard Worker }
250*4dc78e53SAndroid Build Coastguard Worker
idiagnl_msg_set_sport(struct idiagnl_msg * msg,uint16_t port)251*4dc78e53SAndroid Build Coastguard Worker void idiagnl_msg_set_sport(struct idiagnl_msg *msg, uint16_t port)
252*4dc78e53SAndroid Build Coastguard Worker {
253*4dc78e53SAndroid Build Coastguard Worker msg->idiag_sport = port;
254*4dc78e53SAndroid Build Coastguard Worker msg->ce_mask |= IDIAGNL_ATTR_SPORT;
255*4dc78e53SAndroid Build Coastguard Worker }
256*4dc78e53SAndroid Build Coastguard Worker
idiagnl_msg_get_dport(struct idiagnl_msg * msg)257*4dc78e53SAndroid Build Coastguard Worker uint16_t idiagnl_msg_get_dport(struct idiagnl_msg *msg)
258*4dc78e53SAndroid Build Coastguard Worker {
259*4dc78e53SAndroid Build Coastguard Worker return msg->idiag_dport;
260*4dc78e53SAndroid Build Coastguard Worker }
261*4dc78e53SAndroid Build Coastguard Worker
idiagnl_msg_set_dport(struct idiagnl_msg * msg,uint16_t port)262*4dc78e53SAndroid Build Coastguard Worker void idiagnl_msg_set_dport(struct idiagnl_msg *msg, uint16_t port)
263*4dc78e53SAndroid Build Coastguard Worker {
264*4dc78e53SAndroid Build Coastguard Worker msg->idiag_dport = port;
265*4dc78e53SAndroid Build Coastguard Worker msg->ce_mask |= IDIAGNL_ATTR_DPORT;
266*4dc78e53SAndroid Build Coastguard Worker }
267*4dc78e53SAndroid Build Coastguard Worker
idiagnl_msg_get_src(const struct idiagnl_msg * msg)268*4dc78e53SAndroid Build Coastguard Worker struct nl_addr *idiagnl_msg_get_src(const struct idiagnl_msg *msg)
269*4dc78e53SAndroid Build Coastguard Worker {
270*4dc78e53SAndroid Build Coastguard Worker return msg->idiag_src;
271*4dc78e53SAndroid Build Coastguard Worker }
272*4dc78e53SAndroid Build Coastguard Worker
idiagnl_msg_set_src(struct idiagnl_msg * msg,struct nl_addr * addr)273*4dc78e53SAndroid Build Coastguard Worker int idiagnl_msg_set_src(struct idiagnl_msg *msg, struct nl_addr *addr)
274*4dc78e53SAndroid Build Coastguard Worker {
275*4dc78e53SAndroid Build Coastguard Worker if (msg->idiag_src)
276*4dc78e53SAndroid Build Coastguard Worker nl_addr_put(msg->idiag_src);
277*4dc78e53SAndroid Build Coastguard Worker
278*4dc78e53SAndroid Build Coastguard Worker nl_addr_get(addr);
279*4dc78e53SAndroid Build Coastguard Worker msg->idiag_src = addr;
280*4dc78e53SAndroid Build Coastguard Worker msg->ce_mask |= IDIAGNL_ATTR_SRC;
281*4dc78e53SAndroid Build Coastguard Worker
282*4dc78e53SAndroid Build Coastguard Worker return 0;
283*4dc78e53SAndroid Build Coastguard Worker }
284*4dc78e53SAndroid Build Coastguard Worker
idiagnl_msg_get_dst(const struct idiagnl_msg * msg)285*4dc78e53SAndroid Build Coastguard Worker struct nl_addr *idiagnl_msg_get_dst(const struct idiagnl_msg *msg)
286*4dc78e53SAndroid Build Coastguard Worker {
287*4dc78e53SAndroid Build Coastguard Worker return msg->idiag_dst;
288*4dc78e53SAndroid Build Coastguard Worker }
289*4dc78e53SAndroid Build Coastguard Worker
idiagnl_msg_set_dst(struct idiagnl_msg * msg,struct nl_addr * addr)290*4dc78e53SAndroid Build Coastguard Worker int idiagnl_msg_set_dst(struct idiagnl_msg *msg, struct nl_addr *addr)
291*4dc78e53SAndroid Build Coastguard Worker {
292*4dc78e53SAndroid Build Coastguard Worker if (msg->idiag_dst)
293*4dc78e53SAndroid Build Coastguard Worker nl_addr_put(msg->idiag_dst);
294*4dc78e53SAndroid Build Coastguard Worker
295*4dc78e53SAndroid Build Coastguard Worker nl_addr_get(addr);
296*4dc78e53SAndroid Build Coastguard Worker msg->idiag_dst = addr;
297*4dc78e53SAndroid Build Coastguard Worker msg->ce_mask |= IDIAGNL_ATTR_DST;
298*4dc78e53SAndroid Build Coastguard Worker
299*4dc78e53SAndroid Build Coastguard Worker return 0;
300*4dc78e53SAndroid Build Coastguard Worker }
301*4dc78e53SAndroid Build Coastguard Worker
idiagnl_msg_get_ifindex(const struct idiagnl_msg * msg)302*4dc78e53SAndroid Build Coastguard Worker uint32_t idiagnl_msg_get_ifindex(const struct idiagnl_msg *msg)
303*4dc78e53SAndroid Build Coastguard Worker {
304*4dc78e53SAndroid Build Coastguard Worker return msg->idiag_ifindex;
305*4dc78e53SAndroid Build Coastguard Worker }
306*4dc78e53SAndroid Build Coastguard Worker
idiagnl_msg_set_ifindex(struct idiagnl_msg * msg,uint32_t ifindex)307*4dc78e53SAndroid Build Coastguard Worker void idiagnl_msg_set_ifindex(struct idiagnl_msg *msg, uint32_t ifindex)
308*4dc78e53SAndroid Build Coastguard Worker {
309*4dc78e53SAndroid Build Coastguard Worker msg->idiag_ifindex = ifindex;
310*4dc78e53SAndroid Build Coastguard Worker msg->ce_mask |= IDIAGNL_ATTR_IFINDEX;
311*4dc78e53SAndroid Build Coastguard Worker }
312*4dc78e53SAndroid Build Coastguard Worker
idiagnl_msg_get_expires(const struct idiagnl_msg * msg)313*4dc78e53SAndroid Build Coastguard Worker uint32_t idiagnl_msg_get_expires(const struct idiagnl_msg *msg)
314*4dc78e53SAndroid Build Coastguard Worker {
315*4dc78e53SAndroid Build Coastguard Worker return msg->idiag_expires;
316*4dc78e53SAndroid Build Coastguard Worker }
317*4dc78e53SAndroid Build Coastguard Worker
idiagnl_msg_set_expires(struct idiagnl_msg * msg,uint32_t expires)318*4dc78e53SAndroid Build Coastguard Worker void idiagnl_msg_set_expires(struct idiagnl_msg *msg, uint32_t expires)
319*4dc78e53SAndroid Build Coastguard Worker {
320*4dc78e53SAndroid Build Coastguard Worker msg->idiag_expires = expires;
321*4dc78e53SAndroid Build Coastguard Worker msg->ce_mask |= IDIAGNL_ATTR_EXPIRES;
322*4dc78e53SAndroid Build Coastguard Worker }
323*4dc78e53SAndroid Build Coastguard Worker
idiagnl_msg_get_rqueue(const struct idiagnl_msg * msg)324*4dc78e53SAndroid Build Coastguard Worker uint32_t idiagnl_msg_get_rqueue(const struct idiagnl_msg *msg)
325*4dc78e53SAndroid Build Coastguard Worker {
326*4dc78e53SAndroid Build Coastguard Worker return msg->idiag_rqueue;
327*4dc78e53SAndroid Build Coastguard Worker }
328*4dc78e53SAndroid Build Coastguard Worker
idiagnl_msg_set_rqueue(struct idiagnl_msg * msg,uint32_t rqueue)329*4dc78e53SAndroid Build Coastguard Worker void idiagnl_msg_set_rqueue(struct idiagnl_msg *msg, uint32_t rqueue)
330*4dc78e53SAndroid Build Coastguard Worker {
331*4dc78e53SAndroid Build Coastguard Worker msg->idiag_rqueue = rqueue;
332*4dc78e53SAndroid Build Coastguard Worker msg->ce_mask |= IDIAGNL_ATTR_RQUEUE;
333*4dc78e53SAndroid Build Coastguard Worker }
334*4dc78e53SAndroid Build Coastguard Worker
idiagnl_msg_get_wqueue(const struct idiagnl_msg * msg)335*4dc78e53SAndroid Build Coastguard Worker uint32_t idiagnl_msg_get_wqueue(const struct idiagnl_msg *msg)
336*4dc78e53SAndroid Build Coastguard Worker {
337*4dc78e53SAndroid Build Coastguard Worker return msg->idiag_wqueue;
338*4dc78e53SAndroid Build Coastguard Worker }
339*4dc78e53SAndroid Build Coastguard Worker
idiagnl_msg_set_wqueue(struct idiagnl_msg * msg,uint32_t wqueue)340*4dc78e53SAndroid Build Coastguard Worker void idiagnl_msg_set_wqueue(struct idiagnl_msg *msg, uint32_t wqueue)
341*4dc78e53SAndroid Build Coastguard Worker {
342*4dc78e53SAndroid Build Coastguard Worker msg->idiag_wqueue = wqueue;
343*4dc78e53SAndroid Build Coastguard Worker msg->ce_mask |= IDIAGNL_ATTR_WQUEUE;
344*4dc78e53SAndroid Build Coastguard Worker }
345*4dc78e53SAndroid Build Coastguard Worker
idiagnl_msg_get_uid(const struct idiagnl_msg * msg)346*4dc78e53SAndroid Build Coastguard Worker uint32_t idiagnl_msg_get_uid(const struct idiagnl_msg *msg)
347*4dc78e53SAndroid Build Coastguard Worker {
348*4dc78e53SAndroid Build Coastguard Worker return msg->idiag_uid;
349*4dc78e53SAndroid Build Coastguard Worker }
350*4dc78e53SAndroid Build Coastguard Worker
idiagnl_msg_set_uid(struct idiagnl_msg * msg,uint32_t uid)351*4dc78e53SAndroid Build Coastguard Worker void idiagnl_msg_set_uid(struct idiagnl_msg *msg, uint32_t uid)
352*4dc78e53SAndroid Build Coastguard Worker {
353*4dc78e53SAndroid Build Coastguard Worker msg->idiag_uid = uid;
354*4dc78e53SAndroid Build Coastguard Worker msg->ce_mask |= IDIAGNL_ATTR_UID;
355*4dc78e53SAndroid Build Coastguard Worker }
356*4dc78e53SAndroid Build Coastguard Worker
idiagnl_msg_get_inode(const struct idiagnl_msg * msg)357*4dc78e53SAndroid Build Coastguard Worker uint32_t idiagnl_msg_get_inode(const struct idiagnl_msg *msg)
358*4dc78e53SAndroid Build Coastguard Worker {
359*4dc78e53SAndroid Build Coastguard Worker return msg->idiag_inode;
360*4dc78e53SAndroid Build Coastguard Worker }
361*4dc78e53SAndroid Build Coastguard Worker
idiagnl_msg_set_inode(struct idiagnl_msg * msg,uint32_t inode)362*4dc78e53SAndroid Build Coastguard Worker void idiagnl_msg_set_inode(struct idiagnl_msg *msg, uint32_t inode)
363*4dc78e53SAndroid Build Coastguard Worker {
364*4dc78e53SAndroid Build Coastguard Worker msg->idiag_inode = inode;
365*4dc78e53SAndroid Build Coastguard Worker msg->ce_mask |= IDIAGNL_ATTR_INODE;
366*4dc78e53SAndroid Build Coastguard Worker }
367*4dc78e53SAndroid Build Coastguard Worker
idiagnl_msg_get_tos(const struct idiagnl_msg * msg)368*4dc78e53SAndroid Build Coastguard Worker uint8_t idiagnl_msg_get_tos(const struct idiagnl_msg *msg)
369*4dc78e53SAndroid Build Coastguard Worker {
370*4dc78e53SAndroid Build Coastguard Worker return msg->idiag_tos;
371*4dc78e53SAndroid Build Coastguard Worker }
372*4dc78e53SAndroid Build Coastguard Worker
idiagnl_msg_set_tos(struct idiagnl_msg * msg,uint8_t tos)373*4dc78e53SAndroid Build Coastguard Worker void idiagnl_msg_set_tos(struct idiagnl_msg *msg, uint8_t tos)
374*4dc78e53SAndroid Build Coastguard Worker {
375*4dc78e53SAndroid Build Coastguard Worker msg->idiag_tos = tos;
376*4dc78e53SAndroid Build Coastguard Worker msg->ce_mask |= IDIAGNL_ATTR_TOS;
377*4dc78e53SAndroid Build Coastguard Worker }
378*4dc78e53SAndroid Build Coastguard Worker
idiagnl_msg_get_tclass(const struct idiagnl_msg * msg)379*4dc78e53SAndroid Build Coastguard Worker uint8_t idiagnl_msg_get_tclass(const struct idiagnl_msg *msg)
380*4dc78e53SAndroid Build Coastguard Worker {
381*4dc78e53SAndroid Build Coastguard Worker return msg->idiag_tclass;
382*4dc78e53SAndroid Build Coastguard Worker }
383*4dc78e53SAndroid Build Coastguard Worker
idiagnl_msg_set_tclass(struct idiagnl_msg * msg,uint8_t tclass)384*4dc78e53SAndroid Build Coastguard Worker void idiagnl_msg_set_tclass(struct idiagnl_msg *msg, uint8_t tclass)
385*4dc78e53SAndroid Build Coastguard Worker {
386*4dc78e53SAndroid Build Coastguard Worker msg->idiag_tclass = tclass;
387*4dc78e53SAndroid Build Coastguard Worker msg->ce_mask |= IDIAGNL_ATTR_TCLASS;
388*4dc78e53SAndroid Build Coastguard Worker }
389*4dc78e53SAndroid Build Coastguard Worker
idiagnl_msg_get_shutdown(const struct idiagnl_msg * msg)390*4dc78e53SAndroid Build Coastguard Worker uint8_t idiagnl_msg_get_shutdown(const struct idiagnl_msg *msg)
391*4dc78e53SAndroid Build Coastguard Worker {
392*4dc78e53SAndroid Build Coastguard Worker return msg->idiag_shutdown;
393*4dc78e53SAndroid Build Coastguard Worker }
394*4dc78e53SAndroid Build Coastguard Worker
idiagnl_msg_set_shutdown(struct idiagnl_msg * msg,uint8_t shutdown)395*4dc78e53SAndroid Build Coastguard Worker void idiagnl_msg_set_shutdown(struct idiagnl_msg *msg, uint8_t shutdown)
396*4dc78e53SAndroid Build Coastguard Worker {
397*4dc78e53SAndroid Build Coastguard Worker msg->idiag_shutdown = shutdown;
398*4dc78e53SAndroid Build Coastguard Worker msg->ce_mask |= IDIAGNL_ATTR_SHUTDOWN;
399*4dc78e53SAndroid Build Coastguard Worker }
400*4dc78e53SAndroid Build Coastguard Worker
idiagnl_msg_get_cong(const struct idiagnl_msg * msg)401*4dc78e53SAndroid Build Coastguard Worker char *idiagnl_msg_get_cong(const struct idiagnl_msg *msg)
402*4dc78e53SAndroid Build Coastguard Worker {
403*4dc78e53SAndroid Build Coastguard Worker return msg->idiag_cong;
404*4dc78e53SAndroid Build Coastguard Worker }
405*4dc78e53SAndroid Build Coastguard Worker
idiagnl_msg_set_cong(struct idiagnl_msg * msg,char * cong)406*4dc78e53SAndroid Build Coastguard Worker void idiagnl_msg_set_cong(struct idiagnl_msg *msg, char *cong)
407*4dc78e53SAndroid Build Coastguard Worker {
408*4dc78e53SAndroid Build Coastguard Worker free (msg->idiag_cong);
409*4dc78e53SAndroid Build Coastguard Worker msg->idiag_cong = strdup(cong);
410*4dc78e53SAndroid Build Coastguard Worker msg->ce_mask |= IDIAGNL_ATTR_CONG;
411*4dc78e53SAndroid Build Coastguard Worker }
412*4dc78e53SAndroid Build Coastguard Worker
idiagnl_msg_get_meminfo(const struct idiagnl_msg * msg)413*4dc78e53SAndroid Build Coastguard Worker struct idiagnl_meminfo *idiagnl_msg_get_meminfo(const struct idiagnl_msg *msg)
414*4dc78e53SAndroid Build Coastguard Worker {
415*4dc78e53SAndroid Build Coastguard Worker return msg->idiag_meminfo;
416*4dc78e53SAndroid Build Coastguard Worker }
417*4dc78e53SAndroid Build Coastguard Worker
idiagnl_msg_set_meminfo(struct idiagnl_msg * msg,struct idiagnl_meminfo * minfo)418*4dc78e53SAndroid Build Coastguard Worker void idiagnl_msg_set_meminfo(struct idiagnl_msg *msg, struct idiagnl_meminfo *minfo)
419*4dc78e53SAndroid Build Coastguard Worker {
420*4dc78e53SAndroid Build Coastguard Worker if (msg->idiag_meminfo)
421*4dc78e53SAndroid Build Coastguard Worker idiagnl_meminfo_put(msg->idiag_meminfo);
422*4dc78e53SAndroid Build Coastguard Worker
423*4dc78e53SAndroid Build Coastguard Worker idiagnl_meminfo_get(minfo);
424*4dc78e53SAndroid Build Coastguard Worker msg->idiag_meminfo = minfo;
425*4dc78e53SAndroid Build Coastguard Worker msg->ce_mask |= IDIAGNL_ATTR_MEMINFO;
426*4dc78e53SAndroid Build Coastguard Worker }
427*4dc78e53SAndroid Build Coastguard Worker
idiagnl_msg_get_vegasinfo(const struct idiagnl_msg * msg)428*4dc78e53SAndroid Build Coastguard Worker struct idiagnl_vegasinfo *idiagnl_msg_get_vegasinfo(const struct idiagnl_msg *msg)
429*4dc78e53SAndroid Build Coastguard Worker {
430*4dc78e53SAndroid Build Coastguard Worker return msg->idiag_vegasinfo;
431*4dc78e53SAndroid Build Coastguard Worker }
432*4dc78e53SAndroid Build Coastguard Worker
idiagnl_msg_set_vegasinfo(struct idiagnl_msg * msg,struct idiagnl_vegasinfo * vinfo)433*4dc78e53SAndroid Build Coastguard Worker void idiagnl_msg_set_vegasinfo(struct idiagnl_msg *msg, struct idiagnl_vegasinfo *vinfo)
434*4dc78e53SAndroid Build Coastguard Worker {
435*4dc78e53SAndroid Build Coastguard Worker if (msg->idiag_vegasinfo)
436*4dc78e53SAndroid Build Coastguard Worker idiagnl_vegasinfo_put(msg->idiag_vegasinfo);
437*4dc78e53SAndroid Build Coastguard Worker
438*4dc78e53SAndroid Build Coastguard Worker idiagnl_vegasinfo_get(vinfo);
439*4dc78e53SAndroid Build Coastguard Worker msg->idiag_vegasinfo = vinfo;
440*4dc78e53SAndroid Build Coastguard Worker msg->ce_mask |= IDIAGNL_ATTR_VEGASINFO;
441*4dc78e53SAndroid Build Coastguard Worker }
442*4dc78e53SAndroid Build Coastguard Worker
idiagnl_msg_get_tcpinfo(const struct idiagnl_msg * msg)443*4dc78e53SAndroid Build Coastguard Worker struct tcp_info idiagnl_msg_get_tcpinfo(const struct idiagnl_msg *msg)
444*4dc78e53SAndroid Build Coastguard Worker {
445*4dc78e53SAndroid Build Coastguard Worker return msg->idiag_tcpinfo;
446*4dc78e53SAndroid Build Coastguard Worker }
447*4dc78e53SAndroid Build Coastguard Worker
idiagnl_msg_set_tcpinfo(struct idiagnl_msg * msg,struct tcp_info * tinfo)448*4dc78e53SAndroid Build Coastguard Worker void idiagnl_msg_set_tcpinfo(struct idiagnl_msg *msg, struct tcp_info *tinfo)
449*4dc78e53SAndroid Build Coastguard Worker {
450*4dc78e53SAndroid Build Coastguard Worker memcpy(&msg->idiag_tcpinfo, tinfo, sizeof(struct tcp_info));
451*4dc78e53SAndroid Build Coastguard Worker msg->ce_mask |= IDIAGNL_ATTR_TCPINFO;
452*4dc78e53SAndroid Build Coastguard Worker }
453*4dc78e53SAndroid Build Coastguard Worker
454*4dc78e53SAndroid Build Coastguard Worker /** @} */
455*4dc78e53SAndroid Build Coastguard Worker
idiag_msg_dump_line(struct nl_object * a,struct nl_dump_params * p)456*4dc78e53SAndroid Build Coastguard Worker static void idiag_msg_dump_line(struct nl_object *a, struct nl_dump_params *p)
457*4dc78e53SAndroid Build Coastguard Worker {
458*4dc78e53SAndroid Build Coastguard Worker struct idiagnl_msg *msg = (struct idiagnl_msg *) a;
459*4dc78e53SAndroid Build Coastguard Worker char buf[64] = { 0 };
460*4dc78e53SAndroid Build Coastguard Worker
461*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, "family: %s ", nl_af2str(msg->idiag_family, buf, sizeof(buf)));
462*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "src: %s:%d ", nl_addr2str(msg->idiag_src, buf, sizeof(buf)),
463*4dc78e53SAndroid Build Coastguard Worker ntohs(msg->idiag_sport));
464*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "dst: %s:%d ", nl_addr2str(msg->idiag_dst, buf, sizeof(buf)),
465*4dc78e53SAndroid Build Coastguard Worker ntohs(msg->idiag_dport));
466*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "iif: %d ", msg->idiag_ifindex);
467*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "\n");
468*4dc78e53SAndroid Build Coastguard Worker }
469*4dc78e53SAndroid Build Coastguard Worker
idiag_msg_dump_details(struct nl_object * a,struct nl_dump_params * p)470*4dc78e53SAndroid Build Coastguard Worker static void idiag_msg_dump_details(struct nl_object *a, struct nl_dump_params *p)
471*4dc78e53SAndroid Build Coastguard Worker {
472*4dc78e53SAndroid Build Coastguard Worker struct idiagnl_msg *msg = (struct idiagnl_msg *) a;
473*4dc78e53SAndroid Build Coastguard Worker char buf[64], buf2[64];
474*4dc78e53SAndroid Build Coastguard Worker
475*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "\nfamily: %s\n", nl_af2str(msg->idiag_family, buf, sizeof(buf)));
476*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "state: %s\n",
477*4dc78e53SAndroid Build Coastguard Worker idiagnl_state2str(msg->idiag_state, buf, sizeof(buf)));
478*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "timer (%s, %s, retransmits: %d)\n",
479*4dc78e53SAndroid Build Coastguard Worker idiagnl_timer2str(msg->idiag_timer, buf, sizeof(buf)),
480*4dc78e53SAndroid Build Coastguard Worker nl_msec2str(msg->idiag_expires, buf2, sizeof(buf2)),
481*4dc78e53SAndroid Build Coastguard Worker msg->idiag_retrans);
482*4dc78e53SAndroid Build Coastguard Worker
483*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "source: %s:%d\n", nl_addr2str(msg->idiag_src, buf, sizeof(buf)),
484*4dc78e53SAndroid Build Coastguard Worker ntohs(msg->idiag_sport));
485*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "destination: %s:%d\n", nl_addr2str(msg->idiag_dst, buf, sizeof(buf)),
486*4dc78e53SAndroid Build Coastguard Worker ntohs(msg->idiag_dport));
487*4dc78e53SAndroid Build Coastguard Worker
488*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "ifindex: %d\n", msg->idiag_ifindex);
489*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "rqueue: %-6d wqueue: %-6d\n", msg->idiag_rqueue, msg->idiag_wqueue);
490*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "uid %d\n", msg->idiag_uid);
491*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "inode %d\n", msg->idiag_inode);
492*4dc78e53SAndroid Build Coastguard Worker if (msg->idiag_shutdown) {
493*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "socket shutdown: %s\n",
494*4dc78e53SAndroid Build Coastguard Worker idiagnl_shutdown2str(msg->idiag_shutdown,
495*4dc78e53SAndroid Build Coastguard Worker buf, sizeof(buf)));
496*4dc78e53SAndroid Build Coastguard Worker }
497*4dc78e53SAndroid Build Coastguard Worker
498*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "tos: 0x%x\n", msg->idiag_tos);
499*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "traffic class: %d\n", msg->idiag_tclass);
500*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "congestion algorithm: %s\n", msg->idiag_cong ? msg->idiag_cong : "");
501*4dc78e53SAndroid Build Coastguard Worker }
502*4dc78e53SAndroid Build Coastguard Worker
idiag_msg_dump_stats(struct nl_object * obj,struct nl_dump_params * p)503*4dc78e53SAndroid Build Coastguard Worker static void idiag_msg_dump_stats(struct nl_object *obj, struct nl_dump_params *p)
504*4dc78e53SAndroid Build Coastguard Worker {
505*4dc78e53SAndroid Build Coastguard Worker struct idiagnl_msg *msg = (struct idiagnl_msg *) obj;
506*4dc78e53SAndroid Build Coastguard Worker char buf[64];
507*4dc78e53SAndroid Build Coastguard Worker
508*4dc78e53SAndroid Build Coastguard Worker idiag_msg_dump_details(obj, p);
509*4dc78e53SAndroid Build Coastguard Worker
510*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "tcp info: [\n");
511*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "\tsocket state: %s\n",
512*4dc78e53SAndroid Build Coastguard Worker idiagnl_state2str(msg->idiag_tcpinfo.tcpi_state,
513*4dc78e53SAndroid Build Coastguard Worker buf, sizeof(buf)));
514*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "\ttcp state: %s\n",
515*4dc78e53SAndroid Build Coastguard Worker idiagnl_tcpstate2str(msg->idiag_tcpinfo.tcpi_ca_state,
516*4dc78e53SAndroid Build Coastguard Worker buf, sizeof(buf)));
517*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "\tretransmits: %d\n",
518*4dc78e53SAndroid Build Coastguard Worker msg->idiag_tcpinfo.tcpi_retransmits);
519*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "\tprobes: %d\n",
520*4dc78e53SAndroid Build Coastguard Worker msg->idiag_tcpinfo.tcpi_probes);
521*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "\tbackoff: %d\n",
522*4dc78e53SAndroid Build Coastguard Worker msg->idiag_tcpinfo.tcpi_backoff);
523*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "\toptions: %s\n",
524*4dc78e53SAndroid Build Coastguard Worker idiagnl_tcpopts2str(msg->idiag_tcpinfo.tcpi_options,
525*4dc78e53SAndroid Build Coastguard Worker buf, sizeof(buf)));
526*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "\tsnd_wscale: %d\n", msg->idiag_tcpinfo.tcpi_snd_wscale);
527*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "\trcv_wscale: %d\n", msg->idiag_tcpinfo.tcpi_rcv_wscale);
528*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "\trto: %d\n", msg->idiag_tcpinfo.tcpi_rto);
529*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "\tato: %d\n", msg->idiag_tcpinfo.tcpi_ato);
530*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "\tsnd_mss: %s\n", nl_size2str(msg->idiag_tcpinfo.tcpi_snd_mss,
531*4dc78e53SAndroid Build Coastguard Worker buf, sizeof(buf)));
532*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "\trcv_mss: %s\n", nl_size2str(msg->idiag_tcpinfo.tcpi_rcv_mss,
533*4dc78e53SAndroid Build Coastguard Worker buf, sizeof(buf)));
534*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "\tunacked: %d\n", msg->idiag_tcpinfo.tcpi_unacked);
535*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "\tsacked: %d\n", msg->idiag_tcpinfo.tcpi_sacked);
536*4dc78e53SAndroid Build Coastguard Worker
537*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "\tlost: %d\n", msg->idiag_tcpinfo.tcpi_lost);
538*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "\tretransmit segments: %d\n",
539*4dc78e53SAndroid Build Coastguard Worker msg->idiag_tcpinfo.tcpi_retrans);
540*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "\tfackets: %d\n",
541*4dc78e53SAndroid Build Coastguard Worker msg->idiag_tcpinfo.tcpi_fackets);
542*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "\tlast data sent: %s\n",
543*4dc78e53SAndroid Build Coastguard Worker nl_msec2str(msg->idiag_tcpinfo.tcpi_last_data_sent, buf,
544*4dc78e53SAndroid Build Coastguard Worker sizeof(buf)));
545*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "\tlast ack sent: %s\n",
546*4dc78e53SAndroid Build Coastguard Worker nl_msec2str(msg->idiag_tcpinfo.tcpi_last_ack_sent, buf, sizeof(buf)));
547*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "\tlast data recv: %s\n",
548*4dc78e53SAndroid Build Coastguard Worker nl_msec2str(msg->idiag_tcpinfo.tcpi_last_data_recv, buf,
549*4dc78e53SAndroid Build Coastguard Worker sizeof(buf)));
550*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "\tlast ack recv: %s\n",
551*4dc78e53SAndroid Build Coastguard Worker nl_msec2str(msg->idiag_tcpinfo.tcpi_last_ack_recv, buf,
552*4dc78e53SAndroid Build Coastguard Worker sizeof(buf)));
553*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "\tpath mtu: %s\n",
554*4dc78e53SAndroid Build Coastguard Worker nl_size2str(msg->idiag_tcpinfo.tcpi_pmtu, buf,
555*4dc78e53SAndroid Build Coastguard Worker sizeof(buf)));
556*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "\trcv ss threshold: %d\n",
557*4dc78e53SAndroid Build Coastguard Worker msg->idiag_tcpinfo.tcpi_rcv_ssthresh);
558*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "\tsmoothed round trip time: %d\n",
559*4dc78e53SAndroid Build Coastguard Worker msg->idiag_tcpinfo.tcpi_rtt);
560*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "\tround trip time variation: %d\n",
561*4dc78e53SAndroid Build Coastguard Worker msg->idiag_tcpinfo.tcpi_rttvar);
562*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "\tsnd ss threshold: %s\n",
563*4dc78e53SAndroid Build Coastguard Worker nl_size2str(msg->idiag_tcpinfo.tcpi_snd_ssthresh, buf,
564*4dc78e53SAndroid Build Coastguard Worker sizeof(buf)));
565*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "\tsend congestion window: %d\n",
566*4dc78e53SAndroid Build Coastguard Worker msg->idiag_tcpinfo.tcpi_snd_cwnd);
567*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "\tadvertised mss: %s\n",
568*4dc78e53SAndroid Build Coastguard Worker nl_size2str(msg->idiag_tcpinfo.tcpi_advmss, buf,
569*4dc78e53SAndroid Build Coastguard Worker sizeof(buf)));
570*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "\treordering: %d\n",
571*4dc78e53SAndroid Build Coastguard Worker msg->idiag_tcpinfo.tcpi_reordering);
572*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "\trcv rround trip time: %d\n",
573*4dc78e53SAndroid Build Coastguard Worker msg->idiag_tcpinfo.tcpi_rcv_rtt);
574*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "\treceive queue space: %s\n",
575*4dc78e53SAndroid Build Coastguard Worker nl_size2str(msg->idiag_tcpinfo.tcpi_rcv_space, buf,
576*4dc78e53SAndroid Build Coastguard Worker sizeof(buf)));
577*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "\ttotal retransmits: %d\n",
578*4dc78e53SAndroid Build Coastguard Worker msg->idiag_tcpinfo.tcpi_total_retrans);
579*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "]\n");
580*4dc78e53SAndroid Build Coastguard Worker
581*4dc78e53SAndroid Build Coastguard Worker if (msg->idiag_meminfo) {
582*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "meminfo: [\n");
583*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "\trmem: %s\n",
584*4dc78e53SAndroid Build Coastguard Worker nl_size2str(msg->idiag_meminfo->idiag_rmem,
585*4dc78e53SAndroid Build Coastguard Worker buf,
586*4dc78e53SAndroid Build Coastguard Worker sizeof(buf)));
587*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "\twmem: %s\n",
588*4dc78e53SAndroid Build Coastguard Worker nl_size2str(msg->idiag_meminfo->idiag_wmem,
589*4dc78e53SAndroid Build Coastguard Worker buf,
590*4dc78e53SAndroid Build Coastguard Worker sizeof(buf)));
591*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "\tfmem: %s\n",
592*4dc78e53SAndroid Build Coastguard Worker nl_size2str(msg->idiag_meminfo->idiag_fmem,
593*4dc78e53SAndroid Build Coastguard Worker buf,
594*4dc78e53SAndroid Build Coastguard Worker sizeof(buf)));
595*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "\ttmem: %s\n",
596*4dc78e53SAndroid Build Coastguard Worker nl_size2str(msg->idiag_meminfo->idiag_tmem,
597*4dc78e53SAndroid Build Coastguard Worker buf,
598*4dc78e53SAndroid Build Coastguard Worker sizeof(buf)));
599*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "]\n");
600*4dc78e53SAndroid Build Coastguard Worker }
601*4dc78e53SAndroid Build Coastguard Worker
602*4dc78e53SAndroid Build Coastguard Worker if (msg->idiag_vegasinfo) {
603*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "vegasinfo: [\n");
604*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "\tvegas enabled: %d\n",
605*4dc78e53SAndroid Build Coastguard Worker msg->idiag_vegasinfo->tcpv_enabled);
606*4dc78e53SAndroid Build Coastguard Worker if (msg->idiag_vegasinfo->tcpv_enabled) {
607*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "\trtt cnt: %d",
608*4dc78e53SAndroid Build Coastguard Worker msg->idiag_vegasinfo->tcpv_rttcnt);
609*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "\trtt (propagation delay): %d",
610*4dc78e53SAndroid Build Coastguard Worker msg->idiag_vegasinfo->tcpv_rtt);
611*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "\tmin rtt: %d",
612*4dc78e53SAndroid Build Coastguard Worker msg->idiag_vegasinfo->tcpv_minrtt);
613*4dc78e53SAndroid Build Coastguard Worker }
614*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "]\n");
615*4dc78e53SAndroid Build Coastguard Worker }
616*4dc78e53SAndroid Build Coastguard Worker
617*4dc78e53SAndroid Build Coastguard Worker if (msg->ce_mask & IDIAGNL_ATTR_MEMINFO) {
618*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "skmeminfo: [\n");
619*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "\trmem alloc: %d\n",
620*4dc78e53SAndroid Build Coastguard Worker msg->idiag_skmeminfo[SK_MEMINFO_RMEM_ALLOC]);
621*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "\trcv buf: %s\n",
622*4dc78e53SAndroid Build Coastguard Worker nl_size2str(msg->idiag_skmeminfo[SK_MEMINFO_RCVBUF],
623*4dc78e53SAndroid Build Coastguard Worker buf, sizeof(buf)));
624*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "\twmem alloc: %d\n",
625*4dc78e53SAndroid Build Coastguard Worker msg->idiag_skmeminfo[SK_MEMINFO_WMEM_ALLOC]);
626*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "\tsnd buf: %s\n",
627*4dc78e53SAndroid Build Coastguard Worker nl_size2str(msg->idiag_skmeminfo[SK_MEMINFO_SNDBUF],
628*4dc78e53SAndroid Build Coastguard Worker buf, sizeof(buf)));
629*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "\tfwd alloc: %d\n",
630*4dc78e53SAndroid Build Coastguard Worker msg->idiag_skmeminfo[SK_MEMINFO_FWD_ALLOC]);
631*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "\twmem queued: %s\n",
632*4dc78e53SAndroid Build Coastguard Worker nl_size2str(msg->idiag_skmeminfo[SK_MEMINFO_WMEM_QUEUED],
633*4dc78e53SAndroid Build Coastguard Worker buf, sizeof(buf)));
634*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "\topt mem: %d\n",
635*4dc78e53SAndroid Build Coastguard Worker msg->idiag_skmeminfo[SK_MEMINFO_OPTMEM]);
636*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "\tbacklog: %d\n",
637*4dc78e53SAndroid Build Coastguard Worker msg->idiag_skmeminfo[SK_MEMINFO_BACKLOG]);
638*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "]\n\n");
639*4dc78e53SAndroid Build Coastguard Worker }
640*4dc78e53SAndroid Build Coastguard Worker }
641*4dc78e53SAndroid Build Coastguard Worker
idiagnl_msg_free(struct nl_object * a)642*4dc78e53SAndroid Build Coastguard Worker static void idiagnl_msg_free(struct nl_object *a)
643*4dc78e53SAndroid Build Coastguard Worker {
644*4dc78e53SAndroid Build Coastguard Worker struct idiagnl_msg *msg = (struct idiagnl_msg *) a;
645*4dc78e53SAndroid Build Coastguard Worker if (a == NULL)
646*4dc78e53SAndroid Build Coastguard Worker return;
647*4dc78e53SAndroid Build Coastguard Worker
648*4dc78e53SAndroid Build Coastguard Worker free(msg->idiag_cong);
649*4dc78e53SAndroid Build Coastguard Worker nl_addr_put(msg->idiag_src);
650*4dc78e53SAndroid Build Coastguard Worker nl_addr_put(msg->idiag_dst);
651*4dc78e53SAndroid Build Coastguard Worker idiagnl_meminfo_put(msg->idiag_meminfo);
652*4dc78e53SAndroid Build Coastguard Worker idiagnl_vegasinfo_put(msg->idiag_vegasinfo);
653*4dc78e53SAndroid Build Coastguard Worker }
654*4dc78e53SAndroid Build Coastguard Worker
idiagnl_msg_clone(struct nl_object * _dst,struct nl_object * _src)655*4dc78e53SAndroid Build Coastguard Worker static int idiagnl_msg_clone(struct nl_object *_dst, struct nl_object *_src)
656*4dc78e53SAndroid Build Coastguard Worker {
657*4dc78e53SAndroid Build Coastguard Worker struct idiagnl_msg *dst = (struct idiagnl_msg *) _dst;
658*4dc78e53SAndroid Build Coastguard Worker struct idiagnl_msg *src = (struct idiagnl_msg *) _src;
659*4dc78e53SAndroid Build Coastguard Worker
660*4dc78e53SAndroid Build Coastguard Worker dst->idiag_src = NULL;
661*4dc78e53SAndroid Build Coastguard Worker dst->idiag_dst = NULL;
662*4dc78e53SAndroid Build Coastguard Worker dst->idiag_cong = NULL;
663*4dc78e53SAndroid Build Coastguard Worker dst->idiag_meminfo = NULL;
664*4dc78e53SAndroid Build Coastguard Worker dst->idiag_vegasinfo = NULL;
665*4dc78e53SAndroid Build Coastguard Worker dst->ce_mask &= ~(IDIAGNL_ATTR_CONG |
666*4dc78e53SAndroid Build Coastguard Worker IDIAGNL_ATTR_SRC |
667*4dc78e53SAndroid Build Coastguard Worker IDIAGNL_ATTR_DST |
668*4dc78e53SAndroid Build Coastguard Worker IDIAGNL_ATTR_MEMINFO |
669*4dc78e53SAndroid Build Coastguard Worker IDIAGNL_ATTR_VEGASINFO);
670*4dc78e53SAndroid Build Coastguard Worker
671*4dc78e53SAndroid Build Coastguard Worker if (src->idiag_cong) {
672*4dc78e53SAndroid Build Coastguard Worker if (!(dst->idiag_cong = strdup(src->idiag_cong)))
673*4dc78e53SAndroid Build Coastguard Worker return -NLE_NOMEM;
674*4dc78e53SAndroid Build Coastguard Worker dst->ce_mask |= IDIAGNL_ATTR_CONG;
675*4dc78e53SAndroid Build Coastguard Worker }
676*4dc78e53SAndroid Build Coastguard Worker
677*4dc78e53SAndroid Build Coastguard Worker if (src->idiag_src) {
678*4dc78e53SAndroid Build Coastguard Worker if (!(dst->idiag_src = nl_addr_clone(src->idiag_src)))
679*4dc78e53SAndroid Build Coastguard Worker return -NLE_NOMEM;
680*4dc78e53SAndroid Build Coastguard Worker dst->ce_mask |= IDIAGNL_ATTR_SRC;
681*4dc78e53SAndroid Build Coastguard Worker }
682*4dc78e53SAndroid Build Coastguard Worker
683*4dc78e53SAndroid Build Coastguard Worker if (src->idiag_dst) {
684*4dc78e53SAndroid Build Coastguard Worker if (!(dst->idiag_dst = nl_addr_clone(src->idiag_dst)))
685*4dc78e53SAndroid Build Coastguard Worker return -NLE_NOMEM;
686*4dc78e53SAndroid Build Coastguard Worker dst->ce_mask |= IDIAGNL_ATTR_DST;
687*4dc78e53SAndroid Build Coastguard Worker }
688*4dc78e53SAndroid Build Coastguard Worker
689*4dc78e53SAndroid Build Coastguard Worker if (src->idiag_meminfo) {
690*4dc78e53SAndroid Build Coastguard Worker if (!(dst->idiag_meminfo = (struct idiagnl_meminfo *) nl_object_clone((struct nl_object *) src->idiag_meminfo)))
691*4dc78e53SAndroid Build Coastguard Worker return -NLE_NOMEM;
692*4dc78e53SAndroid Build Coastguard Worker dst->ce_mask |= IDIAGNL_ATTR_MEMINFO;
693*4dc78e53SAndroid Build Coastguard Worker }
694*4dc78e53SAndroid Build Coastguard Worker
695*4dc78e53SAndroid Build Coastguard Worker if (src->idiag_vegasinfo) {
696*4dc78e53SAndroid Build Coastguard Worker if (!(dst->idiag_vegasinfo = (struct idiagnl_vegasinfo *) nl_object_clone((struct nl_object *) src->idiag_vegasinfo)))
697*4dc78e53SAndroid Build Coastguard Worker return -NLE_NOMEM;
698*4dc78e53SAndroid Build Coastguard Worker dst->ce_mask |= IDIAGNL_ATTR_VEGASINFO;
699*4dc78e53SAndroid Build Coastguard Worker }
700*4dc78e53SAndroid Build Coastguard Worker
701*4dc78e53SAndroid Build Coastguard Worker return 0;
702*4dc78e53SAndroid Build Coastguard Worker }
703*4dc78e53SAndroid Build Coastguard Worker
704*4dc78e53SAndroid Build Coastguard Worker static struct nla_policy ext_policy[INET_DIAG_MAX+1] = {
705*4dc78e53SAndroid Build Coastguard Worker [INET_DIAG_MEMINFO] = { .minlen = sizeof(struct inet_diag_meminfo) },
706*4dc78e53SAndroid Build Coastguard Worker [INET_DIAG_INFO] = { .minlen = sizeof(struct tcp_info) },
707*4dc78e53SAndroid Build Coastguard Worker [INET_DIAG_VEGASINFO] = { .minlen = sizeof(struct tcpvegas_info) },
708*4dc78e53SAndroid Build Coastguard Worker [INET_DIAG_CONG] = { .type = NLA_STRING },
709*4dc78e53SAndroid Build Coastguard Worker [INET_DIAG_TOS] = { .type = NLA_U8 },
710*4dc78e53SAndroid Build Coastguard Worker [INET_DIAG_TCLASS] = { .type = NLA_U8 },
711*4dc78e53SAndroid Build Coastguard Worker /* Older kernel doesn't have SK_MEMINFO_BACKLOG */
712*4dc78e53SAndroid Build Coastguard Worker [INET_DIAG_SKMEMINFO] = { .minlen = (sizeof(uint32_t) * (SK_MEMINFO_OPTMEM + 1)) },
713*4dc78e53SAndroid Build Coastguard Worker [INET_DIAG_SHUTDOWN] = { .type = NLA_U8 },
714*4dc78e53SAndroid Build Coastguard Worker };
715*4dc78e53SAndroid Build Coastguard Worker
idiagnl_msg_parse(struct nlmsghdr * nlh,struct idiagnl_msg ** result)716*4dc78e53SAndroid Build Coastguard Worker int idiagnl_msg_parse(struct nlmsghdr *nlh, struct idiagnl_msg **result)
717*4dc78e53SAndroid Build Coastguard Worker {
718*4dc78e53SAndroid Build Coastguard Worker struct idiagnl_msg *msg = NULL;
719*4dc78e53SAndroid Build Coastguard Worker struct inet_diag_msg *raw_msg = NULL;
720*4dc78e53SAndroid Build Coastguard Worker struct nl_addr *src = NULL, *dst = NULL;
721*4dc78e53SAndroid Build Coastguard Worker struct nlattr *tb[INET_DIAG_MAX+1];
722*4dc78e53SAndroid Build Coastguard Worker int err = 0;
723*4dc78e53SAndroid Build Coastguard Worker
724*4dc78e53SAndroid Build Coastguard Worker msg = idiagnl_msg_alloc();
725*4dc78e53SAndroid Build Coastguard Worker if (!msg)
726*4dc78e53SAndroid Build Coastguard Worker goto errout_nomem;
727*4dc78e53SAndroid Build Coastguard Worker
728*4dc78e53SAndroid Build Coastguard Worker err = nlmsg_parse(nlh, sizeof(struct inet_diag_msg), tb, INET_DIAG_MAX,
729*4dc78e53SAndroid Build Coastguard Worker ext_policy);
730*4dc78e53SAndroid Build Coastguard Worker if (err < 0)
731*4dc78e53SAndroid Build Coastguard Worker goto errout;
732*4dc78e53SAndroid Build Coastguard Worker
733*4dc78e53SAndroid Build Coastguard Worker raw_msg = nlmsg_data(nlh);
734*4dc78e53SAndroid Build Coastguard Worker msg->idiag_family = raw_msg->idiag_family;
735*4dc78e53SAndroid Build Coastguard Worker msg->idiag_state = raw_msg->idiag_state;
736*4dc78e53SAndroid Build Coastguard Worker msg->idiag_timer = raw_msg->idiag_timer;
737*4dc78e53SAndroid Build Coastguard Worker msg->idiag_retrans = raw_msg->idiag_retrans;
738*4dc78e53SAndroid Build Coastguard Worker msg->idiag_expires = raw_msg->idiag_expires;
739*4dc78e53SAndroid Build Coastguard Worker msg->idiag_rqueue = raw_msg->idiag_rqueue;
740*4dc78e53SAndroid Build Coastguard Worker msg->idiag_wqueue = raw_msg->idiag_wqueue;
741*4dc78e53SAndroid Build Coastguard Worker msg->idiag_uid = raw_msg->idiag_uid;
742*4dc78e53SAndroid Build Coastguard Worker msg->idiag_inode = raw_msg->idiag_inode;
743*4dc78e53SAndroid Build Coastguard Worker msg->idiag_sport = raw_msg->id.idiag_sport;
744*4dc78e53SAndroid Build Coastguard Worker msg->idiag_dport = raw_msg->id.idiag_dport;
745*4dc78e53SAndroid Build Coastguard Worker msg->idiag_ifindex = raw_msg->id.idiag_if;
746*4dc78e53SAndroid Build Coastguard Worker
747*4dc78e53SAndroid Build Coastguard Worker msg->ce_mask = (IDIAGNL_ATTR_FAMILY |
748*4dc78e53SAndroid Build Coastguard Worker IDIAGNL_ATTR_STATE |
749*4dc78e53SAndroid Build Coastguard Worker IDIAGNL_ATTR_TIMER |
750*4dc78e53SAndroid Build Coastguard Worker IDIAGNL_ATTR_RETRANS |
751*4dc78e53SAndroid Build Coastguard Worker IDIAGNL_ATTR_EXPIRES |
752*4dc78e53SAndroid Build Coastguard Worker IDIAGNL_ATTR_RQUEUE |
753*4dc78e53SAndroid Build Coastguard Worker IDIAGNL_ATTR_WQUEUE |
754*4dc78e53SAndroid Build Coastguard Worker IDIAGNL_ATTR_UID |
755*4dc78e53SAndroid Build Coastguard Worker IDIAGNL_ATTR_INODE |
756*4dc78e53SAndroid Build Coastguard Worker IDIAGNL_ATTR_SPORT |
757*4dc78e53SAndroid Build Coastguard Worker IDIAGNL_ATTR_DPORT |
758*4dc78e53SAndroid Build Coastguard Worker IDIAGNL_ATTR_IFINDEX);
759*4dc78e53SAndroid Build Coastguard Worker
760*4dc78e53SAndroid Build Coastguard Worker dst = nl_addr_build(raw_msg->idiag_family, raw_msg->id.idiag_dst,
761*4dc78e53SAndroid Build Coastguard Worker sizeof(raw_msg->id.idiag_dst));
762*4dc78e53SAndroid Build Coastguard Worker if (!dst)
763*4dc78e53SAndroid Build Coastguard Worker goto errout_nomem;
764*4dc78e53SAndroid Build Coastguard Worker
765*4dc78e53SAndroid Build Coastguard Worker err = idiagnl_msg_set_dst(msg, dst);
766*4dc78e53SAndroid Build Coastguard Worker if (err < 0)
767*4dc78e53SAndroid Build Coastguard Worker goto errout;
768*4dc78e53SAndroid Build Coastguard Worker
769*4dc78e53SAndroid Build Coastguard Worker nl_addr_put(dst);
770*4dc78e53SAndroid Build Coastguard Worker
771*4dc78e53SAndroid Build Coastguard Worker src = nl_addr_build(raw_msg->idiag_family, raw_msg->id.idiag_src,
772*4dc78e53SAndroid Build Coastguard Worker sizeof(raw_msg->id.idiag_src));
773*4dc78e53SAndroid Build Coastguard Worker if (!src)
774*4dc78e53SAndroid Build Coastguard Worker goto errout_nomem;
775*4dc78e53SAndroid Build Coastguard Worker
776*4dc78e53SAndroid Build Coastguard Worker err = idiagnl_msg_set_src(msg, src);
777*4dc78e53SAndroid Build Coastguard Worker if (err < 0)
778*4dc78e53SAndroid Build Coastguard Worker goto errout;
779*4dc78e53SAndroid Build Coastguard Worker
780*4dc78e53SAndroid Build Coastguard Worker nl_addr_put(src);
781*4dc78e53SAndroid Build Coastguard Worker
782*4dc78e53SAndroid Build Coastguard Worker if (tb[INET_DIAG_TOS]) {
783*4dc78e53SAndroid Build Coastguard Worker msg->idiag_tos = nla_get_u8(tb[INET_DIAG_TOS]);
784*4dc78e53SAndroid Build Coastguard Worker msg->ce_mask |= IDIAGNL_ATTR_TOS;
785*4dc78e53SAndroid Build Coastguard Worker }
786*4dc78e53SAndroid Build Coastguard Worker
787*4dc78e53SAndroid Build Coastguard Worker if (tb[INET_DIAG_TCLASS]) {
788*4dc78e53SAndroid Build Coastguard Worker msg->idiag_tclass = nla_get_u8(tb[INET_DIAG_TCLASS]);
789*4dc78e53SAndroid Build Coastguard Worker msg->ce_mask |= IDIAGNL_ATTR_TCLASS;
790*4dc78e53SAndroid Build Coastguard Worker }
791*4dc78e53SAndroid Build Coastguard Worker
792*4dc78e53SAndroid Build Coastguard Worker if (tb[INET_DIAG_SHUTDOWN]) {
793*4dc78e53SAndroid Build Coastguard Worker msg->idiag_shutdown = nla_get_u8(tb[INET_DIAG_SHUTDOWN]);
794*4dc78e53SAndroid Build Coastguard Worker msg->ce_mask |= IDIAGNL_ATTR_SHUTDOWN;
795*4dc78e53SAndroid Build Coastguard Worker }
796*4dc78e53SAndroid Build Coastguard Worker
797*4dc78e53SAndroid Build Coastguard Worker if (tb[INET_DIAG_CONG]) {
798*4dc78e53SAndroid Build Coastguard Worker msg->idiag_cong = nla_strdup(tb[INET_DIAG_CONG]);
799*4dc78e53SAndroid Build Coastguard Worker msg->ce_mask |= IDIAGNL_ATTR_CONG;
800*4dc78e53SAndroid Build Coastguard Worker }
801*4dc78e53SAndroid Build Coastguard Worker
802*4dc78e53SAndroid Build Coastguard Worker if (tb[INET_DIAG_INFO]) {
803*4dc78e53SAndroid Build Coastguard Worker nla_memcpy(&msg->idiag_tcpinfo, tb[INET_DIAG_INFO],
804*4dc78e53SAndroid Build Coastguard Worker sizeof(msg->idiag_tcpinfo));
805*4dc78e53SAndroid Build Coastguard Worker msg->ce_mask |= IDIAGNL_ATTR_TCPINFO;
806*4dc78e53SAndroid Build Coastguard Worker }
807*4dc78e53SAndroid Build Coastguard Worker
808*4dc78e53SAndroid Build Coastguard Worker if (tb[INET_DIAG_MEMINFO]) {
809*4dc78e53SAndroid Build Coastguard Worker struct idiagnl_meminfo *minfo = idiagnl_meminfo_alloc();
810*4dc78e53SAndroid Build Coastguard Worker struct inet_diag_meminfo *raw_minfo = NULL;
811*4dc78e53SAndroid Build Coastguard Worker
812*4dc78e53SAndroid Build Coastguard Worker if (!minfo)
813*4dc78e53SAndroid Build Coastguard Worker goto errout_nomem;
814*4dc78e53SAndroid Build Coastguard Worker
815*4dc78e53SAndroid Build Coastguard Worker raw_minfo = (struct inet_diag_meminfo *)
816*4dc78e53SAndroid Build Coastguard Worker nla_data(tb[INET_DIAG_MEMINFO]);
817*4dc78e53SAndroid Build Coastguard Worker
818*4dc78e53SAndroid Build Coastguard Worker idiagnl_meminfo_set_rmem(minfo, raw_minfo->idiag_rmem);
819*4dc78e53SAndroid Build Coastguard Worker idiagnl_meminfo_set_wmem(minfo, raw_minfo->idiag_wmem);
820*4dc78e53SAndroid Build Coastguard Worker idiagnl_meminfo_set_fmem(minfo, raw_minfo->idiag_fmem);
821*4dc78e53SAndroid Build Coastguard Worker idiagnl_meminfo_set_tmem(minfo, raw_minfo->idiag_tmem);
822*4dc78e53SAndroid Build Coastguard Worker
823*4dc78e53SAndroid Build Coastguard Worker msg->idiag_meminfo = minfo;
824*4dc78e53SAndroid Build Coastguard Worker msg->ce_mask |= IDIAGNL_ATTR_MEMINFO;
825*4dc78e53SAndroid Build Coastguard Worker }
826*4dc78e53SAndroid Build Coastguard Worker
827*4dc78e53SAndroid Build Coastguard Worker if (tb[INET_DIAG_VEGASINFO]) {
828*4dc78e53SAndroid Build Coastguard Worker struct idiagnl_vegasinfo *vinfo = idiagnl_vegasinfo_alloc();
829*4dc78e53SAndroid Build Coastguard Worker struct tcpvegas_info *raw_vinfo = NULL;
830*4dc78e53SAndroid Build Coastguard Worker
831*4dc78e53SAndroid Build Coastguard Worker if (!vinfo)
832*4dc78e53SAndroid Build Coastguard Worker goto errout_nomem;
833*4dc78e53SAndroid Build Coastguard Worker
834*4dc78e53SAndroid Build Coastguard Worker raw_vinfo = (struct tcpvegas_info *)
835*4dc78e53SAndroid Build Coastguard Worker nla_data(tb[INET_DIAG_VEGASINFO]);
836*4dc78e53SAndroid Build Coastguard Worker
837*4dc78e53SAndroid Build Coastguard Worker idiagnl_vegasinfo_set_enabled(vinfo, raw_vinfo->tcpv_enabled);
838*4dc78e53SAndroid Build Coastguard Worker idiagnl_vegasinfo_set_rttcnt(vinfo, raw_vinfo->tcpv_rttcnt);
839*4dc78e53SAndroid Build Coastguard Worker idiagnl_vegasinfo_set_rtt(vinfo, raw_vinfo->tcpv_rtt);
840*4dc78e53SAndroid Build Coastguard Worker idiagnl_vegasinfo_set_minrtt(vinfo, raw_vinfo->tcpv_minrtt);
841*4dc78e53SAndroid Build Coastguard Worker
842*4dc78e53SAndroid Build Coastguard Worker msg->idiag_vegasinfo = vinfo;
843*4dc78e53SAndroid Build Coastguard Worker msg->ce_mask |= IDIAGNL_ATTR_VEGASINFO;
844*4dc78e53SAndroid Build Coastguard Worker }
845*4dc78e53SAndroid Build Coastguard Worker
846*4dc78e53SAndroid Build Coastguard Worker if (tb[INET_DIAG_SKMEMINFO]) {
847*4dc78e53SAndroid Build Coastguard Worker nla_memcpy(&msg->idiag_skmeminfo, tb[INET_DIAG_SKMEMINFO],
848*4dc78e53SAndroid Build Coastguard Worker sizeof(msg->idiag_skmeminfo));
849*4dc78e53SAndroid Build Coastguard Worker msg->ce_mask |= IDIAGNL_ATTR_SKMEMINFO;
850*4dc78e53SAndroid Build Coastguard Worker }
851*4dc78e53SAndroid Build Coastguard Worker
852*4dc78e53SAndroid Build Coastguard Worker *result = msg;
853*4dc78e53SAndroid Build Coastguard Worker return 0;
854*4dc78e53SAndroid Build Coastguard Worker
855*4dc78e53SAndroid Build Coastguard Worker errout:
856*4dc78e53SAndroid Build Coastguard Worker idiagnl_msg_put(msg);
857*4dc78e53SAndroid Build Coastguard Worker return err;
858*4dc78e53SAndroid Build Coastguard Worker
859*4dc78e53SAndroid Build Coastguard Worker errout_nomem:
860*4dc78e53SAndroid Build Coastguard Worker err = -NLE_NOMEM;
861*4dc78e53SAndroid Build Coastguard Worker goto errout;
862*4dc78e53SAndroid Build Coastguard Worker }
863*4dc78e53SAndroid Build Coastguard Worker
864*4dc78e53SAndroid Build Coastguard Worker static const struct trans_tbl idiagnl_attrs[] = {
865*4dc78e53SAndroid Build Coastguard Worker __ADD(IDIAGNL_ATTR_FAMILY, family),
866*4dc78e53SAndroid Build Coastguard Worker __ADD(IDIAGNL_ATTR_STATE, state),
867*4dc78e53SAndroid Build Coastguard Worker __ADD(IDIAGNL_ATTR_TIMER, timer),
868*4dc78e53SAndroid Build Coastguard Worker __ADD(IDIAGNL_ATTR_RETRANS, retrans),
869*4dc78e53SAndroid Build Coastguard Worker __ADD(IDIAGNL_ATTR_SPORT, sport),
870*4dc78e53SAndroid Build Coastguard Worker __ADD(IDIAGNL_ATTR_DPORT, dport),
871*4dc78e53SAndroid Build Coastguard Worker __ADD(IDIAGNL_ATTR_SRC, src),
872*4dc78e53SAndroid Build Coastguard Worker __ADD(IDIAGNL_ATTR_DST, dst),
873*4dc78e53SAndroid Build Coastguard Worker __ADD(IDIAGNL_ATTR_IFINDEX, ifindex),
874*4dc78e53SAndroid Build Coastguard Worker __ADD(IDIAGNL_ATTR_EXPIRES, expires),
875*4dc78e53SAndroid Build Coastguard Worker __ADD(IDIAGNL_ATTR_RQUEUE, rqueue),
876*4dc78e53SAndroid Build Coastguard Worker __ADD(IDIAGNL_ATTR_WQUEUE, wqueue),
877*4dc78e53SAndroid Build Coastguard Worker __ADD(IDIAGNL_ATTR_UID, uid),
878*4dc78e53SAndroid Build Coastguard Worker __ADD(IDIAGNL_ATTR_INODE, inode),
879*4dc78e53SAndroid Build Coastguard Worker __ADD(IDIAGNL_ATTR_TOS, tos),
880*4dc78e53SAndroid Build Coastguard Worker __ADD(IDIAGNL_ATTR_TCLASS, tclass),
881*4dc78e53SAndroid Build Coastguard Worker __ADD(IDIAGNL_ATTR_SHUTDOWN, shutdown),
882*4dc78e53SAndroid Build Coastguard Worker __ADD(IDIAGNL_ATTR_CONG, cong),
883*4dc78e53SAndroid Build Coastguard Worker __ADD(IDIAGNL_ATTR_MEMINFO, meminfo),
884*4dc78e53SAndroid Build Coastguard Worker __ADD(IDIAGNL_ATTR_VEGASINFO, vegasinfo),
885*4dc78e53SAndroid Build Coastguard Worker __ADD(IDIAGNL_ATTR_TCPINFO, tcpinfo),
886*4dc78e53SAndroid Build Coastguard Worker __ADD(IDIAGNL_ATTR_SKMEMINFO, skmeminfo),
887*4dc78e53SAndroid Build Coastguard Worker };
888*4dc78e53SAndroid Build Coastguard Worker
_idiagnl_attrs2str(int attrs,char * buf,size_t len)889*4dc78e53SAndroid Build Coastguard Worker static char *_idiagnl_attrs2str(int attrs, char *buf, size_t len)
890*4dc78e53SAndroid Build Coastguard Worker {
891*4dc78e53SAndroid Build Coastguard Worker return __flags2str(attrs, buf, len, idiagnl_attrs,
892*4dc78e53SAndroid Build Coastguard Worker ARRAY_SIZE(idiagnl_attrs));
893*4dc78e53SAndroid Build Coastguard Worker }
894*4dc78e53SAndroid Build Coastguard Worker
idiagnl_compare(struct nl_object * _a,struct nl_object * _b,uint64_t attrs,int flags)895*4dc78e53SAndroid Build Coastguard Worker static uint64_t idiagnl_compare(struct nl_object *_a, struct nl_object *_b,
896*4dc78e53SAndroid Build Coastguard Worker uint64_t attrs, int flags)
897*4dc78e53SAndroid Build Coastguard Worker {
898*4dc78e53SAndroid Build Coastguard Worker struct idiagnl_msg *a = (struct idiagnl_msg *) _a;
899*4dc78e53SAndroid Build Coastguard Worker struct idiagnl_msg *b = (struct idiagnl_msg *) _b;
900*4dc78e53SAndroid Build Coastguard Worker uint64_t diff = 0;
901*4dc78e53SAndroid Build Coastguard Worker
902*4dc78e53SAndroid Build Coastguard Worker #define _DIFF(ATTR, EXPR) ATTR_DIFF(attrs, ATTR, a, b, EXPR)
903*4dc78e53SAndroid Build Coastguard Worker diff |= _DIFF(IDIAGNL_ATTR_FAMILY, a->idiag_family != b->idiag_family);
904*4dc78e53SAndroid Build Coastguard Worker diff |= _DIFF(IDIAGNL_ATTR_STATE, a->idiag_state != b->idiag_state);
905*4dc78e53SAndroid Build Coastguard Worker diff |= _DIFF(IDIAGNL_ATTR_TIMER, a->idiag_timer != b->idiag_timer);
906*4dc78e53SAndroid Build Coastguard Worker diff |= _DIFF(IDIAGNL_ATTR_RETRANS,
907*4dc78e53SAndroid Build Coastguard Worker a->idiag_retrans != b->idiag_retrans);
908*4dc78e53SAndroid Build Coastguard Worker diff |= _DIFF(IDIAGNL_ATTR_SPORT, a->idiag_sport != b->idiag_sport);
909*4dc78e53SAndroid Build Coastguard Worker diff |= _DIFF(IDIAGNL_ATTR_DPORT, a->idiag_dport != b->idiag_dport);
910*4dc78e53SAndroid Build Coastguard Worker diff |= _DIFF(IDIAGNL_ATTR_SRC,
911*4dc78e53SAndroid Build Coastguard Worker nl_addr_cmp(a->idiag_src, b->idiag_src));
912*4dc78e53SAndroid Build Coastguard Worker diff |= _DIFF(IDIAGNL_ATTR_DST,
913*4dc78e53SAndroid Build Coastguard Worker nl_addr_cmp(a->idiag_dst, b->idiag_dst));
914*4dc78e53SAndroid Build Coastguard Worker diff |= _DIFF(IDIAGNL_ATTR_IFINDEX,
915*4dc78e53SAndroid Build Coastguard Worker a->idiag_ifindex != b->idiag_ifindex);
916*4dc78e53SAndroid Build Coastguard Worker diff |= _DIFF(IDIAGNL_ATTR_EXPIRES,
917*4dc78e53SAndroid Build Coastguard Worker a->idiag_expires != b->idiag_expires);
918*4dc78e53SAndroid Build Coastguard Worker diff |= _DIFF(IDIAGNL_ATTR_RQUEUE, a->idiag_rqueue != b->idiag_rqueue);
919*4dc78e53SAndroid Build Coastguard Worker diff |= _DIFF(IDIAGNL_ATTR_WQUEUE, a->idiag_wqueue != b->idiag_wqueue);
920*4dc78e53SAndroid Build Coastguard Worker diff |= _DIFF(IDIAGNL_ATTR_UID, a->idiag_uid != b->idiag_uid);
921*4dc78e53SAndroid Build Coastguard Worker diff |= _DIFF(IDIAGNL_ATTR_INODE, a->idiag_inode != b->idiag_inode);
922*4dc78e53SAndroid Build Coastguard Worker diff |= _DIFF(IDIAGNL_ATTR_TOS, a->idiag_tos != b->idiag_tos);
923*4dc78e53SAndroid Build Coastguard Worker diff |= _DIFF(IDIAGNL_ATTR_TCLASS, a->idiag_tclass != b->idiag_tclass);
924*4dc78e53SAndroid Build Coastguard Worker diff |= _DIFF(IDIAGNL_ATTR_SHUTDOWN,
925*4dc78e53SAndroid Build Coastguard Worker a->idiag_shutdown != b->idiag_shutdown);
926*4dc78e53SAndroid Build Coastguard Worker diff |= _DIFF(IDIAGNL_ATTR_CONG, strcmp(a->idiag_cong, b->idiag_cong));
927*4dc78e53SAndroid Build Coastguard Worker diff |= _DIFF(IDIAGNL_ATTR_MEMINFO,
928*4dc78e53SAndroid Build Coastguard Worker nl_object_diff((struct nl_object *)a->idiag_meminfo,
929*4dc78e53SAndroid Build Coastguard Worker (struct nl_object *)b->idiag_meminfo));
930*4dc78e53SAndroid Build Coastguard Worker diff |= _DIFF(IDIAGNL_ATTR_VEGASINFO,
931*4dc78e53SAndroid Build Coastguard Worker nl_object_diff((struct nl_object *)a->idiag_vegasinfo,
932*4dc78e53SAndroid Build Coastguard Worker (struct nl_object *)b->idiag_vegasinfo));
933*4dc78e53SAndroid Build Coastguard Worker diff |= _DIFF(IDIAGNL_ATTR_TCPINFO,
934*4dc78e53SAndroid Build Coastguard Worker memcmp(&a->idiag_tcpinfo, &b->idiag_tcpinfo,
935*4dc78e53SAndroid Build Coastguard Worker sizeof(a->idiag_tcpinfo)));
936*4dc78e53SAndroid Build Coastguard Worker diff |= _DIFF(IDIAGNL_ATTR_SKMEMINFO,
937*4dc78e53SAndroid Build Coastguard Worker memcmp(a->idiag_skmeminfo, b->idiag_skmeminfo,
938*4dc78e53SAndroid Build Coastguard Worker sizeof(a->idiag_skmeminfo)));
939*4dc78e53SAndroid Build Coastguard Worker #undef _DIFF
940*4dc78e53SAndroid Build Coastguard Worker
941*4dc78e53SAndroid Build Coastguard Worker return diff;
942*4dc78e53SAndroid Build Coastguard Worker }
943*4dc78e53SAndroid Build Coastguard Worker
idiagnl_keygen(struct nl_object * obj,uint32_t * hashkey,uint32_t table_sz)944*4dc78e53SAndroid Build Coastguard Worker static void idiagnl_keygen(struct nl_object *obj, uint32_t *hashkey,
945*4dc78e53SAndroid Build Coastguard Worker uint32_t table_sz)
946*4dc78e53SAndroid Build Coastguard Worker {
947*4dc78e53SAndroid Build Coastguard Worker struct idiagnl_msg *msg = (struct idiagnl_msg *)obj;
948*4dc78e53SAndroid Build Coastguard Worker unsigned int key_sz;
949*4dc78e53SAndroid Build Coastguard Worker struct idiagnl_hash_key {
950*4dc78e53SAndroid Build Coastguard Worker uint8_t family;
951*4dc78e53SAndroid Build Coastguard Worker uint32_t src_hash;
952*4dc78e53SAndroid Build Coastguard Worker uint32_t dst_hash;
953*4dc78e53SAndroid Build Coastguard Worker uint16_t sport;
954*4dc78e53SAndroid Build Coastguard Worker uint16_t dport;
955*4dc78e53SAndroid Build Coastguard Worker } _nl_packed key;
956*4dc78e53SAndroid Build Coastguard Worker
957*4dc78e53SAndroid Build Coastguard Worker key_sz = sizeof(key);
958*4dc78e53SAndroid Build Coastguard Worker key.family = msg->idiag_family;
959*4dc78e53SAndroid Build Coastguard Worker key.src_hash = 0;
960*4dc78e53SAndroid Build Coastguard Worker key.dst_hash = 0;
961*4dc78e53SAndroid Build Coastguard Worker key.sport = msg->idiag_sport;
962*4dc78e53SAndroid Build Coastguard Worker key.dport = msg->idiag_dport;
963*4dc78e53SAndroid Build Coastguard Worker
964*4dc78e53SAndroid Build Coastguard Worker if (msg->idiag_src) {
965*4dc78e53SAndroid Build Coastguard Worker key.src_hash = nl_hash (nl_addr_get_binary_addr(msg->idiag_src),
966*4dc78e53SAndroid Build Coastguard Worker nl_addr_get_len(msg->idiag_src), 0);
967*4dc78e53SAndroid Build Coastguard Worker }
968*4dc78e53SAndroid Build Coastguard Worker if (msg->idiag_dst) {
969*4dc78e53SAndroid Build Coastguard Worker key.dst_hash = nl_hash (nl_addr_get_binary_addr(msg->idiag_dst),
970*4dc78e53SAndroid Build Coastguard Worker nl_addr_get_len(msg->idiag_dst), 0);
971*4dc78e53SAndroid Build Coastguard Worker }
972*4dc78e53SAndroid Build Coastguard Worker
973*4dc78e53SAndroid Build Coastguard Worker *hashkey = nl_hash(&key, key_sz, 0) % table_sz;
974*4dc78e53SAndroid Build Coastguard Worker
975*4dc78e53SAndroid Build Coastguard Worker NL_DBG(5, "idiagnl %p key (fam %d src_hash %d dst_hash %d sport %d dport %d) keysz %d, hash 0x%x\n",
976*4dc78e53SAndroid Build Coastguard Worker msg, key.family, key.src_hash, key.dst_hash, key.sport, key.dport, key_sz, *hashkey);
977*4dc78e53SAndroid Build Coastguard Worker
978*4dc78e53SAndroid Build Coastguard Worker return;
979*4dc78e53SAndroid Build Coastguard Worker }
980*4dc78e53SAndroid Build Coastguard Worker
981*4dc78e53SAndroid Build Coastguard Worker /** @cond SKIP */
982*4dc78e53SAndroid Build Coastguard Worker struct nl_object_ops idiagnl_msg_obj_ops = {
983*4dc78e53SAndroid Build Coastguard Worker .oo_name = "idiag/idiag_msg",
984*4dc78e53SAndroid Build Coastguard Worker .oo_size = sizeof(struct idiagnl_msg),
985*4dc78e53SAndroid Build Coastguard Worker .oo_free_data = idiagnl_msg_free,
986*4dc78e53SAndroid Build Coastguard Worker .oo_clone = idiagnl_msg_clone,
987*4dc78e53SAndroid Build Coastguard Worker .oo_dump = {
988*4dc78e53SAndroid Build Coastguard Worker [NL_DUMP_LINE] = idiag_msg_dump_line,
989*4dc78e53SAndroid Build Coastguard Worker [NL_DUMP_DETAILS] = idiag_msg_dump_details,
990*4dc78e53SAndroid Build Coastguard Worker [NL_DUMP_STATS] = idiag_msg_dump_stats,
991*4dc78e53SAndroid Build Coastguard Worker },
992*4dc78e53SAndroid Build Coastguard Worker .oo_compare = idiagnl_compare,
993*4dc78e53SAndroid Build Coastguard Worker .oo_keygen = idiagnl_keygen,
994*4dc78e53SAndroid Build Coastguard Worker .oo_attrs2str = _idiagnl_attrs2str,
995*4dc78e53SAndroid Build Coastguard Worker .oo_id_attrs = (IDIAGNL_ATTR_FAMILY |
996*4dc78e53SAndroid Build Coastguard Worker IDIAGNL_ATTR_SRC |
997*4dc78e53SAndroid Build Coastguard Worker IDIAGNL_ATTR_DST |
998*4dc78e53SAndroid Build Coastguard Worker IDIAGNL_ATTR_SPORT |
999*4dc78e53SAndroid Build Coastguard Worker IDIAGNL_ATTR_DPORT),
1000*4dc78e53SAndroid Build Coastguard Worker };
1001*4dc78e53SAndroid Build Coastguard Worker /** @endcond */
1002*4dc78e53SAndroid Build Coastguard Worker
1003*4dc78e53SAndroid Build Coastguard Worker /** @} */
1004