Define mDNS RecordType and ResponseType.

Change-Id: I8516855ac9c9c28ad41aad464a6417b0ba6f138b
Reviewed-on: https://chromium-review.googlesource.com/c/openscreen/+/1761018
Commit-Queue: Max Yakimakha <yakimakha@chromium.org>
Reviewed-by: Peter Thatcher <pthatcher@google.com>
diff --git a/cast/common/mdns/mdns_constants.h b/cast/common/mdns/mdns_constants.h
index 053f70a..192dbf1 100644
--- a/cast/common/mdns/mdns_constants.h
+++ b/cast/common/mdns/mdns_constants.h
@@ -285,44 +285,58 @@
   kANY = 255,  // Only allowed for QTYPE
 };
 
-// DNS CLASS masks and values.
-constexpr uint16_t kClassMask = 0x7FFF;
-
-// In mDNS the most significant bit of the RRCLASS for response records is
-// designated as the "cache-flush bit", as described in
-// https://tools.ietf.org/html/rfc6762#section-10.2
-constexpr uint16_t kCacheFlushBit = 0x8000;
-// In mDNS the most significant bit of the RRCLASS for query records is
-// designated as the "unicast-response bit", as described in
-// https://tools.ietf.org/html/rfc6762#section-5.4
-constexpr uint16_t kUnicastResponseBit = 0x8000;
-
 enum class DnsClass : uint16_t {
   kIN = 1,
   kANY = 255,  // Only allowed for QCLASS
 };
 
+// Unique and shared records are described in
+// https://tools.ietf.org/html/rfc6762#section-2 and
+// https://tools.ietf.org/html/rfc6762#section-10.2
+enum class RecordType {
+  kShared = 0,
+  kUnique = 1,
+};
+
+// Unicast and multicast preferred response types are described in
+// https://tools.ietf.org/html/rfc6762#section-5.4
+enum class ResponseType {
+  kMulticast = 0,
+  kUnicast = 1,
+};
+
+// DNS CLASS masks and values.
+// In mDNS the most significant bit of the RRCLASS for response records is
+// designated as the "cache-flush bit", as described in
+// https://tools.ietf.org/html/rfc6762#section-10.2
+// In mDNS the most significant bit of the RRCLASS for query records is
+// designated as the "unicast-response bit", as described in
+// https://tools.ietf.org/html/rfc6762#section-5.4
+constexpr uint16_t kClassMask = 0x7FFF;
+constexpr uint16_t kClassMsbMask = 0x8000;
+constexpr uint16_t kClassMsbShift = 0xF;
+
 constexpr DnsClass GetDnsClass(uint16_t rrclass) {
   return static_cast<DnsClass>(rrclass & kClassMask);
 }
 
