xref: /aosp_15_r20/external/strace/tests/netlink_route.c (revision cf84ac9a129d8ea9952db616b4e9b904c4bdde56)
1*cf84ac9aSAndroid Build Coastguard Worker /*
2*cf84ac9aSAndroid Build Coastguard Worker  * Copyright (c) 2017 JingPiao Chen <[email protected]>
3*cf84ac9aSAndroid Build Coastguard Worker  * Copyright (c) 2017-2018 The strace developers.
4*cf84ac9aSAndroid Build Coastguard Worker  * All rights reserved.
5*cf84ac9aSAndroid Build Coastguard Worker  *
6*cf84ac9aSAndroid Build Coastguard Worker  * Redistribution and use in source and binary forms, with or without
7*cf84ac9aSAndroid Build Coastguard Worker  * modification, are permitted provided that the following conditions
8*cf84ac9aSAndroid Build Coastguard Worker  * are met:
9*cf84ac9aSAndroid Build Coastguard Worker  * 1. Redistributions of source code must retain the above copyright
10*cf84ac9aSAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer.
11*cf84ac9aSAndroid Build Coastguard Worker  * 2. Redistributions in binary form must reproduce the above copyright
12*cf84ac9aSAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer in the
13*cf84ac9aSAndroid Build Coastguard Worker  *    documentation and/or other materials provided with the distribution.
14*cf84ac9aSAndroid Build Coastguard Worker  * 3. The name of the author may not be used to endorse or promote products
15*cf84ac9aSAndroid Build Coastguard Worker  *    derived from this software without specific prior written permission.
16*cf84ac9aSAndroid Build Coastguard Worker  *
17*cf84ac9aSAndroid Build Coastguard Worker  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18*cf84ac9aSAndroid Build Coastguard Worker  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19*cf84ac9aSAndroid Build Coastguard Worker  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20*cf84ac9aSAndroid Build Coastguard Worker  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21*cf84ac9aSAndroid Build Coastguard Worker  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22*cf84ac9aSAndroid Build Coastguard Worker  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23*cf84ac9aSAndroid Build Coastguard Worker  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24*cf84ac9aSAndroid Build Coastguard Worker  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25*cf84ac9aSAndroid Build Coastguard Worker  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26*cf84ac9aSAndroid Build Coastguard Worker  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27*cf84ac9aSAndroid Build Coastguard Worker  */
28*cf84ac9aSAndroid Build Coastguard Worker 
29*cf84ac9aSAndroid Build Coastguard Worker #include "tests.h"
30*cf84ac9aSAndroid Build Coastguard Worker #include <stdio.h>
31*cf84ac9aSAndroid Build Coastguard Worker #include <stdint.h>
32*cf84ac9aSAndroid Build Coastguard Worker #include <string.h>
33*cf84ac9aSAndroid Build Coastguard Worker #include <unistd.h>
34*cf84ac9aSAndroid Build Coastguard Worker #include <sys/socket.h>
35*cf84ac9aSAndroid Build Coastguard Worker #include <netinet/in.h>
36*cf84ac9aSAndroid Build Coastguard Worker #include "test_netlink.h"
37*cf84ac9aSAndroid Build Coastguard Worker #ifdef HAVE_STRUCT_DCBMSG
38*cf84ac9aSAndroid Build Coastguard Worker # include <linux/dcbnl.h>
39*cf84ac9aSAndroid Build Coastguard Worker #endif
40*cf84ac9aSAndroid Build Coastguard Worker #ifdef HAVE_LINUX_FIB_RULES_H
41*cf84ac9aSAndroid Build Coastguard Worker # include <linux/fib_rules.h>
42*cf84ac9aSAndroid Build Coastguard Worker #endif
43*cf84ac9aSAndroid Build Coastguard Worker #ifdef HAVE_LINUX_IF_ADDR_H
44*cf84ac9aSAndroid Build Coastguard Worker # include <linux/if_addr.h>
45*cf84ac9aSAndroid Build Coastguard Worker #endif
46*cf84ac9aSAndroid Build Coastguard Worker #ifdef HAVE_STRUCT_IFADDRLBLMSG
47*cf84ac9aSAndroid Build Coastguard Worker # include <linux/if_addrlabel.h>
48*cf84ac9aSAndroid Build Coastguard Worker #endif
49*cf84ac9aSAndroid Build Coastguard Worker #include <linux/if_arp.h>
50*cf84ac9aSAndroid Build Coastguard Worker #include <linux/if_bridge.h>
51*cf84ac9aSAndroid Build Coastguard Worker #include <linux/ip.h>
52*cf84ac9aSAndroid Build Coastguard Worker #ifdef HAVE_LINUX_NEIGHBOUR_H
53*cf84ac9aSAndroid Build Coastguard Worker # include <linux/neighbour.h>
54*cf84ac9aSAndroid Build Coastguard Worker #endif
55*cf84ac9aSAndroid Build Coastguard Worker #ifdef HAVE_STRUCT_NETCONFMSG
56*cf84ac9aSAndroid Build Coastguard Worker # include <linux/netconf.h>
57*cf84ac9aSAndroid Build Coastguard Worker #endif
58*cf84ac9aSAndroid Build Coastguard Worker #include <linux/rtnetlink.h>
59*cf84ac9aSAndroid Build Coastguard Worker 
60*cf84ac9aSAndroid Build Coastguard Worker #define TEST_NL_ROUTE(fd_, nlh0_, type_, obj_, print_family_, ...)	\
61*cf84ac9aSAndroid Build Coastguard Worker 	do {								\
62*cf84ac9aSAndroid Build Coastguard Worker 		/* family and string */					\
63*cf84ac9aSAndroid Build Coastguard Worker 		TEST_NETLINK((fd_), (nlh0_),				\
64*cf84ac9aSAndroid Build Coastguard Worker 			     type_, NLM_F_REQUEST,			\
65*cf84ac9aSAndroid Build Coastguard Worker 			     sizeof(obj_) - 1,				\
66*cf84ac9aSAndroid Build Coastguard Worker 			     &(obj_), sizeof(obj_) - 1,			\
67*cf84ac9aSAndroid Build Coastguard Worker 			     (print_family_);				\
68*cf84ac9aSAndroid Build Coastguard Worker 			     printf(", ...}"));				\
69*cf84ac9aSAndroid Build Coastguard Worker 									\
70*cf84ac9aSAndroid Build Coastguard Worker 		/* sizeof(obj_) */					\
71*cf84ac9aSAndroid Build Coastguard Worker 		TEST_NETLINK((fd_), (nlh0_),				\
72*cf84ac9aSAndroid Build Coastguard Worker 			     type_, NLM_F_REQUEST,			\
73*cf84ac9aSAndroid Build Coastguard Worker 			     sizeof(obj_), &(obj_), sizeof(obj_),	\
74*cf84ac9aSAndroid Build Coastguard Worker 			     (print_family_);				\
75*cf84ac9aSAndroid Build Coastguard Worker 			      __VA_ARGS__);				\
76*cf84ac9aSAndroid Build Coastguard Worker 									\
77*cf84ac9aSAndroid Build Coastguard Worker 		/* short read of sizeof(obj_) */			\
78*cf84ac9aSAndroid Build Coastguard Worker 		TEST_NETLINK((fd_), (nlh0_),				\
79*cf84ac9aSAndroid Build Coastguard Worker 			     type_, NLM_F_REQUEST,			\
80*cf84ac9aSAndroid Build Coastguard Worker 			     sizeof(obj_), &(obj_), sizeof(obj_) - 1,	\
81*cf84ac9aSAndroid Build Coastguard Worker 			     (print_family_);				\
82*cf84ac9aSAndroid Build Coastguard Worker 			     printf(", %p}",				\
83*cf84ac9aSAndroid Build Coastguard Worker 				    NLMSG_DATA(TEST_NETLINK_nlh) + 1));	\
84*cf84ac9aSAndroid Build Coastguard Worker 	} while (0)
85*cf84ac9aSAndroid Build Coastguard Worker 
86*cf84ac9aSAndroid Build Coastguard Worker static void
test_nlmsg_type(const int fd)87*cf84ac9aSAndroid Build Coastguard Worker test_nlmsg_type(const int fd)
88*cf84ac9aSAndroid Build Coastguard Worker {
89*cf84ac9aSAndroid Build Coastguard Worker 	long rc;
90*cf84ac9aSAndroid Build Coastguard Worker 	struct nlmsghdr nlh = {
91*cf84ac9aSAndroid Build Coastguard Worker 		.nlmsg_len = sizeof(nlh),
92*cf84ac9aSAndroid Build Coastguard Worker 		.nlmsg_type = RTM_GETLINK,
93*cf84ac9aSAndroid Build Coastguard Worker 		.nlmsg_flags = NLM_F_REQUEST,
94*cf84ac9aSAndroid Build Coastguard Worker 	};
95*cf84ac9aSAndroid Build Coastguard Worker 
96*cf84ac9aSAndroid Build Coastguard Worker 	rc = sendto(fd, &nlh, sizeof(nlh), MSG_DONTWAIT, NULL, 0);
97*cf84ac9aSAndroid Build Coastguard Worker 	printf("sendto(%d, {len=%u, type=RTM_GETLINK"
98*cf84ac9aSAndroid Build Coastguard Worker 	       ", flags=NLM_F_REQUEST, seq=0, pid=0}"
99*cf84ac9aSAndroid Build Coastguard Worker 	       ", %u, MSG_DONTWAIT, NULL, 0) = %s\n",
100*cf84ac9aSAndroid Build Coastguard Worker 	       fd, nlh.nlmsg_len, (unsigned) sizeof(nlh), sprintrc(rc));
101*cf84ac9aSAndroid Build Coastguard Worker }
102*cf84ac9aSAndroid Build Coastguard Worker 
103*cf84ac9aSAndroid Build Coastguard Worker static void
test_nlmsg_flags(const int fd)104*cf84ac9aSAndroid Build Coastguard Worker test_nlmsg_flags(const int fd)
105*cf84ac9aSAndroid Build Coastguard Worker {
106*cf84ac9aSAndroid Build Coastguard Worker 	long rc;
107*cf84ac9aSAndroid Build Coastguard Worker 	struct nlmsghdr nlh = {
108*cf84ac9aSAndroid Build Coastguard Worker 		.nlmsg_len = sizeof(nlh),
109*cf84ac9aSAndroid Build Coastguard Worker 	};
110*cf84ac9aSAndroid Build Coastguard Worker 
111*cf84ac9aSAndroid Build Coastguard Worker 	nlh.nlmsg_type = RTM_GETLINK;
112*cf84ac9aSAndroid Build Coastguard Worker 	nlh.nlmsg_flags = NLM_F_REQUEST | NLM_F_DUMP;
113*cf84ac9aSAndroid Build Coastguard Worker 	rc = sendto(fd, &nlh, sizeof(nlh), MSG_DONTWAIT, NULL, 0);
114*cf84ac9aSAndroid Build Coastguard Worker 	printf("sendto(%d, {len=%u, type=RTM_GETLINK"
115*cf84ac9aSAndroid Build Coastguard Worker 	       ", flags=NLM_F_REQUEST|NLM_F_DUMP, seq=0, pid=0}"
116*cf84ac9aSAndroid Build Coastguard Worker 	       ", %u, MSG_DONTWAIT, NULL, 0) = %s\n",
117*cf84ac9aSAndroid Build Coastguard Worker 	       fd, nlh.nlmsg_len, (unsigned) sizeof(nlh), sprintrc(rc));
118*cf84ac9aSAndroid Build Coastguard Worker 
119*cf84ac9aSAndroid Build Coastguard Worker 	nlh.nlmsg_type = RTM_DELACTION;
120*cf84ac9aSAndroid Build Coastguard Worker 	nlh.nlmsg_flags = NLM_F_ROOT;
121*cf84ac9aSAndroid Build Coastguard Worker 	rc = sendto(fd, &nlh, sizeof(nlh), MSG_DONTWAIT, NULL, 0);
122*cf84ac9aSAndroid Build Coastguard Worker 	printf("sendto(%d, {len=%u, type=RTM_DELACTION"
123*cf84ac9aSAndroid Build Coastguard Worker 	       ", flags=NLM_F_ROOT, seq=0, pid=0}"
124*cf84ac9aSAndroid Build Coastguard Worker 	       ", %u, MSG_DONTWAIT, NULL, 0) = %s\n",
125*cf84ac9aSAndroid Build Coastguard Worker 	       fd, nlh.nlmsg_len, (unsigned) sizeof(nlh), sprintrc(rc));
126*cf84ac9aSAndroid Build Coastguard Worker 
127*cf84ac9aSAndroid Build Coastguard Worker 	nlh.nlmsg_type = RTM_NEWLINK;
128*cf84ac9aSAndroid Build Coastguard Worker 	nlh.nlmsg_flags = NLM_F_ECHO | NLM_F_REPLACE;
129*cf84ac9aSAndroid Build Coastguard Worker 	rc = sendto(fd, &nlh, sizeof(nlh), MSG_DONTWAIT, NULL, 0);
130*cf84ac9aSAndroid Build Coastguard Worker 	printf("sendto(%d, {len=%u, type=RTM_NEWLINK"
131*cf84ac9aSAndroid Build Coastguard Worker 	       ", flags=NLM_F_ECHO|NLM_F_REPLACE, seq=0, pid=0}"
132*cf84ac9aSAndroid Build Coastguard Worker 	       ", %u, MSG_DONTWAIT, NULL, 0) = %s\n",
133*cf84ac9aSAndroid Build Coastguard Worker 	       fd, nlh.nlmsg_len, (unsigned) sizeof(nlh), sprintrc(rc));
134*cf84ac9aSAndroid Build Coastguard Worker 
135*cf84ac9aSAndroid Build Coastguard Worker 	nlh.nlmsg_type = RTM_DELLINK;
136*cf84ac9aSAndroid Build Coastguard Worker 	nlh.nlmsg_flags = NLM_F_NONREC;
137*cf84ac9aSAndroid Build Coastguard Worker 	rc = sendto(fd, &nlh, sizeof(nlh), MSG_DONTWAIT, NULL, 0);
138*cf84ac9aSAndroid Build Coastguard Worker 	printf("sendto(%d, {len=%u, type=RTM_DELLINK"
139*cf84ac9aSAndroid Build Coastguard Worker 	       ", flags=NLM_F_NONREC, seq=0, pid=0}"
140*cf84ac9aSAndroid Build Coastguard Worker 	       ", %u, MSG_DONTWAIT, NULL, 0) = %s\n",
141*cf84ac9aSAndroid Build Coastguard Worker 	       fd, nlh.nlmsg_len, (unsigned) sizeof(nlh), sprintrc(rc));
142*cf84ac9aSAndroid Build Coastguard Worker }
143*cf84ac9aSAndroid Build Coastguard Worker 
144*cf84ac9aSAndroid Build Coastguard Worker static void
test_nlmsg_done(const int fd)145*cf84ac9aSAndroid Build Coastguard Worker test_nlmsg_done(const int fd)
146*cf84ac9aSAndroid Build Coastguard Worker {
147*cf84ac9aSAndroid Build Coastguard Worker 	const int num = 0xabcdefad;
148*cf84ac9aSAndroid Build Coastguard Worker 	void *const nlh0 = midtail_alloc(NLMSG_HDRLEN, sizeof(num));
149*cf84ac9aSAndroid Build Coastguard Worker 
150*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NETLINK(fd, nlh0, NLMSG_DONE, NLM_F_REQUEST,
151*cf84ac9aSAndroid Build Coastguard Worker 		     sizeof(num), &num, sizeof(num),
152*cf84ac9aSAndroid Build Coastguard Worker 		     printf("%d", num));
153*cf84ac9aSAndroid Build Coastguard Worker }
154*cf84ac9aSAndroid Build Coastguard Worker 
155*cf84ac9aSAndroid Build Coastguard Worker static void
test_rtnl_unspec(const int fd)156*cf84ac9aSAndroid Build Coastguard Worker test_rtnl_unspec(const int fd)
157*cf84ac9aSAndroid Build Coastguard Worker {
158*cf84ac9aSAndroid Build Coastguard Worker 	uint8_t family = 0;
159*cf84ac9aSAndroid Build Coastguard Worker 	char buf[sizeof(family) + 4];
160*cf84ac9aSAndroid Build Coastguard Worker 	void *const nlh0 = midtail_alloc(NLMSG_HDRLEN, sizeof(buf));
161*cf84ac9aSAndroid Build Coastguard Worker 
162*cf84ac9aSAndroid Build Coastguard Worker 	/* unspecified family only */
163*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NETLINK_(fd, nlh0,
164*cf84ac9aSAndroid Build Coastguard Worker 		      0xffff, "0xffff /* RTM_??? */",
165*cf84ac9aSAndroid Build Coastguard Worker 		      NLM_F_REQUEST, "NLM_F_REQUEST",
166*cf84ac9aSAndroid Build Coastguard Worker 		      sizeof(family), &family, sizeof(family),
167*cf84ac9aSAndroid Build Coastguard Worker 		      printf("{family=AF_UNSPEC}"));
168*cf84ac9aSAndroid Build Coastguard Worker 
169*cf84ac9aSAndroid Build Coastguard Worker 	/* unknown family only */
170*cf84ac9aSAndroid Build Coastguard Worker 	family = 0xff;
171*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NETLINK_(fd, nlh0,
172*cf84ac9aSAndroid Build Coastguard Worker 		      0xffff, "0xffff /* RTM_??? */",
173*cf84ac9aSAndroid Build Coastguard Worker 		      NLM_F_REQUEST, "NLM_F_REQUEST",
174*cf84ac9aSAndroid Build Coastguard Worker 		      sizeof(family), &family, sizeof(family),
175*cf84ac9aSAndroid Build Coastguard Worker 		      printf("{family=0xff /* AF_??? */}"));
176*cf84ac9aSAndroid Build Coastguard Worker 
177*cf84ac9aSAndroid Build Coastguard Worker 	/* short read of family */
178*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NETLINK_(fd, nlh0,
179*cf84ac9aSAndroid Build Coastguard Worker 		      0xffff, "0xffff /* RTM_??? */",
180*cf84ac9aSAndroid Build Coastguard Worker 		      NLM_F_REQUEST, "NLM_F_REQUEST",
181*cf84ac9aSAndroid Build Coastguard Worker 		      sizeof(family), &family, sizeof(family) - 1,
182*cf84ac9aSAndroid Build Coastguard Worker 		      printf("%p", NLMSG_DATA(TEST_NETLINK_nlh)));
183*cf84ac9aSAndroid Build Coastguard Worker 
184*cf84ac9aSAndroid Build Coastguard Worker 	/* unspecified family and string */
185*cf84ac9aSAndroid Build Coastguard Worker 	family = 0;
186*cf84ac9aSAndroid Build Coastguard Worker 	memcpy(buf, &family, sizeof(family));
187*cf84ac9aSAndroid Build Coastguard Worker 	memcpy(buf + sizeof(family), "1234", 4);
188*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NETLINK_(fd, nlh0,
189*cf84ac9aSAndroid Build Coastguard Worker 		      0xffff, "0xffff /* RTM_??? */",
190*cf84ac9aSAndroid Build Coastguard Worker 		      NLM_F_REQUEST, "NLM_F_REQUEST",
191*cf84ac9aSAndroid Build Coastguard Worker 		      sizeof(buf), buf, sizeof(buf),
192*cf84ac9aSAndroid Build Coastguard Worker 		      printf("{family=AF_UNSPEC, \"\\x31\\x32\\x33\\x34\"}"));
193*cf84ac9aSAndroid Build Coastguard Worker 
194*cf84ac9aSAndroid Build Coastguard Worker 	/* unknown family and string */
195*cf84ac9aSAndroid Build Coastguard Worker 	family = 0xfd;
196*cf84ac9aSAndroid Build Coastguard Worker 	memcpy(buf, &family, sizeof(family));
197*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NETLINK_(fd, nlh0,
198*cf84ac9aSAndroid Build Coastguard Worker 		      0xffff, "0xffff /* RTM_??? */",
199*cf84ac9aSAndroid Build Coastguard Worker 		      NLM_F_REQUEST, "NLM_F_REQUEST",
200*cf84ac9aSAndroid Build Coastguard Worker 		      sizeof(buf), buf, sizeof(buf),
201*cf84ac9aSAndroid Build Coastguard Worker 		      printf("{family=%#x /* AF_??? */"
202*cf84ac9aSAndroid Build Coastguard Worker 			     ", \"\\x31\\x32\\x33\\x34\"}", family));
203*cf84ac9aSAndroid Build Coastguard Worker }
204*cf84ac9aSAndroid Build Coastguard Worker 
205*cf84ac9aSAndroid Build Coastguard Worker static void
test_rtnl_link(const int fd)206*cf84ac9aSAndroid Build Coastguard Worker test_rtnl_link(const int fd)
207*cf84ac9aSAndroid Build Coastguard Worker {
208*cf84ac9aSAndroid Build Coastguard Worker 	const struct ifinfomsg ifinfo = {
209*cf84ac9aSAndroid Build Coastguard Worker 		.ifi_family = AF_UNIX,
210*cf84ac9aSAndroid Build Coastguard Worker 		.ifi_type = ARPHRD_LOOPBACK,
211*cf84ac9aSAndroid Build Coastguard Worker 		.ifi_index = ifindex_lo(),
212*cf84ac9aSAndroid Build Coastguard Worker 		.ifi_flags = IFF_UP,
213*cf84ac9aSAndroid Build Coastguard Worker 		.ifi_change = 0xfabcdeba
214*cf84ac9aSAndroid Build Coastguard Worker 	};
215*cf84ac9aSAndroid Build Coastguard Worker 	void *const nlh0 = midtail_alloc(NLMSG_HDRLEN, sizeof(ifinfo));
216*cf84ac9aSAndroid Build Coastguard Worker 
217*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NL_ROUTE(fd, nlh0, RTM_GETLINK, ifinfo,
218*cf84ac9aSAndroid Build Coastguard Worker 		      printf("{ifi_family=AF_UNIX"),
219*cf84ac9aSAndroid Build Coastguard Worker 		      printf(", ifi_type=ARPHRD_LOOPBACK"
220*cf84ac9aSAndroid Build Coastguard Worker 			     ", ifi_index=" IFINDEX_LO_STR
221*cf84ac9aSAndroid Build Coastguard Worker 			     ", ifi_flags=IFF_UP");
222*cf84ac9aSAndroid Build Coastguard Worker 		      PRINT_FIELD_X(", ", ifinfo, ifi_change);
223*cf84ac9aSAndroid Build Coastguard Worker 		      printf("}"));
224*cf84ac9aSAndroid Build Coastguard Worker }
225*cf84ac9aSAndroid Build Coastguard Worker 
226*cf84ac9aSAndroid Build Coastguard Worker static void
test_rtnl_addr(const int fd)227*cf84ac9aSAndroid Build Coastguard Worker test_rtnl_addr(const int fd)
228*cf84ac9aSAndroid Build Coastguard Worker {
229*cf84ac9aSAndroid Build Coastguard Worker 	const struct ifaddrmsg msg = {
230*cf84ac9aSAndroid Build Coastguard Worker 		.ifa_family = AF_UNIX,
231*cf84ac9aSAndroid Build Coastguard Worker 		.ifa_prefixlen = 0xde,
232*cf84ac9aSAndroid Build Coastguard Worker 		.ifa_flags = IFA_F_SECONDARY,
233*cf84ac9aSAndroid Build Coastguard Worker 		.ifa_scope = RT_SCOPE_UNIVERSE,
234*cf84ac9aSAndroid Build Coastguard Worker 		.ifa_index = ifindex_lo()
235*cf84ac9aSAndroid Build Coastguard Worker 	};
236*cf84ac9aSAndroid Build Coastguard Worker 	void *const nlh0 = midtail_alloc(NLMSG_HDRLEN, sizeof(msg));
237*cf84ac9aSAndroid Build Coastguard Worker 
238*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NL_ROUTE(fd, nlh0, RTM_GETADDR, msg,
239*cf84ac9aSAndroid Build Coastguard Worker 		      printf("{ifa_family=AF_UNIX"),
240*cf84ac9aSAndroid Build Coastguard Worker 		      PRINT_FIELD_U(", ", msg, ifa_prefixlen);
241*cf84ac9aSAndroid Build Coastguard Worker 		      printf(", ifa_flags=IFA_F_SECONDARY"
242*cf84ac9aSAndroid Build Coastguard Worker 			     ", ifa_scope=RT_SCOPE_UNIVERSE"
243*cf84ac9aSAndroid Build Coastguard Worker 			     ", ifa_index=" IFINDEX_LO_STR);
244*cf84ac9aSAndroid Build Coastguard Worker 		      printf("}"));
245*cf84ac9aSAndroid Build Coastguard Worker }
246*cf84ac9aSAndroid Build Coastguard Worker 
247*cf84ac9aSAndroid Build Coastguard Worker static void
test_rtnl_route(const int fd)248*cf84ac9aSAndroid Build Coastguard Worker test_rtnl_route(const int fd)
249*cf84ac9aSAndroid Build Coastguard Worker {
250*cf84ac9aSAndroid Build Coastguard Worker 	static const struct rtmsg msg = {
251*cf84ac9aSAndroid Build Coastguard Worker 		.rtm_family = AF_UNIX,
252*cf84ac9aSAndroid Build Coastguard Worker 		.rtm_dst_len = 0xaf,
253*cf84ac9aSAndroid Build Coastguard Worker 		.rtm_src_len = 0xda,
254*cf84ac9aSAndroid Build Coastguard Worker 		.rtm_tos = IPTOS_LOWDELAY,
255*cf84ac9aSAndroid Build Coastguard Worker 		.rtm_table = RT_TABLE_DEFAULT,
256*cf84ac9aSAndroid Build Coastguard Worker 		.rtm_protocol = RTPROT_KERNEL,
257*cf84ac9aSAndroid Build Coastguard Worker 		.rtm_scope = RT_SCOPE_UNIVERSE,
258*cf84ac9aSAndroid Build Coastguard Worker 		.rtm_type = RTN_LOCAL,
259*cf84ac9aSAndroid Build Coastguard Worker 		.rtm_flags = RTM_F_NOTIFY
260*cf84ac9aSAndroid Build Coastguard Worker 	};
261*cf84ac9aSAndroid Build Coastguard Worker 	void *const nlh0 = midtail_alloc(NLMSG_HDRLEN, sizeof(msg));
262*cf84ac9aSAndroid Build Coastguard Worker 
263*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NL_ROUTE(fd, nlh0, RTM_GETROUTE, msg,
264*cf84ac9aSAndroid Build Coastguard Worker 		      printf("{rtm_family=AF_UNIX"),
265*cf84ac9aSAndroid Build Coastguard Worker 		      PRINT_FIELD_U(", ", msg, rtm_dst_len);
266*cf84ac9aSAndroid Build Coastguard Worker 		      PRINT_FIELD_U(", ", msg, rtm_src_len);
267*cf84ac9aSAndroid Build Coastguard Worker 		      printf(", rtm_tos=IPTOS_LOWDELAY"
268*cf84ac9aSAndroid Build Coastguard Worker 			     ", rtm_table=RT_TABLE_DEFAULT"
269*cf84ac9aSAndroid Build Coastguard Worker 			     ", rtm_protocol=RTPROT_KERNEL"
270*cf84ac9aSAndroid Build Coastguard Worker 			     ", rtm_scope=RT_SCOPE_UNIVERSE"
271*cf84ac9aSAndroid Build Coastguard Worker 			     ", rtm_type=RTN_LOCAL"
272*cf84ac9aSAndroid Build Coastguard Worker 			     ", rtm_flags=RTM_F_NOTIFY}"));
273*cf84ac9aSAndroid Build Coastguard Worker }
274*cf84ac9aSAndroid Build Coastguard Worker 
275*cf84ac9aSAndroid Build Coastguard Worker #ifdef HAVE_LINUX_FIB_RULES_H
276*cf84ac9aSAndroid Build Coastguard Worker static void
test_rtnl_rule(const int fd)277*cf84ac9aSAndroid Build Coastguard Worker test_rtnl_rule(const int fd)
278*cf84ac9aSAndroid Build Coastguard Worker {
279*cf84ac9aSAndroid Build Coastguard Worker 	struct rtmsg msg = {
280*cf84ac9aSAndroid Build Coastguard Worker 		.rtm_family = AF_UNIX,
281*cf84ac9aSAndroid Build Coastguard Worker 		.rtm_dst_len = 0xaf,
282*cf84ac9aSAndroid Build Coastguard Worker 		.rtm_src_len = 0xda,
283*cf84ac9aSAndroid Build Coastguard Worker 		.rtm_tos = IPTOS_LOWDELAY,
284*cf84ac9aSAndroid Build Coastguard Worker 		.rtm_table = RT_TABLE_UNSPEC,
285*cf84ac9aSAndroid Build Coastguard Worker 		.rtm_type = FR_ACT_TO_TBL,
286*cf84ac9aSAndroid Build Coastguard Worker 		.rtm_flags = FIB_RULE_INVERT
287*cf84ac9aSAndroid Build Coastguard Worker 	};
288*cf84ac9aSAndroid Build Coastguard Worker 	void *const nlh0 = midtail_alloc(NLMSG_HDRLEN, sizeof(msg));
289*cf84ac9aSAndroid Build Coastguard Worker 
290*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NL_ROUTE(fd, nlh0, RTM_GETRULE, msg,
291*cf84ac9aSAndroid Build Coastguard Worker 		      printf("{family=AF_UNIX"),
292*cf84ac9aSAndroid Build Coastguard Worker 		      printf(", dst_len=%u, src_len=%u"
293*cf84ac9aSAndroid Build Coastguard Worker 			     ", tos=IPTOS_LOWDELAY"
294*cf84ac9aSAndroid Build Coastguard Worker 			     ", table=RT_TABLE_UNSPEC"
295*cf84ac9aSAndroid Build Coastguard Worker 			     ", action=FR_ACT_TO_TBL"
296*cf84ac9aSAndroid Build Coastguard Worker 			     ", flags=FIB_RULE_INVERT}",
297*cf84ac9aSAndroid Build Coastguard Worker 			     msg.rtm_dst_len,
298*cf84ac9aSAndroid Build Coastguard Worker 			     msg.rtm_src_len));
299*cf84ac9aSAndroid Build Coastguard Worker }
300*cf84ac9aSAndroid Build Coastguard Worker #endif
301*cf84ac9aSAndroid Build Coastguard Worker 
302*cf84ac9aSAndroid Build Coastguard Worker static void
test_rtnl_neigh(const int fd)303*cf84ac9aSAndroid Build Coastguard Worker test_rtnl_neigh(const int fd)
304*cf84ac9aSAndroid Build Coastguard Worker {
305*cf84ac9aSAndroid Build Coastguard Worker 	const struct ndmsg msg = {
306*cf84ac9aSAndroid Build Coastguard Worker 		.ndm_family = AF_UNIX,
307*cf84ac9aSAndroid Build Coastguard Worker 		.ndm_ifindex = ifindex_lo(),
308*cf84ac9aSAndroid Build Coastguard Worker 		.ndm_state = NUD_PERMANENT,
309*cf84ac9aSAndroid Build Coastguard Worker 		.ndm_flags = NTF_PROXY,
310*cf84ac9aSAndroid Build Coastguard Worker 		.ndm_type = RTN_UNSPEC
311*cf84ac9aSAndroid Build Coastguard Worker 	};
312*cf84ac9aSAndroid Build Coastguard Worker 	void *const nlh0 = midtail_alloc(NLMSG_HDRLEN, sizeof(msg));
313*cf84ac9aSAndroid Build Coastguard Worker 
314*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NL_ROUTE(fd, nlh0, RTM_GETNEIGH, msg,
315*cf84ac9aSAndroid Build Coastguard Worker 		      printf("{ndm_family=AF_UNIX"),
316*cf84ac9aSAndroid Build Coastguard Worker 		      printf(", ndm_ifindex=" IFINDEX_LO_STR
317*cf84ac9aSAndroid Build Coastguard Worker 			     ", ndm_state=NUD_PERMANENT"
318*cf84ac9aSAndroid Build Coastguard Worker 			     ", ndm_flags=NTF_PROXY"
319*cf84ac9aSAndroid Build Coastguard Worker 			     ", ndm_type=RTN_UNSPEC}"));
320*cf84ac9aSAndroid Build Coastguard Worker }
321*cf84ac9aSAndroid Build Coastguard Worker 
322*cf84ac9aSAndroid Build Coastguard Worker static void
test_rtnl_neightbl(const int fd)323*cf84ac9aSAndroid Build Coastguard Worker test_rtnl_neightbl(const int fd)
324*cf84ac9aSAndroid Build Coastguard Worker {
325*cf84ac9aSAndroid Build Coastguard Worker 	static const struct ndtmsg msg = {
326*cf84ac9aSAndroid Build Coastguard Worker 		.ndtm_family = AF_NETLINK
327*cf84ac9aSAndroid Build Coastguard Worker 	};
328*cf84ac9aSAndroid Build Coastguard Worker 	void *const nlh0 = midtail_alloc(NLMSG_HDRLEN, sizeof(msg));
329*cf84ac9aSAndroid Build Coastguard Worker 
330*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NETLINK(fd, nlh0,
331*cf84ac9aSAndroid Build Coastguard Worker 		     RTM_GETNEIGHTBL, NLM_F_REQUEST,
332*cf84ac9aSAndroid Build Coastguard Worker 		     sizeof(msg), &msg, sizeof(msg),
333*cf84ac9aSAndroid Build Coastguard Worker 		     printf("{ndtm_family=AF_NETLINK}"));
334*cf84ac9aSAndroid Build Coastguard Worker }
335*cf84ac9aSAndroid Build Coastguard Worker 
336*cf84ac9aSAndroid Build Coastguard Worker static void
test_rtnl_tc(const int fd)337*cf84ac9aSAndroid Build Coastguard Worker test_rtnl_tc(const int fd)
338*cf84ac9aSAndroid Build Coastguard Worker {
339*cf84ac9aSAndroid Build Coastguard Worker 	const struct tcmsg msg = {
340*cf84ac9aSAndroid Build Coastguard Worker 		.tcm_family = AF_UNIX,
341*cf84ac9aSAndroid Build Coastguard Worker 		.tcm_ifindex = ifindex_lo(),
342*cf84ac9aSAndroid Build Coastguard Worker 		.tcm_handle = 0xfadcdafb,
343*cf84ac9aSAndroid Build Coastguard Worker 		.tcm_parent = 0xafbcadab,
344*cf84ac9aSAndroid Build Coastguard Worker 		.tcm_info = 0xbcaedafa
345*cf84ac9aSAndroid Build Coastguard Worker 	};
346*cf84ac9aSAndroid Build Coastguard Worker 	void *const nlh0 = midtail_alloc(NLMSG_HDRLEN, sizeof(msg));
347*cf84ac9aSAndroid Build Coastguard Worker 
348*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NL_ROUTE(fd, nlh0, RTM_GETQDISC, msg,
349*cf84ac9aSAndroid Build Coastguard Worker 		      printf("{tcm_family=AF_UNIX"),
350*cf84ac9aSAndroid Build Coastguard Worker 		      printf(", tcm_ifindex=" IFINDEX_LO_STR);
351*cf84ac9aSAndroid Build Coastguard Worker 		      PRINT_FIELD_U(", ", msg, tcm_handle);
352*cf84ac9aSAndroid Build Coastguard Worker 		      PRINT_FIELD_U(", ", msg, tcm_parent);
353*cf84ac9aSAndroid Build Coastguard Worker 		      PRINT_FIELD_U(", ", msg, tcm_info);
354*cf84ac9aSAndroid Build Coastguard Worker 		      printf("}"));
355*cf84ac9aSAndroid Build Coastguard Worker }
356*cf84ac9aSAndroid Build Coastguard Worker 
357*cf84ac9aSAndroid Build Coastguard Worker static void
test_rtnl_tca(const int fd)358*cf84ac9aSAndroid Build Coastguard Worker test_rtnl_tca(const int fd)
359*cf84ac9aSAndroid Build Coastguard Worker {
360*cf84ac9aSAndroid Build Coastguard Worker 	struct tcamsg msg = {
361*cf84ac9aSAndroid Build Coastguard Worker 		.tca_family = AF_INET
362*cf84ac9aSAndroid Build Coastguard Worker 	};
363*cf84ac9aSAndroid Build Coastguard Worker 	void *const nlh0 = midtail_alloc(NLMSG_HDRLEN, sizeof(msg));
364*cf84ac9aSAndroid Build Coastguard Worker 
365*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NETLINK(fd, nlh0,
366*cf84ac9aSAndroid Build Coastguard Worker 		     RTM_GETACTION, NLM_F_REQUEST,
367*cf84ac9aSAndroid Build Coastguard Worker 		     sizeof(msg), &msg, sizeof(msg),
368*cf84ac9aSAndroid Build Coastguard Worker 		     printf("{tca_family=AF_INET}"));
369*cf84ac9aSAndroid Build Coastguard Worker }
370*cf84ac9aSAndroid Build Coastguard Worker 
371*cf84ac9aSAndroid Build Coastguard Worker #ifdef HAVE_STRUCT_IFADDRLBLMSG
372*cf84ac9aSAndroid Build Coastguard Worker static void
test_rtnl_addrlabel(const int fd)373*cf84ac9aSAndroid Build Coastguard Worker test_rtnl_addrlabel(const int fd)
374*cf84ac9aSAndroid Build Coastguard Worker {
375*cf84ac9aSAndroid Build Coastguard Worker 	const struct ifaddrlblmsg msg = {
376*cf84ac9aSAndroid Build Coastguard Worker 		.ifal_family = AF_UNIX,
377*cf84ac9aSAndroid Build Coastguard Worker 		.ifal_prefixlen = 0xaf,
378*cf84ac9aSAndroid Build Coastguard Worker 		.ifal_flags = 0xbd,
379*cf84ac9aSAndroid Build Coastguard Worker 		.ifal_index = ifindex_lo(),
380*cf84ac9aSAndroid Build Coastguard Worker 		.ifal_seq = 0xfadcdafb
381*cf84ac9aSAndroid Build Coastguard Worker 	};
382*cf84ac9aSAndroid Build Coastguard Worker 	void *const nlh0 = midtail_alloc(NLMSG_HDRLEN, sizeof(msg));
383*cf84ac9aSAndroid Build Coastguard Worker 
384*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NL_ROUTE(fd, nlh0, RTM_GETADDRLABEL, msg,
385*cf84ac9aSAndroid Build Coastguard Worker 		      printf("{ifal_family=AF_UNIX"),
386*cf84ac9aSAndroid Build Coastguard Worker 		      PRINT_FIELD_U(", ", msg, ifal_prefixlen);
387*cf84ac9aSAndroid Build Coastguard Worker 		      PRINT_FIELD_U(", ", msg, ifal_flags);
388*cf84ac9aSAndroid Build Coastguard Worker 		      printf(", ifal_index=" IFINDEX_LO_STR);
389*cf84ac9aSAndroid Build Coastguard Worker 		      PRINT_FIELD_U(", ", msg, ifal_seq);
390*cf84ac9aSAndroid Build Coastguard Worker 		      printf("}"));
391*cf84ac9aSAndroid Build Coastguard Worker }
392*cf84ac9aSAndroid Build Coastguard Worker #endif
393*cf84ac9aSAndroid Build Coastguard Worker 
394*cf84ac9aSAndroid Build Coastguard Worker #ifdef HAVE_STRUCT_DCBMSG
395*cf84ac9aSAndroid Build Coastguard Worker static void
test_rtnl_dcb(const int fd)396*cf84ac9aSAndroid Build Coastguard Worker test_rtnl_dcb(const int fd)
397*cf84ac9aSAndroid Build Coastguard Worker {
398*cf84ac9aSAndroid Build Coastguard Worker 	static const struct dcbmsg msg = {
399*cf84ac9aSAndroid Build Coastguard Worker 		.dcb_family = AF_UNIX,
400*cf84ac9aSAndroid Build Coastguard Worker 		.cmd = DCB_CMD_UNDEFINED
401*cf84ac9aSAndroid Build Coastguard Worker 	};
402*cf84ac9aSAndroid Build Coastguard Worker 	void *const nlh0 = midtail_alloc(NLMSG_HDRLEN, sizeof(msg));
403*cf84ac9aSAndroid Build Coastguard Worker 
404*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NL_ROUTE(fd, nlh0, RTM_GETDCB, msg,
405*cf84ac9aSAndroid Build Coastguard Worker 		      printf("{dcb_family=AF_UNIX"),
406*cf84ac9aSAndroid Build Coastguard Worker 		      printf(", cmd=DCB_CMD_UNDEFINED}"));
407*cf84ac9aSAndroid Build Coastguard Worker }
408*cf84ac9aSAndroid Build Coastguard Worker #endif
409*cf84ac9aSAndroid Build Coastguard Worker 
410*cf84ac9aSAndroid Build Coastguard Worker #ifdef HAVE_STRUCT_NETCONFMSG
411*cf84ac9aSAndroid Build Coastguard Worker static void
test_rtnl_netconf(const int fd)412*cf84ac9aSAndroid Build Coastguard Worker test_rtnl_netconf(const int fd)
413*cf84ac9aSAndroid Build Coastguard Worker {
414*cf84ac9aSAndroid Build Coastguard Worker 	static const struct netconfmsg msg = {
415*cf84ac9aSAndroid Build Coastguard Worker 		.ncm_family = AF_INET
416*cf84ac9aSAndroid Build Coastguard Worker 	};
417*cf84ac9aSAndroid Build Coastguard Worker 	void *const nlh0 = midtail_alloc(NLMSG_HDRLEN, sizeof(msg));
418*cf84ac9aSAndroid Build Coastguard Worker 
419*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NETLINK(fd, nlh0,
420*cf84ac9aSAndroid Build Coastguard Worker 		     RTM_GETNETCONF, NLM_F_REQUEST,
421*cf84ac9aSAndroid Build Coastguard Worker 		     sizeof(msg), &msg, sizeof(msg),
422*cf84ac9aSAndroid Build Coastguard Worker 		     printf("{ncm_family=AF_INET}"));
423*cf84ac9aSAndroid Build Coastguard Worker }
424*cf84ac9aSAndroid Build Coastguard Worker #endif
425*cf84ac9aSAndroid Build Coastguard Worker 
426*cf84ac9aSAndroid Build Coastguard Worker #ifdef HAVE_STRUCT_BR_PORT_MSG
427*cf84ac9aSAndroid Build Coastguard Worker static void
test_rtnl_mdb(const int fd)428*cf84ac9aSAndroid Build Coastguard Worker test_rtnl_mdb(const int fd)
429*cf84ac9aSAndroid Build Coastguard Worker {
430*cf84ac9aSAndroid Build Coastguard Worker 	const struct br_port_msg msg = {
431*cf84ac9aSAndroid Build Coastguard Worker 		.family = AF_UNIX,
432*cf84ac9aSAndroid Build Coastguard Worker 		.ifindex = ifindex_lo()
433*cf84ac9aSAndroid Build Coastguard Worker 	};
434*cf84ac9aSAndroid Build Coastguard Worker 	void *const nlh0 = midtail_alloc(NLMSG_HDRLEN, sizeof(msg));
435*cf84ac9aSAndroid Build Coastguard Worker 
436*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NL_ROUTE(fd, nlh0, RTM_GETMDB, msg,
437*cf84ac9aSAndroid Build Coastguard Worker 		      printf("{family=AF_UNIX"),
438*cf84ac9aSAndroid Build Coastguard Worker 		      printf(", ifindex=" IFINDEX_LO_STR "}"));
439*cf84ac9aSAndroid Build Coastguard Worker }
440*cf84ac9aSAndroid Build Coastguard Worker #endif
441*cf84ac9aSAndroid Build Coastguard Worker 
442*cf84ac9aSAndroid Build Coastguard Worker #ifdef RTM_NEWNSID
443*cf84ac9aSAndroid Build Coastguard Worker static void
test_rtnl_nsid(const int fd)444*cf84ac9aSAndroid Build Coastguard Worker test_rtnl_nsid(const int fd)
445*cf84ac9aSAndroid Build Coastguard Worker {
446*cf84ac9aSAndroid Build Coastguard Worker 	static const struct rtgenmsg msg = {
447*cf84ac9aSAndroid Build Coastguard Worker 		.rtgen_family = AF_UNIX
448*cf84ac9aSAndroid Build Coastguard Worker 	};
449*cf84ac9aSAndroid Build Coastguard Worker 	void *const nlh0 = midtail_alloc(NLMSG_HDRLEN, sizeof(msg));
450*cf84ac9aSAndroid Build Coastguard Worker 
451*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NETLINK(fd, nlh0,
452*cf84ac9aSAndroid Build Coastguard Worker 		     RTM_GETNSID, NLM_F_REQUEST,
453*cf84ac9aSAndroid Build Coastguard Worker 		     sizeof(msg), &msg, sizeof(msg),
454*cf84ac9aSAndroid Build Coastguard Worker 		     printf("{rtgen_family=AF_UNIX}"));
455*cf84ac9aSAndroid Build Coastguard Worker }
456*cf84ac9aSAndroid Build Coastguard Worker #endif
457*cf84ac9aSAndroid Build Coastguard Worker 
main(void)458*cf84ac9aSAndroid Build Coastguard Worker int main(void)
459*cf84ac9aSAndroid Build Coastguard Worker {
460*cf84ac9aSAndroid Build Coastguard Worker 	skip_if_unavailable("/proc/self/fd/");
461*cf84ac9aSAndroid Build Coastguard Worker 
462*cf84ac9aSAndroid Build Coastguard Worker 	int fd = create_nl_socket(NETLINK_ROUTE);
463*cf84ac9aSAndroid Build Coastguard Worker 
464*cf84ac9aSAndroid Build Coastguard Worker 	test_nlmsg_type(fd);
465*cf84ac9aSAndroid Build Coastguard Worker 	test_nlmsg_flags(fd);
466*cf84ac9aSAndroid Build Coastguard Worker 	test_nlmsg_done(fd);
467*cf84ac9aSAndroid Build Coastguard Worker 	test_rtnl_unspec(fd);
468*cf84ac9aSAndroid Build Coastguard Worker 	test_rtnl_link(fd);
469*cf84ac9aSAndroid Build Coastguard Worker 	test_rtnl_addr(fd);
470*cf84ac9aSAndroid Build Coastguard Worker 	test_rtnl_route(fd);
471*cf84ac9aSAndroid Build Coastguard Worker #ifdef HAVE_LINUX_FIB_RULES_H
472*cf84ac9aSAndroid Build Coastguard Worker 	test_rtnl_rule(fd);
473*cf84ac9aSAndroid Build Coastguard Worker #endif
474*cf84ac9aSAndroid Build Coastguard Worker 	test_rtnl_neigh(fd);
475*cf84ac9aSAndroid Build Coastguard Worker 	test_rtnl_neightbl(fd);
476*cf84ac9aSAndroid Build Coastguard Worker 	test_rtnl_tc(fd);
477*cf84ac9aSAndroid Build Coastguard Worker 	test_rtnl_tca(fd);
478*cf84ac9aSAndroid Build Coastguard Worker #ifdef HAVE_STRUCT_IFADDRLBLMSG
479*cf84ac9aSAndroid Build Coastguard Worker 	test_rtnl_addrlabel(fd);
480*cf84ac9aSAndroid Build Coastguard Worker #endif
481*cf84ac9aSAndroid Build Coastguard Worker #ifdef HAVE_STRUCT_DCBMSG
482*cf84ac9aSAndroid Build Coastguard Worker 	test_rtnl_dcb(fd);
483*cf84ac9aSAndroid Build Coastguard Worker #endif
484*cf84ac9aSAndroid Build Coastguard Worker #ifdef HAVE_STRUCT_NETCONFMSG
485*cf84ac9aSAndroid Build Coastguard Worker 	test_rtnl_netconf(fd);
486*cf84ac9aSAndroid Build Coastguard Worker #endif
487*cf84ac9aSAndroid Build Coastguard Worker #ifdef HAVE_STRUCT_BR_PORT_MSG
488*cf84ac9aSAndroid Build Coastguard Worker 	test_rtnl_mdb(fd);
489*cf84ac9aSAndroid Build Coastguard Worker #endif
490*cf84ac9aSAndroid Build Coastguard Worker #ifdef RTM_NEWNSID
491*cf84ac9aSAndroid Build Coastguard Worker 	test_rtnl_nsid(fd);
492*cf84ac9aSAndroid Build Coastguard Worker #endif
493*cf84ac9aSAndroid Build Coastguard Worker 
494*cf84ac9aSAndroid Build Coastguard Worker 	printf("+++ exited with 0 +++\n");
495*cf84ac9aSAndroid Build Coastguard Worker 
496*cf84ac9aSAndroid Build Coastguard Worker 	return 0;
497*cf84ac9aSAndroid Build Coastguard Worker }
498