1 /* 2 * Copyright (c) 2016-2021 Apple Inc. All rights reserved. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * https://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #ifndef UNITTEST_COMMON_H 18 #define UNITTEST_COMMON_H 19 20 #include "dns_sd.h" 21 #include "uds_daemon.h" 22 #include "uDNS.h" 23 #include "dnssd_ipc.h" 24 #include <netdb.h> // for getaddrinfo 25 #include <net/if.h> 26 #include <pthread.h> 27 #include <CoreFoundation/CoreFoundation.h> 28 #include "mDNSFeatures.h" 29 30 // Primary interface info that is used when simulating the receive of the response packet 31 extern mDNSInterfaceID primary_interfaceID; 32 extern mDNSAddr primary_v4; 33 extern mDNSAddr primary_v6; 34 extern mDNSAddr primary_router; 35 36 // Arbitrary values to simulate a client_request request 37 #define client_req_sd 12 38 #define client_req_uid 502 39 #define client_req_hdr_bytes 28 40 #define client_req_hdr_version 1 41 #define client_resp_src_port 13568 42 #define client_resp_dst_port 49339 43 #define uDNS_TargetQID 16745 44 #define client_req_process_id 15418 45 static char client_req_pid_name[MAXCOMLEN] = "mDNSUnitTest"; 46 47 //Arbitrary values to simulate a DNS server 48 #define dns_server_timeout 30 49 #define dns_server_resGroupID 12 50 static const mDNSv4Addr dns_server_ipv4 = {{ 192, 168, 1, 20 }}; 51 52 extern mStatus init_mdns_environment(mDNSBool enableLogging); 53 extern mStatus init_mdns_storage(void); 54 extern size_t get_reply_len(char* name, uint16_t rdlen); 55 extern mStatus start_client_request(request_state* req, const uint8_t *msgbuf, uint32_t msgsz, uint32_t op, UDPSocket* socket); 56 extern void receive_response(const request_state* req, DNSMessage *msg, size_t msgSize); 57 extern void get_ip(const char *const name, struct sockaddr_storage *result); 58 extern void free_req(request_state* req); 59 60 extern mStatus mDNS_InitStorage_ut(mDNS *const m, mDNS_PlatformSupport *const p, 61 CacheEntity *rrcachestorage, mDNSu32 rrcachesize, 62 mDNSBool AdvertiseLocalAddresses, mDNSCallback *Callback, void *Context); 63 64 #if MDNSRESPONDER_SUPPORTS(APPLE, DNSSECv2) 65 66 #define MAX_CNAME_TRAVERSAL 11 67 void 68 ParseCNameChainFromMessage_ut( 69 const DNSMessage * response, 70 const mDNSu8 * limit, 71 const mDNSInterfaceID InterfaceID, 72 const domainname * qname, 73 domainname cnameChain[static MAX_CNAME_TRAVERSAL], 74 mDNSu32 * outChainLen); 75 76 #define MAX_NUM_NSEC_NSEC3_TO_PROCESS 10 77 #define MAX_NUM_RRSIG_TO_PROCESS 30 78 void 79 ParseDenialOfExistenceObjsFromMessage_ut( 80 const DNSMessage * response, 81 const mDNSu8 * limit, 82 const mDNSInterfaceID InterfaceID, 83 dnssec_obj_rr_soa_t * outObjSOA, 84 dnssec_obj_rr_rrsig_t objSOARRSIG[static MAX_NUM_RRSIG_TO_PROCESS], 85 mDNSu8 * outSOARRSIGCount, 86 dnssec_obj_rr_nsec_t outObjNSECs[static MAX_NUM_NSEC_NSEC3_TO_PROCESS], 87 mDNSu8 * outNSECCount, 88 dnssec_obj_rr_nsec3_t outObjNSEC3s[static MAX_NUM_NSEC_NSEC3_TO_PROCESS], 89 mDNSu8 * outNSEC3Count, 90 dnssec_obj_rr_rrsig_t outObjRRSIGs[static MAX_NUM_RRSIG_TO_PROCESS], 91 mDNSu8 * outRRSIGCount); 92 93 mDNSu16 94 GetRRTypeFromMessage(const DNSMessage *response, const mDNSu8 *limit, mDNSInterfaceID InterfaceID); 95 96 #endif 97 98 extern void init_logging_ut(void); 99 extern void SetInterfaces_ut(mDNSInterfaceID* primary_interfaceID, mDNSAddr *primary_v4, 100 mDNSAddr* primary_v6, mDNSAddr* primary_router); 101 extern mStatus handle_client_request_ut(void *req); 102 extern void LogCacheRecords_ut(mDNSs32 now, mDNSu32* retCacheUsed, mDNSu32* retCacheActive); 103 extern int LogEtcHosts_ut(mDNS *const m); 104 extern mDNSBool mDNSMacOSXCreateEtcHostsEntry_ut(const domainname *domain, const struct sockaddr *sa, 105 const domainname *cname, char *ifname, AuthHash *auth); 106 extern void UpdateEtcHosts_ut(void *context); 107 extern mStatus AddDNSServer_ut(void); 108 extern mStatus AddDNSServerScoped_ut(mDNSInterfaceID interfaceID, ScopeType scoped); 109 extern mStatus force_uDNS_SetupDNSConfig_ut(mDNS *const m); 110 extern mStatus verify_cache_addr_order_for_domain_ut(mDNS *const m, mDNSu8* octet, mDNSu32 count, const domainname *const name); 111 112 // HelperFunctionTest 113 extern void mDNSDomainLabelFromCFString_ut(CFStringRef cfs, domainlabel *const namelabel); 114 mDNSexport mDNSu32 IndexForInterfaceByName_ut(const char *ifname); 115 116 #endif /* UNITTEST_COMMON_H */ 117