diff --git a/src/utils/dig/dig_exec.c b/src/utils/dig/dig_exec.c index 131760d3565b07f31f7a333249dfa28dd9dbadb9..03586cbec6c88223cca54877fbeedbc2f7935f68 100644 --- a/src/utils/dig/dig_exec.c +++ b/src/utils/dig/dig_exec.c @@ -92,7 +92,8 @@ static void process_dnstap(const query_t *query) for (;;) { Dnstap__Dnstap *frame = NULL; - ProtobufCBinaryData *msg = NULL; + Dnstap__Message *message = NULL; + ProtobufCBinaryData *wire = NULL; bool is_response; // Read next message. @@ -105,31 +106,34 @@ static void process_dnstap(const query_t *query) } // Check for dnstap message. - if (frame->type != DNSTAP__DNSTAP__TYPE__MESSAGE) { + if (frame->type == DNSTAP__DNSTAP__TYPE__MESSAGE) { + message = frame->message; + } else { WARN("ignoring non-dnstap message\n"); dt_reader_free_frame(reader, &frame); continue; } // Check for the type of dnstap message. - if (frame->message->has_response_message) { - msg = &frame->message->response_message; + if (message->has_response_message) { + wire = &message->response_message; is_response = true; - } else if (frame->message->has_query_message) { - if (!query->style.show_query) { - dt_reader_free_frame(reader, &frame); - continue; - } - msg = &frame->message->query_message; + } else if (message->has_query_message) { + wire = &message->query_message; is_response = false; } else { - WARN("unsupported dnstap message\n"); + WARN("dnstap frame contains no message\n"); + dt_reader_free_frame(reader, &frame); + continue; + } + + if (!is_response && !query->style.show_query) { dt_reader_free_frame(reader, &frame); continue; } // Create dns packet based on dnstap wire data. - knot_pkt_t *pkt = knot_pkt_new(msg->data, msg->len, NULL); + knot_pkt_t *pkt = knot_pkt_new(wire->data, wire->len, NULL); if (pkt == NULL) { ERR("can't allocate packet\n"); dt_reader_free_frame(reader, &frame); @@ -138,33 +142,27 @@ static void process_dnstap(const query_t *query) // Parse packet and reconstruct required data. if (knot_pkt_parse(pkt, 0) == KNOT_EOK) { - ProtobufCBinaryData *addr = NULL; - uint32_t port = 0; time_t timestamp = 0; float query_time = 0.0; net_t net_ctx = { 0 }; if (is_response) { - addr = &frame->message->response_address; - port = frame->message->response_port; - timestamp = frame->message->response_time_sec; + timestamp = message->response_time_sec; query_time = get_query_time(frame); } else { - addr = &frame->message->query_address; - port = frame->message->query_port; - timestamp = frame->message->query_time_sec; + timestamp = message->query_time_sec; } // Prepare connection information string. - if (addr->data != NULL && - frame->message->has_socket_family && - frame->message->has_socket_protocol) { + if (message->response_address.data != NULL && + message->has_socket_family && + message->has_socket_protocol) { struct sockaddr_storage ss; int family = AF_UNSPEC, proto = 0; - switch (frame->message->socket_family) { + switch (message->socket_family) { case DNSTAP__SOCKET_FAMILY__INET: family = AF_INET; break; @@ -175,7 +173,7 @@ static void process_dnstap(const query_t *query) break; } - switch (frame->message->socket_protocol) { + switch (message->socket_protocol) { case DNSTAP__SOCKET_PROTOCOL__UDP: proto = SOCK_DGRAM; break; @@ -186,8 +184,10 @@ static void process_dnstap(const query_t *query) break; } - sockaddr_set_raw(&ss, family, addr->data); - sockaddr_port_set(&ss, port); + sockaddr_set_raw(&ss, family, + message->response_address.data, + message->response_address.len); + sockaddr_port_set(&ss, message->response_port); get_addr_str(&ss, proto, &net_ctx.remote_str); }