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 30*4f1223e8SApple OSS Distributions #ifndef __net_test_lib_h__ 31*4f1223e8SApple OSS Distributions #define __net_test_lib_h__ 32*4f1223e8SApple OSS Distributions 33*4f1223e8SApple OSS Distributions #include <darwintest.h> 34*4f1223e8SApple OSS Distributions #include <stdio.h> 35*4f1223e8SApple OSS Distributions #include <unistd.h> 36*4f1223e8SApple OSS Distributions #include <stddef.h> 37*4f1223e8SApple OSS Distributions #include <stdbool.h> 38*4f1223e8SApple OSS Distributions #include <stdlib.h> 39*4f1223e8SApple OSS Distributions #include <string.h> 40*4f1223e8SApple OSS Distributions #include <sys/socket.h> 41*4f1223e8SApple OSS Distributions #include <arpa/inet.h> 42*4f1223e8SApple OSS Distributions #include <sys/event.h> 43*4f1223e8SApple OSS Distributions #include <net/if.h> 44*4f1223e8SApple OSS Distributions #include <netinet/in.h> 45*4f1223e8SApple OSS Distributions #include <netinet6/in6_var.h> 46*4f1223e8SApple OSS Distributions #include <netinet6/nd6.h> 47*4f1223e8SApple OSS Distributions #include <netinet/in.h> 48*4f1223e8SApple OSS Distributions #include <netinet/ip.h> 49*4f1223e8SApple OSS Distributions #include <netinet/udp.h> 50*4f1223e8SApple OSS Distributions #include <netinet/bootp.h> 51*4f1223e8SApple OSS Distributions #include <netinet/tcp.h> 52*4f1223e8SApple OSS Distributions #include <netinet/if_ether.h> 53*4f1223e8SApple OSS Distributions #include <netinet/ip6.h> 54*4f1223e8SApple OSS Distributions #include <netinet/icmp6.h> 55*4f1223e8SApple OSS Distributions #include <net/if_arp.h> 56*4f1223e8SApple OSS Distributions #include <net/bpf.h> 57*4f1223e8SApple OSS Distributions #include <net/if_bridgevar.h> 58*4f1223e8SApple OSS Distributions #include <net/if_fake_var.h> 59*4f1223e8SApple OSS Distributions #include <sys/ioctl.h> 60*4f1223e8SApple OSS Distributions #include <sys/types.h> 61*4f1223e8SApple OSS Distributions #include <sys/stat.h> 62*4f1223e8SApple OSS Distributions #include <errno.h> 63*4f1223e8SApple OSS Distributions #include <pthread.h> 64*4f1223e8SApple OSS Distributions #include <stdbool.h> 65*4f1223e8SApple OSS Distributions #include <TargetConditionals.h> 66*4f1223e8SApple OSS Distributions #include <darwintest_utils.h> 67*4f1223e8SApple OSS Distributions #include "inet_transfer.h" 68*4f1223e8SApple OSS Distributions #include "bpflib.h" 69*4f1223e8SApple OSS Distributions #include "in_cksum.h" 70*4f1223e8SApple OSS Distributions 71*4f1223e8SApple OSS Distributions extern bool G_debug; 72*4f1223e8SApple OSS Distributions 73*4f1223e8SApple OSS Distributions /* 74*4f1223e8SApple OSS Distributions * network_interface routines 75*4f1223e8SApple OSS Distributions */ 76*4f1223e8SApple OSS Distributions typedef char if_name_t[IFNAMSIZ]; 77*4f1223e8SApple OSS Distributions 78*4f1223e8SApple OSS Distributions typedef struct { 79*4f1223e8SApple OSS Distributions if_name_t if_name; 80*4f1223e8SApple OSS Distributions u_short if_index; 81*4f1223e8SApple OSS Distributions struct in_addr ip; 82*4f1223e8SApple OSS Distributions struct in6_addr ip6; 83*4f1223e8SApple OSS Distributions } network_interface, *network_interface_t; 84*4f1223e8SApple OSS Distributions 85*4f1223e8SApple OSS Distributions typedef struct { 86*4f1223e8SApple OSS Distributions network_interface one; 87*4f1223e8SApple OSS Distributions network_interface two; 88*4f1223e8SApple OSS Distributions } network_interface_pair, *network_interface_pair_t; 89*4f1223e8SApple OSS Distributions 90*4f1223e8SApple OSS Distributions typedef struct { 91*4f1223e8SApple OSS Distributions u_int count; 92*4f1223e8SApple OSS Distributions network_interface_pair list[1]; 93*4f1223e8SApple OSS Distributions } network_interface_pair_list, * network_interface_pair_list_t; 94*4f1223e8SApple OSS Distributions 95*4f1223e8SApple OSS Distributions extern void 96*4f1223e8SApple OSS Distributions network_interface_create(network_interface_t if_p, const if_name_t name); 97*4f1223e8SApple OSS Distributions 98*4f1223e8SApple OSS Distributions extern void 99*4f1223e8SApple OSS Distributions network_interface_destroy(network_interface_t if_p); 100*4f1223e8SApple OSS Distributions 101*4f1223e8SApple OSS Distributions extern network_interface_pair_list_t 102*4f1223e8SApple OSS Distributions network_interface_pair_list_alloc(u_int n); 103*4f1223e8SApple OSS Distributions 104*4f1223e8SApple OSS Distributions extern void 105*4f1223e8SApple OSS Distributions network_interface_pair_list_destroy(network_interface_pair_list_t list); 106*4f1223e8SApple OSS Distributions 107*4f1223e8SApple OSS Distributions #define DHCP_PAYLOAD_MIN sizeof(struct bootp) 108*4f1223e8SApple OSS Distributions #define DHCP_FLAGS_BROADCAST ((u_short)0x8000) 109*4f1223e8SApple OSS Distributions 110*4f1223e8SApple OSS Distributions #define FETH_NAME "feth" 111*4f1223e8SApple OSS Distributions #define VLAN_NAME "vlan" 112*4f1223e8SApple OSS Distributions #define BOND_NAME "bond" 113*4f1223e8SApple OSS Distributions #define BRIDGE_NAME "bridge" 114*4f1223e8SApple OSS Distributions #define BRIDGE200 BRIDGE_NAME "200" 115*4f1223e8SApple OSS Distributions #define FETH0 FETH_NAME "0" 116*4f1223e8SApple OSS Distributions 117*4f1223e8SApple OSS Distributions extern struct in_addr inet_class_c_subnet_mask; 118*4f1223e8SApple OSS Distributions 119*4f1223e8SApple OSS Distributions typedef union { 120*4f1223e8SApple OSS Distributions char bytes[DHCP_PAYLOAD_MIN]; 121*4f1223e8SApple OSS Distributions /* force 4-byte alignment */ 122*4f1223e8SApple OSS Distributions uint32_t words[DHCP_PAYLOAD_MIN / sizeof(uint32_t)]; 123*4f1223e8SApple OSS Distributions } dhcp_min_payload, *dhcp_min_payload_t; 124*4f1223e8SApple OSS Distributions 125*4f1223e8SApple OSS Distributions #define ETHER_PKT_LEN (ETHER_HDR_LEN + ETHERMTU) 126*4f1223e8SApple OSS Distributions typedef union { 127*4f1223e8SApple OSS Distributions char bytes[ETHER_PKT_LEN]; 128*4f1223e8SApple OSS Distributions /* force 4-byte aligment */ 129*4f1223e8SApple OSS Distributions uint32_t words[ETHER_PKT_LEN / sizeof(uint32_t)]; 130*4f1223e8SApple OSS Distributions } ether_packet, *ether_packet_t; 131*4f1223e8SApple OSS Distributions 132*4f1223e8SApple OSS Distributions typedef struct { 133*4f1223e8SApple OSS Distributions struct ip ip; 134*4f1223e8SApple OSS Distributions struct udphdr udp; 135*4f1223e8SApple OSS Distributions } ip_udp_header_t; 136*4f1223e8SApple OSS Distributions 137*4f1223e8SApple OSS Distributions typedef struct { 138*4f1223e8SApple OSS Distributions struct in_addr src_ip; 139*4f1223e8SApple OSS Distributions struct in_addr dst_ip; 140*4f1223e8SApple OSS Distributions char zero; 141*4f1223e8SApple OSS Distributions char proto; 142*4f1223e8SApple OSS Distributions unsigned short length; 143*4f1223e8SApple OSS Distributions } udp_pseudo_hdr_t; 144*4f1223e8SApple OSS Distributions 145*4f1223e8SApple OSS Distributions typedef struct { 146*4f1223e8SApple OSS Distributions struct ip ip; 147*4f1223e8SApple OSS Distributions struct tcphdr tcp; 148*4f1223e8SApple OSS Distributions } ip_tcp_header_t; 149*4f1223e8SApple OSS Distributions 150*4f1223e8SApple OSS Distributions typedef union { 151*4f1223e8SApple OSS Distributions ip_udp_header_t udp; 152*4f1223e8SApple OSS Distributions ip_tcp_header_t tcp; 153*4f1223e8SApple OSS Distributions } ip_udp_tcp_header_u; 154*4f1223e8SApple OSS Distributions 155*4f1223e8SApple OSS Distributions typedef struct { 156*4f1223e8SApple OSS Distributions struct in_addr src_ip; 157*4f1223e8SApple OSS Distributions struct in_addr dst_ip; 158*4f1223e8SApple OSS Distributions char zero; 159*4f1223e8SApple OSS Distributions char proto; 160*4f1223e8SApple OSS Distributions unsigned short length; 161*4f1223e8SApple OSS Distributions } tcp_pseudo_hdr_t; 162*4f1223e8SApple OSS Distributions 163*4f1223e8SApple OSS Distributions typedef struct { 164*4f1223e8SApple OSS Distributions struct ip6_hdr ip6; 165*4f1223e8SApple OSS Distributions struct udphdr udp; 166*4f1223e8SApple OSS Distributions } ip6_udp_header_t; 167*4f1223e8SApple OSS Distributions 168*4f1223e8SApple OSS Distributions typedef struct { 169*4f1223e8SApple OSS Distributions struct in6_addr src_ip; 170*4f1223e8SApple OSS Distributions struct in6_addr dst_ip; 171*4f1223e8SApple OSS Distributions char zero; 172*4f1223e8SApple OSS Distributions char proto; 173*4f1223e8SApple OSS Distributions unsigned short length; 174*4f1223e8SApple OSS Distributions } udp6_pseudo_hdr_t; 175*4f1223e8SApple OSS Distributions 176*4f1223e8SApple OSS Distributions extern ether_addr_t ether_broadcast; 177*4f1223e8SApple OSS Distributions 178*4f1223e8SApple OSS Distributions extern int inet_dgram_socket_get(void); 179*4f1223e8SApple OSS Distributions void inet_dgram_socket_close(void); 180*4f1223e8SApple OSS Distributions 181*4f1223e8SApple OSS Distributions extern int inet6_dgram_socket_get(void); 182*4f1223e8SApple OSS Distributions void inet6_dgram_socket_close(void); 183*4f1223e8SApple OSS Distributions 184*4f1223e8SApple OSS Distributions extern int ifnet_create(const char * ifname); 185*4f1223e8SApple OSS Distributions 186*4f1223e8SApple OSS Distributions extern int ifnet_create_2(char * ifname, size_t len); 187*4f1223e8SApple OSS Distributions 188*4f1223e8SApple OSS Distributions extern int ifnet_destroy(const char * ifname, bool fail_on_error); 189*4f1223e8SApple OSS Distributions 190*4f1223e8SApple OSS Distributions extern void ifnet_get_lladdr(const char * ifname, ether_addr_t * eaddr); 191*4f1223e8SApple OSS Distributions 192*4f1223e8SApple OSS Distributions extern void ifnet_attach_ip(char * name); 193*4f1223e8SApple OSS Distributions 194*4f1223e8SApple OSS Distributions extern void ifnet_start_ipv6(const char * ifname); 195*4f1223e8SApple OSS Distributions 196*4f1223e8SApple OSS Distributions extern int ifnet_set_lladdr(const char * ifname, ether_addr_t * eaddr); 197*4f1223e8SApple OSS Distributions 198*4f1223e8SApple OSS Distributions extern int ifnet_set_flags(const char * ifname, 199*4f1223e8SApple OSS Distributions uint16_t flags_set, uint16_t flags_clear); 200*4f1223e8SApple OSS Distributions 201*4f1223e8SApple OSS Distributions extern void ifnet_add_ip_address(char *ifname, struct in_addr addr, 202*4f1223e8SApple OSS Distributions struct in_addr mask); 203*4f1223e8SApple OSS Distributions 204*4f1223e8SApple OSS Distributions extern int ifnet_set_mtu(const char * ifname, int mtu); 205*4f1223e8SApple OSS Distributions 206*4f1223e8SApple OSS Distributions extern int siocdrvspec(const char * ifname, 207*4f1223e8SApple OSS Distributions u_long op, void *arg, size_t argsize, bool set); 208*4f1223e8SApple OSS Distributions 209*4f1223e8SApple OSS Distributions extern void fake_set_peer(const char * feth, const char * feth_peer); 210*4f1223e8SApple OSS Distributions 211*4f1223e8SApple OSS Distributions extern void siocsifvlan(const char * vlan, const char * phys, uint16_t tag); 212*4f1223e8SApple OSS Distributions 213*4f1223e8SApple OSS Distributions extern void route_add_inet_scoped_subnet(char * ifname, u_short if_index, 214*4f1223e8SApple OSS Distributions struct in_addr ifa, struct in_addr mask); 215*4f1223e8SApple OSS Distributions 216*4f1223e8SApple OSS Distributions extern u_int ethernet_udp4_frame_populate(void * buf, size_t buf_len, 217*4f1223e8SApple OSS Distributions const ether_addr_t * src, 218*4f1223e8SApple OSS Distributions struct in_addr src_ip, 219*4f1223e8SApple OSS Distributions uint16_t src_port, 220*4f1223e8SApple OSS Distributions const ether_addr_t * dst, 221*4f1223e8SApple OSS Distributions struct in_addr dst_ip, 222*4f1223e8SApple OSS Distributions uint16_t dst_port, 223*4f1223e8SApple OSS Distributions const void * data, u_int data_len); 224*4f1223e8SApple OSS Distributions 225*4f1223e8SApple OSS Distributions extern u_int 226*4f1223e8SApple OSS Distributions ethernet_udp6_frame_populate(void * buf, size_t buf_len, 227*4f1223e8SApple OSS Distributions const ether_addr_t * src, 228*4f1223e8SApple OSS Distributions struct in6_addr *src_ip, 229*4f1223e8SApple OSS Distributions uint16_t src_port, 230*4f1223e8SApple OSS Distributions const ether_addr_t * dst, 231*4f1223e8SApple OSS Distributions struct in6_addr * dst_ip, 232*4f1223e8SApple OSS Distributions uint16_t dst_port, 233*4f1223e8SApple OSS Distributions const void * data, u_int data_len); 234*4f1223e8SApple OSS Distributions 235*4f1223e8SApple OSS Distributions 236*4f1223e8SApple OSS Distributions extern u_int make_dhcp_payload(dhcp_min_payload_t payload, ether_addr_t *eaddr); 237*4f1223e8SApple OSS Distributions 238*4f1223e8SApple OSS Distributions extern bool has_ipv4_default_route(void); 239*4f1223e8SApple OSS Distributions 240*4f1223e8SApple OSS Distributions extern bool has_ipv6_default_route(void); 241*4f1223e8SApple OSS Distributions 242*4f1223e8SApple OSS Distributions extern int bridge_add_member(const char * bridge, const char * member); 243*4f1223e8SApple OSS Distributions 244*4f1223e8SApple OSS Distributions #endif /* __net_test_lib_h__ */ 245