From: Otto Moerbeek Date: Mon, 21 Jul 2025 12:44:51 +0000 (+0200) Subject: Add a 1 byte version number to edns option OTTRACEIDS X-Git-Tag: rec-5.4.0-alpha0~1^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=05f9a6de03d2defbd997f32a29d089553865e9a3;p=thirdparty%2Fpdns.git Add a 1 byte version number to edns option OTTRACEIDS Signed-off-by: Otto Moerbeek --- diff --git a/pdns/dnsdistdist/dnsdist-actions-factory.cc b/pdns/dnsdistdist/dnsdist-actions-factory.cc index 07e8ea9b1..e8f5d7af2 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 3599b688d..c4b4a7228 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 6de3a4a95..98cbc91c1 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);