1*cf84ac9aSAndroid Build Coastguard Worker /*
2*cf84ac9aSAndroid Build Coastguard Worker * Copyright (c) 2016 Fabien Siron <[email protected]>
3*cf84ac9aSAndroid Build Coastguard Worker * Copyright (c) 2017 JingPiao Chen <[email protected]>
4*cf84ac9aSAndroid Build Coastguard Worker * Copyright (c) 2016-2018 The strace developers.
5*cf84ac9aSAndroid Build Coastguard Worker * All rights reserved.
6*cf84ac9aSAndroid Build Coastguard Worker *
7*cf84ac9aSAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without
8*cf84ac9aSAndroid Build Coastguard Worker * modification, are permitted provided that the following conditions
9*cf84ac9aSAndroid Build Coastguard Worker * are met:
10*cf84ac9aSAndroid Build Coastguard Worker * 1. Redistributions of source code must retain the above copyright
11*cf84ac9aSAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer.
12*cf84ac9aSAndroid Build Coastguard Worker * 2. Redistributions in binary form must reproduce the above copyright
13*cf84ac9aSAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer in the
14*cf84ac9aSAndroid Build Coastguard Worker * documentation and/or other materials provided with the distribution.
15*cf84ac9aSAndroid Build Coastguard Worker * 3. The name of the author may not be used to endorse or promote products
16*cf84ac9aSAndroid Build Coastguard Worker * derived from this software without specific prior written permission.
17*cf84ac9aSAndroid Build Coastguard Worker *
18*cf84ac9aSAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19*cf84ac9aSAndroid Build Coastguard Worker * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20*cf84ac9aSAndroid Build Coastguard Worker * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21*cf84ac9aSAndroid Build Coastguard Worker * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22*cf84ac9aSAndroid Build Coastguard Worker * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23*cf84ac9aSAndroid Build Coastguard Worker * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24*cf84ac9aSAndroid Build Coastguard Worker * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25*cf84ac9aSAndroid Build Coastguard Worker * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26*cf84ac9aSAndroid Build Coastguard Worker * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27*cf84ac9aSAndroid Build Coastguard Worker * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*cf84ac9aSAndroid Build Coastguard Worker */
29*cf84ac9aSAndroid Build Coastguard Worker
30*cf84ac9aSAndroid Build Coastguard Worker #include "defs.h"
31*cf84ac9aSAndroid Build Coastguard Worker #include "netlink_route.h"
32*cf84ac9aSAndroid Build Coastguard Worker #include "nlattr.h"
33*cf84ac9aSAndroid Build Coastguard Worker #include "print_fields.h"
34*cf84ac9aSAndroid Build Coastguard Worker
35*cf84ac9aSAndroid Build Coastguard Worker #include "netlink.h"
36*cf84ac9aSAndroid Build Coastguard Worker
37*cf84ac9aSAndroid Build Coastguard Worker #include <netinet/in.h>
38*cf84ac9aSAndroid Build Coastguard Worker
39*cf84ac9aSAndroid Build Coastguard Worker #ifdef HAVE_LINUX_IF_LINK_H
40*cf84ac9aSAndroid Build Coastguard Worker # include <linux/if_link.h>
41*cf84ac9aSAndroid Build Coastguard Worker #endif
42*cf84ac9aSAndroid Build Coastguard Worker #include <linux/rtnetlink.h>
43*cf84ac9aSAndroid Build Coastguard Worker
44*cf84ac9aSAndroid Build Coastguard Worker #include "xlat/in6_addr_gen_mode.h"
45*cf84ac9aSAndroid Build Coastguard Worker #include "xlat/inet_devconf_indices.h"
46*cf84ac9aSAndroid Build Coastguard Worker #include "xlat/inet6_devconf_indices.h"
47*cf84ac9aSAndroid Build Coastguard Worker #include "xlat/inet6_if_flags.h"
48*cf84ac9aSAndroid Build Coastguard Worker #include "xlat/rtnl_ifla_af_spec_inet_attrs.h"
49*cf84ac9aSAndroid Build Coastguard Worker #include "xlat/rtnl_ifla_af_spec_inet6_attrs.h"
50*cf84ac9aSAndroid Build Coastguard Worker #include "xlat/rtnl_ifla_brport_attrs.h"
51*cf84ac9aSAndroid Build Coastguard Worker #include "xlat/rtnl_ifla_events.h"
52*cf84ac9aSAndroid Build Coastguard Worker #include "xlat/rtnl_ifla_info_attrs.h"
53*cf84ac9aSAndroid Build Coastguard Worker #include "xlat/rtnl_ifla_info_data_bridge_attrs.h"
54*cf84ac9aSAndroid Build Coastguard Worker #include "xlat/rtnl_ifla_info_data_tun_attrs.h"
55*cf84ac9aSAndroid Build Coastguard Worker #include "xlat/rtnl_ifla_port_attrs.h"
56*cf84ac9aSAndroid Build Coastguard Worker #include "xlat/rtnl_ifla_vf_port_attrs.h"
57*cf84ac9aSAndroid Build Coastguard Worker #include "xlat/rtnl_ifla_xdp_attached_mode.h"
58*cf84ac9aSAndroid Build Coastguard Worker #include "xlat/rtnl_ifla_xdp_attrs.h"
59*cf84ac9aSAndroid Build Coastguard Worker #include "xlat/rtnl_link_attrs.h"
60*cf84ac9aSAndroid Build Coastguard Worker #include "xlat/snmp_icmp6_stats.h"
61*cf84ac9aSAndroid Build Coastguard Worker #include "xlat/snmp_ip_stats.h"
62*cf84ac9aSAndroid Build Coastguard Worker #include "xlat/tun_device_types.h"
63*cf84ac9aSAndroid Build Coastguard Worker #include "xlat/xdp_flags.h"
64*cf84ac9aSAndroid Build Coastguard Worker
65*cf84ac9aSAndroid Build Coastguard Worker static bool
decode_rtnl_link_stats(struct tcb * const tcp,const kernel_ulong_t addr,const unsigned int len,const void * const opaque_data)66*cf84ac9aSAndroid Build Coastguard Worker decode_rtnl_link_stats(struct tcb *const tcp,
67*cf84ac9aSAndroid Build Coastguard Worker const kernel_ulong_t addr,
68*cf84ac9aSAndroid Build Coastguard Worker const unsigned int len,
69*cf84ac9aSAndroid Build Coastguard Worker const void *const opaque_data)
70*cf84ac9aSAndroid Build Coastguard Worker {
71*cf84ac9aSAndroid Build Coastguard Worker struct rtnl_link_stats st;
72*cf84ac9aSAndroid Build Coastguard Worker const unsigned int min_size =
73*cf84ac9aSAndroid Build Coastguard Worker offsetofend(struct rtnl_link_stats, tx_compressed);
74*cf84ac9aSAndroid Build Coastguard Worker const unsigned int def_size = sizeof(st);
75*cf84ac9aSAndroid Build Coastguard Worker const unsigned int size =
76*cf84ac9aSAndroid Build Coastguard Worker (len >= def_size) ? def_size :
77*cf84ac9aSAndroid Build Coastguard Worker ((len == min_size) ? min_size : 0);
78*cf84ac9aSAndroid Build Coastguard Worker
79*cf84ac9aSAndroid Build Coastguard Worker if (!size)
80*cf84ac9aSAndroid Build Coastguard Worker return false;
81*cf84ac9aSAndroid Build Coastguard Worker
82*cf84ac9aSAndroid Build Coastguard Worker if (!umoven_or_printaddr(tcp, addr, size, &st)) {
83*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U("{", st, rx_packets);
84*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", st, tx_packets);
85*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", st, rx_bytes);
86*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", st, tx_bytes);
87*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", st, rx_errors);
88*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", st, tx_errors);
89*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", st, rx_dropped);
90*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", st, tx_dropped);
91*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", st, multicast);
92*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", st, collisions);
93*cf84ac9aSAndroid Build Coastguard Worker
94*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", st, rx_length_errors);
95*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", st, rx_over_errors);
96*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", st, rx_crc_errors);
97*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", st, rx_frame_errors);
98*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", st, rx_fifo_errors);
99*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", st, rx_missed_errors);
100*cf84ac9aSAndroid Build Coastguard Worker
101*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", st, tx_aborted_errors);
102*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", st, tx_carrier_errors);
103*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", st, tx_fifo_errors);
104*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", st, tx_heartbeat_errors);
105*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", st, tx_window_errors);
106*cf84ac9aSAndroid Build Coastguard Worker
107*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", st, rx_compressed);
108*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", st, tx_compressed);
109*cf84ac9aSAndroid Build Coastguard Worker #ifdef HAVE_STRUCT_RTNL_LINK_STATS_RX_NOHANDLER
110*cf84ac9aSAndroid Build Coastguard Worker if (len >= def_size)
111*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", st, rx_nohandler);
112*cf84ac9aSAndroid Build Coastguard Worker #endif
113*cf84ac9aSAndroid Build Coastguard Worker tprints("}");
114*cf84ac9aSAndroid Build Coastguard Worker }
115*cf84ac9aSAndroid Build Coastguard Worker
116*cf84ac9aSAndroid Build Coastguard Worker return true;
117*cf84ac9aSAndroid Build Coastguard Worker }
118*cf84ac9aSAndroid Build Coastguard Worker
119*cf84ac9aSAndroid Build Coastguard Worker static bool
decode_ifla_bridge_id(struct tcb * const tcp,const kernel_ulong_t addr,const unsigned int len,const void * const opaque_data)120*cf84ac9aSAndroid Build Coastguard Worker decode_ifla_bridge_id(struct tcb *const tcp,
121*cf84ac9aSAndroid Build Coastguard Worker const kernel_ulong_t addr,
122*cf84ac9aSAndroid Build Coastguard Worker const unsigned int len,
123*cf84ac9aSAndroid Build Coastguard Worker const void *const opaque_data)
124*cf84ac9aSAndroid Build Coastguard Worker {
125*cf84ac9aSAndroid Build Coastguard Worker struct {
126*cf84ac9aSAndroid Build Coastguard Worker uint8_t prio[2];
127*cf84ac9aSAndroid Build Coastguard Worker uint8_t addr[6];
128*cf84ac9aSAndroid Build Coastguard Worker } id;
129*cf84ac9aSAndroid Build Coastguard Worker
130*cf84ac9aSAndroid Build Coastguard Worker if (len < sizeof(id))
131*cf84ac9aSAndroid Build Coastguard Worker return false;
132*cf84ac9aSAndroid Build Coastguard Worker else if (!umove_or_printaddr(tcp, addr, &id)) {
133*cf84ac9aSAndroid Build Coastguard Worker tprintf("{prio=[%u, %u]", id.prio[0], id.prio[1]);
134*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_MAC(", ", id, addr);
135*cf84ac9aSAndroid Build Coastguard Worker tprints("}");
136*cf84ac9aSAndroid Build Coastguard Worker }
137*cf84ac9aSAndroid Build Coastguard Worker
138*cf84ac9aSAndroid Build Coastguard Worker return true;
139*cf84ac9aSAndroid Build Coastguard Worker }
140*cf84ac9aSAndroid Build Coastguard Worker
141*cf84ac9aSAndroid Build Coastguard Worker static const nla_decoder_t ifla_brport_nla_decoders[] = {
142*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BRPORT_STATE] = decode_nla_u8,
143*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BRPORT_PRIORITY] = decode_nla_u16,
144*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BRPORT_COST] = decode_nla_u32,
145*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BRPORT_MODE] = decode_nla_u8,
146*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BRPORT_GUARD] = decode_nla_u8,
147*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BRPORT_PROTECT] = decode_nla_u8,
148*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BRPORT_FAST_LEAVE] = decode_nla_u8,
149*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BRPORT_LEARNING] = decode_nla_u8,
150*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BRPORT_UNICAST_FLOOD] = decode_nla_u8,
151*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BRPORT_PROXYARP] = decode_nla_u8,
152*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BRPORT_LEARNING_SYNC] = decode_nla_u8,
153*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BRPORT_PROXYARP_WIFI] = decode_nla_u8,
154*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BRPORT_ROOT_ID] = decode_ifla_bridge_id,
155*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BRPORT_BRIDGE_ID] = decode_ifla_bridge_id,
156*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BRPORT_DESIGNATED_PORT] = decode_nla_u16,
157*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BRPORT_DESIGNATED_COST] = decode_nla_u16,
158*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BRPORT_ID] = decode_nla_u16,
159*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BRPORT_NO] = decode_nla_u16,
160*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BRPORT_TOPOLOGY_CHANGE_ACK] = decode_nla_u8,
161*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BRPORT_CONFIG_PENDING] = decode_nla_u8,
162*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BRPORT_MESSAGE_AGE_TIMER] = decode_nla_u64,
163*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BRPORT_FORWARD_DELAY_TIMER] = decode_nla_u64,
164*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BRPORT_HOLD_TIMER] = decode_nla_u64,
165*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BRPORT_FLUSH] = NULL,
166*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BRPORT_MULTICAST_ROUTER] = decode_nla_u8,
167*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BRPORT_PAD] = NULL,
168*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BRPORT_MCAST_FLOOD] = decode_nla_u8,
169*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BRPORT_MCAST_TO_UCAST] = decode_nla_u8,
170*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BRPORT_VLAN_TUNNEL] = decode_nla_u8,
171*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BRPORT_BCAST_FLOOD] = decode_nla_u8,
172*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BRPORT_GROUP_FWD_MASK] = decode_nla_u16,
173*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BRPORT_NEIGH_SUPPRESS] = decode_nla_u8,
174*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BRPORT_ISOLATED] = decode_nla_u8,
175*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BRPORT_BACKUP_PORT] = decode_nla_ifindex,
176*cf84ac9aSAndroid Build Coastguard Worker };
177*cf84ac9aSAndroid Build Coastguard Worker
178*cf84ac9aSAndroid Build Coastguard Worker static bool
decode_ifla_protinfo(struct tcb * const tcp,const kernel_ulong_t addr,const unsigned int len,const void * const opaque_data)179*cf84ac9aSAndroid Build Coastguard Worker decode_ifla_protinfo(struct tcb *const tcp,
180*cf84ac9aSAndroid Build Coastguard Worker const kernel_ulong_t addr,
181*cf84ac9aSAndroid Build Coastguard Worker const unsigned int len,
182*cf84ac9aSAndroid Build Coastguard Worker const void *const opaque_data)
183*cf84ac9aSAndroid Build Coastguard Worker {
184*cf84ac9aSAndroid Build Coastguard Worker decode_nlattr(tcp, addr, len, rtnl_ifla_brport_attrs,
185*cf84ac9aSAndroid Build Coastguard Worker "IFLA_BRPORT_???",
186*cf84ac9aSAndroid Build Coastguard Worker ARRSZ_PAIR(ifla_brport_nla_decoders), opaque_data);
187*cf84ac9aSAndroid Build Coastguard Worker
188*cf84ac9aSAndroid Build Coastguard Worker return true;
189*cf84ac9aSAndroid Build Coastguard Worker }
190*cf84ac9aSAndroid Build Coastguard Worker
191*cf84ac9aSAndroid Build Coastguard Worker static bool
decode_rtnl_link_ifmap(struct tcb * const tcp,const kernel_ulong_t addr,const unsigned int len,const void * const opaque_data)192*cf84ac9aSAndroid Build Coastguard Worker decode_rtnl_link_ifmap(struct tcb *const tcp,
193*cf84ac9aSAndroid Build Coastguard Worker const kernel_ulong_t addr,
194*cf84ac9aSAndroid Build Coastguard Worker const unsigned int len,
195*cf84ac9aSAndroid Build Coastguard Worker const void *const opaque_data)
196*cf84ac9aSAndroid Build Coastguard Worker {
197*cf84ac9aSAndroid Build Coastguard Worker struct rtnl_link_ifmap map;
198*cf84ac9aSAndroid Build Coastguard Worker const unsigned int sizeof_ifmap =
199*cf84ac9aSAndroid Build Coastguard Worker offsetofend(struct rtnl_link_ifmap, port);
200*cf84ac9aSAndroid Build Coastguard Worker
201*cf84ac9aSAndroid Build Coastguard Worker if (len < sizeof_ifmap)
202*cf84ac9aSAndroid Build Coastguard Worker return false;
203*cf84ac9aSAndroid Build Coastguard Worker else if (!umoven_or_printaddr(tcp, addr, sizeof_ifmap, &map)) {
204*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_X("{", map, mem_start);
205*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_X(", ", map, mem_end);
206*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_X(", ", map, base_addr);
207*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", map, irq);
208*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", map, dma);
209*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", map, port);
210*cf84ac9aSAndroid Build Coastguard Worker tprints("}");
211*cf84ac9aSAndroid Build Coastguard Worker }
212*cf84ac9aSAndroid Build Coastguard Worker
213*cf84ac9aSAndroid Build Coastguard Worker return true;
214*cf84ac9aSAndroid Build Coastguard Worker }
215*cf84ac9aSAndroid Build Coastguard Worker
216*cf84ac9aSAndroid Build Coastguard Worker bool
decode_nla_linkinfo_kind(struct tcb * const tcp,const kernel_ulong_t addr,const unsigned int len,const void * const opaque_data)217*cf84ac9aSAndroid Build Coastguard Worker decode_nla_linkinfo_kind(struct tcb *const tcp,
218*cf84ac9aSAndroid Build Coastguard Worker const kernel_ulong_t addr,
219*cf84ac9aSAndroid Build Coastguard Worker const unsigned int len,
220*cf84ac9aSAndroid Build Coastguard Worker const void *const opaque_data)
221*cf84ac9aSAndroid Build Coastguard Worker {
222*cf84ac9aSAndroid Build Coastguard Worker struct ifla_linkinfo_ctx *ctx = (void *) opaque_data;
223*cf84ac9aSAndroid Build Coastguard Worker
224*cf84ac9aSAndroid Build Coastguard Worker memset(ctx->kind, '\0', sizeof(ctx->kind));
225*cf84ac9aSAndroid Build Coastguard Worker
226*cf84ac9aSAndroid Build Coastguard Worker if (umovestr(tcp, addr, sizeof(ctx->kind), ctx->kind) <= 0) {
227*cf84ac9aSAndroid Build Coastguard Worker /*
228*cf84ac9aSAndroid Build Coastguard Worker * If we haven't seen NUL or an error occurred, set kind to
229*cf84ac9aSAndroid Build Coastguard Worker * an empty string.
230*cf84ac9aSAndroid Build Coastguard Worker */
231*cf84ac9aSAndroid Build Coastguard Worker ctx->kind[0] = '\0';
232*cf84ac9aSAndroid Build Coastguard Worker }
233*cf84ac9aSAndroid Build Coastguard Worker
234*cf84ac9aSAndroid Build Coastguard Worker printstr_ex(tcp, addr, len, QUOTE_0_TERMINATED);
235*cf84ac9aSAndroid Build Coastguard Worker
236*cf84ac9aSAndroid Build Coastguard Worker return true;
237*cf84ac9aSAndroid Build Coastguard Worker }
238*cf84ac9aSAndroid Build Coastguard Worker
239*cf84ac9aSAndroid Build Coastguard Worker bool
decode_nla_linkinfo_xstats_can(struct tcb * const tcp,const kernel_ulong_t addr,const unsigned int len,const void * const opaque_data)240*cf84ac9aSAndroid Build Coastguard Worker decode_nla_linkinfo_xstats_can(struct tcb *const tcp,
241*cf84ac9aSAndroid Build Coastguard Worker const kernel_ulong_t addr,
242*cf84ac9aSAndroid Build Coastguard Worker const unsigned int len,
243*cf84ac9aSAndroid Build Coastguard Worker const void *const opaque_data)
244*cf84ac9aSAndroid Build Coastguard Worker {
245*cf84ac9aSAndroid Build Coastguard Worker struct strace_can_device_stats {
246*cf84ac9aSAndroid Build Coastguard Worker uint32_t bus_error;
247*cf84ac9aSAndroid Build Coastguard Worker uint32_t error_warning;
248*cf84ac9aSAndroid Build Coastguard Worker uint32_t error_passive;
249*cf84ac9aSAndroid Build Coastguard Worker uint32_t bus_off;
250*cf84ac9aSAndroid Build Coastguard Worker uint32_t arbitration_lost;
251*cf84ac9aSAndroid Build Coastguard Worker uint32_t restarts;
252*cf84ac9aSAndroid Build Coastguard Worker } st;
253*cf84ac9aSAndroid Build Coastguard Worker const unsigned int def_size = sizeof(st);
254*cf84ac9aSAndroid Build Coastguard Worker const unsigned int size = (len >= def_size) ? def_size : 0;
255*cf84ac9aSAndroid Build Coastguard Worker
256*cf84ac9aSAndroid Build Coastguard Worker if (!size)
257*cf84ac9aSAndroid Build Coastguard Worker return false;
258*cf84ac9aSAndroid Build Coastguard Worker
259*cf84ac9aSAndroid Build Coastguard Worker if (umoven_or_printaddr(tcp, addr, size, &st))
260*cf84ac9aSAndroid Build Coastguard Worker return true;
261*cf84ac9aSAndroid Build Coastguard Worker
262*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U("{", st, bus_error);
263*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", st, error_warning);
264*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", st, error_passive);
265*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", st, bus_off);
266*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", st, arbitration_lost);
267*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", st, restarts);
268*cf84ac9aSAndroid Build Coastguard Worker tprints("}");
269*cf84ac9aSAndroid Build Coastguard Worker
270*cf84ac9aSAndroid Build Coastguard Worker return true;
271*cf84ac9aSAndroid Build Coastguard Worker }
272*cf84ac9aSAndroid Build Coastguard Worker
273*cf84ac9aSAndroid Build Coastguard Worker bool
decode_nla_linkinfo_xstats(struct tcb * const tcp,const kernel_ulong_t addr,const unsigned int len,const void * const opaque_data)274*cf84ac9aSAndroid Build Coastguard Worker decode_nla_linkinfo_xstats(struct tcb *const tcp,
275*cf84ac9aSAndroid Build Coastguard Worker const kernel_ulong_t addr,
276*cf84ac9aSAndroid Build Coastguard Worker const unsigned int len,
277*cf84ac9aSAndroid Build Coastguard Worker const void *const opaque_data)
278*cf84ac9aSAndroid Build Coastguard Worker {
279*cf84ac9aSAndroid Build Coastguard Worker struct ifla_linkinfo_ctx *ctx = (void *) opaque_data;
280*cf84ac9aSAndroid Build Coastguard Worker nla_decoder_t func = NULL;
281*cf84ac9aSAndroid Build Coastguard Worker
282*cf84ac9aSAndroid Build Coastguard Worker if (!strcmp(ctx->kind, "can"))
283*cf84ac9aSAndroid Build Coastguard Worker func = decode_nla_linkinfo_xstats_can;
284*cf84ac9aSAndroid Build Coastguard Worker
285*cf84ac9aSAndroid Build Coastguard Worker if (func)
286*cf84ac9aSAndroid Build Coastguard Worker return func(tcp, addr, len, opaque_data);
287*cf84ac9aSAndroid Build Coastguard Worker
288*cf84ac9aSAndroid Build Coastguard Worker return false;
289*cf84ac9aSAndroid Build Coastguard Worker }
290*cf84ac9aSAndroid Build Coastguard Worker
291*cf84ac9aSAndroid Build Coastguard Worker static const nla_decoder_t ifla_info_data_bridge_nla_decoders[] = {
292*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BR_UNSPEC] = NULL,
293*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BR_FORWARD_DELAY] = decode_nla_u32,
294*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BR_HELLO_TIME] = decode_nla_u32,
295*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BR_MAX_AGE] = decode_nla_u32,
296*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BR_AGEING_TIME] = decode_nla_u32,
297*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BR_STP_STATE] = decode_nla_u32,
298*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BR_PRIORITY] = decode_nla_u16,
299*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BR_VLAN_FILTERING] = decode_nla_u8,
300*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BR_VLAN_PROTOCOL] = decode_nla_ether_proto,
301*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BR_GROUP_FWD_MASK] = decode_nla_x16,
302*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BR_ROOT_ID] = decode_ifla_bridge_id,
303*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BR_BRIDGE_ID] = decode_ifla_bridge_id,
304*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BR_ROOT_PORT] = decode_nla_u16,
305*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BR_ROOT_PATH_COST] = decode_nla_u32,
306*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BR_TOPOLOGY_CHANGE] = decode_nla_u8,
307*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BR_TOPOLOGY_CHANGE_DETECTED] = decode_nla_u8,
308*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BR_HELLO_TIMER] = decode_nla_u64,
309*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BR_TCN_TIMER] = decode_nla_u64,
310*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BR_TOPOLOGY_CHANGE_TIMER] = decode_nla_u64,
311*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BR_GC_TIMER] = decode_nla_u64,
312*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BR_GROUP_ADDR] = NULL, /* MAC address */
313*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BR_FDB_FLUSH] = NULL, /* unspecified */
314*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BR_MCAST_ROUTER] = decode_nla_u8,
315*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BR_MCAST_SNOOPING] = decode_nla_u8,
316*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BR_MCAST_QUERY_USE_IFADDR] = decode_nla_u8,
317*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BR_MCAST_QUERIER] = decode_nla_u8,
318*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BR_MCAST_HASH_ELASTICITY] = decode_nla_u32,
319*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BR_MCAST_HASH_MAX] = decode_nla_u32,
320*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BR_MCAST_LAST_MEMBER_CNT] = decode_nla_u32,
321*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BR_MCAST_STARTUP_QUERY_CNT] = decode_nla_u32,
322*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BR_MCAST_LAST_MEMBER_INTVL] = decode_nla_u64,
323*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BR_MCAST_MEMBERSHIP_INTVL] = decode_nla_u64,
324*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BR_MCAST_QUERIER_INTVL] = decode_nla_u64,
325*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BR_MCAST_QUERY_INTVL] = decode_nla_u64,
326*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BR_MCAST_QUERY_RESPONSE_INTVL] = decode_nla_u64,
327*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BR_MCAST_STARTUP_QUERY_INTVL] = decode_nla_u64,
328*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BR_NF_CALL_IPTABLES] = decode_nla_u8,
329*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BR_NF_CALL_IP6TABLES] = decode_nla_u8,
330*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BR_NF_CALL_ARPTABLES] = decode_nla_u8,
331*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BR_VLAN_DEFAULT_PVID] = decode_nla_u16,
332*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BR_PAD] = NULL,
333*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BR_VLAN_STATS_ENABLED] = decode_nla_u8,
334*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BR_MCAST_STATS_ENABLED] = decode_nla_u8,
335*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BR_MCAST_IGMP_VERSION] = decode_nla_u8,
336*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BR_MCAST_MLD_VERSION] = decode_nla_u8,
337*cf84ac9aSAndroid Build Coastguard Worker };
338*cf84ac9aSAndroid Build Coastguard Worker
339*cf84ac9aSAndroid Build Coastguard Worker bool
decode_nla_linkinfo_data_bridge(struct tcb * const tcp,const kernel_ulong_t addr,const unsigned int len,const void * const opaque_data)340*cf84ac9aSAndroid Build Coastguard Worker decode_nla_linkinfo_data_bridge(struct tcb *const tcp,
341*cf84ac9aSAndroid Build Coastguard Worker const kernel_ulong_t addr,
342*cf84ac9aSAndroid Build Coastguard Worker const unsigned int len,
343*cf84ac9aSAndroid Build Coastguard Worker const void *const opaque_data)
344*cf84ac9aSAndroid Build Coastguard Worker {
345*cf84ac9aSAndroid Build Coastguard Worker decode_nlattr(tcp, addr, len, rtnl_ifla_info_data_bridge_attrs,
346*cf84ac9aSAndroid Build Coastguard Worker "IFLA_BR_???",
347*cf84ac9aSAndroid Build Coastguard Worker ARRSZ_PAIR(ifla_info_data_bridge_nla_decoders),
348*cf84ac9aSAndroid Build Coastguard Worker opaque_data);
349*cf84ac9aSAndroid Build Coastguard Worker
350*cf84ac9aSAndroid Build Coastguard Worker return true;
351*cf84ac9aSAndroid Build Coastguard Worker }
352*cf84ac9aSAndroid Build Coastguard Worker
353*cf84ac9aSAndroid Build Coastguard Worker static bool
decode_nla_tun_type(struct tcb * const tcp,const kernel_ulong_t addr,const unsigned int len,const void * const opaque_data)354*cf84ac9aSAndroid Build Coastguard Worker decode_nla_tun_type(struct tcb *const tcp,
355*cf84ac9aSAndroid Build Coastguard Worker const kernel_ulong_t addr,
356*cf84ac9aSAndroid Build Coastguard Worker const unsigned int len,
357*cf84ac9aSAndroid Build Coastguard Worker const void *const opaque_data)
358*cf84ac9aSAndroid Build Coastguard Worker {
359*cf84ac9aSAndroid Build Coastguard Worker const struct decode_nla_xlat_opts opts = {
360*cf84ac9aSAndroid Build Coastguard Worker .xlat = tun_device_types,
361*cf84ac9aSAndroid Build Coastguard Worker .xlat_size = ARRAY_SIZE(tun_device_types),
362*cf84ac9aSAndroid Build Coastguard Worker .xt = XT_INDEXED,
363*cf84ac9aSAndroid Build Coastguard Worker .dflt = "IFF_???",
364*cf84ac9aSAndroid Build Coastguard Worker .size = 1,
365*cf84ac9aSAndroid Build Coastguard Worker };
366*cf84ac9aSAndroid Build Coastguard Worker
367*cf84ac9aSAndroid Build Coastguard Worker return decode_nla_xval(tcp, addr, len, &opts);
368*cf84ac9aSAndroid Build Coastguard Worker }
369*cf84ac9aSAndroid Build Coastguard Worker
370*cf84ac9aSAndroid Build Coastguard Worker static const nla_decoder_t ifla_info_data_tun_nla_decoders[] = {
371*cf84ac9aSAndroid Build Coastguard Worker [IFLA_TUN_UNSPEC] = NULL,
372*cf84ac9aSAndroid Build Coastguard Worker [IFLA_TUN_OWNER] = decode_nla_uid,
373*cf84ac9aSAndroid Build Coastguard Worker [IFLA_TUN_GROUP] = decode_nla_gid,
374*cf84ac9aSAndroid Build Coastguard Worker [IFLA_TUN_TYPE] = decode_nla_tun_type,
375*cf84ac9aSAndroid Build Coastguard Worker [IFLA_TUN_PI] = decode_nla_u8,
376*cf84ac9aSAndroid Build Coastguard Worker [IFLA_TUN_VNET_HDR] = decode_nla_u8,
377*cf84ac9aSAndroid Build Coastguard Worker [IFLA_TUN_PERSIST] = decode_nla_u8,
378*cf84ac9aSAndroid Build Coastguard Worker [IFLA_TUN_MULTI_QUEUE] = decode_nla_u8,
379*cf84ac9aSAndroid Build Coastguard Worker [IFLA_TUN_NUM_QUEUES] = decode_nla_u32,
380*cf84ac9aSAndroid Build Coastguard Worker [IFLA_TUN_NUM_DISABLED_QUEUES] = decode_nla_u32,
381*cf84ac9aSAndroid Build Coastguard Worker };
382*cf84ac9aSAndroid Build Coastguard Worker
383*cf84ac9aSAndroid Build Coastguard Worker bool
decode_nla_linkinfo_data_tun(struct tcb * const tcp,const kernel_ulong_t addr,const unsigned int len,const void * const opaque_data)384*cf84ac9aSAndroid Build Coastguard Worker decode_nla_linkinfo_data_tun(struct tcb *const tcp,
385*cf84ac9aSAndroid Build Coastguard Worker const kernel_ulong_t addr,
386*cf84ac9aSAndroid Build Coastguard Worker const unsigned int len,
387*cf84ac9aSAndroid Build Coastguard Worker const void *const opaque_data)
388*cf84ac9aSAndroid Build Coastguard Worker {
389*cf84ac9aSAndroid Build Coastguard Worker decode_nlattr(tcp, addr, len, rtnl_ifla_info_data_tun_attrs,
390*cf84ac9aSAndroid Build Coastguard Worker "IFLA_TUN_???",
391*cf84ac9aSAndroid Build Coastguard Worker ARRSZ_PAIR(ifla_info_data_tun_nla_decoders),
392*cf84ac9aSAndroid Build Coastguard Worker opaque_data);
393*cf84ac9aSAndroid Build Coastguard Worker
394*cf84ac9aSAndroid Build Coastguard Worker return true;
395*cf84ac9aSAndroid Build Coastguard Worker }
396*cf84ac9aSAndroid Build Coastguard Worker
397*cf84ac9aSAndroid Build Coastguard Worker bool
decode_nla_linkinfo_data(struct tcb * const tcp,const kernel_ulong_t addr,const unsigned int len,const void * const opaque_data)398*cf84ac9aSAndroid Build Coastguard Worker decode_nla_linkinfo_data(struct tcb *const tcp,
399*cf84ac9aSAndroid Build Coastguard Worker const kernel_ulong_t addr,
400*cf84ac9aSAndroid Build Coastguard Worker const unsigned int len,
401*cf84ac9aSAndroid Build Coastguard Worker const void *const opaque_data)
402*cf84ac9aSAndroid Build Coastguard Worker {
403*cf84ac9aSAndroid Build Coastguard Worker struct ifla_linkinfo_ctx *ctx = (void *) opaque_data;
404*cf84ac9aSAndroid Build Coastguard Worker nla_decoder_t func = NULL;
405*cf84ac9aSAndroid Build Coastguard Worker
406*cf84ac9aSAndroid Build Coastguard Worker if (!strcmp(ctx->kind, "bridge"))
407*cf84ac9aSAndroid Build Coastguard Worker func = decode_nla_linkinfo_data_bridge;
408*cf84ac9aSAndroid Build Coastguard Worker else if (!strcmp(ctx->kind, "tun"))
409*cf84ac9aSAndroid Build Coastguard Worker func = decode_nla_linkinfo_data_tun;
410*cf84ac9aSAndroid Build Coastguard Worker
411*cf84ac9aSAndroid Build Coastguard Worker if (func)
412*cf84ac9aSAndroid Build Coastguard Worker return func(tcp, addr, len, opaque_data);
413*cf84ac9aSAndroid Build Coastguard Worker
414*cf84ac9aSAndroid Build Coastguard Worker return false;
415*cf84ac9aSAndroid Build Coastguard Worker }
416*cf84ac9aSAndroid Build Coastguard Worker
417*cf84ac9aSAndroid Build Coastguard Worker static const nla_decoder_t ifla_linkinfo_nla_decoders[] = {
418*cf84ac9aSAndroid Build Coastguard Worker [IFLA_INFO_KIND] = decode_nla_linkinfo_kind,
419*cf84ac9aSAndroid Build Coastguard Worker [IFLA_INFO_DATA] = decode_nla_linkinfo_data,
420*cf84ac9aSAndroid Build Coastguard Worker [IFLA_INFO_XSTATS] = decode_nla_linkinfo_xstats,
421*cf84ac9aSAndroid Build Coastguard Worker [IFLA_INFO_SLAVE_KIND] = decode_nla_str,
422*cf84ac9aSAndroid Build Coastguard Worker [IFLA_INFO_SLAVE_DATA] = NULL, /* unimplemented */
423*cf84ac9aSAndroid Build Coastguard Worker };
424*cf84ac9aSAndroid Build Coastguard Worker
425*cf84ac9aSAndroid Build Coastguard Worker static bool
decode_ifla_linkinfo(struct tcb * const tcp,const kernel_ulong_t addr,const unsigned int len,const void * const opaque_data)426*cf84ac9aSAndroid Build Coastguard Worker decode_ifla_linkinfo(struct tcb *const tcp,
427*cf84ac9aSAndroid Build Coastguard Worker const kernel_ulong_t addr,
428*cf84ac9aSAndroid Build Coastguard Worker const unsigned int len,
429*cf84ac9aSAndroid Build Coastguard Worker const void *const opaque_data)
430*cf84ac9aSAndroid Build Coastguard Worker {
431*cf84ac9aSAndroid Build Coastguard Worker struct ifla_linkinfo_ctx ctx = { .kind = "", };
432*cf84ac9aSAndroid Build Coastguard Worker
433*cf84ac9aSAndroid Build Coastguard Worker decode_nlattr(tcp, addr, len, rtnl_ifla_info_attrs,
434*cf84ac9aSAndroid Build Coastguard Worker "IFLA_INFO_???", ARRSZ_PAIR(ifla_linkinfo_nla_decoders),
435*cf84ac9aSAndroid Build Coastguard Worker &ctx);
436*cf84ac9aSAndroid Build Coastguard Worker
437*cf84ac9aSAndroid Build Coastguard Worker return true;
438*cf84ac9aSAndroid Build Coastguard Worker }
439*cf84ac9aSAndroid Build Coastguard Worker
440*cf84ac9aSAndroid Build Coastguard Worker static bool
decode_rtnl_link_stats64(struct tcb * const tcp,const kernel_ulong_t addr,const unsigned int len,const void * const opaque_data)441*cf84ac9aSAndroid Build Coastguard Worker decode_rtnl_link_stats64(struct tcb *const tcp,
442*cf84ac9aSAndroid Build Coastguard Worker const kernel_ulong_t addr,
443*cf84ac9aSAndroid Build Coastguard Worker const unsigned int len,
444*cf84ac9aSAndroid Build Coastguard Worker const void *const opaque_data)
445*cf84ac9aSAndroid Build Coastguard Worker {
446*cf84ac9aSAndroid Build Coastguard Worker #ifdef HAVE_STRUCT_RTNL_LINK_STATS64
447*cf84ac9aSAndroid Build Coastguard Worker struct rtnl_link_stats64 st;
448*cf84ac9aSAndroid Build Coastguard Worker const unsigned int min_size =
449*cf84ac9aSAndroid Build Coastguard Worker offsetofend(struct rtnl_link_stats64, tx_compressed);
450*cf84ac9aSAndroid Build Coastguard Worker const unsigned int def_size = sizeof(st);
451*cf84ac9aSAndroid Build Coastguard Worker const unsigned int size =
452*cf84ac9aSAndroid Build Coastguard Worker (len >= def_size) ? def_size :
453*cf84ac9aSAndroid Build Coastguard Worker ((len == min_size) ? min_size : 0);
454*cf84ac9aSAndroid Build Coastguard Worker
455*cf84ac9aSAndroid Build Coastguard Worker if (!size)
456*cf84ac9aSAndroid Build Coastguard Worker return false;
457*cf84ac9aSAndroid Build Coastguard Worker
458*cf84ac9aSAndroid Build Coastguard Worker if (!umoven_or_printaddr(tcp, addr, size, &st)) {
459*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U("{", st, rx_packets);
460*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", st, tx_packets);
461*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", st, rx_bytes);
462*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", st, tx_bytes);
463*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", st, rx_errors);
464*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", st, tx_errors);
465*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", st, rx_dropped);
466*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", st, tx_dropped);
467*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", st, multicast);
468*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", st, collisions);
469*cf84ac9aSAndroid Build Coastguard Worker
470*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", st, rx_length_errors);
471*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", st, rx_over_errors);
472*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", st, rx_crc_errors);
473*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", st, rx_frame_errors);
474*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", st, rx_fifo_errors);
475*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", st, rx_missed_errors);
476*cf84ac9aSAndroid Build Coastguard Worker
477*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", st, tx_aborted_errors);
478*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", st, tx_carrier_errors);
479*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", st, tx_fifo_errors);
480*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", st, tx_heartbeat_errors);
481*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", st, tx_window_errors);
482*cf84ac9aSAndroid Build Coastguard Worker
483*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", st, rx_compressed);
484*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", st, tx_compressed);
485*cf84ac9aSAndroid Build Coastguard Worker #ifdef HAVE_STRUCT_RTNL_LINK_STATS64_RX_NOHANDLER
486*cf84ac9aSAndroid Build Coastguard Worker if (len >= def_size)
487*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", st, rx_nohandler);
488*cf84ac9aSAndroid Build Coastguard Worker #endif
489*cf84ac9aSAndroid Build Coastguard Worker tprints("}");
490*cf84ac9aSAndroid Build Coastguard Worker }
491*cf84ac9aSAndroid Build Coastguard Worker
492*cf84ac9aSAndroid Build Coastguard Worker return true;
493*cf84ac9aSAndroid Build Coastguard Worker #else
494*cf84ac9aSAndroid Build Coastguard Worker return false;
495*cf84ac9aSAndroid Build Coastguard Worker #endif
496*cf84ac9aSAndroid Build Coastguard Worker }
497*cf84ac9aSAndroid Build Coastguard Worker
498*cf84ac9aSAndroid Build Coastguard Worker static bool
decode_ifla_port_vsi(struct tcb * const tcp,const kernel_ulong_t addr,const unsigned int len,const void * const opaque_data)499*cf84ac9aSAndroid Build Coastguard Worker decode_ifla_port_vsi(struct tcb *const tcp,
500*cf84ac9aSAndroid Build Coastguard Worker const kernel_ulong_t addr,
501*cf84ac9aSAndroid Build Coastguard Worker const unsigned int len,
502*cf84ac9aSAndroid Build Coastguard Worker const void *const opaque_data)
503*cf84ac9aSAndroid Build Coastguard Worker {
504*cf84ac9aSAndroid Build Coastguard Worker #ifdef HAVE_STRUCT_IFLA_PORT_VSI
505*cf84ac9aSAndroid Build Coastguard Worker struct ifla_port_vsi vsi;
506*cf84ac9aSAndroid Build Coastguard Worker
507*cf84ac9aSAndroid Build Coastguard Worker if (len < sizeof(vsi))
508*cf84ac9aSAndroid Build Coastguard Worker return false;
509*cf84ac9aSAndroid Build Coastguard Worker else if (!umove_or_printaddr(tcp, addr, &vsi)) {
510*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U("{", vsi, vsi_mgr_id);
511*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_STRING(", ", vsi, vsi_type_id,
512*cf84ac9aSAndroid Build Coastguard Worker sizeof(vsi.vsi_type_id), QUOTE_FORCE_HEX);
513*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", vsi, vsi_type_version);
514*cf84ac9aSAndroid Build Coastguard Worker tprints("}");
515*cf84ac9aSAndroid Build Coastguard Worker }
516*cf84ac9aSAndroid Build Coastguard Worker
517*cf84ac9aSAndroid Build Coastguard Worker return true;
518*cf84ac9aSAndroid Build Coastguard Worker #else
519*cf84ac9aSAndroid Build Coastguard Worker return false;
520*cf84ac9aSAndroid Build Coastguard Worker #endif
521*cf84ac9aSAndroid Build Coastguard Worker }
522*cf84ac9aSAndroid Build Coastguard Worker
523*cf84ac9aSAndroid Build Coastguard Worker static const nla_decoder_t ifla_port_nla_decoders[] = {
524*cf84ac9aSAndroid Build Coastguard Worker [IFLA_PORT_VF] = decode_nla_u32,
525*cf84ac9aSAndroid Build Coastguard Worker [IFLA_PORT_PROFILE] = decode_nla_str,
526*cf84ac9aSAndroid Build Coastguard Worker [IFLA_PORT_VSI_TYPE] = decode_ifla_port_vsi,
527*cf84ac9aSAndroid Build Coastguard Worker [IFLA_PORT_INSTANCE_UUID] = NULL, /* default parser */
528*cf84ac9aSAndroid Build Coastguard Worker [IFLA_PORT_HOST_UUID] = NULL, /* default parser */
529*cf84ac9aSAndroid Build Coastguard Worker [IFLA_PORT_REQUEST] = decode_nla_u8,
530*cf84ac9aSAndroid Build Coastguard Worker [IFLA_PORT_RESPONSE] = decode_nla_u16
531*cf84ac9aSAndroid Build Coastguard Worker };
532*cf84ac9aSAndroid Build Coastguard Worker
533*cf84ac9aSAndroid Build Coastguard Worker static bool
decode_ifla_port(struct tcb * const tcp,const kernel_ulong_t addr,const unsigned int len,const void * const opaque_data)534*cf84ac9aSAndroid Build Coastguard Worker decode_ifla_port(struct tcb *const tcp,
535*cf84ac9aSAndroid Build Coastguard Worker const kernel_ulong_t addr,
536*cf84ac9aSAndroid Build Coastguard Worker const unsigned int len,
537*cf84ac9aSAndroid Build Coastguard Worker const void *const opaque_data)
538*cf84ac9aSAndroid Build Coastguard Worker {
539*cf84ac9aSAndroid Build Coastguard Worker decode_nlattr(tcp, addr, len, rtnl_ifla_port_attrs,
540*cf84ac9aSAndroid Build Coastguard Worker "IFLA_VF_PORT_???", ARRSZ_PAIR(ifla_port_nla_decoders),
541*cf84ac9aSAndroid Build Coastguard Worker opaque_data);
542*cf84ac9aSAndroid Build Coastguard Worker
543*cf84ac9aSAndroid Build Coastguard Worker return true;
544*cf84ac9aSAndroid Build Coastguard Worker }
545*cf84ac9aSAndroid Build Coastguard Worker
546*cf84ac9aSAndroid Build Coastguard Worker static const nla_decoder_t ifla_vf_port_nla_decoders[] = {
547*cf84ac9aSAndroid Build Coastguard Worker [IFLA_VF_PORT] = decode_ifla_port
548*cf84ac9aSAndroid Build Coastguard Worker };
549*cf84ac9aSAndroid Build Coastguard Worker
550*cf84ac9aSAndroid Build Coastguard Worker static bool
decode_ifla_vf_ports(struct tcb * const tcp,const kernel_ulong_t addr,const unsigned int len,const void * const opaque_data)551*cf84ac9aSAndroid Build Coastguard Worker decode_ifla_vf_ports(struct tcb *const tcp,
552*cf84ac9aSAndroid Build Coastguard Worker const kernel_ulong_t addr,
553*cf84ac9aSAndroid Build Coastguard Worker const unsigned int len,
554*cf84ac9aSAndroid Build Coastguard Worker const void *const opaque_data)
555*cf84ac9aSAndroid Build Coastguard Worker {
556*cf84ac9aSAndroid Build Coastguard Worker decode_nlattr(tcp, addr, len, rtnl_ifla_vf_port_attrs,
557*cf84ac9aSAndroid Build Coastguard Worker "IFLA_VF_PORT_???", ARRSZ_PAIR(ifla_vf_port_nla_decoders),
558*cf84ac9aSAndroid Build Coastguard Worker opaque_data);
559*cf84ac9aSAndroid Build Coastguard Worker
560*cf84ac9aSAndroid Build Coastguard Worker return true;
561*cf84ac9aSAndroid Build Coastguard Worker }
562*cf84ac9aSAndroid Build Coastguard Worker
563*cf84ac9aSAndroid Build Coastguard Worker static bool
decode_ifla_xdp_flags(struct tcb * const tcp,const kernel_ulong_t addr,const unsigned int len,const void * const opaque_data)564*cf84ac9aSAndroid Build Coastguard Worker decode_ifla_xdp_flags(struct tcb *const tcp,
565*cf84ac9aSAndroid Build Coastguard Worker const kernel_ulong_t addr,
566*cf84ac9aSAndroid Build Coastguard Worker const unsigned int len,
567*cf84ac9aSAndroid Build Coastguard Worker const void *const opaque_data)
568*cf84ac9aSAndroid Build Coastguard Worker {
569*cf84ac9aSAndroid Build Coastguard Worker uint32_t flags;
570*cf84ac9aSAndroid Build Coastguard Worker
571*cf84ac9aSAndroid Build Coastguard Worker if (len < sizeof(flags))
572*cf84ac9aSAndroid Build Coastguard Worker return false;
573*cf84ac9aSAndroid Build Coastguard Worker else if (!umove_or_printaddr(tcp, addr, &flags))
574*cf84ac9aSAndroid Build Coastguard Worker printflags(xdp_flags, flags, "XDP_FLAGS_???");
575*cf84ac9aSAndroid Build Coastguard Worker
576*cf84ac9aSAndroid Build Coastguard Worker return true;
577*cf84ac9aSAndroid Build Coastguard Worker }
578*cf84ac9aSAndroid Build Coastguard Worker
579*cf84ac9aSAndroid Build Coastguard Worker bool
decode_ifla_xdp_attached(struct tcb * const tcp,const kernel_ulong_t addr,const unsigned int len,const void * const opaque_data)580*cf84ac9aSAndroid Build Coastguard Worker decode_ifla_xdp_attached(struct tcb *const tcp,
581*cf84ac9aSAndroid Build Coastguard Worker const kernel_ulong_t addr,
582*cf84ac9aSAndroid Build Coastguard Worker const unsigned int len,
583*cf84ac9aSAndroid Build Coastguard Worker const void *const opaque_data)
584*cf84ac9aSAndroid Build Coastguard Worker {
585*cf84ac9aSAndroid Build Coastguard Worker const struct decode_nla_xlat_opts opts = {
586*cf84ac9aSAndroid Build Coastguard Worker .xlat = rtnl_ifla_xdp_attached_mode,
587*cf84ac9aSAndroid Build Coastguard Worker .xlat_size = ARRAY_SIZE(rtnl_ifla_xdp_attached_mode),
588*cf84ac9aSAndroid Build Coastguard Worker .xt = XT_INDEXED,
589*cf84ac9aSAndroid Build Coastguard Worker .dflt = "XDP_ATTACHED_???",
590*cf84ac9aSAndroid Build Coastguard Worker .size = 1,
591*cf84ac9aSAndroid Build Coastguard Worker };
592*cf84ac9aSAndroid Build Coastguard Worker
593*cf84ac9aSAndroid Build Coastguard Worker return decode_nla_xval(tcp, addr, len, &opts);
594*cf84ac9aSAndroid Build Coastguard Worker }
595*cf84ac9aSAndroid Build Coastguard Worker
596*cf84ac9aSAndroid Build Coastguard Worker static const nla_decoder_t ifla_xdp_nla_decoders[] = {
597*cf84ac9aSAndroid Build Coastguard Worker [IFLA_XDP_FD] = decode_nla_fd,
598*cf84ac9aSAndroid Build Coastguard Worker [IFLA_XDP_ATTACHED] = decode_ifla_xdp_attached,
599*cf84ac9aSAndroid Build Coastguard Worker [IFLA_XDP_FLAGS] = decode_ifla_xdp_flags,
600*cf84ac9aSAndroid Build Coastguard Worker [IFLA_XDP_PROG_ID] = decode_nla_u32,
601*cf84ac9aSAndroid Build Coastguard Worker [IFLA_XDP_DRV_PROG_ID] = decode_nla_u32,
602*cf84ac9aSAndroid Build Coastguard Worker [IFLA_XDP_SKB_PROG_ID] = decode_nla_u32,
603*cf84ac9aSAndroid Build Coastguard Worker [IFLA_XDP_HW_PROG_ID] = decode_nla_u32,
604*cf84ac9aSAndroid Build Coastguard Worker };
605*cf84ac9aSAndroid Build Coastguard Worker
606*cf84ac9aSAndroid Build Coastguard Worker static bool
decode_ifla_xdp(struct tcb * const tcp,const kernel_ulong_t addr,const unsigned int len,const void * const opaque_data)607*cf84ac9aSAndroid Build Coastguard Worker decode_ifla_xdp(struct tcb *const tcp,
608*cf84ac9aSAndroid Build Coastguard Worker const kernel_ulong_t addr,
609*cf84ac9aSAndroid Build Coastguard Worker const unsigned int len,
610*cf84ac9aSAndroid Build Coastguard Worker const void *const opaque_data)
611*cf84ac9aSAndroid Build Coastguard Worker {
612*cf84ac9aSAndroid Build Coastguard Worker decode_nlattr(tcp, addr, len, rtnl_ifla_xdp_attrs,
613*cf84ac9aSAndroid Build Coastguard Worker "IFLA_XDP_???", ARRSZ_PAIR(ifla_xdp_nla_decoders),
614*cf84ac9aSAndroid Build Coastguard Worker opaque_data);
615*cf84ac9aSAndroid Build Coastguard Worker
616*cf84ac9aSAndroid Build Coastguard Worker return true;
617*cf84ac9aSAndroid Build Coastguard Worker }
618*cf84ac9aSAndroid Build Coastguard Worker
619*cf84ac9aSAndroid Build Coastguard Worker static bool
decode_ifla_event(struct tcb * const tcp,const kernel_ulong_t addr,const unsigned int len,const void * const opaque_data)620*cf84ac9aSAndroid Build Coastguard Worker decode_ifla_event(struct tcb *const tcp,
621*cf84ac9aSAndroid Build Coastguard Worker const kernel_ulong_t addr,
622*cf84ac9aSAndroid Build Coastguard Worker const unsigned int len,
623*cf84ac9aSAndroid Build Coastguard Worker const void *const opaque_data)
624*cf84ac9aSAndroid Build Coastguard Worker {
625*cf84ac9aSAndroid Build Coastguard Worker uint32_t ev;
626*cf84ac9aSAndroid Build Coastguard Worker
627*cf84ac9aSAndroid Build Coastguard Worker if (len < sizeof(ev))
628*cf84ac9aSAndroid Build Coastguard Worker return false;
629*cf84ac9aSAndroid Build Coastguard Worker else if (!umove_or_printaddr(tcp, addr, &ev))
630*cf84ac9aSAndroid Build Coastguard Worker printxval(rtnl_ifla_events, ev, "IFLA_EVENT_???");
631*cf84ac9aSAndroid Build Coastguard Worker
632*cf84ac9aSAndroid Build Coastguard Worker return true;
633*cf84ac9aSAndroid Build Coastguard Worker }
634*cf84ac9aSAndroid Build Coastguard Worker
635*cf84ac9aSAndroid Build Coastguard Worker
636*cf84ac9aSAndroid Build Coastguard Worker static bool
decode_ifla_inet_conf(struct tcb * const tcp,const kernel_ulong_t addr,const unsigned int len,const void * const opaque_data)637*cf84ac9aSAndroid Build Coastguard Worker decode_ifla_inet_conf(struct tcb *const tcp,
638*cf84ac9aSAndroid Build Coastguard Worker const kernel_ulong_t addr,
639*cf84ac9aSAndroid Build Coastguard Worker const unsigned int len,
640*cf84ac9aSAndroid Build Coastguard Worker const void *const opaque_data)
641*cf84ac9aSAndroid Build Coastguard Worker {
642*cf84ac9aSAndroid Build Coastguard Worker int elem;
643*cf84ac9aSAndroid Build Coastguard Worker size_t cnt = len / sizeof(elem);
644*cf84ac9aSAndroid Build Coastguard Worker
645*cf84ac9aSAndroid Build Coastguard Worker if (!cnt)
646*cf84ac9aSAndroid Build Coastguard Worker return false;
647*cf84ac9aSAndroid Build Coastguard Worker
648*cf84ac9aSAndroid Build Coastguard Worker print_array_ex(tcp, addr, cnt, &elem, sizeof(elem),
649*cf84ac9aSAndroid Build Coastguard Worker tfetch_mem, print_int32_array_member, NULL,
650*cf84ac9aSAndroid Build Coastguard Worker PAF_PRINT_INDICES | PAF_INDEX_XLAT_VALUE_INDEXED
651*cf84ac9aSAndroid Build Coastguard Worker | XLAT_STYLE_FMT_D, ARRSZ_PAIR(inet_devconf_indices),
652*cf84ac9aSAndroid Build Coastguard Worker "IPV4_DEVCONF_???");
653*cf84ac9aSAndroid Build Coastguard Worker
654*cf84ac9aSAndroid Build Coastguard Worker return true;
655*cf84ac9aSAndroid Build Coastguard Worker }
656*cf84ac9aSAndroid Build Coastguard Worker
657*cf84ac9aSAndroid Build Coastguard Worker static const nla_decoder_t ifla_inet_nla_decoders[] = {
658*cf84ac9aSAndroid Build Coastguard Worker [IFLA_INET_CONF] = decode_ifla_inet_conf,
659*cf84ac9aSAndroid Build Coastguard Worker };
660*cf84ac9aSAndroid Build Coastguard Worker
661*cf84ac9aSAndroid Build Coastguard Worker static bool
decode_ifla_inet6_flags(struct tcb * const tcp,const kernel_ulong_t addr,const unsigned int len,const void * const opaque_data)662*cf84ac9aSAndroid Build Coastguard Worker decode_ifla_inet6_flags(struct tcb *const tcp,
663*cf84ac9aSAndroid Build Coastguard Worker const kernel_ulong_t addr,
664*cf84ac9aSAndroid Build Coastguard Worker const unsigned int len,
665*cf84ac9aSAndroid Build Coastguard Worker const void *const opaque_data)
666*cf84ac9aSAndroid Build Coastguard Worker {
667*cf84ac9aSAndroid Build Coastguard Worker const struct decode_nla_xlat_opts opts = {
668*cf84ac9aSAndroid Build Coastguard Worker ARRSZ_PAIR(inet6_if_flags), "IF_???",
669*cf84ac9aSAndroid Build Coastguard Worker .size = 4,
670*cf84ac9aSAndroid Build Coastguard Worker };
671*cf84ac9aSAndroid Build Coastguard Worker
672*cf84ac9aSAndroid Build Coastguard Worker return decode_nla_flags(tcp, addr, len, &opts);
673*cf84ac9aSAndroid Build Coastguard Worker }
674*cf84ac9aSAndroid Build Coastguard Worker
675*cf84ac9aSAndroid Build Coastguard Worker static bool
decode_ifla_inet6_conf(struct tcb * const tcp,const kernel_ulong_t addr,const unsigned int len,const void * const opaque_data)676*cf84ac9aSAndroid Build Coastguard Worker decode_ifla_inet6_conf(struct tcb *const tcp,
677*cf84ac9aSAndroid Build Coastguard Worker const kernel_ulong_t addr,
678*cf84ac9aSAndroid Build Coastguard Worker const unsigned int len,
679*cf84ac9aSAndroid Build Coastguard Worker const void *const opaque_data)
680*cf84ac9aSAndroid Build Coastguard Worker {
681*cf84ac9aSAndroid Build Coastguard Worker int elem;
682*cf84ac9aSAndroid Build Coastguard Worker size_t cnt = len / sizeof(elem);
683*cf84ac9aSAndroid Build Coastguard Worker
684*cf84ac9aSAndroid Build Coastguard Worker if (!cnt)
685*cf84ac9aSAndroid Build Coastguard Worker return false;
686*cf84ac9aSAndroid Build Coastguard Worker
687*cf84ac9aSAndroid Build Coastguard Worker print_array_ex(tcp, addr, cnt, &elem, sizeof(elem),
688*cf84ac9aSAndroid Build Coastguard Worker tfetch_mem, print_int32_array_member, NULL,
689*cf84ac9aSAndroid Build Coastguard Worker PAF_PRINT_INDICES | PAF_INDEX_XLAT_VALUE_INDEXED
690*cf84ac9aSAndroid Build Coastguard Worker | XLAT_STYLE_FMT_D, ARRSZ_PAIR(inet6_devconf_indices),
691*cf84ac9aSAndroid Build Coastguard Worker "DEVCONF_???");
692*cf84ac9aSAndroid Build Coastguard Worker
693*cf84ac9aSAndroid Build Coastguard Worker return true;
694*cf84ac9aSAndroid Build Coastguard Worker }
695*cf84ac9aSAndroid Build Coastguard Worker
696*cf84ac9aSAndroid Build Coastguard Worker static bool
decode_ifla_inet6_stats(struct tcb * const tcp,const kernel_ulong_t addr,const unsigned int len,const void * const opaque_data)697*cf84ac9aSAndroid Build Coastguard Worker decode_ifla_inet6_stats(struct tcb *const tcp,
698*cf84ac9aSAndroid Build Coastguard Worker const kernel_ulong_t addr,
699*cf84ac9aSAndroid Build Coastguard Worker const unsigned int len,
700*cf84ac9aSAndroid Build Coastguard Worker const void *const opaque_data)
701*cf84ac9aSAndroid Build Coastguard Worker {
702*cf84ac9aSAndroid Build Coastguard Worker uint64_t elem;
703*cf84ac9aSAndroid Build Coastguard Worker size_t cnt = len / sizeof(elem);
704*cf84ac9aSAndroid Build Coastguard Worker
705*cf84ac9aSAndroid Build Coastguard Worker if (!cnt)
706*cf84ac9aSAndroid Build Coastguard Worker return false;
707*cf84ac9aSAndroid Build Coastguard Worker
708*cf84ac9aSAndroid Build Coastguard Worker print_array_ex(tcp, addr, cnt, &elem, sizeof(elem),
709*cf84ac9aSAndroid Build Coastguard Worker tfetch_mem, print_uint64_array_member, NULL,
710*cf84ac9aSAndroid Build Coastguard Worker PAF_PRINT_INDICES | PAF_INDEX_XLAT_VALUE_INDEXED
711*cf84ac9aSAndroid Build Coastguard Worker | XLAT_STYLE_FMT_U, ARRSZ_PAIR(snmp_ip_stats),
712*cf84ac9aSAndroid Build Coastguard Worker "IPSTATS_MIB_???");
713*cf84ac9aSAndroid Build Coastguard Worker
714*cf84ac9aSAndroid Build Coastguard Worker return true;
715*cf84ac9aSAndroid Build Coastguard Worker }
716*cf84ac9aSAndroid Build Coastguard Worker
717*cf84ac9aSAndroid Build Coastguard Worker static bool
decode_ifla_inet6_cacheinfo(struct tcb * const tcp,const kernel_ulong_t addr,const unsigned int len,const void * const opaque_data)718*cf84ac9aSAndroid Build Coastguard Worker decode_ifla_inet6_cacheinfo(struct tcb *const tcp,
719*cf84ac9aSAndroid Build Coastguard Worker const kernel_ulong_t addr,
720*cf84ac9aSAndroid Build Coastguard Worker const unsigned int len,
721*cf84ac9aSAndroid Build Coastguard Worker const void *const opaque_data)
722*cf84ac9aSAndroid Build Coastguard Worker {
723*cf84ac9aSAndroid Build Coastguard Worker struct {
724*cf84ac9aSAndroid Build Coastguard Worker uint32_t max_reasm_len;
725*cf84ac9aSAndroid Build Coastguard Worker uint32_t tstamp;
726*cf84ac9aSAndroid Build Coastguard Worker uint32_t reachable_time;
727*cf84ac9aSAndroid Build Coastguard Worker uint32_t retrans_time;
728*cf84ac9aSAndroid Build Coastguard Worker } ci;
729*cf84ac9aSAndroid Build Coastguard Worker
730*cf84ac9aSAndroid Build Coastguard Worker if (len < sizeof(ci))
731*cf84ac9aSAndroid Build Coastguard Worker return false;
732*cf84ac9aSAndroid Build Coastguard Worker else if (!umove_or_printaddr(tcp, addr, &ci)) {
733*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U("{", ci, max_reasm_len);
734*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", ci, tstamp);
735*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", ci, reachable_time);
736*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", ci, retrans_time);
737*cf84ac9aSAndroid Build Coastguard Worker tprints("}");
738*cf84ac9aSAndroid Build Coastguard Worker }
739*cf84ac9aSAndroid Build Coastguard Worker
740*cf84ac9aSAndroid Build Coastguard Worker return true;
741*cf84ac9aSAndroid Build Coastguard Worker }
742*cf84ac9aSAndroid Build Coastguard Worker
743*cf84ac9aSAndroid Build Coastguard Worker static bool
decode_ifla_inet6_icmp6_stats(struct tcb * const tcp,const kernel_ulong_t addr,const unsigned int len,const void * const opaque_data)744*cf84ac9aSAndroid Build Coastguard Worker decode_ifla_inet6_icmp6_stats(struct tcb *const tcp,
745*cf84ac9aSAndroid Build Coastguard Worker const kernel_ulong_t addr,
746*cf84ac9aSAndroid Build Coastguard Worker const unsigned int len,
747*cf84ac9aSAndroid Build Coastguard Worker const void *const opaque_data)
748*cf84ac9aSAndroid Build Coastguard Worker {
749*cf84ac9aSAndroid Build Coastguard Worker uint64_t elem;
750*cf84ac9aSAndroid Build Coastguard Worker size_t cnt = len / sizeof(elem);
751*cf84ac9aSAndroid Build Coastguard Worker
752*cf84ac9aSAndroid Build Coastguard Worker if (!cnt)
753*cf84ac9aSAndroid Build Coastguard Worker return false;
754*cf84ac9aSAndroid Build Coastguard Worker
755*cf84ac9aSAndroid Build Coastguard Worker print_array_ex(tcp, addr, cnt, &elem, sizeof(elem),
756*cf84ac9aSAndroid Build Coastguard Worker tfetch_mem, print_uint64_array_member, NULL,
757*cf84ac9aSAndroid Build Coastguard Worker PAF_PRINT_INDICES | PAF_INDEX_XLAT_VALUE_INDEXED
758*cf84ac9aSAndroid Build Coastguard Worker | XLAT_STYLE_FMT_U, ARRSZ_PAIR(snmp_icmp6_stats),
759*cf84ac9aSAndroid Build Coastguard Worker "ICMP6_MIB_???");
760*cf84ac9aSAndroid Build Coastguard Worker
761*cf84ac9aSAndroid Build Coastguard Worker return true;
762*cf84ac9aSAndroid Build Coastguard Worker }
763*cf84ac9aSAndroid Build Coastguard Worker
764*cf84ac9aSAndroid Build Coastguard Worker static bool
decode_ifla_inet6_agm(struct tcb * const tcp,const kernel_ulong_t addr,const unsigned int len,const void * const opaque_data)765*cf84ac9aSAndroid Build Coastguard Worker decode_ifla_inet6_agm(struct tcb *const tcp,
766*cf84ac9aSAndroid Build Coastguard Worker const kernel_ulong_t addr,
767*cf84ac9aSAndroid Build Coastguard Worker const unsigned int len,
768*cf84ac9aSAndroid Build Coastguard Worker const void *const opaque_data)
769*cf84ac9aSAndroid Build Coastguard Worker {
770*cf84ac9aSAndroid Build Coastguard Worker const struct decode_nla_xlat_opts opts = {
771*cf84ac9aSAndroid Build Coastguard Worker ARRSZ_PAIR(in6_addr_gen_mode), "IN6_ADDR_GEN_MODE_???",
772*cf84ac9aSAndroid Build Coastguard Worker .xt = XT_INDEXED,
773*cf84ac9aSAndroid Build Coastguard Worker .size = 1,
774*cf84ac9aSAndroid Build Coastguard Worker };
775*cf84ac9aSAndroid Build Coastguard Worker
776*cf84ac9aSAndroid Build Coastguard Worker return decode_nla_xval(tcp, addr, len, &opts);
777*cf84ac9aSAndroid Build Coastguard Worker }
778*cf84ac9aSAndroid Build Coastguard Worker
779*cf84ac9aSAndroid Build Coastguard Worker static const nla_decoder_t ifla_inet6_nla_decoders[] = {
780*cf84ac9aSAndroid Build Coastguard Worker [IFLA_INET6_FLAGS] = decode_ifla_inet6_flags,
781*cf84ac9aSAndroid Build Coastguard Worker [IFLA_INET6_CONF] = decode_ifla_inet6_conf,
782*cf84ac9aSAndroid Build Coastguard Worker [IFLA_INET6_STATS] = decode_ifla_inet6_stats,
783*cf84ac9aSAndroid Build Coastguard Worker [IFLA_INET6_MCAST] = NULL, /* unused */
784*cf84ac9aSAndroid Build Coastguard Worker [IFLA_INET6_CACHEINFO] = decode_ifla_inet6_cacheinfo,
785*cf84ac9aSAndroid Build Coastguard Worker [IFLA_INET6_ICMP6STATS] = decode_ifla_inet6_icmp6_stats,
786*cf84ac9aSAndroid Build Coastguard Worker [IFLA_INET6_TOKEN] = decode_nla_in6_addr,
787*cf84ac9aSAndroid Build Coastguard Worker [IFLA_INET6_ADDR_GEN_MODE] = decode_ifla_inet6_agm,
788*cf84ac9aSAndroid Build Coastguard Worker };
789*cf84ac9aSAndroid Build Coastguard Worker
790*cf84ac9aSAndroid Build Coastguard Worker static const struct nla_decoder_table_desc {
791*cf84ac9aSAndroid Build Coastguard Worker const struct xlat *xlat;
792*cf84ac9aSAndroid Build Coastguard Worker const char *dflt;
793*cf84ac9aSAndroid Build Coastguard Worker const nla_decoder_t *table;
794*cf84ac9aSAndroid Build Coastguard Worker size_t size;
795*cf84ac9aSAndroid Build Coastguard Worker } ifla_af_spec_protos[] = {
796*cf84ac9aSAndroid Build Coastguard Worker [AF_INET] = {
797*cf84ac9aSAndroid Build Coastguard Worker rtnl_ifla_af_spec_inet_attrs, "IFLA_INET_???",
798*cf84ac9aSAndroid Build Coastguard Worker ARRSZ_PAIR(ifla_inet_nla_decoders),
799*cf84ac9aSAndroid Build Coastguard Worker },
800*cf84ac9aSAndroid Build Coastguard Worker [AF_INET6] = {
801*cf84ac9aSAndroid Build Coastguard Worker rtnl_ifla_af_spec_inet6_attrs, "IFLA_INET6_???",
802*cf84ac9aSAndroid Build Coastguard Worker ARRSZ_PAIR(ifla_inet6_nla_decoders),
803*cf84ac9aSAndroid Build Coastguard Worker },
804*cf84ac9aSAndroid Build Coastguard Worker };
805*cf84ac9aSAndroid Build Coastguard Worker
806*cf84ac9aSAndroid Build Coastguard Worker static bool
decode_ifla_af(struct tcb * const tcp,const kernel_ulong_t addr,const unsigned int len,const void * const opaque_data)807*cf84ac9aSAndroid Build Coastguard Worker decode_ifla_af(struct tcb *const tcp,
808*cf84ac9aSAndroid Build Coastguard Worker const kernel_ulong_t addr,
809*cf84ac9aSAndroid Build Coastguard Worker const unsigned int len,
810*cf84ac9aSAndroid Build Coastguard Worker const void *const opaque_data)
811*cf84ac9aSAndroid Build Coastguard Worker {
812*cf84ac9aSAndroid Build Coastguard Worker uintptr_t proto = (uintptr_t) opaque_data;
813*cf84ac9aSAndroid Build Coastguard Worker const struct nla_decoder_table_desc *desc
814*cf84ac9aSAndroid Build Coastguard Worker = proto < ARRAY_SIZE(ifla_af_spec_protos)
815*cf84ac9aSAndroid Build Coastguard Worker ? ifla_af_spec_protos + proto : NULL;
816*cf84ac9aSAndroid Build Coastguard Worker
817*cf84ac9aSAndroid Build Coastguard Worker if (!desc || !desc->table)
818*cf84ac9aSAndroid Build Coastguard Worker return false;
819*cf84ac9aSAndroid Build Coastguard Worker
820*cf84ac9aSAndroid Build Coastguard Worker decode_nlattr(tcp, addr, len,
821*cf84ac9aSAndroid Build Coastguard Worker desc->xlat, desc->dflt, desc->table, desc->size, NULL);
822*cf84ac9aSAndroid Build Coastguard Worker
823*cf84ac9aSAndroid Build Coastguard Worker return true;
824*cf84ac9aSAndroid Build Coastguard Worker }
825*cf84ac9aSAndroid Build Coastguard Worker
826*cf84ac9aSAndroid Build Coastguard Worker static bool
decode_ifla_af_spec(struct tcb * const tcp,const kernel_ulong_t addr,const unsigned int len,const void * const opaque_data)827*cf84ac9aSAndroid Build Coastguard Worker decode_ifla_af_spec(struct tcb *const tcp,
828*cf84ac9aSAndroid Build Coastguard Worker const kernel_ulong_t addr,
829*cf84ac9aSAndroid Build Coastguard Worker const unsigned int len,
830*cf84ac9aSAndroid Build Coastguard Worker const void *const opaque_data)
831*cf84ac9aSAndroid Build Coastguard Worker {
832*cf84ac9aSAndroid Build Coastguard Worker nla_decoder_t af_spec_decoder = &decode_ifla_af;
833*cf84ac9aSAndroid Build Coastguard Worker
834*cf84ac9aSAndroid Build Coastguard Worker decode_nlattr(tcp, addr, len, addrfams, "AF_???",
835*cf84ac9aSAndroid Build Coastguard Worker &af_spec_decoder, 0, opaque_data);
836*cf84ac9aSAndroid Build Coastguard Worker
837*cf84ac9aSAndroid Build Coastguard Worker return true;
838*cf84ac9aSAndroid Build Coastguard Worker }
839*cf84ac9aSAndroid Build Coastguard Worker
840*cf84ac9aSAndroid Build Coastguard Worker static const nla_decoder_t ifinfomsg_nla_decoders[] = {
841*cf84ac9aSAndroid Build Coastguard Worker [IFLA_ADDRESS] = NULL, /* unimplemented */
842*cf84ac9aSAndroid Build Coastguard Worker [IFLA_BROADCAST] = NULL, /* unimplemented */
843*cf84ac9aSAndroid Build Coastguard Worker [IFLA_IFNAME] = decode_nla_str,
844*cf84ac9aSAndroid Build Coastguard Worker [IFLA_MTU] = decode_nla_u32,
845*cf84ac9aSAndroid Build Coastguard Worker [IFLA_LINK] = decode_nla_u32,
846*cf84ac9aSAndroid Build Coastguard Worker [IFLA_QDISC] = decode_nla_str,
847*cf84ac9aSAndroid Build Coastguard Worker [IFLA_STATS] = decode_rtnl_link_stats,
848*cf84ac9aSAndroid Build Coastguard Worker [IFLA_COST] = NULL, /* unused */
849*cf84ac9aSAndroid Build Coastguard Worker [IFLA_PRIORITY] = NULL, /* unused */
850*cf84ac9aSAndroid Build Coastguard Worker [IFLA_MASTER] = decode_nla_u32,
851*cf84ac9aSAndroid Build Coastguard Worker [IFLA_WIRELESS] = NULL, /* unimplemented */
852*cf84ac9aSAndroid Build Coastguard Worker [IFLA_PROTINFO] = decode_ifla_protinfo,
853*cf84ac9aSAndroid Build Coastguard Worker [IFLA_TXQLEN] = decode_nla_u32,
854*cf84ac9aSAndroid Build Coastguard Worker [IFLA_MAP] = decode_rtnl_link_ifmap,
855*cf84ac9aSAndroid Build Coastguard Worker [IFLA_WEIGHT] = decode_nla_u32,
856*cf84ac9aSAndroid Build Coastguard Worker [IFLA_OPERSTATE] = decode_nla_u8,
857*cf84ac9aSAndroid Build Coastguard Worker [IFLA_LINKMODE] = decode_nla_u8,
858*cf84ac9aSAndroid Build Coastguard Worker [IFLA_LINKINFO] = decode_ifla_linkinfo,
859*cf84ac9aSAndroid Build Coastguard Worker [IFLA_NET_NS_PID] = decode_nla_u32,
860*cf84ac9aSAndroid Build Coastguard Worker [IFLA_IFALIAS] = decode_nla_str,
861*cf84ac9aSAndroid Build Coastguard Worker [IFLA_NUM_VF] = decode_nla_u32,
862*cf84ac9aSAndroid Build Coastguard Worker [IFLA_VFINFO_LIST] = NULL, /* unimplemented */
863*cf84ac9aSAndroid Build Coastguard Worker [IFLA_STATS64] = decode_rtnl_link_stats64,
864*cf84ac9aSAndroid Build Coastguard Worker [IFLA_VF_PORTS] = decode_ifla_vf_ports,
865*cf84ac9aSAndroid Build Coastguard Worker [IFLA_PORT_SELF] = decode_ifla_port,
866*cf84ac9aSAndroid Build Coastguard Worker [IFLA_AF_SPEC] = decode_ifla_af_spec,
867*cf84ac9aSAndroid Build Coastguard Worker [IFLA_GROUP] = decode_nla_u32,
868*cf84ac9aSAndroid Build Coastguard Worker [IFLA_NET_NS_FD] = decode_nla_fd,
869*cf84ac9aSAndroid Build Coastguard Worker [IFLA_EXT_MASK] = decode_nla_u32,
870*cf84ac9aSAndroid Build Coastguard Worker [IFLA_PROMISCUITY] = decode_nla_u32,
871*cf84ac9aSAndroid Build Coastguard Worker [IFLA_NUM_TX_QUEUES] = decode_nla_u32,
872*cf84ac9aSAndroid Build Coastguard Worker [IFLA_NUM_RX_QUEUES] = decode_nla_u32,
873*cf84ac9aSAndroid Build Coastguard Worker [IFLA_CARRIER] = decode_nla_u8,
874*cf84ac9aSAndroid Build Coastguard Worker [IFLA_PHYS_PORT_ID] = NULL, /* default parser */
875*cf84ac9aSAndroid Build Coastguard Worker [IFLA_CARRIER_CHANGES] = decode_nla_u32,
876*cf84ac9aSAndroid Build Coastguard Worker [IFLA_PHYS_SWITCH_ID] = NULL, /* default parser */
877*cf84ac9aSAndroid Build Coastguard Worker [IFLA_LINK_NETNSID] = decode_nla_s32,
878*cf84ac9aSAndroid Build Coastguard Worker [IFLA_PHYS_PORT_NAME] = decode_nla_str,
879*cf84ac9aSAndroid Build Coastguard Worker [IFLA_PROTO_DOWN] = decode_nla_u8,
880*cf84ac9aSAndroid Build Coastguard Worker [IFLA_GSO_MAX_SEGS] = decode_nla_u32,
881*cf84ac9aSAndroid Build Coastguard Worker [IFLA_GSO_MAX_SIZE] = decode_nla_u32,
882*cf84ac9aSAndroid Build Coastguard Worker [IFLA_PAD] = NULL,
883*cf84ac9aSAndroid Build Coastguard Worker [IFLA_XDP] = decode_ifla_xdp,
884*cf84ac9aSAndroid Build Coastguard Worker [IFLA_EVENT] = decode_ifla_event,
885*cf84ac9aSAndroid Build Coastguard Worker [IFLA_NEW_NETNSID] = decode_nla_s32,
886*cf84ac9aSAndroid Build Coastguard Worker [IFLA_IF_NETNSID] = decode_nla_s32,
887*cf84ac9aSAndroid Build Coastguard Worker [IFLA_CARRIER_UP_COUNT] = decode_nla_u32,
888*cf84ac9aSAndroid Build Coastguard Worker [IFLA_CARRIER_DOWN_COUNT] = decode_nla_u32,
889*cf84ac9aSAndroid Build Coastguard Worker [IFLA_NEW_IFINDEX] = decode_nla_ifindex,
890*cf84ac9aSAndroid Build Coastguard Worker [IFLA_MIN_MTU] = decode_nla_u32,
891*cf84ac9aSAndroid Build Coastguard Worker [IFLA_MAX_MTU] = decode_nla_u32,
892*cf84ac9aSAndroid Build Coastguard Worker };
893*cf84ac9aSAndroid Build Coastguard Worker
DECL_NETLINK_ROUTE_DECODER(decode_ifinfomsg)894*cf84ac9aSAndroid Build Coastguard Worker DECL_NETLINK_ROUTE_DECODER(decode_ifinfomsg)
895*cf84ac9aSAndroid Build Coastguard Worker {
896*cf84ac9aSAndroid Build Coastguard Worker struct ifinfomsg ifinfo = { .ifi_family = family };
897*cf84ac9aSAndroid Build Coastguard Worker size_t offset = sizeof(ifinfo.ifi_family);
898*cf84ac9aSAndroid Build Coastguard Worker bool decode_nla = false;
899*cf84ac9aSAndroid Build Coastguard Worker
900*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_XVAL("{", ifinfo, ifi_family, addrfams, "AF_???");
901*cf84ac9aSAndroid Build Coastguard Worker
902*cf84ac9aSAndroid Build Coastguard Worker tprints(", ");
903*cf84ac9aSAndroid Build Coastguard Worker if (len >= sizeof(ifinfo)) {
904*cf84ac9aSAndroid Build Coastguard Worker if (!umoven_or_printaddr(tcp, addr + offset,
905*cf84ac9aSAndroid Build Coastguard Worker sizeof(ifinfo) - offset,
906*cf84ac9aSAndroid Build Coastguard Worker (char *) &ifinfo + offset)) {
907*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_XVAL_SORTED_SIZED("", ifinfo, ifi_type,
908*cf84ac9aSAndroid Build Coastguard Worker arp_hardware_types,
909*cf84ac9aSAndroid Build Coastguard Worker arp_hardware_types_size,
910*cf84ac9aSAndroid Build Coastguard Worker "ARPHRD_???");
911*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_IFINDEX(", ", ifinfo, ifi_index);
912*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_FLAGS(", ", ifinfo, ifi_flags,
913*cf84ac9aSAndroid Build Coastguard Worker iffflags, "IFF_???");
914*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_X(", ", ifinfo, ifi_change);
915*cf84ac9aSAndroid Build Coastguard Worker decode_nla = true;
916*cf84ac9aSAndroid Build Coastguard Worker }
917*cf84ac9aSAndroid Build Coastguard Worker } else
918*cf84ac9aSAndroid Build Coastguard Worker tprints("...");
919*cf84ac9aSAndroid Build Coastguard Worker tprints("}");
920*cf84ac9aSAndroid Build Coastguard Worker
921*cf84ac9aSAndroid Build Coastguard Worker offset = NLMSG_ALIGN(sizeof(ifinfo));
922*cf84ac9aSAndroid Build Coastguard Worker if (decode_nla && len > offset) {
923*cf84ac9aSAndroid Build Coastguard Worker tprints(", ");
924*cf84ac9aSAndroid Build Coastguard Worker decode_nlattr(tcp, addr + offset, len - offset,
925*cf84ac9aSAndroid Build Coastguard Worker rtnl_link_attrs, "IFLA_???",
926*cf84ac9aSAndroid Build Coastguard Worker ARRSZ_PAIR(ifinfomsg_nla_decoders), NULL);
927*cf84ac9aSAndroid Build Coastguard Worker }
928*cf84ac9aSAndroid Build Coastguard Worker }
929