xref: /aosp_15_r20/external/strace/tests-mx32/netlink_sock_diag.c (revision cf84ac9a129d8ea9952db616b4e9b904c4bdde56)
1*cf84ac9aSAndroid Build Coastguard Worker /*
2*cf84ac9aSAndroid Build Coastguard Worker  * Copyright (c) 2016 Fabien Siron <[email protected]>
3*cf84ac9aSAndroid Build Coastguard Worker  * Copyright (c) 2017 JingPiao Chen <[email protected]>
4*cf84ac9aSAndroid Build Coastguard Worker  * Copyright (c) 2017-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 #include <stdio.h>
32*cf84ac9aSAndroid Build Coastguard Worker #include <string.h>
33*cf84ac9aSAndroid Build Coastguard Worker #include <stdint.h>
34*cf84ac9aSAndroid Build Coastguard Worker #include <unistd.h>
35*cf84ac9aSAndroid Build Coastguard Worker #include <sys/socket.h>
36*cf84ac9aSAndroid Build Coastguard Worker #include <arpa/inet.h>
37*cf84ac9aSAndroid Build Coastguard Worker #include <netinet/tcp.h>
38*cf84ac9aSAndroid Build Coastguard Worker #include "test_netlink.h"
39*cf84ac9aSAndroid Build Coastguard Worker #include <linux/if_ether.h>
40*cf84ac9aSAndroid Build Coastguard Worker #include <linux/inet_diag.h>
41*cf84ac9aSAndroid Build Coastguard Worker #include <linux/netlink_diag.h>
42*cf84ac9aSAndroid Build Coastguard Worker #include <linux/packet_diag.h>
43*cf84ac9aSAndroid Build Coastguard Worker #ifdef AF_SMC
44*cf84ac9aSAndroid Build Coastguard Worker # include <linux/smc_diag.h>
45*cf84ac9aSAndroid Build Coastguard Worker #endif
46*cf84ac9aSAndroid Build Coastguard Worker #include <linux/sock_diag.h>
47*cf84ac9aSAndroid Build Coastguard Worker #include <linux/unix_diag.h>
48*cf84ac9aSAndroid Build Coastguard Worker 
49*cf84ac9aSAndroid Build Coastguard Worker #define SMC_ACTIVE 1
50*cf84ac9aSAndroid Build Coastguard Worker 
51*cf84ac9aSAndroid Build Coastguard Worker #define TEST_SOCK_DIAG(fd_, nlh0_,					\
52*cf84ac9aSAndroid Build Coastguard Worker 		       family_, type_, flags_,				\
53*cf84ac9aSAndroid Build Coastguard Worker 		       obj_, print_family_, ...)			\
54*cf84ac9aSAndroid Build Coastguard Worker 									\
55*cf84ac9aSAndroid Build Coastguard Worker 	do {								\
56*cf84ac9aSAndroid Build Coastguard Worker 		/* family only */					\
57*cf84ac9aSAndroid Build Coastguard Worker 		uint8_t family = (family_);				\
58*cf84ac9aSAndroid Build Coastguard Worker 		TEST_NETLINK_((fd_), (nlh0_),				\
59*cf84ac9aSAndroid Build Coastguard Worker 			      type_, #type_,				\
60*cf84ac9aSAndroid Build Coastguard Worker 			      flags_, #flags_,				\
61*cf84ac9aSAndroid Build Coastguard Worker 			      sizeof(family), &family, sizeof(family),	\
62*cf84ac9aSAndroid Build Coastguard Worker 			      printf("{family=%s}", #family_));		\
63*cf84ac9aSAndroid Build Coastguard Worker 									\
64*cf84ac9aSAndroid Build Coastguard Worker 		/* family and string */					\
65*cf84ac9aSAndroid Build Coastguard Worker 		char buf[sizeof(family) + 4];				\
66*cf84ac9aSAndroid Build Coastguard Worker 		memcpy(buf, &family, sizeof(family));			\
67*cf84ac9aSAndroid Build Coastguard Worker 		memcpy(buf + sizeof(family), "1234", 4);		\
68*cf84ac9aSAndroid Build Coastguard Worker 		TEST_NETLINK_((fd_), (nlh0_),				\
69*cf84ac9aSAndroid Build Coastguard Worker 			      type_, #type_,				\
70*cf84ac9aSAndroid Build Coastguard Worker 			      flags_, #flags_,				\
71*cf84ac9aSAndroid Build Coastguard Worker 			      sizeof(buf), buf, sizeof(buf),		\
72*cf84ac9aSAndroid Build Coastguard Worker 			      (print_family_);				\
73*cf84ac9aSAndroid Build Coastguard Worker 			      printf(", ...}"));			\
74*cf84ac9aSAndroid Build Coastguard Worker 									\
75*cf84ac9aSAndroid Build Coastguard Worker 		/* sizeof(obj_) */					\
76*cf84ac9aSAndroid Build Coastguard Worker 		TEST_NETLINK_((fd_), (nlh0_),				\
77*cf84ac9aSAndroid Build Coastguard Worker 			      type_, #type_,				\
78*cf84ac9aSAndroid Build Coastguard Worker 			      flags_, #flags_,				\
79*cf84ac9aSAndroid Build Coastguard Worker 			      sizeof(obj_), &(obj_), sizeof(obj_),	\
80*cf84ac9aSAndroid Build Coastguard Worker 			      (print_family_);				\
81*cf84ac9aSAndroid Build Coastguard Worker 			      __VA_ARGS__);				\
82*cf84ac9aSAndroid Build Coastguard Worker 									\
83*cf84ac9aSAndroid Build Coastguard Worker 		/* short read of sizeof(obj_) */			\
84*cf84ac9aSAndroid Build Coastguard Worker 		TEST_NETLINK_((fd_), (nlh0_),				\
85*cf84ac9aSAndroid Build Coastguard Worker 			      type_, #type_,				\
86*cf84ac9aSAndroid Build Coastguard Worker 			      flags_, #flags_,				\
87*cf84ac9aSAndroid Build Coastguard Worker 			      sizeof(obj_), &(obj_), sizeof(obj_) - 1,	\
88*cf84ac9aSAndroid Build Coastguard Worker 			      (print_family_);				\
89*cf84ac9aSAndroid Build Coastguard Worker 			      printf(", %p}",				\
90*cf84ac9aSAndroid Build Coastguard Worker 				     NLMSG_DATA(TEST_NETLINK_nlh) + 1));\
91*cf84ac9aSAndroid Build Coastguard Worker 	} while (0)
92*cf84ac9aSAndroid Build Coastguard Worker 
93*cf84ac9aSAndroid Build Coastguard Worker static void
test_nlmsg_type(const int fd)94*cf84ac9aSAndroid Build Coastguard Worker test_nlmsg_type(const int fd)
95*cf84ac9aSAndroid Build Coastguard Worker {
96*cf84ac9aSAndroid Build Coastguard Worker 	long rc;
97*cf84ac9aSAndroid Build Coastguard Worker 	struct nlmsghdr nlh = {
98*cf84ac9aSAndroid Build Coastguard Worker 		.nlmsg_len = sizeof(nlh),
99*cf84ac9aSAndroid Build Coastguard Worker 		.nlmsg_type = SOCK_DIAG_BY_FAMILY,
100*cf84ac9aSAndroid Build Coastguard Worker 		.nlmsg_flags = NLM_F_REQUEST,
101*cf84ac9aSAndroid Build Coastguard Worker 	};
102*cf84ac9aSAndroid Build Coastguard Worker 
103*cf84ac9aSAndroid Build Coastguard Worker 	rc = sendto(fd, &nlh, sizeof(nlh), MSG_DONTWAIT, NULL, 0);
104*cf84ac9aSAndroid Build Coastguard Worker 	printf("sendto(%d, {len=%u, type=SOCK_DIAG_BY_FAMILY"
105*cf84ac9aSAndroid Build Coastguard Worker 	       ", flags=NLM_F_REQUEST, seq=0, pid=0}"
106*cf84ac9aSAndroid Build Coastguard Worker 	       ", %u, MSG_DONTWAIT, NULL, 0) = %s\n",
107*cf84ac9aSAndroid Build Coastguard Worker 	       fd, nlh.nlmsg_len, (unsigned) sizeof(nlh), sprintrc(rc));
108*cf84ac9aSAndroid Build Coastguard Worker }
109*cf84ac9aSAndroid Build Coastguard Worker 
110*cf84ac9aSAndroid Build Coastguard Worker static void
test_nlmsg_flags(const int fd)111*cf84ac9aSAndroid Build Coastguard Worker test_nlmsg_flags(const int fd)
112*cf84ac9aSAndroid Build Coastguard Worker {
113*cf84ac9aSAndroid Build Coastguard Worker 	long rc;
114*cf84ac9aSAndroid Build Coastguard Worker 	struct nlmsghdr nlh = {
115*cf84ac9aSAndroid Build Coastguard Worker 		.nlmsg_len = sizeof(nlh),
116*cf84ac9aSAndroid Build Coastguard Worker 		.nlmsg_type = SOCK_DIAG_BY_FAMILY,
117*cf84ac9aSAndroid Build Coastguard Worker 		.nlmsg_flags = NLM_F_REQUEST | NLM_F_DUMP,
118*cf84ac9aSAndroid Build Coastguard Worker 	};
119*cf84ac9aSAndroid Build Coastguard Worker 
120*cf84ac9aSAndroid Build Coastguard Worker 	rc = sendto(fd, &nlh, sizeof(nlh), MSG_DONTWAIT, NULL, 0);
121*cf84ac9aSAndroid Build Coastguard Worker 	printf("sendto(%d, {len=%u, type=SOCK_DIAG_BY_FAMILY"
122*cf84ac9aSAndroid Build Coastguard Worker 	       ", flags=NLM_F_REQUEST|NLM_F_DUMP, seq=0, pid=0}"
123*cf84ac9aSAndroid Build Coastguard Worker 	       ", %u, MSG_DONTWAIT, NULL, 0) = %s\n",
124*cf84ac9aSAndroid Build Coastguard Worker 	       fd, nlh.nlmsg_len, (unsigned) sizeof(nlh), sprintrc(rc));
125*cf84ac9aSAndroid Build Coastguard Worker }
126*cf84ac9aSAndroid Build Coastguard Worker 
127*cf84ac9aSAndroid Build Coastguard Worker static void
test_odd_family_req(const int fd)128*cf84ac9aSAndroid Build Coastguard Worker test_odd_family_req(const int fd)
129*cf84ac9aSAndroid Build Coastguard Worker {
130*cf84ac9aSAndroid Build Coastguard Worker 	uint8_t family = 0;
131*cf84ac9aSAndroid Build Coastguard Worker 	char buf[sizeof(family) + 4];
132*cf84ac9aSAndroid Build Coastguard Worker 	void *const nlh0 = midtail_alloc(NLMSG_HDRLEN, sizeof(buf));
133*cf84ac9aSAndroid Build Coastguard Worker 
134*cf84ac9aSAndroid Build Coastguard Worker 	/* unspecified family only */
135*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NETLINK(fd, nlh0,
136*cf84ac9aSAndroid Build Coastguard Worker 		     SOCK_DIAG_BY_FAMILY,
137*cf84ac9aSAndroid Build Coastguard Worker 		     NLM_F_REQUEST,
138*cf84ac9aSAndroid Build Coastguard Worker 		     sizeof(family), &family, sizeof(family),
139*cf84ac9aSAndroid Build Coastguard Worker 		     printf("{family=AF_UNSPEC}"));
140*cf84ac9aSAndroid Build Coastguard Worker 
141*cf84ac9aSAndroid Build Coastguard Worker 	/* unknown family only */
142*cf84ac9aSAndroid Build Coastguard Worker 	family = 0xff;
143*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NETLINK(fd, nlh0,
144*cf84ac9aSAndroid Build Coastguard Worker 		     SOCK_DIAG_BY_FAMILY,
145*cf84ac9aSAndroid Build Coastguard Worker 		     NLM_F_REQUEST,
146*cf84ac9aSAndroid Build Coastguard Worker 		     sizeof(family), &family, sizeof(family),
147*cf84ac9aSAndroid Build Coastguard Worker 		     printf("{family=%#x /* AF_??? */}", family));
148*cf84ac9aSAndroid Build Coastguard Worker 
149*cf84ac9aSAndroid Build Coastguard Worker 	/* short read of family */
150*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NETLINK(fd, nlh0,
151*cf84ac9aSAndroid Build Coastguard Worker 		     SOCK_DIAG_BY_FAMILY,
152*cf84ac9aSAndroid Build Coastguard Worker 		     NLM_F_REQUEST,
153*cf84ac9aSAndroid Build Coastguard Worker 		     sizeof(family), &family, sizeof(family) - 1,
154*cf84ac9aSAndroid Build Coastguard Worker 		     printf("%p", NLMSG_DATA(TEST_NETLINK_nlh)));
155*cf84ac9aSAndroid Build Coastguard Worker 
156*cf84ac9aSAndroid Build Coastguard Worker 	/* unspecified family and string */
157*cf84ac9aSAndroid Build Coastguard Worker 	family = 0;
158*cf84ac9aSAndroid Build Coastguard Worker 	memcpy(buf, &family, sizeof(family));
159*cf84ac9aSAndroid Build Coastguard Worker 	memcpy(buf + sizeof(family), "1234", 4);
160*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NETLINK(fd, nlh0,
161*cf84ac9aSAndroid Build Coastguard Worker 		     SOCK_DIAG_BY_FAMILY,
162*cf84ac9aSAndroid Build Coastguard Worker 		     NLM_F_REQUEST,
163*cf84ac9aSAndroid Build Coastguard Worker 		     sizeof(buf), buf, sizeof(buf),
164*cf84ac9aSAndroid Build Coastguard Worker 		     printf("{family=AF_UNSPEC, \"\\x31\\x32\\x33\\x34\"}"));
165*cf84ac9aSAndroid Build Coastguard Worker 
166*cf84ac9aSAndroid Build Coastguard Worker 	/* unknown family and string */
167*cf84ac9aSAndroid Build Coastguard Worker 	family = 0xfd;
168*cf84ac9aSAndroid Build Coastguard Worker 	memcpy(buf, &family, sizeof(family));
169*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NETLINK(fd, nlh0,
170*cf84ac9aSAndroid Build Coastguard Worker 		     SOCK_DIAG_BY_FAMILY,
171*cf84ac9aSAndroid Build Coastguard Worker 		     NLM_F_REQUEST,
172*cf84ac9aSAndroid Build Coastguard Worker 		     sizeof(buf), buf, sizeof(buf),
173*cf84ac9aSAndroid Build Coastguard Worker 		     printf("{family=%#x /* AF_??? */"
174*cf84ac9aSAndroid Build Coastguard Worker 			    ", \"\\x31\\x32\\x33\\x34\"}", family));
175*cf84ac9aSAndroid Build Coastguard Worker }
176*cf84ac9aSAndroid Build Coastguard Worker 
177*cf84ac9aSAndroid Build Coastguard Worker static void
test_odd_family_msg(const int fd)178*cf84ac9aSAndroid Build Coastguard Worker test_odd_family_msg(const int fd)
179*cf84ac9aSAndroid Build Coastguard Worker {
180*cf84ac9aSAndroid Build Coastguard Worker 	uint8_t family = 0;
181*cf84ac9aSAndroid Build Coastguard Worker 	char buf[sizeof(family) + 4];
182*cf84ac9aSAndroid Build Coastguard Worker 	void *const nlh0 = midtail_alloc(NLMSG_HDRLEN, sizeof(buf));
183*cf84ac9aSAndroid Build Coastguard Worker 
184*cf84ac9aSAndroid Build Coastguard Worker 	/* unspecified family only */
185*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NETLINK(fd, nlh0,
186*cf84ac9aSAndroid Build Coastguard Worker 		     SOCK_DIAG_BY_FAMILY, NLM_F_DUMP,
187*cf84ac9aSAndroid Build Coastguard Worker 		     sizeof(family), &family, sizeof(family),
188*cf84ac9aSAndroid Build Coastguard Worker 		     printf("{family=AF_UNSPEC}"));
189*cf84ac9aSAndroid Build Coastguard Worker 
190*cf84ac9aSAndroid Build Coastguard Worker 	/* unknown family only */
191*cf84ac9aSAndroid Build Coastguard Worker 	family = 0xff;
192*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NETLINK(fd, nlh0,
193*cf84ac9aSAndroid Build Coastguard Worker 		     SOCK_DIAG_BY_FAMILY, NLM_F_DUMP,
194*cf84ac9aSAndroid Build Coastguard Worker 		     sizeof(family), &family, sizeof(family),
195*cf84ac9aSAndroid Build Coastguard Worker 		     printf("{family=%#x /* AF_??? */}", family));
196*cf84ac9aSAndroid Build Coastguard Worker 
197*cf84ac9aSAndroid Build Coastguard Worker 	/* short read of family */
198*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NETLINK(fd, nlh0,
199*cf84ac9aSAndroid Build Coastguard Worker 		     SOCK_DIAG_BY_FAMILY, NLM_F_DUMP,
200*cf84ac9aSAndroid Build Coastguard Worker 		     sizeof(family), &family, sizeof(family) - 1,
201*cf84ac9aSAndroid Build Coastguard Worker 		     printf("%p", NLMSG_DATA(TEST_NETLINK_nlh)));
202*cf84ac9aSAndroid Build Coastguard Worker 
203*cf84ac9aSAndroid Build Coastguard Worker 	/* unspecified family and string */
204*cf84ac9aSAndroid Build Coastguard Worker 	family = 0;
205*cf84ac9aSAndroid Build Coastguard Worker 	memcpy(buf, &family, sizeof(family));
206*cf84ac9aSAndroid Build Coastguard Worker 	memcpy(buf + sizeof(family), "1234", 4);
207*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NETLINK(fd, nlh0,
208*cf84ac9aSAndroid Build Coastguard Worker 		     SOCK_DIAG_BY_FAMILY, NLM_F_DUMP,
209*cf84ac9aSAndroid Build Coastguard Worker 		     sizeof(buf), buf, sizeof(buf),
210*cf84ac9aSAndroid Build Coastguard Worker 		     printf("{family=AF_UNSPEC, \"\\x31\\x32\\x33\\x34\"}"));
211*cf84ac9aSAndroid Build Coastguard Worker 
212*cf84ac9aSAndroid Build Coastguard Worker 	/* unknown family and string */
213*cf84ac9aSAndroid Build Coastguard Worker 	family = 0xfd;
214*cf84ac9aSAndroid Build Coastguard Worker 	memcpy(buf, &family, sizeof(family));
215*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NETLINK(fd, nlh0,
216*cf84ac9aSAndroid Build Coastguard Worker 		     SOCK_DIAG_BY_FAMILY, NLM_F_DUMP,
217*cf84ac9aSAndroid Build Coastguard Worker 		     sizeof(buf), buf, sizeof(buf),
218*cf84ac9aSAndroid Build Coastguard Worker 		     printf("{family=%#x /* AF_??? */"
219*cf84ac9aSAndroid Build Coastguard Worker 			    ", \"\\x31\\x32\\x33\\x34\"}", family));
220*cf84ac9aSAndroid Build Coastguard Worker }
221*cf84ac9aSAndroid Build Coastguard Worker 
222*cf84ac9aSAndroid Build Coastguard Worker static void
test_unix_diag_req(const int fd)223*cf84ac9aSAndroid Build Coastguard Worker test_unix_diag_req(const int fd)
224*cf84ac9aSAndroid Build Coastguard Worker {
225*cf84ac9aSAndroid Build Coastguard Worker 	static const struct unix_diag_req req = {
226*cf84ac9aSAndroid Build Coastguard Worker 		.sdiag_family = AF_UNIX,
227*cf84ac9aSAndroid Build Coastguard Worker 		.sdiag_protocol = 253,
228*cf84ac9aSAndroid Build Coastguard Worker 		.udiag_states = 1 << TCP_ESTABLISHED | 1 << TCP_LISTEN,
229*cf84ac9aSAndroid Build Coastguard Worker 		.udiag_ino = 0xfacefeed,
230*cf84ac9aSAndroid Build Coastguard Worker 		.udiag_show = UDIAG_SHOW_NAME,
231*cf84ac9aSAndroid Build Coastguard Worker 		.udiag_cookie = { 0xdeadbeef, 0xbadc0ded }
232*cf84ac9aSAndroid Build Coastguard Worker 	};
233*cf84ac9aSAndroid Build Coastguard Worker 	void *const nlh0 = midtail_alloc(NLMSG_HDRLEN, sizeof(req));
234*cf84ac9aSAndroid Build Coastguard Worker 	TEST_SOCK_DIAG(fd, nlh0, AF_UNIX,
235*cf84ac9aSAndroid Build Coastguard Worker 		       SOCK_DIAG_BY_FAMILY, NLM_F_REQUEST, req,
236*cf84ac9aSAndroid Build Coastguard Worker 		       printf("{sdiag_family=AF_UNIX"),
237*cf84ac9aSAndroid Build Coastguard Worker 		       PRINT_FIELD_U(", ", req, sdiag_protocol);
238*cf84ac9aSAndroid Build Coastguard Worker 		       printf(", udiag_states=1<<TCP_ESTABLISHED|1<<TCP_LISTEN");
239*cf84ac9aSAndroid Build Coastguard Worker 		       PRINT_FIELD_U(", ", req, udiag_ino);
240*cf84ac9aSAndroid Build Coastguard Worker 		       printf(", udiag_show=UDIAG_SHOW_NAME");
241*cf84ac9aSAndroid Build Coastguard Worker 		       PRINT_FIELD_COOKIE(", ", req, udiag_cookie);
242*cf84ac9aSAndroid Build Coastguard Worker 		       printf("}"));
243*cf84ac9aSAndroid Build Coastguard Worker }
244*cf84ac9aSAndroid Build Coastguard Worker 
245*cf84ac9aSAndroid Build Coastguard Worker static void
test_unix_diag_msg(const int fd)246*cf84ac9aSAndroid Build Coastguard Worker test_unix_diag_msg(const int fd)
247*cf84ac9aSAndroid Build Coastguard Worker {
248*cf84ac9aSAndroid Build Coastguard Worker 	static const struct unix_diag_msg msg = {
249*cf84ac9aSAndroid Build Coastguard Worker 		.udiag_family = AF_UNIX,
250*cf84ac9aSAndroid Build Coastguard Worker 		.udiag_type = SOCK_STREAM,
251*cf84ac9aSAndroid Build Coastguard Worker 		.udiag_state = TCP_FIN_WAIT1,
252*cf84ac9aSAndroid Build Coastguard Worker 		.udiag_ino = 0xfacefeed,
253*cf84ac9aSAndroid Build Coastguard Worker 		.udiag_cookie = { 0xdeadbeef, 0xbadc0ded }
254*cf84ac9aSAndroid Build Coastguard Worker 	};
255*cf84ac9aSAndroid Build Coastguard Worker 	void *const nlh0 = midtail_alloc(NLMSG_HDRLEN, sizeof(msg));
256*cf84ac9aSAndroid Build Coastguard Worker 	TEST_SOCK_DIAG(fd, nlh0, AF_UNIX,
257*cf84ac9aSAndroid Build Coastguard Worker 		       SOCK_DIAG_BY_FAMILY, NLM_F_DUMP, msg,
258*cf84ac9aSAndroid Build Coastguard Worker 		       printf("{udiag_family=AF_UNIX"),
259*cf84ac9aSAndroid Build Coastguard Worker 		       printf(", udiag_type=SOCK_STREAM"
260*cf84ac9aSAndroid Build Coastguard Worker 			      ", udiag_state=TCP_FIN_WAIT1");
261*cf84ac9aSAndroid Build Coastguard Worker 		       PRINT_FIELD_U(", ", msg, udiag_ino);
262*cf84ac9aSAndroid Build Coastguard Worker 		       PRINT_FIELD_COOKIE(", ", msg, udiag_cookie);
263*cf84ac9aSAndroid Build Coastguard Worker 		       printf("}"));
264*cf84ac9aSAndroid Build Coastguard Worker }
265*cf84ac9aSAndroid Build Coastguard Worker 
266*cf84ac9aSAndroid Build Coastguard Worker static void
test_netlink_diag_req(const int fd)267*cf84ac9aSAndroid Build Coastguard Worker test_netlink_diag_req(const int fd)
268*cf84ac9aSAndroid Build Coastguard Worker {
269*cf84ac9aSAndroid Build Coastguard Worker 	struct netlink_diag_req req = {
270*cf84ac9aSAndroid Build Coastguard Worker 		.sdiag_family = AF_NETLINK,
271*cf84ac9aSAndroid Build Coastguard Worker 		.sdiag_protocol = NDIAG_PROTO_ALL,
272*cf84ac9aSAndroid Build Coastguard Worker 		.ndiag_ino = 0xfacefeed,
273*cf84ac9aSAndroid Build Coastguard Worker 		.ndiag_show = NDIAG_SHOW_MEMINFO,
274*cf84ac9aSAndroid Build Coastguard Worker 		.ndiag_cookie = { 0xdeadbeef, 0xbadc0ded }
275*cf84ac9aSAndroid Build Coastguard Worker 	};
276*cf84ac9aSAndroid Build Coastguard Worker 	void *const nlh0 = midtail_alloc(NLMSG_HDRLEN, sizeof(req));
277*cf84ac9aSAndroid Build Coastguard Worker 	TEST_SOCK_DIAG(fd, nlh0, AF_NETLINK,
278*cf84ac9aSAndroid Build Coastguard Worker 		       SOCK_DIAG_BY_FAMILY, NLM_F_REQUEST, req,
279*cf84ac9aSAndroid Build Coastguard Worker 		       printf("{sdiag_family=AF_NETLINK"),
280*cf84ac9aSAndroid Build Coastguard Worker 		       printf(", sdiag_protocol=NDIAG_PROTO_ALL");
281*cf84ac9aSAndroid Build Coastguard Worker 		       PRINT_FIELD_U(", ", req, ndiag_ino);
282*cf84ac9aSAndroid Build Coastguard Worker 		       printf(", ndiag_show=NDIAG_SHOW_MEMINFO");
283*cf84ac9aSAndroid Build Coastguard Worker 		       PRINT_FIELD_COOKIE(", ", req, ndiag_cookie);
284*cf84ac9aSAndroid Build Coastguard Worker 		       printf("}"));
285*cf84ac9aSAndroid Build Coastguard Worker 
286*cf84ac9aSAndroid Build Coastguard Worker 	req.sdiag_protocol = NETLINK_ROUTE;
287*cf84ac9aSAndroid Build Coastguard Worker 	req.ndiag_show = NDIAG_SHOW_GROUPS;
288*cf84ac9aSAndroid Build Coastguard Worker 	TEST_SOCK_DIAG(fd, nlh0, AF_NETLINK,
289*cf84ac9aSAndroid Build Coastguard Worker 		       SOCK_DIAG_BY_FAMILY, NLM_F_REQUEST, req,
290*cf84ac9aSAndroid Build Coastguard Worker 		       printf("{sdiag_family=AF_NETLINK"),
291*cf84ac9aSAndroid Build Coastguard Worker 		       printf(", sdiag_protocol=NETLINK_ROUTE");
292*cf84ac9aSAndroid Build Coastguard Worker 		       PRINT_FIELD_U(", ", req, ndiag_ino);
293*cf84ac9aSAndroid Build Coastguard Worker 		       printf(", ndiag_show=NDIAG_SHOW_GROUPS");
294*cf84ac9aSAndroid Build Coastguard Worker 		       PRINT_FIELD_COOKIE(", ", req, ndiag_cookie);
295*cf84ac9aSAndroid Build Coastguard Worker 		       printf("}"));
296*cf84ac9aSAndroid Build Coastguard Worker }
297*cf84ac9aSAndroid Build Coastguard Worker 
298*cf84ac9aSAndroid Build Coastguard Worker static void
test_netlink_diag_msg(const int fd)299*cf84ac9aSAndroid Build Coastguard Worker test_netlink_diag_msg(const int fd)
300*cf84ac9aSAndroid Build Coastguard Worker {
301*cf84ac9aSAndroid Build Coastguard Worker 	static const struct netlink_diag_msg msg = {
302*cf84ac9aSAndroid Build Coastguard Worker 		.ndiag_family = AF_NETLINK,
303*cf84ac9aSAndroid Build Coastguard Worker 		.ndiag_type = SOCK_RAW,
304*cf84ac9aSAndroid Build Coastguard Worker 		.ndiag_protocol = NETLINK_ROUTE,
305*cf84ac9aSAndroid Build Coastguard Worker 		.ndiag_state = NETLINK_CONNECTED,
306*cf84ac9aSAndroid Build Coastguard Worker 		.ndiag_portid = 0xbadc0ded,
307*cf84ac9aSAndroid Build Coastguard Worker 		.ndiag_dst_portid = 0xdeadbeef,
308*cf84ac9aSAndroid Build Coastguard Worker 		.ndiag_dst_group = 0xfacefeed,
309*cf84ac9aSAndroid Build Coastguard Worker 		.ndiag_ino = 0xdaeefacd,
310*cf84ac9aSAndroid Build Coastguard Worker 		.ndiag_cookie = { 0xbadc0ded, 0xdeadbeef }
311*cf84ac9aSAndroid Build Coastguard Worker 	};
312*cf84ac9aSAndroid Build Coastguard Worker 	void *const nlh0 = midtail_alloc(NLMSG_HDRLEN, sizeof(msg));
313*cf84ac9aSAndroid Build Coastguard Worker 	TEST_SOCK_DIAG(fd, nlh0, AF_NETLINK,
314*cf84ac9aSAndroid Build Coastguard Worker 		       SOCK_DIAG_BY_FAMILY, NLM_F_DUMP, msg,
315*cf84ac9aSAndroid Build Coastguard Worker 		       printf("{ndiag_family=AF_NETLINK"),
316*cf84ac9aSAndroid Build Coastguard Worker 		       printf(", ndiag_type=SOCK_RAW"
317*cf84ac9aSAndroid Build Coastguard Worker 			      ", ndiag_protocol=NETLINK_ROUTE"
318*cf84ac9aSAndroid Build Coastguard Worker 			      ", ndiag_state=NETLINK_CONNECTED");
319*cf84ac9aSAndroid Build Coastguard Worker 		       PRINT_FIELD_U(", ", msg, ndiag_portid);
320*cf84ac9aSAndroid Build Coastguard Worker 		       PRINT_FIELD_U(", ", msg, ndiag_dst_portid);
321*cf84ac9aSAndroid Build Coastguard Worker 		       PRINT_FIELD_U(", ", msg, ndiag_dst_group);
322*cf84ac9aSAndroid Build Coastguard Worker 		       PRINT_FIELD_U(", ", msg, ndiag_ino);
323*cf84ac9aSAndroid Build Coastguard Worker 		       PRINT_FIELD_COOKIE(", ", msg, ndiag_cookie);
324*cf84ac9aSAndroid Build Coastguard Worker 		       printf("}"));
325*cf84ac9aSAndroid Build Coastguard Worker }
326*cf84ac9aSAndroid Build Coastguard Worker 
327*cf84ac9aSAndroid Build Coastguard Worker static void
test_packet_diag_req(const int fd)328*cf84ac9aSAndroid Build Coastguard Worker test_packet_diag_req(const int fd)
329*cf84ac9aSAndroid Build Coastguard Worker {
330*cf84ac9aSAndroid Build Coastguard Worker 	static const struct packet_diag_req req = {
331*cf84ac9aSAndroid Build Coastguard Worker 		.sdiag_family = AF_PACKET,
332*cf84ac9aSAndroid Build Coastguard Worker 		.sdiag_protocol = ETH_P_LOOP,
333*cf84ac9aSAndroid Build Coastguard Worker 		.pdiag_ino = 0xfacefeed,
334*cf84ac9aSAndroid Build Coastguard Worker 		.pdiag_show = PACKET_SHOW_INFO,
335*cf84ac9aSAndroid Build Coastguard Worker 		.pdiag_cookie = { 0xdeadbeef, 0xbadc0ded }
336*cf84ac9aSAndroid Build Coastguard Worker 	};
337*cf84ac9aSAndroid Build Coastguard Worker 	void *const nlh0 = midtail_alloc(NLMSG_HDRLEN, sizeof(req));
338*cf84ac9aSAndroid Build Coastguard Worker 	TEST_SOCK_DIAG(fd, nlh0, AF_PACKET,
339*cf84ac9aSAndroid Build Coastguard Worker 		       SOCK_DIAG_BY_FAMILY, NLM_F_REQUEST, req,
340*cf84ac9aSAndroid Build Coastguard Worker 		       printf("{sdiag_family=AF_PACKET"),
341*cf84ac9aSAndroid Build Coastguard Worker 		       printf(", sdiag_protocol=%#x", req.sdiag_protocol);
342*cf84ac9aSAndroid Build Coastguard Worker 		       PRINT_FIELD_U(", ", req, pdiag_ino);
343*cf84ac9aSAndroid Build Coastguard Worker 		       printf(", pdiag_show=PACKET_SHOW_INFO");
344*cf84ac9aSAndroid Build Coastguard Worker 		       PRINT_FIELD_COOKIE(", ", req, pdiag_cookie);
345*cf84ac9aSAndroid Build Coastguard Worker 		       printf("}"));
346*cf84ac9aSAndroid Build Coastguard Worker }
347*cf84ac9aSAndroid Build Coastguard Worker 
348*cf84ac9aSAndroid Build Coastguard Worker static void
test_packet_diag_msg(const int fd)349*cf84ac9aSAndroid Build Coastguard Worker test_packet_diag_msg(const int fd)
350*cf84ac9aSAndroid Build Coastguard Worker {
351*cf84ac9aSAndroid Build Coastguard Worker 	static const struct packet_diag_msg msg = {
352*cf84ac9aSAndroid Build Coastguard Worker 		.pdiag_family = AF_PACKET,
353*cf84ac9aSAndroid Build Coastguard Worker 		.pdiag_type = SOCK_STREAM,
354*cf84ac9aSAndroid Build Coastguard Worker 		.pdiag_num = 0x9100,
355*cf84ac9aSAndroid Build Coastguard Worker 		.pdiag_ino = 0xfacefeed,
356*cf84ac9aSAndroid Build Coastguard Worker 		.pdiag_cookie = { 0xdeadbeef, 0xbadc0ded }
357*cf84ac9aSAndroid Build Coastguard Worker 	};
358*cf84ac9aSAndroid Build Coastguard Worker 	void *const nlh0 = midtail_alloc(NLMSG_HDRLEN, sizeof(msg));
359*cf84ac9aSAndroid Build Coastguard Worker 	TEST_SOCK_DIAG(fd, nlh0, AF_PACKET,
360*cf84ac9aSAndroid Build Coastguard Worker 		       SOCK_DIAG_BY_FAMILY, NLM_F_DUMP, msg,
361*cf84ac9aSAndroid Build Coastguard Worker 		       printf("{pdiag_family=AF_PACKET"),
362*cf84ac9aSAndroid Build Coastguard Worker 		       printf(", pdiag_type=SOCK_STREAM");
363*cf84ac9aSAndroid Build Coastguard Worker 		       printf(", pdiag_num=ETH_P_QINQ1");
364*cf84ac9aSAndroid Build Coastguard Worker 		       PRINT_FIELD_U(", ", msg, pdiag_ino);
365*cf84ac9aSAndroid Build Coastguard Worker 		       PRINT_FIELD_COOKIE(", ", msg, pdiag_cookie);
366*cf84ac9aSAndroid Build Coastguard Worker 		       printf("}"));
367*cf84ac9aSAndroid Build Coastguard Worker }
368*cf84ac9aSAndroid Build Coastguard Worker 
369*cf84ac9aSAndroid Build Coastguard Worker static void
test_inet_diag_sockid(const int fd)370*cf84ac9aSAndroid Build Coastguard Worker test_inet_diag_sockid(const int fd)
371*cf84ac9aSAndroid Build Coastguard Worker {
372*cf84ac9aSAndroid Build Coastguard Worker 	const char address[] = "12.34.56.78";
373*cf84ac9aSAndroid Build Coastguard Worker 	const char address6[] = "12:34:56:78:90:ab:cd:ef";
374*cf84ac9aSAndroid Build Coastguard Worker 	struct inet_diag_req_v2 req = {
375*cf84ac9aSAndroid Build Coastguard Worker 		.sdiag_family = AF_INET,
376*cf84ac9aSAndroid Build Coastguard Worker 		.idiag_ext = 1 << (INET_DIAG_CONG - 1),
377*cf84ac9aSAndroid Build Coastguard Worker 		.sdiag_protocol = IPPROTO_TCP,
378*cf84ac9aSAndroid Build Coastguard Worker 		.idiag_states = 1 << TCP_CLOSE,
379*cf84ac9aSAndroid Build Coastguard Worker 		.id = {
380*cf84ac9aSAndroid Build Coastguard Worker 			.idiag_sport = 0xfacd,
381*cf84ac9aSAndroid Build Coastguard Worker 			.idiag_dport = 0xdead,
382*cf84ac9aSAndroid Build Coastguard Worker 			.idiag_if = ifindex_lo(),
383*cf84ac9aSAndroid Build Coastguard Worker 			.idiag_cookie = { 0xdeadbeef, 0xbadc0ded }
384*cf84ac9aSAndroid Build Coastguard Worker 		},
385*cf84ac9aSAndroid Build Coastguard Worker 	};
386*cf84ac9aSAndroid Build Coastguard Worker 	void *const nlh0 = midtail_alloc(NLMSG_HDRLEN, sizeof(req));
387*cf84ac9aSAndroid Build Coastguard Worker 
388*cf84ac9aSAndroid Build Coastguard Worker 	if (!inet_pton(AF_INET, address, &req.id.idiag_src) ||
389*cf84ac9aSAndroid Build Coastguard Worker 	    !inet_pton(AF_INET, address, &req.id.idiag_dst))
390*cf84ac9aSAndroid Build Coastguard Worker 		perror_msg_and_skip("inet_pton");
391*cf84ac9aSAndroid Build Coastguard Worker 
392*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NETLINK(fd, nlh0,
393*cf84ac9aSAndroid Build Coastguard Worker 		     SOCK_DIAG_BY_FAMILY, NLM_F_REQUEST,
394*cf84ac9aSAndroid Build Coastguard Worker 		     sizeof(req), &req, sizeof(req),
395*cf84ac9aSAndroid Build Coastguard Worker 		     printf("{sdiag_family=AF_INET"),
396*cf84ac9aSAndroid Build Coastguard Worker 		     printf(", sdiag_protocol=IPPROTO_TCP"
397*cf84ac9aSAndroid Build Coastguard Worker 			    ", idiag_ext=1<<(INET_DIAG_CONG-1)"
398*cf84ac9aSAndroid Build Coastguard Worker 			    ", idiag_states=1<<TCP_CLOSE"
399*cf84ac9aSAndroid Build Coastguard Worker 			    ", id={idiag_sport=htons(%u)"
400*cf84ac9aSAndroid Build Coastguard Worker 			    ", idiag_dport=htons(%u)"
401*cf84ac9aSAndroid Build Coastguard Worker 			    ", idiag_src=inet_addr(\"%s\")"
402*cf84ac9aSAndroid Build Coastguard Worker 			    ", idiag_dst=inet_addr(\"%s\")",
403*cf84ac9aSAndroid Build Coastguard Worker 			    ntohs(req.id.idiag_sport),
404*cf84ac9aSAndroid Build Coastguard Worker 			    ntohs(req.id.idiag_dport),
405*cf84ac9aSAndroid Build Coastguard Worker 			    address, address);
406*cf84ac9aSAndroid Build Coastguard Worker 		     printf(", idiag_if=" IFINDEX_LO_STR);
407*cf84ac9aSAndroid Build Coastguard Worker 		     PRINT_FIELD_COOKIE(", ", req.id, idiag_cookie);
408*cf84ac9aSAndroid Build Coastguard Worker 		     printf("}}"));
409*cf84ac9aSAndroid Build Coastguard Worker 
410*cf84ac9aSAndroid Build Coastguard Worker 	req.sdiag_family = AF_INET6;
411*cf84ac9aSAndroid Build Coastguard Worker 	if (!inet_pton(AF_INET6, address6, &req.id.idiag_src) ||
412*cf84ac9aSAndroid Build Coastguard Worker 	    !inet_pton(AF_INET6, address6, &req.id.idiag_dst))
413*cf84ac9aSAndroid Build Coastguard Worker 		perror_msg_and_skip("inet_pton");
414*cf84ac9aSAndroid Build Coastguard Worker 
415*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NETLINK(fd, nlh0,
416*cf84ac9aSAndroid Build Coastguard Worker 		     SOCK_DIAG_BY_FAMILY, NLM_F_REQUEST,
417*cf84ac9aSAndroid Build Coastguard Worker 		     sizeof(req), &req, sizeof(req),
418*cf84ac9aSAndroid Build Coastguard Worker 		     printf("{sdiag_family=AF_INET6"),
419*cf84ac9aSAndroid Build Coastguard Worker 		     printf(", sdiag_protocol=IPPROTO_TCP"
420*cf84ac9aSAndroid Build Coastguard Worker 			    ", idiag_ext=1<<(INET_DIAG_CONG-1)"
421*cf84ac9aSAndroid Build Coastguard Worker 			    ", idiag_states=1<<TCP_CLOSE"
422*cf84ac9aSAndroid Build Coastguard Worker 			    ", id={idiag_sport=htons(%u)"
423*cf84ac9aSAndroid Build Coastguard Worker 			    ", idiag_dport=htons(%u)"
424*cf84ac9aSAndroid Build Coastguard Worker 			    ", inet_pton(AF_INET6, \"%s\", &idiag_src)"
425*cf84ac9aSAndroid Build Coastguard Worker 			    ", inet_pton(AF_INET6, \"%s\", &idiag_dst)",
426*cf84ac9aSAndroid Build Coastguard Worker 			    ntohs(req.id.idiag_sport),
427*cf84ac9aSAndroid Build Coastguard Worker 			    ntohs(req.id.idiag_dport),
428*cf84ac9aSAndroid Build Coastguard Worker 			    address6, address6);
429*cf84ac9aSAndroid Build Coastguard Worker 		     printf(", idiag_if=" IFINDEX_LO_STR);
430*cf84ac9aSAndroid Build Coastguard Worker 		     PRINT_FIELD_COOKIE(", ", req.id, idiag_cookie);
431*cf84ac9aSAndroid Build Coastguard Worker 		     printf("}}"));
432*cf84ac9aSAndroid Build Coastguard Worker }
433*cf84ac9aSAndroid Build Coastguard Worker 
434*cf84ac9aSAndroid Build Coastguard Worker static void
test_inet_diag_req(const int fd)435*cf84ac9aSAndroid Build Coastguard Worker test_inet_diag_req(const int fd)
436*cf84ac9aSAndroid Build Coastguard Worker {
437*cf84ac9aSAndroid Build Coastguard Worker 	const char address[] = "12.34.56.78";
438*cf84ac9aSAndroid Build Coastguard Worker 	struct inet_diag_req req = {
439*cf84ac9aSAndroid Build Coastguard Worker 		.idiag_family = AF_INET,
440*cf84ac9aSAndroid Build Coastguard Worker 		.idiag_src_len = 0xde,
441*cf84ac9aSAndroid Build Coastguard Worker 		.idiag_dst_len = 0xba,
442*cf84ac9aSAndroid Build Coastguard Worker 		.idiag_ext = 1 << (INET_DIAG_TOS - 1),
443*cf84ac9aSAndroid Build Coastguard Worker 		.id = {
444*cf84ac9aSAndroid Build Coastguard Worker 			.idiag_sport = 0xdead,
445*cf84ac9aSAndroid Build Coastguard Worker 			.idiag_dport = 0xadcd,
446*cf84ac9aSAndroid Build Coastguard Worker 			.idiag_if = ifindex_lo(),
447*cf84ac9aSAndroid Build Coastguard Worker 			.idiag_cookie = { 0xdeadbeef, 0xbadc0ded }
448*cf84ac9aSAndroid Build Coastguard Worker 		},
449*cf84ac9aSAndroid Build Coastguard Worker 		.idiag_states = 1 << TCP_LAST_ACK,
450*cf84ac9aSAndroid Build Coastguard Worker 		.idiag_dbs = 0xfacefeed,
451*cf84ac9aSAndroid Build Coastguard Worker 	};
452*cf84ac9aSAndroid Build Coastguard Worker 	void *const nlh0 = midtail_alloc(NLMSG_HDRLEN, sizeof(req));
453*cf84ac9aSAndroid Build Coastguard Worker 
454*cf84ac9aSAndroid Build Coastguard Worker 	if (!inet_pton(AF_INET, address, &req.id.idiag_src) ||
455*cf84ac9aSAndroid Build Coastguard Worker 	    !inet_pton(AF_INET, address, &req.id.idiag_dst))
456*cf84ac9aSAndroid Build Coastguard Worker 		perror_msg_and_skip("inet_pton");
457*cf84ac9aSAndroid Build Coastguard Worker 
458*cf84ac9aSAndroid Build Coastguard Worker 	TEST_SOCK_DIAG(fd, nlh0, AF_INET,
459*cf84ac9aSAndroid Build Coastguard Worker 		       TCPDIAG_GETSOCK, NLM_F_REQUEST, req,
460*cf84ac9aSAndroid Build Coastguard Worker 		       printf("{idiag_family=AF_INET"),
461*cf84ac9aSAndroid Build Coastguard Worker 		       PRINT_FIELD_U(", ", req, idiag_src_len);
462*cf84ac9aSAndroid Build Coastguard Worker 		       PRINT_FIELD_U(", ", req, idiag_dst_len);
463*cf84ac9aSAndroid Build Coastguard Worker 		       printf(", idiag_ext=1<<(INET_DIAG_TOS-1)");
464*cf84ac9aSAndroid Build Coastguard Worker 		       printf(", id={idiag_sport=htons(%u)"
465*cf84ac9aSAndroid Build Coastguard Worker 			      ", idiag_dport=htons(%u)"
466*cf84ac9aSAndroid Build Coastguard Worker 			      ", idiag_src=inet_addr(\"%s\")"
467*cf84ac9aSAndroid Build Coastguard Worker 			      ", idiag_dst=inet_addr(\"%s\")",
468*cf84ac9aSAndroid Build Coastguard Worker 			      ntohs(req.id.idiag_sport),
469*cf84ac9aSAndroid Build Coastguard Worker 			      ntohs(req.id.idiag_dport),
470*cf84ac9aSAndroid Build Coastguard Worker 			      address, address);
471*cf84ac9aSAndroid Build Coastguard Worker 		       printf(", idiag_if=" IFINDEX_LO_STR);
472*cf84ac9aSAndroid Build Coastguard Worker 		       PRINT_FIELD_COOKIE(", ", req.id, idiag_cookie);
473*cf84ac9aSAndroid Build Coastguard Worker 		       printf("}, idiag_states=1<<TCP_LAST_ACK");
474*cf84ac9aSAndroid Build Coastguard Worker 		       PRINT_FIELD_U(", ", req, idiag_dbs);
475*cf84ac9aSAndroid Build Coastguard Worker 		       printf("}"));
476*cf84ac9aSAndroid Build Coastguard Worker }
477*cf84ac9aSAndroid Build Coastguard Worker 
478*cf84ac9aSAndroid Build Coastguard Worker static void
test_inet_diag_req_v2(const int fd)479*cf84ac9aSAndroid Build Coastguard Worker test_inet_diag_req_v2(const int fd)
480*cf84ac9aSAndroid Build Coastguard Worker {
481*cf84ac9aSAndroid Build Coastguard Worker 	const char address[] = "87.65.43.21";
482*cf84ac9aSAndroid Build Coastguard Worker 	struct inet_diag_req_v2 req = {
483*cf84ac9aSAndroid Build Coastguard Worker 		.sdiag_family = AF_INET,
484*cf84ac9aSAndroid Build Coastguard Worker 		.idiag_ext = 1 << (INET_DIAG_CONG - 1),
485*cf84ac9aSAndroid Build Coastguard Worker 		.sdiag_protocol = IPPROTO_TCP,
486*cf84ac9aSAndroid Build Coastguard Worker 		.idiag_states = 1 << TCP_CLOSE,
487*cf84ac9aSAndroid Build Coastguard Worker 		.id = {
488*cf84ac9aSAndroid Build Coastguard Worker 			.idiag_sport = 0xfacd,
489*cf84ac9aSAndroid Build Coastguard Worker 			.idiag_dport = 0xdead,
490*cf84ac9aSAndroid Build Coastguard Worker 			.idiag_if = ifindex_lo(),
491*cf84ac9aSAndroid Build Coastguard Worker 			.idiag_cookie = { 0xdeadbeef, 0xbadc0ded }
492*cf84ac9aSAndroid Build Coastguard Worker 		},
493*cf84ac9aSAndroid Build Coastguard Worker 	};
494*cf84ac9aSAndroid Build Coastguard Worker 	void *const nlh0 = midtail_alloc(NLMSG_HDRLEN, sizeof(req));
495*cf84ac9aSAndroid Build Coastguard Worker 
496*cf84ac9aSAndroid Build Coastguard Worker 	if (!inet_pton(AF_INET, address, &req.id.idiag_src) ||
497*cf84ac9aSAndroid Build Coastguard Worker 	    !inet_pton(AF_INET, address, &req.id.idiag_dst))
498*cf84ac9aSAndroid Build Coastguard Worker 		perror_msg_and_skip("inet_pton");
499*cf84ac9aSAndroid Build Coastguard Worker 
500*cf84ac9aSAndroid Build Coastguard Worker 	TEST_SOCK_DIAG(fd, nlh0, AF_INET,
501*cf84ac9aSAndroid Build Coastguard Worker 		       SOCK_DIAG_BY_FAMILY, NLM_F_REQUEST, req,
502*cf84ac9aSAndroid Build Coastguard Worker 		       printf("{sdiag_family=AF_INET"),
503*cf84ac9aSAndroid Build Coastguard Worker 		       printf(", sdiag_protocol=IPPROTO_TCP"
504*cf84ac9aSAndroid Build Coastguard Worker 			      ", idiag_ext=1<<(INET_DIAG_CONG-1)"
505*cf84ac9aSAndroid Build Coastguard Worker 			      ", idiag_states=1<<TCP_CLOSE"
506*cf84ac9aSAndroid Build Coastguard Worker 			      ", id={idiag_sport=htons(%u)"
507*cf84ac9aSAndroid Build Coastguard Worker 			      ", idiag_dport=htons(%u)"
508*cf84ac9aSAndroid Build Coastguard Worker 			      ", idiag_src=inet_addr(\"%s\")"
509*cf84ac9aSAndroid Build Coastguard Worker 			      ", idiag_dst=inet_addr(\"%s\")",
510*cf84ac9aSAndroid Build Coastguard Worker 			      ntohs(req.id.idiag_sport),
511*cf84ac9aSAndroid Build Coastguard Worker 			      ntohs(req.id.idiag_dport),
512*cf84ac9aSAndroid Build Coastguard Worker 			      address, address);
513*cf84ac9aSAndroid Build Coastguard Worker 		       printf(", idiag_if=" IFINDEX_LO_STR);
514*cf84ac9aSAndroid Build Coastguard Worker 		       PRINT_FIELD_COOKIE(", ", req.id, idiag_cookie);
515*cf84ac9aSAndroid Build Coastguard Worker 		       printf("}}"));
516*cf84ac9aSAndroid Build Coastguard Worker }
517*cf84ac9aSAndroid Build Coastguard Worker 
518*cf84ac9aSAndroid Build Coastguard Worker static void
test_inet_diag_msg(const int fd)519*cf84ac9aSAndroid Build Coastguard Worker test_inet_diag_msg(const int fd)
520*cf84ac9aSAndroid Build Coastguard Worker {
521*cf84ac9aSAndroid Build Coastguard Worker 	const char address[] = "11.22.33.44";
522*cf84ac9aSAndroid Build Coastguard Worker 	struct inet_diag_msg msg = {
523*cf84ac9aSAndroid Build Coastguard Worker 		.idiag_family = AF_INET,
524*cf84ac9aSAndroid Build Coastguard Worker 		.idiag_state = TCP_LISTEN,
525*cf84ac9aSAndroid Build Coastguard Worker 		.idiag_timer = 0xfa,
526*cf84ac9aSAndroid Build Coastguard Worker 		.idiag_retrans = 0xde,
527*cf84ac9aSAndroid Build Coastguard Worker 		.id = {
528*cf84ac9aSAndroid Build Coastguard Worker 			.idiag_sport = 0xfacf,
529*cf84ac9aSAndroid Build Coastguard Worker 			.idiag_dport = 0xdead,
530*cf84ac9aSAndroid Build Coastguard Worker 			.idiag_if = ifindex_lo(),
531*cf84ac9aSAndroid Build Coastguard Worker 			.idiag_cookie = { 0xdeadbeef, 0xbadc0ded }
532*cf84ac9aSAndroid Build Coastguard Worker 		},
533*cf84ac9aSAndroid Build Coastguard Worker 		.idiag_expires = 0xfacefeed,
534*cf84ac9aSAndroid Build Coastguard Worker 		.idiag_rqueue = 0xdeadbeef,
535*cf84ac9aSAndroid Build Coastguard Worker 		.idiag_wqueue = 0xadcdfafc,
536*cf84ac9aSAndroid Build Coastguard Worker 		.idiag_uid = 0xdecefaeb,
537*cf84ac9aSAndroid Build Coastguard Worker 		.idiag_inode = 0xbadc0ded,
538*cf84ac9aSAndroid Build Coastguard Worker 	};
539*cf84ac9aSAndroid Build Coastguard Worker 	void *const nlh0 = midtail_alloc(NLMSG_HDRLEN, sizeof(msg));
540*cf84ac9aSAndroid Build Coastguard Worker 
541*cf84ac9aSAndroid Build Coastguard Worker 	if (!inet_pton(AF_INET, address, &msg.id.idiag_src) ||
542*cf84ac9aSAndroid Build Coastguard Worker 	    !inet_pton(AF_INET, address, &msg.id.idiag_dst))
543*cf84ac9aSAndroid Build Coastguard Worker 		perror_msg_and_skip("inet_pton");
544*cf84ac9aSAndroid Build Coastguard Worker 
545*cf84ac9aSAndroid Build Coastguard Worker 	TEST_SOCK_DIAG(fd, nlh0, AF_INET,
546*cf84ac9aSAndroid Build Coastguard Worker 		       SOCK_DIAG_BY_FAMILY, NLM_F_DUMP, msg,
547*cf84ac9aSAndroid Build Coastguard Worker 		       printf("{idiag_family=AF_INET"),
548*cf84ac9aSAndroid Build Coastguard Worker 		       printf(", idiag_state=TCP_LISTEN");
549*cf84ac9aSAndroid Build Coastguard Worker 		       PRINT_FIELD_U(", ", msg, idiag_timer);
550*cf84ac9aSAndroid Build Coastguard Worker 		       PRINT_FIELD_U(", ", msg, idiag_retrans);
551*cf84ac9aSAndroid Build Coastguard Worker 		       printf(", id={idiag_sport=htons(%u)"
552*cf84ac9aSAndroid Build Coastguard Worker 			      ", idiag_dport=htons(%u)"
553*cf84ac9aSAndroid Build Coastguard Worker 			      ", idiag_src=inet_addr(\"%s\")"
554*cf84ac9aSAndroid Build Coastguard Worker 			      ", idiag_dst=inet_addr(\"%s\")",
555*cf84ac9aSAndroid Build Coastguard Worker 			      ntohs(msg.id.idiag_sport),
556*cf84ac9aSAndroid Build Coastguard Worker 			      ntohs(msg.id.idiag_dport),
557*cf84ac9aSAndroid Build Coastguard Worker 			      address, address);
558*cf84ac9aSAndroid Build Coastguard Worker 		       printf(", idiag_if=" IFINDEX_LO_STR);
559*cf84ac9aSAndroid Build Coastguard Worker 		       PRINT_FIELD_COOKIE(", ", msg.id, idiag_cookie);
560*cf84ac9aSAndroid Build Coastguard Worker 		       PRINT_FIELD_U("}, ", msg, idiag_expires);
561*cf84ac9aSAndroid Build Coastguard Worker 		       PRINT_FIELD_U(", ", msg, idiag_rqueue);
562*cf84ac9aSAndroid Build Coastguard Worker 		       PRINT_FIELD_U(", ", msg, idiag_wqueue);
563*cf84ac9aSAndroid Build Coastguard Worker 		       PRINT_FIELD_U(", ", msg, idiag_uid);
564*cf84ac9aSAndroid Build Coastguard Worker 		       PRINT_FIELD_U(", ", msg, idiag_inode);
565*cf84ac9aSAndroid Build Coastguard Worker 		       printf("}"));
566*cf84ac9aSAndroid Build Coastguard Worker }
567*cf84ac9aSAndroid Build Coastguard Worker 
568*cf84ac9aSAndroid Build Coastguard Worker #ifdef AF_SMC
569*cf84ac9aSAndroid Build Coastguard Worker static void
test_smc_diag_req(const int fd)570*cf84ac9aSAndroid Build Coastguard Worker test_smc_diag_req(const int fd)
571*cf84ac9aSAndroid Build Coastguard Worker {
572*cf84ac9aSAndroid Build Coastguard Worker 	const char address[] = "43.21.56.78";
573*cf84ac9aSAndroid Build Coastguard Worker 	struct smc_diag_req req = {
574*cf84ac9aSAndroid Build Coastguard Worker 		.diag_family = AF_SMC,
575*cf84ac9aSAndroid Build Coastguard Worker 		.diag_ext = 1 << (SMC_DIAG_CONNINFO - 1),
576*cf84ac9aSAndroid Build Coastguard Worker 		.id = {
577*cf84ac9aSAndroid Build Coastguard Worker 			.idiag_sport = 0xdead,
578*cf84ac9aSAndroid Build Coastguard Worker 			.idiag_dport = 0xadcd,
579*cf84ac9aSAndroid Build Coastguard Worker 			.idiag_if = ifindex_lo(),
580*cf84ac9aSAndroid Build Coastguard Worker 			.idiag_cookie = { 0xdeadbeef, 0xbadc0ded },
581*cf84ac9aSAndroid Build Coastguard Worker 		},
582*cf84ac9aSAndroid Build Coastguard Worker 	};
583*cf84ac9aSAndroid Build Coastguard Worker 	void *const nlh0 = midtail_alloc(NLMSG_HDRLEN, sizeof(req));
584*cf84ac9aSAndroid Build Coastguard Worker 
585*cf84ac9aSAndroid Build Coastguard Worker 	if (!inet_pton(AF_INET, address, &req.id.idiag_src) ||
586*cf84ac9aSAndroid Build Coastguard Worker 	    !inet_pton(AF_INET, address, &req.id.idiag_dst))
587*cf84ac9aSAndroid Build Coastguard Worker 		perror_msg_and_skip("inet_pton");
588*cf84ac9aSAndroid Build Coastguard Worker 
589*cf84ac9aSAndroid Build Coastguard Worker 	TEST_SOCK_DIAG(fd, nlh0, AF_SMC,
590*cf84ac9aSAndroid Build Coastguard Worker 		       SOCK_DIAG_BY_FAMILY, NLM_F_REQUEST, req,
591*cf84ac9aSAndroid Build Coastguard Worker 		       printf("{diag_family=AF_SMC"),
592*cf84ac9aSAndroid Build Coastguard Worker 		       printf(", diag_ext=1<<(SMC_DIAG_CONNINFO-1)");
593*cf84ac9aSAndroid Build Coastguard Worker 		       printf(", id={idiag_sport=htons(%u)"
594*cf84ac9aSAndroid Build Coastguard Worker 			      ", idiag_dport=htons(%u)"
595*cf84ac9aSAndroid Build Coastguard Worker 			      ", idiag_src=inet_addr(\"%s\")"
596*cf84ac9aSAndroid Build Coastguard Worker 			      ", idiag_dst=inet_addr(\"%s\")",
597*cf84ac9aSAndroid Build Coastguard Worker 			      ntohs(req.id.idiag_sport),
598*cf84ac9aSAndroid Build Coastguard Worker 			      ntohs(req.id.idiag_dport),
599*cf84ac9aSAndroid Build Coastguard Worker 			      address, address);
600*cf84ac9aSAndroid Build Coastguard Worker 		       printf(", idiag_if=" IFINDEX_LO_STR);
601*cf84ac9aSAndroid Build Coastguard Worker 		       PRINT_FIELD_COOKIE(", ", req.id, idiag_cookie);
602*cf84ac9aSAndroid Build Coastguard Worker 		       printf("}}"));
603*cf84ac9aSAndroid Build Coastguard Worker }
604*cf84ac9aSAndroid Build Coastguard Worker 
605*cf84ac9aSAndroid Build Coastguard Worker static void
test_smc_diag_msg(const int fd)606*cf84ac9aSAndroid Build Coastguard Worker test_smc_diag_msg(const int fd)
607*cf84ac9aSAndroid Build Coastguard Worker {
608*cf84ac9aSAndroid Build Coastguard Worker 	const char address[] = "34.87.12.90";
609*cf84ac9aSAndroid Build Coastguard Worker 	struct smc_diag_msg msg = {
610*cf84ac9aSAndroid Build Coastguard Worker 		.diag_family = AF_SMC,
611*cf84ac9aSAndroid Build Coastguard Worker 		.diag_state = SMC_ACTIVE,
612*cf84ac9aSAndroid Build Coastguard Worker 		.diag_fallback = 0x1,
613*cf84ac9aSAndroid Build Coastguard Worker 		.diag_shutdown = 0xba,
614*cf84ac9aSAndroid Build Coastguard Worker 		.id = {
615*cf84ac9aSAndroid Build Coastguard Worker 			.idiag_sport = 0xdead,
616*cf84ac9aSAndroid Build Coastguard Worker 			.idiag_dport = 0xadcd,
617*cf84ac9aSAndroid Build Coastguard Worker 			.idiag_if = ifindex_lo(),
618*cf84ac9aSAndroid Build Coastguard Worker 			.idiag_cookie = { 0xdeadbeef, 0xbadc0ded },
619*cf84ac9aSAndroid Build Coastguard Worker 		},
620*cf84ac9aSAndroid Build Coastguard Worker 		.diag_uid = 0xadcdfafc,
621*cf84ac9aSAndroid Build Coastguard Worker 		.diag_inode = 0xbadc0ded,
622*cf84ac9aSAndroid Build Coastguard Worker 	};
623*cf84ac9aSAndroid Build Coastguard Worker 	void *const nlh0 = midtail_alloc(NLMSG_HDRLEN, sizeof(msg));
624*cf84ac9aSAndroid Build Coastguard Worker 
625*cf84ac9aSAndroid Build Coastguard Worker 	if (!inet_pton(AF_INET, address, &msg.id.idiag_src) ||
626*cf84ac9aSAndroid Build Coastguard Worker 	    !inet_pton(AF_INET, address, &msg.id.idiag_dst))
627*cf84ac9aSAndroid Build Coastguard Worker 		perror_msg_and_skip("inet_pton");
628*cf84ac9aSAndroid Build Coastguard Worker 
629*cf84ac9aSAndroid Build Coastguard Worker 	TEST_SOCK_DIAG(fd, nlh0, AF_SMC,
630*cf84ac9aSAndroid Build Coastguard Worker 		       SOCK_DIAG_BY_FAMILY, NLM_F_DUMP, msg,
631*cf84ac9aSAndroid Build Coastguard Worker 		       printf("{diag_family=AF_SMC"),
632*cf84ac9aSAndroid Build Coastguard Worker 		       printf(", diag_state=SMC_ACTIVE");
633*cf84ac9aSAndroid Build Coastguard Worker 		       printf(", diag_fallback=SMC_DIAG_MODE_FALLBACK_TCP");
634*cf84ac9aSAndroid Build Coastguard Worker 		       PRINT_FIELD_U(", ", msg, diag_shutdown);
635*cf84ac9aSAndroid Build Coastguard Worker 		       printf(", id={idiag_sport=htons(%u)"
636*cf84ac9aSAndroid Build Coastguard Worker 			      ", idiag_dport=htons(%u)"
637*cf84ac9aSAndroid Build Coastguard Worker 			      ", idiag_src=inet_addr(\"%s\")"
638*cf84ac9aSAndroid Build Coastguard Worker 			      ", idiag_dst=inet_addr(\"%s\")",
639*cf84ac9aSAndroid Build Coastguard Worker 			      ntohs(msg.id.idiag_sport),
640*cf84ac9aSAndroid Build Coastguard Worker 			      ntohs(msg.id.idiag_dport),
641*cf84ac9aSAndroid Build Coastguard Worker 			      address, address);
642*cf84ac9aSAndroid Build Coastguard Worker 		       printf(", idiag_if=" IFINDEX_LO_STR);
643*cf84ac9aSAndroid Build Coastguard Worker 		       PRINT_FIELD_COOKIE(", ", msg.id, idiag_cookie);
644*cf84ac9aSAndroid Build Coastguard Worker 		       PRINT_FIELD_U("}, ", msg, diag_uid);
645*cf84ac9aSAndroid Build Coastguard Worker 		       PRINT_FIELD_U(", ", msg, diag_inode);
646*cf84ac9aSAndroid Build Coastguard Worker 		       printf("}"));
647*cf84ac9aSAndroid Build Coastguard Worker }
648*cf84ac9aSAndroid Build Coastguard Worker #endif
649*cf84ac9aSAndroid Build Coastguard Worker 
650*cf84ac9aSAndroid Build Coastguard Worker int
main(void)651*cf84ac9aSAndroid Build Coastguard Worker main(void)
652*cf84ac9aSAndroid Build Coastguard Worker {
653*cf84ac9aSAndroid Build Coastguard Worker 	skip_if_unavailable("/proc/self/fd/");
654*cf84ac9aSAndroid Build Coastguard Worker 
655*cf84ac9aSAndroid Build Coastguard Worker 	int fd = create_nl_socket(NETLINK_SOCK_DIAG);
656*cf84ac9aSAndroid Build Coastguard Worker 
657*cf84ac9aSAndroid Build Coastguard Worker 	test_nlmsg_type(fd);
658*cf84ac9aSAndroid Build Coastguard Worker 	test_nlmsg_flags(fd);
659*cf84ac9aSAndroid Build Coastguard Worker 	test_odd_family_req(fd);
660*cf84ac9aSAndroid Build Coastguard Worker 	test_odd_family_msg(fd);
661*cf84ac9aSAndroid Build Coastguard Worker 	test_unix_diag_req(fd);
662*cf84ac9aSAndroid Build Coastguard Worker 	test_unix_diag_msg(fd);
663*cf84ac9aSAndroid Build Coastguard Worker 	test_netlink_diag_req(fd);
664*cf84ac9aSAndroid Build Coastguard Worker 	test_netlink_diag_msg(fd);
665*cf84ac9aSAndroid Build Coastguard Worker 	test_packet_diag_req(fd);
666*cf84ac9aSAndroid Build Coastguard Worker 	test_packet_diag_msg(fd);
667*cf84ac9aSAndroid Build Coastguard Worker 	test_inet_diag_sockid(fd);
668*cf84ac9aSAndroid Build Coastguard Worker 	test_inet_diag_req(fd);
669*cf84ac9aSAndroid Build Coastguard Worker 	test_inet_diag_req_v2(fd);
670*cf84ac9aSAndroid Build Coastguard Worker 	test_inet_diag_msg(fd);
671*cf84ac9aSAndroid Build Coastguard Worker #ifdef AF_SMC
672*cf84ac9aSAndroid Build Coastguard Worker 	test_smc_diag_req(fd);
673*cf84ac9aSAndroid Build Coastguard Worker 	test_smc_diag_msg(fd);
674*cf84ac9aSAndroid Build Coastguard Worker #endif
675*cf84ac9aSAndroid Build Coastguard Worker 
676*cf84ac9aSAndroid Build Coastguard Worker 	printf("+++ exited with 0 +++\n");
677*cf84ac9aSAndroid Build Coastguard Worker 
678*cf84ac9aSAndroid Build Coastguard Worker 	return 0;
679*cf84ac9aSAndroid Build Coastguard Worker }
680