xref: /aosp_15_r20/external/strace/tests-m32/nlattr_ifla_linkinfo.c (revision cf84ac9a129d8ea9952db616b4e9b904c4bdde56)
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