case DNSAction::Action::Delay:
pdns::checked_stoi_into(dnsQuestion.ids.delayMsec, ruleresult); // sorry
break;
+ case DNSAction::Action::SetTag:
+ /* unsupported for non-dynamic block */
case DNSAction::Action::None:
/* fall-through */
case DNSAction::Action::NoOp:
return true;
});
return true;
+ case DNSAction::Action::SetTag:
+ {
+ if (!got->second.tagSettings) {
+ vinfolog("Skipping set tag dynamic block for query from %s because of missing options", dnsQuestion.ids.origRemote.toStringWithPort());
+ break;
+ }
+ updateBlockStats();
+ const auto& tagName = got->second.tagSettings->d_name;
+ const auto& tagValue = got->second.tagSettings->d_value;
+ dnsQuestion.setTag(tagName, tagValue);
+ vinfolog("Query from %s setting tag %s to %s because of dynamic block", dnsQuestion.ids.origRemote.toStringWithPort(), tagName, tagValue);
+ return true;
+ }
default:
updateBlockStats();
vinfolog("Query from %s dropped because of dynamic block", dnsQuestion.ids.origRemote.toStringWithPort());
return true;
});
return true;
+ case DNSAction::Action::SetTag:
+ {
+ if (!got->tagSettings) {
+ vinfolog("Skipping set tag dynamic block for query from %s because of missing options", dnsQuestion.ids.origRemote.toStringWithPort());
+ break;
+ }
+ updateBlockStats();
+ const auto& tagName = got->tagSettings->d_name;
+ const auto& tagValue = got->tagSettings->d_value;
+ dnsQuestion.setTag(tagName, tagValue);
+ vinfolog("Query from %s setting tag %s to %s because of dynamic block", dnsQuestion.ids.origRemote.toStringWithPort(), tagName, tagValue);
+ return true;
+ }
default:
updateBlockStats();
vinfolog("Query from %s for %s dropped because of dynamic block", dnsQuestion.ids.origRemote.toStringWithPort(), dnsQuestion.ids.qname.toLogString());
NoOp,
NoRecurse,
SpoofRaw,
- SpoofPacket
+ SpoofPacket,
+ SetTag,
};
static std::string typeToString(const Action& action)
{
return "Truncate over UDP";
case Action::ServFail:
return "Send ServFail";
+ case Action::SetTag:
+ return "Set Tag";
case Action::None:
case Action::NoOp:
return "Do nothing";
blocks.store(rhs.blocks);
warning = rhs.warning;
bpf = rhs.bpf;
+ if (rhs.tagSettings != nullptr) {
+ tagSettings = std::make_unique<TagSettings>(*rhs.tagSettings);
+ }
return *this;
}
blocks.store(rhs.blocks);
warning = rhs.warning;
bpf = rhs.bpf;
+ tagSettings = std::move(rhs.tagSettings);
return *this;
}
+ struct TagSettings
+ {
+ std::string d_name;
+ std::string d_value;
+ };
+
string reason;
DNSName domain;
timespec until{};
- mutable std::atomic<unsigned int> blocks{0};
+ std::unique_ptr<TagSettings> tagSettings{nullptr};
+ mutable std::atomic<uint32_t> blocks{0};
DNSAction::Action action{DNSAction::Action::None};
bool warning{false};
bool bpf{false};