Hi Ales,

Thanks for reviewing the V5 changes. Added NEWS entry and used SWITCH as
requested and combined the changes and tests into single patch.

Thanks,
Ketan

On Tue, Jan 20, 2026 at 11:47 PM Ales Musil <[email protected]> wrote:

>
>
> On Wed, Jan 21, 2026 at 12:57 AM Ketan Supanekar via dev <
> [email protected]> wrote:
>
>> Add DNS query statistics tracking using OVS coverage counters in
>> ovn-controller for observability into DNS query processing.
>>
>> Coverage counters provide a standardized way to track events and can
>> be queried using the coverage/read-counter and coverage/show commands.
>>
>> The following DNS-related coverage counters are added:
>> - dns_query_total: Total number of DNS queries received
>> - dns_query_type_a: Number of A (IPv4) record queries
>> - dns_query_type_aaaa: Number of AAAA (IPv6) record queries
>> - dns_query_type_ptr: Number of PTR (reverse lookup) queries
>> - dns_query_type_any: Number of ANY record queries
>> - dns_query_type_other: Number of other query types
>> - dns_cache_hit: Number of cache hits
>> - dns_cache_miss: Number of cache misses
>> - dns_response_sent: Number of DNS responses sent
>>
>> Coverage counters can be viewed using:
>>   ovn-appctl -t ovn-controller coverage/show
>>   ovn-appctl -t ovn-controller coverage/read-counter <counter_name>
>>
>> Signed-off-by: Ketan Supanekar <[email protected]>
>> ---
>>
>
> Hi Ketan,
>
> thank you for the v5. We should add a NEWS entry.
> I also have one small comment down below.
>
>
>>  controller/pinctrl.c | 42 ++++++++++++++++++++++++++++++++++++++++++
>>  1 file changed, 42 insertions(+)
>>
>> diff --git a/controller/pinctrl.c b/controller/pinctrl.c
>> index 6f7ae4037..81f677942 100644
>> --- a/controller/pinctrl.c
>> +++ b/controller/pinctrl.c
>> @@ -391,6 +391,22 @@ COVERAGE_DEFINE(pinctrl_drop_put_vport_binding);
>>  COVERAGE_DEFINE(pinctrl_notify_main_thread);
>>  COVERAGE_DEFINE(pinctrl_total_pin_pkts);
>>
>> +/* DNS query statistics - thread-safe coverage counters */
>> +COVERAGE_DEFINE(dns_query_total);
>> +COVERAGE_DEFINE(dns_query_type_a);
>> +COVERAGE_DEFINE(dns_query_type_aaaa);
>> +COVERAGE_DEFINE(dns_query_type_ptr);
>> +COVERAGE_DEFINE(dns_query_type_any);
>> +COVERAGE_DEFINE(dns_query_type_other);
>> +COVERAGE_DEFINE(dns_cache_hit);
>> +COVERAGE_DEFINE(dns_cache_miss);
>> +COVERAGE_DEFINE(dns_error_truncated);
>> +COVERAGE_DEFINE(dns_skipped_not_request);
>> +COVERAGE_DEFINE(dns_error_no_query);
>> +COVERAGE_DEFINE(dns_error_parse_failure);
>> +COVERAGE_DEFINE(dns_unsupported_ovn_owned);
>> +COVERAGE_DEFINE(dns_response_sent);
>> +
>>  struct empty_lb_backends_event {
>>      struct hmap_node hmap_node;
>>      long long int timestamp;
>> @@ -3366,6 +3382,9 @@ pinctrl_handle_dns_lookup(
>>      uint32_t success = 0;
>>      bool send_refuse = false;
>>
>> +    /* Track total DNS queries received */
>> +    COVERAGE_INC(dns_query_total);
>> +
>>      /* Parse result field. */
>>      const struct mf_field *f;
>>      enum ofperr ofperr = nx_pull_header(userdata, NULL, &f, NULL);
>> @@ -3392,6 +3411,7 @@ pinctrl_handle_dns_lookup(
>>      /* Check that the packet stores at least the minimal headers. */
>>      if (dp_packet_l4_size(pkt_in) < (UDP_HEADER_LEN + DNS_HEADER_LEN)) {
>>          VLOG_WARN_RL(&rl, "truncated dns packet");
>> +        COVERAGE_INC(dns_error_truncated);
>>          goto exit;
>>      }
>>
>> @@ -3399,17 +3419,20 @@ pinctrl_handle_dns_lookup(
>>      struct dns_header const *in_dns_header =
>> dp_packet_get_udp_payload(pkt_in);
>>      if (!in_dns_header) {
>>          VLOG_WARN_RL(&rl, "truncated dns packet");
>> +        COVERAGE_INC(dns_error_truncated);
>>          goto exit;
>>      }
>>
>>      /* Check if it is DNS request or not */
>>      if (in_dns_header->lo_flag & 0x80) {
>>          /* It's a DNS response packet which we are not interested in */
>> +        COVERAGE_INC(dns_skipped_not_request);
>>          goto exit;
>>      }
>>
>>      /* Check if at least one query request is present */
>>      if (!in_dns_header->qdcount) {
>> +        COVERAGE_INC(dns_error_no_query);
>>          goto exit;
>>      }
>>
>> @@ -3431,6 +3454,7 @@ pinctrl_handle_dns_lookup(
>>          uint8_t label_len = in_dns_data[idx++];
>>          if (in_dns_data + idx + label_len > end) {
>>              ds_destroy(&query_name);
>> +            COVERAGE_INC(dns_error_parse_failure);
>>              goto exit;
>>          }
>>          ds_put_buffer(&query_name, (const char *) in_dns_data + idx,
>> label_len);
>> @@ -3449,6 +3473,20 @@ pinctrl_handle_dns_lookup(
>>      }
>>
>>      uint16_t query_type = ntohs(get_unaligned_be16((void *)
>> in_dns_data));
>> +
>> +    /* Track query type statistics */
>> +    if (query_type == DNS_QUERY_TYPE_A) {
>> +        COVERAGE_INC(dns_query_type_a);
>> +    } else if (query_type == DNS_QUERY_TYPE_AAAA) {
>> +        COVERAGE_INC(dns_query_type_aaaa);
>> +    } else if (query_type == DNS_QUERY_TYPE_PTR) {
>> +        COVERAGE_INC(dns_query_type_ptr);
>> +    } else if (query_type == DNS_QUERY_TYPE_ANY) {
>> +        COVERAGE_INC(dns_query_type_any);
>> +    } else {
>> +        COVERAGE_INC(dns_query_type_other);
>> +    }
>>
>
> It would be better to use a switch here.
>
>
>> +
>>      /* Supported query types - A, AAAA, ANY and PTR */
>>      if (!(query_type == DNS_QUERY_TYPE_A || query_type ==
>> DNS_QUERY_TYPE_AAAA
>>            || query_type == DNS_QUERY_TYPE_ANY
>> @@ -3467,8 +3505,10 @@ pinctrl_handle_dns_lookup(
>>                                               &ovn_owned);
>>      ds_destroy(&query_name);
>>      if (!answer_data) {
>> +        COVERAGE_INC(dns_cache_miss);
>>          goto exit;
>>      }
>> +    COVERAGE_INC(dns_cache_hit);
>>
>>
>>      uint16_t ancount = 0;
>> @@ -3511,6 +3551,7 @@ pinctrl_handle_dns_lookup(
>>          if (ovn_owned && (query_type == DNS_QUERY_TYPE_AAAA ||
>>              query_type == DNS_QUERY_TYPE_A) && !ancount) {
>>              send_refuse = true;
>> +            COVERAGE_INC(dns_unsupported_ovn_owned);
>>          }
>>
>>          destroy_lport_addresses(&ip_addrs);
>> @@ -3595,6 +3636,7 @@ pinctrl_handle_dns_lookup(
>>      pin->packet_len = dp_packet_size(&pkt_out);
>>
>>      success = 1;
>> +    COVERAGE_INC(dns_response_sent);
>>  exit:
>>      if (!ofperr) {
>>          union mf_subvalue sv;
>> --
>> 2.52.0
>>
>> _______________________________________________
>> dev mailing list
>> [email protected]
>> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
>>
>>
> Regards,
> Ales
>
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to