1*bbb1b6f9SApple OSS Distributions /* 2*bbb1b6f9SApple OSS Distributions * Copyright (c) 2023-2025 Apple Inc. All rights reserved. 3*bbb1b6f9SApple OSS Distributions * 4*bbb1b6f9SApple OSS Distributions * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ 5*bbb1b6f9SApple OSS Distributions * 6*bbb1b6f9SApple OSS Distributions * This file contains Original Code and/or Modifications of Original Code 7*bbb1b6f9SApple OSS Distributions * as defined in and that are subject to the Apple Public Source License 8*bbb1b6f9SApple OSS Distributions * Version 2.0 (the 'License'). You may not use this file except in 9*bbb1b6f9SApple OSS Distributions * compliance with the License. The rights granted to you under the License 10*bbb1b6f9SApple OSS Distributions * may not be used to create, or enable the creation or redistribution of, 11*bbb1b6f9SApple OSS Distributions * unlawful or unlicensed copies of an Apple operating system, or to 12*bbb1b6f9SApple OSS Distributions * circumvent, violate, or enable the circumvention or violation of, any 13*bbb1b6f9SApple OSS Distributions * terms of an Apple operating system software license agreement. 14*bbb1b6f9SApple OSS Distributions * 15*bbb1b6f9SApple OSS Distributions * Please obtain a copy of the License at 16*bbb1b6f9SApple OSS Distributions * http://www.opensource.apple.com/apsl/ and read it before using this file. 17*bbb1b6f9SApple OSS Distributions * 18*bbb1b6f9SApple OSS Distributions * The Original Code and all software distributed under the License are 19*bbb1b6f9SApple OSS Distributions * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 20*bbb1b6f9SApple OSS Distributions * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 21*bbb1b6f9SApple OSS Distributions * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 22*bbb1b6f9SApple OSS Distributions * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 23*bbb1b6f9SApple OSS Distributions * Please see the License for the specific language governing rights and 24*bbb1b6f9SApple OSS Distributions * limitations under the License. 25*bbb1b6f9SApple OSS Distributions * 26*bbb1b6f9SApple OSS Distributions * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ 27*bbb1b6f9SApple OSS Distributions */ 28*bbb1b6f9SApple OSS Distributions 29*bbb1b6f9SApple OSS Distributions 30*bbb1b6f9SApple OSS Distributions #ifndef __net_test_lib_h__ 31*bbb1b6f9SApple OSS Distributions #define __net_test_lib_h__ 32*bbb1b6f9SApple OSS Distributions 33*bbb1b6f9SApple OSS Distributions #include <darwintest.h> 34*bbb1b6f9SApple OSS Distributions #include <stdio.h> 35*bbb1b6f9SApple OSS Distributions #include <unistd.h> 36*bbb1b6f9SApple OSS Distributions #include <stddef.h> 37*bbb1b6f9SApple OSS Distributions #include <stdbool.h> 38*bbb1b6f9SApple OSS Distributions #include <stdlib.h> 39*bbb1b6f9SApple OSS Distributions #include <string.h> 40*bbb1b6f9SApple OSS Distributions #include <sys/socket.h> 41*bbb1b6f9SApple OSS Distributions #include <arpa/inet.h> 42*bbb1b6f9SApple OSS Distributions #include <sys/event.h> 43*bbb1b6f9SApple OSS Distributions #include <net/if.h> 44*bbb1b6f9SApple OSS Distributions #include <netinet/in.h> 45*bbb1b6f9SApple OSS Distributions #include <netinet6/in6_var.h> 46*bbb1b6f9SApple OSS Distributions #include <netinet6/nd6.h> 47*bbb1b6f9SApple OSS Distributions #include <netinet/in.h> 48*bbb1b6f9SApple OSS Distributions #include <netinet/ip.h> 49*bbb1b6f9SApple OSS Distributions #include <netinet/udp.h> 50*bbb1b6f9SApple OSS Distributions #include <netinet/bootp.h> 51*bbb1b6f9SApple OSS Distributions #include <netinet/tcp.h> 52*bbb1b6f9SApple OSS Distributions #include <netinet/if_ether.h> 53*bbb1b6f9SApple OSS Distributions #include <netinet/ip6.h> 54*bbb1b6f9SApple OSS Distributions #include <netinet/icmp6.h> 55*bbb1b6f9SApple OSS Distributions #include <net/if_arp.h> 56*bbb1b6f9SApple OSS Distributions #include <net/bpf.h> 57*bbb1b6f9SApple OSS Distributions #include <net/if_bridgevar.h> 58*bbb1b6f9SApple OSS Distributions #include <net/if_fake_var.h> 59*bbb1b6f9SApple OSS Distributions #include <sys/ioctl.h> 60*bbb1b6f9SApple OSS Distributions #include <sys/types.h> 61*bbb1b6f9SApple OSS Distributions #include <sys/stat.h> 62*bbb1b6f9SApple OSS Distributions #include <errno.h> 63*bbb1b6f9SApple OSS Distributions #include <pthread.h> 64*bbb1b6f9SApple OSS Distributions #include <stdbool.h> 65*bbb1b6f9SApple OSS Distributions #include <TargetConditionals.h> 66*bbb1b6f9SApple OSS Distributions #include <darwintest_utils.h> 67*bbb1b6f9SApple OSS Distributions #include "inet_transfer.h" 68*bbb1b6f9SApple OSS Distributions #include "bpflib.h" 69*bbb1b6f9SApple OSS Distributions #include "in_cksum.h" 70*bbb1b6f9SApple OSS Distributions 71*bbb1b6f9SApple OSS Distributions #include <mach/mach_host.h> 72*bbb1b6f9SApple OSS Distributions #include <mach/mach_error.h> 73*bbb1b6f9SApple OSS Distributions 74*bbb1b6f9SApple OSS Distributions extern kern_return_t mach_zone_force_gc(host_t host); 75*bbb1b6f9SApple OSS Distributions 76*bbb1b6f9SApple OSS Distributions extern bool G_debug; 77*bbb1b6f9SApple OSS Distributions 78*bbb1b6f9SApple OSS Distributions /* 79*bbb1b6f9SApple OSS Distributions * network_interface routines 80*bbb1b6f9SApple OSS Distributions */ 81*bbb1b6f9SApple OSS Distributions typedef char if_name_t[IFNAMSIZ]; 82*bbb1b6f9SApple OSS Distributions 83*bbb1b6f9SApple OSS Distributions typedef struct { 84*bbb1b6f9SApple OSS Distributions if_name_t if_name; 85*bbb1b6f9SApple OSS Distributions u_short if_index; 86*bbb1b6f9SApple OSS Distributions struct in_addr ip; 87*bbb1b6f9SApple OSS Distributions struct in6_addr ip6; 88*bbb1b6f9SApple OSS Distributions } network_interface, *network_interface_t; 89*bbb1b6f9SApple OSS Distributions 90*bbb1b6f9SApple OSS Distributions typedef struct { 91*bbb1b6f9SApple OSS Distributions network_interface one; 92*bbb1b6f9SApple OSS Distributions network_interface two; 93*bbb1b6f9SApple OSS Distributions } network_interface_pair, *network_interface_pair_t; 94*bbb1b6f9SApple OSS Distributions 95*bbb1b6f9SApple OSS Distributions typedef struct { 96*bbb1b6f9SApple OSS Distributions u_int count; 97*bbb1b6f9SApple OSS Distributions network_interface_pair list[1]; 98*bbb1b6f9SApple OSS Distributions } network_interface_pair_list, * network_interface_pair_list_t; 99*bbb1b6f9SApple OSS Distributions 100*bbb1b6f9SApple OSS Distributions extern void 101*bbb1b6f9SApple OSS Distributions network_interface_create(network_interface_t if_p, const if_name_t name); 102*bbb1b6f9SApple OSS Distributions 103*bbb1b6f9SApple OSS Distributions extern void 104*bbb1b6f9SApple OSS Distributions network_interface_destroy(network_interface_t if_p); 105*bbb1b6f9SApple OSS Distributions 106*bbb1b6f9SApple OSS Distributions extern network_interface_pair_list_t 107*bbb1b6f9SApple OSS Distributions network_interface_pair_list_alloc(u_int n); 108*bbb1b6f9SApple OSS Distributions 109*bbb1b6f9SApple OSS Distributions extern void 110*bbb1b6f9SApple OSS Distributions network_interface_pair_list_destroy(network_interface_pair_list_t list); 111*bbb1b6f9SApple OSS Distributions 112*bbb1b6f9SApple OSS Distributions #define DHCP_PAYLOAD_MIN sizeof(struct bootp) 113*bbb1b6f9SApple OSS Distributions #define DHCP_FLAGS_BROADCAST ((u_short)0x8000) 114*bbb1b6f9SApple OSS Distributions 115*bbb1b6f9SApple OSS Distributions #define FETH_NAME "feth" 116*bbb1b6f9SApple OSS Distributions #define VLAN_NAME "vlan" 117*bbb1b6f9SApple OSS Distributions #define BOND_NAME "bond" 118*bbb1b6f9SApple OSS Distributions #define BRIDGE_NAME "bridge" 119*bbb1b6f9SApple OSS Distributions #define BRIDGE200 BRIDGE_NAME "200" 120*bbb1b6f9SApple OSS Distributions #define FETH0 FETH_NAME "0" 121*bbb1b6f9SApple OSS Distributions 122*bbb1b6f9SApple OSS Distributions extern struct in_addr inet_class_c_subnet_mask; 123*bbb1b6f9SApple OSS Distributions 124*bbb1b6f9SApple OSS Distributions typedef union { 125*bbb1b6f9SApple OSS Distributions char bytes[DHCP_PAYLOAD_MIN]; 126*bbb1b6f9SApple OSS Distributions /* force 4-byte alignment */ 127*bbb1b6f9SApple OSS Distributions uint32_t words[DHCP_PAYLOAD_MIN / sizeof(uint32_t)]; 128*bbb1b6f9SApple OSS Distributions } dhcp_min_payload, *dhcp_min_payload_t; 129*bbb1b6f9SApple OSS Distributions 130*bbb1b6f9SApple OSS Distributions #define ETHER_PKT_LEN (ETHER_HDR_LEN + ETHERMTU) 131*bbb1b6f9SApple OSS Distributions typedef union { 132*bbb1b6f9SApple OSS Distributions char bytes[ETHER_PKT_LEN]; 133*bbb1b6f9SApple OSS Distributions /* force 4-byte aligment */ 134*bbb1b6f9SApple OSS Distributions uint32_t words[ETHER_PKT_LEN / sizeof(uint32_t)]; 135*bbb1b6f9SApple OSS Distributions } ether_packet, *ether_packet_t; 136*bbb1b6f9SApple OSS Distributions 137*bbb1b6f9SApple OSS Distributions typedef struct { 138*bbb1b6f9SApple OSS Distributions struct ip ip; 139*bbb1b6f9SApple OSS Distributions struct udphdr udp; 140*bbb1b6f9SApple OSS Distributions } ip_udp_header_t; 141*bbb1b6f9SApple OSS Distributions 142*bbb1b6f9SApple OSS Distributions typedef struct { 143*bbb1b6f9SApple OSS Distributions struct in_addr src_ip; 144*bbb1b6f9SApple OSS Distributions struct in_addr dst_ip; 145*bbb1b6f9SApple OSS Distributions char zero; 146*bbb1b6f9SApple OSS Distributions char proto; 147*bbb1b6f9SApple OSS Distributions unsigned short length; 148*bbb1b6f9SApple OSS Distributions } udp_pseudo_hdr_t; 149*bbb1b6f9SApple OSS Distributions 150*bbb1b6f9SApple OSS Distributions typedef struct { 151*bbb1b6f9SApple OSS Distributions struct ip ip; 152*bbb1b6f9SApple OSS Distributions struct tcphdr tcp; 153*bbb1b6f9SApple OSS Distributions } ip_tcp_header_t; 154*bbb1b6f9SApple OSS Distributions 155*bbb1b6f9SApple OSS Distributions typedef union { 156*bbb1b6f9SApple OSS Distributions ip_udp_header_t udp; 157*bbb1b6f9SApple OSS Distributions ip_tcp_header_t tcp; 158*bbb1b6f9SApple OSS Distributions } ip_udp_tcp_header_u; 159*bbb1b6f9SApple OSS Distributions 160*bbb1b6f9SApple OSS Distributions typedef struct { 161*bbb1b6f9SApple OSS Distributions struct in_addr src_ip; 162*bbb1b6f9SApple OSS Distributions struct in_addr dst_ip; 163*bbb1b6f9SApple OSS Distributions char zero; 164*bbb1b6f9SApple OSS Distributions char proto; 165*bbb1b6f9SApple OSS Distributions unsigned short length; 166*bbb1b6f9SApple OSS Distributions } tcp_pseudo_hdr_t; 167*bbb1b6f9SApple OSS Distributions 168*bbb1b6f9SApple OSS Distributions typedef struct { 169*bbb1b6f9SApple OSS Distributions struct ip6_hdr ip6; 170*bbb1b6f9SApple OSS Distributions struct udphdr udp; 171*bbb1b6f9SApple OSS Distributions } ip6_udp_header_t; 172*bbb1b6f9SApple OSS Distributions 173*bbb1b6f9SApple OSS Distributions typedef struct { 174*bbb1b6f9SApple OSS Distributions struct in6_addr src_ip; 175*bbb1b6f9SApple OSS Distributions struct in6_addr dst_ip; 176*bbb1b6f9SApple OSS Distributions char zero; 177*bbb1b6f9SApple OSS Distributions char proto; 178*bbb1b6f9SApple OSS Distributions unsigned short length; 179*bbb1b6f9SApple OSS Distributions } udp6_pseudo_hdr_t; 180*bbb1b6f9SApple OSS Distributions 181*bbb1b6f9SApple OSS Distributions extern ether_addr_t ether_broadcast; 182*bbb1b6f9SApple OSS Distributions 183*bbb1b6f9SApple OSS Distributions extern int inet_dgram_socket_get(void); 184*bbb1b6f9SApple OSS Distributions void inet_dgram_socket_close(void); 185*bbb1b6f9SApple OSS Distributions 186*bbb1b6f9SApple OSS Distributions extern int inet6_dgram_socket_get(void); 187*bbb1b6f9SApple OSS Distributions void inet6_dgram_socket_close(void); 188*bbb1b6f9SApple OSS Distributions 189*bbb1b6f9SApple OSS Distributions extern bool inet6_get_linklocal_address(unsigned int if_index, struct in6_addr *ret_addr); 190*bbb1b6f9SApple OSS Distributions 191*bbb1b6f9SApple OSS Distributions extern int ifnet_create(const char * ifname); 192*bbb1b6f9SApple OSS Distributions 193*bbb1b6f9SApple OSS Distributions extern int ifnet_create_2(char * ifname, size_t len); 194*bbb1b6f9SApple OSS Distributions 195*bbb1b6f9SApple OSS Distributions extern int ifnet_destroy(const char * ifname, bool fail_on_error); 196*bbb1b6f9SApple OSS Distributions 197*bbb1b6f9SApple OSS Distributions extern void ifnet_get_lladdr(const char * ifname, ether_addr_t * eaddr); 198*bbb1b6f9SApple OSS Distributions 199*bbb1b6f9SApple OSS Distributions extern void ifnet_attach_ip(char * name); 200*bbb1b6f9SApple OSS Distributions 201*bbb1b6f9SApple OSS Distributions extern void ifnet_start_ipv6(const char * ifname); 202*bbb1b6f9SApple OSS Distributions 203*bbb1b6f9SApple OSS Distributions extern int ifnet_set_lladdr(const char * ifname, ether_addr_t * eaddr); 204*bbb1b6f9SApple OSS Distributions 205*bbb1b6f9SApple OSS Distributions extern int ifnet_set_flags(const char * ifname, 206*bbb1b6f9SApple OSS Distributions uint16_t flags_set, uint16_t flags_clear); 207*bbb1b6f9SApple OSS Distributions 208*bbb1b6f9SApple OSS Distributions extern void ifnet_add_ip_address(char *ifname, struct in_addr addr, 209*bbb1b6f9SApple OSS Distributions struct in_addr mask); 210*bbb1b6f9SApple OSS Distributions 211*bbb1b6f9SApple OSS Distributions extern void ifnet_remove_ip_address(char *ifname, struct in_addr addr, 212*bbb1b6f9SApple OSS Distributions struct in_addr mask); 213*bbb1b6f9SApple OSS Distributions 214*bbb1b6f9SApple OSS Distributions extern int ifnet_set_mtu(const char * ifname, int mtu); 215*bbb1b6f9SApple OSS Distributions 216*bbb1b6f9SApple OSS Distributions extern int siocdrvspec(const char * ifname, 217*bbb1b6f9SApple OSS Distributions u_long op, void *arg, size_t argsize, bool set); 218*bbb1b6f9SApple OSS Distributions 219*bbb1b6f9SApple OSS Distributions extern void fake_set_peer(const char * feth, const char * feth_peer); 220*bbb1b6f9SApple OSS Distributions 221*bbb1b6f9SApple OSS Distributions extern void siocsifvlan(const char * vlan, const char * phys, uint16_t tag); 222*bbb1b6f9SApple OSS Distributions 223*bbb1b6f9SApple OSS Distributions extern void route_add_inet_scoped_subnet(char * ifname, u_short if_index, 224*bbb1b6f9SApple OSS Distributions struct in_addr ifa, struct in_addr mask); 225*bbb1b6f9SApple OSS Distributions 226*bbb1b6f9SApple OSS Distributions extern u_int ethernet_udp4_frame_populate(void * buf, size_t buf_len, 227*bbb1b6f9SApple OSS Distributions const ether_addr_t * src, 228*bbb1b6f9SApple OSS Distributions struct in_addr src_ip, 229*bbb1b6f9SApple OSS Distributions uint16_t src_port, 230*bbb1b6f9SApple OSS Distributions const ether_addr_t * dst, 231*bbb1b6f9SApple OSS Distributions struct in_addr dst_ip, 232*bbb1b6f9SApple OSS Distributions uint16_t dst_port, 233*bbb1b6f9SApple OSS Distributions const void * data, u_int data_len); 234*bbb1b6f9SApple OSS Distributions 235*bbb1b6f9SApple OSS Distributions extern u_int 236*bbb1b6f9SApple OSS Distributions ethernet_udp6_frame_populate(void * buf, size_t buf_len, 237*bbb1b6f9SApple OSS Distributions const ether_addr_t * src, 238*bbb1b6f9SApple OSS Distributions struct in6_addr *src_ip, 239*bbb1b6f9SApple OSS Distributions uint16_t src_port, 240*bbb1b6f9SApple OSS Distributions const ether_addr_t * dst, 241*bbb1b6f9SApple OSS Distributions struct in6_addr * dst_ip, 242*bbb1b6f9SApple OSS Distributions uint16_t dst_port, 243*bbb1b6f9SApple OSS Distributions const void * data, u_int data_len); 244*bbb1b6f9SApple OSS Distributions 245*bbb1b6f9SApple OSS Distributions 246*bbb1b6f9SApple OSS Distributions extern u_int make_dhcp_payload(dhcp_min_payload_t payload, ether_addr_t *eaddr); 247*bbb1b6f9SApple OSS Distributions 248*bbb1b6f9SApple OSS Distributions extern bool has_ipv4_default_route(void); 249*bbb1b6f9SApple OSS Distributions 250*bbb1b6f9SApple OSS Distributions extern bool has_ipv6_default_route(void); 251*bbb1b6f9SApple OSS Distributions 252*bbb1b6f9SApple OSS Distributions extern int bridge_add_member(const char * bridge, const char * member); 253*bbb1b6f9SApple OSS Distributions 254*bbb1b6f9SApple OSS Distributions extern void force_zone_gc(void); 255*bbb1b6f9SApple OSS Distributions 256*bbb1b6f9SApple OSS Distributions #endif /* __net_test_lib_h__ */ 257