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