blob: a70abe1ca0c52eb9ce9da448a266a0c9ad03b79a [file] [log] [blame] [edit]
/*
* Copyright (c) 2022 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.
*/
#ifndef DNS_OBJ_RR_PRIVATE_H
#define DNS_OBJ_RR_PRIVATE_H
//======================================================================================================================
// MARK: - Headers
#include "dns_obj_rr.h"
#include "dns_obj.h"
#include "dns_common.h"
#include <stdint.h>
#include <stdbool.h>
#include "nullability.h"
//======================================================================================================================
// MARK: - DNS Resource Record Kind Definition
typedef char * NULLABLE
(*dns_obj_rr_copy_rdata_rfc_description_f)(dns_obj_rr_t NONNULL record, dns_obj_error_t * NULLABLE out_error);
struct dns_obj_rr_s {
struct ref_count_obj_s base; // The reference count and kind support base.
dns_obj_domain_name_t NULLABLE name; // The name of the resource record.
union {
const uint8_t * NULLABLE const_rdata; // The pointer to the rdata that is valid for the life time of this resource record object.
uint8_t * NULLABLE allocated_rdata; // The pointer to the rdata that is allocated when initializing this resource record object.
} rdata_u;
uint16_t type; // The DNS data type of the record.
uint16_t class; // The DNS class of the record.
uint16_t rdata_len; // The length of the rdata.
bool allocated_memory; // Indicate whether the domain name labels in the name of
// the resource record and the rdata point to an external
// memory or is allocated.
uint32_t ttl; // The real TTL of the resource record.
uint32_t original_ttl; // The original TTL value specified by RRSIG.
uint8_t rrsig_labels; // The labels value specified by RRSIG
uint8_t * NULLABLE signed_data; // The signed data of the resource record that is used for DNSSEC validation.
size_t signed_data_len; // The length of the signed data above.
dns_obj_rr_copy_rdata_rfc_description_f NULLABLE copy_rdata_rfc_description_method; // The method that can be customized for each RR type to generate the rdata description.
};
// The member initialization function to be called by the subkind of the resource record object.
typedef void
(*dns_obj_rr_init_fields_f)(dns_obj_rr_t NONNULL uninitialized_record, const uint8_t * NONNULL name, uint16_t type,
uint16_t class, const uint8_t * NULLABLE rdata, uint16_t rdata_len, bool allocate,
dns_obj_rr_copy_rdata_rfc_description_f NULLABLE copy_rdata_rfc_description_method, dns_obj_error_t * NULLABLE out_error);
void
dns_obj_rr_init_fields(dns_obj_rr_t NONNULL uninitialized_record, const uint8_t * NONNULL name, uint16_t type,
uint16_t class, const uint8_t * NULLABLE rdata, uint16_t rdata_len, bool allocate,
dns_obj_rr_copy_rdata_rfc_description_f NULLABLE copy_rdata_rfc_description_method, dns_obj_error_t * NULLABLE out_error);
// The resource record kind type for a subkind of the resource record object.
DNS_OBJECT_DEFINE_KIND_TYPE_FOR_SUBKIND(rr,
uint16_t rr_type; // Any subkind of the resource record should have a specific DNS type.
dns_obj_rr_copy_rdata_rfc_description_f NONNULL copy_rdata_rfc_description_method;
);
#endif // DNS_OBJ_RR_PRIVATE_H