blob: 9ca19ffb128311f75be382684a5ed45fface54f6 [file] [log] [blame]
/*
* Copyright (c) 2018, 2021 Apple Inc. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "DNSCommon.h" // Defines general DNS utility routines
#include "unittest_common.h"
#include "mDNSFeatures.h"
mDNSexport mStatus mDNS_InitStorage_ut(mDNS *const m, mDNS_PlatformSupport *const p,
CacheEntity *rrcachestorage, mDNSu32 rrcachesize,
mDNSBool AdvertiseLocalAddresses, mDNSCallback *Callback, void *Context)
{
return mDNS_InitStorage(m, p, rrcachestorage, rrcachesize, AdvertiseLocalAddresses, Callback, Context);
}
#if MDNSRESPONDER_SUPPORTS(APPLE, DNSSECv2)
void
ParseCNameChainFromMessage_ut(
const DNSMessage *const response,
const mDNSu8 *const limit,
const mDNSInterfaceID InterfaceID,
const domainname *const qname,
domainname cnameChain[static const MAX_CNAME_TRAVERSAL],
mDNSu32 *const outChainLen)
{
ParseCNameChainFromMessage(response, limit, InterfaceID, qname, cnameChain, outChainLen);
}
void
ParseDenialOfExistenceObjsFromMessage_ut(
const DNSMessage *const response,
const mDNSu8 *const limit,
const mDNSInterfaceID InterfaceID,
dnssec_obj_rr_soa_t *const outObjSOA,
dnssec_obj_rr_rrsig_t objSOARRSIG[static const MAX_NUM_RRSIG_TO_PROCESS],
mDNSu8 *const outSOARRSIGCount,
dnssec_obj_rr_nsec_t outObjNSECs[static const MAX_NUM_NSEC_NSEC3_TO_PROCESS],
mDNSu8 *const outNSECCount,
dnssec_obj_rr_nsec3_t outObjNSEC3s[static const MAX_NUM_NSEC_NSEC3_TO_PROCESS],
mDNSu8 *const outNSEC3Count,
dnssec_obj_rr_rrsig_t outObjRRSIGs[static const MAX_NUM_RRSIG_TO_PROCESS],
mDNSu8 *const outRRSIGCount)
{
ParseDenialOfExistenceObjsFromMessage(response, limit, InterfaceID, outObjSOA, objSOARRSIG, outSOARRSIGCount,
outObjNSECs, outNSECCount, outObjNSEC3s, outNSEC3Count, outObjRRSIGs, outRRSIGCount);
}
// This function extracts the resource record from the answer section of the message, and determine what type of record
// is contained in the answer section:
// 1. If there are only CNAME records, kDNSType_CNAME will be returned.
// 2. If there are DNS record other than CNAME record, the other data type will be returned.
// 3. If no record is contained in the answer section, 0 will be returned.
// This function is only used in the XCTest to help the test of wildcard data response since this kind of denial of
// existence is always accompanied by the No Error data that comes from wildcard matching.
mDNSu16
GetRRTypeFromMessage(const DNSMessage * const response, const mDNSu8 * const limit, const mDNSInterfaceID InterfaceID)
{
mDNSu16 rrtype = 0;
const mDNSu16 answerCount = response->h.numAnswers;
if (answerCount == 0) {
goto exit;
}
const mDNSu8 *ptr = LocateAnswers(response, limit);
if (ptr == mDNSNULL) {
goto exit;
}
mDNS *const m = &mDNSStorage;
for (mDNSu32 i = 0; i < answerCount && ptr < limit; mDNSCoreResetRecord(m), i++) {
ptr = GetLargeResourceRecord(m, response, ptr, limit, InterfaceID, kDNSRecordTypePacketAuth, &m->rec);
const ResourceRecord *const rr = &(m->rec.r.resrec);
if (rr->RecordType == kDNSRecordTypePacketNegative) {
continue;
}
if (rrtype == 0 || rrtype == kDNSType_CNAME) {
rrtype = rr->rrtype;
}
}
exit:
return rrtype;
}
#endif // MDNSRESPONDER_SUPPORTS(APPLE, DNSSECv2)