1*4f1223e8SApple OSS Distributions /*
2*4f1223e8SApple OSS Distributions * Copyright (c) 2023-2024 Apple Inc. All rights reserved.
3*4f1223e8SApple OSS Distributions *
4*4f1223e8SApple OSS Distributions * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5*4f1223e8SApple OSS Distributions *
6*4f1223e8SApple OSS Distributions * This file contains Original Code and/or Modifications of Original Code
7*4f1223e8SApple OSS Distributions * as defined in and that are subject to the Apple Public Source License
8*4f1223e8SApple OSS Distributions * Version 2.0 (the 'License'). You may not use this file except in
9*4f1223e8SApple OSS Distributions * compliance with the License. The rights granted to you under the License
10*4f1223e8SApple OSS Distributions * may not be used to create, or enable the creation or redistribution of,
11*4f1223e8SApple OSS Distributions * unlawful or unlicensed copies of an Apple operating system, or to
12*4f1223e8SApple OSS Distributions * circumvent, violate, or enable the circumvention or violation of, any
13*4f1223e8SApple OSS Distributions * terms of an Apple operating system software license agreement.
14*4f1223e8SApple OSS Distributions *
15*4f1223e8SApple OSS Distributions * Please obtain a copy of the License at
16*4f1223e8SApple OSS Distributions * http://www.opensource.apple.com/apsl/ and read it before using this file.
17*4f1223e8SApple OSS Distributions *
18*4f1223e8SApple OSS Distributions * The Original Code and all software distributed under the License are
19*4f1223e8SApple OSS Distributions * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20*4f1223e8SApple OSS Distributions * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21*4f1223e8SApple OSS Distributions * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22*4f1223e8SApple OSS Distributions * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23*4f1223e8SApple OSS Distributions * Please see the License for the specific language governing rights and
24*4f1223e8SApple OSS Distributions * limitations under the License.
25*4f1223e8SApple OSS Distributions *
26*4f1223e8SApple OSS Distributions * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27*4f1223e8SApple OSS Distributions */
28*4f1223e8SApple OSS Distributions
29*4f1223e8SApple OSS Distributions #include <darwintest.h>
30*4f1223e8SApple OSS Distributions
31*4f1223e8SApple OSS Distributions #include <sys/ioctl.h>
32*4f1223e8SApple OSS Distributions #include <sys/sysctl.h>
33*4f1223e8SApple OSS Distributions
34*4f1223e8SApple OSS Distributions #include <net/if.h>
35*4f1223e8SApple OSS Distributions #include <net/if_arp.h>
36*4f1223e8SApple OSS Distributions #include <net/if_fake_var.h>
37*4f1223e8SApple OSS Distributions #include <net/bpf.h>
38*4f1223e8SApple OSS Distributions #include <net/ethernet.h>
39*4f1223e8SApple OSS Distributions
40*4f1223e8SApple OSS Distributions #include <netinet/ip.h>
41*4f1223e8SApple OSS Distributions
42*4f1223e8SApple OSS Distributions #include <stdlib.h>
43*4f1223e8SApple OSS Distributions #include <string.h>
44*4f1223e8SApple OSS Distributions #include <strings.h>
45*4f1223e8SApple OSS Distributions
46*4f1223e8SApple OSS Distributions #include "net_test_lib.h"
47*4f1223e8SApple OSS Distributions #include "bpflib.h"
48*4f1223e8SApple OSS Distributions #include "in_cksum.h"
49*4f1223e8SApple OSS Distributions
50*4f1223e8SApple OSS Distributions T_GLOBAL_META(
51*4f1223e8SApple OSS Distributions T_META_NAMESPACE("xnu.net"),
52*4f1223e8SApple OSS Distributions T_META_ASROOT(true),
53*4f1223e8SApple OSS Distributions T_META_RADAR_COMPONENT_NAME("xnu"),
54*4f1223e8SApple OSS Distributions T_META_RADAR_COMPONENT_VERSION("networking"),
55*4f1223e8SApple OSS Distributions T_META_CHECK_LEAKS(false));
56*4f1223e8SApple OSS Distributions
57*4f1223e8SApple OSS Distributions
58*4f1223e8SApple OSS Distributions #define MAXBUF 32
59*4f1223e8SApple OSS Distributions static void
HexDump(void * data,size_t len)60*4f1223e8SApple OSS Distributions HexDump(void *data, size_t len)
61*4f1223e8SApple OSS Distributions {
62*4f1223e8SApple OSS Distributions size_t i, j, k;
63*4f1223e8SApple OSS Distributions unsigned char *ptr = (unsigned char *)data;
64*4f1223e8SApple OSS Distributions unsigned char buf[3 * MAXBUF + 1];
65*4f1223e8SApple OSS Distributions
66*4f1223e8SApple OSS Distributions for (i = 0; i < len; i += MAXBUF) {
67*4f1223e8SApple OSS Distributions for (j = i, k = 0; j < i + MAXBUF && j < len; j++) {
68*4f1223e8SApple OSS Distributions unsigned char msnbl = ptr[j] >> 4;
69*4f1223e8SApple OSS Distributions unsigned char lsnbl = ptr[j] & 0x0f;
70*4f1223e8SApple OSS Distributions
71*4f1223e8SApple OSS Distributions buf[k++] = msnbl < 10 ? msnbl + '0' : msnbl + 'a' - 10;
72*4f1223e8SApple OSS Distributions buf[k++] = lsnbl < 10 ? lsnbl + '0' : lsnbl + 'a' - 10;
73*4f1223e8SApple OSS Distributions if ((j % 2) == 1) {
74*4f1223e8SApple OSS Distributions buf[k++] = ' ';
75*4f1223e8SApple OSS Distributions }
76*4f1223e8SApple OSS Distributions if ((j % MAXBUF) == MAXBUF - 1) {
77*4f1223e8SApple OSS Distributions buf[k++] = ' ';
78*4f1223e8SApple OSS Distributions }
79*4f1223e8SApple OSS Distributions }
80*4f1223e8SApple OSS Distributions buf[k] = 0;
81*4f1223e8SApple OSS Distributions T_LOG("%5zd: %s\n", i, buf);
82*4f1223e8SApple OSS Distributions }
83*4f1223e8SApple OSS Distributions }
84*4f1223e8SApple OSS Distributions
85*4f1223e8SApple OSS Distributions static char ifname1[IF_NAMESIZE];
86*4f1223e8SApple OSS Distributions static char ifname2[IF_NAMESIZE];
87*4f1223e8SApple OSS Distributions static int default_fake_max_mtu = 0;
88*4f1223e8SApple OSS Distributions
89*4f1223e8SApple OSS Distributions static void
cleanup(void)90*4f1223e8SApple OSS Distributions cleanup(void)
91*4f1223e8SApple OSS Distributions {
92*4f1223e8SApple OSS Distributions if (ifname1[0] != '\0') {
93*4f1223e8SApple OSS Distributions (void)ifnet_destroy(ifname1, false);
94*4f1223e8SApple OSS Distributions T_LOG("ifnet_destroy %s", ifname1);
95*4f1223e8SApple OSS Distributions }
96*4f1223e8SApple OSS Distributions
97*4f1223e8SApple OSS Distributions if (ifname2[0] != '\0') {
98*4f1223e8SApple OSS Distributions (void)ifnet_destroy(ifname2, false);
99*4f1223e8SApple OSS Distributions T_LOG("ifnet_destroy %s", ifname2);
100*4f1223e8SApple OSS Distributions }
101*4f1223e8SApple OSS Distributions
102*4f1223e8SApple OSS Distributions if (default_fake_max_mtu != 0) {
103*4f1223e8SApple OSS Distributions T_LOG("sysctl net.link.fake.max_mtu=%d", default_fake_max_mtu);
104*4f1223e8SApple OSS Distributions (void) sysctlbyname("net.link.fake.max_mtu", NULL, NULL, &default_fake_max_mtu, sizeof(int));
105*4f1223e8SApple OSS Distributions }
106*4f1223e8SApple OSS Distributions }
107*4f1223e8SApple OSS Distributions
108*4f1223e8SApple OSS Distributions static void
init(int mtu)109*4f1223e8SApple OSS Distributions init(int mtu)
110*4f1223e8SApple OSS Distributions {
111*4f1223e8SApple OSS Distributions T_ATEND(cleanup);
112*4f1223e8SApple OSS Distributions
113*4f1223e8SApple OSS Distributions if (mtu > 0) {
114*4f1223e8SApple OSS Distributions size_t oldlen = sizeof(int);
115*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(sysctlbyname("net.link.fake.max_mtu", &default_fake_max_mtu, &oldlen, &mtu, sizeof(int)),
116*4f1223e8SApple OSS Distributions "sysctl net.link.fake.max_mtu %d -> %d", default_fake_max_mtu, mtu);
117*4f1223e8SApple OSS Distributions }
118*4f1223e8SApple OSS Distributions }
119*4f1223e8SApple OSS Distributions
120*4f1223e8SApple OSS Distributions static int
setup_feth_pair(int mtu)121*4f1223e8SApple OSS Distributions setup_feth_pair(int mtu)
122*4f1223e8SApple OSS Distributions {
123*4f1223e8SApple OSS Distributions int error = 0;
124*4f1223e8SApple OSS Distributions
125*4f1223e8SApple OSS Distributions strlcpy(ifname1, FETH_NAME, sizeof(ifname1));
126*4f1223e8SApple OSS Distributions error = ifnet_create_2(ifname1, sizeof(ifname1));
127*4f1223e8SApple OSS Distributions if (error != 0) {
128*4f1223e8SApple OSS Distributions ifname1[0] = '\0';
129*4f1223e8SApple OSS Distributions goto done;
130*4f1223e8SApple OSS Distributions }
131*4f1223e8SApple OSS Distributions T_LOG("created %s", ifname1);
132*4f1223e8SApple OSS Distributions
133*4f1223e8SApple OSS Distributions strlcpy(ifname2, FETH_NAME, sizeof(ifname2));
134*4f1223e8SApple OSS Distributions error = ifnet_create_2(ifname2, sizeof(ifname2));
135*4f1223e8SApple OSS Distributions if (error != 0) {
136*4f1223e8SApple OSS Distributions ifname2[0] = '\0';
137*4f1223e8SApple OSS Distributions goto done;
138*4f1223e8SApple OSS Distributions }
139*4f1223e8SApple OSS Distributions T_LOG("created %s", ifname2);
140*4f1223e8SApple OSS Distributions
141*4f1223e8SApple OSS Distributions ifnet_attach_ip(ifname1);
142*4f1223e8SApple OSS Distributions
143*4f1223e8SApple OSS Distributions fake_set_peer(ifname1, ifname2);
144*4f1223e8SApple OSS Distributions if (mtu != 0) {
145*4f1223e8SApple OSS Distributions ifnet_set_mtu(ifname1, mtu);
146*4f1223e8SApple OSS Distributions ifnet_set_mtu(ifname2, mtu);
147*4f1223e8SApple OSS Distributions }
148*4f1223e8SApple OSS Distributions done:
149*4f1223e8SApple OSS Distributions return error;
150*4f1223e8SApple OSS Distributions }
151*4f1223e8SApple OSS Distributions
152*4f1223e8SApple OSS Distributions static int
create_bpf_on_interface(const char * ifname,int * out_fd,int * out_bdlen,u_int write_size_max)153*4f1223e8SApple OSS Distributions create_bpf_on_interface(const char *ifname, int *out_fd, int *out_bdlen, u_int write_size_max)
154*4f1223e8SApple OSS Distributions {
155*4f1223e8SApple OSS Distributions int bpf_fd = -1;
156*4f1223e8SApple OSS Distributions int error = 0;
157*4f1223e8SApple OSS Distributions int bdlen = 0;
158*4f1223e8SApple OSS Distributions
159*4f1223e8SApple OSS Distributions bpf_fd = bpf_new();
160*4f1223e8SApple OSS Distributions if (bpf_fd < 0) {
161*4f1223e8SApple OSS Distributions error = errno;
162*4f1223e8SApple OSS Distributions T_LOG("bpf_new");
163*4f1223e8SApple OSS Distributions goto done;
164*4f1223e8SApple OSS Distributions }
165*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(bpf_set_blen(bpf_fd, 128 * 1024), NULL);
166*4f1223e8SApple OSS Distributions
167*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(bpf_get_blen(bpf_fd, &bdlen), NULL);
168*4f1223e8SApple OSS Distributions
169*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(bpf_set_immediate(bpf_fd, 1), NULL);
170*4f1223e8SApple OSS Distributions
171*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(bpf_setif(bpf_fd, ifname), "bpf set if %s",
172*4f1223e8SApple OSS Distributions ifname1);
173*4f1223e8SApple OSS Distributions
174*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(bpf_set_see_sent(bpf_fd, 1), NULL);
175*4f1223e8SApple OSS Distributions
176*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(bpf_set_header_complete(bpf_fd, 0), NULL);
177*4f1223e8SApple OSS Distributions
178*4f1223e8SApple OSS Distributions #ifdef BIOCSWRITEMAX
179*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(bpf_set_write_size_max(bpf_fd, write_size_max), NULL);
180*4f1223e8SApple OSS Distributions
181*4f1223e8SApple OSS Distributions u_int value;
182*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(bpf_get_write_size_max(bpf_fd, &value), NULL);
183*4f1223e8SApple OSS Distributions
184*4f1223e8SApple OSS Distributions T_LOG("write_size_max %u %s value %u", write_size_max, write_size_max != value ? "!=" : "==", value);
185*4f1223e8SApple OSS Distributions #else
186*4f1223e8SApple OSS Distributions if (write_size_max > 0) {
187*4f1223e8SApple OSS Distributions T_SKIP("BIOCSWRITEMAX not supported");
188*4f1223e8SApple OSS Distributions }
189*4f1223e8SApple OSS Distributions #endif
190*4f1223e8SApple OSS Distributions struct timeval five_seconds = { .tv_sec = 5, .tv_usec = 0 };
191*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(bpf_set_timeout(bpf_fd, &five_seconds), NULL);
192*4f1223e8SApple OSS Distributions
193*4f1223e8SApple OSS Distributions done:
194*4f1223e8SApple OSS Distributions *out_bdlen = bdlen;
195*4f1223e8SApple OSS Distributions *out_fd = bpf_fd;
196*4f1223e8SApple OSS Distributions return error;
197*4f1223e8SApple OSS Distributions }
198*4f1223e8SApple OSS Distributions
199*4f1223e8SApple OSS Distributions static void
do_bpf_write(const char * ifname,u_int ip_len,bool expect_success,u_int write_size_max)200*4f1223e8SApple OSS Distributions do_bpf_write(const char *ifname, u_int ip_len, bool expect_success, u_int write_size_max)
201*4f1223e8SApple OSS Distributions {
202*4f1223e8SApple OSS Distributions int bpf_fd = -1;
203*4f1223e8SApple OSS Distributions int bdlen = 0;
204*4f1223e8SApple OSS Distributions u_int payload_len;
205*4f1223e8SApple OSS Distributions
206*4f1223e8SApple OSS Distributions if (ip_len == 0) {
207*4f1223e8SApple OSS Distributions payload_len = (u_int)sizeof(dhcp_min_payload);
208*4f1223e8SApple OSS Distributions } else {
209*4f1223e8SApple OSS Distributions T_ASSERT_GE((size_t)ip_len, sizeof(struct ip) + sizeof(struct udphdr) + sizeof(dhcp_min_payload),
210*4f1223e8SApple OSS Distributions "ip_len");
211*4f1223e8SApple OSS Distributions payload_len = ip_len - (sizeof(struct ip) + sizeof(struct udphdr));
212*4f1223e8SApple OSS Distributions }
213*4f1223e8SApple OSS Distributions
214*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_ZERO(create_bpf_on_interface(ifname, &bpf_fd, &bdlen, write_size_max), NULL);
215*4f1223e8SApple OSS Distributions T_LOG("bpf bdlen %d", bdlen);
216*4f1223e8SApple OSS Distributions
217*4f1223e8SApple OSS Distributions struct ether_addr src_eaddr = { 0 };
218*4f1223e8SApple OSS Distributions ifnet_get_lladdr(ifname1, &src_eaddr);
219*4f1223e8SApple OSS Distributions
220*4f1223e8SApple OSS Distributions struct in_addr src_ip = { .s_addr = INADDR_ANY };
221*4f1223e8SApple OSS Distributions uint16_t src_port = 68;
222*4f1223e8SApple OSS Distributions
223*4f1223e8SApple OSS Distributions struct ether_addr dst_eaddr = { 0 };
224*4f1223e8SApple OSS Distributions memset(dst_eaddr.octet, 255, ETHER_ADDR_LEN);
225*4f1223e8SApple OSS Distributions
226*4f1223e8SApple OSS Distributions struct in_addr dst_ip = { .s_addr = INADDR_BROADCAST };
227*4f1223e8SApple OSS Distributions
228*4f1223e8SApple OSS Distributions uint16_t dst_port = 67;
229*4f1223e8SApple OSS Distributions
230*4f1223e8SApple OSS Distributions char *payload = calloc(1, payload_len);
231*4f1223e8SApple OSS Distributions
232*4f1223e8SApple OSS Distributions make_dhcp_payload((dhcp_min_payload_t)(void *)payload, &src_eaddr);
233*4f1223e8SApple OSS Distributions
234*4f1223e8SApple OSS Distributions u_int pkt_size = ETHER_HDR_LEN + IP_MAXPACKET;
235*4f1223e8SApple OSS Distributions unsigned char *pkt = calloc(1, pkt_size);
236*4f1223e8SApple OSS Distributions
237*4f1223e8SApple OSS Distributions u_int frame_length = ethernet_udp4_frame_populate((void *)pkt,
238*4f1223e8SApple OSS Distributions pkt_size,
239*4f1223e8SApple OSS Distributions &src_eaddr,
240*4f1223e8SApple OSS Distributions src_ip,
241*4f1223e8SApple OSS Distributions src_port,
242*4f1223e8SApple OSS Distributions &dst_eaddr,
243*4f1223e8SApple OSS Distributions dst_ip,
244*4f1223e8SApple OSS Distributions dst_port,
245*4f1223e8SApple OSS Distributions payload,
246*4f1223e8SApple OSS Distributions payload_len);
247*4f1223e8SApple OSS Distributions
248*4f1223e8SApple OSS Distributions T_LOG("frame_length %u ip_len %u payload_len %u", frame_length, ip_len, payload_len);
249*4f1223e8SApple OSS Distributions
250*4f1223e8SApple OSS Distributions T_ASSERT_GT((size_t)frame_length, (size_t)0, "frame_length must greater than zero");
251*4f1223e8SApple OSS Distributions
252*4f1223e8SApple OSS Distributions
253*4f1223e8SApple OSS Distributions ssize_t nwritten;
254*4f1223e8SApple OSS Distributions nwritten = write(bpf_fd, pkt, frame_length);
255*4f1223e8SApple OSS Distributions
256*4f1223e8SApple OSS Distributions T_LOG("bpf write returned %ld", nwritten);
257*4f1223e8SApple OSS Distributions
258*4f1223e8SApple OSS Distributions if (expect_success) {
259*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(nwritten, "write bpf");
260*4f1223e8SApple OSS Distributions } else {
261*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_FAILURE(nwritten, EMSGSIZE, "write bpf");
262*4f1223e8SApple OSS Distributions goto done;
263*4f1223e8SApple OSS Distributions }
264*4f1223e8SApple OSS Distributions
265*4f1223e8SApple OSS Distributions T_LOG("bpf written %ld bytes over %u", nwritten, frame_length);
266*4f1223e8SApple OSS Distributions HexDump(pkt, MIN((size_t)nwritten, 512));
267*4f1223e8SApple OSS Distributions
268*4f1223e8SApple OSS Distributions unsigned char *buffer = calloc(1, (size_t)bdlen);
269*4f1223e8SApple OSS Distributions T_ASSERT_NOTNULL(buffer, "malloc()");
270*4f1223e8SApple OSS Distributions
271*4f1223e8SApple OSS Distributions ssize_t nread = read(bpf_fd, buffer, (size_t)bdlen);
272*4f1223e8SApple OSS Distributions
273*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(nread, "read bpf");
274*4f1223e8SApple OSS Distributions
275*4f1223e8SApple OSS Distributions T_LOG("bpf read %ld bytes", nread);
276*4f1223e8SApple OSS Distributions
277*4f1223e8SApple OSS Distributions /*
278*4f1223e8SApple OSS Distributions * We need at least the BPF header
279*4f1223e8SApple OSS Distributions */
280*4f1223e8SApple OSS Distributions T_ASSERT_GT((size_t)nread, sizeof(sizeof(struct bpf_hdr)), NULL);
281*4f1223e8SApple OSS Distributions
282*4f1223e8SApple OSS Distributions /*
283*4f1223e8SApple OSS Distributions * Note: The following will fail if there is parasitic traffic and that should not happen
284*4f1223e8SApple OSS Distributions */
285*4f1223e8SApple OSS Distributions struct bpf_hdr *hp = (struct bpf_hdr *)(void *)buffer;
286*4f1223e8SApple OSS Distributions T_LOG("tv_sec %u tv_usec %u caplen %u datalen %u hdrlen %u",
287*4f1223e8SApple OSS Distributions hp->bh_tstamp.tv_sec, hp->bh_tstamp.tv_usec,
288*4f1223e8SApple OSS Distributions hp->bh_caplen, hp->bh_datalen, hp->bh_hdrlen);
289*4f1223e8SApple OSS Distributions
290*4f1223e8SApple OSS Distributions HexDump(buffer, MIN((size_t)(hp->bh_hdrlen + hp->bh_caplen), 512));
291*4f1223e8SApple OSS Distributions
292*4f1223e8SApple OSS Distributions T_ASSERT_EQ_LONG(nwritten, (long)hp->bh_caplen, "bpf read same size as written");
293*4f1223e8SApple OSS Distributions
294*4f1223e8SApple OSS Distributions T_ASSERT_EQ_INT(bcmp(buffer + hp->bh_hdrlen, pkt, (size_t)nwritten), 0, "bpf read same bytes as written");
295*4f1223e8SApple OSS Distributions
296*4f1223e8SApple OSS Distributions if (buffer != NULL) {
297*4f1223e8SApple OSS Distributions free(buffer);
298*4f1223e8SApple OSS Distributions }
299*4f1223e8SApple OSS Distributions done:
300*4f1223e8SApple OSS Distributions if (bpf_fd != -1) {
301*4f1223e8SApple OSS Distributions close(bpf_fd);
302*4f1223e8SApple OSS Distributions }
303*4f1223e8SApple OSS Distributions }
304*4f1223e8SApple OSS Distributions
305*4f1223e8SApple OSS Distributions static void
test_bpf_write(u_int data_len,int mtu,bool expect_success,u_int write_size_max)306*4f1223e8SApple OSS Distributions test_bpf_write(u_int data_len, int mtu, bool expect_success, u_int write_size_max)
307*4f1223e8SApple OSS Distributions {
308*4f1223e8SApple OSS Distributions init(mtu);
309*4f1223e8SApple OSS Distributions
310*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_ZERO(setup_feth_pair(mtu), NULL);
311*4f1223e8SApple OSS Distributions
312*4f1223e8SApple OSS Distributions do_bpf_write(ifname1, data_len, expect_success, write_size_max);
313*4f1223e8SApple OSS Distributions }
314*4f1223e8SApple OSS Distributions
315*4f1223e8SApple OSS Distributions T_DECL(bpf_write_dhcp, "BPF write DHCP feth MTU 1500", T_META_TAG_VM_PREFERRED)
316*4f1223e8SApple OSS Distributions {
317*4f1223e8SApple OSS Distributions test_bpf_write(0, 1500, true, 0);
318*4f1223e8SApple OSS Distributions }
319*4f1223e8SApple OSS Distributions
320*4f1223e8SApple OSS Distributions T_DECL(bpf_write_1024, "BPF write 1024 feth MTU 1500", T_META_TAG_VM_PREFERRED)
321*4f1223e8SApple OSS Distributions {
322*4f1223e8SApple OSS Distributions test_bpf_write(1024, 1500, true, 0);
323*4f1223e8SApple OSS Distributions }
324*4f1223e8SApple OSS Distributions
325*4f1223e8SApple OSS Distributions T_DECL(bpf_write_1514, "BPF write 1500 feth MTU 1500", T_META_TAG_VM_PREFERRED)
326*4f1223e8SApple OSS Distributions {
327*4f1223e8SApple OSS Distributions test_bpf_write(1514, 1500, true, 0);
328*4f1223e8SApple OSS Distributions }
329*4f1223e8SApple OSS Distributions
330*4f1223e8SApple OSS Distributions T_DECL(bpf_write_65482, "BPF write 65482 feth MTU 1500", T_META_TAG_VM_PREFERRED)
331*4f1223e8SApple OSS Distributions {
332*4f1223e8SApple OSS Distributions test_bpf_write(65482, 1500, false, 0);
333*4f1223e8SApple OSS Distributions }
334*4f1223e8SApple OSS Distributions
335*4f1223e8SApple OSS Distributions T_DECL(bpf_write_2048, "BPF write 2048 feth MTU 1500", T_META_TAG_VM_PREFERRED)
336*4f1223e8SApple OSS Distributions {
337*4f1223e8SApple OSS Distributions test_bpf_write(2048, 1500, false, 0);
338*4f1223e8SApple OSS Distributions }
339*4f1223e8SApple OSS Distributions
340*4f1223e8SApple OSS Distributions T_DECL(bpf_write_2048_mtu_4096, "BPF write 2048 feth MTU 4096 ", T_META_TAG_VM_PREFERRED)
341*4f1223e8SApple OSS Distributions {
342*4f1223e8SApple OSS Distributions test_bpf_write(2048, 4096, true, 0);
343*4f1223e8SApple OSS Distributions }
344*4f1223e8SApple OSS Distributions
345*4f1223e8SApple OSS Distributions T_DECL(bpf_write_4110_mtu_4096, "BPF write 4110 feth MTU 4096 ", T_META_TAG_VM_PREFERRED)
346*4f1223e8SApple OSS Distributions {
347*4f1223e8SApple OSS Distributions test_bpf_write(4110, 4096, true, 0);
348*4f1223e8SApple OSS Distributions }
349*4f1223e8SApple OSS Distributions
350*4f1223e8SApple OSS Distributions T_DECL(bpf_write_4096_mtu_9000, "BPF write 4096 feth MTU 9000", T_META_TAG_VM_PREFERRED)
351*4f1223e8SApple OSS Distributions {
352*4f1223e8SApple OSS Distributions test_bpf_write(4096, 9000, true, 0);
353*4f1223e8SApple OSS Distributions }
354*4f1223e8SApple OSS Distributions
355*4f1223e8SApple OSS Distributions T_DECL(bpf_write_8192_mtu_9000, "BPF write 8192 feth MTU 9000", T_META_TAG_VM_PREFERRED)
356*4f1223e8SApple OSS Distributions {
357*4f1223e8SApple OSS Distributions test_bpf_write(8192, 9000, true, 0);
358*4f1223e8SApple OSS Distributions }
359*4f1223e8SApple OSS Distributions
360*4f1223e8SApple OSS Distributions T_DECL(bpf_write_9000_mtu_9000, "BPF write 9000 feth MTU 9000", T_META_TAG_VM_PREFERRED)
361*4f1223e8SApple OSS Distributions {
362*4f1223e8SApple OSS Distributions test_bpf_write(9000, 9000, true, 0);
363*4f1223e8SApple OSS Distributions }
364*4f1223e8SApple OSS Distributions
365*4f1223e8SApple OSS Distributions T_DECL(bpf_write_9018_mtu_9000, "BPF write 9018 feth MTU 9000", T_META_TAG_VM_PREFERRED)
366*4f1223e8SApple OSS Distributions {
367*4f1223e8SApple OSS Distributions test_bpf_write(9018, 9000, true, 0);
368*4f1223e8SApple OSS Distributions }
369*4f1223e8SApple OSS Distributions
370*4f1223e8SApple OSS Distributions T_DECL(bpf_write_16370_mtu_9000, "BPF write 16370 feth MTU 9000", T_META_TAG_VM_PREFERRED)
371*4f1223e8SApple OSS Distributions {
372*4f1223e8SApple OSS Distributions test_bpf_write(16370, 9000, false, 0);
373*4f1223e8SApple OSS Distributions }
374*4f1223e8SApple OSS Distributions
375*4f1223e8SApple OSS Distributions T_DECL(bpf_write_16370_mtu_9000_max_16370, "BPF write 16370 feth MTU 9000 max 16370", T_META_TAG_VM_PREFERRED)
376*4f1223e8SApple OSS Distributions {
377*4f1223e8SApple OSS Distributions test_bpf_write(16370, 9000, true, 16370);
378*4f1223e8SApple OSS Distributions }
379