diff --git a/bpf/dns_tracker.h b/bpf/dns_tracker.h index 714e128626738723184a686ecf545981fe9069f0..73434befd71a47ea900e3ff95b8bf328772f826a 100644 --- a/bpf/dns_tracker.h +++ b/bpf/dns_tracker.h @@ -10,6 +10,7 @@ #define UDP_MAXMSG 512 #define EINVAL 22 #define DNS_DEFAULT_PORT 53 +#define ENOENT 2 struct dns_header { u16 id; @@ -67,6 +68,7 @@ static __always_inline u8 calc_dns_header_offset(pkt_info *pkt, void *data_end) static __always_inline int track_dns_packet(struct __sk_buff *skb, pkt_info *pkt) { void *data_end = (void *)(long)skb->data_end; + int ret = 0; if (pkt->id->dst_port == dns_port || pkt->id->src_port == dns_port || pkt->id->dst_port == DNS_DEFAULT_PORT || pkt->id->src_port == DNS_DEFAULT_PORT) { dns_flow_id dns_req; @@ -77,7 +79,6 @@ static __always_inline int track_dns_packet(struct __sk_buff *skb, pkt_info *pkt } struct dns_header dns; - int ret; u32 dns_offset = (long)pkt->l4_hdr - (long)skb->data + len; if ((ret = bpf_skb_load_bytes(skb, dns_offset, &dns, sizeof(dns))) < 0) { @@ -99,12 +100,14 @@ static __always_inline int track_dns_packet(struct __sk_buff *skb, pkt_info *pkt if (value != NULL) { pkt->dns_latency = ts - *value; bpf_map_delete_elem(&dns_flows, &dns_req); + } else { + ret = ENOENT; } pkt->dns_id = dns_id; pkt->dns_flags = flags; } // end of dns response } - return 0; + return ret; } #endif // __DNS_TRACKER_H__ diff --git a/pkg/decode/decode_protobuf.go b/pkg/decode/decode_protobuf.go index b98b815372c55253cce9ddaa12df82532f27795b..f2f3699a44da71c26e22c7369bf0f841b49fa9b4 100644 --- a/pkg/decode/decode_protobuf.go +++ b/pkg/decode/decode_protobuf.go @@ -117,11 +117,7 @@ func RecordToMap(fr *flow.Record) config.GenericMap { out["DnsId"] = dnsID out["DnsFlags"] = fr.Metrics.DnsRecord.Flags out["DnsFlagsResponseCode"] = DNSRcodeToStr(uint32(fr.Metrics.DnsRecord.Flags) & 0xF) - if fr.Metrics.DnsRecord.Latency != 0 { - out["DnsLatencyMs"] = fr.DNSLatency.Milliseconds() - } - // Not sure about the logic here, why erasing errno? - out["DnsErrno"] = uint32(0) + out["DnsLatencyMs"] = fr.DNSLatency.Milliseconds() } } diff --git a/pkg/decode/decode_protobuf_test.go b/pkg/decode/decode_protobuf_test.go index 8eb74cf896efc5337625ba737cc1d936c821cd76..6644d8322c9a33d0b454238122123ae0cc5026cf 100644 --- a/pkg/decode/decode_protobuf_test.go +++ b/pkg/decode/decode_protobuf_test.go @@ -101,7 +101,7 @@ func TestPBFlowToMap(t *testing.T) { "DnsId": uint16(1), "DnsFlags": uint16(0x80), "DnsFlagsResponseCode": "NoError", - "DnsErrno": uint32(0), + "DnsErrno": uint8(0), "TimeFlowRttNs": someDuration.Nanoseconds(), }, out) diff --git a/pkg/ebpf/bpf_arm64_bpfel.o b/pkg/ebpf/bpf_arm64_bpfel.o index e188a8b9cebac2aeb66c41968c8493357cb62563..b73811ea5361ffc65e9254ef042f9c24d2d9de75 100644 Binary files a/pkg/ebpf/bpf_arm64_bpfel.o and b/pkg/ebpf/bpf_arm64_bpfel.o differ diff --git a/pkg/ebpf/bpf_powerpc_bpfel.o b/pkg/ebpf/bpf_powerpc_bpfel.o index 19dc48bb5a9d5152f929e5e5240d88e45feeb40c..94f67ccb6ed1589104d1100e4692d0e7ae87c7da 100644 Binary files a/pkg/ebpf/bpf_powerpc_bpfel.o and b/pkg/ebpf/bpf_powerpc_bpfel.o differ diff --git a/pkg/ebpf/bpf_s390_bpfeb.o b/pkg/ebpf/bpf_s390_bpfeb.o index f116bfe59de2bb9743a6dd122357597612d9cf86..47506cc7d96fc58d5d278e990a4c544a98bb7d6b 100644 Binary files a/pkg/ebpf/bpf_s390_bpfeb.o and b/pkg/ebpf/bpf_s390_bpfeb.o differ diff --git a/pkg/ebpf/bpf_x86_bpfel.o b/pkg/ebpf/bpf_x86_bpfel.o index 22fe778e99d008fbfef53a36938223d58aeed0a3..98201800d8893921fc11ca48156471107da3f3bf 100644 Binary files a/pkg/ebpf/bpf_x86_bpfel.o and b/pkg/ebpf/bpf_x86_bpfel.o differ diff --git a/pkg/flow/record.go b/pkg/flow/record.go index 825ca37879490f6dd061049352e99a7b7db11771..0d948fcc27dccad8018247d354b185e7a844922d 100644 --- a/pkg/flow/record.go +++ b/pkg/flow/record.go @@ -105,6 +105,10 @@ func Accumulate(r *ebpf.BpfFlowMetrics, src *ebpf.BpfFlowMetrics) { r.DnsRecord.Flags |= src.DnsRecord.Flags if src.DnsRecord.Id != 0 { r.DnsRecord.Id = src.DnsRecord.Id + r.DnsRecord.Errno = src.DnsRecord.Errno + } + if r.DnsRecord.Errno != src.DnsRecord.Errno { + r.DnsRecord.Errno = src.DnsRecord.Errno } if r.DnsRecord.Latency < src.DnsRecord.Latency { r.DnsRecord.Latency = src.DnsRecord.Latency @@ -117,10 +121,6 @@ func Accumulate(r *ebpf.BpfFlowMetrics, src *ebpf.BpfFlowMetrics) { if src.Dscp != 0 { r.Dscp = src.Dscp } - // Accumulate DNSErrno - if src.DnsRecord.Errno != 0 { - r.DnsRecord.Errno = src.DnsRecord.Errno - } } // IP returns the net.IP equivalent object