#ifndef RDATA_H
#define RDATA_H
#include "dns.h"
#include "namedb.h"
#define APL_NEGATION_MASK 0x80U
#define APL_LENGTH_MASK (~APL_NEGATION_MASK)
#define AMTRELAY_DISCOVERY_OPTIONAL_MASK 0x80U
#define AMTRELAY_TYPE_MASK 0x7fU
extern lookup_table_type dns_certificate_types[];
extern lookup_table_type dns_algorithms[];
typedef int(*nsd_print_svcparam_rdata_type)(
struct buffer* output,
uint16_t svcparamkey,
const uint8_t* data,
uint16_t datalen);
typedef struct nsd_svcparam_descriptor nsd_svcparam_descriptor_type;
struct nsd_svcparam_descriptor {
uint16_t key;
const char *name;
nsd_print_svcparam_rdata_type print_rdata;
};
int print_unknown_rdata_field(buffer_type *output,
const nsd_type_descriptor_type *descriptor, const rr_type *rr);
int print_unknown_rdata(buffer_type *output,
const nsd_type_descriptor_type *descriptor, const rr_type *rr);
int print_rdata(buffer_type *output, const nsd_type_descriptor_type *descriptor,
const rr_type *rr);
int32_t read_generic_rdata(struct domain_table *domains, uint16_t rdlength,
struct buffer *packet, struct rr **rr);
void write_generic_rdata(struct query *query, const struct rr *rr);
int print_generic_rdata(struct buffer *output, const struct rr *rr);
int32_t read_compressed_name_rdata(struct domain_table *domains,
uint16_t rdlength, struct buffer *packet, struct rr **rr);
void write_compressed_name_rdata(struct query *query, const struct rr *rr);
int print_name_rdata(struct buffer *output, const struct rr *rr);
int32_t read_uncompressed_name_rdata(struct domain_table *domains,
uint16_t rdlength, struct buffer *packet, struct rr **rr);
void write_uncompressed_name_rdata(struct query *query, const struct rr *rr);
int32_t read_a_rdata(struct domain_table *domains, uint16_t rdlength,
struct buffer *packet, struct rr **rr);
int print_a_rdata(struct buffer *output, const struct rr *rr);
int32_t read_soa_rdata(struct domain_table *domains, uint16_t rdlength,
struct buffer *packet, struct rr **rr);
void write_soa_rdata(struct query *query, const struct rr *rr);
int print_soa_rdata(struct buffer *output, const struct rr *rr);
int print_soa_rdata_twoline(struct buffer *output, const struct rr *rr);
int32_t read_wks_rdata(struct domain_table *domains, uint16_t rdlength,
struct buffer *packet, struct rr **rr);
int print_wks_rdata(struct buffer *output, const struct rr *rr);
int32_t read_hinfo_rdata(struct domain_table *domains, uint16_t rdlength,
struct buffer *packet, struct rr **rr);
int print_hinfo_rdata(struct buffer *output, const struct rr *rr);
int32_t read_minfo_rdata(struct domain_table *domains, uint16_t rdlength,
struct buffer *packet, struct rr **rr);
void write_minfo_rdata(struct query *query, const struct rr *rr);
int print_minfo_rdata(struct buffer *output, const struct rr *rr);
int32_t read_mx_rdata(struct domain_table *domains, uint16_t rdlength,
struct buffer *packet, struct rr **rr);
void write_mx_rdata(struct query *query, const struct rr *rr);
int print_mx_rdata(struct buffer *output, const struct rr *rr);
int32_t read_txt_rdata(struct domain_table *domains, uint16_t rdlength,
struct buffer *packet, struct rr **rr);
int print_txt_rdata(struct buffer *output, const struct rr *rr);
int32_t read_rp_rdata(struct domain_table *domains, uint16_t rdlength,
struct buffer *packet, struct rr **rr);
void write_rp_rdata(struct query *query, const struct rr *rr);
int print_rp_rdata(struct buffer *output, const struct rr *rr);
int32_t read_afsdb_rdata(struct domain_table *domains, uint16_t rdlength,
struct buffer *packet, struct rr **rr);
void write_afsdb_rdata(struct query *query, const struct rr *rr);
int print_afsdb_rdata(struct buffer *output, const struct rr *rr);
int32_t read_x25_rdata(struct domain_table *domains, uint16_t rdlength,
struct buffer *packet, struct rr **rr);
int print_x25_rdata(struct buffer *output, const struct rr *rr);
int32_t read_isdn_rdata(struct domain_table *domains, uint16_t rdlength,
struct buffer *packet, struct rr **rr);
int print_isdn_rdata(struct buffer *output, const struct rr *rr);
int32_t read_rt_rdata(struct domain_table *domains, uint16_t rdlength,
struct buffer *packet, struct rr **rr);
void write_rt_rdata(struct query *query, const struct rr *rr);
int print_nsap_rdata(struct buffer *output, const struct rr *rr);
int print_nsap_ptr_rdata(struct buffer *output, const struct rr *rr);
int print_key_rdata(struct buffer *output, const struct rr *rr);
int32_t read_px_rdata(struct domain_table *domains, uint16_t rdlength,
struct buffer *packet, struct rr **rr);
void write_px_rdata(struct query *query, const struct rr *rr);
int print_px_rdata(struct buffer *output, const struct rr *rr);
int print_gpos_rdata(struct buffer *output, const struct rr *rr);
int32_t read_aaaa_rdata(struct domain_table *domains, uint16_t rdlength,
struct buffer *packet, struct rr **rr);
int print_aaaa_rdata(struct buffer *output, const struct rr *rr);
int32_t read_loc_rdata(struct domain_table *domains, uint16_t rdlength,
struct buffer *packet, struct rr **rr);
int print_loc_rdata(struct buffer *output, const struct rr *rr);
int32_t read_nxt_rdata(struct domain_table *domains, uint16_t rdlength,
struct buffer *packet, struct rr **rr);
void write_nxt_rdata(struct query *query, const struct rr *rr);
int print_nxt_rdata(struct buffer *output, const struct rr *rr);
int print_eid_rdata(struct buffer *output, const struct rr *rr);
int print_nimloc_rdata(struct buffer *output, const struct rr *rr);
int32_t read_srv_rdata(struct domain_table *domains, uint16_t rdlength,
struct buffer *packet, struct rr **rr);
void write_srv_rdata(struct query *query, const struct rr *rr);
int print_srv_rdata(struct buffer *output, const struct rr *rr);
int print_atma_rdata(struct buffer *output, const struct rr *rr);
int32_t read_naptr_rdata(struct domain_table *domains, uint16_t rdlength,
struct buffer *packet, struct rr **rr);
void write_naptr_rdata(struct query *query, const struct rr *rr);
int print_naptr_rdata(struct buffer *output, const struct rr *rr);
int32_t read_kx_rdata(struct domain_table *domains, uint16_t rdlength,
struct buffer *packet, struct rr **rr);
void write_kx_rdata(struct query *query, const struct rr *rr);
int32_t read_cert_rdata(struct domain_table *domains, uint16_t rdlength,
struct buffer *packet, struct rr **rr);
int print_cert_rdata(struct buffer *output, const struct rr *rr);
int print_sink_rdata(struct buffer *output, const struct rr *rr);
int32_t read_apl_rdata(struct domain_table *domains, uint16_t rdlength,
struct buffer *packet, struct rr **rr);
int print_apl_rdata(struct buffer *output, const struct rr *rr);
int32_t read_ds_rdata(struct domain_table *domains, uint16_t rdlength,
struct buffer *packet, struct rr **rr);
int print_ds_rdata(struct buffer *output, const struct rr *rr);
int32_t read_sshfp_rdata(struct domain_table *domains, uint16_t rdlength,
struct buffer *packet, struct rr **rr);
int print_sshfp_rdata(struct buffer *output, const struct rr *rr);
int32_t read_ipseckey_rdata(struct domain_table *domains, uint16_t rdlength,
struct buffer *packet, struct rr **rr);
int print_ipseckey_rdata(struct buffer *output, const struct rr *rr);
int32_t ipseckey_gateway_length(uint16_t rdlength, const uint8_t *rdata,
uint16_t offset, struct domain** domain);
int32_t read_rrsig_rdata(struct domain_table *domains, uint16_t rdlength,
struct buffer *packet, struct rr **rr);
int print_rrsig_rdata(struct buffer *output, const struct rr *rr);
int32_t read_nsec_rdata(struct domain_table *domains, uint16_t rdlength,
struct buffer *packet, struct rr **rr);
int print_nsec_rdata(struct buffer *output, const struct rr *rr);
int32_t read_dnskey_rdata(struct domain_table *domains, uint16_t rdlength,
struct buffer *packet, struct rr **rr);
int print_dnskey_rdata(struct buffer *output, const struct rr *rr);
int32_t read_dhcid_rdata(struct domain_table *domains, uint16_t rdlength,
struct buffer *packet, struct rr **rr);
int print_dhcid_rdata(struct buffer *output, const struct rr *rr);
int32_t read_nsec3_rdata(struct domain_table *domains, uint16_t rdlength,
struct buffer *packet, struct rr **rr);
int print_nsec3_rdata(struct buffer *output, const struct rr *rr);
int32_t read_nsec3param_rdata(struct domain_table *domains, uint16_t rdlength,
struct buffer *packet, struct rr **rr);
int print_nsec3param_rdata(struct buffer *output, const struct rr *rr);
int32_t read_tlsa_rdata(struct domain_table *domains, uint16_t rdlength,
struct buffer *packet, struct rr **rr);
int print_tlsa_rdata(struct buffer *output, const struct rr *rr);
int32_t read_hip_rdata(struct domain_table *domains, uint16_t rdlength,
struct buffer *packet, struct rr **rr);
int print_hip_rdata(struct buffer *output, const struct rr *rr);
int32_t read_rkey_rdata(struct domain_table *domains, uint16_t rdlength,
struct buffer *packet, struct rr **rr);
int print_rkey_rdata(struct buffer *output, const struct rr *rr);
int32_t read_talink_rdata(struct domain_table *domains, uint16_t rdlength,
struct buffer *packet, struct rr **rr);
int print_talink_rdata(struct buffer *output, const struct rr *rr);
int print_openpgpkey_rdata(struct buffer *output, const struct rr *rr);
int32_t read_csync_rdata(struct domain_table *domains, uint16_t rdlength,
struct buffer *packet, struct rr **rr);
int print_csync_rdata(struct buffer *output, const struct rr *rr);
int32_t read_zonemd_rdata(struct domain_table *domains, uint16_t rdlength,
struct buffer *packet, struct rr **rr);
int print_zonemd_rdata(struct buffer *output, const struct rr *rr);
int32_t read_svcb_rdata(struct domain_table *domains, uint16_t rdlength,
struct buffer *packet, struct rr **rr);
void write_svcb_rdata(struct query *query, const struct rr *rr);
int print_svcb_rdata(struct buffer *output, const struct rr *rr);
int32_t read_dsync_rdata(struct domain_table *domains, uint16_t rdlength,
struct buffer *packet, struct rr **rr);
int print_dsync_rdata(struct buffer *output, const struct rr *rr);
int32_t read_nid_rdata(struct domain_table *domains, uint16_t rdlength,
struct buffer *packet, struct rr **rr);
int print_nid_rdata(struct buffer *output, const struct rr *rr);
int32_t read_l32_rdata(struct domain_table *domains, uint16_t rdlength,
struct buffer *packet, struct rr **rr);
int print_l32_rdata(struct buffer *output, const struct rr *rr);
int32_t read_l64_rdata(struct domain_table *domains, uint16_t rdlength,
struct buffer *packet, struct rr **rr);
int print_l64_rdata(struct buffer *output, const struct rr *rr);
int32_t read_lp_rdata(struct domain_table *domains, uint16_t rdlength,
struct buffer *packet, struct rr **rr);
void write_lp_rdata(struct query *query, const struct rr *rr);
int print_lp_rdata(struct buffer *output, const struct rr *rr);
int32_t read_eui48_rdata(struct domain_table *domains, uint16_t rdlength,
struct buffer *packet, struct rr **rr);
int print_eui48_rdata(struct buffer *output, const struct rr *rr);
int32_t read_eui64_rdata(struct domain_table *domains, uint16_t rdlength,
struct buffer *packet, struct rr **rr);
int print_eui64_rdata(struct buffer *output, const struct rr *rr);
int32_t read_uri_rdata(struct domain_table *domains, uint16_t rdlength,
struct buffer *packet, struct rr **rr);
int print_uri_rdata(struct buffer *output, const struct rr *rr);
int print_resinfo_rdata(struct buffer *output, const struct rr *rr);
int32_t read_caa_rdata(struct domain_table *domains, uint16_t rdlength,
struct buffer *packet, struct rr **rr);
int print_caa_rdata(struct buffer *output, const struct rr *rr);
int print_doa_rdata(struct buffer *output, const struct rr *rr);
int32_t read_amtrelay_rdata(struct domain_table *domains, uint16_t rdlength,
struct buffer *packet, struct rr **rr);
int print_amtrelay_rdata(struct buffer *output, const struct rr *rr);
int32_t amtrelay_relay_length(uint16_t rdlength, const uint8_t *rdata,
uint16_t offset, struct domain** domain);
int print_ipn_rdata(struct buffer *output, const struct rr *rr);
int32_t read_dlv_rdata(struct domain_table *domains, uint16_t rdlength,
struct buffer *packet, struct rr **rr);
int print_dlv_rdata(struct buffer *output, const struct rr *rr);
int32_t rr_calculate_uncompressed_rdata_length(const rr_type* rr);
void rr_write_uncompressed_rdata(const rr_type* rr, uint8_t* buf, size_t len);
int lookup_rdata_field_entry(const nsd_type_descriptor_type* descriptor,
size_t index, const rr_type* rr, uint16_t offset, uint16_t* field_len,
struct domain** domain);
int lookup_rdata_field_entry_uncompressed_wire(
const nsd_type_descriptor_type* descriptor, size_t index,
const uint8_t* rdata, uint16_t rdlength, uint16_t offset,
uint16_t* field_len, struct domain** domain);
int equal_rr_rdata(const nsd_type_descriptor_type *descriptor,
const struct rr *rr1, const struct rr *rr2);
int equal_rr_rdata_uncompressed_wire(const nsd_type_descriptor_type *descriptor,
const struct rr *rr1, const uint8_t* rr2_rdata, uint16_t rr2_rdlen);
struct domain* retrieve_rdata_ref_domain_offset(const struct rr* rr,
uint16_t offset);
struct domain* retrieve_rdata_ref_domain(const struct rr* rr);
typedef struct domain*(*nsd_rdata_ref_domain_type)(
const struct rr* rr);
struct domain* retrieve_ns_ref_domain(const struct rr* rr);
struct domain* retrieve_cname_ref_domain(const struct rr* rr);
struct domain* retrieve_dname_ref_domain(const struct rr* rr);
struct domain* retrieve_mb_ref_domain(const struct rr* rr);
struct domain* retrieve_mx_ref_domain(const struct rr* rr);
struct domain* retrieve_kx_ref_domain(const struct rr* rr);
struct domain* retrieve_rt_ref_domain(const struct rr* rr);
struct domain* retrieve_srv_ref_domain(const struct rr* rr);
struct domain* retrieve_ptr_ref_domain(const struct rr* rr);
int retrieve_soa_rdata_serial(const struct rr* rr, uint32_t* serial);
int retrieve_soa_rdata_minttl(const struct rr* rr, uint32_t* minttl);
struct dname* retrieve_cname_ref_dname(const struct rr* rr);
static inline struct domain* rdata_domain_ref(const struct rr* rr) {
struct domain* domain;
assert(rr->rdlength >= (uint16_t)sizeof(void*));
memcpy(&domain, rr->rdata, sizeof(void*));
return domain;
}
static inline struct domain* rdata_domain_ref_offset(const struct rr* rr,
uint16_t offset) {
struct domain* domain;
assert(rr->rdlength >= offset+(uint16_t)sizeof(void*));
memcpy(&domain, rr->rdata+offset, sizeof(void*));
return domain;
}
void rr_lower_usage(namedb_type* db, rr_type* rr);
const char* read_rdata_fail_str(int32_t code);
#endif