11#include <promeki/config.h>
12#if PROMEKI_ENABLE_NETWORK
21PROMEKI_NAMESPACE_BEGIN
66 static constexpr int HeaderSize = 12;
71 DnsPacket() =
default;
86 static Result<DnsPacket> parse(
const Buffer &b);
89 static Result<DnsPacket> parse(
const uint8_t *data,
size_t len);
107 static Result<DnsPacket> parseMdns(
const Buffer &b);
109 static Result<DnsPacket> parseMdns(
const uint8_t *data,
size_t len);
112 uint16_t transactionId()
const {
return _id; }
115 void setTransactionId(uint16_t
id) { _id = id; }
118 uint16_t flags()
const {
return _flags; }
121 void setFlags(uint16_t f) { _flags = f; }
124 bool isResponse()
const {
return (_flags & 0x8000) != 0; }
127 bool isAuthoritative()
const {
return (_flags & 0x0400) != 0; }
130 bool isTruncated()
const {
return (_flags & 0x0200) != 0; }
133 bool isRecursionDesired()
const {
return (_flags & 0x0100) != 0; }
136 bool isRecursionAvailable()
const {
return (_flags & 0x0080) != 0; }
139 uint8_t rcode()
const {
return static_cast<uint8_t
>(_flags & 0x000F); }
142 uint8_t opcode()
const {
return static_cast<uint8_t
>((_flags >> 11) & 0x0F); }
145 const List<DnsQuestion> &questions()
const {
return _questions; }
147 List<DnsQuestion> &questions() {
return _questions; }
150 const List<DnsRecord> &records()
const {
return _records; }
152 List<DnsRecord> &records() {
return _records; }
155 List<DnsRecord> recordsInSection(DnsRecord::Section section)
const;
160 List<DnsQuestion> _questions;
161 List<DnsRecord> _records;
183class DnsPacket::Builder {
188 Builder &setTransactionId(uint16_t
id);
191 Builder &setResponse(
bool r);
194 Builder &setAuthoritative(
bool aa);
197 Builder &setTruncated(
bool tc);
200 Builder &setRecursionDesired(
bool rd);
203 Builder &setRecursionAvailable(
bool ra);
206 Builder &setOpcode(uint8_t opcode);
209 Builder &setRcode(uint8_t rcode);
212 Builder &setCompressionEnabled(
bool enable);
223 Builder &addQuestion(
const String &name, DnsRecord::Type type,
224 uint16_t klass = 1,
bool unicastResponse =
false);
227 Builder &addQuestion(
const DnsQuestion &q);
237 Builder &addAnswer(
const DnsRecord &r);
240 Builder &addAuthority(
const DnsRecord &r);
243 Builder &addAdditional(
const DnsRecord &r);
264 Builder &addEdns0(uint16_t udpPayloadSize = 1232,
bool doBit =
false);
274 Buffer finish()
const;
277 bool lastEncodeFailed()
const {
return _lastEncodeFailed; }
282 bool _compress =
true;
283 mutable bool _lastEncodeFailed =
false;
284 List<DnsQuestion> _questions;
285 List<DnsRecord> _answers;
286 List<DnsRecord> _authority;
287 List<DnsRecord> _additional;
290#if PROMEKI_ENABLE_MDNS
301using MdnsPacket = DnsPacket;