xref: /xnu-11215.81.4/tests/net_bond.c (revision d4514f0bc1d3f944c22d92e68b646ac3fb40d452)
1*d4514f0bSApple OSS Distributions /*
2*d4514f0bSApple OSS Distributions  * Copyright (c) 2024 Apple Inc. All rights reserved.
3*d4514f0bSApple OSS Distributions  *
4*d4514f0bSApple OSS Distributions  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5*d4514f0bSApple OSS Distributions  *
6*d4514f0bSApple OSS Distributions  * This file contains Original Code and/or Modifications of Original Code
7*d4514f0bSApple OSS Distributions  * as defined in and that are subject to the Apple Public Source License
8*d4514f0bSApple OSS Distributions  * Version 2.0 (the 'License'). You may not use this file except in
9*d4514f0bSApple OSS Distributions  * compliance with the License. The rights granted to you under the License
10*d4514f0bSApple OSS Distributions  * may not be used to create, or enable the creation or redistribution of,
11*d4514f0bSApple OSS Distributions  * unlawful or unlicensed copies of an Apple operating system, or to
12*d4514f0bSApple OSS Distributions  * circumvent, violate, or enable the circumvention or violation of, any
13*d4514f0bSApple OSS Distributions  * terms of an Apple operating system software license agreement.
14*d4514f0bSApple OSS Distributions  *
15*d4514f0bSApple OSS Distributions  * Please obtain a copy of the License at
16*d4514f0bSApple OSS Distributions  * http://www.opensource.apple.com/apsl/ and read it before using this file.
17*d4514f0bSApple OSS Distributions  *
18*d4514f0bSApple OSS Distributions  * The Original Code and all software distributed under the License are
19*d4514f0bSApple OSS Distributions  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20*d4514f0bSApple OSS Distributions  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21*d4514f0bSApple OSS Distributions  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22*d4514f0bSApple OSS Distributions  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23*d4514f0bSApple OSS Distributions  * Please see the License for the specific language governing rights and
24*d4514f0bSApple OSS Distributions  * limitations under the License.
25*d4514f0bSApple OSS Distributions  *
26*d4514f0bSApple OSS Distributions  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27*d4514f0bSApple OSS Distributions  */
28*d4514f0bSApple OSS Distributions 
29*d4514f0bSApple OSS Distributions /*
30*d4514f0bSApple OSS Distributions  * net_bond.c
31*d4514f0bSApple OSS Distributions  * - test if_bond.c functionality
32*d4514f0bSApple OSS Distributions  */
33*d4514f0bSApple OSS Distributions 
34*d4514f0bSApple OSS Distributions #include <darwintest.h>
35*d4514f0bSApple OSS Distributions #include <stdio.h>
36*d4514f0bSApple OSS Distributions #include <unistd.h>
37*d4514f0bSApple OSS Distributions #include <stddef.h>
38*d4514f0bSApple OSS Distributions #include <stdlib.h>
39*d4514f0bSApple OSS Distributions #include <string.h>
40*d4514f0bSApple OSS Distributions #include <sys/socket.h>
41*d4514f0bSApple OSS Distributions #include <arpa/inet.h>
42*d4514f0bSApple OSS Distributions #include <sys/event.h>
43*d4514f0bSApple OSS Distributions #include <net/if.h>
44*d4514f0bSApple OSS Distributions #include <netinet/in.h>
45*d4514f0bSApple OSS Distributions #include <netinet6/in6_var.h>
46*d4514f0bSApple OSS Distributions #include <netinet6/nd6.h>
47*d4514f0bSApple OSS Distributions #include <netinet/in.h>
48*d4514f0bSApple OSS Distributions #include <netinet/ip.h>
49*d4514f0bSApple OSS Distributions #include <netinet/udp.h>
50*d4514f0bSApple OSS Distributions #include <netinet/tcp.h>
51*d4514f0bSApple OSS Distributions #include <netinet/if_ether.h>
52*d4514f0bSApple OSS Distributions #include <netinet/ip6.h>
53*d4514f0bSApple OSS Distributions #include <netinet/icmp6.h>
54*d4514f0bSApple OSS Distributions #include <net/if_arp.h>
55*d4514f0bSApple OSS Distributions #include <net/bpf.h>
56*d4514f0bSApple OSS Distributions #include <net/if_fake_var.h>
57*d4514f0bSApple OSS Distributions #include <net/if_vlan_var.h>
58*d4514f0bSApple OSS Distributions #include <net/if_bond_var.h>
59*d4514f0bSApple OSS Distributions #include <sys/ioctl.h>
60*d4514f0bSApple OSS Distributions #include <sys/types.h>
61*d4514f0bSApple OSS Distributions #include <sys/stat.h>
62*d4514f0bSApple OSS Distributions #include <errno.h>
63*d4514f0bSApple OSS Distributions #include <pthread.h>
64*d4514f0bSApple OSS Distributions #include <stdbool.h>
65*d4514f0bSApple OSS Distributions #include <TargetConditionals.h>
66*d4514f0bSApple OSS Distributions #include <darwintest_utils.h>
67*d4514f0bSApple OSS Distributions 
68*d4514f0bSApple OSS Distributions #include "net_test_lib.h"
69*d4514f0bSApple OSS Distributions #include "inet_transfer.h"
70*d4514f0bSApple OSS Distributions #include "bpflib.h"
71*d4514f0bSApple OSS Distributions #include "in_cksum.h"
72*d4514f0bSApple OSS Distributions 
73*d4514f0bSApple OSS Distributions #define TEN_NET                 0x0a000000
74*d4514f0bSApple OSS Distributions #define TEN_1_NET               (TEN_NET | 0x010000)
75*d4514f0bSApple OSS Distributions 
76*d4514f0bSApple OSS Distributions static void
get_ipv4_address(u_int unit,u_int addr_index,struct in_addr * ip)77*d4514f0bSApple OSS Distributions get_ipv4_address(u_int unit, u_int addr_index, struct in_addr *ip)
78*d4514f0bSApple OSS Distributions {
79*d4514f0bSApple OSS Distributions 	/* up to 255 units, 255 addresses */
80*d4514f0bSApple OSS Distributions 	ip->s_addr = htonl(TEN_1_NET | (unit << 8) | addr_index);
81*d4514f0bSApple OSS Distributions 	return;
82*d4514f0bSApple OSS Distributions }
83*d4514f0bSApple OSS Distributions 
84*d4514f0bSApple OSS Distributions /**
85*d4514f0bSApple OSS Distributions ** Test Main
86*d4514f0bSApple OSS Distributions **/
87*d4514f0bSApple OSS Distributions static network_interface_pair           S_bond_pair;
88*d4514f0bSApple OSS Distributions static network_interface_pair_list_t    S_feth_pairs;
89*d4514f0bSApple OSS Distributions static network_interface_pair_list_t    S_vlan_pairs;
90*d4514f0bSApple OSS Distributions 
91*d4514f0bSApple OSS Distributions 
92*d4514f0bSApple OSS Distributions #define VLAN_UNIT_START                 200
93*d4514f0bSApple OSS Distributions #define FAKE_SYSCTL                     "net.link.fake"
94*d4514f0bSApple OSS Distributions #define FAKE_SYSCTL_BSD_MODE            FAKE_SYSCTL ".bsd_mode"
95*d4514f0bSApple OSS Distributions #define FAKE_SYSCTL_VLAN_TAGGING        FAKE_SYSCTL ".vlan_tagging"
96*d4514f0bSApple OSS Distributions 
97*d4514f0bSApple OSS Distributions static int fake_bsd_mode;
98*d4514f0bSApple OSS Distributions static bool fake_bsd_mode_was_set;
99*d4514f0bSApple OSS Distributions static int fake_vlan_tagging;
100*d4514f0bSApple OSS Distributions static bool fake_vlan_tagging_was_set;
101*d4514f0bSApple OSS Distributions 
102*d4514f0bSApple OSS Distributions static void
sysctl_set_integer(const char * name,int val,int * restore_val,bool * was_set)103*d4514f0bSApple OSS Distributions sysctl_set_integer(const char * name, int val, int * restore_val,
104*d4514f0bSApple OSS Distributions     bool * was_set)
105*d4514f0bSApple OSS Distributions {
106*d4514f0bSApple OSS Distributions 	int     error;
107*d4514f0bSApple OSS Distributions 	size_t  len;
108*d4514f0bSApple OSS Distributions 
109*d4514f0bSApple OSS Distributions 	T_LOG("%s\n", __func__);
110*d4514f0bSApple OSS Distributions 	len = sizeof(int);
111*d4514f0bSApple OSS Distributions 	error = sysctlbyname(name, restore_val, &len, &val, sizeof(int));
112*d4514f0bSApple OSS Distributions 	T_ASSERT_EQ(error, 0, "sysctl %s %d -> %d", name, *restore_val, val);
113*d4514f0bSApple OSS Distributions 	*was_set = (*restore_val != val);
114*d4514f0bSApple OSS Distributions }
115*d4514f0bSApple OSS Distributions 
116*d4514f0bSApple OSS Distributions static void
sysctl_restore_integer(const char * name,int restore_val,bool was_set)117*d4514f0bSApple OSS Distributions sysctl_restore_integer(const char * name, int restore_val, bool was_set)
118*d4514f0bSApple OSS Distributions {
119*d4514f0bSApple OSS Distributions 	if (was_set) {
120*d4514f0bSApple OSS Distributions 		int     error;
121*d4514f0bSApple OSS Distributions 
122*d4514f0bSApple OSS Distributions 		error = sysctlbyname(name, NULL, 0, &restore_val, sizeof(int));
123*d4514f0bSApple OSS Distributions 		T_ASSERT_EQ(error, 0, "sysctl %s %d", name, restore_val);
124*d4514f0bSApple OSS Distributions 	} else {
125*d4514f0bSApple OSS Distributions 		T_LOG("sysctl %s not modified", name);
126*d4514f0bSApple OSS Distributions 	}
127*d4514f0bSApple OSS Distributions }
128*d4514f0bSApple OSS Distributions 
129*d4514f0bSApple OSS Distributions static void
fake_set_bsd_mode(bool enable)130*d4514f0bSApple OSS Distributions fake_set_bsd_mode(bool enable)
131*d4514f0bSApple OSS Distributions {
132*d4514f0bSApple OSS Distributions 	sysctl_set_integer(FAKE_SYSCTL_BSD_MODE, enable ? 1 : 0,
133*d4514f0bSApple OSS Distributions 	    &fake_bsd_mode, &fake_bsd_mode_was_set);
134*d4514f0bSApple OSS Distributions }
135*d4514f0bSApple OSS Distributions 
136*d4514f0bSApple OSS Distributions static void
fake_restore_bsd_mode(void)137*d4514f0bSApple OSS Distributions fake_restore_bsd_mode(void)
138*d4514f0bSApple OSS Distributions {
139*d4514f0bSApple OSS Distributions 	sysctl_restore_integer(FAKE_SYSCTL_BSD_MODE,
140*d4514f0bSApple OSS Distributions 	    fake_bsd_mode, fake_bsd_mode_was_set);
141*d4514f0bSApple OSS Distributions }
142*d4514f0bSApple OSS Distributions 
143*d4514f0bSApple OSS Distributions static void
fake_set_vlan_tagging(bool enable)144*d4514f0bSApple OSS Distributions fake_set_vlan_tagging(bool enable)
145*d4514f0bSApple OSS Distributions {
146*d4514f0bSApple OSS Distributions 	sysctl_set_integer(FAKE_SYSCTL_VLAN_TAGGING, enable ? 1 : 0,
147*d4514f0bSApple OSS Distributions 	    &fake_vlan_tagging, &fake_vlan_tagging_was_set);
148*d4514f0bSApple OSS Distributions }
149*d4514f0bSApple OSS Distributions 
150*d4514f0bSApple OSS Distributions static void
fake_restore_vlan_tagging(void)151*d4514f0bSApple OSS Distributions fake_restore_vlan_tagging(void)
152*d4514f0bSApple OSS Distributions {
153*d4514f0bSApple OSS Distributions 	sysctl_restore_integer(FAKE_SYSCTL_VLAN_TAGGING, fake_vlan_tagging,
154*d4514f0bSApple OSS Distributions 	    fake_vlan_tagging_was_set);
155*d4514f0bSApple OSS Distributions }
156*d4514f0bSApple OSS Distributions 
157*d4514f0bSApple OSS Distributions static void
cleanup_common(void)158*d4514f0bSApple OSS Distributions cleanup_common(void)
159*d4514f0bSApple OSS Distributions {
160*d4514f0bSApple OSS Distributions 	if (G_debug) {
161*d4514f0bSApple OSS Distributions 		T_LOG("Sleeping for 5 seconds\n");
162*d4514f0bSApple OSS Distributions 		sleep(5);
163*d4514f0bSApple OSS Distributions 	}
164*d4514f0bSApple OSS Distributions 	fake_restore_bsd_mode();
165*d4514f0bSApple OSS Distributions 	fake_restore_vlan_tagging();
166*d4514f0bSApple OSS Distributions 	network_interface_destroy(&S_bond_pair.one);
167*d4514f0bSApple OSS Distributions 	network_interface_destroy(&S_bond_pair.two);
168*d4514f0bSApple OSS Distributions 	network_interface_pair_list_destroy(S_feth_pairs);
169*d4514f0bSApple OSS Distributions 	network_interface_pair_list_destroy(S_vlan_pairs);
170*d4514f0bSApple OSS Distributions 	return;
171*d4514f0bSApple OSS Distributions }
172*d4514f0bSApple OSS Distributions 
173*d4514f0bSApple OSS Distributions static void
cleanup(void)174*d4514f0bSApple OSS Distributions cleanup(void)
175*d4514f0bSApple OSS Distributions {
176*d4514f0bSApple OSS Distributions 	cleanup_common();
177*d4514f0bSApple OSS Distributions 	return;
178*d4514f0bSApple OSS Distributions }
179*d4514f0bSApple OSS Distributions 
180*d4514f0bSApple OSS Distributions static void
sigint_handler(__unused int sig)181*d4514f0bSApple OSS Distributions sigint_handler(__unused int sig)
182*d4514f0bSApple OSS Distributions {
183*d4514f0bSApple OSS Distributions 	cleanup_common();
184*d4514f0bSApple OSS Distributions 	signal(SIGINT, SIG_DFL);
185*d4514f0bSApple OSS Distributions }
186*d4514f0bSApple OSS Distributions 
187*d4514f0bSApple OSS Distributions static void
test_traffic_for_pair(network_interface_pair_t pair,uint8_t af)188*d4514f0bSApple OSS Distributions test_traffic_for_pair(network_interface_pair_t pair, uint8_t af)
189*d4514f0bSApple OSS Distributions {
190*d4514f0bSApple OSS Distributions 	inet_address    server;
191*d4514f0bSApple OSS Distributions 
192*d4514f0bSApple OSS Distributions 	T_LOG("Testing %s -> %s\n",
193*d4514f0bSApple OSS Distributions 	    pair->one.if_name, pair->two.if_name);
194*d4514f0bSApple OSS Distributions 	if (af == AF_INET) {
195*d4514f0bSApple OSS Distributions 		server.v4 = pair->one.ip;
196*d4514f0bSApple OSS Distributions 	} else {
197*d4514f0bSApple OSS Distributions 		server.v6 = pair->one.ip6;
198*d4514f0bSApple OSS Distributions 	}
199*d4514f0bSApple OSS Distributions 	inet_test_traffic(af, &server, pair->one.if_name, pair->one.if_index,
200*d4514f0bSApple OSS Distributions 	    pair->two.if_name, pair->two.if_index);
201*d4514f0bSApple OSS Distributions }
202*d4514f0bSApple OSS Distributions 
203*d4514f0bSApple OSS Distributions static void
test_traffic_for_af(uint8_t af)204*d4514f0bSApple OSS Distributions test_traffic_for_af(uint8_t af)
205*d4514f0bSApple OSS Distributions {
206*d4514f0bSApple OSS Distributions 	test_traffic_for_pair(&S_bond_pair, af);
207*d4514f0bSApple OSS Distributions 
208*d4514f0bSApple OSS Distributions 	for (u_int i = 0; i < S_vlan_pairs->count; i++) {
209*d4514f0bSApple OSS Distributions 		network_interface_pair_t        pair;
210*d4514f0bSApple OSS Distributions 
211*d4514f0bSApple OSS Distributions 		pair = &S_vlan_pairs->list[i];
212*d4514f0bSApple OSS Distributions 		test_traffic_for_pair(pair, af);
213*d4514f0bSApple OSS Distributions 	}
214*d4514f0bSApple OSS Distributions }
215*d4514f0bSApple OSS Distributions 
216*d4514f0bSApple OSS Distributions static void
network_interface_init(network_interface_t netif,const char * name,unsigned int unit,unsigned int address_index)217*d4514f0bSApple OSS Distributions network_interface_init(network_interface_t netif,
218*d4514f0bSApple OSS Distributions     const char * name, unsigned int unit,
219*d4514f0bSApple OSS Distributions     unsigned int address_index)
220*d4514f0bSApple OSS Distributions {
221*d4514f0bSApple OSS Distributions 	network_interface_create(netif, name);
222*d4514f0bSApple OSS Distributions 	get_ipv4_address(unit, address_index, &netif->ip);
223*d4514f0bSApple OSS Distributions 	ifnet_add_ip_address(netif->if_name, netif->ip,
224*d4514f0bSApple OSS Distributions 	    inet_class_c_subnet_mask);
225*d4514f0bSApple OSS Distributions 	route_add_inet_scoped_subnet(netif->if_name, netif->if_index,
226*d4514f0bSApple OSS Distributions 	    netif->ip, inet_class_c_subnet_mask);
227*d4514f0bSApple OSS Distributions }
228*d4514f0bSApple OSS Distributions 
229*d4514f0bSApple OSS Distributions 
230*d4514f0bSApple OSS Distributions #define BOND100_NAME    BOND_NAME "100"
231*d4514f0bSApple OSS Distributions #define BOND101_NAME    BOND_NAME "101"
232*d4514f0bSApple OSS Distributions 
233*d4514f0bSApple OSS Distributions static void
bond_add_member(if_name_t bond,if_name_t member)234*d4514f0bSApple OSS Distributions bond_add_member(if_name_t bond, if_name_t member)
235*d4514f0bSApple OSS Distributions {
236*d4514f0bSApple OSS Distributions 	struct ifreq            ifr;
237*d4514f0bSApple OSS Distributions 	struct if_bond_req      ibr;
238*d4514f0bSApple OSS Distributions 	int                     result;
239*d4514f0bSApple OSS Distributions 	int                     s = inet_dgram_socket_get();
240*d4514f0bSApple OSS Distributions 
241*d4514f0bSApple OSS Distributions 	bzero(&ibr, sizeof(ibr));
242*d4514f0bSApple OSS Distributions 	ibr.ibr_op = IF_BOND_OP_ADD_INTERFACE;
243*d4514f0bSApple OSS Distributions 	strlcpy(ibr.ibr_ibru.ibru_if_name, member,
244*d4514f0bSApple OSS Distributions 	    sizeof(ibr.ibr_ibru.ibru_if_name));
245*d4514f0bSApple OSS Distributions 
246*d4514f0bSApple OSS Distributions 	bzero(&ifr, sizeof(ifr));
247*d4514f0bSApple OSS Distributions 	strlcpy(ifr.ifr_name, bond, sizeof(ifr.ifr_name));
248*d4514f0bSApple OSS Distributions 	ifr.ifr_data = (caddr_t)&ibr;
249*d4514f0bSApple OSS Distributions 	result = ioctl(s, SIOCSIFBOND, &ifr);
250*d4514f0bSApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(result, "SIOCSIFBOND(%s) %s",
251*d4514f0bSApple OSS Distributions 	    bond, member);
252*d4514f0bSApple OSS Distributions }
253*d4514f0bSApple OSS Distributions 
254*d4514f0bSApple OSS Distributions 
255*d4514f0bSApple OSS Distributions static void
initialize_bond_pair(u_int n)256*d4514f0bSApple OSS Distributions initialize_bond_pair(u_int n)
257*d4514f0bSApple OSS Distributions {
258*d4514f0bSApple OSS Distributions 	network_interface_t             one;
259*d4514f0bSApple OSS Distributions 	network_interface_t             two;
260*d4514f0bSApple OSS Distributions 	network_interface_pair_t        scan;
261*d4514f0bSApple OSS Distributions 
262*d4514f0bSApple OSS Distributions 	one = &S_bond_pair.one;
263*d4514f0bSApple OSS Distributions 	network_interface_init(one, BOND100_NAME, 0, 1);
264*d4514f0bSApple OSS Distributions 
265*d4514f0bSApple OSS Distributions 	two = &S_bond_pair.two;
266*d4514f0bSApple OSS Distributions 	network_interface_init(two, BOND101_NAME, 0, 2);
267*d4514f0bSApple OSS Distributions 
268*d4514f0bSApple OSS Distributions 	S_feth_pairs = network_interface_pair_list_alloc(n);
269*d4514f0bSApple OSS Distributions 	scan = S_feth_pairs->list;
270*d4514f0bSApple OSS Distributions 	for (size_t i = 0; i < n; i++, scan++) {
271*d4514f0bSApple OSS Distributions 		network_interface_create(&scan->one, FETH_NAME);
272*d4514f0bSApple OSS Distributions 		bond_add_member(one->if_name, scan->one.if_name);
273*d4514f0bSApple OSS Distributions 
274*d4514f0bSApple OSS Distributions 		network_interface_create(&scan->two, FETH_NAME);
275*d4514f0bSApple OSS Distributions 		fake_set_peer(scan->one.if_name, scan->two.if_name);
276*d4514f0bSApple OSS Distributions 		bond_add_member(two->if_name, scan->two.if_name);
277*d4514f0bSApple OSS Distributions 	}
278*d4514f0bSApple OSS Distributions }
279*d4514f0bSApple OSS Distributions 
280*d4514f0bSApple OSS Distributions 
281*d4514f0bSApple OSS Distributions static void
vlan_interface_init(network_interface_t netif,const if_name_t phys,const char * name,uint16_t unit,unsigned int address_index)282*d4514f0bSApple OSS Distributions vlan_interface_init(network_interface_t netif, const if_name_t phys,
283*d4514f0bSApple OSS Distributions     const char * name, uint16_t unit,
284*d4514f0bSApple OSS Distributions     unsigned int address_index)
285*d4514f0bSApple OSS Distributions {
286*d4514f0bSApple OSS Distributions 	network_interface_init(netif, name, unit, address_index);
287*d4514f0bSApple OSS Distributions 	siocsifvlan(netif->if_name, phys, unit);
288*d4514f0bSApple OSS Distributions }
289*d4514f0bSApple OSS Distributions 
290*d4514f0bSApple OSS Distributions static void
initialize_vlan_pairs(u_int n)291*d4514f0bSApple OSS Distributions initialize_vlan_pairs(u_int n)
292*d4514f0bSApple OSS Distributions {
293*d4514f0bSApple OSS Distributions 	network_interface_pair_t        scan;
294*d4514f0bSApple OSS Distributions 	int                             vlan_unit = VLAN_UNIT_START;
295*d4514f0bSApple OSS Distributions 
296*d4514f0bSApple OSS Distributions 	S_vlan_pairs = network_interface_pair_list_alloc(n);
297*d4514f0bSApple OSS Distributions 	scan = S_vlan_pairs->list;
298*d4514f0bSApple OSS Distributions 	for (size_t i = 0; i < n; i++, scan++) {
299*d4514f0bSApple OSS Distributions 		if_name_t       name;
300*d4514f0bSApple OSS Distributions 		uint16_t        tag = (uint16_t)(i + 1);
301*d4514f0bSApple OSS Distributions 
302*d4514f0bSApple OSS Distributions 		snprintf(name, sizeof(name), "%s%d", VLAN_NAME, vlan_unit++);
303*d4514f0bSApple OSS Distributions 		vlan_interface_init(&scan->one, S_bond_pair.one.if_name,
304*d4514f0bSApple OSS Distributions 		    name, tag, 1);
305*d4514f0bSApple OSS Distributions 		snprintf(name, sizeof(name), "%s%d", VLAN_NAME, vlan_unit++);
306*d4514f0bSApple OSS Distributions 		vlan_interface_init(&scan->two, S_bond_pair.two.if_name,
307*d4514f0bSApple OSS Distributions 		    name, tag, 2);
308*d4514f0bSApple OSS Distributions 	}
309*d4514f0bSApple OSS Distributions }
310*d4514f0bSApple OSS Distributions 
311*d4514f0bSApple OSS Distributions static void
bond_test_traffic(bool hw_vlan)312*d4514f0bSApple OSS Distributions bond_test_traffic(bool hw_vlan)
313*d4514f0bSApple OSS Distributions {
314*d4514f0bSApple OSS Distributions #if !TARGET_OS_OSX
315*d4514f0bSApple OSS Distributions 	T_SKIP("bond is only available on macOS");
316*d4514f0bSApple OSS Distributions #else /* TARGET_OS_OSX */
317*d4514f0bSApple OSS Distributions 	signal(SIGINT, sigint_handler);
318*d4514f0bSApple OSS Distributions 	T_ATEND(cleanup);
319*d4514f0bSApple OSS Distributions 	T_LOG("Bond test %s\n",
320*d4514f0bSApple OSS Distributions 	    hw_vlan ? "hardware tagging" : "software tagging");
321*d4514f0bSApple OSS Distributions 	fake_set_bsd_mode(true);
322*d4514f0bSApple OSS Distributions 	fake_set_vlan_tagging(hw_vlan);
323*d4514f0bSApple OSS Distributions 	initialize_bond_pair(4);
324*d4514f0bSApple OSS Distributions 	initialize_vlan_pairs(5);
325*d4514f0bSApple OSS Distributions 	test_traffic_for_af(AF_INET6);
326*d4514f0bSApple OSS Distributions 	test_traffic_for_af(AF_INET);
327*d4514f0bSApple OSS Distributions 	if (G_debug) {
328*d4514f0bSApple OSS Distributions 		T_LOG("Sleeping for 5 seconds\n");
329*d4514f0bSApple OSS Distributions 		sleep(5);
330*d4514f0bSApple OSS Distributions 	}
331*d4514f0bSApple OSS Distributions #endif /* TARGET_OS_OSX */
332*d4514f0bSApple OSS Distributions }
333*d4514f0bSApple OSS Distributions 
334*d4514f0bSApple OSS Distributions T_DECL(net_if_bond_test_software_tagging,
335*d4514f0bSApple OSS Distributions     "bond test traffic software tagging",
336*d4514f0bSApple OSS Distributions     T_META_ASROOT(true))
337*d4514f0bSApple OSS Distributions {
338*d4514f0bSApple OSS Distributions 	bond_test_traffic(false);
339*d4514f0bSApple OSS Distributions }
340*d4514f0bSApple OSS Distributions 
341*d4514f0bSApple OSS Distributions T_DECL(net_if_bond_test_hardware_tagging,
342*d4514f0bSApple OSS Distributions     "bond test hardware tagging",
343*d4514f0bSApple OSS Distributions     T_META_ASROOT(true))
344*d4514f0bSApple OSS Distributions {
345*d4514f0bSApple OSS Distributions 	bond_test_traffic(true);
346*d4514f0bSApple OSS Distributions }
347