public:
DNSAction::Action operator()(DNSQuestion* dnsquestion, std::string* ruleresult) const override
{
+ (void)dnsquestion;
+ (void)ruleresult;
return Action::Drop;
}
[[nodiscard]] std::string toString() const override
public:
DNSAction::Action operator()(DNSQuestion* dnsquestion, std::string* ruleresult) const override
{
+ (void)dnsquestion;
+ (void)ruleresult;
return Action::Allow;
}
[[nodiscard]] std::string toString() const override
// this action does not stop the processing
DNSAction::Action operator()(DNSQuestion* dnsquestion, std::string* ruleresult) const override
{
+ (void)dnsquestion;
+ (void)ruleresult;
return Action::None;
}
[[nodiscard]] std::string toString() const override
}
DNSAction::Action operator()(DNSQuestion* dnsquestion, std::string* ruleresult) const override
{
+ (void)dnsquestion;
+ (void)ruleresult;
if (d_qps.lock()->check()) {
return Action::None;
}
}
DNSAction::Action operator()(DNSQuestion* dnsquestion, std::string* ruleresult) const override
{
+ (void)dnsquestion;
*ruleresult = std::to_string(d_msec);
return Action::Delay;
}
DNSAction::Action TeeAction::operator()(DNSQuestion* dnsquestion, std::string* ruleresult) const
{
+ (void)ruleresult;
if (dnsquestion->overTCP()) {
d_tcpdrops++;
return DNSAction::Action::None;
d_qps(QPSLimiter(limit, limit)), d_pool(std::move(pool)), d_stopProcessing(stopProcessing) {}
DNSAction::Action operator()(DNSQuestion* dnsquestion, std::string* ruleresult) const override
{
+ (void)ruleresult;
if (d_qps.lock()->check()) {
if (d_stopProcessing) {
/* we need to do it that way to keep compatiblity with custom Lua actions returning DNSAction.Pool, 'poolname' */
d_responseConfig(responseConfig), d_rcode(rcode) {}
DNSAction::Action operator()(DNSQuestion* dnsquestion, std::string* ruleresult) const override
{
+ (void)ruleresult;
dnsdist::PacketMangling::editDNSHeaderFromPacket(dnsquestion->getMutableData(), [this](dnsheader& header) {
header.rcode = d_rcode;
header.qr = true; // for good measure
}
DNSAction::Action operator()(DNSQuestion* dnsquestion, std::string* ruleresult) const override
{
+ (void)ruleresult;
dnsdist::PacketMangling::editDNSHeaderFromPacket(dnsquestion->getMutableData(), [this](dnsheader& header) {
header.rcode = (d_rcode & 0xF);
header.qr = true; // for good measure
DNSAction::Action operator()(DNSQuestion* dnsquestion, std::string* ruleresult) const override
{
+ (void)ruleresult;
if (!dnsdist::svc::generateSVCResponse(*dnsquestion, d_payloads, d_additionals4, d_additionals6, d_responseConfig)) {
return Action::None;
}
public:
DNSAction::Action operator()(DNSQuestion* dnsquestion, std::string* ruleresult) const override
{
+ (void)dnsquestion;
+ (void)ruleresult;
return Action::Truncate;
}
[[nodiscard]] std::string toString() const override
public:
DNSResponseAction::Action operator()(DNSResponse* dnsResponse, std::string* ruleresult) const override
{
+ (void)dnsResponse;
+ (void)ruleresult;
return Action::Truncate;
}
[[nodiscard]] std::string toString() const override
DNSAction::Action SpoofAction::operator()(DNSQuestion* dnsquestion, std::string* ruleresult) const
{
+ (void)ruleresult;
uint16_t qtype = dnsquestion->ids.qtype;
// do we even have a response?
if (d_cname.empty() && d_rawResponses.empty() &&
DNSAction::Action operator()(DNSQuestion* dnsquestion, std::string* ruleresult) const override
{
+ (void)ruleresult;
dnsdist::MacAddress mac{};
int res = dnsdist::MacAddressesCache::get(dnsquestion->ids.origRemote, mac.data(), mac.size());
if (res != 0) {
DNSAction::Action operator()(DNSQuestion* dnsquestion, std::string* ruleresult) const override
{
+ (void)ruleresult;
setEDNSOption(*dnsquestion, d_code, d_data);
return Action::None;
}
// this action does not stop the processing
DNSAction::Action operator()(DNSQuestion* dnsquestion, std::string* ruleresult) const override
{
+ (void)ruleresult;
dnsdist::PacketMangling::editDNSHeaderFromPacket(dnsquestion->getMutableData(), [](dnsheader& header) {
header.rd = false;
return true;
DNSAction::Action operator()(DNSQuestion* dnsquestion, std::string* ruleresult) const override
{
+ (void)ruleresult;
auto filepointer = std::atomic_load_explicit(&d_fp, std::memory_order_acquire);
if (!filepointer) {
if (!d_verboseOnly || dnsdist::configuration::getCurrentRuntimeConfiguration().d_verbose) {
DNSResponseAction::Action operator()(DNSResponse* response, std::string* ruleresult) const override
{
+ (void)ruleresult;
auto filepointer = std::atomic_load_explicit(&d_fp, std::memory_order_acquire);
if (!filepointer) {
if (!d_verboseOnly || dnsdist::configuration::getCurrentRuntimeConfiguration().d_verbose) {
// this action does not stop the processing
DNSAction::Action operator()(DNSQuestion* dnsquestion, std::string* ruleresult) const override
{
+ (void)ruleresult;
dnsdist::PacketMangling::editDNSHeaderFromPacket(dnsquestion->getMutableData(), [](dnsheader& header) {
header.cd = true;
return true;
// this action does not stop the processing
DNSAction::Action operator()(DNSQuestion* dnsquestion, std::string* ruleresult) const override
{
+ (void)ruleresult;
dnsquestion->ids.skipCache = true;
return Action::None;
}
public:
DNSResponseAction::Action operator()(DNSResponse* response, std::string* ruleresult) const override
{
+ (void)ruleresult;
response->ids.skipCache = true;
return Action::None;
}
}
DNSAction::Action operator()(DNSQuestion* dnsquestion, std::string* ruleresult) const override
{
+ (void)ruleresult;
dnsquestion->ids.tempFailureTTL = d_ttl;
return Action::None;
}
}
DNSAction::Action operator()(DNSQuestion* dnsquestion, std::string* ruleresult) const override
{
+ (void)ruleresult;
dnsquestion->ecsPrefixLength = dnsquestion->ids.origRemote.sin4.sin_family == AF_INET ? d_v4PrefixLength : d_v6PrefixLength;
return Action::None;
}
}
DNSAction::Action operator()(DNSQuestion* dnsquestion, std::string* ruleresult) const override
{
+ (void)ruleresult;
dnsquestion->ecsOverride = d_ecsOverride;
return Action::None;
}
// this action does not stop the processing
DNSAction::Action operator()(DNSQuestion* dnsquestion, std::string* ruleresult) const override
{
+ (void)ruleresult;
dnsquestion->useECS = false;
return Action::None;
}
DNSAction::Action operator()(DNSQuestion* dnsquestion, std::string* ruleresult) const override
{
+ (void)ruleresult;
if (d_hasV6) {
dnsquestion->ecs = std::make_unique<Netmask>(dnsquestion->ids.origRemote.isIPv4() ? d_v4 : d_v6);
}
}
DNSAction::Action operator()(DNSQuestion* dnsquestion, std::string* ruleresult) const override
{
+ (void)ruleresult;
static thread_local std::string data;
data.clear();
DNSAction::Action operator()(DNSQuestion* dnsquestion, std::string* ruleresult) const override
{
+ (void)ruleresult;
if (!dnsquestion->ids.d_protoBufData) {
dnsquestion->ids.d_protoBufData = std::make_unique<InternalQueryState::ProtoBufData>();
}
}
DNSAction::Action operator()(DNSQuestion* dnsquestion, std::string* ruleresult) const override
{
+ (void)ruleresult;
if (g_snmpAgent != nullptr && dnsdist::configuration::getImmutableConfiguration().d_snmpTrapsEnabled) {
g_snmpAgent->sendDNSTrap(*dnsquestion, d_reason);
}
}
DNSAction::Action operator()(DNSQuestion* dnsquestion, std::string* ruleresult) const override
{
+ (void)ruleresult;
dnsquestion->setTag(d_tag, d_value);
return Action::None;
}
DNSResponseAction::Action operator()(DNSResponse* response, std::string* ruleresult) const override
{
+ (void)ruleresult;
static thread_local std::string data;
struct timespec now = {};
gettime(&now, true);
}
DNSResponseAction::Action operator()(DNSResponse* response, std::string* ruleresult) const override
{
+ (void)ruleresult;
if (!response->ids.d_protoBufData) {
response->ids.d_protoBufData = std::make_unique<InternalQueryState::ProtoBufData>();
}
public:
DNSResponseAction::Action operator()(DNSResponse* response, std::string* ruleresult) const override
{
+ (void)response;
+ (void)ruleresult;
return Action::Drop;
}
[[nodiscard]] std::string toString() const override
public:
DNSResponseAction::Action operator()(DNSResponse* response, std::string* ruleresult) const override
{
+ (void)response;
+ (void)ruleresult;
return Action::Allow;
}
[[nodiscard]] std::string toString() const override
}
DNSResponseAction::Action operator()(DNSResponse* response, std::string* ruleresult) const override
{
+ (void)response;
*ruleresult = std::to_string(d_msec);
return Action::Delay;
}
}
DNSResponseAction::Action operator()(DNSResponse* response, std::string* ruleresult) const override
{
+ (void)ruleresult;
if (g_snmpAgent != nullptr && dnsdist::configuration::getImmutableConfiguration().d_snmpTrapsEnabled) {
g_snmpAgent->sendDNSTrap(*response, d_reason);
}
}
DNSResponseAction::Action operator()(DNSResponse* response, std::string* ruleresult) const override
{
+ (void)ruleresult;
response->setTag(d_tag, d_value);
return Action::None;
DNSResponseAction::Action operator()(DNSResponse* response, std::string* ruleresult) const override
{
+ (void)ruleresult;
if (!d_qtypes.empty()) {
clearDNSPacketRecordTypes(response->getMutableData(), d_qtypes);
}
DNSAction::Action operator()(DNSQuestion* dnsquestion, std::string* ruleresult) const override
{
+ (void)ruleresult;
if (d_action) {
/* call the action */
auto action = (*d_action)(dnsquestion, ruleresult);
{
}
- DNSAction::Action operator()(DNSQuestion* dnsquestion, std::string* ruleresult) const override
+ DNSAction::Action operator()([[maybe_unused]] DNSQuestion* dnsquestion, std::string* ruleresult) const override
{
+ (void)ruleresult;
#if defined(HAVE_DNS_OVER_HTTPS)
if (dnsquestion->ids.du) {
dnsquestion->ids.du->setHTTPResponse(d_code, PacketBuffer(d_body), d_contentType);
DNSAction::Action operator()(DNSQuestion* dnsquestion, std::string* ruleresult) const override
{
+ (void)ruleresult;
std::vector<std::string> keys = d_key->getKeys(*dnsquestion);
std::string result;
for (const auto& key : keys) {
DNSAction::Action operator()(DNSQuestion* dnsquestion, std::string* ruleresult) const override
{
+ (void)ruleresult;
std::vector<std::string> keys = d_key->getKeys(*dnsquestion);
std::string result;
for (const auto& key : keys) {
DNSAction::Action operator()(DNSQuestion* dnsquestion, std::string* ruleresult) const override
{
+ (void)ruleresult;
dnsquestion->ids.ttlCap = d_cap;
return DNSAction::Action::None;
}
DNSResponseAction::Action operator()(DNSResponse* response, std::string* ruleresult) const override
{
+ (void)ruleresult;
response->ids.ttlCap = d_cap;
return DNSResponseAction::Action::None;
}
DNSAction::Action operator()(DNSQuestion* dnsquestion, std::string* ruleresult) const override
{
+ (void)ruleresult;
if (!setNegativeAndAdditionalSOA(*dnsquestion, d_nxd, d_zone, d_ttl, d_mname, d_rname, d_params.serial, d_params.refresh, d_params.retry, d_params.expire, d_params.minimum, d_soaInAuthoritySection)) {
return Action::None;
}
DNSAction::Action operator()(DNSQuestion* dnsquestion, std::string* ruleresult) const override
{
+ (void)ruleresult;
if (!dnsquestion->proxyProtocolValues) {
dnsquestion->proxyProtocolValues = make_unique<std::vector<ProxyProtocolValue>>();
}
DNSAction::Action operator()(DNSQuestion* dnsquestion, std::string* ruleresult) const override
{
+ (void)ruleresult;
if (!dnsquestion->proxyProtocolValues) {
dnsquestion->proxyProtocolValues = make_unique<std::vector<ProxyProtocolValue>>();
}
DNSResponseAction::Action operator()(DNSResponse* response, std::string* ruleresult) const override
{
+ (void)ruleresult;
// NOLINTNEXTLINE(bugprone-easily-swappable-parameters)
auto visitor = [&](uint8_t section, uint16_t qclass, uint16_t qtype, uint32_t ttl) {
+ (void)section;
+ (void)qclass;
+ (void)qtype;
return ttl * d_ratio;
};
// NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
DNSAction::Action operator()(DNSQuestion* dnsQuestion, std::string* ruleresult) const override
{
+ (void)ruleresult;
dnsQuestion->ids.d_extendedError = std::make_unique<EDNSExtendedError>(d_ede);
return DNSAction::Action::None;
DNSResponseAction::Action operator()(DNSResponse* dnsResponse, std::string* ruleresult) const override
{
+ (void)ruleresult;
dnsResponse->ids.d_extendedError = std::make_unique<EDNSExtendedError>(d_ede);
return DNSResponseAction::Action::None;
DNSResponseAction::Action operator()(DNSResponse* dnsResponse, std::string* ruleresult) const override
{
+ (void)ruleresult;
dnsdist::PacketMangling::restrictDNSPacketTTLs(dnsResponse->getMutableData(), d_min, d_max, d_types);
return DNSResponseAction::Action::None;
}