xref: /aosp_15_r20/external/strace/tests/test_nlattr.h (revision cf84ac9a129d8ea9952db616b4e9b904c4bdde56)
1*cf84ac9aSAndroid Build Coastguard Worker /*
2*cf84ac9aSAndroid Build Coastguard Worker  * Copyright (c) 2017-2018 The strace developers.
3*cf84ac9aSAndroid Build Coastguard Worker  * All rights reserved.
4*cf84ac9aSAndroid Build Coastguard Worker  *
5*cf84ac9aSAndroid Build Coastguard Worker  * Redistribution and use in source and binary forms, with or without
6*cf84ac9aSAndroid Build Coastguard Worker  * modification, are permitted provided that the following conditions
7*cf84ac9aSAndroid Build Coastguard Worker  * are met:
8*cf84ac9aSAndroid Build Coastguard Worker  * 1. Redistributions of source code must retain the above copyright
9*cf84ac9aSAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer.
10*cf84ac9aSAndroid Build Coastguard Worker  * 2. Redistributions in binary form must reproduce the above copyright
11*cf84ac9aSAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer in the
12*cf84ac9aSAndroid Build Coastguard Worker  *    documentation and/or other materials provided with the distribution.
13*cf84ac9aSAndroid Build Coastguard Worker  * 3. The name of the author may not be used to endorse or promote products
14*cf84ac9aSAndroid Build Coastguard Worker  *    derived from this software without specific prior written permission.
15*cf84ac9aSAndroid Build Coastguard Worker  *
16*cf84ac9aSAndroid Build Coastguard Worker  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17*cf84ac9aSAndroid Build Coastguard Worker  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18*cf84ac9aSAndroid Build Coastguard Worker  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19*cf84ac9aSAndroid Build Coastguard Worker  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20*cf84ac9aSAndroid Build Coastguard Worker  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21*cf84ac9aSAndroid Build Coastguard Worker  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22*cf84ac9aSAndroid Build Coastguard Worker  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23*cf84ac9aSAndroid Build Coastguard Worker  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24*cf84ac9aSAndroid Build Coastguard Worker  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25*cf84ac9aSAndroid Build Coastguard Worker  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*cf84ac9aSAndroid Build Coastguard Worker  */
27*cf84ac9aSAndroid Build Coastguard Worker 
28*cf84ac9aSAndroid Build Coastguard Worker #include "tests.h"
29*cf84ac9aSAndroid Build Coastguard Worker #include "print_fields.h"
30*cf84ac9aSAndroid Build Coastguard Worker 
31*cf84ac9aSAndroid Build Coastguard Worker #include <stdio.h>
32*cf84ac9aSAndroid Build Coastguard Worker #include <stdint.h>
33*cf84ac9aSAndroid Build Coastguard Worker #include <string.h>
34*cf84ac9aSAndroid Build Coastguard Worker #include <sys/socket.h>
35*cf84ac9aSAndroid Build Coastguard Worker #include "netlink.h"
36*cf84ac9aSAndroid Build Coastguard Worker #include <linux/rtnetlink.h>
37*cf84ac9aSAndroid Build Coastguard Worker 
38*cf84ac9aSAndroid Build Coastguard Worker static void
init_nlattr(struct nlattr * const nla,const uint16_t nla_len,const uint16_t nla_type,const void * const src,const size_t n)39*cf84ac9aSAndroid Build Coastguard Worker init_nlattr(struct nlattr *const nla,
40*cf84ac9aSAndroid Build Coastguard Worker 	    const uint16_t nla_len,
41*cf84ac9aSAndroid Build Coastguard Worker 	    const uint16_t nla_type,
42*cf84ac9aSAndroid Build Coastguard Worker 	    const void *const src,
43*cf84ac9aSAndroid Build Coastguard Worker 	    const size_t n)
44*cf84ac9aSAndroid Build Coastguard Worker {
45*cf84ac9aSAndroid Build Coastguard Worker 	SET_STRUCT(struct nlattr, nla,
46*cf84ac9aSAndroid Build Coastguard Worker 		.nla_len = nla_len,
47*cf84ac9aSAndroid Build Coastguard Worker 		.nla_type = nla_type,
48*cf84ac9aSAndroid Build Coastguard Worker 	);
49*cf84ac9aSAndroid Build Coastguard Worker 
50*cf84ac9aSAndroid Build Coastguard Worker 	memcpy(RTA_DATA(nla), src, n);
51*cf84ac9aSAndroid Build Coastguard Worker }
52*cf84ac9aSAndroid Build Coastguard Worker 
53*cf84ac9aSAndroid Build Coastguard Worker static void
print_nlattr(const unsigned int nla_len,const char * const nla_type,bool add_data)54*cf84ac9aSAndroid Build Coastguard Worker print_nlattr(const unsigned int nla_len, const char *const nla_type, bool add_data)
55*cf84ac9aSAndroid Build Coastguard Worker {
56*cf84ac9aSAndroid Build Coastguard Worker 	printf(", %s{{nla_len=%u, nla_type=%s}, ",
57*cf84ac9aSAndroid Build Coastguard Worker 	       add_data ? "[" : "", nla_len, nla_type);
58*cf84ac9aSAndroid Build Coastguard Worker }
59*cf84ac9aSAndroid Build Coastguard Worker 
60*cf84ac9aSAndroid Build Coastguard Worker #define TEST_NLATTR_EX_(fd_, nlh0_, hdrlen_,				\
61*cf84ac9aSAndroid Build Coastguard Worker 		     init_msg_, print_msg_,				\
62*cf84ac9aSAndroid Build Coastguard Worker 		     nla_type_, nla_type_str_,				\
63*cf84ac9aSAndroid Build Coastguard Worker 		     nla_data_len_, nla_total_len_,			\
64*cf84ac9aSAndroid Build Coastguard Worker 		     src_, slen_, ...)					\
65*cf84ac9aSAndroid Build Coastguard Worker 	do {								\
66*cf84ac9aSAndroid Build Coastguard Worker 		struct nlmsghdr *const nlh =				\
67*cf84ac9aSAndroid Build Coastguard Worker 			(nlh0_) - (NLA_HDRLEN + (slen_));		\
68*cf84ac9aSAndroid Build Coastguard Worker 		struct nlattr *const TEST_NLATTR_nla =			\
69*cf84ac9aSAndroid Build Coastguard Worker 			NLMSG_ATTR(nlh, (hdrlen_));			\
70*cf84ac9aSAndroid Build Coastguard Worker 		const unsigned int nla_len =				\
71*cf84ac9aSAndroid Build Coastguard Worker 			NLA_HDRLEN + (nla_data_len_);			\
72*cf84ac9aSAndroid Build Coastguard Worker 		const unsigned int msg_len =				\
73*cf84ac9aSAndroid Build Coastguard Worker 			NLMSG_SPACE(hdrlen_) + NLA_HDRLEN + (nla_total_len_); \
74*cf84ac9aSAndroid Build Coastguard Worker 									\
75*cf84ac9aSAndroid Build Coastguard Worker 		(init_msg_)(nlh, msg_len);				\
76*cf84ac9aSAndroid Build Coastguard Worker 		init_nlattr(TEST_NLATTR_nla, nla_len, (nla_type_),	\
77*cf84ac9aSAndroid Build Coastguard Worker 			   (src_), (slen_));				\
78*cf84ac9aSAndroid Build Coastguard Worker 									\
79*cf84ac9aSAndroid Build Coastguard Worker 		const char *const errstr =				\
80*cf84ac9aSAndroid Build Coastguard Worker 			sprintrc(sendto((fd_), nlh, msg_len,		\
81*cf84ac9aSAndroid Build Coastguard Worker 					MSG_DONTWAIT, NULL, 0));	\
82*cf84ac9aSAndroid Build Coastguard Worker 									\
83*cf84ac9aSAndroid Build Coastguard Worker 		printf("sendto(%d, {", (fd_));				\
84*cf84ac9aSAndroid Build Coastguard Worker 		(print_msg_)(msg_len);					\
85*cf84ac9aSAndroid Build Coastguard Worker 		print_nlattr(nla_len, (nla_type_str_),			\
86*cf84ac9aSAndroid Build Coastguard Worker 			     (nla_total_len_) > (nla_data_len_));	\
87*cf84ac9aSAndroid Build Coastguard Worker 									\
88*cf84ac9aSAndroid Build Coastguard Worker 		{ __VA_ARGS__; }					\
89*cf84ac9aSAndroid Build Coastguard Worker 									\
90*cf84ac9aSAndroid Build Coastguard Worker 		if ((nla_total_len_) > (nla_data_len_))			\
91*cf84ac9aSAndroid Build Coastguard Worker 			printf("]");					\
92*cf84ac9aSAndroid Build Coastguard Worker 									\
93*cf84ac9aSAndroid Build Coastguard Worker 		printf("}}, %u, MSG_DONTWAIT, NULL, 0) = %s\n",		\
94*cf84ac9aSAndroid Build Coastguard Worker 		       msg_len, errstr);				\
95*cf84ac9aSAndroid Build Coastguard Worker 	} while (0)
96*cf84ac9aSAndroid Build Coastguard Worker 
97*cf84ac9aSAndroid Build Coastguard Worker #define TEST_NLATTR_(fd_, nlh0_, hdrlen_,				\
98*cf84ac9aSAndroid Build Coastguard Worker 		     init_msg_, print_msg_,				\
99*cf84ac9aSAndroid Build Coastguard Worker 		     nla_type_, nla_type_str_,				\
100*cf84ac9aSAndroid Build Coastguard Worker 		     nla_data_len_, src_, slen_, ...)			\
101*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NLATTR_EX_((fd_), (nlh0_), (hdrlen_),			\
102*cf84ac9aSAndroid Build Coastguard Worker 			(init_msg_), (print_msg_),			\
103*cf84ac9aSAndroid Build Coastguard Worker 			(nla_type_), (nla_type_str_),			\
104*cf84ac9aSAndroid Build Coastguard Worker 			(nla_data_len_), (nla_data_len_),		\
105*cf84ac9aSAndroid Build Coastguard Worker 			(src_), (slen_), __VA_ARGS__)
106*cf84ac9aSAndroid Build Coastguard Worker 
107*cf84ac9aSAndroid Build Coastguard Worker #define TEST_NLATTR(fd_, nlh0_, hdrlen_,				\
108*cf84ac9aSAndroid Build Coastguard Worker 		    init_msg_, print_msg_,				\
109*cf84ac9aSAndroid Build Coastguard Worker 		    nla_type_,						\
110*cf84ac9aSAndroid Build Coastguard Worker 		    nla_data_len_, src_, slen_, ...)			\
111*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NLATTR_((fd_), (nlh0_), (hdrlen_),				\
112*cf84ac9aSAndroid Build Coastguard Worker 		(init_msg_), (print_msg_),				\
113*cf84ac9aSAndroid Build Coastguard Worker 		(nla_type_), #nla_type_,				\
114*cf84ac9aSAndroid Build Coastguard Worker 		(nla_data_len_), (src_), (slen_), __VA_ARGS__)
115*cf84ac9aSAndroid Build Coastguard Worker 
116*cf84ac9aSAndroid Build Coastguard Worker #define TEST_NLATTR_OBJECT_EX_(fd_, nlh0_, hdrlen_,			\
117*cf84ac9aSAndroid Build Coastguard Worker 			       init_msg_, print_msg_,			\
118*cf84ac9aSAndroid Build Coastguard Worker 			       nla_type_, nla_type_str_,		\
119*cf84ac9aSAndroid Build Coastguard Worker 			       pattern_, obj_, fallback_func, ...)	\
120*cf84ac9aSAndroid Build Coastguard Worker 	do {								\
121*cf84ac9aSAndroid Build Coastguard Worker 		const unsigned int plen =				\
122*cf84ac9aSAndroid Build Coastguard Worker 			sizeof(obj_) - 1 > DEFAULT_STRLEN		\
123*cf84ac9aSAndroid Build Coastguard Worker 			? DEFAULT_STRLEN : (int) sizeof(obj_) - 1;	\
124*cf84ac9aSAndroid Build Coastguard Worker 		/* len < sizeof(obj_) */				\
125*cf84ac9aSAndroid Build Coastguard Worker 		if (plen > 0)						\
126*cf84ac9aSAndroid Build Coastguard Worker 			TEST_NLATTR_((fd_), (nlh0_), (hdrlen_),		\
127*cf84ac9aSAndroid Build Coastguard Worker 				(init_msg_), (print_msg_),		\
128*cf84ac9aSAndroid Build Coastguard Worker 				(nla_type_), (nla_type_str_),		\
129*cf84ac9aSAndroid Build Coastguard Worker 				plen, (pattern_), plen,			\
130*cf84ac9aSAndroid Build Coastguard Worker 				(fallback_func)((pattern_), plen));	\
131*cf84ac9aSAndroid Build Coastguard Worker 		/* short read of sizeof(obj_) */			\
132*cf84ac9aSAndroid Build Coastguard Worker 		TEST_NLATTR_((fd_), (nlh0_), (hdrlen_),			\
133*cf84ac9aSAndroid Build Coastguard Worker 			(init_msg_), (print_msg_),			\
134*cf84ac9aSAndroid Build Coastguard Worker 			(nla_type_), (nla_type_str_),			\
135*cf84ac9aSAndroid Build Coastguard Worker 			sizeof(obj_),					\
136*cf84ac9aSAndroid Build Coastguard Worker 			(pattern_), sizeof(obj_) - 1,			\
137*cf84ac9aSAndroid Build Coastguard Worker 			printf("%p",					\
138*cf84ac9aSAndroid Build Coastguard Worker 			       RTA_DATA(NLMSG_ATTR(nlh, (hdrlen_)))));	\
139*cf84ac9aSAndroid Build Coastguard Worker 		/* sizeof(obj_) */					\
140*cf84ac9aSAndroid Build Coastguard Worker 		TEST_NLATTR_((fd_), (nlh0_), (hdrlen_),			\
141*cf84ac9aSAndroid Build Coastguard Worker 			(init_msg_), (print_msg_),			\
142*cf84ac9aSAndroid Build Coastguard Worker 			(nla_type_), (nla_type_str_),			\
143*cf84ac9aSAndroid Build Coastguard Worker 			sizeof(obj_),					\
144*cf84ac9aSAndroid Build Coastguard Worker 			&(obj_), sizeof(obj_),				\
145*cf84ac9aSAndroid Build Coastguard Worker 			__VA_ARGS__);					\
146*cf84ac9aSAndroid Build Coastguard Worker 	} while (0)
147*cf84ac9aSAndroid Build Coastguard Worker 
148*cf84ac9aSAndroid Build Coastguard Worker #define TEST_NLATTR_OBJECT_EX(fd_, nlh0_, hdrlen_,			\
149*cf84ac9aSAndroid Build Coastguard Worker 			      init_msg_, print_msg_,			\
150*cf84ac9aSAndroid Build Coastguard Worker 			      nla_type_,				\
151*cf84ac9aSAndroid Build Coastguard Worker 			      pattern_, obj_, fallback_func, ...)	\
152*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NLATTR_OBJECT_EX_((fd_), (nlh0_), (hdrlen_),		\
153*cf84ac9aSAndroid Build Coastguard Worker 			       (init_msg_), (print_msg_),		\
154*cf84ac9aSAndroid Build Coastguard Worker 			       (nla_type_), #nla_type_,			\
155*cf84ac9aSAndroid Build Coastguard Worker 			       (pattern_), (obj_), (fallback_func),	\
156*cf84ac9aSAndroid Build Coastguard Worker 			       __VA_ARGS__)
157*cf84ac9aSAndroid Build Coastguard Worker 
158*cf84ac9aSAndroid Build Coastguard Worker #define TEST_NLATTR_OBJECT(fd_, nlh0_, hdrlen_,				\
159*cf84ac9aSAndroid Build Coastguard Worker 			   init_msg_, print_msg_,			\
160*cf84ac9aSAndroid Build Coastguard Worker 			   nla_type_, pattern_, obj_, ...)		\
161*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NLATTR_OBJECT_EX_((fd_), (nlh0_), (hdrlen_),		\
162*cf84ac9aSAndroid Build Coastguard Worker 			       (init_msg_), (print_msg_),		\
163*cf84ac9aSAndroid Build Coastguard Worker 			       (nla_type_), #nla_type_,			\
164*cf84ac9aSAndroid Build Coastguard Worker 			       (pattern_), (obj_), print_quoted_hex,	\
165*cf84ac9aSAndroid Build Coastguard Worker 			       __VA_ARGS__)
166*cf84ac9aSAndroid Build Coastguard Worker 
167*cf84ac9aSAndroid Build Coastguard Worker #define TEST_NLATTR_ARRAY(fd_, nlh0_, hdrlen_,				\
168*cf84ac9aSAndroid Build Coastguard Worker 			  init_msg_, print_msg_,			\
169*cf84ac9aSAndroid Build Coastguard Worker 			  nla_type_, pattern_, obj_, print_elem_)	\
170*cf84ac9aSAndroid Build Coastguard Worker 	do {								\
171*cf84ac9aSAndroid Build Coastguard Worker 		const unsigned int plen =				\
172*cf84ac9aSAndroid Build Coastguard Worker 			sizeof((obj_)[0]) - 1 > DEFAULT_STRLEN		\
173*cf84ac9aSAndroid Build Coastguard Worker 			? DEFAULT_STRLEN : (int) sizeof((obj_)[0]) - 1;	\
174*cf84ac9aSAndroid Build Coastguard Worker 		/* len < sizeof((obj_)[0]) */				\
175*cf84ac9aSAndroid Build Coastguard Worker 		TEST_NLATTR_((fd_), (nlh0_), (hdrlen_),			\
176*cf84ac9aSAndroid Build Coastguard Worker 			(init_msg_), (print_msg_),			\
177*cf84ac9aSAndroid Build Coastguard Worker 			(nla_type_), #nla_type_,			\
178*cf84ac9aSAndroid Build Coastguard Worker 			plen, (pattern_), plen,				\
179*cf84ac9aSAndroid Build Coastguard Worker 			print_quoted_hex((pattern_), plen));		\
180*cf84ac9aSAndroid Build Coastguard Worker 		/* sizeof((obj_)[0]) < len < sizeof(obj_) */		\
181*cf84ac9aSAndroid Build Coastguard Worker 		TEST_NLATTR_((fd_), (nlh0_), (hdrlen_),			\
182*cf84ac9aSAndroid Build Coastguard Worker 			(init_msg_), (print_msg_),			\
183*cf84ac9aSAndroid Build Coastguard Worker 			(nla_type_), #nla_type_,			\
184*cf84ac9aSAndroid Build Coastguard Worker 			sizeof(obj_) - 1,				\
185*cf84ac9aSAndroid Build Coastguard Worker 			&(obj_), sizeof(obj_) - 1,			\
186*cf84ac9aSAndroid Build Coastguard Worker 			printf("[");					\
187*cf84ac9aSAndroid Build Coastguard Worker 			size_t i;					\
188*cf84ac9aSAndroid Build Coastguard Worker 			for (i = 0; i < ARRAY_SIZE(obj_) - 1; ++i) {	\
189*cf84ac9aSAndroid Build Coastguard Worker 				if (i) printf(", ");			\
190*cf84ac9aSAndroid Build Coastguard Worker 				(print_elem_)(&(obj_)[i], i);		\
191*cf84ac9aSAndroid Build Coastguard Worker 			}						\
192*cf84ac9aSAndroid Build Coastguard Worker 			printf("]"));					\
193*cf84ac9aSAndroid Build Coastguard Worker 		/* short read of sizeof(obj_) */			\
194*cf84ac9aSAndroid Build Coastguard Worker 		TEST_NLATTR_((fd_), (nlh0_), (hdrlen_),			\
195*cf84ac9aSAndroid Build Coastguard Worker 			(init_msg_), (print_msg_),			\
196*cf84ac9aSAndroid Build Coastguard Worker 			(nla_type_), #nla_type_,			\
197*cf84ac9aSAndroid Build Coastguard Worker 			sizeof(obj_),					\
198*cf84ac9aSAndroid Build Coastguard Worker 			&(obj_), sizeof(obj_) - 1,			\
199*cf84ac9aSAndroid Build Coastguard Worker 			printf("[");					\
200*cf84ac9aSAndroid Build Coastguard Worker 			size_t i;					\
201*cf84ac9aSAndroid Build Coastguard Worker 			for (i = 0; i < ARRAY_SIZE(obj_) - 1; ++i) {	\
202*cf84ac9aSAndroid Build Coastguard Worker 				if (i) printf(", ");			\
203*cf84ac9aSAndroid Build Coastguard Worker 				(print_elem_)(&(obj_)[i], i);		\
204*cf84ac9aSAndroid Build Coastguard Worker 			}						\
205*cf84ac9aSAndroid Build Coastguard Worker 			printf(", ... /* %p */]",			\
206*cf84ac9aSAndroid Build Coastguard Worker 			       RTA_DATA(NLMSG_ATTR(nlh, (hdrlen_)))	\
207*cf84ac9aSAndroid Build Coastguard Worker 			        + sizeof(obj_) - sizeof((obj_)[0])));	\
208*cf84ac9aSAndroid Build Coastguard Worker 		/* sizeof(obj_) */					\
209*cf84ac9aSAndroid Build Coastguard Worker 		TEST_NLATTR_((fd_), (nlh0_), (hdrlen_),			\
210*cf84ac9aSAndroid Build Coastguard Worker 			(init_msg_), (print_msg_),			\
211*cf84ac9aSAndroid Build Coastguard Worker 			(nla_type_), #nla_type_,			\
212*cf84ac9aSAndroid Build Coastguard Worker 			sizeof(obj_),					\
213*cf84ac9aSAndroid Build Coastguard Worker 			&(obj_), sizeof(obj_),				\
214*cf84ac9aSAndroid Build Coastguard Worker 			printf("[");					\
215*cf84ac9aSAndroid Build Coastguard Worker 			size_t i;					\
216*cf84ac9aSAndroid Build Coastguard Worker 			for (i = 0; i < ARRAY_SIZE(obj_); ++i) {	\
217*cf84ac9aSAndroid Build Coastguard Worker 				if (i) printf(", ");			\
218*cf84ac9aSAndroid Build Coastguard Worker 				(print_elem_)(&(obj_)[i], i);		\
219*cf84ac9aSAndroid Build Coastguard Worker 			}						\
220*cf84ac9aSAndroid Build Coastguard Worker 			printf("]"));					\
221*cf84ac9aSAndroid Build Coastguard Worker 	} while (0)
222*cf84ac9aSAndroid Build Coastguard Worker 
223*cf84ac9aSAndroid Build Coastguard Worker #define TEST_NESTED_NLATTR_OBJECT_EX_(fd_, nlh0_, hdrlen_,		\
224*cf84ac9aSAndroid Build Coastguard Worker 				      init_msg_, print_msg_,		\
225*cf84ac9aSAndroid Build Coastguard Worker 				      nla_type_, nla_type_str_,		\
226*cf84ac9aSAndroid Build Coastguard Worker 				      pattern_, obj_, fallback_func,	\
227*cf84ac9aSAndroid Build Coastguard Worker 				      depth_, ...)	\
228*cf84ac9aSAndroid Build Coastguard Worker 	do {								\
229*cf84ac9aSAndroid Build Coastguard Worker 		const unsigned int plen =				\
230*cf84ac9aSAndroid Build Coastguard Worker 			sizeof(obj_) - 1 > DEFAULT_STRLEN		\
231*cf84ac9aSAndroid Build Coastguard Worker 			? DEFAULT_STRLEN : (int) sizeof(obj_) - 1;	\
232*cf84ac9aSAndroid Build Coastguard Worker 		/* len < sizeof(obj_) */				\
233*cf84ac9aSAndroid Build Coastguard Worker 		if (plen > 0)						\
234*cf84ac9aSAndroid Build Coastguard Worker 			TEST_NLATTR_((fd_), (nlh0_) - NLA_HDRLEN * depth_, \
235*cf84ac9aSAndroid Build Coastguard Worker 				(hdrlen_) + NLA_HDRLEN * depth_,	\
236*cf84ac9aSAndroid Build Coastguard Worker 				(init_msg_), (print_msg_),		\
237*cf84ac9aSAndroid Build Coastguard Worker 				(nla_type_), (nla_type_str_),		\
238*cf84ac9aSAndroid Build Coastguard Worker 				plen, (pattern_), plen,			\
239*cf84ac9aSAndroid Build Coastguard Worker 				(fallback_func)((pattern_), plen);	\
240*cf84ac9aSAndroid Build Coastguard Worker 				size_t i;				\
241*cf84ac9aSAndroid Build Coastguard Worker 				for (i = 0; i < depth_; ++i)		\
242*cf84ac9aSAndroid Build Coastguard Worker 					printf("}"));			\
243*cf84ac9aSAndroid Build Coastguard Worker 		/* short read of sizeof(obj_) */			\
244*cf84ac9aSAndroid Build Coastguard Worker 		TEST_NLATTR_((fd_), (nlh0_) - NLA_HDRLEN * depth_,	\
245*cf84ac9aSAndroid Build Coastguard Worker 			(hdrlen_) + NLA_HDRLEN * depth_,		\
246*cf84ac9aSAndroid Build Coastguard Worker 			(init_msg_), (print_msg_),			\
247*cf84ac9aSAndroid Build Coastguard Worker 			(nla_type_), (nla_type_str_),			\
248*cf84ac9aSAndroid Build Coastguard Worker 			sizeof(obj_),					\
249*cf84ac9aSAndroid Build Coastguard Worker 			(pattern_), sizeof(obj_) - 1,			\
250*cf84ac9aSAndroid Build Coastguard Worker 			printf("%p", RTA_DATA(TEST_NLATTR_nla));	\
251*cf84ac9aSAndroid Build Coastguard Worker 			size_t i;					\
252*cf84ac9aSAndroid Build Coastguard Worker 			for (i = 0; i < depth_; ++i)			\
253*cf84ac9aSAndroid Build Coastguard Worker 				printf("}"));				\
254*cf84ac9aSAndroid Build Coastguard Worker 		/* sizeof(obj_) */					\
255*cf84ac9aSAndroid Build Coastguard Worker 		TEST_NLATTR_((fd_), (nlh0_) - NLA_HDRLEN * depth_,	\
256*cf84ac9aSAndroid Build Coastguard Worker 			(hdrlen_) + NLA_HDRLEN * depth_,		\
257*cf84ac9aSAndroid Build Coastguard Worker 			(init_msg_), (print_msg_),			\
258*cf84ac9aSAndroid Build Coastguard Worker 			(nla_type_), (nla_type_str_),			\
259*cf84ac9aSAndroid Build Coastguard Worker 			sizeof(obj_),					\
260*cf84ac9aSAndroid Build Coastguard Worker 			&(obj_), sizeof(obj_),				\
261*cf84ac9aSAndroid Build Coastguard Worker 			__VA_ARGS__;					\
262*cf84ac9aSAndroid Build Coastguard Worker 			size_t i;					\
263*cf84ac9aSAndroid Build Coastguard Worker 			for (i = 0; i < depth_; ++i)			\
264*cf84ac9aSAndroid Build Coastguard Worker 				printf("}"));				\
265*cf84ac9aSAndroid Build Coastguard Worker 	} while (0)
266*cf84ac9aSAndroid Build Coastguard Worker 
267*cf84ac9aSAndroid Build Coastguard Worker #define TEST_NESTED_NLATTR_OBJECT_EX(fd_, nlh0_, hdrlen_,		\
268*cf84ac9aSAndroid Build Coastguard Worker 				     init_msg_, print_msg_,		\
269*cf84ac9aSAndroid Build Coastguard Worker 				     nla_type_, pattern_, obj_,		\
270*cf84ac9aSAndroid Build Coastguard Worker 				     depth_, ...)			\
271*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NESTED_NLATTR_OBJECT_EX_((fd_), (nlh0_), (hdrlen_),	\
272*cf84ac9aSAndroid Build Coastguard Worker 				      (init_msg_), (print_msg_),	\
273*cf84ac9aSAndroid Build Coastguard Worker 				      (nla_type_), #nla_type_,		\
274*cf84ac9aSAndroid Build Coastguard Worker 				      (pattern_), (obj_),		\
275*cf84ac9aSAndroid Build Coastguard Worker 				      print_quoted_hex, (depth_),	\
276*cf84ac9aSAndroid Build Coastguard Worker 				      __VA_ARGS__)
277*cf84ac9aSAndroid Build Coastguard Worker 
278*cf84ac9aSAndroid Build Coastguard Worker #define TEST_NESTED_NLATTR_OBJECT(fd_, nlh0_, hdrlen_,			\
279*cf84ac9aSAndroid Build Coastguard Worker 				  init_msg_, print_msg_,		\
280*cf84ac9aSAndroid Build Coastguard Worker 				  nla_type_, pattern_, obj_, ...)	\
281*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NESTED_NLATTR_OBJECT_EX_((fd_), (nlh0_), (hdrlen_),	\
282*cf84ac9aSAndroid Build Coastguard Worker 				      (init_msg_), (print_msg_),	\
283*cf84ac9aSAndroid Build Coastguard Worker 				      (nla_type_), #nla_type_,		\
284*cf84ac9aSAndroid Build Coastguard Worker 				      (pattern_), (obj_),		\
285*cf84ac9aSAndroid Build Coastguard Worker 				      print_quoted_hex, 1,		\
286*cf84ac9aSAndroid Build Coastguard Worker 				      __VA_ARGS__)
287*cf84ac9aSAndroid Build Coastguard Worker 
288*cf84ac9aSAndroid Build Coastguard Worker #define TEST_NESTED_NLATTR_ARRAY_EX(fd_, nlh0_, hdrlen_,		\
289*cf84ac9aSAndroid Build Coastguard Worker 				 init_msg_, print_msg_,			\
290*cf84ac9aSAndroid Build Coastguard Worker 				 nla_type_, pattern_, obj_, depth_,	\
291*cf84ac9aSAndroid Build Coastguard Worker 				 print_elem_)				\
292*cf84ac9aSAndroid Build Coastguard Worker 	do {								\
293*cf84ac9aSAndroid Build Coastguard Worker 		const unsigned int plen =				\
294*cf84ac9aSAndroid Build Coastguard Worker 			sizeof((obj_)[0]) - 1 > DEFAULT_STRLEN		\
295*cf84ac9aSAndroid Build Coastguard Worker 			? DEFAULT_STRLEN : (int) sizeof((obj_)[0]) - 1;	\
296*cf84ac9aSAndroid Build Coastguard Worker 		/* len < sizeof((obj_)[0]) */				\
297*cf84ac9aSAndroid Build Coastguard Worker 		TEST_NLATTR_((fd_), (nlh0_) - NLA_HDRLEN * depth_,	\
298*cf84ac9aSAndroid Build Coastguard Worker 			(hdrlen_) + NLA_HDRLEN * depth_,		\
299*cf84ac9aSAndroid Build Coastguard Worker 			(init_msg_), (print_msg_),			\
300*cf84ac9aSAndroid Build Coastguard Worker 			(nla_type_), #nla_type_,			\
301*cf84ac9aSAndroid Build Coastguard Worker 			plen, (pattern_), plen,				\
302*cf84ac9aSAndroid Build Coastguard Worker 			print_quoted_hex((pattern_), plen);		\
303*cf84ac9aSAndroid Build Coastguard Worker 			for (size_t i = 0; i < depth_; ++i)		\
304*cf84ac9aSAndroid Build Coastguard Worker 				printf("}"));				\
305*cf84ac9aSAndroid Build Coastguard Worker 		/* sizeof((obj_)[0]) < len < sizeof(obj_) */		\
306*cf84ac9aSAndroid Build Coastguard Worker 		TEST_NLATTR_((fd_), (nlh0_) - NLA_HDRLEN * depth_,	\
307*cf84ac9aSAndroid Build Coastguard Worker 			(hdrlen_) + NLA_HDRLEN * depth_,		\
308*cf84ac9aSAndroid Build Coastguard Worker 			(init_msg_), (print_msg_),			\
309*cf84ac9aSAndroid Build Coastguard Worker 			(nla_type_), #nla_type_,			\
310*cf84ac9aSAndroid Build Coastguard Worker 			sizeof(obj_) - 1,				\
311*cf84ac9aSAndroid Build Coastguard Worker 			&(obj_), sizeof(obj_) - 1,			\
312*cf84ac9aSAndroid Build Coastguard Worker 			printf("[");					\
313*cf84ac9aSAndroid Build Coastguard Worker 			size_t i;					\
314*cf84ac9aSAndroid Build Coastguard Worker 			for (i = 0; i < ARRAY_SIZE(obj_) - 1; ++i) {	\
315*cf84ac9aSAndroid Build Coastguard Worker 				if (i) printf(", ");			\
316*cf84ac9aSAndroid Build Coastguard Worker 				(print_elem_)(&(obj_)[i], i);		\
317*cf84ac9aSAndroid Build Coastguard Worker 			}						\
318*cf84ac9aSAndroid Build Coastguard Worker 			printf("]");					\
319*cf84ac9aSAndroid Build Coastguard Worker 			for (i = 0; i < depth_; ++i)			\
320*cf84ac9aSAndroid Build Coastguard Worker 				printf("}"));				\
321*cf84ac9aSAndroid Build Coastguard Worker 		/* short read of sizeof(obj_) */			\
322*cf84ac9aSAndroid Build Coastguard Worker 		TEST_NLATTR_((fd_), (nlh0_) - NLA_HDRLEN * depth_,	\
323*cf84ac9aSAndroid Build Coastguard Worker 			(hdrlen_) + NLA_HDRLEN * depth_,		\
324*cf84ac9aSAndroid Build Coastguard Worker 			(init_msg_), (print_msg_),			\
325*cf84ac9aSAndroid Build Coastguard Worker 			(nla_type_), #nla_type_,			\
326*cf84ac9aSAndroid Build Coastguard Worker 			sizeof(obj_),					\
327*cf84ac9aSAndroid Build Coastguard Worker 			&(obj_), sizeof(obj_) - 1,			\
328*cf84ac9aSAndroid Build Coastguard Worker 			printf("[");					\
329*cf84ac9aSAndroid Build Coastguard Worker 			size_t i;					\
330*cf84ac9aSAndroid Build Coastguard Worker 			for (i = 0; i < ARRAY_SIZE(obj_) - 1; ++i) {	\
331*cf84ac9aSAndroid Build Coastguard Worker 				if (i) printf(", ");			\
332*cf84ac9aSAndroid Build Coastguard Worker 				(print_elem_)(&(obj_)[i], i);		\
333*cf84ac9aSAndroid Build Coastguard Worker 			}						\
334*cf84ac9aSAndroid Build Coastguard Worker 			printf(", ... /* %p */]",			\
335*cf84ac9aSAndroid Build Coastguard Worker 			       RTA_DATA(TEST_NLATTR_nla)		\
336*cf84ac9aSAndroid Build Coastguard Worker 			        + sizeof(obj_) - sizeof((obj_)[0]));	\
337*cf84ac9aSAndroid Build Coastguard Worker 			for (i = 0; i < depth_; ++i)			\
338*cf84ac9aSAndroid Build Coastguard Worker 				printf("}"));				\
339*cf84ac9aSAndroid Build Coastguard Worker 		/* sizeof(obj_) */					\
340*cf84ac9aSAndroid Build Coastguard Worker 		TEST_NLATTR_((fd_), (nlh0_) - NLA_HDRLEN * depth_,	\
341*cf84ac9aSAndroid Build Coastguard Worker 			(hdrlen_) + NLA_HDRLEN * depth_,		\
342*cf84ac9aSAndroid Build Coastguard Worker 			(init_msg_), (print_msg_),			\
343*cf84ac9aSAndroid Build Coastguard Worker 			(nla_type_), #nla_type_,			\
344*cf84ac9aSAndroid Build Coastguard Worker 			sizeof(obj_),					\
345*cf84ac9aSAndroid Build Coastguard Worker 			&(obj_), sizeof(obj_),				\
346*cf84ac9aSAndroid Build Coastguard Worker 			printf("[");					\
347*cf84ac9aSAndroid Build Coastguard Worker 			size_t i;					\
348*cf84ac9aSAndroid Build Coastguard Worker 			for (i = 0; i < ARRAY_SIZE(obj_); ++i) {	\
349*cf84ac9aSAndroid Build Coastguard Worker 				if (i) printf(", ");			\
350*cf84ac9aSAndroid Build Coastguard Worker 				(print_elem_)(&(obj_)[i], i);		\
351*cf84ac9aSAndroid Build Coastguard Worker 			}						\
352*cf84ac9aSAndroid Build Coastguard Worker 			printf("]");					\
353*cf84ac9aSAndroid Build Coastguard Worker 			for (i = 0; i < depth_; ++i)			\
354*cf84ac9aSAndroid Build Coastguard Worker 				printf("}"));				\
355*cf84ac9aSAndroid Build Coastguard Worker 	} while (0)
356*cf84ac9aSAndroid Build Coastguard Worker 
357*cf84ac9aSAndroid Build Coastguard Worker #define TEST_NESTED_NLATTR_ARRAY(fd_, nlh0_, hdrlen_,			\
358*cf84ac9aSAndroid Build Coastguard Worker 				 init_msg_, print_msg_,			\
359*cf84ac9aSAndroid Build Coastguard Worker 				 nla_type_, pattern_, obj_, print_elem_)\
360*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NESTED_NLATTR_ARRAY_EX((fd_), (nlh0_), (hdrlen_),		\
361*cf84ac9aSAndroid Build Coastguard Worker 				    (init_msg_), (print_msg_),		\
362*cf84ac9aSAndroid Build Coastguard Worker 				    nla_type_, (pattern_), (obj_), 1,	\
363*cf84ac9aSAndroid Build Coastguard Worker 				    (print_elem_))
364