From 05f9a6de03d2defbd997f32a29d089553865e9a3 Mon Sep 17 00:00:00 2001 From: Otto Moerbeek Date: Mon, 21 Jul 2025 14:44:51 +0200 Subject: [PATCH] Add a 1 byte version number to edns option OTTRACEIDS Signed-off-by: Otto Moerbeek --- pdns/dnsdistdist/dnsdist-actions-factory.cc | 2 +- pdns/protozero-trace.cc | 9 +++++---- pdns/sdig.cc | 7 ++++--- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/pdns/dnsdistdist/dnsdist-actions-factory.cc b/pdns/dnsdistdist/dnsdist-actions-factory.cc index 07e8ea9b19..e8f5d7af20 100644 --- a/pdns/dnsdistdist/dnsdist-actions-factory.cc +++ b/pdns/dnsdistdist/dnsdist-actions-factory.cc @@ -1521,7 +1521,7 @@ public: auto [protocol, httpProtocol] = ProtocolToDNSTap(dnsquestion->getProtocol()); // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) - DnstapMessage message(std::move(data), !dnsquestion->getHeader()->qr ? DnstapMessage::MessageType::client_query : DnstapMessage::MessageType::client_response, d_identity, &dnsquestion->ids.origRemote, &dnsquestion->ids.origDest, protocol, reinterpret_cast(dnsquestion->getData().data()), dnsquestion->getData().size(), &dnsquestion->getQueryRealTime(), nullptr, boost::none, httpProtocol); + DnstapMessagemessage(std::move(data), !dnsquestion->getHeader()->qr ? DnstapMessage::MessageType::client_query : DnstapMessage::MessageType::client_response, d_identity, &dnsquestion->ids.origRemote, &dnsquestion->ids.origDest, protocol, reinterpret_cast(dnsquestion->getData().data()), dnsquestion->getData().size(), &dnsquestion->getQueryRealTime(), nullptr, boost::none, httpProtocol); { if (d_alterFunc) { auto lock = g_lua.lock(); diff --git a/pdns/protozero-trace.cc b/pdns/protozero-trace.cc index 3599b688d8..c4b4a72285 100644 --- a/pdns/protozero-trace.cc +++ b/pdns/protozero-trace.cc @@ -515,13 +515,14 @@ void extractOTraceIDs(const EDNSOptionViewMap& map, pdns::trace::InitialSpanInfo const auto traceIDSize = span.trace_id.size(); if (const auto& option = map.find(EDNSOptionCode::OTTRACEIDS); option != map.end()) { + // 1 byte version, then tracid then optinal spanid if (option->second.values.size() > 0) { - if (option->second.values.at(0).size >= traceIDSize) { + if (option->second.values.at(0).size >= 1 + traceIDSize) { traceidset = true; - pdns::trace::fill(span.trace_id, option->second.values.at(0).content, traceIDSize); + pdns::trace::fill(span.trace_id, &option->second.values.at(0).content[1], traceIDSize); // NOLINT(cppcoreguidelines-pro-bounds-pointer-arithmetic) it's the API } - if (option->second.values.at(0).size == traceIDSize + span.parent_span_id.size()) { - pdns::trace::fill(span.parent_span_id, &option->second.values.at(0).content[traceIDSize], span.parent_span_id.size()); // NOLINT(cppcoreguidelines-pro-bounds-pointer-arithmetic) it's the API + if (option->second.values.at(0).size == 1 + traceIDSize + span.parent_span_id.size()) { + pdns::trace::fill(span.parent_span_id, &option->second.values.at(0).content[traceIDSize + 1], span.parent_span_id.size()); // NOLINT(cppcoreguidelines-pro-bounds-pointer-arithmetic) it's the API } } } diff --git a/pdns/sdig.cc b/pdns/sdig.cc index 6de3a4a951..98cbc91c10 100644 --- a/pdns/sdig.cc +++ b/pdns/sdig.cc @@ -97,9 +97,10 @@ static void fillPacket(vector& packet, const string& q, const string& t if (otids) { const auto traceid = otids->first; const auto spanid = otids->second; - std::array data{}; - std::copy(traceid.begin(), traceid.end(), data.begin()); - std::copy(spanid.begin(), spanid.end(), data.begin() + traceid.size()); + std::array data{}; + data.at(0) = 0; // version + std::copy(traceid.begin(), traceid.end(), &data.at(1)); + std::copy(spanid.begin(), spanid.end(), &data.at(1 + traceid.size())); opts.emplace_back(EDNSOptionCode::OTTRACEIDS, std::string_view(reinterpret_cast(data.data()), data.size())); // NOLINT } pw.addOpt(bufsize, 0, dnssec ? EDNSOpts::DNSSECOK : 0, opts); -- 2.47.2