-constexpr bool GetCacheFlush(uint16_t rrclass) {
-  return rrclass & kCacheFlushBit;
+constexpr RecordType GetRecordType(uint16_t rrclass) {
+  return static_cast<RecordType>((rrclass & kClassMsbMask) >> kClassMsbShift);
 }
 
-constexpr bool GetUnicastResponse(uint16_t rrclass) {
-  return rrclass & kUnicastResponseBit;
+constexpr ResponseType GetResponseType(uint16_t rrclass) {
+  return static_cast<ResponseType>((rrclass & kClassMsbMask) >> kClassMsbShift);
 }
 
-constexpr uint16_t MakeRecordClass(DnsClass dns_class, bool cache_flush) {
+constexpr uint16_t MakeRecordClass(DnsClass dns_class, RecordType record_type) {
   return static_cast<uint16_t>(dns_class) |
-         (static_cast<uint16_t>(cache_flush) << 15);
+         (static_cast<uint16_t>(record_type) << kClassMsbShift);
 }
 
 constexpr uint16_t MakeQuestionClass(DnsClass dns_class,
-                                     bool unicast_response) {
+                                     ResponseType response_type) {
   return static_cast<uint16_t>(dns_class) |
-         (static_cast<uint16_t>(unicast_response) << 15);
+         (static_cast<uint16_t>(response_type) << kClassMsbShift);
 }
 
 // See RFC 6762, section 11: https://tools.ietf.org/html/rfc6762#section-11
diff --git a/cast/common/mdns/mdns_reader.cc b/cast/common/mdns/mdns_reader.cc
index 36bc3ed..c91983b 100644
--- a/cast/common/mdns/mdns_reader.cc
+++ b/cast/common/mdns/mdns_reader.cc
@@ -202,7 +202,7 @@
   if (Read(&name) && Read(&type) && Read(&rrclass) && Read(&ttl) &&
       Read(static_cast<DnsType>(type), &rdata)) {
     *out = MdnsRecord(std::move(name), static_cast<DnsType>(type),
-                      GetDnsClass(rrclass), GetCacheFlush(rrclass), ttl,
+                      GetDnsClass(rrclass), GetRecordType(rrclass), ttl,
                       std::move(rdata));
     cursor.Commit();
     return true;
@@ -218,7 +218,7 @@
   uint16_t rrclass;
   if (Read(&name) && Read(&type) && Read(&rrclass)) {
     *out = MdnsQuestion(std::move(name), static_cast<DnsType>(type),
-                        GetDnsClass(rrclass), GetUnicastResponse(rrclass));
+                        GetDnsClass(rrclass), GetResponseType(rrclass));
     cursor.Commit();
     return true;
   }
diff --git a/cast/common/mdns/mdns_reader_unittest.cc b/cast/common/mdns/mdns_reader_unittest.cc
index 5fdf4d4..426d75e 100644
--- a/cast/common/mdns/mdns_reader_unittest.cc
+++ b/cast/common/mdns/mdns_reader_unittest.cc
@@ -375,10 +375,10 @@
       0x08, 0x08, 0x08, 0x08,  // RDATA = 8.8.8.8
   };
   // clang-format on
-  TestReadEntrySucceeds(
-      kTestRecord, sizeof(kTestRecord),
-      MdnsRecord(DomainName{"testing", "local"}, DnsType::kA, DnsClass::kIN,
-                 true, 120, ARecordRdata(IPAddress{8, 8, 8, 8})));
+  TestReadEntrySucceeds(kTestRecord, sizeof(kTestRecord),
+                        MdnsRecord(DomainName{"testing", "local"}, DnsType::kA,
+                                   DnsClass::kIN, RecordType::kUnique, 120,
+                                   ARecordRdata(IPAddress{8, 8, 8, 8})));
 }
 
 TEST(MdnsReaderTest, ReadMdnsRecord_UnknownRecordType) {
@@ -400,8 +400,9 @@
   TestReadEntrySucceeds(
       kTestRecord, sizeof(kTestRecord),
       MdnsRecord(DomainName{"testing", "local"},
-                 static_cast<DnsType>(5) /*CNAME class*/, DnsClass::kIN, true,
-                 120, RawRecordRdata(kCnameRdata, sizeof(kCnameRdata))));
+                 static_cast<DnsType>(5) /*CNAME class*/, DnsClass::kIN,
+                 RecordType::kUnique, 120,
+                 RawRecordRdata(kCnameRdata, sizeof(kCnameRdata))));
 }
 
 TEST(MdnsReaderTest, ReadMdnsRecord_CompressedNames) {
@@ -434,12 +435,12 @@
   EXPECT_TRUE(reader.Read(&record));
   EXPECT_EQ(record,
             MdnsRecord(DomainName{"testing", "local"}, DnsType::kPTR,
-                       DnsClass::kIN, false, 120,
+                       DnsClass::kIN, RecordType::kShared, 120,
                        PtrRecordRdata(DomainName{"ptr", "testing", "local"})));
   EXPECT_TRUE(reader.Read(&record));
   EXPECT_EQ(record, MdnsRecord(DomainName{"one", "two", "testing", "local"},
-                               DnsType::kA, DnsClass::kIN, true, 120,
-                               ARecordRdata(IPAddress{8, 8, 8, 8})));
+                               DnsType::kA, DnsClass::kIN, RecordType::kUnique,
+                               120, ARecordRdata(IPAddress{8, 8, 8, 8})));
 }
 
 TEST(MdnsReaderTest, ReadMdnsRecord_MissingRdata) {
@@ -483,9 +484,10 @@
       0x80, 0x01,  // CLASS = IN (1) | UNICAST_BIT
   };
   // clang-format on
-  TestReadEntrySucceeds(kTestQuestion, sizeof(kTestQuestion),
-                        MdnsQuestion(DomainName{"testing", "local"},
-                                     DnsType::kA, DnsClass::kIN, true));
+  TestReadEntrySucceeds(
+      kTestQuestion, sizeof(kTestQuestion),
+      MdnsQuestion(DomainName{"testing", "local"}, DnsType::kA, DnsClass::kIN,
+                   ResponseType::kUnicast));
 }
 
 TEST(MdnsReaderTest, ReadMdnsQuestion_CompressedNames) {
@@ -508,10 +510,10 @@
   MdnsQuestion question;
   EXPECT_TRUE(reader.Read(&question));
   EXPECT_EQ(question, MdnsQuestion(DomainName{"first", "local"}, DnsType::kA,
-                                   DnsClass::kIN, true));
+                                   DnsClass::kIN, ResponseType::kUnicast));
   EXPECT_TRUE(reader.Read(&question));
   EXPECT_EQ(question, MdnsQuestion(DomainName{"second", "local"}, DnsType::kPTR,
-                                   DnsClass::kIN, false));
+                                   DnsClass::kIN, ResponseType::kMulticast));
   EXPECT_EQ(reader.remaining(), UINT64_C(0));
 }
 
@@ -559,10 +561,12 @@
   };
   // clang-format on
 
