xref: /aosp_15_r20/external/libnl/tests/cksuite-all-netns.c (revision 4dc78e53d49367fa8e61b07018507c90983a077d)
1*4dc78e53SAndroid Build Coastguard Worker /* SPDX-License-Identifier: LGPL-2.1-only */
2*4dc78e53SAndroid Build Coastguard Worker /*
3*4dc78e53SAndroid Build Coastguard Worker  * Author: Susant Sahani <[email protected]>
4*4dc78e53SAndroid Build Coastguard Worker  * Copyright (c) 2018 Red Hat, Inc.
5*4dc78e53SAndroid Build Coastguard Worker  */
6*4dc78e53SAndroid Build Coastguard Worker 
7*4dc78e53SAndroid Build Coastguard Worker #include "nl-default.h"
8*4dc78e53SAndroid Build Coastguard Worker 
9*4dc78e53SAndroid Build Coastguard Worker #include <linux/netlink.h>
10*4dc78e53SAndroid Build Coastguard Worker 
11*4dc78e53SAndroid Build Coastguard Worker #include <netlink/route/link.h>
12*4dc78e53SAndroid Build Coastguard Worker #include <netlink/route/link/sit.h>
13*4dc78e53SAndroid Build Coastguard Worker #include <netlink/route/link/bonding.h>
14*4dc78e53SAndroid Build Coastguard Worker #include <netlink/route/link/bridge.h>
15*4dc78e53SAndroid Build Coastguard Worker #include <netlink/route/link/ip6tnl.h>
16*4dc78e53SAndroid Build Coastguard Worker #include <netlink/route/link/ipgre.h>
17*4dc78e53SAndroid Build Coastguard Worker #include <netlink/route/link/ipip.h>
18*4dc78e53SAndroid Build Coastguard Worker #include <netlink/route/link/ipvlan.h>
19*4dc78e53SAndroid Build Coastguard Worker #include <netlink/route/link/ipvti.h>
20*4dc78e53SAndroid Build Coastguard Worker #include <netlink/route/link/macsec.h>
21*4dc78e53SAndroid Build Coastguard Worker #include <netlink/route/link/macvlan.h>
22*4dc78e53SAndroid Build Coastguard Worker #include <netlink/route/link/macvtap.h>
23*4dc78e53SAndroid Build Coastguard Worker #include <netlink/route/link/veth.h>
24*4dc78e53SAndroid Build Coastguard Worker #include <netlink/route/link/vlan.h>
25*4dc78e53SAndroid Build Coastguard Worker #include <netlink/route/link/vrf.h>
26*4dc78e53SAndroid Build Coastguard Worker #include <netlink/route/link/vxlan.h>
27*4dc78e53SAndroid Build Coastguard Worker 
28*4dc78e53SAndroid Build Coastguard Worker #include "cksuite-all.h"
29*4dc78e53SAndroid Build Coastguard Worker 
30*4dc78e53SAndroid Build Coastguard Worker /*****************************************************************************/
31*4dc78e53SAndroid Build Coastguard Worker 
_nltst_delete_link2(const char * ifname)32*4dc78e53SAndroid Build Coastguard Worker static void _nltst_delete_link2(const char *ifname)
33*4dc78e53SAndroid Build Coastguard Worker {
34*4dc78e53SAndroid Build Coastguard Worker 	_nltst_delete_link(NULL, ifname);
35*4dc78e53SAndroid Build Coastguard Worker }
36*4dc78e53SAndroid Build Coastguard Worker #define _nltst_auto_delete_link _nl_auto(_nltst_auto_delete_link_fcn)
37*4dc78e53SAndroid Build Coastguard Worker _NL_AUTO_DEFINE_FCN_TYPED0(const char *, _nltst_auto_delete_link_fcn,
38*4dc78e53SAndroid Build Coastguard Worker 			   _nltst_delete_link2);
39*4dc78e53SAndroid Build Coastguard Worker 
40*4dc78e53SAndroid Build Coastguard Worker /*****************************************************************************/
41*4dc78e53SAndroid Build Coastguard Worker 
START_TEST(cache_and_clone)42*4dc78e53SAndroid Build Coastguard Worker START_TEST(cache_and_clone)
43*4dc78e53SAndroid Build Coastguard Worker {
44*4dc78e53SAndroid Build Coastguard Worker 	_nl_auto_nl_socket struct nl_sock *sk = NULL;
45*4dc78e53SAndroid Build Coastguard Worker 	_nl_auto_nl_cache struct nl_cache *link_cache = NULL;
46*4dc78e53SAndroid Build Coastguard Worker 	_nl_auto_free struct nl_object **links_all = NULL;
47*4dc78e53SAndroid Build Coastguard Worker 	static const struct {
48*4dc78e53SAndroid Build Coastguard Worker 		const char *ifname;
49*4dc78e53SAndroid Build Coastguard Worker 		const char *kind;
50*4dc78e53SAndroid Build Coastguard Worker 		bool add;
51*4dc78e53SAndroid Build Coastguard Worker 	} links[] = {
52*4dc78e53SAndroid Build Coastguard Worker 		{
53*4dc78e53SAndroid Build Coastguard Worker 			.ifname = "xbr0",
54*4dc78e53SAndroid Build Coastguard Worker 			.kind = "bridge",
55*4dc78e53SAndroid Build Coastguard Worker 			.add = true,
56*4dc78e53SAndroid Build Coastguard Worker 		},
57*4dc78e53SAndroid Build Coastguard Worker 		{
58*4dc78e53SAndroid Build Coastguard Worker 			.ifname = "xdummy0",
59*4dc78e53SAndroid Build Coastguard Worker 			.kind = "dummy",
60*4dc78e53SAndroid Build Coastguard Worker 			.add = true,
61*4dc78e53SAndroid Build Coastguard Worker 		},
62*4dc78e53SAndroid Build Coastguard Worker 		{
63*4dc78e53SAndroid Build Coastguard Worker 			.ifname = "xbond0",
64*4dc78e53SAndroid Build Coastguard Worker 			.kind = "bond",
65*4dc78e53SAndroid Build Coastguard Worker 			.add = true,
66*4dc78e53SAndroid Build Coastguard Worker 		},
67*4dc78e53SAndroid Build Coastguard Worker 		{
68*4dc78e53SAndroid Build Coastguard Worker 			.ifname = "lo",
69*4dc78e53SAndroid Build Coastguard Worker 			.kind = NULL,
70*4dc78e53SAndroid Build Coastguard Worker 			.add = false,
71*4dc78e53SAndroid Build Coastguard Worker 		},
72*4dc78e53SAndroid Build Coastguard Worker 	};
73*4dc78e53SAndroid Build Coastguard Worker 	size_t i;
74*4dc78e53SAndroid Build Coastguard Worker 	int r;
75*4dc78e53SAndroid Build Coastguard Worker 
76*4dc78e53SAndroid Build Coastguard Worker 	for (i = 0; i < _NL_N_ELEMENTS(links); i++) {
77*4dc78e53SAndroid Build Coastguard Worker 		if (links[i].add)
78*4dc78e53SAndroid Build Coastguard Worker 			_nltst_add_link(NULL, links[i].ifname, links[i].kind,
79*4dc78e53SAndroid Build Coastguard Worker 					NULL);
80*4dc78e53SAndroid Build Coastguard Worker 	}
81*4dc78e53SAndroid Build Coastguard Worker 
82*4dc78e53SAndroid Build Coastguard Worker 	sk = _nltst_socket(NETLINK_ROUTE);
83*4dc78e53SAndroid Build Coastguard Worker 
84*4dc78e53SAndroid Build Coastguard Worker 	r = rtnl_link_alloc_cache(sk, AF_UNSPEC, &link_cache);
85*4dc78e53SAndroid Build Coastguard Worker 	ck_assert_int_eq(r, 0);
86*4dc78e53SAndroid Build Coastguard Worker 
87*4dc78e53SAndroid Build Coastguard Worker 	r = nl_cache_refill(sk, link_cache);
88*4dc78e53SAndroid Build Coastguard Worker 	ck_assert_int_eq(r, 0);
89*4dc78e53SAndroid Build Coastguard Worker 
90*4dc78e53SAndroid Build Coastguard Worker 	for (i = 0; i < _NL_N_ELEMENTS(links); i++) {
91*4dc78e53SAndroid Build Coastguard Worker 		_nl_auto_rtnl_link struct rtnl_link *link_clone = NULL;
92*4dc78e53SAndroid Build Coastguard Worker 		struct rtnl_link *link;
93*4dc78e53SAndroid Build Coastguard Worker 
94*4dc78e53SAndroid Build Coastguard Worker 		link = _nltst_cache_get_link(link_cache, links[i].ifname);
95*4dc78e53SAndroid Build Coastguard Worker 		ck_assert_ptr_nonnull(link);
96*4dc78e53SAndroid Build Coastguard Worker 
97*4dc78e53SAndroid Build Coastguard Worker 		ck_assert_str_eq(rtnl_link_get_name(link), links[i].ifname);
98*4dc78e53SAndroid Build Coastguard Worker 
99*4dc78e53SAndroid Build Coastguard Worker 		if (_nl_streq(links[i].ifname, "lo"))
100*4dc78e53SAndroid Build Coastguard Worker 			ck_assert_int_eq(rtnl_link_get_ifindex(link), 1);
101*4dc78e53SAndroid Build Coastguard Worker 		else
102*4dc78e53SAndroid Build Coastguard Worker 			ck_assert_int_gt(rtnl_link_get_ifindex(link), 1);
103*4dc78e53SAndroid Build Coastguard Worker 
104*4dc78e53SAndroid Build Coastguard Worker 		link_clone = (struct rtnl_link *)nl_object_clone(
105*4dc78e53SAndroid Build Coastguard Worker 			(struct nl_object *)link);
106*4dc78e53SAndroid Build Coastguard Worker 		ck_assert(link_clone);
107*4dc78e53SAndroid Build Coastguard Worker 
108*4dc78e53SAndroid Build Coastguard Worker 		_nltst_object_identical(link, link_clone);
109*4dc78e53SAndroid Build Coastguard Worker 	}
110*4dc78e53SAndroid Build Coastguard Worker 
111*4dc78e53SAndroid Build Coastguard Worker 	links_all = _nltst_cache_get_all(link_cache, NULL);
112*4dc78e53SAndroid Build Coastguard Worker 	for (i = 0; links_all[i]; i++) {
113*4dc78e53SAndroid Build Coastguard Worker 		struct rtnl_link *link = (struct rtnl_link *)links_all[i];
114*4dc78e53SAndroid Build Coastguard Worker 		_nl_auto_rtnl_link struct rtnl_link *link_clone = NULL;
115*4dc78e53SAndroid Build Coastguard Worker 
116*4dc78e53SAndroid Build Coastguard Worker 		link_clone = (struct rtnl_link *)nl_object_clone(
117*4dc78e53SAndroid Build Coastguard Worker 			(struct nl_object *)link);
118*4dc78e53SAndroid Build Coastguard Worker 		ck_assert(link_clone);
119*4dc78e53SAndroid Build Coastguard Worker 
120*4dc78e53SAndroid Build Coastguard Worker 		_nltst_object_identical(link, link_clone);
121*4dc78e53SAndroid Build Coastguard Worker 	}
122*4dc78e53SAndroid Build Coastguard Worker }
123*4dc78e53SAndroid Build Coastguard Worker END_TEST
124*4dc78e53SAndroid Build Coastguard Worker 
125*4dc78e53SAndroid Build Coastguard Worker /*****************************************************************************/
126*4dc78e53SAndroid Build Coastguard Worker 
START_TEST(test_create_iface)127*4dc78e53SAndroid Build Coastguard Worker START_TEST(test_create_iface)
128*4dc78e53SAndroid Build Coastguard Worker {
129*4dc78e53SAndroid Build Coastguard Worker 	const int TEST_IDX = _i;
130*4dc78e53SAndroid Build Coastguard Worker 	_nl_auto_nl_socket struct nl_sock *sk = _nltst_socket(NETLINK_ROUTE);
131*4dc78e53SAndroid Build Coastguard Worker 	_nl_auto_rtnl_link struct rtnl_link *link = NULL;
132*4dc78e53SAndroid Build Coastguard Worker 	_nl_auto_rtnl_link struct rtnl_link *link2 = NULL;
133*4dc78e53SAndroid Build Coastguard Worker 	_nl_auto_rtnl_link struct rtnl_link *peer = NULL;
134*4dc78e53SAndroid Build Coastguard Worker 	_nltst_auto_delete_link const char *IFNAME_DUMMY = NULL;
135*4dc78e53SAndroid Build Coastguard Worker 	_nltst_auto_delete_link const char *IFNAME = "ifname";
136*4dc78e53SAndroid Build Coastguard Worker 	int ifindex_dummy;
137*4dc78e53SAndroid Build Coastguard Worker 	uint32_t u32;
138*4dc78e53SAndroid Build Coastguard Worker 	int r;
139*4dc78e53SAndroid Build Coastguard Worker 
140*4dc78e53SAndroid Build Coastguard Worker 	switch (TEST_IDX) {
141*4dc78e53SAndroid Build Coastguard Worker 	case 0:
142*4dc78e53SAndroid Build Coastguard Worker 		link = _nltst_assert(rtnl_link_bridge_alloc());
143*4dc78e53SAndroid Build Coastguard Worker 		rtnl_link_set_name(link, IFNAME);
144*4dc78e53SAndroid Build Coastguard Worker 		break;
145*4dc78e53SAndroid Build Coastguard Worker 	case 1:
146*4dc78e53SAndroid Build Coastguard Worker 		link = _nltst_assert(rtnl_link_vxlan_alloc());
147*4dc78e53SAndroid Build Coastguard Worker 		rtnl_link_set_name(link, IFNAME);
148*4dc78e53SAndroid Build Coastguard Worker 		_nltst_assert_retcode(rtnl_link_vxlan_set_id(link, 128));
149*4dc78e53SAndroid Build Coastguard Worker 		break;
150*4dc78e53SAndroid Build Coastguard Worker 	case 2:
151*4dc78e53SAndroid Build Coastguard Worker 		link = _nltst_assert(rtnl_link_alloc());
152*4dc78e53SAndroid Build Coastguard Worker 		rtnl_link_set_type(link, "ifb");
153*4dc78e53SAndroid Build Coastguard Worker 		rtnl_link_set_name(link, IFNAME);
154*4dc78e53SAndroid Build Coastguard Worker 		break;
155*4dc78e53SAndroid Build Coastguard Worker 	case 3:
156*4dc78e53SAndroid Build Coastguard Worker 		link = _nltst_assert(rtnl_link_ipgre_alloc());
157*4dc78e53SAndroid Build Coastguard Worker 		rtnl_link_set_name(link, IFNAME);
158*4dc78e53SAndroid Build Coastguard Worker 		_nltst_assert_retcode(rtnl_link_ipgre_set_local(
159*4dc78e53SAndroid Build Coastguard Worker 			link, _nltst_inet4("192.168.254.12")));
160*4dc78e53SAndroid Build Coastguard Worker 		_nltst_assert_retcode(rtnl_link_ipgre_set_remote(
161*4dc78e53SAndroid Build Coastguard Worker 			link, _nltst_inet4("192.168.254.13")));
162*4dc78e53SAndroid Build Coastguard Worker 		_nltst_assert_retcode(rtnl_link_ipgre_set_ttl(link, 64));
163*4dc78e53SAndroid Build Coastguard Worker 		break;
164*4dc78e53SAndroid Build Coastguard Worker 	case 4:
165*4dc78e53SAndroid Build Coastguard Worker 		link = _nltst_assert(rtnl_link_ip6_tnl_alloc());
166*4dc78e53SAndroid Build Coastguard Worker 		rtnl_link_set_name(link, IFNAME);
167*4dc78e53SAndroid Build Coastguard Worker 		_nltst_assert_retcode(rtnl_link_ip6_tnl_set_local(
168*4dc78e53SAndroid Build Coastguard Worker 			link, _nltst_inet6p("2607:f0d0:1002:51::4")));
169*4dc78e53SAndroid Build Coastguard Worker 		_nltst_assert_retcode(rtnl_link_ip6_tnl_set_remote(
170*4dc78e53SAndroid Build Coastguard Worker 			link, _nltst_inet6p("2607:f0d0:1002:52::5")));
171*4dc78e53SAndroid Build Coastguard Worker 		break;
172*4dc78e53SAndroid Build Coastguard Worker 	case 5:
173*4dc78e53SAndroid Build Coastguard Worker 		link = _nltst_assert(rtnl_link_ipgretap_alloc());
174*4dc78e53SAndroid Build Coastguard Worker 		rtnl_link_set_name(link, IFNAME);
175*4dc78e53SAndroid Build Coastguard Worker 		_nltst_assert_retcode(rtnl_link_ipgre_set_local(
176*4dc78e53SAndroid Build Coastguard Worker 			link, _nltst_inet4("10.211.55.10")));
177*4dc78e53SAndroid Build Coastguard Worker 		_nltst_assert_retcode(rtnl_link_ipgre_set_remote(
178*4dc78e53SAndroid Build Coastguard Worker 			link, _nltst_inet4("10.133.6.33")));
179*4dc78e53SAndroid Build Coastguard Worker 		_nltst_assert_retcode(rtnl_link_ipgre_set_ttl(link, 64));
180*4dc78e53SAndroid Build Coastguard Worker 		break;
181*4dc78e53SAndroid Build Coastguard Worker 	case 6:
182*4dc78e53SAndroid Build Coastguard Worker 		link = _nltst_assert(rtnl_link_ipvti_alloc());
183*4dc78e53SAndroid Build Coastguard Worker 		rtnl_link_set_name(link, IFNAME);
184*4dc78e53SAndroid Build Coastguard Worker 		_nltst_assert_retcode(rtnl_link_ipvti_set_local(
185*4dc78e53SAndroid Build Coastguard Worker 			link, _nltst_inet4("192.168.254.12")));
186*4dc78e53SAndroid Build Coastguard Worker 		_nltst_assert_retcode(rtnl_link_ipvti_set_remote(
187*4dc78e53SAndroid Build Coastguard Worker 			link, _nltst_inet4("192.168.254.13")));
188*4dc78e53SAndroid Build Coastguard Worker 		break;
189*4dc78e53SAndroid Build Coastguard Worker 	case 7:
190*4dc78e53SAndroid Build Coastguard Worker 		link = _nltst_assert(rtnl_link_sit_alloc());
191*4dc78e53SAndroid Build Coastguard Worker 		rtnl_link_set_name(link, IFNAME);
192*4dc78e53SAndroid Build Coastguard Worker 		_nltst_assert_retcode(rtnl_link_sit_set_local(
193*4dc78e53SAndroid Build Coastguard Worker 			link, _nltst_inet4("192.168.254.12")));
194*4dc78e53SAndroid Build Coastguard Worker 		_nltst_assert_retcode(rtnl_link_sit_set_remote(
195*4dc78e53SAndroid Build Coastguard Worker 			link, _nltst_inet4("192.168.254.13")));
196*4dc78e53SAndroid Build Coastguard Worker 		_nltst_assert_retcode(rtnl_link_sit_set_ttl(link, 64));
197*4dc78e53SAndroid Build Coastguard Worker 		break;
198*4dc78e53SAndroid Build Coastguard Worker 	case 8:
199*4dc78e53SAndroid Build Coastguard Worker 		link = _nltst_assert(rtnl_link_ipip_alloc());
200*4dc78e53SAndroid Build Coastguard Worker 		rtnl_link_set_name(link, IFNAME);
201*4dc78e53SAndroid Build Coastguard Worker 		_nltst_assert_retcode(rtnl_link_ipip_set_local(
202*4dc78e53SAndroid Build Coastguard Worker 			link, _nltst_inet4("192.168.254.12")));
203*4dc78e53SAndroid Build Coastguard Worker 		_nltst_assert_retcode(rtnl_link_ipip_set_remote(
204*4dc78e53SAndroid Build Coastguard Worker 			link, _nltst_inet4("192.168.254.13")));
205*4dc78e53SAndroid Build Coastguard Worker 		_nltst_assert_retcode(rtnl_link_ipip_set_ttl(link, 64));
206*4dc78e53SAndroid Build Coastguard Worker 		break;
207*4dc78e53SAndroid Build Coastguard Worker 	case 9:
208*4dc78e53SAndroid Build Coastguard Worker 		link = _nltst_assert(rtnl_link_bond_alloc());
209*4dc78e53SAndroid Build Coastguard Worker 		rtnl_link_set_name(link, IFNAME);
210*4dc78e53SAndroid Build Coastguard Worker 		break;
211*4dc78e53SAndroid Build Coastguard Worker 	case 10:
212*4dc78e53SAndroid Build Coastguard Worker 		IFNAME_DUMMY = "ci-dummy";
213*4dc78e53SAndroid Build Coastguard Worker 		_nltst_add_link(sk, IFNAME_DUMMY, "dummy", &ifindex_dummy);
214*4dc78e53SAndroid Build Coastguard Worker 
215*4dc78e53SAndroid Build Coastguard Worker 		link = _nltst_assert(rtnl_link_macvtap_alloc());
216*4dc78e53SAndroid Build Coastguard Worker 		rtnl_link_set_link(link, ifindex_dummy);
217*4dc78e53SAndroid Build Coastguard Worker 		rtnl_link_set_name(link, IFNAME);
218*4dc78e53SAndroid Build Coastguard Worker 		_nltst_assert_retcode(rtnl_link_macvtap_set_mode(
219*4dc78e53SAndroid Build Coastguard Worker 			link, rtnl_link_macvtap_str2mode("bridge")));
220*4dc78e53SAndroid Build Coastguard Worker 		break;
221*4dc78e53SAndroid Build Coastguard Worker 	case 11:
222*4dc78e53SAndroid Build Coastguard Worker 		IFNAME_DUMMY = "ci-dummy";
223*4dc78e53SAndroid Build Coastguard Worker 		_nltst_add_link(sk, IFNAME_DUMMY, "dummy", &ifindex_dummy);
224*4dc78e53SAndroid Build Coastguard Worker 
225*4dc78e53SAndroid Build Coastguard Worker 		link = _nltst_assert(rtnl_link_macvlan_alloc());
226*4dc78e53SAndroid Build Coastguard Worker 		rtnl_link_set_link(link, ifindex_dummy);
227*4dc78e53SAndroid Build Coastguard Worker 		rtnl_link_set_name(link, IFNAME);
228*4dc78e53SAndroid Build Coastguard Worker 		break;
229*4dc78e53SAndroid Build Coastguard Worker 	case 12:
230*4dc78e53SAndroid Build Coastguard Worker 		IFNAME_DUMMY = "ci-dummy";
231*4dc78e53SAndroid Build Coastguard Worker 		_nltst_add_link(sk, IFNAME_DUMMY, "dummy", &ifindex_dummy);
232*4dc78e53SAndroid Build Coastguard Worker 
233*4dc78e53SAndroid Build Coastguard Worker 		link = _nltst_assert(rtnl_link_vlan_alloc());
234*4dc78e53SAndroid Build Coastguard Worker 		rtnl_link_set_link(link, ifindex_dummy);
235*4dc78e53SAndroid Build Coastguard Worker 		rtnl_link_set_name(link, IFNAME);
236*4dc78e53SAndroid Build Coastguard Worker 		_nltst_assert_retcode(rtnl_link_vlan_set_id(link, 10));
237*4dc78e53SAndroid Build Coastguard Worker 		break;
238*4dc78e53SAndroid Build Coastguard Worker 	case 13:
239*4dc78e53SAndroid Build Coastguard Worker 		IFNAME_DUMMY = "ci-dummy";
240*4dc78e53SAndroid Build Coastguard Worker 		_nltst_add_link(sk, IFNAME_DUMMY, "dummy", &ifindex_dummy);
241*4dc78e53SAndroid Build Coastguard Worker 
242*4dc78e53SAndroid Build Coastguard Worker 		link = _nltst_assert(rtnl_link_macsec_alloc());
243*4dc78e53SAndroid Build Coastguard Worker 		rtnl_link_set_link(link, ifindex_dummy);
244*4dc78e53SAndroid Build Coastguard Worker 		rtnl_link_set_name(link, IFNAME);
245*4dc78e53SAndroid Build Coastguard Worker 		_nltst_assert_retcode(rtnl_link_macsec_set_port(link, 10));
246*4dc78e53SAndroid Build Coastguard Worker 		_nltst_assert_retcode(rtnl_link_macsec_set_encrypt(link, 1));
247*4dc78e53SAndroid Build Coastguard Worker 		_nltst_assert_retcode(
248*4dc78e53SAndroid Build Coastguard Worker 			rtnl_link_macsec_set_replay_protect(link, 1));
249*4dc78e53SAndroid Build Coastguard Worker 		_nltst_assert_retcode(rtnl_link_macsec_set_window(link, 200));
250*4dc78e53SAndroid Build Coastguard Worker 		break;
251*4dc78e53SAndroid Build Coastguard Worker 	case 14:
252*4dc78e53SAndroid Build Coastguard Worker 		IFNAME_DUMMY = "ci-dummy";
253*4dc78e53SAndroid Build Coastguard Worker 		_nltst_add_link(sk, IFNAME_DUMMY, "dummy", &ifindex_dummy);
254*4dc78e53SAndroid Build Coastguard Worker 
255*4dc78e53SAndroid Build Coastguard Worker 		link = _nltst_assert(rtnl_link_ipvlan_alloc());
256*4dc78e53SAndroid Build Coastguard Worker 		rtnl_link_set_link(link, ifindex_dummy);
257*4dc78e53SAndroid Build Coastguard Worker 		_nltst_assert_retcode(rtnl_link_ipvlan_set_mode(
258*4dc78e53SAndroid Build Coastguard Worker 			link, rtnl_link_ipvlan_str2mode("l2")));
259*4dc78e53SAndroid Build Coastguard Worker 		rtnl_link_set_name(link, IFNAME);
260*4dc78e53SAndroid Build Coastguard Worker 		break;
261*4dc78e53SAndroid Build Coastguard Worker 	case 15:
262*4dc78e53SAndroid Build Coastguard Worker 		link = _nltst_assert(rtnl_link_vrf_alloc());
263*4dc78e53SAndroid Build Coastguard Worker 		rtnl_link_set_name(link, IFNAME);
264*4dc78e53SAndroid Build Coastguard Worker 		_nltst_assert_retcode(rtnl_link_vrf_set_tableid(link, 10));
265*4dc78e53SAndroid Build Coastguard Worker 		break;
266*4dc78e53SAndroid Build Coastguard Worker 	case 16: {
267*4dc78e53SAndroid Build Coastguard Worker 		link = _nltst_assert(rtnl_link_veth_alloc());
268*4dc78e53SAndroid Build Coastguard Worker 		rtnl_link_set_name(link, IFNAME);
269*4dc78e53SAndroid Build Coastguard Worker 		peer = _nltst_assert(rtnl_link_veth_get_peer(link));
270*4dc78e53SAndroid Build Coastguard Worker 		rtnl_link_set_name(peer, "ci-veth-peer");
271*4dc78e53SAndroid Build Coastguard Worker 	} break;
272*4dc78e53SAndroid Build Coastguard Worker 	default:
273*4dc78e53SAndroid Build Coastguard Worker 		ck_assert_msg(0, "unexpected TEST_IDX=%d", _i);
274*4dc78e53SAndroid Build Coastguard Worker 		break;
275*4dc78e53SAndroid Build Coastguard Worker 	}
276*4dc78e53SAndroid Build Coastguard Worker 
277*4dc78e53SAndroid Build Coastguard Worker 	r = rtnl_link_add(sk, link, NLM_F_CREATE);
278*4dc78e53SAndroid Build Coastguard Worker 	if (r == -NLE_OPNOTSUPP) {
279*4dc78e53SAndroid Build Coastguard Worker 		/* Hm, no kernel module? Skip the test. */
280*4dc78e53SAndroid Build Coastguard Worker 		_nltst_assert_link_not_exists(IFNAME);
281*4dc78e53SAndroid Build Coastguard Worker 		IFNAME = NULL;
282*4dc78e53SAndroid Build Coastguard Worker 		return;
283*4dc78e53SAndroid Build Coastguard Worker 	}
284*4dc78e53SAndroid Build Coastguard Worker 	_nltst_assert_retcode(r);
285*4dc78e53SAndroid Build Coastguard Worker 
286*4dc78e53SAndroid Build Coastguard Worker 	_nltst_assert_link_exists(IFNAME);
287*4dc78e53SAndroid Build Coastguard Worker 
288*4dc78e53SAndroid Build Coastguard Worker 	switch (TEST_IDX) {
289*4dc78e53SAndroid Build Coastguard Worker 	case 15:
290*4dc78e53SAndroid Build Coastguard Worker 		_nltst_get_link(sk, IFNAME, NULL, &link2);
291*4dc78e53SAndroid Build Coastguard Worker 		_nltst_assert_retcode(rtnl_link_vrf_get_tableid(link2, &u32));
292*4dc78e53SAndroid Build Coastguard Worker 		ck_assert_int_eq(u32, 10);
293*4dc78e53SAndroid Build Coastguard Worker 		break;
294*4dc78e53SAndroid Build Coastguard Worker 	case 16:
295*4dc78e53SAndroid Build Coastguard Worker 		_nltst_assert_link_exists("ci-veth-peer");
296*4dc78e53SAndroid Build Coastguard Worker 		if (_nltst_rand_bool())
297*4dc78e53SAndroid Build Coastguard Worker 			IFNAME = "ci-veth-peer";
298*4dc78e53SAndroid Build Coastguard Worker 		break;
299*4dc78e53SAndroid Build Coastguard Worker 	}
300*4dc78e53SAndroid Build Coastguard Worker }
301*4dc78e53SAndroid Build Coastguard Worker END_TEST
302*4dc78e53SAndroid Build Coastguard Worker 
303*4dc78e53SAndroid Build Coastguard Worker /*****************************************************************************/
304*4dc78e53SAndroid Build Coastguard Worker 
_route_init(int addr_family,struct nl_sock ** sk,struct nl_cache ** cache)305*4dc78e53SAndroid Build Coastguard Worker static void _route_init(int addr_family, struct nl_sock **sk,
306*4dc78e53SAndroid Build Coastguard Worker 			struct nl_cache **cache)
307*4dc78e53SAndroid Build Coastguard Worker {
308*4dc78e53SAndroid Build Coastguard Worker 	ck_assert(sk && !*sk);
309*4dc78e53SAndroid Build Coastguard Worker 	ck_assert(cache && !*cache);
310*4dc78e53SAndroid Build Coastguard Worker 
311*4dc78e53SAndroid Build Coastguard Worker 	*sk = _nltst_socket(NETLINK_ROUTE);
312*4dc78e53SAndroid Build Coastguard Worker 	*cache = _nltst_rtnl_route_alloc_cache(*sk, addr_family);
313*4dc78e53SAndroid Build Coastguard Worker }
314*4dc78e53SAndroid Build Coastguard Worker 
START_TEST(route_1)315*4dc78e53SAndroid Build Coastguard Worker START_TEST(route_1)
316*4dc78e53SAndroid Build Coastguard Worker {
317*4dc78e53SAndroid Build Coastguard Worker 	_nl_auto_nl_socket struct nl_sock *sk = NULL;
318*4dc78e53SAndroid Build Coastguard Worker 	_nl_auto_nl_cache struct nl_cache *cache = NULL;
319*4dc78e53SAndroid Build Coastguard Worker 
320*4dc78e53SAndroid Build Coastguard Worker 	if (_nltst_skip_no_iproute2("route_1"))
321*4dc78e53SAndroid Build Coastguard Worker 		return;
322*4dc78e53SAndroid Build Coastguard Worker 
323*4dc78e53SAndroid Build Coastguard Worker 	_nltst_add_link(NULL, "v1", "dummy", NULL);
324*4dc78e53SAndroid Build Coastguard Worker 	_nltst_system("ip -d link set v1 up");
325*4dc78e53SAndroid Build Coastguard Worker 
326*4dc78e53SAndroid Build Coastguard Worker 	_route_init(AF_INET6, &sk, &cache);
327*4dc78e53SAndroid Build Coastguard Worker 
328*4dc78e53SAndroid Build Coastguard Worker 	_nltst_assert_route_cache(cache, "fe80::/64", "6 fe80::*/128",
329*4dc78e53SAndroid Build Coastguard Worker 				  "ff00::/8");
330*4dc78e53SAndroid Build Coastguard Worker }
331*4dc78e53SAndroid Build Coastguard Worker END_TEST
332*4dc78e53SAndroid Build Coastguard Worker 
333*4dc78e53SAndroid Build Coastguard Worker /*****************************************************************************/
334*4dc78e53SAndroid Build Coastguard Worker 
make_nl_netns_suite(void)335*4dc78e53SAndroid Build Coastguard Worker Suite *make_nl_netns_suite(void)
336*4dc78e53SAndroid Build Coastguard Worker {
337*4dc78e53SAndroid Build Coastguard Worker 	Suite *suite = suite_create("netns");
338*4dc78e53SAndroid Build Coastguard Worker 	TCase *tc = tcase_create("Core");
339*4dc78e53SAndroid Build Coastguard Worker 
340*4dc78e53SAndroid Build Coastguard Worker 	tcase_add_checked_fixture(tc, nltst_netns_fixture_setup,
341*4dc78e53SAndroid Build Coastguard Worker 				  nltst_netns_fixture_teardown);
342*4dc78e53SAndroid Build Coastguard Worker 	tcase_add_test(tc, cache_and_clone);
343*4dc78e53SAndroid Build Coastguard Worker 	tcase_add_loop_test(tc, test_create_iface, 0, 17);
344*4dc78e53SAndroid Build Coastguard Worker 	tcase_add_test(tc, route_1);
345*4dc78e53SAndroid Build Coastguard Worker 	suite_add_tcase(suite, tc);
346*4dc78e53SAndroid Build Coastguard Worker 
347*4dc78e53SAndroid Build Coastguard Worker 	return suite;
348*4dc78e53SAndroid Build Coastguard Worker }
349