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