-  MdnsRecord record1(DomainName{"record1"}, DnsType::kPTR, DnsClass::kIN, false,
-                     120, PtrRecordRdata(DomainName{"testing", "local"}));
-  MdnsRecord record2(DomainName{"record2"}, DnsType::kA, DnsClass::kIN, false,
-                     120, ARecordRdata(IPAddress{172, 0, 0, 1}));
+  MdnsRecord record1(DomainName{"record1"}, DnsType::kPTR, DnsClass::kIN,
+                     RecordType::kShared, 120,
+                     PtrRecordRdata(DomainName{"testing", "local"}));
+  MdnsRecord record2(DomainName{"record2"}, DnsType::kA, DnsClass::kIN,
+                     RecordType::kShared, 120,
+                     ARecordRdata(IPAddress{172, 0, 0, 1}));
   MdnsMessage message(1, MessageType::Response, std::vector<MdnsQuestion>{},
                       std::vector<MdnsRecord>{record1},
                       std::vector<MdnsRecord>{},
diff --git a/cast/common/mdns/mdns_receiver_unittest.cc b/cast/common/mdns/mdns_receiver_unittest.cc
index 025d70b..ce796dd 100644
--- a/cast/common/mdns/mdns_receiver_unittest.cc
+++ b/cast/common/mdns/mdns_receiver_unittest.cc
@@ -63,7 +63,7 @@
   receiver.Start();
 
   MdnsQuestion question(DomainName{"testing", "local"}, DnsType::kA,
-                        DnsClass::kIN, false);
+                        DnsClass::kIN, ResponseType::kMulticast);
   MdnsMessage message(1, MessageType::Query);
   message.AddQuestion(question);
 
@@ -121,7 +121,8 @@
   receiver.Start();
 
   MdnsRecord record(DomainName{"testing", "local"}, DnsType::kA, DnsClass::kIN,
-                    false, 120, ARecordRdata(IPAddress{172, 0, 0, 1}));
+                    RecordType::kShared, 120,
+                    ARecordRdata(IPAddress{172, 0, 0, 1}));
   MdnsMessage message(1, MessageType::Response);
   message.AddAnswer(record);
 
diff --git a/cast/common/mdns/mdns_records.cc b/cast/common/mdns/mdns_records.cc
index df85a3a..cb0dfb5 100644
--- a/cast/common/mdns/mdns_records.cc
+++ b/cast/common/mdns/mdns_records.cc
@@ -159,34 +159,34 @@
 }
 
 MdnsRecord::MdnsRecord(DomainName name,
-                       DnsType type,
+                       DnsType dns_type,
                        DnsClass record_class,
-                       bool cache_flush,
+                       RecordType record_type,
                        uint32_t ttl,
                        Rdata rdata)
     : name_(std::move(name)),
-      type_(type),
+      dns_type_(dns_type),
       record_class_(record_class),
-      cache_flush_(cache_flush),
+      record_type_(record_type),
       ttl_(ttl),
       rdata_(std::move(rdata)) {
   OSP_DCHECK(!name_.empty());
-  OSP_DCHECK(
-      (type == DnsType::kSRV &&
-       absl::holds_alternative<SrvRecordRdata>(rdata_)) ||
-      (type == DnsType::kA && absl::holds_alternative<ARecordRdata>(rdata_)) ||
-      (type == DnsType::kAAAA &&
-       absl::holds_alternative<AAAARecordRdata>(rdata_)) ||
-      (type == DnsType::kPTR &&
-       absl::holds_alternative<PtrRecordRdata>(rdata_)) ||
-      (type == DnsType::kTXT &&
-       absl::holds_alternative<TxtRecordRdata>(rdata_)) ||
-      absl::holds_alternative<RawRecordRdata>(rdata_));
+  OSP_DCHECK((dns_type == DnsType::kSRV &&
+              absl::holds_alternative<SrvRecordRdata>(rdata_)) ||
+             (dns_type == DnsType::kA &&
+              absl::holds_alternative<ARecordRdata>(rdata_)) ||
+             (dns_type == DnsType::kAAAA &&
+              absl::holds_alternative<AAAARecordRdata>(rdata_)) ||
+             (dns_type == DnsType::kPTR &&
+              absl::holds_alternative<PtrRecordRdata>(rdata_)) ||
+             (dns_type == DnsType::kTXT &&
+              absl::holds_alternative<TxtRecordRdata>(rdata_)) ||
+             absl::holds_alternative<RawRecordRdata>(rdata_));
 }
 
 bool MdnsRecord::operator==(const MdnsRecord& rhs) const {
-  return type_ == rhs.type_ && record_class_ == rhs.record_class_ &&
-         cache_flush_ == rhs.cache_flush_ && ttl_ == rhs.ttl_ &&
+  return dns_type_ == rhs.dns_type_ && record_class_ == rhs.record_class_ &&
+         record_type_ == rhs.record_type_ && ttl_ == rhs.ttl_ &&
          name_ == rhs.name_ && rdata_ == rhs.rdata_;
 }
 
