pbf_rr.add_uint32(3, record.d_class);
pbf_rr.add_uint32(4, record.d_ttl);
- switch(record.d_type) {
- case QType::A:
- {
+ switch (record.d_type) {
+ case QType::A: {
const auto& content = dynamic_cast<const ARecordContent&>(*(record.d_content));
ComboAddress data = content.getCA();
pbf_rr.add_bytes(5, reinterpret_cast<const char*>(&data.sin4.sin_addr.s_addr), sizeof(data.sin4.sin_addr.s_addr));
break;
}
- case QType::AAAA:
- {
+ case QType::AAAA: {
const auto& content = dynamic_cast<const AAAARecordContent&>(*(record.d_content));
ComboAddress data = content.getCA();
pbf_rr.add_bytes(5, reinterpret_cast<const char*>(&data.sin6.sin6_addr.s6_addr), sizeof(data.sin6.sin6_addr.s6_addr));
break;
}
- case QType::CNAME:
- {
+ case QType::CNAME: {
const auto& content = dynamic_cast<const CNAMERecordContent&>(*(record.d_content));
pbf_rr.add_string(5, content.getTarget().toString());
break;
}
- case QType::TXT:
- {
+ case QType::TXT: {
const auto& content = dynamic_cast<const TXTRecordContent&>(*(record.d_content));
pbf_rr.add_string(5, content.d_text);
break;
}
- case QType::NS:
- {
+ case QType::NS: {
const auto& content = dynamic_cast<const NSRecordContent&>(*(record.d_content));
pbf_rr.add_string(5, content.getNS().toString());
break;
}
- case QType::PTR:
- {
+ case QType::PTR: {
const auto& content = dynamic_cast<const PTRRecordContent&>(*(record.d_content));
pbf_rr.add_string(5, content.getContent().toString());
break;
}
- case QType::MX:
- {
+ case QType::MX: {
const auto& content = dynamic_cast<const MXRecordContent&>(*(record.d_content));
pbf_rr.add_string(5, content.d_mxname.toString());
break;
}
- case QType::SPF:
- {
+ case QType::SPF: {
const auto& content = dynamic_cast<const SPFRecordContent&>(*(record.d_content));
pbf_rr.add_string(5, content.getText());
break;
}
- case QType::SRV:
- {
+ case QType::SRV: {
const auto& content = dynamic_cast<const SRVRecordContent&>(*(record.d_content));
pbf_rr.add_string(5, content.d_target.toString());
break;
#include "filterpo.hh"
-namespace pdns {
- namespace ProtoZero {
- class RecMessage : public Message {
- public:
- RecMessage(): Message(d_msgbuf)
- {
- d_response = protozero::pbf_writer(d_rspbuf);
+namespace pdns
+{
+namespace ProtoZero
+{
+ class RecMessage : public Message
+ {
+ public:
+ RecMessage() :
+ Message(d_msgbuf)
+ {
+ d_response = protozero::pbf_writer(d_rspbuf);
+ }
+
+ RecMessage(std::string& buffer) :
+ Message(buffer)
+ {
+ d_response = protozero::pbf_writer(buffer);
+ }
+
+ // Start a new messagebuf, containing separate data for the response part
+ RecMessage(std::string::size_type sz1, std::string::size_type sz2) :
+ RecMessage()
+ {
+ reserve(sz1, sz2);
+ }
+
+ // Construct a Message with (partially) constructed content
+ RecMessage(const std::string& buf1, const std::string& buf2, std::string::size_type sz1, std::string::size_type sz2) :
+ Message(d_msgbuf), d_msgbuf{buf1}, d_rspbuf{buf2}
+ {
+ d_message = protozero::pbf_writer(d_msgbuf);
+ d_response = protozero::pbf_writer(d_rspbuf);
+ reserve(sz1, sz2);
+ }
+ RecMessage(const Message&) = delete;
+ RecMessage(Message&&) = delete;
+ RecMessage& operator=(const Message&) = delete;
+ RecMessage& operator=(Message&&) = delete;
+
+ void reserve(std::string::size_type sz1, std::string::size_type sz2)
+ {
+ // We expect to grow the buffers, in the end the d_message will contains the (grown) d_response
+ // This is extra space in addition to what's already there
+ // Different from what string.reserve() does
+ std::string::size_type extra = sz1 + d_rspbuf.length() + sz2;
+ if (d_msgbuf.capacity() < d_msgbuf.size() + extra) {
+ d_message.reserve(extra);
}
-
- RecMessage(std::string& buffer): Message(buffer)
- {
- d_response = protozero::pbf_writer(buffer);
- }
-
- // Start a new messagebuf, containing separate data for the response part
- RecMessage(std::string::size_type sz1, std::string::size_type sz2): RecMessage()
- {
- reserve(sz1, sz2);
- }
-
- // Construct a Message with (partially) constructed content
- RecMessage(const std::string& buf1, const std::string& buf2, std::string::size_type sz1, std::string::size_type sz2) :
- Message(d_msgbuf), d_msgbuf{buf1}, d_rspbuf{buf2}
- {
- d_message = protozero::pbf_writer(d_msgbuf);
- d_response = protozero::pbf_writer(d_rspbuf);
- reserve(sz1, sz2);
+ if (d_rspbuf.capacity() < d_rspbuf.size() + sz2) {
+ d_response.reserve(sz2);
}
- RecMessage(const Message&) = delete;
- RecMessage(Message&&) = delete;
- RecMessage& operator=(const Message&) = delete;
- RecMessage& operator=(Message&&) = delete;
-
- void reserve(std::string::size_type sz1, std::string::size_type sz2)
- {
- // We expect to grow the buffers, in the end the d_message will contains the (grown) d_response
- // This is extra space in addition to what's already there
- // Different from what string.reserve() does
- std::string::size_type extra = sz1 + d_rspbuf.length() + sz2;
- if (d_msgbuf.capacity() < d_msgbuf.size() + extra) {
- d_message.reserve(extra);
- }
- if (d_rspbuf.capacity() < d_rspbuf.size() + sz2) {
- d_response.reserve(sz2);
- }
+ }
+
+ const std::string& getMessageBuf() const
+ {
+ return d_msgbuf;
+ }
+
+ const std::string& getResponseBuf() const
+ {
+ return d_rspbuf;
+ }
+
+ std::string&& finishAndMoveBuf()
+ {
+ if (!d_rspbuf.empty()) {
+ d_message.add_message(13, d_rspbuf);
}
-
- const std::string& getMessageBuf() const
- {
- return d_msgbuf;
+ return std::move(d_msgbuf);
+ }
+
+ // DNSResponse related fields below
+
+ void addRR(const DNSRecord& record, const std::set<uint16_t>& exportTypes, bool udr);
+
+ void setAppliedPolicyType(const DNSFilterEngine::PolicyType type)
+ {
+ uint32_t p;
+
+ switch (type) {
+ case DNSFilterEngine::PolicyType::None:
+ p = 1;
+ break;
+ case DNSFilterEngine::PolicyType::QName:
+ p = 2;
+ break;
+ case DNSFilterEngine::PolicyType::ClientIP:
+ p = 3;
+ break;
+ case DNSFilterEngine::PolicyType::ResponseIP:
+ p = 4;
+ break;
+ case DNSFilterEngine::PolicyType::NSDName:
+ p = 5;
+ break;
+ case DNSFilterEngine::PolicyType::NSIP:
+ p = 6;
+ break;
+ default:
+ throw std::runtime_error("Unsupported protobuf policy type");
}
+ d_response.add_uint32(7, p);
+ }
- const std::string& getResponseBuf() const
- {
- return d_rspbuf;
- }
+ void setAppliedPolicyTrigger(const DNSName& trigger)
+ {
+ encodeDNSName(d_response, d_rspbuf, 8, trigger);
+ }
- std::string&& finishAndMoveBuf()
- {
- if (!d_rspbuf.empty()) {
- d_message.add_message(13, d_rspbuf);
- }
- return std::move(d_msgbuf);
- }
-
- // DNSResponse related fields below
-
- void addRR(const DNSRecord& record, const std::set<uint16_t>& exportTypes, bool udr);
-
- void setAppliedPolicyType(const DNSFilterEngine::PolicyType type)
- {
- uint32_t p;
-
- switch(type) {
- case DNSFilterEngine::PolicyType::None:
- p = 1;
- break;
- case DNSFilterEngine::PolicyType::QName:
- p = 2;
- break;
- case DNSFilterEngine::PolicyType::ClientIP:
- p = 3;
- break;
- case DNSFilterEngine::PolicyType::ResponseIP:
- p = 4;
- break;
- case DNSFilterEngine::PolicyType::NSDName:
- p = 5;
- break;
- case DNSFilterEngine::PolicyType::NSIP:
- p = 6;
- break;
- default:
- throw std::runtime_error("Unsupported protobuf policy type");
- }
- d_response.add_uint32(7, p);
- }
-
- void setAppliedPolicyTrigger(const DNSName& trigger)
- {
- encodeDNSName(d_response, d_rspbuf, 8, trigger);
- }
-
- void setAppliedPolicyHit(const std::string& hit)
- {
- d_response.add_string(9, hit);
- }
+ void setAppliedPolicyHit(const std::string& hit)
+ {
+ d_response.add_string(9, hit);
+ }
#ifdef NOD_ENABLED
- void clearUDR(std::string&);
+ void clearUDR(std::string&);
#endif
- private:
- std::string d_msgbuf;
- std::string d_rspbuf;
+ private:
+ std::string d_msgbuf;
+ std::string d_rspbuf;
#ifdef NOD_ENABLED
- vector<std::string::size_type> offsets;
+ vector<std::string::size_type> offsets;
#endif
- };
};
};
+};