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