@@ -196,24 +196,24 @@
 
 size_t MdnsRecord::MaxWireSize() const {
   auto wire_size_visitor = [](auto&& arg) { return arg.MaxWireSize(); };
-  return name_.MaxWireSize() + sizeof(type_) + sizeof(record_class_) +
+  return name_.MaxWireSize() + sizeof(dns_type_) + sizeof(record_class_) +
          sizeof(ttl_) + absl::visit(wire_size_visitor, rdata_);
 }
 
 MdnsQuestion::MdnsQuestion(DomainName name,
-                           DnsType type,
+                           DnsType dns_type,
                            DnsClass record_class,
-                           bool unicast_response)
+                           ResponseType response_type)
     : name_(std::move(name)),
-      type_(type),
+      dns_type_(dns_type),
       record_class_(record_class),
-      unicast_response_(unicast_response) {
+      response_type_(response_type) {
   OSP_CHECK(!name_.empty());
 }
 
 bool MdnsQuestion::operator==(const MdnsQuestion& rhs) const {
-  return type_ == rhs.type_ && record_class_ == rhs.record_class_ &&
-         unicast_response_ == rhs.unicast_response_ && name_ == rhs.name_;
+  return dns_type_ == rhs.dns_type_ && record_class_ == rhs.record_class_ &&
+         response_type_ == rhs.response_type_ && name_ == rhs.name_;
 }
 
 bool MdnsQuestion::operator!=(const MdnsQuestion& rhs) const {
@@ -221,7 +221,7 @@
 }
 
 size_t MdnsQuestion::MaxWireSize() const {
-  return name_.MaxWireSize() + sizeof(type_) + sizeof(record_class_);
+  return name_.MaxWireSize() + sizeof(dns_type_) + sizeof(record_class_);
 }
 
 MdnsMessage::MdnsMessage(uint16_t id, MessageType type)
diff --git a/cast/common/mdns/mdns_records.h b/cast/common/mdns/mdns_records.h
index 1c8a1a9..f5d4568 100644
--- a/cast/common/mdns/mdns_records.h
+++ b/cast/common/mdns/mdns_records.h
@@ -299,9 +299,9 @@
  public:
   MdnsRecord() = default;
   MdnsRecord(DomainName name,
-             DnsType type,
+             DnsType dns_type,
              DnsClass record_class,
-             bool cache_flush,
+             RecordType record_type,
              uint32_t ttl,
              Rdata rdata);
   MdnsRecord(const MdnsRecord& other) = default;
@@ -316,24 +316,24 @@
 
   size_t MaxWireSize() const;
   const DomainName& name() const { return name_; }
-  DnsType type() const { return type_; }
+  DnsType dns_type() const { return dns_type_; }
   DnsClass record_class() const { return record_class_; }
-  bool cache_flush() const { return cache_flush_; }
+  RecordType record_type() const { return record_type_; }
   uint32_t ttl() const { return ttl_; }
   const Rdata& rdata() const { return rdata_; }
 
   template <typename H>
   friend H AbslHashValue(H h, const MdnsRecord& record) {
-    return H::combine(std::move(h), record.name_, record.type_,
-                      record.record_class_, record.cache_flush_, record.ttl_,
+    return H::combine(std::move(h), record.name_, record.dns_type_,
+                      record.record_class_, record.record_type_, record.ttl_,
                       record.rdata_);
   }
 
  private:
   DomainName name_;
-  DnsType type_ = static_cast<DnsType>(0);
+  DnsType dns_type_ = static_cast<DnsType>(0);
   DnsClass record_class_ = static_cast<DnsClass>(0);
-  bool cache_flush_ = false;
+  RecordType record_type_ = RecordType::kShared;
   uint32_t ttl_ = kDefaultRecordTTL;
   // Default-constructed Rdata contains default-constructed RawRecordRdata
   // as it is the first alternative type and it is default-constructible.
@@ -348,9 +348,9 @@
  public:
   MdnsQuestion() = default;
   MdnsQuestion(DomainName name,
-               DnsType type,
+               DnsType dns_type,
                DnsClass record_class,
-               bool unicast_response);
+               ResponseType response_type);
   MdnsQuestion(const MdnsQuestion& other) = default;
   MdnsQuestion(MdnsQuestion&& other) noexcept = default;
   ~MdnsQuestion() = default;
@@ -363,23 +363,23 @@
 
   size_t MaxWireSize() const;
   const DomainName& name() const { return name_; }
-  DnsType type() const { return type_; }
+  DnsType dns_type() const { return dns_type_; }
   DnsClass record_class() const { return record_class_; }
-  bool unicast_response() const { return unicast_response_; }
+  ResponseType response_type() const { return response_type_; }
 
   template <typename H>
   friend H AbslHashValue(H h, const MdnsQuestion& record) {
-    return H::combine(std::move(h), record.name_, record.type_,
-                      record.record_class_, record.unicast_response_);
+    return H::combine(std::move(h), record.name_, record.dns_type_,
+                      record.record_class_, record.response_type_);
   }
 
  private:
   void CopyFrom(const MdnsQuestion& other);
 
   DomainName name_;
-  DnsType type_ = static_cast<DnsType>(0);
+  DnsType dns_type_ = static_cast<DnsType>(0);
   DnsClass record_class_ = static_cast<DnsClass>(0);
-  bool unicast_response_ = false;
+  ResponseType response_type_ = ResponseType::kMulticast;
 };
 
 // Message top level format (http://www.ietf.org/rfc/rfc1035.txt):
