blob: 0153d39855db8c30e002cadb528cfb3e42ca8c10 [file] [log] [blame] [edit]
/*
* Copyright (c) 2022-2024 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.
*/
//======================================================================================================================
// MARK: - Headers
#include "dns_obj_log.h"
#include "dns_common.h"
#include "dns_sd.h"
#include "dns_assert_macros.h"
#include "mdns_strict.h"
//======================================================================================================================
// MARK: - Public Functions
uint16_t
get_uint16_from_bytes(const uint8_t * const bytes)
{
return (uint16_t)((uint16_t)bytes[0] << 8 |
(uint16_t)bytes[1]);
}
//======================================================================================================================
uint32_t
get_uint32_from_bytes(const uint8_t * const bytes)
{
return (uint32_t)((uint32_t)bytes[0] << 24 |
(uint32_t)bytes[1] << 16 |
(uint32_t)bytes[2] << 8 |
(uint32_t)bytes[3]);
}
//======================================================================================================================
static uint8_t *
_write_uint16_to_bytes(uint8_t *ptr, const uint16_t u16)
{
*ptr++ = (uint8_t)((u16 >> 8) & 0xFF);
*ptr++ = (uint8_t)( u16 & 0xFF);
return ptr;
}
void
put_uint16_to_bytes(const uint16_t u16, uint8_t ** const ptr)
{
*ptr = _write_uint16_to_bytes(*ptr, u16);
}
//======================================================================================================================
static uint8_t *
_write_uint32_to_bytes(uint8_t *ptr, const uint32_t u32)
{
*ptr++ = (uint8_t)((u32 >> 24) & 0xFF);
*ptr++ = (uint8_t)((u32 >> 16) & 0xFF);
*ptr++ = (uint8_t)((u32 >> 8) & 0xFF);
*ptr++ = (uint8_t)( u32 & 0xFF);
return ptr;
}
void
put_uint32_to_bytes(const uint32_t u32, uint8_t ** const ptr)
{
*ptr = _write_uint32_to_bytes(*ptr, u32);
}
//======================================================================================================================
char *
put_hex_from_bytes(const uint8_t * const bytes, const size_t len, char * const buffer, const size_t buffer_len)
{
if (bytes == NULL || len == 0) {
return buffer;
}
if (buffer_len <= len * 2) {
return buffer;
}
char *ptr = buffer;
const char * const limit = buffer + buffer_len;
for (size_t i = 0; i < len; i++) {
ptr += snprintf(ptr, (size_t)(limit - ptr), "%02X", bytes[i]);
}
return ptr;
}
//======================================================================================================================
const char *
dns_record_type_value_to_string(const uint16_t type)
{
switch(type)
{
case kDNSRecordType_A: return("A");
case kDNSRecordType_NS: return("NS");
case kDNSRecordType_MD: return("MD");
case kDNSRecordType_MF: return("MF");
case kDNSRecordType_CNAME: return("CNAME");
case kDNSRecordType_SOA: return("SOA");
case kDNSRecordType_MB: return("MB");
case kDNSRecordType_MG: return("MG");
case kDNSRecordType_MR: return("MR");
case kDNSRecordType_NULL: return("NULL");
case kDNSRecordType_WKS: return("WKS");
case kDNSRecordType_PTR: return("PTR");
case kDNSRecordType_HINFO: return("HINFO");
case kDNSRecordType_MINFO: return("MINFO");
case kDNSRecordType_MX: return("MX");
case kDNSRecordType_TXT: return("TXT");
case kDNSRecordType_RP: return("RP");
case kDNSRecordType_AFSDB: return("AFSDB");
case kDNSRecordType_X25: return("X25");
case kDNSRecordType_ISDN: return("ISDN");
case kDNSRecordType_RT: return("RT");
case kDNSRecordType_NSAP: return("NSAP");
case kDNSRecordType_NSAP_PTR: return("NSAP-PTR");
case kDNSRecordType_SIG: return("SIG");
case kDNSRecordType_KEY: return("KEY");
case kDNSRecordType_PX: return("PX");
case kDNSRecordType_GPOS: return("GPOS");
case kDNSRecordType_AAAA: return("AAAA");
case kDNSRecordType_LOC: return("LOC");
case kDNSRecordType_NXT: return("NXT");
case kDNSRecordType_EID: return("EID");
case kDNSRecordType_NIMLOC: return("NIMLOC");
case kDNSRecordType_SRV: return("SRV");
case kDNSRecordType_ATMA: return("ATMA");
case kDNSRecordType_NAPTR: return("NAPTR");
case kDNSRecordType_KX: return("KX");
case kDNSRecordType_CERT: return("CERT");
case kDNSRecordType_A6: return("A6");
case kDNSRecordType_DNAME: return("DNAME");
case kDNSRecordType_SINK: return("SINK");
case kDNSRecordType_OPT: return("OPT");
case kDNSRecordType_APL: return("APL");
case kDNSRecordType_DS: return("DS");
case kDNSRecordType_SSHFP: return("SSHFP");
case kDNSRecordType_IPSECKEY: return("IPSECKEY");
case kDNSRecordType_RRSIG: return("RRSIG");
case kDNSRecordType_NSEC: return("NSEC");
case kDNSRecordType_DNSKEY: return("DNSKEY");
case kDNSRecordType_DHCID: return("DHCID");
case kDNSRecordType_NSEC3: return("NSEC3");
case kDNSRecordType_NSEC3PARAM: return("NSEC3PARAM");
case kDNSRecordType_TLSA: return("TLSA");
case kDNSRecordType_SMIMEA: return("SMIMEA");
case kDNSRecordType_HIP: return("HIP");
case kDNSRecordType_NINFO: return("NINFO");
case kDNSRecordType_RKEY: return("RKEY");
case kDNSRecordType_TALINK: return("TALINK");
case kDNSRecordType_CDS: return("CDS");
case kDNSRecordType_CDNSKEY: return("CDNSKEY");
case kDNSRecordType_OPENPGPKEY: return("OPENPGPKEY");
case kDNSRecordType_CSYNC: return("CSYNC");
case kDNSRecordType_ZONEMD: return("ZONEMD");
case kDNSRecordType_SVCB: return("SVCB");
case kDNSRecordType_HTTPS: return("HTTPS");
case kDNSRecordType_SPF: return("SPF");
case kDNSRecordType_UINFO: return("UINFO");
case kDNSRecordType_UID: return("UID");
case kDNSRecordType_GID: return("GID");
case kDNSRecordType_UNSPEC: return("UNSPEC");
case kDNSRecordType_NID: return("NID");
case kDNSRecordType_L32: return("L32");
case kDNSRecordType_L64: return("L64");
case kDNSRecordType_LP: return("LP");
case kDNSRecordType_EUI48: return("EUI48");
case kDNSRecordType_EUI64: return("EUI64");
case kDNSRecordType_TKEY: return("TKEY");
case kDNSRecordType_TSIG: return("TSIG");
case kDNSRecordType_IXFR: return("IXFR");
case kDNSRecordType_AXFR: return("AXFR");
case kDNSRecordType_MAILB: return("MAILB");
case kDNSRecordType_MAILA: return("MAILA");
case kDNSRecordType_ANY: return("ANY");
case kDNSRecordType_URI: return("URI");
case kDNSRecordType_CAA: return("CAA");
case kDNSRecordType_AVC: return("AVC");
case kDNSRecordType_DOA: return("DOA");
case kDNSRecordType_AMTRELAY: return("AMTRELAY");
case kDNSRecordType_TA: return("TA");
case kDNSRecordType_DLV: return("DLV");
case kDNSRecordType_Reserved: return("Reserved");
default: return NULL;
}
}
//======================================================================================================================
const char *
dns_obj_error_get_error_description(const dns_obj_error_t error)
{
switch (error) {
case DNS_OBJ_ERROR_NO_ERROR:
return "No error.";
default:
return "DNS object error.";
}
}