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