diff --git a/cast/common/mdns/mdns_records_unittest.cc b/cast/common/mdns/mdns_records_unittest.cc
index a5cef3b..cd4f25d 100644
--- a/cast/common/mdns/mdns_records_unittest.cc
+++ b/cast/common/mdns/mdns_records_unittest.cc
@@ -285,20 +285,20 @@
   MdnsRecord record1;
   EXPECT_EQ(record1.MaxWireSize(), UINT64_C(11));
   EXPECT_EQ(record1.name(), DomainName());
-  EXPECT_EQ(record1.type(), static_cast<DnsType>(0));
+  EXPECT_EQ(record1.dns_type(), static_cast<DnsType>(0));
   EXPECT_EQ(record1.record_class(), static_cast<DnsClass>(0));
-  EXPECT_EQ(record1.cache_flush(), false);
+  EXPECT_EQ(record1.record_type(), RecordType::kShared);
   EXPECT_EQ(record1.ttl(), UINT32_C(255));  // 255 is kDefaultRecordTTL
   EXPECT_EQ(record1.rdata(), Rdata(RawRecordRdata()));
 
   MdnsRecord record2(DomainName{"hostname", "local"}, DnsType::kPTR,
-                     DnsClass::kIN, true, 120,
+                     DnsClass::kIN, RecordType::kUnique, 120,
                      PtrRecordRdata(DomainName{"testing", "local"}));
   EXPECT_EQ(record2.MaxWireSize(), UINT64_C(41));
   EXPECT_EQ(record2.name(), (DomainName{"hostname", "local"}));
-  EXPECT_EQ(record2.type(), DnsType::kPTR);
+  EXPECT_EQ(record2.dns_type(), DnsType::kPTR);
   EXPECT_EQ(record2.record_class(), DnsClass::kIN);
-  EXPECT_EQ(record2.cache_flush(), true);
+  EXPECT_EQ(record2.record_type(), RecordType::kUnique);
   EXPECT_EQ(record2.ttl(), UINT32_C(120));
   EXPECT_EQ(record2.rdata(),
             Rdata(PtrRecordRdata(DomainName{"testing", "local"})));
@@ -306,25 +306,25 @@
 
 TEST(MdnsRecordTest, Compare) {
   MdnsRecord record1(DomainName{"hostname", "local"}, DnsType::kPTR,
-                     DnsClass::kIN, false, 120,
+                     DnsClass::kIN, RecordType::kShared, 120,
                      PtrRecordRdata(DomainName{"testing", "local"}));
   MdnsRecord record2(DomainName{"hostname", "local"}, DnsType::kPTR,
-                     DnsClass::kIN, false, 120,
+                     DnsClass::kIN, RecordType::kShared, 120,
                      PtrRecordRdata(DomainName{"testing", "local"}));
   MdnsRecord record3(DomainName{"othername", "local"}, DnsType::kPTR,
-                     DnsClass::kIN, false, 120,
+                     DnsClass::kIN, RecordType::kShared, 120,
                      PtrRecordRdata(DomainName{"testing", "local"}));
   MdnsRecord record4(DomainName{"hostname", "local"}, DnsType::kA,
-                     DnsClass::kIN, false, 120,
+                     DnsClass::kIN, RecordType::kShared, 120,
                      ARecordRdata(IPAddress{8, 8, 8, 8}));
   MdnsRecord record5(DomainName{"hostname", "local"}, DnsType::kPTR,
-                     DnsClass::kIN, true, 120,
+                     DnsClass::kIN, RecordType::kUnique, 120,
                      PtrRecordRdata(DomainName{"testing", "local"}));
   MdnsRecord record6(DomainName{"hostname", "local"}, DnsType::kPTR,
-                     DnsClass::kIN, false, 200,
+                     DnsClass::kIN, RecordType::kShared, 200,
                      PtrRecordRdata(DomainName{"testing", "local"}));
   MdnsRecord record7(DomainName{"hostname", "local"}, DnsType::kPTR,
-                     DnsClass::kIN, false, 120,
+                     DnsClass::kIN, RecordType::kShared, 120,
                      PtrRecordRdata(DomainName{"device", "local"}));
 
   EXPECT_EQ(record1, record2);
@@ -337,7 +337,7 @@
 
 TEST(MdnsRecordTest, CopyAndMove) {
   MdnsRecord record(DomainName{"hostname", "local"}, DnsType::kPTR,
-                    DnsClass::kIN, true, 120,
+                    DnsClass::kIN, RecordType::kUnique, 120,
                     PtrRecordRdata(DomainName{"testing", "local"}));
   TestCopyAndMove(record);
 }
@@ -346,30 +346,30 @@
   MdnsQuestion question1;
   EXPECT_EQ(question1.MaxWireSize(), UINT64_C(5));
   EXPECT_EQ(question1.name(), DomainName());
-  EXPECT_EQ(question1.type(), static_cast<DnsType>(0));
+  EXPECT_EQ(question1.dns_type(), static_cast<DnsType>(0));
   EXPECT_EQ(question1.record_class(), static_cast<DnsClass>(0));
-  EXPECT_EQ(question1.unicast_response(), false);
+  EXPECT_EQ(question1.response_type(), ResponseType::kMulticast);
 
   MdnsQuestion question2(DomainName{"testing", "local"}, DnsType::kPTR,
-                         DnsClass::kIN, true);
+                         DnsClass::kIN, ResponseType::kUnicast);
   EXPECT_EQ(question2.MaxWireSize(), UINT64_C(19));
   EXPECT_EQ(question2.name(), (DomainName{"testing", "local"}));
