m.setDeviceName(deviceName);
if (!policyTags.empty()) {
- m.setPolicyTags(policyTags);
+ m.addPolicyTags(policyTags);
}
- std::string msg(m.movebuf());
+ std::string msg(m.finishAndMoveBuf());
for (auto& server : *t_protobufServers) {
server->queueData(msg);
}
return;
}
- std::string msg(message.movebuf());
+ std::string msg(message.finishAndMoveBuf());
for (auto& server : *t_protobufServers) {
server->queueData(msg);
}
pbMessage->setAppliedPolicyTrigger(appliedPolicy.d_trigger);
pbMessage->setAppliedPolicyHit(appliedPolicy.d_hit);
}
- // XXX if (nod)
- pbMessage->setPolicyTags(dc->d_policyTags);
+ pbMessage->addPolicyTags(dc->d_policyTags);
pbMessage->setInBytes(packet.size());
+ // Take s snap of the current protobuf buffer state to store in the PC
pbDataForCache = boost::make_optional(RecursorPacketCache::PBData{
- pbMessage->getmsgbuf(),
- pbMessage->getrspbuf(),
+ pbMessage->getMessageBuf(),
+ pbMessage->getResponseBuf(),
!appliedPolicy.getName().empty() || !dc->d_policyTags.empty()});
-
+#ifdef NOD_ENABLED
+ pbMessage->clearUDR(pbDataForCache->d_response);
+#endif
// Below are the fields that are not stored in the packet cache and will be appended here and on a cache hit
if (g_useKernelTimestamp && dc->d_kernelTimestamp.tv_sec) {
pbMessage->setQueryTime(dc->d_kernelTimestamp.tv_sec, dc->d_kernelTimestamp.tv_usec);
if (dc->d_logResponse) {
protobufLogResponse(*pbMessage);
}
-#ifdef NOD_ENABLED
- if (g_nodEnabled) {
- pbMessage->setNewlyObservedDomain(false);
- pbMessage->clearUDR();
- if (nod)
- pbMessage->removePolicyTag(g_nod_pbtag);
- if (hasUDR)
- pbMessage->removePolicyTag(g_udr_pbtag);
- }
-#endif /* NOD_ENABLED */
}
-#endif
+#endif /* HAVE_PROTOBUF */
if(!dc->d_tcp) {
struct msghdr msgh;
struct iovec iov;
pbMessage->setDeviceName(deviceName);
pbMessage->setFromPort(source.getPort());
pbMessage->setToPort(destination.getPort());
+#ifdef NOD_ENABLED
+ if (g_nodEnabled) {
+ pbMessage->setNewlyObservedDomain(false);
+ }
+#endif
protobufLogResponse(*pbMessage);
}
#endif /* HAVE_PROTOBUF */
// Start a new messagebug, constaining separate data for the response part
Message(std::string::size_type sz1, std::string::size_type sz2) : d_message{d_msgbuf}, d_response{d_rspbuf}
{
- if (d_msgbuf.capacity() < sz1) {
- d_msgbuf.reserve(sz1);
- }
- if (d_rspbuf.capacity() < sz2) {
- d_rspbuf.reserve(sz2);
- }
+ // This is extra space in addition to what's already there
+ // Different from what string.reserve() does
+ d_message.reserve(sz1);
+ d_response.reserve(sz2);
}
// Construct a Message with (partially) constructed content
Message(const std::string& buf1, const std::string& buf2, std::string::size_type sz1, std::string::size_type sz2) :
d_msgbuf{buf1}, d_rspbuf{buf2}, d_message{d_msgbuf}, d_response{d_rspbuf}
{
- // We expect to grow the buffer
- if (d_msgbuf.capacity() - d_msgbuf.length() < sz1) {
- d_msgbuf.reserve(d_msgbuf.length() + sz1);
- }
- if (d_rspbuf.capacity() - d_rspbuf.length() < sz2) {
- d_msgbuf.reserve(d_rspbuf.length() + sz2);
- }
+ // We expect to grow the buffers
+ // This is extra space in addition to what's already there
+ // Different from what string.reserve() does
+ d_message.reserve(sz1);
+ d_response.reserve(sz2);
}
- const std::string& getmsgbuf() const
+ const std::string& getMessageBuf() const
{
return d_msgbuf;
}
- const std::string& getrspbuf() const
+ const std::string& getResponseBuf() const
{
return d_rspbuf;
}
- std::string&& movebuf()
+ std::string&& finishAndMoveBuf()
{
if (!d_rspbuf.empty()) {
d_message.add_message(13, d_rspbuf);
#else
void addRR(const DNSRecord& record, const std::set<uint16_t>& exportTypes);
#endif
- void clearUDR()
- {
- }
void setAppliedPolicy(const std::string& policy)
{
d_response.add_string(3, policy);
}
- void setPolicyTags(const std::unordered_set<std::string>& tags)
+ void addPolicyTags(const std::unordered_set<std::string>& tags)
{
for (const auto& tag : tags) {
d_response.add_string(4, tag);
}
void addPolicyTag(const string& tag)
{
- }
- void removePolicyTag(const string& tag)
- {
+ d_response.add_string(4, tag);
}
void setQueryTime(uint32_t sec, uint32_t usec)
{
d_response.add_string(9, hit);
}
+#ifdef NOD_ENABLED
+ void clearUDR(std::string&);
+#endif
+
private:
std::string d_msgbuf;
std::string d_rspbuf;
protozero::pbf_writer d_message;
protozero::pbf_writer d_response;
+
+#ifdef NOD_ENABLED
+ vector<std::string::size_type> offsets;
+#endif
};
};
};