| // Copyright 2017 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "src/connectivity/network/mdns/service/dns_formatting.h" |
| |
| #include <iomanip> |
| #include <iostream> |
| |
| #include "lib/fostr/hex_dump.h" |
| #include "src/connectivity/network/mdns/service/dns_message.h" |
| |
| namespace mdns { |
| |
| #ifdef MDNS_TRACE |
| |
| std::ostream& operator<<(std::ostream& os, DnsType value) { |
| switch (value) { |
| case DnsType::kA: |
| return os << "A"; |
| case DnsType::kNs: |
| return os << "NS"; |
| case DnsType::kCName: |
| return os << "CNAME"; |
| case DnsType::kPtr: |
| return os << "PTR"; |
| case DnsType::kTxt: |
| return os << "TXT"; |
| case DnsType::kAaaa: |
| return os << "AAAA"; |
| case DnsType::kSrv: |
| return os << "SRV"; |
| case DnsType::kOpt: |
| return os << "OPT"; |
| case DnsType::kNSec: |
| return os << "NSEC"; |
| case DnsType::kAny: |
| return os << "any"; |
| default: |
| return os << "TYPE " << static_cast<uint16_t>(value); |
| } |
| } |
| |
| std::ostream& operator<<(std::ostream& os, DnsClass value) { |
| switch (value) { |
| case DnsClass::kIn: |
| return os << "IN"; |
| case DnsClass::kCs: |
| return os << "CS"; |
| case DnsClass::kCh: |
| return os << "CH"; |
| case DnsClass::kHs: |
| return os << "HS"; |
| case DnsClass::kNone: |
| return os << "none"; |
| case DnsClass::kAny: |
| return os << "any"; |
| default: |
| return os << "CLASS " << static_cast<uint16_t>(value); |
| } |
| } |
| |
| std::ostream& operator<<(std::ostream& os, const DnsName& value) { |
| return os << value.dotted_string_; |
| } |
| |
| std::ostream& operator<<(std::ostream& os, const DnsV4Address& value) { |
| return os << value.address_; |
| } |
| |
| std::ostream& operator<<(std::ostream& os, const DnsV6Address& value) { |
| return os << value.address_; |
| } |
| |
| std::ostream& operator<<(std::ostream& os, const DnsHeader& value) { |
| os << fostr::Indent; |
| os << fostr::NewLine << "id: " << value.id_; |
| os << fostr::NewLine << "flags: 0x" << std::hex << std::setw(4) << std::setfill('0') |
| << value.flags_ << std::dec; |
| return os << fostr::Outdent; |
| } |
| |
| std::ostream& operator<<(std::ostream& os, const DnsQuestion& value) { |
| os << fostr::Indent; |
| os << fostr::NewLine << "name: " << value.name_; |
| os << fostr::NewLine << "type: " << value.type_; |
| os << fostr::NewLine << "class: " << value.class_; |
| os << fostr::NewLine << "unicast_response: " << value.unicast_response_; |
| return os << fostr::Outdent; |
| } |
| |
| std::ostream& operator<<(std::ostream& os, const DnsResourceDataA& value) { |
| return os << fostr::NewLine << "address: " << value.address_; |
| } |
| |
| std::ostream& operator<<(std::ostream& os, const DnsResourceDataNs& value) { |
| return os << fostr::NewLine << "name_server_domain_name: " << value.name_server_domain_name_; |
| } |
| |
| std::ostream& operator<<(std::ostream& os, const DnsResourceDataCName& value) { |
| return os << fostr::NewLine << "canonical_name: " << value.canonical_name_; |
| } |
| |
| std::ostream& operator<<(std::ostream& os, const DnsResourceDataPtr& value) { |
| return os << fostr::NewLine << "pointer_domain_name_: " << value.pointer_domain_name_; |
| } |
| |
| std::ostream& operator<<(std::ostream& os, const DnsResourceDataTxt& value) { |
| os << fostr::NewLine << "text: "; |
| os << fostr::Indent; |
| for (auto& string : value.strings_) { |
| os << fostr::NewLine << "\"" << string << "\""; |
| } |
| return os << fostr::Outdent; |
| } |
| |
| std::ostream& operator<<(std::ostream& os, const DnsResourceDataAaaa& value) { |
| return os << fostr::NewLine << "address: " << value.address_; |
| } |
| |
| std::ostream& operator<<(std::ostream& os, const DnsResourceDataSrv& value) { |
| os << fostr::NewLine << "priority: " << value.priority_; |
| os << fostr::NewLine << "weight: " << value.weight_; |
| os << fostr::NewLine << "port: " << value.port_; |
| return os << fostr::NewLine << "target: " << value.target_; |
| } |
| |
| std::ostream& operator<<(std::ostream& os, const DnsResourceDataOpt& value) { |
| return os << fostr::NewLine << "options: " << fostr::HexDump(value.options_); |
| } |
| |
| std::ostream& operator<<(std::ostream& os, const DnsResourceDataNSec& value) { |
| os << fostr::NewLine << "next_domain: " << value.next_domain_; |
| return os << fostr::NewLine << "bits: " << fostr::HexDump(value.bits_); |
| } |
| |
| std::ostream& operator<<(std::ostream& os, const DnsResource& value) { |
| os << fostr::Indent; |
| os << fostr::NewLine << "name: " << value.name_; |
| os << fostr::NewLine << "type: " << value.type_; |
| os << fostr::NewLine << "class: " << value.class_; |
| os << fostr::NewLine << "cache_flush: " << value.cache_flush_; |
| os << fostr::NewLine << "time_to_live: " << value.time_to_live_; |
| switch (value.type_) { |
| case DnsType::kA: |
| os << value.a_; |
| break; |
| case DnsType::kNs: |
| os << value.ns_; |
| break; |
| case DnsType::kCName: |
| os << value.cname_; |
| break; |
| case DnsType::kPtr: |
| os << value.ptr_; |
| break; |
| case DnsType::kTxt: |
| os << value.txt_; |
| break; |
| case DnsType::kAaaa: |
| os << value.aaaa_; |
| break; |
| case DnsType::kSrv: |
| os << value.srv_; |
| break; |
| case DnsType::kOpt: |
| os << value.opt_; |
| break; |
| case DnsType::kNSec: |
| os << value.nsec_; |
| break; |
| default: |
| break; |
| } |
| return os << fostr::Outdent; |
| } |
| |
| std::ostream& operator<<(std::ostream& os, const DnsMessage& value) { |
| os << fostr::Indent; |
| os << fostr::NewLine << "header: " << value.header_; |
| if (!value.questions_.empty()) { |
| os << fostr::NewLine << "questions: " << value.questions_; |
| } |
| if (!value.answers_.empty()) { |
| os << fostr::NewLine << "answers: " << value.answers_; |
| } |
| if (!value.authorities_.empty()) { |
| os << fostr::NewLine << "authorities: " << value.authorities_; |
| } |
| if (!value.additionals_.empty()) { |
| os << fostr::NewLine << "additionals: " << value.additionals_; |
| } |
| return os << fostr::Outdent; |
| } |
| |
| #endif // ifdef MDNS_TRACE |
| |
| } // namespace mdns |