xref: /xnu-12377.41.6/tests/aqm_qdelay_utun.c (revision bbb1b6f9e71b8cdde6e5cd6f4841f207dee3d828)
1*bbb1b6f9SApple OSS Distributions /*
2*bbb1b6f9SApple OSS Distributions  * Copyright (c) 2021 Apple Inc. All rights reserved.
3*bbb1b6f9SApple OSS Distributions  */
4*bbb1b6f9SApple OSS Distributions 
5*bbb1b6f9SApple OSS Distributions #include <sys/socket.h>
6*bbb1b6f9SApple OSS Distributions #include <sys/sockio.h>
7*bbb1b6f9SApple OSS Distributions #include <sys/ioctl.h>
8*bbb1b6f9SApple OSS Distributions #include <sys/kern_control.h>
9*bbb1b6f9SApple OSS Distributions #include <sys/sys_domain.h>
10*bbb1b6f9SApple OSS Distributions 
11*bbb1b6f9SApple OSS Distributions #include <net/if.h>
12*bbb1b6f9SApple OSS Distributions #include <net/if_utun.h>
13*bbb1b6f9SApple OSS Distributions #include <netinet/in.h>
14*bbb1b6f9SApple OSS Distributions #include <netinet/in_var.h>
15*bbb1b6f9SApple OSS Distributions #include <netinet/ip6.h>
16*bbb1b6f9SApple OSS Distributions #include <arpa/inet.h>
17*bbb1b6f9SApple OSS Distributions 
18*bbb1b6f9SApple OSS Distributions #include <err.h>
19*bbb1b6f9SApple OSS Distributions #include <errno.h>
20*bbb1b6f9SApple OSS Distributions #include <stdbool.h>
21*bbb1b6f9SApple OSS Distributions #include <stdint.h>
22*bbb1b6f9SApple OSS Distributions #include <stdio.h>
23*bbb1b6f9SApple OSS Distributions #include <stdlib.h>
24*bbb1b6f9SApple OSS Distributions #include <string.h>
25*bbb1b6f9SApple OSS Distributions #include <unistd.h>
26*bbb1b6f9SApple OSS Distributions 
27*bbb1b6f9SApple OSS Distributions #include <net/pktsched/pktsched.h>
28*bbb1b6f9SApple OSS Distributions #include <net/classq/if_classq.h>
29*bbb1b6f9SApple OSS Distributions 
30*bbb1b6f9SApple OSS Distributions #include <darwintest.h>
31*bbb1b6f9SApple OSS Distributions #include <darwintest_utils.h>
32*bbb1b6f9SApple OSS Distributions 
33*bbb1b6f9SApple OSS Distributions static void
nsec_to_str(unsigned long long nsec,char * buf)34*bbb1b6f9SApple OSS Distributions nsec_to_str(unsigned long long nsec, char *buf)
35*bbb1b6f9SApple OSS Distributions {
36*bbb1b6f9SApple OSS Distributions 	const char *u;
37*bbb1b6f9SApple OSS Distributions 	long double n = nsec, t;
38*bbb1b6f9SApple OSS Distributions 
39*bbb1b6f9SApple OSS Distributions 	if (nsec >= NSEC_PER_SEC) {
40*bbb1b6f9SApple OSS Distributions 		t = n / NSEC_PER_SEC;
41*bbb1b6f9SApple OSS Distributions 		u = "sec ";
42*bbb1b6f9SApple OSS Distributions 	} else if (n >= USEC_PER_SEC) {
43*bbb1b6f9SApple OSS Distributions 		t = n / USEC_PER_SEC;
44*bbb1b6f9SApple OSS Distributions 		u = "msec";
45*bbb1b6f9SApple OSS Distributions 	} else if (n >= MSEC_PER_SEC) {
46*bbb1b6f9SApple OSS Distributions 		t = n / MSEC_PER_SEC;
47*bbb1b6f9SApple OSS Distributions 		u = "usec";
48*bbb1b6f9SApple OSS Distributions 	} else {
49*bbb1b6f9SApple OSS Distributions 		t = n;
50*bbb1b6f9SApple OSS Distributions 		u = "nsec";
51*bbb1b6f9SApple OSS Distributions 	}
52*bbb1b6f9SApple OSS Distributions 
53*bbb1b6f9SApple OSS Distributions 	snprintf(buf, 32, "%-5.2Lf %4s", t, u);
54*bbb1b6f9SApple OSS Distributions }
55*bbb1b6f9SApple OSS Distributions 
56*bbb1b6f9SApple OSS Distributions static int
create_tun()57*bbb1b6f9SApple OSS Distributions create_tun()
58*bbb1b6f9SApple OSS Distributions {
59*bbb1b6f9SApple OSS Distributions 	int tun_fd;
60*bbb1b6f9SApple OSS Distributions 	struct ctl_info kernctl_info;
61*bbb1b6f9SApple OSS Distributions 	struct sockaddr_ctl kernctl_addr;
62*bbb1b6f9SApple OSS Distributions 
63*bbb1b6f9SApple OSS Distributions 	T_QUIET; T_ASSERT_POSIX_SUCCESS(tun_fd = socket(PF_SYSTEM, SOCK_DGRAM, SYSPROTO_CONTROL), NULL);
64*bbb1b6f9SApple OSS Distributions 
65*bbb1b6f9SApple OSS Distributions 	memset(&kernctl_info, 0, sizeof(kernctl_info));
66*bbb1b6f9SApple OSS Distributions 	strlcpy(kernctl_info.ctl_name, UTUN_CONTROL_NAME, sizeof(kernctl_info.ctl_name));
67*bbb1b6f9SApple OSS Distributions 	T_QUIET; T_ASSERT_POSIX_SUCCESS(ioctl(tun_fd, CTLIOCGINFO, &kernctl_info), NULL);
68*bbb1b6f9SApple OSS Distributions 
69*bbb1b6f9SApple OSS Distributions 	memset(&kernctl_addr, 0, sizeof(kernctl_addr));
70*bbb1b6f9SApple OSS Distributions 	kernctl_addr.sc_len = sizeof(kernctl_addr);
71*bbb1b6f9SApple OSS Distributions 	kernctl_addr.sc_family = AF_SYSTEM;
72*bbb1b6f9SApple OSS Distributions 	kernctl_addr.ss_sysaddr = AF_SYS_CONTROL;
73*bbb1b6f9SApple OSS Distributions 	kernctl_addr.sc_id = kernctl_info.ctl_id;
74*bbb1b6f9SApple OSS Distributions 	kernctl_addr.sc_unit = 0;
75*bbb1b6f9SApple OSS Distributions 
76*bbb1b6f9SApple OSS Distributions 	T_QUIET; T_ASSERT_POSIX_SUCCESS(bind(tun_fd, (struct sockaddr *)&kernctl_addr, sizeof(kernctl_addr)), NULL);
77*bbb1b6f9SApple OSS Distributions 
78*bbb1b6f9SApple OSS Distributions 	const int enable = 1;
79*bbb1b6f9SApple OSS Distributions 	T_QUIET; T_ASSERT_POSIX_SUCCESS(setsockopt(tun_fd, SYSPROTO_CONTROL, UTUN_OPT_ENABLE_NETIF,
80*bbb1b6f9SApple OSS Distributions 	    &enable, sizeof(enable)), NULL);
81*bbb1b6f9SApple OSS Distributions 
82*bbb1b6f9SApple OSS Distributions 	T_QUIET; T_ASSERT_POSIX_FAILURE(setsockopt(tun_fd, SYSPROTO_CONTROL, UTUN_OPT_ENABLE_FLOWSWITCH,
83*bbb1b6f9SApple OSS Distributions 	    &enable, sizeof(enable)), EINVAL, NULL);
84*bbb1b6f9SApple OSS Distributions 
85*bbb1b6f9SApple OSS Distributions 	T_QUIET; T_ASSERT_POSIX_SUCCESS(connect(tun_fd, (struct sockaddr *)&kernctl_addr, sizeof(kernctl_addr)), NULL);;
86*bbb1b6f9SApple OSS Distributions 
87*bbb1b6f9SApple OSS Distributions 	return tun_fd;
88*bbb1b6f9SApple OSS Distributions }
89*bbb1b6f9SApple OSS Distributions 
90*bbb1b6f9SApple OSS Distributions static short
ifnet_get_flags(int s,const char ifname[IFNAMSIZ])91*bbb1b6f9SApple OSS Distributions ifnet_get_flags(int s, const char ifname[IFNAMSIZ])
92*bbb1b6f9SApple OSS Distributions {
93*bbb1b6f9SApple OSS Distributions 	struct ifreq    ifr;
94*bbb1b6f9SApple OSS Distributions 	memset(&ifr, 0, sizeof(ifr));
95*bbb1b6f9SApple OSS Distributions 	strlcpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
96*bbb1b6f9SApple OSS Distributions 	T_QUIET; T_WITH_ERRNO; T_EXPECT_POSIX_ZERO(ioctl(s, SIOCGIFFLAGS, (caddr_t)&ifr), NULL);
97*bbb1b6f9SApple OSS Distributions 	return ifr.ifr_flags;
98*bbb1b6f9SApple OSS Distributions }
99*bbb1b6f9SApple OSS Distributions 
100*bbb1b6f9SApple OSS Distributions static void
ifnet_add_addr4(const char ifname[IFNAMSIZ],struct in_addr * addr,struct in_addr * mask,struct in_addr * broadaddr)101*bbb1b6f9SApple OSS Distributions ifnet_add_addr4(const char ifname[IFNAMSIZ], struct in_addr *addr, struct in_addr *mask, struct in_addr *broadaddr)
102*bbb1b6f9SApple OSS Distributions {
103*bbb1b6f9SApple OSS Distributions 	struct sockaddr_in *sin;
104*bbb1b6f9SApple OSS Distributions 	struct in_aliasreq ifra;
105*bbb1b6f9SApple OSS Distributions 	int s;
106*bbb1b6f9SApple OSS Distributions 
107*bbb1b6f9SApple OSS Distributions 	T_QUIET; T_EXPECT_POSIX_SUCCESS(s = socket(AF_INET, SOCK_DGRAM, 0), NULL);
108*bbb1b6f9SApple OSS Distributions 
109*bbb1b6f9SApple OSS Distributions 	memset(&ifra, 0, sizeof(ifra));
110*bbb1b6f9SApple OSS Distributions 	strlcpy(ifra.ifra_name, ifname, sizeof(ifra.ifra_name));
111*bbb1b6f9SApple OSS Distributions 
112*bbb1b6f9SApple OSS Distributions 	if (addr != NULL) {
113*bbb1b6f9SApple OSS Distributions 		sin = &ifra.ifra_addr;
114*bbb1b6f9SApple OSS Distributions 		sin->sin_len = sizeof(*sin);
115*bbb1b6f9SApple OSS Distributions 		sin->sin_family = AF_INET;
116*bbb1b6f9SApple OSS Distributions 		sin->sin_addr = *addr;
117*bbb1b6f9SApple OSS Distributions 	}
118*bbb1b6f9SApple OSS Distributions 
119*bbb1b6f9SApple OSS Distributions 	if (mask != NULL) {
120*bbb1b6f9SApple OSS Distributions 		sin = &ifra.ifra_mask;
121*bbb1b6f9SApple OSS Distributions 		sin->sin_len = sizeof(*sin);
122*bbb1b6f9SApple OSS Distributions 		sin->sin_family = AF_INET;
123*bbb1b6f9SApple OSS Distributions 		sin->sin_addr = *mask;
124*bbb1b6f9SApple OSS Distributions 	}
125*bbb1b6f9SApple OSS Distributions 
126*bbb1b6f9SApple OSS Distributions 	if (broadaddr != NULL || (addr != NULL &&
127*bbb1b6f9SApple OSS Distributions 	    (ifnet_get_flags(s, ifname) & IFF_POINTOPOINT) != 0)) {
128*bbb1b6f9SApple OSS Distributions 		sin = &ifra.ifra_broadaddr;
129*bbb1b6f9SApple OSS Distributions 		sin->sin_len = sizeof(*sin);
130*bbb1b6f9SApple OSS Distributions 		sin->sin_family = AF_INET;
131*bbb1b6f9SApple OSS Distributions 		sin->sin_addr = (broadaddr != NULL) ? *broadaddr : *addr;
132*bbb1b6f9SApple OSS Distributions 	}
133*bbb1b6f9SApple OSS Distributions 
134*bbb1b6f9SApple OSS Distributions 	T_QUIET; T_WITH_ERRNO; T_EXPECT_POSIX_ZERO(ioctl(s, SIOCAIFADDR, &ifra), NULL);
135*bbb1b6f9SApple OSS Distributions 
136*bbb1b6f9SApple OSS Distributions 	T_QUIET; T_WITH_ERRNO; T_EXPECT_POSIX_ZERO(close(s), NULL);
137*bbb1b6f9SApple OSS Distributions }
138*bbb1b6f9SApple OSS Distributions 
139*bbb1b6f9SApple OSS Distributions static struct if_qstatsreq ifqr;
140*bbb1b6f9SApple OSS Distributions static struct if_ifclassq_stats *ifcqs;
141*bbb1b6f9SApple OSS Distributions static uint32_t scheduler;
142*bbb1b6f9SApple OSS Distributions 
143*bbb1b6f9SApple OSS Distributions #define FQ_IF_BE_INDEX  7
144*bbb1b6f9SApple OSS Distributions static int
aqmstats_setup(char * iface)145*bbb1b6f9SApple OSS Distributions aqmstats_setup(char *iface)
146*bbb1b6f9SApple OSS Distributions {
147*bbb1b6f9SApple OSS Distributions 	unsigned int ifindex;
148*bbb1b6f9SApple OSS Distributions 	int s;
149*bbb1b6f9SApple OSS Distributions 
150*bbb1b6f9SApple OSS Distributions 	ifindex = if_nametoindex(iface);
151*bbb1b6f9SApple OSS Distributions 	T_QUIET; T_ASSERT_TRUE(ifindex != 0, "interface index for utun");
152*bbb1b6f9SApple OSS Distributions 
153*bbb1b6f9SApple OSS Distributions 	ifcqs = malloc(sizeof(*ifcqs));
154*bbb1b6f9SApple OSS Distributions 	T_ASSERT_TRUE(ifcqs != 0, "Allocated ifcqs");
155*bbb1b6f9SApple OSS Distributions 
156*bbb1b6f9SApple OSS Distributions 	T_QUIET; T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET, SOCK_DGRAM, 0), NULL);
157*bbb1b6f9SApple OSS Distributions 
158*bbb1b6f9SApple OSS Distributions 	bzero(&ifqr, sizeof(ifqr));
159*bbb1b6f9SApple OSS Distributions 	strlcpy(ifqr.ifqr_name, iface, sizeof(ifqr.ifqr_name));
160*bbb1b6f9SApple OSS Distributions 	ifqr.ifqr_buf = ifcqs;
161*bbb1b6f9SApple OSS Distributions 	ifqr.ifqr_len = sizeof(*ifcqs);
162*bbb1b6f9SApple OSS Distributions 
163*bbb1b6f9SApple OSS Distributions 	// Get the scheduler
164*bbb1b6f9SApple OSS Distributions 	ifqr.ifqr_slot = 0;
165*bbb1b6f9SApple OSS Distributions 	T_QUIET; T_ASSERT_POSIX_SUCCESS(ioctl(s, SIOCGIFQUEUESTATS, (char *)&ifqr), NULL);
166*bbb1b6f9SApple OSS Distributions 	scheduler = ifcqs->ifqs_scheduler;
167*bbb1b6f9SApple OSS Distributions 
168*bbb1b6f9SApple OSS Distributions 	// Update the slot to BE
169*bbb1b6f9SApple OSS Distributions 	ifqr.ifqr_slot = FQ_IF_BE_INDEX;
170*bbb1b6f9SApple OSS Distributions 
171*bbb1b6f9SApple OSS Distributions 	return s;
172*bbb1b6f9SApple OSS Distributions }
173*bbb1b6f9SApple OSS Distributions 
174*bbb1b6f9SApple OSS Distributions static void
aqmstats_cleanup()175*bbb1b6f9SApple OSS Distributions aqmstats_cleanup()
176*bbb1b6f9SApple OSS Distributions {
177*bbb1b6f9SApple OSS Distributions 	free(ifcqs);
178*bbb1b6f9SApple OSS Distributions }
179*bbb1b6f9SApple OSS Distributions 
180*bbb1b6f9SApple OSS Distributions T_DECL(aqm_qdelay, "This test checks the min/max/avg AQM queuing delay", T_META_TAG_VM_PREFERRED)
181*bbb1b6f9SApple OSS Distributions {
182*bbb1b6f9SApple OSS Distributions 	T_SETUPBEGIN;
183*bbb1b6f9SApple OSS Distributions 
184*bbb1b6f9SApple OSS Distributions 	// Create tun device with IPv4 address
185*bbb1b6f9SApple OSS Distributions 	int tun_fd = create_tun();
186*bbb1b6f9SApple OSS Distributions 
187*bbb1b6f9SApple OSS Distributions 	char ifname[IFXNAMSIZ];
188*bbb1b6f9SApple OSS Distributions 	socklen_t optlen = IFNAMSIZ;
189*bbb1b6f9SApple OSS Distributions 	T_QUIET; T_ASSERT_POSIX_SUCCESS(getsockopt(tun_fd, SYSPROTO_CONTROL, UTUN_OPT_IFNAME, ifname, &optlen), NULL);
190*bbb1b6f9SApple OSS Distributions 	T_ASSERT_TRUE(ifname[optlen - 1] == '\0', NULL);
191*bbb1b6f9SApple OSS Distributions 	T_LOG("Created interface %s", ifname);
192*bbb1b6f9SApple OSS Distributions 
193*bbb1b6f9SApple OSS Distributions 	uint32_t ifaddr = (10 << 24) | ((unsigned)getpid() & 0xffff) << 8 | 160;
194*bbb1b6f9SApple OSS Distributions 	struct in_addr tun_addr1, tun_addr2, mask;
195*bbb1b6f9SApple OSS Distributions 	tun_addr1.s_addr = htonl(ifaddr);
196*bbb1b6f9SApple OSS Distributions 	tun_addr2.s_addr = htonl(ifaddr + 1);
197*bbb1b6f9SApple OSS Distributions 	mask.s_addr = htonl(0xffffffff);
198*bbb1b6f9SApple OSS Distributions 
199*bbb1b6f9SApple OSS Distributions 	ifnet_add_addr4(ifname, &tun_addr1, &mask, &tun_addr2);
200*bbb1b6f9SApple OSS Distributions 
201*bbb1b6f9SApple OSS Distributions 	// Create UDP socket to send
202*bbb1b6f9SApple OSS Distributions 	int sock_fd;
203*bbb1b6f9SApple OSS Distributions 	T_QUIET; T_ASSERT_POSIX_SUCCESS(sock_fd = socket(AF_INET, SOCK_DGRAM, 0), NULL);
204*bbb1b6f9SApple OSS Distributions 	struct sockaddr_in sin;
205*bbb1b6f9SApple OSS Distributions 	memset(&sin, 0, sizeof(sin));
206*bbb1b6f9SApple OSS Distributions 	sin.sin_len = sizeof(sin);
207*bbb1b6f9SApple OSS Distributions 	sin.sin_family = AF_INET;
208*bbb1b6f9SApple OSS Distributions 	sin.sin_addr = tun_addr1;
209*bbb1b6f9SApple OSS Distributions 
210*bbb1b6f9SApple OSS Distributions 	T_QUIET; T_ASSERT_POSIX_SUCCESS(bind(sock_fd, (struct sockaddr *)&sin, sizeof(sin)), NULL);
211*bbb1b6f9SApple OSS Distributions 
212*bbb1b6f9SApple OSS Distributions 	struct sockaddr_in dest;
213*bbb1b6f9SApple OSS Distributions 	memset(&sin, 0, sizeof(dest));
214*bbb1b6f9SApple OSS Distributions 	dest.sin_len = sizeof(dest);
215*bbb1b6f9SApple OSS Distributions 	dest.sin_family = AF_INET;
216*bbb1b6f9SApple OSS Distributions 	dest.sin_addr = tun_addr2;
217*bbb1b6f9SApple OSS Distributions 	dest.sin_port = ntohs(12345);
218*bbb1b6f9SApple OSS Distributions 
219*bbb1b6f9SApple OSS Distributions 	// Setup the state for AQM stats
220*bbb1b6f9SApple OSS Distributions 	int stats_fd = aqmstats_setup(ifname);
221*bbb1b6f9SApple OSS Distributions 
222*bbb1b6f9SApple OSS Distributions 	T_SETUPEND;
223*bbb1b6f9SApple OSS Distributions 
224*bbb1b6f9SApple OSS Distributions 	char min[32], max[32], avg[32];
225*bbb1b6f9SApple OSS Distributions 	// Get the current value of min/max/avg qdelay
226*bbb1b6f9SApple OSS Distributions 	if (scheduler == PKTSCHEDT_FQ_CODEL) {
227*bbb1b6f9SApple OSS Distributions 		T_QUIET; T_ASSERT_POSIX_SUCCESS(ioctl(stats_fd, SIOCGIFQUEUESTATS, (char *)&ifqr), NULL);
228*bbb1b6f9SApple OSS Distributions 		nsec_to_str(ifcqs->ifqs_fq_codel_stats.fcls_min_qdelay, min);
229*bbb1b6f9SApple OSS Distributions 		nsec_to_str(ifcqs->ifqs_fq_codel_stats.fcls_max_qdelay, max);
230*bbb1b6f9SApple OSS Distributions 		nsec_to_str(ifcqs->ifqs_fq_codel_stats.fcls_avg_qdelay, avg);
231*bbb1b6f9SApple OSS Distributions 
232*bbb1b6f9SApple OSS Distributions 		T_LOG("min/max/avg qdelay %10s    %10s    %10s", min, max, avg);
233*bbb1b6f9SApple OSS Distributions 	}
234*bbb1b6f9SApple OSS Distributions 
235*bbb1b6f9SApple OSS Distributions 	// Send data
236*bbb1b6f9SApple OSS Distributions 	T_LOG("Sending 10 UDP packets...");
237*bbb1b6f9SApple OSS Distributions 	uint8_t content[0x578] = {0};
238*bbb1b6f9SApple OSS Distributions 	for (int i = 0; i < 5; i++) {
239*bbb1b6f9SApple OSS Distributions 		sendto(sock_fd, content, sizeof(content), 0, (struct sockaddr *)&dest,
240*bbb1b6f9SApple OSS Distributions 		    (socklen_t) sizeof(dest));
241*bbb1b6f9SApple OSS Distributions 		usleep(1000);
242*bbb1b6f9SApple OSS Distributions 	}
243*bbb1b6f9SApple OSS Distributions 
244*bbb1b6f9SApple OSS Distributions 	// Get the current value of min/max/avg qdelay
245*bbb1b6f9SApple OSS Distributions 	if (scheduler == PKTSCHEDT_FQ_CODEL) {
246*bbb1b6f9SApple OSS Distributions 		T_QUIET; T_ASSERT_POSIX_SUCCESS(ioctl(stats_fd, SIOCGIFQUEUESTATS, (char *)&ifqr), NULL);
247*bbb1b6f9SApple OSS Distributions 		nsec_to_str(ifcqs->ifqs_fq_codel_stats.fcls_min_qdelay, min);
248*bbb1b6f9SApple OSS Distributions 		nsec_to_str(ifcqs->ifqs_fq_codel_stats.fcls_max_qdelay, max);
249*bbb1b6f9SApple OSS Distributions 		nsec_to_str(ifcqs->ifqs_fq_codel_stats.fcls_avg_qdelay, avg);
250*bbb1b6f9SApple OSS Distributions 
251*bbb1b6f9SApple OSS Distributions 		T_LOG("min/max/avg qdelay %10s    %10s    %10s", min, max, avg);
252*bbb1b6f9SApple OSS Distributions 		T_ASSERT_TRUE(ifcqs->ifqs_fq_codel_stats.fcls_min_qdelay <= ifcqs->ifqs_fq_codel_stats.fcls_avg_qdelay &&
253*bbb1b6f9SApple OSS Distributions 		    ifcqs->ifqs_fq_codel_stats.fcls_min_qdelay <= ifcqs->ifqs_fq_codel_stats.fcls_max_qdelay, "min qdelay check");
254*bbb1b6f9SApple OSS Distributions 		T_ASSERT_TRUE(ifcqs->ifqs_fq_codel_stats.fcls_avg_qdelay <= ifcqs->ifqs_fq_codel_stats.fcls_max_qdelay, "avg qdelay check");
255*bbb1b6f9SApple OSS Distributions 	}
256*bbb1b6f9SApple OSS Distributions 
257*bbb1b6f9SApple OSS Distributions 	aqmstats_cleanup();
258*bbb1b6f9SApple OSS Distributions 	// Close socket and utun device
259*bbb1b6f9SApple OSS Distributions 	T_QUIET; T_ASSERT_POSIX_SUCCESS(close(sock_fd), NULL);
260*bbb1b6f9SApple OSS Distributions 	T_QUIET; T_ASSERT_POSIX_SUCCESS(close(tun_fd), NULL);
261*bbb1b6f9SApple OSS Distributions }
262