-  EXPECT_EQ(question2.type(), DnsType::kPTR);
+  EXPECT_EQ(question2.dns_type(), DnsType::kPTR);
   EXPECT_EQ(question2.record_class(), DnsClass::kIN);
-  EXPECT_EQ(question2.unicast_response(), true);
+  EXPECT_EQ(question2.response_type(), ResponseType::kUnicast);
 }
 
 TEST(MdnsQuestionTest, Compare) {
   MdnsQuestion question1(DomainName{"testing", "local"}, DnsType::kPTR,
-                         DnsClass::kIN, false);
+                         DnsClass::kIN, ResponseType::kMulticast);
   MdnsQuestion question2(DomainName{"testing", "local"}, DnsType::kPTR,
-                         DnsClass::kIN, false);
+                         DnsClass::kIN, ResponseType::kMulticast);
   MdnsQuestion question3(DomainName{"hostname", "local"}, DnsType::kPTR,
-                         DnsClass::kIN, false);
+                         DnsClass::kIN, ResponseType::kMulticast);
   MdnsQuestion question4(DomainName{"testing", "local"}, DnsType::kA,
-                         DnsClass::kIN, false);
+                         DnsClass::kIN, ResponseType::kMulticast);
   MdnsQuestion question5(DomainName{"hostname", "local"}, DnsType::kPTR,
-                         DnsClass::kIN, true);
+                         DnsClass::kIN, ResponseType::kUnicast);
 
   EXPECT_EQ(question1, question2);
   EXPECT_NE(question1, question3);
@@ -379,7 +379,7 @@
 
 TEST(MdnsQuestionTest, CopyAndMove) {
   MdnsQuestion question(DomainName{"testing", "local"}, DnsType::kPTR,
-                        DnsClass::kIN, true);
+                        DnsClass::kIN, ResponseType::kUnicast);
   TestCopyAndMove(question);
 }
 
@@ -394,13 +394,16 @@
   EXPECT_EQ(message1.additional_records().size(), UINT64_C(0));
 
   MdnsQuestion question(DomainName{"testing", "local"}, DnsType::kPTR,
-                        DnsClass::kIN, true);
-  MdnsRecord record1(DomainName{"record1"}, DnsType::kA, DnsClass::kIN, false,
-                     120, ARecordRdata(IPAddress{172, 0, 0, 1}));
-  MdnsRecord record2(DomainName{"record2"}, DnsType::kTXT, DnsClass::kIN, false,
-                     120, TxtRecordRdata{"foo=1", "bar=2"});
-  MdnsRecord record3(DomainName{"record3"}, DnsType::kPTR, DnsClass::kIN, false,
-                     120, PtrRecordRdata(DomainName{"device", "local"}));
+                        DnsClass::kIN, ResponseType::kUnicast);
+  MdnsRecord record1(DomainName{"record1"}, DnsType::kA, DnsClass::kIN,
+                     RecordType::kShared, 120,
+                     ARecordRdata(IPAddress{172, 0, 0, 1}));
+  MdnsRecord record2(DomainName{"record2"}, DnsType::kTXT, DnsClass::kIN,
+                     RecordType::kShared, 120,
+                     TxtRecordRdata{"foo=1", "bar=2"});
+  MdnsRecord record3(DomainName{"record3"}, DnsType::kPTR, DnsClass::kIN,
+                     RecordType::kShared, 120,
+                     PtrRecordRdata(DomainName{"device", "local"}));
 
   MdnsMessage message2(123, MessageType::Response);
   EXPECT_EQ(message2.MaxWireSize(), UINT64_C(12));
