1ff825849SDag-Erling Smørgrav// dnstap: flexible, structured event replication format for DNS software 2ff825849SDag-Erling Smørgrav// 3ff825849SDag-Erling Smørgrav// This file contains the protobuf schemas for the "dnstap" structured event 4ff825849SDag-Erling Smørgrav// replication format for DNS software. 5ff825849SDag-Erling Smørgrav 6ff825849SDag-Erling Smørgrav// Written in 2013-2014 by Farsight Security, Inc. 7ff825849SDag-Erling Smørgrav// 8ff825849SDag-Erling Smørgrav// To the extent possible under law, the author(s) have dedicated all 9ff825849SDag-Erling Smørgrav// copyright and related and neighboring rights to this file to the public 10ff825849SDag-Erling Smørgrav// domain worldwide. This file is distributed without any warranty. 11ff825849SDag-Erling Smørgrav// 12ff825849SDag-Erling Smørgrav// You should have received a copy of the CC0 Public Domain Dedication along 13ff825849SDag-Erling Smørgrav// with this file. If not, see: 14ff825849SDag-Erling Smørgrav// 15ff825849SDag-Erling Smørgrav// <http://creativecommons.org/publicdomain/zero/1.0/>. 16ff825849SDag-Erling Smørgrav 17*b7c0c8c1SCy Schubertsyntax = "proto2"; 18ff825849SDag-Erling Smørgravpackage dnstap; 19ff825849SDag-Erling Smørgrav 20ff825849SDag-Erling Smørgrav// "Dnstap": this is the top-level dnstap type, which is a "union" type that 21ff825849SDag-Erling Smørgrav// contains other kinds of dnstap payloads, although currently only one type 22ff825849SDag-Erling Smørgrav// of dnstap payload is defined. 23ff825849SDag-Erling Smørgrav// See: https://developers.google.com/protocol-buffers/docs/techniques#union 24ff825849SDag-Erling Smørgravmessage Dnstap { 25ff825849SDag-Erling Smørgrav // DNS server identity. 26ff825849SDag-Erling Smørgrav // If enabled, this is the identity string of the DNS server which generated 27ff825849SDag-Erling Smørgrav // this message. Typically this would be the same string as returned by an 28ff825849SDag-Erling Smørgrav // "NSID" (RFC 5001) query. 29ff825849SDag-Erling Smørgrav optional bytes identity = 1; 30ff825849SDag-Erling Smørgrav 31ff825849SDag-Erling Smørgrav // DNS server version. 32ff825849SDag-Erling Smørgrav // If enabled, this is the version string of the DNS server which generated 33ff825849SDag-Erling Smørgrav // this message. Typically this would be the same string as returned by a 34ff825849SDag-Erling Smørgrav // "version.bind" query. 35ff825849SDag-Erling Smørgrav optional bytes version = 2; 36ff825849SDag-Erling Smørgrav 37ff825849SDag-Erling Smørgrav // Extra data for this payload. 38ff825849SDag-Erling Smørgrav // This field can be used for adding an arbitrary byte-string annotation to 39ff825849SDag-Erling Smørgrav // the payload. No encoding or interpretation is applied or enforced. 40ff825849SDag-Erling Smørgrav optional bytes extra = 3; 41ff825849SDag-Erling Smørgrav 42ff825849SDag-Erling Smørgrav // Identifies which field below is filled in. 43ff825849SDag-Erling Smørgrav enum Type { 44ff825849SDag-Erling Smørgrav MESSAGE = 1; 45ff825849SDag-Erling Smørgrav } 46ff825849SDag-Erling Smørgrav required Type type = 15; 47ff825849SDag-Erling Smørgrav 48ff825849SDag-Erling Smørgrav // One of the following will be filled in. 49ff825849SDag-Erling Smørgrav optional Message message = 14; 50ff825849SDag-Erling Smørgrav} 51ff825849SDag-Erling Smørgrav 52ff825849SDag-Erling Smørgrav// SocketFamily: the network protocol family of a socket. This specifies how 53ff825849SDag-Erling Smørgrav// to interpret "network address" fields. 54ff825849SDag-Erling Smørgravenum SocketFamily { 55ff825849SDag-Erling Smørgrav INET = 1; // IPv4 (RFC 791) 56ff825849SDag-Erling Smørgrav INET6 = 2; // IPv6 (RFC 2460) 57ff825849SDag-Erling Smørgrav} 58ff825849SDag-Erling Smørgrav 59*b7c0c8c1SCy Schubert// SocketProtocol: the protocol used to transport a DNS message. 60ff825849SDag-Erling Smørgravenum SocketProtocol { 61*b7c0c8c1SCy Schubert UDP = 1; // DNS over UDP transport (RFC 1035 section 4.2.1) 62*b7c0c8c1SCy Schubert TCP = 2; // DNS over TCP transport (RFC 1035 section 4.2.2) 63*b7c0c8c1SCy Schubert DOT = 3; // DNS over TLS (RFC 7858) 64*b7c0c8c1SCy Schubert DOH = 4; // DNS over HTTPS (RFC 8484) 65*b7c0c8c1SCy Schubert DNSCryptUDP = 5; // DNSCrypt over UDP (https://dnscrypt.info/protocol) 66*b7c0c8c1SCy Schubert DNSCryptTCP = 6; // DNSCrypt over TCP (https://dnscrypt.info/protocol) 67*b7c0c8c1SCy Schubert DOQ = 7; // DNS over QUIC (RFC 9250) 68*b7c0c8c1SCy Schubert} 69*b7c0c8c1SCy Schubert 70*b7c0c8c1SCy Schubert// Policy: information about any name server operator policy 71*b7c0c8c1SCy Schubert// applied to the processing of a DNS message. 72*b7c0c8c1SCy Schubertmessage Policy { 73*b7c0c8c1SCy Schubert 74*b7c0c8c1SCy Schubert // Match: what aspect of the message or message exchange 75*b7c0c8c1SCy Schubert // triggered the application of the Policy. 76*b7c0c8c1SCy Schubert enum Match { 77*b7c0c8c1SCy Schubert QNAME = 1; // Name in question section of query 78*b7c0c8c1SCy Schubert CLIENT_IP = 2; // Client IP address 79*b7c0c8c1SCy Schubert RESPONSE_IP = 3; // Address in A/AAAA RRSet 80*b7c0c8c1SCy Schubert NS_NAME = 4; // Authoritative name server, by name 81*b7c0c8c1SCy Schubert NS_IP = 5; // Authoritative name server, by IP address 82*b7c0c8c1SCy Schubert } 83*b7c0c8c1SCy Schubert 84*b7c0c8c1SCy Schubert // The Action taken to implement the Policy. 85*b7c0c8c1SCy Schubert enum Action { 86*b7c0c8c1SCy Schubert NXDOMAIN = 1; // Respond with NXDOMAIN 87*b7c0c8c1SCy Schubert NODATA = 2; // Respond with empty answer section 88*b7c0c8c1SCy Schubert PASS = 3; // Do not alter the response (passthrough) 89*b7c0c8c1SCy Schubert DROP = 4; // Do not respond. 90*b7c0c8c1SCy Schubert TRUNCATE = 5; // Truncate UDP response, forcing TCP retry 91*b7c0c8c1SCy Schubert LOCAL_DATA = 6; // Respond with local data from policy 92*b7c0c8c1SCy Schubert } 93*b7c0c8c1SCy Schubert 94*b7c0c8c1SCy Schubert // type: the type of policy applied, e.g. "RPZ" for a 95*b7c0c8c1SCy Schubert // policy from a Response Policy Zone. 96*b7c0c8c1SCy Schubert optional string type = 1; 97*b7c0c8c1SCy Schubert 98*b7c0c8c1SCy Schubert // rule: the rule matched by the message. 99*b7c0c8c1SCy Schubert // 100*b7c0c8c1SCy Schubert // In a RPZ context, this is the owner name of the rule in 101*b7c0c8c1SCy Schubert // the Reponse Policy Zone in wire format. 102*b7c0c8c1SCy Schubert optional bytes rule = 2; 103*b7c0c8c1SCy Schubert 104*b7c0c8c1SCy Schubert // action: the policy action taken in response to the 105*b7c0c8c1SCy Schubert // rule match. 106*b7c0c8c1SCy Schubert optional Action action = 3; 107*b7c0c8c1SCy Schubert 108*b7c0c8c1SCy Schubert // match: the feature of the message exchange which matched the rule. 109*b7c0c8c1SCy Schubert optional Match match = 4; 110*b7c0c8c1SCy Schubert 111*b7c0c8c1SCy Schubert // The matched value. Format depends on the matched feature . 112*b7c0c8c1SCy Schubert optional bytes value = 5; 113ff825849SDag-Erling Smørgrav} 114ff825849SDag-Erling Smørgrav 115ff825849SDag-Erling Smørgrav// Message: a wire-format (RFC 1035 section 4) DNS message and associated 116ff825849SDag-Erling Smørgrav// metadata. Applications generating "Message" payloads should follow 117ff825849SDag-Erling Smørgrav// certain requirements based on the MessageType, see below. 118ff825849SDag-Erling Smørgravmessage Message { 119ff825849SDag-Erling Smørgrav 120ff825849SDag-Erling Smørgrav // There are eight types of "Message" defined that correspond to the 121ff825849SDag-Erling Smørgrav // four arrows in the following diagram, slightly modified from RFC 1035 122ff825849SDag-Erling Smørgrav // section 2: 123ff825849SDag-Erling Smørgrav 124ff825849SDag-Erling Smørgrav // +---------+ +----------+ +--------+ 125ff825849SDag-Erling Smørgrav // | | query | | query | | 126ff825849SDag-Erling Smørgrav // | Stub |-SQ--------CQ->| Recursive|-RQ----AQ->| Auth. | 127ff825849SDag-Erling Smørgrav // | Resolver| | Server | | Name | 128ff825849SDag-Erling Smørgrav // | |<-SR--------CR-| |<-RR----AR-| Server | 129ff825849SDag-Erling Smørgrav // +---------+ response | | response | | 130ff825849SDag-Erling Smørgrav // +----------+ +--------+ 131ff825849SDag-Erling Smørgrav 132ff825849SDag-Erling Smørgrav // Each arrow has two Type values each, one for each "end" of each arrow, 133ff825849SDag-Erling Smørgrav // because these are considered to be distinct events. Each end of each 134ff825849SDag-Erling Smørgrav // arrow on the diagram above has been marked with a two-letter Type 135ff825849SDag-Erling Smørgrav // mnemonic. Clockwise from upper left, these mnemonic values are: 136ff825849SDag-Erling Smørgrav // 137ff825849SDag-Erling Smørgrav // SQ: STUB_QUERY 138ff825849SDag-Erling Smørgrav // CQ: CLIENT_QUERY 139ff825849SDag-Erling Smørgrav // RQ: RESOLVER_QUERY 140ff825849SDag-Erling Smørgrav // AQ: AUTH_QUERY 141ff825849SDag-Erling Smørgrav // AR: AUTH_RESPONSE 142ff825849SDag-Erling Smørgrav // RR: RESOLVER_RESPONSE 143ff825849SDag-Erling Smørgrav // CR: CLIENT_RESPONSE 144ff825849SDag-Erling Smørgrav // SR: STUB_RESPONSE 145ff825849SDag-Erling Smørgrav 146ff825849SDag-Erling Smørgrav // Two additional types of "Message" have been defined for the 147ff825849SDag-Erling Smørgrav // "forwarding" case where an upstream DNS server is responsible for 148ff825849SDag-Erling Smørgrav // further recursion. These are not shown on the diagram above, but have 149ff825849SDag-Erling Smørgrav // the following mnemonic values: 150ff825849SDag-Erling Smørgrav 151ff825849SDag-Erling Smørgrav // FQ: FORWARDER_QUERY 152ff825849SDag-Erling Smørgrav // FR: FORWARDER_RESPONSE 153ff825849SDag-Erling Smørgrav 154ff825849SDag-Erling Smørgrav // The "Message" Type values are defined below. 155ff825849SDag-Erling Smørgrav 156ff825849SDag-Erling Smørgrav enum Type { 157ff825849SDag-Erling Smørgrav // AUTH_QUERY is a DNS query message received from a resolver by an 15805ab2901SDag-Erling Smørgrav // authoritative name server, from the perspective of the authoritative 159ff825849SDag-Erling Smørgrav // name server. 160ff825849SDag-Erling Smørgrav AUTH_QUERY = 1; 161ff825849SDag-Erling Smørgrav 162ff825849SDag-Erling Smørgrav // AUTH_RESPONSE is a DNS response message sent from an authoritative 163ff825849SDag-Erling Smørgrav // name server to a resolver, from the perspective of the authoritative 164ff825849SDag-Erling Smørgrav // name server. 165ff825849SDag-Erling Smørgrav AUTH_RESPONSE = 2; 166ff825849SDag-Erling Smørgrav 167ff825849SDag-Erling Smørgrav // RESOLVER_QUERY is a DNS query message sent from a resolver to an 168ff825849SDag-Erling Smørgrav // authoritative name server, from the perspective of the resolver. 169ff825849SDag-Erling Smørgrav // Resolvers typically clear the RD (recursion desired) bit when 170ff825849SDag-Erling Smørgrav // sending queries. 171ff825849SDag-Erling Smørgrav RESOLVER_QUERY = 3; 172ff825849SDag-Erling Smørgrav 173ff825849SDag-Erling Smørgrav // RESOLVER_RESPONSE is a DNS response message received from an 174ff825849SDag-Erling Smørgrav // authoritative name server by a resolver, from the perspective of 175ff825849SDag-Erling Smørgrav // the resolver. 176ff825849SDag-Erling Smørgrav RESOLVER_RESPONSE = 4; 177ff825849SDag-Erling Smørgrav 178ff825849SDag-Erling Smørgrav // CLIENT_QUERY is a DNS query message sent from a client to a DNS 179ff825849SDag-Erling Smørgrav // server which is expected to perform further recursion, from the 180ff825849SDag-Erling Smørgrav // perspective of the DNS server. The client may be a stub resolver or 181ff825849SDag-Erling Smørgrav // forwarder or some other type of software which typically sets the RD 182ff825849SDag-Erling Smørgrav // (recursion desired) bit when querying the DNS server. The DNS server 183ff825849SDag-Erling Smørgrav // may be a simple forwarding proxy or it may be a full recursive 184ff825849SDag-Erling Smørgrav // resolver. 185ff825849SDag-Erling Smørgrav CLIENT_QUERY = 5; 186ff825849SDag-Erling Smørgrav 187ff825849SDag-Erling Smørgrav // CLIENT_RESPONSE is a DNS response message sent from a DNS server to 188ff825849SDag-Erling Smørgrav // a client, from the perspective of the DNS server. The DNS server 189ff825849SDag-Erling Smørgrav // typically sets the RA (recursion available) bit when responding. 190ff825849SDag-Erling Smørgrav CLIENT_RESPONSE = 6; 191ff825849SDag-Erling Smørgrav 192ff825849SDag-Erling Smørgrav // FORWARDER_QUERY is a DNS query message sent from a downstream DNS 193ff825849SDag-Erling Smørgrav // server to an upstream DNS server which is expected to perform 194ff825849SDag-Erling Smørgrav // further recursion, from the perspective of the downstream DNS 195ff825849SDag-Erling Smørgrav // server. 196ff825849SDag-Erling Smørgrav FORWARDER_QUERY = 7; 197ff825849SDag-Erling Smørgrav 198ff825849SDag-Erling Smørgrav // FORWARDER_RESPONSE is a DNS response message sent from an upstream 199ff825849SDag-Erling Smørgrav // DNS server performing recursion to a downstream DNS server, from the 200ff825849SDag-Erling Smørgrav // perspective of the downstream DNS server. 201ff825849SDag-Erling Smørgrav FORWARDER_RESPONSE = 8; 202ff825849SDag-Erling Smørgrav 203ff825849SDag-Erling Smørgrav // STUB_QUERY is a DNS query message sent from a stub resolver to a DNS 204ff825849SDag-Erling Smørgrav // server, from the perspective of the stub resolver. 205ff825849SDag-Erling Smørgrav STUB_QUERY = 9; 206ff825849SDag-Erling Smørgrav 207ff825849SDag-Erling Smørgrav // STUB_RESPONSE is a DNS response message sent from a DNS server to a 208ff825849SDag-Erling Smørgrav // stub resolver, from the perspective of the stub resolver. 209ff825849SDag-Erling Smørgrav STUB_RESPONSE = 10; 210*b7c0c8c1SCy Schubert 211*b7c0c8c1SCy Schubert // TOOL_QUERY is a DNS query message sent from a DNS software tool to a 212*b7c0c8c1SCy Schubert // DNS server, from the perspective of the tool. 213*b7c0c8c1SCy Schubert TOOL_QUERY = 11; 214*b7c0c8c1SCy Schubert 215*b7c0c8c1SCy Schubert // TOOL_RESPONSE is a DNS response message received by a DNS software 216*b7c0c8c1SCy Schubert // tool from a DNS server, from the perspective of the tool. 217*b7c0c8c1SCy Schubert TOOL_RESPONSE = 12; 218*b7c0c8c1SCy Schubert 219*b7c0c8c1SCy Schubert // UPDATE_QUERY is a Dynamic DNS Update request (RFC 2136) received 220*b7c0c8c1SCy Schubert // by an authoritative name server, from the perspective of the 221*b7c0c8c1SCy Schubert // authoritative name server. 222*b7c0c8c1SCy Schubert UPDATE_QUERY = 13; 223*b7c0c8c1SCy Schubert 224*b7c0c8c1SCy Schubert // UPDATE_RESPONSE is a Dynamic DNS Update response (RFC 2136) sent 225*b7c0c8c1SCy Schubert // from an authoritative name server, from the perspective of the 226*b7c0c8c1SCy Schubert // authoritative name server. 227*b7c0c8c1SCy Schubert UPDATE_RESPONSE = 14; 228ff825849SDag-Erling Smørgrav } 229ff825849SDag-Erling Smørgrav 230ff825849SDag-Erling Smørgrav // One of the Type values described above. 231ff825849SDag-Erling Smørgrav required Type type = 1; 232ff825849SDag-Erling Smørgrav 233ff825849SDag-Erling Smørgrav // One of the SocketFamily values described above. 234ff825849SDag-Erling Smørgrav optional SocketFamily socket_family = 2; 235ff825849SDag-Erling Smørgrav 236ff825849SDag-Erling Smørgrav // One of the SocketProtocol values described above. 237ff825849SDag-Erling Smørgrav optional SocketProtocol socket_protocol = 3; 238ff825849SDag-Erling Smørgrav 239ff825849SDag-Erling Smørgrav // The network address of the message initiator. 240ff825849SDag-Erling Smørgrav // For SocketFamily INET, this field is 4 octets (IPv4 address). 241ff825849SDag-Erling Smørgrav // For SocketFamily INET6, this field is 16 octets (IPv6 address). 242ff825849SDag-Erling Smørgrav optional bytes query_address = 4; 243ff825849SDag-Erling Smørgrav 244ff825849SDag-Erling Smørgrav // The network address of the message responder. 245ff825849SDag-Erling Smørgrav // For SocketFamily INET, this field is 4 octets (IPv4 address). 246ff825849SDag-Erling Smørgrav // For SocketFamily INET6, this field is 16 octets (IPv6 address). 247ff825849SDag-Erling Smørgrav optional bytes response_address = 5; 248ff825849SDag-Erling Smørgrav 249ff825849SDag-Erling Smørgrav // The transport port of the message initiator. 250ff825849SDag-Erling Smørgrav // This is a 16-bit UDP or TCP port number, depending on SocketProtocol. 251ff825849SDag-Erling Smørgrav optional uint32 query_port = 6; 252ff825849SDag-Erling Smørgrav 253ff825849SDag-Erling Smørgrav // The transport port of the message responder. 254ff825849SDag-Erling Smørgrav // This is a 16-bit UDP or TCP port number, depending on SocketProtocol. 255ff825849SDag-Erling Smørgrav optional uint32 response_port = 7; 256ff825849SDag-Erling Smørgrav 257ff825849SDag-Erling Smørgrav // The time at which the DNS query message was sent or received, depending 258ff825849SDag-Erling Smørgrav // on whether this is an AUTH_QUERY, RESOLVER_QUERY, or CLIENT_QUERY. 259ff825849SDag-Erling Smørgrav // This is the number of seconds since the UNIX epoch. 260ff825849SDag-Erling Smørgrav optional uint64 query_time_sec = 8; 261ff825849SDag-Erling Smørgrav 262ff825849SDag-Erling Smørgrav // The time at which the DNS query message was sent or received. 263ff825849SDag-Erling Smørgrav // This is the seconds fraction, expressed as a count of nanoseconds. 264ff825849SDag-Erling Smørgrav optional fixed32 query_time_nsec = 9; 265ff825849SDag-Erling Smørgrav 266ff825849SDag-Erling Smørgrav // The initiator's original wire-format DNS query message, verbatim. 267ff825849SDag-Erling Smørgrav optional bytes query_message = 10; 268ff825849SDag-Erling Smørgrav 269ff825849SDag-Erling Smørgrav // The "zone" or "bailiwick" pertaining to the DNS query message. 270ff825849SDag-Erling Smørgrav // This is a wire-format DNS domain name. 271ff825849SDag-Erling Smørgrav optional bytes query_zone = 11; 272ff825849SDag-Erling Smørgrav 273ff825849SDag-Erling Smørgrav // The time at which the DNS response message was sent or received, 274ff825849SDag-Erling Smørgrav // depending on whether this is an AUTH_RESPONSE, RESOLVER_RESPONSE, or 275ff825849SDag-Erling Smørgrav // CLIENT_RESPONSE. 276ff825849SDag-Erling Smørgrav // This is the number of seconds since the UNIX epoch. 277ff825849SDag-Erling Smørgrav optional uint64 response_time_sec = 12; 278ff825849SDag-Erling Smørgrav 279ff825849SDag-Erling Smørgrav // The time at which the DNS response message was sent or received. 280ff825849SDag-Erling Smørgrav // This is the seconds fraction, expressed as a count of nanoseconds. 281ff825849SDag-Erling Smørgrav optional fixed32 response_time_nsec = 13; 282ff825849SDag-Erling Smørgrav 283ff825849SDag-Erling Smørgrav // The responder's original wire-format DNS response message, verbatim. 284ff825849SDag-Erling Smørgrav optional bytes response_message = 14; 285*b7c0c8c1SCy Schubert 286*b7c0c8c1SCy Schubert // Operator policy applied to the processing of this message, if any. 287*b7c0c8c1SCy Schubert optional Policy policy = 15; 288ff825849SDag-Erling Smørgrav} 289ff825849SDag-Erling Smørgrav 290ff825849SDag-Erling Smørgrav// All fields except for 'type' in the Message schema are optional. 291ff825849SDag-Erling Smørgrav// It is recommended that at least the following fields be filled in for 292ff825849SDag-Erling Smørgrav// particular types of Messages. 293ff825849SDag-Erling Smørgrav 294ff825849SDag-Erling Smørgrav// AUTH_QUERY: 295ff825849SDag-Erling Smørgrav// socket_family, socket_protocol 296ff825849SDag-Erling Smørgrav// query_address, query_port 297ff825849SDag-Erling Smørgrav// query_message 298ff825849SDag-Erling Smørgrav// query_time_sec, query_time_nsec 299ff825849SDag-Erling Smørgrav 300ff825849SDag-Erling Smørgrav// AUTH_RESPONSE: 301ff825849SDag-Erling Smørgrav// socket_family, socket_protocol 302ff825849SDag-Erling Smørgrav// query_address, query_port 303ff825849SDag-Erling Smørgrav// query_time_sec, query_time_nsec 304ff825849SDag-Erling Smørgrav// response_message 305ff825849SDag-Erling Smørgrav// response_time_sec, response_time_nsec 306ff825849SDag-Erling Smørgrav 307ff825849SDag-Erling Smørgrav// RESOLVER_QUERY: 308ff825849SDag-Erling Smørgrav// socket_family, socket_protocol 309ff825849SDag-Erling Smørgrav// query_message 310ff825849SDag-Erling Smørgrav// query_time_sec, query_time_nsec 311ff825849SDag-Erling Smørgrav// query_zone 312ff825849SDag-Erling Smørgrav// response_address, response_port 313ff825849SDag-Erling Smørgrav 314ff825849SDag-Erling Smørgrav// RESOLVER_RESPONSE: 315ff825849SDag-Erling Smørgrav// socket_family, socket_protocol 316ff825849SDag-Erling Smørgrav// query_time_sec, query_time_nsec 317ff825849SDag-Erling Smørgrav// query_zone 318ff825849SDag-Erling Smørgrav// response_address, response_port 319ff825849SDag-Erling Smørgrav// response_message 320ff825849SDag-Erling Smørgrav// response_time_sec, response_time_nsec 321ff825849SDag-Erling Smørgrav 322ff825849SDag-Erling Smørgrav// CLIENT_QUERY: 323ff825849SDag-Erling Smørgrav// socket_family, socket_protocol 324ff825849SDag-Erling Smørgrav// query_message 325ff825849SDag-Erling Smørgrav// query_time_sec, query_time_nsec 326ff825849SDag-Erling Smørgrav 327ff825849SDag-Erling Smørgrav// CLIENT_RESPONSE: 328ff825849SDag-Erling Smørgrav// socket_family, socket_protocol 329ff825849SDag-Erling Smørgrav// query_time_sec, query_time_nsec 330ff825849SDag-Erling Smørgrav// response_message 331ff825849SDag-Erling Smørgrav// response_time_sec, response_time_nsec 332