1*cf84ac9aSAndroid Build Coastguard Worker /*
2*cf84ac9aSAndroid Build Coastguard Worker * IFLA_LINKINFO netlink attribute decoding check.
3*cf84ac9aSAndroid Build Coastguard Worker *
4*cf84ac9aSAndroid Build Coastguard Worker * Copyright (c) 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 "tests.h"
31*cf84ac9aSAndroid Build Coastguard Worker
32*cf84ac9aSAndroid Build Coastguard Worker #include <inttypes.h>
33*cf84ac9aSAndroid Build Coastguard Worker #include <stdio.h>
34*cf84ac9aSAndroid Build Coastguard Worker #include <stddef.h>
35*cf84ac9aSAndroid Build Coastguard Worker #include <arpa/inet.h>
36*cf84ac9aSAndroid Build Coastguard Worker
37*cf84ac9aSAndroid Build Coastguard Worker #include "test_nlattr.h"
38*cf84ac9aSAndroid Build Coastguard Worker
39*cf84ac9aSAndroid Build Coastguard Worker #include <linux/if.h>
40*cf84ac9aSAndroid Build Coastguard Worker #include <linux/if_arp.h>
41*cf84ac9aSAndroid Build Coastguard Worker #ifdef HAVE_LINUX_IF_LINK_H
42*cf84ac9aSAndroid Build Coastguard Worker # include <linux/if_link.h>
43*cf84ac9aSAndroid Build Coastguard Worker #endif
44*cf84ac9aSAndroid Build Coastguard Worker #include <linux/rtnetlink.h>
45*cf84ac9aSAndroid Build Coastguard Worker
46*cf84ac9aSAndroid Build Coastguard Worker #define XLAT_MACROS_ONLY
47*cf84ac9aSAndroid Build Coastguard Worker # include <xlat/rtnl_link_attrs.h>
48*cf84ac9aSAndroid Build Coastguard Worker # include <xlat/rtnl_ifla_info_attrs.h>
49*cf84ac9aSAndroid Build Coastguard Worker #undef XLAT_MACROS_ONLY
50*cf84ac9aSAndroid Build Coastguard Worker
51*cf84ac9aSAndroid Build Coastguard Worker #define IFLA_ATTR IFLA_LINKINFO
52*cf84ac9aSAndroid Build Coastguard Worker #include "nlattr_ifla.h"
53*cf84ac9aSAndroid Build Coastguard Worker
54*cf84ac9aSAndroid Build Coastguard Worker #define COMMA ,
55*cf84ac9aSAndroid Build Coastguard Worker #define TEST_UNKNOWN_TUNNELS(fd_, nlh0_, objtype_, objtype_str_, \
56*cf84ac9aSAndroid Build Coastguard Worker obj_, objsz_, arrstrs_, ...) \
57*cf84ac9aSAndroid Build Coastguard Worker do { \
58*cf84ac9aSAndroid Build Coastguard Worker /* 64 is guestimate for maximum unknown type len */ \
59*cf84ac9aSAndroid Build Coastguard Worker char buf[8 * 2 + 64 + objsz_]; \
60*cf84ac9aSAndroid Build Coastguard Worker const char **arrstrs[] = arrstrs_; \
61*cf84ac9aSAndroid Build Coastguard Worker const char ***arrstrs_pos = arrstrs; \
62*cf84ac9aSAndroid Build Coastguard Worker const char **arrstr = *arrstrs_pos; \
63*cf84ac9aSAndroid Build Coastguard Worker const char *type = NULL; \
64*cf84ac9aSAndroid Build Coastguard Worker \
65*cf84ac9aSAndroid Build Coastguard Worker for (type = arrstr ? arrstr[0] : NULL; type && arrstr; \
66*cf84ac9aSAndroid Build Coastguard Worker type = (++arrstr)[0] ? arrstr[0] \
67*cf84ac9aSAndroid Build Coastguard Worker : (++arrstrs_pos)[0] \
68*cf84ac9aSAndroid Build Coastguard Worker ? (arrstr = arrstrs_pos[0])[0] \
69*cf84ac9aSAndroid Build Coastguard Worker : NULL) \
70*cf84ac9aSAndroid Build Coastguard Worker { \
71*cf84ac9aSAndroid Build Coastguard Worker size_t type_len = strlen(type) + 1; \
72*cf84ac9aSAndroid Build Coastguard Worker \
73*cf84ac9aSAndroid Build Coastguard Worker if (type_len > 64) \
74*cf84ac9aSAndroid Build Coastguard Worker error_msg_and_fail("Unexpectedly long " \
75*cf84ac9aSAndroid Build Coastguard Worker "unknown type: \"%s\" " \
76*cf84ac9aSAndroid Build Coastguard Worker "(length is %zu)", \
77*cf84ac9aSAndroid Build Coastguard Worker type, type_len); \
78*cf84ac9aSAndroid Build Coastguard Worker \
79*cf84ac9aSAndroid Build Coastguard Worker struct nlattr obj_nla = { \
80*cf84ac9aSAndroid Build Coastguard Worker .nla_len = NLA_HDRLEN + (objsz_), \
81*cf84ac9aSAndroid Build Coastguard Worker .nla_type = (objtype_), \
82*cf84ac9aSAndroid Build Coastguard Worker }; \
83*cf84ac9aSAndroid Build Coastguard Worker \
84*cf84ac9aSAndroid Build Coastguard Worker char *pos = buf; \
85*cf84ac9aSAndroid Build Coastguard Worker memcpy(pos, type, type_len); \
86*cf84ac9aSAndroid Build Coastguard Worker pos += NLA_ALIGN(type_len); \
87*cf84ac9aSAndroid Build Coastguard Worker memcpy(pos, &obj_nla, sizeof(obj_nla)); \
88*cf84ac9aSAndroid Build Coastguard Worker pos += sizeof(obj_nla); \
89*cf84ac9aSAndroid Build Coastguard Worker memcpy(pos, (obj_), (objsz_)); \
90*cf84ac9aSAndroid Build Coastguard Worker \
91*cf84ac9aSAndroid Build Coastguard Worker TEST_NLATTR_EX_((fd_), \
92*cf84ac9aSAndroid Build Coastguard Worker (nlh0_) - hdrlen - (pos - buf), \
93*cf84ac9aSAndroid Build Coastguard Worker hdrlen + NLA_HDRLEN, \
94*cf84ac9aSAndroid Build Coastguard Worker init_ifinfomsg, print_ifinfomsg, \
95*cf84ac9aSAndroid Build Coastguard Worker IFLA_INFO_KIND, "IFLA_INFO_KIND", \
96*cf84ac9aSAndroid Build Coastguard Worker type_len, objsz_ + (pos - buf), \
97*cf84ac9aSAndroid Build Coastguard Worker buf, objsz_ + (pos - buf), \
98*cf84ac9aSAndroid Build Coastguard Worker printf("\"%s\"}", type); \
99*cf84ac9aSAndroid Build Coastguard Worker printf(", {{nla_len=%zu" \
100*cf84ac9aSAndroid Build Coastguard Worker ", nla_type=%s}, ", \
101*cf84ac9aSAndroid Build Coastguard Worker (objsz_) + NLA_HDRLEN, \
102*cf84ac9aSAndroid Build Coastguard Worker (objtype_str_)); \
103*cf84ac9aSAndroid Build Coastguard Worker \
104*cf84ac9aSAndroid Build Coastguard Worker { __VA_ARGS__; } \
105*cf84ac9aSAndroid Build Coastguard Worker \
106*cf84ac9aSAndroid Build Coastguard Worker printf("}")); \
107*cf84ac9aSAndroid Build Coastguard Worker } \
108*cf84ac9aSAndroid Build Coastguard Worker } while (0)
109*cf84ac9aSAndroid Build Coastguard Worker
110*cf84ac9aSAndroid Build Coastguard Worker #define TEST_LINKINFO_(fd_, nlh0_, nla_type_, nla_type_str_, tuntype_, \
111*cf84ac9aSAndroid Build Coastguard Worker obj_, objsz_, pattern_, fallback_func_, ...) \
112*cf84ac9aSAndroid Build Coastguard Worker do { \
113*cf84ac9aSAndroid Build Coastguard Worker size_t tuntype_len = strlen(tuntype_) + 1; \
114*cf84ac9aSAndroid Build Coastguard Worker char *buf = tail_alloc(NLA_ALIGN(tuntype_len) \
115*cf84ac9aSAndroid Build Coastguard Worker + NLA_HDRLEN + (objsz_)); \
116*cf84ac9aSAndroid Build Coastguard Worker char *pos = buf; \
117*cf84ac9aSAndroid Build Coastguard Worker \
118*cf84ac9aSAndroid Build Coastguard Worker struct nlattr obj_nla = { \
119*cf84ac9aSAndroid Build Coastguard Worker .nla_len = NLA_HDRLEN + (objsz_), \
120*cf84ac9aSAndroid Build Coastguard Worker .nla_type = (nla_type_), \
121*cf84ac9aSAndroid Build Coastguard Worker }; \
122*cf84ac9aSAndroid Build Coastguard Worker \
123*cf84ac9aSAndroid Build Coastguard Worker memcpy(pos, (tuntype_), tuntype_len); \
124*cf84ac9aSAndroid Build Coastguard Worker pos += NLA_ALIGN(tuntype_len); \
125*cf84ac9aSAndroid Build Coastguard Worker memcpy(pos, &obj_nla, sizeof(obj_nla)); \
126*cf84ac9aSAndroid Build Coastguard Worker pos += sizeof(obj_nla); \
127*cf84ac9aSAndroid Build Coastguard Worker memcpy(pos, &(obj_), (objsz_)); \
128*cf84ac9aSAndroid Build Coastguard Worker \
129*cf84ac9aSAndroid Build Coastguard Worker if (fallback_func_ == print_quoted_hex) { \
130*cf84ac9aSAndroid Build Coastguard Worker TEST_NLATTR_EX_((fd_), \
131*cf84ac9aSAndroid Build Coastguard Worker (nlh0_) - NLA_HDRLEN, \
132*cf84ac9aSAndroid Build Coastguard Worker hdrlen + NLA_HDRLEN, \
133*cf84ac9aSAndroid Build Coastguard Worker init_ifinfomsg, print_ifinfomsg, \
134*cf84ac9aSAndroid Build Coastguard Worker IFLA_INFO_KIND, "IFLA_INFO_KIND", \
135*cf84ac9aSAndroid Build Coastguard Worker tuntype_len, \
136*cf84ac9aSAndroid Build Coastguard Worker objsz_ + (pos - buf) - 1, \
137*cf84ac9aSAndroid Build Coastguard Worker buf, objsz_ + (pos - buf) - 1, \
138*cf84ac9aSAndroid Build Coastguard Worker printf("\"%s\"}", (tuntype_)); \
139*cf84ac9aSAndroid Build Coastguard Worker printf(", {{nla_len=%zu" \
140*cf84ac9aSAndroid Build Coastguard Worker ", nla_type=%s}, ", \
141*cf84ac9aSAndroid Build Coastguard Worker (objsz_) + NLA_HDRLEN, \
142*cf84ac9aSAndroid Build Coastguard Worker (nla_type_str_)); \
143*cf84ac9aSAndroid Build Coastguard Worker (fallback_func_)((obj_), \
144*cf84ac9aSAndroid Build Coastguard Worker (objsz_) - 1); \
145*cf84ac9aSAndroid Build Coastguard Worker printf("}")); \
146*cf84ac9aSAndroid Build Coastguard Worker } \
147*cf84ac9aSAndroid Build Coastguard Worker \
148*cf84ac9aSAndroid Build Coastguard Worker TEST_NLATTR_EX_((fd_), (nlh0_) - NLA_HDRLEN, \
149*cf84ac9aSAndroid Build Coastguard Worker hdrlen + NLA_HDRLEN, \
150*cf84ac9aSAndroid Build Coastguard Worker init_ifinfomsg, print_ifinfomsg, \
151*cf84ac9aSAndroid Build Coastguard Worker IFLA_INFO_KIND, "IFLA_INFO_KIND", \
152*cf84ac9aSAndroid Build Coastguard Worker tuntype_len, objsz_ + (pos - buf), \
153*cf84ac9aSAndroid Build Coastguard Worker buf, objsz_ + (pos - buf) - 1, \
154*cf84ac9aSAndroid Build Coastguard Worker printf("\"%s\"}", (tuntype_)); \
155*cf84ac9aSAndroid Build Coastguard Worker printf(", {{nla_len=%zu, nla_type=%s}, ", \
156*cf84ac9aSAndroid Build Coastguard Worker (objsz_) + NLA_HDRLEN, \
157*cf84ac9aSAndroid Build Coastguard Worker (nla_type_str_)); \
158*cf84ac9aSAndroid Build Coastguard Worker printf("%p}", \
159*cf84ac9aSAndroid Build Coastguard Worker RTA_DATA(NLMSG_ATTR(nlh, \
160*cf84ac9aSAndroid Build Coastguard Worker (hdrlen + NLA_HDRLEN + (pos - buf)))) \
161*cf84ac9aSAndroid Build Coastguard Worker ) \
162*cf84ac9aSAndroid Build Coastguard Worker ); \
163*cf84ac9aSAndroid Build Coastguard Worker \
164*cf84ac9aSAndroid Build Coastguard Worker TEST_NLATTR_EX_((fd_), (nlh0_) - NLA_HDRLEN, \
165*cf84ac9aSAndroid Build Coastguard Worker hdrlen + NLA_HDRLEN, \
166*cf84ac9aSAndroid Build Coastguard Worker init_ifinfomsg, print_ifinfomsg, \
167*cf84ac9aSAndroid Build Coastguard Worker IFLA_INFO_KIND, "IFLA_INFO_KIND", \
168*cf84ac9aSAndroid Build Coastguard Worker tuntype_len, objsz_ + (pos - buf), \
169*cf84ac9aSAndroid Build Coastguard Worker buf, objsz_ + (pos - buf), \
170*cf84ac9aSAndroid Build Coastguard Worker printf("\"%s\"}", (tuntype_)); \
171*cf84ac9aSAndroid Build Coastguard Worker printf(", {{nla_len=%zu, nla_type=%s}, ", \
172*cf84ac9aSAndroid Build Coastguard Worker (objsz_) + NLA_HDRLEN, \
173*cf84ac9aSAndroid Build Coastguard Worker (nla_type_str_)); \
174*cf84ac9aSAndroid Build Coastguard Worker \
175*cf84ac9aSAndroid Build Coastguard Worker { __VA_ARGS__; } \
176*cf84ac9aSAndroid Build Coastguard Worker \
177*cf84ac9aSAndroid Build Coastguard Worker printf("}")); \
178*cf84ac9aSAndroid Build Coastguard Worker } while (0)
179*cf84ac9aSAndroid Build Coastguard Worker
180*cf84ac9aSAndroid Build Coastguard Worker #define TEST_LINKINFO(fd_, nlh0_, nla_type_, tuntype_, \
181*cf84ac9aSAndroid Build Coastguard Worker obj_, pattern_, fallback_func_, ...) \
182*cf84ac9aSAndroid Build Coastguard Worker TEST_LINKINFO_((fd_), (nlh0_), nla_type_, #nla_type_, (tuntype_), \
183*cf84ac9aSAndroid Build Coastguard Worker (obj_), sizeof(obj_), pattern_, fallback_func_, \
184*cf84ac9aSAndroid Build Coastguard Worker __VA_ARGS__)
185*cf84ac9aSAndroid Build Coastguard Worker
186*cf84ac9aSAndroid Build Coastguard Worker #define TEST_NESTED_LINKINFO(fd_, nlh0_, \
187*cf84ac9aSAndroid Build Coastguard Worker nla_type_, nla_type_str_, tuntype_, \
188*cf84ac9aSAndroid Build Coastguard Worker subnla_type_, subnla_type_str_, \
189*cf84ac9aSAndroid Build Coastguard Worker obj_, pattern_, ...) \
190*cf84ac9aSAndroid Build Coastguard Worker do { \
191*cf84ac9aSAndroid Build Coastguard Worker size_t tuntype_len = strlen(tuntype_) + 1; \
192*cf84ac9aSAndroid Build Coastguard Worker struct { \
193*cf84ac9aSAndroid Build Coastguard Worker size_t sz; \
194*cf84ac9aSAndroid Build Coastguard Worker const char *str; \
195*cf84ac9aSAndroid Build Coastguard Worker } attrs[] = { __VA_ARGS__ }; \
196*cf84ac9aSAndroid Build Coastguard Worker size_t tunhdrlen; \
197*cf84ac9aSAndroid Build Coastguard Worker size_t buflen = NLA_ALIGN(tuntype_len) + NLA_HDRLEN; \
198*cf84ac9aSAndroid Build Coastguard Worker size_t attrsz = 0; \
199*cf84ac9aSAndroid Build Coastguard Worker \
200*cf84ac9aSAndroid Build Coastguard Worker for (size_t i = 0; i < ARRAY_SIZE(attrs); i++) \
201*cf84ac9aSAndroid Build Coastguard Worker attrsz += NLA_HDRLEN + NLA_ALIGN(attrs[i].sz); \
202*cf84ac9aSAndroid Build Coastguard Worker \
203*cf84ac9aSAndroid Build Coastguard Worker buflen += attrsz; \
204*cf84ac9aSAndroid Build Coastguard Worker \
205*cf84ac9aSAndroid Build Coastguard Worker char *buf = tail_alloc(buflen); \
206*cf84ac9aSAndroid Build Coastguard Worker char *pos = buf; \
207*cf84ac9aSAndroid Build Coastguard Worker \
208*cf84ac9aSAndroid Build Coastguard Worker struct nlattr nla = { \
209*cf84ac9aSAndroid Build Coastguard Worker .nla_len = NLA_HDRLEN + attrsz, \
210*cf84ac9aSAndroid Build Coastguard Worker .nla_type = (nla_type_), \
211*cf84ac9aSAndroid Build Coastguard Worker }; \
212*cf84ac9aSAndroid Build Coastguard Worker \
213*cf84ac9aSAndroid Build Coastguard Worker memcpy(pos, (tuntype_), tuntype_len); \
214*cf84ac9aSAndroid Build Coastguard Worker pos += NLA_ALIGN(tuntype_len); \
215*cf84ac9aSAndroid Build Coastguard Worker memcpy(pos, &nla, sizeof(nla)); \
216*cf84ac9aSAndroid Build Coastguard Worker pos += sizeof(nla); \
217*cf84ac9aSAndroid Build Coastguard Worker \
218*cf84ac9aSAndroid Build Coastguard Worker tunhdrlen = pos - buf; \
219*cf84ac9aSAndroid Build Coastguard Worker \
220*cf84ac9aSAndroid Build Coastguard Worker nla.nla_type = subnla_type_; \
221*cf84ac9aSAndroid Build Coastguard Worker \
222*cf84ac9aSAndroid Build Coastguard Worker for (size_t i = 0; i < ARRAY_SIZE(attrs); i++) { \
223*cf84ac9aSAndroid Build Coastguard Worker nla.nla_len = NLA_HDRLEN + attrs[i].sz; \
224*cf84ac9aSAndroid Build Coastguard Worker memcpy(pos, &nla, sizeof(nla)); \
225*cf84ac9aSAndroid Build Coastguard Worker pos += sizeof(nla); \
226*cf84ac9aSAndroid Build Coastguard Worker \
227*cf84ac9aSAndroid Build Coastguard Worker memcpy(pos, &(obj_), MIN(sizeof(obj_), attrs[i].sz)); \
228*cf84ac9aSAndroid Build Coastguard Worker \
229*cf84ac9aSAndroid Build Coastguard Worker if (attrs[i].sz > sizeof(obj_)) \
230*cf84ac9aSAndroid Build Coastguard Worker memcpy(pos + sizeof(obj_), \
231*cf84ac9aSAndroid Build Coastguard Worker &(pattern_), \
232*cf84ac9aSAndroid Build Coastguard Worker attrs[i].sz - sizeof(obj_)); \
233*cf84ac9aSAndroid Build Coastguard Worker \
234*cf84ac9aSAndroid Build Coastguard Worker pos += NLA_ALIGN(attrs[i].sz); \
235*cf84ac9aSAndroid Build Coastguard Worker } \
236*cf84ac9aSAndroid Build Coastguard Worker \
237*cf84ac9aSAndroid Build Coastguard Worker TEST_NLATTR_EX_((fd_), (nlh0_) - hdrlen - tunhdrlen, \
238*cf84ac9aSAndroid Build Coastguard Worker hdrlen + NLA_HDRLEN, \
239*cf84ac9aSAndroid Build Coastguard Worker init_ifinfomsg, print_ifinfomsg, \
240*cf84ac9aSAndroid Build Coastguard Worker IFLA_INFO_KIND, "IFLA_INFO_KIND", \
241*cf84ac9aSAndroid Build Coastguard Worker tuntype_len, buflen, \
242*cf84ac9aSAndroid Build Coastguard Worker buf, buflen, \
243*cf84ac9aSAndroid Build Coastguard Worker printf("\"%s\"}", (tuntype_)); \
244*cf84ac9aSAndroid Build Coastguard Worker printf(", {{nla_len=%zu, nla_type=%s}, [", \
245*cf84ac9aSAndroid Build Coastguard Worker attrsz + NLA_HDRLEN, \
246*cf84ac9aSAndroid Build Coastguard Worker (nla_type_str_)); \
247*cf84ac9aSAndroid Build Coastguard Worker \
248*cf84ac9aSAndroid Build Coastguard Worker for (size_t i = 0; i < ARRAY_SIZE(attrs); i++) \
249*cf84ac9aSAndroid Build Coastguard Worker printf("%s%s{nla_len=%zu" \
250*cf84ac9aSAndroid Build Coastguard Worker ", nla_type=%s}%s%s%s", \
251*cf84ac9aSAndroid Build Coastguard Worker i ? ", " : "", \
252*cf84ac9aSAndroid Build Coastguard Worker attrs[i].str ? "{": "", \
253*cf84ac9aSAndroid Build Coastguard Worker attrs[i].sz + NLA_HDRLEN, \
254*cf84ac9aSAndroid Build Coastguard Worker subnla_type_str_, \
255*cf84ac9aSAndroid Build Coastguard Worker attrs[i].str ? ", ": "", \
256*cf84ac9aSAndroid Build Coastguard Worker attrs[i].str ?: "", \
257*cf84ac9aSAndroid Build Coastguard Worker attrs[i].str ? "}" : ""); \
258*cf84ac9aSAndroid Build Coastguard Worker \
259*cf84ac9aSAndroid Build Coastguard Worker printf("]}")); \
260*cf84ac9aSAndroid Build Coastguard Worker } while (0)
261*cf84ac9aSAndroid Build Coastguard Worker
262*cf84ac9aSAndroid Build Coastguard Worker int
main(void)263*cf84ac9aSAndroid Build Coastguard Worker main(void)
264*cf84ac9aSAndroid Build Coastguard Worker {
265*cf84ac9aSAndroid Build Coastguard Worker static const uint8_t unknown_msg[] = { 0xab, 0xac, 0xdb, 0xcd };
266*cf84ac9aSAndroid Build Coastguard Worker static const char *unsupported_tunnel_types[] = {
267*cf84ac9aSAndroid Build Coastguard Worker "batadv", "bond",
268*cf84ac9aSAndroid Build Coastguard Worker "caif", "cfhsi",
269*cf84ac9aSAndroid Build Coastguard Worker "dummy",
270*cf84ac9aSAndroid Build Coastguard Worker "erspan",
271*cf84ac9aSAndroid Build Coastguard Worker "geneve", "gre", "gretap", "gtp",
272*cf84ac9aSAndroid Build Coastguard Worker "hsr",
273*cf84ac9aSAndroid Build Coastguard Worker "ifb", "ip6erspan", "ip6gre", "ip6gretap", "ip6tnl",
274*cf84ac9aSAndroid Build Coastguard Worker "ipip", "ipoib", "ipvlan", "ipvtap",
275*cf84ac9aSAndroid Build Coastguard Worker "lowpan",
276*cf84ac9aSAndroid Build Coastguard Worker "macsec", "macvlan", "macvtap",
277*cf84ac9aSAndroid Build Coastguard Worker "netdevsim", "nlmon",
278*cf84ac9aSAndroid Build Coastguard Worker "openvswitch",
279*cf84ac9aSAndroid Build Coastguard Worker "ppp",
280*cf84ac9aSAndroid Build Coastguard Worker "rmnet",
281*cf84ac9aSAndroid Build Coastguard Worker "sit",
282*cf84ac9aSAndroid Build Coastguard Worker "team",
283*cf84ac9aSAndroid Build Coastguard Worker "vcan", "veth", "vlan", "vrf", "vsockmon",
284*cf84ac9aSAndroid Build Coastguard Worker "vti", "vti6", "vxcan", "vxlan",
285*cf84ac9aSAndroid Build Coastguard Worker NULL
286*cf84ac9aSAndroid Build Coastguard Worker };
287*cf84ac9aSAndroid Build Coastguard Worker static const char *unsupported_xstats_types[] = {
288*cf84ac9aSAndroid Build Coastguard Worker "bridge",
289*cf84ac9aSAndroid Build Coastguard Worker "tun",
290*cf84ac9aSAndroid Build Coastguard Worker NULL
291*cf84ac9aSAndroid Build Coastguard Worker };
292*cf84ac9aSAndroid Build Coastguard Worker static const char *unsupported_data_types[] = {
293*cf84ac9aSAndroid Build Coastguard Worker "can",
294*cf84ac9aSAndroid Build Coastguard Worker NULL
295*cf84ac9aSAndroid Build Coastguard Worker };
296*cf84ac9aSAndroid Build Coastguard Worker
297*cf84ac9aSAndroid Build Coastguard Worker skip_if_unavailable("/proc/self/fd/");
298*cf84ac9aSAndroid Build Coastguard Worker
299*cf84ac9aSAndroid Build Coastguard Worker const int fd = create_nl_socket(NETLINK_ROUTE);
300*cf84ac9aSAndroid Build Coastguard Worker
301*cf84ac9aSAndroid Build Coastguard Worker const unsigned int hdrlen = sizeof(struct ifinfomsg);
302*cf84ac9aSAndroid Build Coastguard Worker void *nlh0 = midtail_alloc(NLMSG_SPACE(hdrlen), 2 * NLA_HDRLEN + 256);
303*cf84ac9aSAndroid Build Coastguard Worker
304*cf84ac9aSAndroid Build Coastguard Worker static char pattern[4096];
305*cf84ac9aSAndroid Build Coastguard Worker fill_memory_ex(pattern, sizeof(pattern), 'a', 'z' - 'a' + 1);
306*cf84ac9aSAndroid Build Coastguard Worker
307*cf84ac9aSAndroid Build Coastguard Worker
308*cf84ac9aSAndroid Build Coastguard Worker /* unknown AF_INFO_* type */
309*cf84ac9aSAndroid Build Coastguard Worker TEST_NESTED_NLATTR_OBJECT(fd, nlh0, hdrlen,
310*cf84ac9aSAndroid Build Coastguard Worker init_ifinfomsg, print_ifinfomsg,
311*cf84ac9aSAndroid Build Coastguard Worker IFLA_INFO_UNSPEC, pattern, unknown_msg,
312*cf84ac9aSAndroid Build Coastguard Worker printf("\"\\xab\\xac\\xdb\\xcd\""));
313*cf84ac9aSAndroid Build Coastguard Worker
314*cf84ac9aSAndroid Build Coastguard Worker TEST_NESTED_NLATTR_OBJECT_EX_(fd, nlh0, hdrlen,
315*cf84ac9aSAndroid Build Coastguard Worker init_ifinfomsg, print_ifinfomsg,
316*cf84ac9aSAndroid Build Coastguard Worker 6, "0x6 /* IFLA_INFO_??? */", pattern,
317*cf84ac9aSAndroid Build Coastguard Worker unknown_msg, print_quoted_hex, 1,
318*cf84ac9aSAndroid Build Coastguard Worker printf("\"\\xab\\xac\\xdb\\xcd\""));
319*cf84ac9aSAndroid Build Coastguard Worker
320*cf84ac9aSAndroid Build Coastguard Worker
321*cf84ac9aSAndroid Build Coastguard Worker /* IFLA_INFO_KIND */
322*cf84ac9aSAndroid Build Coastguard Worker TEST_NESTED_NLATTR_OBJECT_EX_(fd, nlh0, hdrlen,
323*cf84ac9aSAndroid Build Coastguard Worker init_ifinfomsg, print_ifinfomsg,
324*cf84ac9aSAndroid Build Coastguard Worker IFLA_INFO_KIND, "IFLA_INFO_KIND", pattern,
325*cf84ac9aSAndroid Build Coastguard Worker unknown_msg, print_quoted_stringn, 1,
326*cf84ac9aSAndroid Build Coastguard Worker printf("\"\\253\\254\\333\\315\"..."));
327*cf84ac9aSAndroid Build Coastguard Worker
328*cf84ac9aSAndroid Build Coastguard Worker
329*cf84ac9aSAndroid Build Coastguard Worker /* IFLA_INFO_KIND + IFLA_INFO_UNSPEC */
330*cf84ac9aSAndroid Build Coastguard Worker TEST_UNKNOWN_TUNNELS(fd, nlh0, IFLA_INFO_UNSPEC, "IFLA_INFO_UNSPEC",
331*cf84ac9aSAndroid Build Coastguard Worker unknown_msg, sizeof(unknown_msg),
332*cf84ac9aSAndroid Build Coastguard Worker {unsupported_tunnel_types COMMA
333*cf84ac9aSAndroid Build Coastguard Worker unsupported_xstats_types COMMA
334*cf84ac9aSAndroid Build Coastguard Worker unsupported_data_types COMMA
335*cf84ac9aSAndroid Build Coastguard Worker NULL},
336*cf84ac9aSAndroid Build Coastguard Worker printf("\"\\xab\\xac\\xdb\\xcd\""));
337*cf84ac9aSAndroid Build Coastguard Worker
338*cf84ac9aSAndroid Build Coastguard Worker
339*cf84ac9aSAndroid Build Coastguard Worker /* IFLA_INFO_KIND + IFLA_INFO_KIND */
340*cf84ac9aSAndroid Build Coastguard Worker TEST_UNKNOWN_TUNNELS(fd, nlh0, IFLA_INFO_KIND, "IFLA_INFO_KIND",
341*cf84ac9aSAndroid Build Coastguard Worker unknown_msg, sizeof(unknown_msg),
342*cf84ac9aSAndroid Build Coastguard Worker {unsupported_tunnel_types COMMA
343*cf84ac9aSAndroid Build Coastguard Worker unsupported_xstats_types COMMA
344*cf84ac9aSAndroid Build Coastguard Worker unsupported_data_types COMMA
345*cf84ac9aSAndroid Build Coastguard Worker NULL},
346*cf84ac9aSAndroid Build Coastguard Worker printf("\"\\253\\254\\333\\315\"..."));
347*cf84ac9aSAndroid Build Coastguard Worker
348*cf84ac9aSAndroid Build Coastguard Worker
349*cf84ac9aSAndroid Build Coastguard Worker /* IFLA_INFO_KIND + IFLA_INFO_DATA */
350*cf84ac9aSAndroid Build Coastguard Worker TEST_UNKNOWN_TUNNELS(fd, nlh0, IFLA_INFO_DATA, "IFLA_INFO_DATA",
351*cf84ac9aSAndroid Build Coastguard Worker unknown_msg, sizeof(unknown_msg),
352*cf84ac9aSAndroid Build Coastguard Worker {unsupported_tunnel_types COMMA
353*cf84ac9aSAndroid Build Coastguard Worker unsupported_data_types COMMA
354*cf84ac9aSAndroid Build Coastguard Worker NULL},
355*cf84ac9aSAndroid Build Coastguard Worker printf("\"\\xab\\xac\\xdb\\xcd\""));
356*cf84ac9aSAndroid Build Coastguard Worker
357*cf84ac9aSAndroid Build Coastguard Worker struct val_name {
358*cf84ac9aSAndroid Build Coastguard Worker unsigned int val;
359*cf84ac9aSAndroid Build Coastguard Worker const char *name;
360*cf84ac9aSAndroid Build Coastguard Worker };
361*cf84ac9aSAndroid Build Coastguard Worker
362*cf84ac9aSAndroid Build Coastguard Worker static const uint64_t u64_val = 0xdeadc0defacefeedULL;
363*cf84ac9aSAndroid Build Coastguard Worker static const uint32_t u32_val = 0xbadc0dedU;
364*cf84ac9aSAndroid Build Coastguard Worker static const uint16_t u16_val = 0xdeed;
365*cf84ac9aSAndroid Build Coastguard Worker static const uint8_t u8_val = 0xa1;
366*cf84ac9aSAndroid Build Coastguard Worker
367*cf84ac9aSAndroid Build Coastguard Worker /* bridge attrs */
368*cf84ac9aSAndroid Build Coastguard Worker static const struct val_name und_br_attrs[] = {
369*cf84ac9aSAndroid Build Coastguard Worker { 0, "IFLA_BR_UNSPEC" },
370*cf84ac9aSAndroid Build Coastguard Worker { 20, "IFLA_BR_GROUP_ADDR" },
371*cf84ac9aSAndroid Build Coastguard Worker { 21, "IFLA_BR_FDB_FLUSH" },
372*cf84ac9aSAndroid Build Coastguard Worker { 40, "IFLA_BR_PAD" },
373*cf84ac9aSAndroid Build Coastguard Worker { 45, "0x2d /* IFLA_BR_??? */" },
374*cf84ac9aSAndroid Build Coastguard Worker };
375*cf84ac9aSAndroid Build Coastguard Worker
376*cf84ac9aSAndroid Build Coastguard Worker for (size_t k = 0; k < ARRAY_SIZE(und_br_attrs); k++) {
377*cf84ac9aSAndroid Build Coastguard Worker TEST_NESTED_LINKINFO(fd, nlh0, 2, "IFLA_INFO_DATA", "bridge",
378*cf84ac9aSAndroid Build Coastguard Worker und_br_attrs[k].val, und_br_attrs[k].name,
379*cf84ac9aSAndroid Build Coastguard Worker unknown_msg, pattern,
380*cf84ac9aSAndroid Build Coastguard Worker { 2, "\"\\xab\\xac\"" },
381*cf84ac9aSAndroid Build Coastguard Worker { 4, "\"\\xab\\xac\\xdb\\xcd\"" },
382*cf84ac9aSAndroid Build Coastguard Worker { 6,
383*cf84ac9aSAndroid Build Coastguard Worker "\"\\xab\\xac\\xdb\\xcd\\x61\\x62\"" },
384*cf84ac9aSAndroid Build Coastguard Worker { 8, "\"\\xab\\xac\\xdb\\xcd\\x61\\x62"
385*cf84ac9aSAndroid Build Coastguard Worker "\\x63\\x64\"" },
386*cf84ac9aSAndroid Build Coastguard Worker { 10, "\"\\xab\\xac\\xdb\\xcd\\x61\\x62"
387*cf84ac9aSAndroid Build Coastguard Worker "\\x63\\x64\\x65\\x66\"" });
388*cf84ac9aSAndroid Build Coastguard Worker }
389*cf84ac9aSAndroid Build Coastguard Worker
390*cf84ac9aSAndroid Build Coastguard Worker static const struct val_name u64_br_attrs[] = {
391*cf84ac9aSAndroid Build Coastguard Worker { 16, "IFLA_BR_HELLO_TIMER" },
392*cf84ac9aSAndroid Build Coastguard Worker { 17, "IFLA_BR_TCN_TIMER" },
393*cf84ac9aSAndroid Build Coastguard Worker { 18, "IFLA_BR_TOPOLOGY_CHANGE_TIMER" },
394*cf84ac9aSAndroid Build Coastguard Worker { 19, "IFLA_BR_GC_TIMER" },
395*cf84ac9aSAndroid Build Coastguard Worker { 30, "IFLA_BR_MCAST_LAST_MEMBER_INTVL" },
396*cf84ac9aSAndroid Build Coastguard Worker { 31, "IFLA_BR_MCAST_MEMBERSHIP_INTVL" },
397*cf84ac9aSAndroid Build Coastguard Worker { 32, "IFLA_BR_MCAST_QUERIER_INTVL" },
398*cf84ac9aSAndroid Build Coastguard Worker { 33, "IFLA_BR_MCAST_QUERY_INTVL" },
399*cf84ac9aSAndroid Build Coastguard Worker { 34, "IFLA_BR_MCAST_QUERY_RESPONSE_INTVL" },
400*cf84ac9aSAndroid Build Coastguard Worker { 35, "IFLA_BR_MCAST_STARTUP_QUERY_INTVL" },
401*cf84ac9aSAndroid Build Coastguard Worker };
402*cf84ac9aSAndroid Build Coastguard Worker
403*cf84ac9aSAndroid Build Coastguard Worker for (size_t k = 0; k < ARRAY_SIZE(u64_br_attrs); k++) {
404*cf84ac9aSAndroid Build Coastguard Worker TEST_NESTED_LINKINFO(fd, nlh0, 2, "IFLA_INFO_DATA", "bridge",
405*cf84ac9aSAndroid Build Coastguard Worker u64_br_attrs[k].val, u64_br_attrs[k].name,
406*cf84ac9aSAndroid Build Coastguard Worker u64_val, pattern,
407*cf84ac9aSAndroid Build Coastguard Worker { 7, "\""
408*cf84ac9aSAndroid Build Coastguard Worker #if WORDS_BIGENDIAN
409*cf84ac9aSAndroid Build Coastguard Worker "\\xde\\xad\\xc0\\xde\\xfa\\xce\\xfe"
410*cf84ac9aSAndroid Build Coastguard Worker #else
411*cf84ac9aSAndroid Build Coastguard Worker "\\xed\\xfe\\xce\\xfa\\xde\\xc0\\xad"
412*cf84ac9aSAndroid Build Coastguard Worker #endif
413*cf84ac9aSAndroid Build Coastguard Worker "\"" },
414*cf84ac9aSAndroid Build Coastguard Worker { 8, "16045693111314087661" },
415*cf84ac9aSAndroid Build Coastguard Worker { 9, "16045693111314087661" });
416*cf84ac9aSAndroid Build Coastguard Worker }
417*cf84ac9aSAndroid Build Coastguard Worker
418*cf84ac9aSAndroid Build Coastguard Worker static const struct val_name u32_br_attrs[] = {
419*cf84ac9aSAndroid Build Coastguard Worker { 1, "IFLA_BR_FORWARD_DELAY" },
420*cf84ac9aSAndroid Build Coastguard Worker { 2, "IFLA_BR_HELLO_TIME" },
421*cf84ac9aSAndroid Build Coastguard Worker { 3, "IFLA_BR_MAX_AGE" },
422*cf84ac9aSAndroid Build Coastguard Worker { 4, "IFLA_BR_AGEING_TIME" },
423*cf84ac9aSAndroid Build Coastguard Worker { 5, "IFLA_BR_STP_STATE" },
424*cf84ac9aSAndroid Build Coastguard Worker { 13, "IFLA_BR_ROOT_PATH_COST" },
425*cf84ac9aSAndroid Build Coastguard Worker { 26, "IFLA_BR_MCAST_HASH_ELASTICITY" },
426*cf84ac9aSAndroid Build Coastguard Worker { 27, "IFLA_BR_MCAST_HASH_MAX" },
427*cf84ac9aSAndroid Build Coastguard Worker { 28, "IFLA_BR_MCAST_LAST_MEMBER_CNT" },
428*cf84ac9aSAndroid Build Coastguard Worker { 29, "IFLA_BR_MCAST_STARTUP_QUERY_CNT" },
429*cf84ac9aSAndroid Build Coastguard Worker };
430*cf84ac9aSAndroid Build Coastguard Worker
431*cf84ac9aSAndroid Build Coastguard Worker for (size_t k = 0; k < ARRAY_SIZE(u32_br_attrs); k++) {
432*cf84ac9aSAndroid Build Coastguard Worker TEST_NESTED_LINKINFO(fd, nlh0, 2, "IFLA_INFO_DATA", "bridge",
433*cf84ac9aSAndroid Build Coastguard Worker u32_br_attrs[k].val, u32_br_attrs[k].name,
434*cf84ac9aSAndroid Build Coastguard Worker u32_val, pattern,
435*cf84ac9aSAndroid Build Coastguard Worker { 3, "\""
436*cf84ac9aSAndroid Build Coastguard Worker #if WORDS_BIGENDIAN
437*cf84ac9aSAndroid Build Coastguard Worker "\\xba\\xdc\\x0d"
438*cf84ac9aSAndroid Build Coastguard Worker #else
439*cf84ac9aSAndroid Build Coastguard Worker "\\xed\\x0d\\xdc"
440*cf84ac9aSAndroid Build Coastguard Worker #endif
441*cf84ac9aSAndroid Build Coastguard Worker "\"" },
442*cf84ac9aSAndroid Build Coastguard Worker { 4, "3134983661" },
443*cf84ac9aSAndroid Build Coastguard Worker { 5, "3134983661" });
444*cf84ac9aSAndroid Build Coastguard Worker }
445*cf84ac9aSAndroid Build Coastguard Worker
446*cf84ac9aSAndroid Build Coastguard Worker static const struct val_name u16_br_attrs[] = {
447*cf84ac9aSAndroid Build Coastguard Worker { 6, "IFLA_BR_PRIORITY" },
448*cf84ac9aSAndroid Build Coastguard Worker { 12, "IFLA_BR_ROOT_PORT" },
449*cf84ac9aSAndroid Build Coastguard Worker { 39, "IFLA_BR_VLAN_DEFAULT_PVID" },
450*cf84ac9aSAndroid Build Coastguard Worker };
451*cf84ac9aSAndroid Build Coastguard Worker
452*cf84ac9aSAndroid Build Coastguard Worker for (size_t k = 0; k < ARRAY_SIZE(u16_br_attrs); k++) {
453*cf84ac9aSAndroid Build Coastguard Worker TEST_NESTED_LINKINFO(fd, nlh0, 2, "IFLA_INFO_DATA", "bridge",
454*cf84ac9aSAndroid Build Coastguard Worker u16_br_attrs[k].val, u16_br_attrs[k].name,
455*cf84ac9aSAndroid Build Coastguard Worker u16_val, pattern,
456*cf84ac9aSAndroid Build Coastguard Worker { 1, "\""
457*cf84ac9aSAndroid Build Coastguard Worker #if WORDS_BIGENDIAN
458*cf84ac9aSAndroid Build Coastguard Worker "\\xde"
459*cf84ac9aSAndroid Build Coastguard Worker #else
460*cf84ac9aSAndroid Build Coastguard Worker "\\xed"
461*cf84ac9aSAndroid Build Coastguard Worker #endif
462*cf84ac9aSAndroid Build Coastguard Worker "\"" },
463*cf84ac9aSAndroid Build Coastguard Worker { 2, "57069" },
464*cf84ac9aSAndroid Build Coastguard Worker { 3, "57069" });
465*cf84ac9aSAndroid Build Coastguard Worker }
466*cf84ac9aSAndroid Build Coastguard Worker
467*cf84ac9aSAndroid Build Coastguard Worker
468*cf84ac9aSAndroid Build Coastguard Worker static const struct val_name x16_br_attrs[] = {
469*cf84ac9aSAndroid Build Coastguard Worker { 9, "IFLA_BR_GROUP_FWD_MASK" },
470*cf84ac9aSAndroid Build Coastguard Worker };
471*cf84ac9aSAndroid Build Coastguard Worker
472*cf84ac9aSAndroid Build Coastguard Worker for (size_t k = 0; k < ARRAY_SIZE(x16_br_attrs); k++) {
473*cf84ac9aSAndroid Build Coastguard Worker TEST_NESTED_LINKINFO(fd, nlh0, 2, "IFLA_INFO_DATA", "bridge",
474*cf84ac9aSAndroid Build Coastguard Worker x16_br_attrs[k].val, x16_br_attrs[k].name,
475*cf84ac9aSAndroid Build Coastguard Worker u16_val, pattern,
476*cf84ac9aSAndroid Build Coastguard Worker { 1, "\""
477*cf84ac9aSAndroid Build Coastguard Worker #if WORDS_BIGENDIAN
478*cf84ac9aSAndroid Build Coastguard Worker "\\xde"
479*cf84ac9aSAndroid Build Coastguard Worker #else
480*cf84ac9aSAndroid Build Coastguard Worker "\\xed"
481*cf84ac9aSAndroid Build Coastguard Worker #endif
482*cf84ac9aSAndroid Build Coastguard Worker "\"" },
483*cf84ac9aSAndroid Build Coastguard Worker { 2, "0xdeed" },
484*cf84ac9aSAndroid Build Coastguard Worker { 3, "0xdeed" });
485*cf84ac9aSAndroid Build Coastguard Worker }
486*cf84ac9aSAndroid Build Coastguard Worker
487*cf84ac9aSAndroid Build Coastguard Worker static const struct val_name u8_br_attrs[] = {
488*cf84ac9aSAndroid Build Coastguard Worker { 7, "IFLA_BR_VLAN_FILTERING" },
489*cf84ac9aSAndroid Build Coastguard Worker { 14, "IFLA_BR_TOPOLOGY_CHANGE" },
490*cf84ac9aSAndroid Build Coastguard Worker { 15, "IFLA_BR_TOPOLOGY_CHANGE_DETECTED" },
491*cf84ac9aSAndroid Build Coastguard Worker { 22, "IFLA_BR_MCAST_ROUTER" },
492*cf84ac9aSAndroid Build Coastguard Worker { 23, "IFLA_BR_MCAST_SNOOPING" },
493*cf84ac9aSAndroid Build Coastguard Worker { 24, "IFLA_BR_MCAST_QUERY_USE_IFADDR" },
494*cf84ac9aSAndroid Build Coastguard Worker { 25, "IFLA_BR_MCAST_QUERIER" },
495*cf84ac9aSAndroid Build Coastguard Worker { 36, "IFLA_BR_NF_CALL_IPTABLES" },
496*cf84ac9aSAndroid Build Coastguard Worker { 37, "IFLA_BR_NF_CALL_IP6TABLES" },
497*cf84ac9aSAndroid Build Coastguard Worker { 38, "IFLA_BR_NF_CALL_ARPTABLES" },
498*cf84ac9aSAndroid Build Coastguard Worker { 41, "IFLA_BR_VLAN_STATS_ENABLED" },
499*cf84ac9aSAndroid Build Coastguard Worker { 42, "IFLA_BR_MCAST_STATS_ENABLED" },
500*cf84ac9aSAndroid Build Coastguard Worker { 43, "IFLA_BR_MCAST_IGMP_VERSION" },
501*cf84ac9aSAndroid Build Coastguard Worker { 44, "IFLA_BR_MCAST_MLD_VERSION" },
502*cf84ac9aSAndroid Build Coastguard Worker };
503*cf84ac9aSAndroid Build Coastguard Worker
504*cf84ac9aSAndroid Build Coastguard Worker for (size_t k = 0; k < ARRAY_SIZE(u8_br_attrs); k++) {
505*cf84ac9aSAndroid Build Coastguard Worker TEST_NESTED_LINKINFO(fd, nlh0, 2, "IFLA_INFO_DATA", "bridge",
506*cf84ac9aSAndroid Build Coastguard Worker u8_br_attrs[k].val, u8_br_attrs[k].name,
507*cf84ac9aSAndroid Build Coastguard Worker u8_val, pattern,
508*cf84ac9aSAndroid Build Coastguard Worker { 0, NULL },
509*cf84ac9aSAndroid Build Coastguard Worker { 1, "161" },
510*cf84ac9aSAndroid Build Coastguard Worker { 2, "161" });
511*cf84ac9aSAndroid Build Coastguard Worker }
512*cf84ac9aSAndroid Build Coastguard Worker
513*cf84ac9aSAndroid Build Coastguard Worker unsigned short eth_p = htons(0x88C7);
514*cf84ac9aSAndroid Build Coastguard Worker TEST_NESTED_LINKINFO(fd, nlh0, 2, "IFLA_INFO_DATA", "bridge",
515*cf84ac9aSAndroid Build Coastguard Worker 8, "IFLA_BR_VLAN_PROTOCOL",
516*cf84ac9aSAndroid Build Coastguard Worker eth_p, pattern,
517*cf84ac9aSAndroid Build Coastguard Worker { 1, "\"\\x88\"" },
518*cf84ac9aSAndroid Build Coastguard Worker { 2, "htons(ETH_P_PREAUTH)" },
519*cf84ac9aSAndroid Build Coastguard Worker { 2, "htons(ETH_P_PREAUTH)" });
520*cf84ac9aSAndroid Build Coastguard Worker
521*cf84ac9aSAndroid Build Coastguard Worker static const uint8_t bridge_id[]
522*cf84ac9aSAndroid Build Coastguard Worker = { 0xbe, 0xef, 0xfa, 0xce, 0xde, 0xc0, 0xde, 0xad };
523*cf84ac9aSAndroid Build Coastguard Worker static const struct val_name br_id_attrs[] = {
524*cf84ac9aSAndroid Build Coastguard Worker { 10, "IFLA_BR_ROOT_ID" },
525*cf84ac9aSAndroid Build Coastguard Worker { 11, "IFLA_BR_BRIDGE_ID" },
526*cf84ac9aSAndroid Build Coastguard Worker };
527*cf84ac9aSAndroid Build Coastguard Worker
528*cf84ac9aSAndroid Build Coastguard Worker for (size_t k = 0; k < ARRAY_SIZE(br_id_attrs); k++) {
529*cf84ac9aSAndroid Build Coastguard Worker TEST_NESTED_LINKINFO(fd, nlh0, 2, "IFLA_INFO_DATA", "bridge",
530*cf84ac9aSAndroid Build Coastguard Worker br_id_attrs[k].val, br_id_attrs[k].name,
531*cf84ac9aSAndroid Build Coastguard Worker bridge_id, pattern,
532*cf84ac9aSAndroid Build Coastguard Worker { 7, "\"\\xbe\\xef\\xfa\\xce"
533*cf84ac9aSAndroid Build Coastguard Worker "\\xde\\xc0\\xde\"" },
534*cf84ac9aSAndroid Build Coastguard Worker { 8, "{prio=[190, 239]"
535*cf84ac9aSAndroid Build Coastguard Worker ", addr=fa:ce:de:c0:de:ad}" },
536*cf84ac9aSAndroid Build Coastguard Worker { 9, "{prio=[190, 239]"
537*cf84ac9aSAndroid Build Coastguard Worker ", addr=fa:ce:de:c0:de:ad}" });
538*cf84ac9aSAndroid Build Coastguard Worker }
539*cf84ac9aSAndroid Build Coastguard Worker
540*cf84ac9aSAndroid Build Coastguard Worker /* tun attrs */
541*cf84ac9aSAndroid Build Coastguard Worker static const struct val_name u8_tun_attrs[] = {
542*cf84ac9aSAndroid Build Coastguard Worker { 4, "IFLA_TUN_PI" },
543*cf84ac9aSAndroid Build Coastguard Worker { 5, "IFLA_TUN_VNET_HDR" },
544*cf84ac9aSAndroid Build Coastguard Worker { 6, "IFLA_TUN_PERSIST" },
545*cf84ac9aSAndroid Build Coastguard Worker { 7, "IFLA_TUN_MULTI_QUEUE" },
546*cf84ac9aSAndroid Build Coastguard Worker };
547*cf84ac9aSAndroid Build Coastguard Worker
548*cf84ac9aSAndroid Build Coastguard Worker for (size_t k = 0; k < ARRAY_SIZE(u8_tun_attrs); k++) {
549*cf84ac9aSAndroid Build Coastguard Worker TEST_NESTED_LINKINFO(fd, nlh0, 2, "IFLA_INFO_DATA", "tun",
550*cf84ac9aSAndroid Build Coastguard Worker u8_tun_attrs[k].val, u8_tun_attrs[k].name,
551*cf84ac9aSAndroid Build Coastguard Worker u8_val, pattern,
552*cf84ac9aSAndroid Build Coastguard Worker { 0, NULL },
553*cf84ac9aSAndroid Build Coastguard Worker { 1, "161" },
554*cf84ac9aSAndroid Build Coastguard Worker { 2, "161" });
555*cf84ac9aSAndroid Build Coastguard Worker }
556*cf84ac9aSAndroid Build Coastguard Worker
557*cf84ac9aSAndroid Build Coastguard Worker static const struct val_name u32_tun_attrs[] = {
558*cf84ac9aSAndroid Build Coastguard Worker { 8, "IFLA_TUN_NUM_QUEUES" },
559*cf84ac9aSAndroid Build Coastguard Worker { 9, "IFLA_TUN_NUM_DISABLED_QUEUES" },
560*cf84ac9aSAndroid Build Coastguard Worker };
561*cf84ac9aSAndroid Build Coastguard Worker
562*cf84ac9aSAndroid Build Coastguard Worker for (size_t k = 0; k < ARRAY_SIZE(u32_tun_attrs); k++) {
563*cf84ac9aSAndroid Build Coastguard Worker TEST_NESTED_LINKINFO(fd, nlh0, 2, "IFLA_INFO_DATA", "tun",
564*cf84ac9aSAndroid Build Coastguard Worker u32_tun_attrs[k].val,
565*cf84ac9aSAndroid Build Coastguard Worker u32_tun_attrs[k].name,
566*cf84ac9aSAndroid Build Coastguard Worker u32_val, pattern,
567*cf84ac9aSAndroid Build Coastguard Worker { 3, "\""
568*cf84ac9aSAndroid Build Coastguard Worker #if WORDS_BIGENDIAN
569*cf84ac9aSAndroid Build Coastguard Worker "\\xba\\xdc\\x0d"
570*cf84ac9aSAndroid Build Coastguard Worker #else
571*cf84ac9aSAndroid Build Coastguard Worker "\\xed\\x0d\\xdc"
572*cf84ac9aSAndroid Build Coastguard Worker #endif
573*cf84ac9aSAndroid Build Coastguard Worker "\"" },
574*cf84ac9aSAndroid Build Coastguard Worker { 4, "3134983661" },
575*cf84ac9aSAndroid Build Coastguard Worker { 5, "3134983661" });
576*cf84ac9aSAndroid Build Coastguard Worker }
577*cf84ac9aSAndroid Build Coastguard Worker
578*cf84ac9aSAndroid Build Coastguard Worker static const struct val_name und_tun_attrs[] = {
579*cf84ac9aSAndroid Build Coastguard Worker { 0, "IFLA_TUN_UNSPEC" },
580*cf84ac9aSAndroid Build Coastguard Worker { 10, "0xa /* IFLA_TUN_??? */" },
581*cf84ac9aSAndroid Build Coastguard Worker };
582*cf84ac9aSAndroid Build Coastguard Worker
583*cf84ac9aSAndroid Build Coastguard Worker for (size_t k = 0; k < ARRAY_SIZE(und_tun_attrs); k++) {
584*cf84ac9aSAndroid Build Coastguard Worker TEST_NESTED_LINKINFO(fd, nlh0, 2, "IFLA_INFO_DATA", "tun",
585*cf84ac9aSAndroid Build Coastguard Worker und_tun_attrs[k].val,
586*cf84ac9aSAndroid Build Coastguard Worker und_tun_attrs[k].name,
587*cf84ac9aSAndroid Build Coastguard Worker unknown_msg, pattern,
588*cf84ac9aSAndroid Build Coastguard Worker { 2, "\"\\xab\\xac\"" },
589*cf84ac9aSAndroid Build Coastguard Worker { 4, "\"\\xab\\xac\\xdb\\xcd\"" },
590*cf84ac9aSAndroid Build Coastguard Worker { 6,
591*cf84ac9aSAndroid Build Coastguard Worker "\"\\xab\\xac\\xdb\\xcd\\x61\\x62\"" },
592*cf84ac9aSAndroid Build Coastguard Worker { 8, "\"\\xab\\xac\\xdb\\xcd\\x61\\x62"
593*cf84ac9aSAndroid Build Coastguard Worker "\\x63\\x64\"" },
594*cf84ac9aSAndroid Build Coastguard Worker { 10, "\"\\xab\\xac\\xdb\\xcd\\x61\\x62"
595*cf84ac9aSAndroid Build Coastguard Worker "\\x63\\x64\\x65\\x66\"" });
596*cf84ac9aSAndroid Build Coastguard Worker }
597*cf84ac9aSAndroid Build Coastguard Worker
598*cf84ac9aSAndroid Build Coastguard Worker static const uint32_t minus_one = 0xffffffffU;
599*cf84ac9aSAndroid Build Coastguard Worker static const struct val_name uid_tun_attrs[] = {
600*cf84ac9aSAndroid Build Coastguard Worker { 1, "IFLA_TUN_OWNER" },
601*cf84ac9aSAndroid Build Coastguard Worker { 2, "IFLA_TUN_GROUP" },
602*cf84ac9aSAndroid Build Coastguard Worker };
603*cf84ac9aSAndroid Build Coastguard Worker
604*cf84ac9aSAndroid Build Coastguard Worker for (size_t k = 0; k < ARRAY_SIZE(uid_tun_attrs); k++) {
605*cf84ac9aSAndroid Build Coastguard Worker TEST_NESTED_LINKINFO(fd, nlh0, 2, "IFLA_INFO_DATA", "tun",
606*cf84ac9aSAndroid Build Coastguard Worker uid_tun_attrs[k].val,
607*cf84ac9aSAndroid Build Coastguard Worker uid_tun_attrs[k].name,
608*cf84ac9aSAndroid Build Coastguard Worker u32_val, pattern,
609*cf84ac9aSAndroid Build Coastguard Worker { 3, "\""
610*cf84ac9aSAndroid Build Coastguard Worker #if WORDS_BIGENDIAN
611*cf84ac9aSAndroid Build Coastguard Worker "\\xba\\xdc\\x0d"
612*cf84ac9aSAndroid Build Coastguard Worker #else
613*cf84ac9aSAndroid Build Coastguard Worker "\\xed\\x0d\\xdc"
614*cf84ac9aSAndroid Build Coastguard Worker #endif
615*cf84ac9aSAndroid Build Coastguard Worker "\"" },
616*cf84ac9aSAndroid Build Coastguard Worker { 4, "3134983661" },
617*cf84ac9aSAndroid Build Coastguard Worker { 5, "3134983661" });
618*cf84ac9aSAndroid Build Coastguard Worker
619*cf84ac9aSAndroid Build Coastguard Worker TEST_NESTED_LINKINFO(fd, nlh0, 2, "IFLA_INFO_DATA", "tun",
620*cf84ac9aSAndroid Build Coastguard Worker uid_tun_attrs[k].val,
621*cf84ac9aSAndroid Build Coastguard Worker uid_tun_attrs[k].name,
622*cf84ac9aSAndroid Build Coastguard Worker minus_one, pattern,
623*cf84ac9aSAndroid Build Coastguard Worker { 3, "\"\\xff\\xff\\xff\"" },
624*cf84ac9aSAndroid Build Coastguard Worker { 4, "-1" },
625*cf84ac9aSAndroid Build Coastguard Worker { 5, "-1" });
626*cf84ac9aSAndroid Build Coastguard Worker }
627*cf84ac9aSAndroid Build Coastguard Worker
628*cf84ac9aSAndroid Build Coastguard Worker static const struct {
629*cf84ac9aSAndroid Build Coastguard Worker uint8_t val;
630*cf84ac9aSAndroid Build Coastguard Worker const char *str;
631*cf84ac9aSAndroid Build Coastguard Worker } tun_types[] = {
632*cf84ac9aSAndroid Build Coastguard Worker { 0, "0 /* IFF_??? */"},
633*cf84ac9aSAndroid Build Coastguard Worker { 1, "IFF_TUN"},
634*cf84ac9aSAndroid Build Coastguard Worker { 2, "IFF_TAP"},
635*cf84ac9aSAndroid Build Coastguard Worker { 3, "0x3 /* IFF_??? */"},
636*cf84ac9aSAndroid Build Coastguard Worker { 0xda, "0xda /* IFF_??? */"},
637*cf84ac9aSAndroid Build Coastguard Worker };
638*cf84ac9aSAndroid Build Coastguard Worker
639*cf84ac9aSAndroid Build Coastguard Worker for (size_t k = 0; k < ARRAY_SIZE(tun_types); k++) {
640*cf84ac9aSAndroid Build Coastguard Worker TEST_NESTED_LINKINFO(fd, nlh0, 2, "IFLA_INFO_DATA", "tun",
641*cf84ac9aSAndroid Build Coastguard Worker 3, "IFLA_TUN_TYPE",
642*cf84ac9aSAndroid Build Coastguard Worker tun_types[k].val, pattern,
643*cf84ac9aSAndroid Build Coastguard Worker { 0, NULL },
644*cf84ac9aSAndroid Build Coastguard Worker { 1, tun_types[k].str },
645*cf84ac9aSAndroid Build Coastguard Worker { 2, tun_types[k].str });
646*cf84ac9aSAndroid Build Coastguard Worker }
647*cf84ac9aSAndroid Build Coastguard Worker
648*cf84ac9aSAndroid Build Coastguard Worker
649*cf84ac9aSAndroid Build Coastguard Worker /* IFLA_INFO_KIND + IFLA_INFO_XSTATS */
650*cf84ac9aSAndroid Build Coastguard Worker TEST_UNKNOWN_TUNNELS(fd, nlh0, IFLA_INFO_XSTATS, "IFLA_INFO_XSTATS",
651*cf84ac9aSAndroid Build Coastguard Worker unknown_msg, sizeof(unknown_msg),
652*cf84ac9aSAndroid Build Coastguard Worker {unsupported_tunnel_types COMMA
653*cf84ac9aSAndroid Build Coastguard Worker /*
654*cf84ac9aSAndroid Build Coastguard Worker * can decoder decodes its data only if it's big
655*cf84ac9aSAndroid Build Coastguard Worker * enough.
656*cf84ac9aSAndroid Build Coastguard Worker */
657*cf84ac9aSAndroid Build Coastguard Worker unsupported_xstats_types COMMA
658*cf84ac9aSAndroid Build Coastguard Worker unsupported_data_types COMMA
659*cf84ac9aSAndroid Build Coastguard Worker NULL},
660*cf84ac9aSAndroid Build Coastguard Worker printf("\"\\xab\\xac\\xdb\\xcd\""));
661*cf84ac9aSAndroid Build Coastguard Worker
662*cf84ac9aSAndroid Build Coastguard Worker uint32_t can_stats_data[] = {
663*cf84ac9aSAndroid Build Coastguard Worker 0xbadc0de0, 0xbadc0de1, 0xbadc0de2, 0xbadc0de3,
664*cf84ac9aSAndroid Build Coastguard Worker 0xbadc0de4, 0xbadc0de5,
665*cf84ac9aSAndroid Build Coastguard Worker };
666*cf84ac9aSAndroid Build Coastguard Worker
667*cf84ac9aSAndroid Build Coastguard Worker TEST_LINKINFO(fd, nlh0, IFLA_INFO_XSTATS, "can",
668*cf84ac9aSAndroid Build Coastguard Worker can_stats_data, pattern, print_quoted_hex,
669*cf84ac9aSAndroid Build Coastguard Worker printf("{bus_error=3134983648"
670*cf84ac9aSAndroid Build Coastguard Worker ", error_warning=3134983649"
671*cf84ac9aSAndroid Build Coastguard Worker ", error_passive=3134983650"
672*cf84ac9aSAndroid Build Coastguard Worker ", bus_off=3134983651"
673*cf84ac9aSAndroid Build Coastguard Worker ", arbitration_lost=3134983652"
674*cf84ac9aSAndroid Build Coastguard Worker ", restarts=3134983653}"));
675*cf84ac9aSAndroid Build Coastguard Worker
676*cf84ac9aSAndroid Build Coastguard Worker
677*cf84ac9aSAndroid Build Coastguard Worker /* IFLA_INFO_KIND + IFLA_INFO_SLVAE_KIND */
678*cf84ac9aSAndroid Build Coastguard Worker TEST_UNKNOWN_TUNNELS(fd, nlh0,
679*cf84ac9aSAndroid Build Coastguard Worker IFLA_INFO_SLAVE_KIND, "IFLA_INFO_SLAVE_KIND",
680*cf84ac9aSAndroid Build Coastguard Worker unknown_msg, sizeof(unknown_msg),
681*cf84ac9aSAndroid Build Coastguard Worker {unsupported_tunnel_types COMMA
682*cf84ac9aSAndroid Build Coastguard Worker unsupported_xstats_types COMMA
683*cf84ac9aSAndroid Build Coastguard Worker unsupported_data_types COMMA
684*cf84ac9aSAndroid Build Coastguard Worker NULL},
685*cf84ac9aSAndroid Build Coastguard Worker printf("\"\\253\\254\\333\\315\"..."));
686*cf84ac9aSAndroid Build Coastguard Worker
687*cf84ac9aSAndroid Build Coastguard Worker
688*cf84ac9aSAndroid Build Coastguard Worker /* IFLA_INFO_KIND + IFLA_INFO_SLAVE_DATA */
689*cf84ac9aSAndroid Build Coastguard Worker TEST_UNKNOWN_TUNNELS(fd, nlh0,
690*cf84ac9aSAndroid Build Coastguard Worker IFLA_INFO_SLAVE_DATA, "IFLA_INFO_SLAVE_DATA",
691*cf84ac9aSAndroid Build Coastguard Worker unknown_msg, sizeof(unknown_msg),
692*cf84ac9aSAndroid Build Coastguard Worker {unsupported_tunnel_types COMMA
693*cf84ac9aSAndroid Build Coastguard Worker unsupported_xstats_types COMMA
694*cf84ac9aSAndroid Build Coastguard Worker unsupported_data_types COMMA
695*cf84ac9aSAndroid Build Coastguard Worker NULL},
696*cf84ac9aSAndroid Build Coastguard Worker printf("\"\\xab\\xac\\xdb\\xcd\""));
697*cf84ac9aSAndroid Build Coastguard Worker
698*cf84ac9aSAndroid Build Coastguard Worker
699*cf84ac9aSAndroid Build Coastguard Worker /* IFLA_INFO_KIND + unknown type */
700*cf84ac9aSAndroid Build Coastguard Worker TEST_UNKNOWN_TUNNELS(fd, nlh0, 6, "0x6 /* IFLA_INFO_??? */",
701*cf84ac9aSAndroid Build Coastguard Worker unknown_msg, sizeof(unknown_msg),
702*cf84ac9aSAndroid Build Coastguard Worker {unsupported_tunnel_types COMMA
703*cf84ac9aSAndroid Build Coastguard Worker unsupported_xstats_types COMMA
704*cf84ac9aSAndroid Build Coastguard Worker unsupported_data_types COMMA
705*cf84ac9aSAndroid Build Coastguard Worker NULL},
706*cf84ac9aSAndroid Build Coastguard Worker printf("\"\\xab\\xac\\xdb\\xcd\""));
707*cf84ac9aSAndroid Build Coastguard Worker
708*cf84ac9aSAndroid Build Coastguard Worker
709*cf84ac9aSAndroid Build Coastguard Worker puts("+++ exited with 0 +++");
710*cf84ac9aSAndroid Build Coastguard Worker return 0;
711*cf84ac9aSAndroid Build Coastguard Worker }
712