@@ -446,13 +449,16 @@
 
 TEST(MdnsMessageTest, Compare) {
   MdnsQuestion question(DomainName{"testing", "local"}, DnsType::kPTR,
-                        DnsClass::kIN, true);
-  MdnsRecord record1(DomainName{"record1"}, DnsType::kA, DnsClass::kIN, false,
-                     120, ARecordRdata(IPAddress{172, 0, 0, 1}));
-  MdnsRecord record2(DomainName{"record2"}, DnsType::kTXT, DnsClass::kIN, false,
-                     120, TxtRecordRdata{"foo=1", "bar=2"});
-  MdnsRecord record3(DomainName{"record3"}, DnsType::kPTR, DnsClass::kIN, false,
-                     120, PtrRecordRdata(DomainName{"device", "local"}));
+                        DnsClass::kIN, ResponseType::kUnicast);
+  MdnsRecord record1(DomainName{"record1"}, DnsType::kA, DnsClass::kIN,
+                     RecordType::kShared, 120,
+                     ARecordRdata(IPAddress{172, 0, 0, 1}));
+  MdnsRecord record2(DomainName{"record2"}, DnsType::kTXT, DnsClass::kIN,
+                     RecordType::kShared, 120,
+                     TxtRecordRdata{"foo=1", "bar=2"});
+  MdnsRecord record3(DomainName{"record3"}, DnsType::kPTR, DnsClass::kIN,
+                     RecordType::kShared, 120,
+                     PtrRecordRdata(DomainName{"device", "local"}));
 
   MdnsMessage message1(
       123, MessageType::Response, std::vector<MdnsQuestion>{question},
@@ -498,13 +504,16 @@
 
 TEST(MdnsMessageTest, CopyAndMove) {
   MdnsQuestion question(DomainName{"testing", "local"}, DnsType::kPTR,
-                        DnsClass::kIN, true);
-  MdnsRecord record1(DomainName{"record1"}, DnsType::kA, DnsClass::kIN, false,
-                     120, ARecordRdata(IPAddress{172, 0, 0, 1}));
-  MdnsRecord record2(DomainName{"record2"}, DnsType::kTXT, DnsClass::kIN, false,
-                     120, TxtRecordRdata{"foo=1", "bar=2"});
-  MdnsRecord record3(DomainName{"record3"}, DnsType::kPTR, DnsClass::kIN, false,
-                     120, PtrRecordRdata(DomainName{"device", "local"}));
+                        DnsClass::kIN, ResponseType::kUnicast);
+  MdnsRecord record1(DomainName{"record1"}, DnsType::kA, DnsClass::kIN,
+                     RecordType::kShared, 120,
+                     ARecordRdata(IPAddress{172, 0, 0, 1}));
+  MdnsRecord record2(DomainName{"record2"}, DnsType::kTXT, DnsClass::kIN,
+                     RecordType::kShared, 120,
+                     TxtRecordRdata{"foo=1", "bar=2"});
+  MdnsRecord record3(DomainName{"record3"}, DnsType::kPTR, DnsClass::kIN,
+                     RecordType::kShared, 120,
+                     PtrRecordRdata(DomainName{"device", "local"}));
   MdnsMessage message(
       123, MessageType::Response, std::vector<MdnsQuestion>{question},
       std::vector<MdnsRecord>{record1}, std::vector<MdnsRecord>{record2},
diff --git a/cast/common/mdns/mdns_sender_unittest.cc b/cast/common/mdns/mdns_sender_unittest.cc
index 294afd4..821ac1f 100644
--- a/cast/common/mdns/mdns_sender_unittest.cc
+++ b/cast/common/mdns/mdns_sender_unittest.cc
@@ -39,11 +39,11 @@
       : a_question_(DomainName{"testing", "local"},
                     DnsType::kA,
                     DnsClass::kIN,
-                    false),
+                    ResponseType::kMulticast),
         a_record_(DomainName{"testing", "local"},
                   DnsType::kA,
                   DnsClass::kIN,
-                  false,
+                  RecordType::kShared,
                   120,
                   ARecordRdata(IPAddress{172, 0, 0, 1})),
         query_message_(1, MessageType::Query),
diff --git a/cast/common/mdns/mdns_writer.cc b/cast/common/mdns/mdns_writer.cc
index 2912ba7..94a190b 100644
--- a/cast/common/mdns/mdns_writer.cc
+++ b/cast/common/mdns/mdns_writer.cc
@@ -204,8 +204,8 @@
 
 bool MdnsWriter::Write(const MdnsRecord& record) {
   Cursor cursor(this);
-  if (Write(record.name()) && Write(static_cast<uint16_t>(record.type())) &&
-      Write(MakeRecordClass(record.record_class(), record.cache_flush())) &&
+  if (Write(record.name()) && Write(static_cast<uint16_t>(record.dns_type())) &&
+      Write(MakeRecordClass(record.record_class(), record.record_type())) &&
       Write(record.ttl()) && Write(record.rdata())) {
     cursor.Commit();
     return true;
@@ -215,9 +215,10 @@
 
 bool MdnsWriter::Write(const MdnsQuestion& question) {
   Cursor cursor(this);
-  if (Write(question.name()) && Write(static_cast<uint16_t>(question.type())) &&
+  if (Write(question.name()) &&
+      Write(static_cast<uint16_t>(question.dns_type())) &&
       Write(MakeQuestionClass(question.record_class(),
-                              question.unicast_response()))) {
+                              question.response_type()))) {
     cursor.Commit();
     return true;
   }
diff --git a/cast/common/mdns/mdns_writer_unittest.cc b/cast/common/mdns/mdns_writer_unittest.cc
index a7bf676..c1f12b4 100644
--- a/cast/common/mdns/mdns_writer_unittest.cc
+++ b/cast/common/mdns/mdns_writer_unittest.cc
@@ -306,10 +306,10 @@
       0xac, 0x00, 0x00, 0x01,  // 172.0.0.1
   };
   // clang-format on
-  TestWriteEntrySucceeds(
-      MdnsRecord(DomainName{"testing", "local"}, DnsType::kA, DnsClass::kIN,
-                 true, 120, ARecordRdata(IPAddress{172, 0, 0, 1})),
-      kExpectedResult, sizeof(kExpectedResult));
+  TestWriteEntrySucceeds(MdnsRecord(DomainName{"testing", "local"}, DnsType::kA,
+                                    DnsClass::kIN, RecordType::kUnique, 120,
+                                    ARecordRdata(IPAddress{172, 0, 0, 1})),
+                         kExpectedResult, sizeof(kExpectedResult));
 }
 
 TEST(MdnsWriterTest, WriteMdnsRecord_PtrRecordRdata) {
@@ -328,15 +328,15 @@
   // clang-format on
   TestWriteEntrySucceeds(
       MdnsRecord(DomainName{"_service", "testing", "local"}, DnsType::kPTR,
-                 DnsClass::kIN, false, 120,
+                 DnsClass::kIN, RecordType::kShared, 120,
                  PtrRecordRdata(DomainName{"testing", "local"})),
       kExpectedResult, sizeof(kExpectedResult));
 }
 
 TEST(MdnsWriterTest, WriteMdnsRecord_InsufficientBuffer) {
-  TestWriteEntryInsufficientBuffer(
-      MdnsRecord(DomainName{"testing", "local"}, DnsType::kA, DnsClass::kIN,
-                 true, 120, ARecordRdata(IPAddress{172, 0, 0, 1})));
+  TestWriteEntryInsufficientBuffer(MdnsRecord(
+      DomainName{"testing", "local"}, DnsType::kA, DnsClass::kIN,
+      RecordType::kUnique, 120, ARecordRdata(IPAddress{172, 0, 0, 1})));
 }
 
 TEST(MdnsWriterTest, WriteMdnsQuestion) {
@@ -350,15 +350,16 @@
       0x80, 0x01,  // CLASS = IN (1) | UNICAST_BIT
   };
   // clang-format on
-  TestWriteEntrySucceeds(MdnsQuestion(DomainName{"wire", "format", "local"},
-                                      DnsType::kPTR, DnsClass::kIN, true),
-                         kExpectedResult, sizeof(kExpectedResult));
+  TestWriteEntrySucceeds(
+      MdnsQuestion(DomainName{"wire", "format", "local"}, DnsType::kPTR,
+                   DnsClass::kIN, ResponseType::kUnicast),
+      kExpectedResult, sizeof(kExpectedResult));
 }
 
 TEST(MdnsWriterTest, WriteMdnsQuestion_InsufficientBuffer) {
   TestWriteEntryInsufficientBuffer(
       MdnsQuestion(DomainName{"wire", "format", "local"}, DnsType::kPTR,
-                   DnsClass::kIN, true));
+                   DnsClass::kIN, ResponseType::kUnicast));
 }
 
 TEST(MdnsWriterTest, WriteMdnsMessage) {
@@ -387,10 +388,11 @@
   };
   // clang-format on
   MdnsQuestion question(DomainName{"question"}, DnsType::kPTR, DnsClass::kIN,
-                        false);
+                        ResponseType::kMulticast);
 
   MdnsRecord auth_record(DomainName{"auth"}, DnsType::kTXT, DnsClass::kIN,
-                         false, 120, TxtRecordRdata{"foo=1", "bar=2"});
+                         RecordType::kShared, 120,
+                         TxtRecordRdata{"foo=1", "bar=2"});
 
   MdnsMessage message(1, MessageType::Query);
   message.AddQuestion(question);
@@ -405,10 +407,11 @@
 
 TEST(MdnsWriterTest, WriteMdnsMessage_InsufficientBuffer) {
   MdnsQuestion question(DomainName{"question"}, DnsType::kPTR, DnsClass::kIN,
-                        false);
+                        ResponseType::kMulticast);
 
-  MdnsRecord auth_record(DomainName{"auth"}, DnsType::kTXT, DnsClass::kIN, 120,
-                         false, TxtRecordRdata{"foo=1", "bar=2"});
+  MdnsRecord auth_record(DomainName{"auth"}, DnsType::kTXT, DnsClass::kIN,
+                         RecordType::kShared, 120,
+                         TxtRecordRdata{"foo=1", "bar=2"});
 
   MdnsMessage message(1, MessageType::Query);
   message.AddQuestion(question);