diff --git a/bpf/dns_tracker.h b/bpf/dns_tracker.h
index 5715269583793937add41fbc5e673b55d25b52a0..9fd7a52284e912002fe205a3fd62430a960aad50 100644
--- a/bpf/dns_tracker.h
+++ b/bpf/dns_tracker.h
@@ -9,6 +9,7 @@
 #define DNS_PORT        53
 #define DNS_QR_FLAG     0x8000
 #define UDP_MAXMSG      512
+#define EINVAL          22
 
 struct dns_header {
     u16 id;
@@ -64,21 +65,22 @@ static __always_inline u8 calc_dns_header_offset(pkt_info *pkt, void *data_end)
     return len;
 }
 
-static __always_inline void track_dns_packet(struct __sk_buff *skb, pkt_info *pkt) {
+static __always_inline int track_dns_packet(struct __sk_buff *skb, pkt_info *pkt) {
     void *data_end = (void *)(long)skb->data_end;
     if (pkt->id->dst_port == DNS_PORT || pkt->id->src_port == DNS_PORT) {
         dns_flow_id dns_req;
 
         u8 len = calc_dns_header_offset(pkt, data_end);
         if (!len) {
-            return;
+            return EINVAL;
         }
 
         struct dns_header dns;
+        int ret;
         u32 dns_offset = (long)pkt->l4_hdr - (long)skb->data + len;
 
-        if (bpf_skb_load_bytes(skb, dns_offset, &dns, sizeof(dns)) < 0) {
-            return;
+        if ((ret = bpf_skb_load_bytes(skb, dns_offset, &dns, sizeof(dns))) < 0) {
+            return -ret;
         }
 
         u16 dns_id = bpf_ntohs(dns.id);
@@ -101,6 +103,7 @@ static __always_inline void track_dns_packet(struct __sk_buff *skb, pkt_info *pk
              }
         } // end of dns response
     } // end of dns port check
+    return 0;
 }
 
 #endif // __DNS_TRACKER_H__
diff --git a/bpf/flows.c b/bpf/flows.c
index 219660e646f4c2d974e1456474704c3833abd05b..8e633a12a4a53f292146493fc0577c6b44dd4b93 100644
--- a/bpf/flows.c
+++ b/bpf/flows.c
@@ -72,9 +72,9 @@ static inline int flow_monitor(struct __sk_buff *skb, u8 direction) {
         // This is currently not to be enabled by default.
         calculate_flow_rtt(&pkt, direction, data_end);
     }
-
+    int dns_errno = 0;
     if (enable_dns_tracking) {
-        track_dns_packet(skb, &pkt);
+        dns_errno = track_dns_packet(skb, &pkt);
     }
     // TODO: we need to add spinlock here when we deprecate versions prior to 5.1, or provide
     // a spinlocked alternative version and use it selectively https://lwn.net/Articles/779120/
@@ -97,6 +97,7 @@ static inline int flow_monitor(struct __sk_buff *skb, u8 direction) {
         aggregate_flow->dns_record.id = pkt.dns_id;
         aggregate_flow->dns_record.flags = pkt.dns_flags;
         aggregate_flow->dns_record.latency = pkt.dns_latency;
+        aggregate_flow->dns_record.errno = dns_errno;
         long ret = bpf_map_update_elem(&aggregated_flows, &id, aggregate_flow, BPF_ANY);
         if (trace_messages && ret != 0) {
             // usually error -16 (-EBUSY) is printed here.
@@ -119,6 +120,7 @@ static inline int flow_monitor(struct __sk_buff *skb, u8 direction) {
             .dns_record.id = pkt.dns_id,
             .dns_record.flags = pkt.dns_flags,
             .dns_record.latency = pkt.dns_latency,
+            .dns_record.errno = dns_errno,
         };
 
         // even if we know that the entry is new, another CPU might be concurrently inserting a flow
diff --git a/bpf/types.h b/bpf/types.h
index f9790427be578701dcbd0f5ad942eb094fc83cd1..7d50bcc595ac0366f92188f3a4bd7367de09ff44 100644
--- a/bpf/types.h
+++ b/bpf/types.h
@@ -89,6 +89,7 @@ typedef struct flow_metrics_t {
         u16 id;
         u16 flags;
         u64 latency;
+        u8 errno;
     } __attribute__((packed)) dns_record;
     u64 flow_rtt;
 } __attribute__((packed)) flow_metrics;
diff --git a/pkg/decode/decode_protobuf.go b/pkg/decode/decode_protobuf.go
index e9179791415b6891b0d92f8e4569063cefba319c..694652589d5b221f596f86f4f914abc9c54e6d99 100644
--- a/pkg/decode/decode_protobuf.go
+++ b/pkg/decode/decode_protobuf.go
@@ -90,11 +90,13 @@ func PBFlowToMap(flow *pbflow.Record) config.GenericMap {
 		}
 	}
 
+	out["DnsErrno"] = flow.GetDnsErrno()
 	if flow.GetDnsId() != 0 {
 		out["DnsLatencyMs"] = flow.DnsLatency.AsDuration().Milliseconds()
 		out["DnsId"] = flow.GetDnsId()
 		out["DnsFlags"] = flow.GetDnsFlags()
 		out["DnsFlagsResponseCode"] = dnsRcodeToStr(flow.GetDnsFlags() & 0xF)
+		out["DnsErrno"] = uint32(0)
 	}
 
 	if flow.GetPktDropLatestDropCause() != 0 {
diff --git a/pkg/decode/decode_protobuf_test.go b/pkg/decode/decode_protobuf_test.go
index 717faae540d3ff8c830f007845c6bcae9247c904..67a6cdf776548ab1094574d7a40854809a62d025 100644
--- a/pkg/decode/decode_protobuf_test.go
+++ b/pkg/decode/decode_protobuf_test.go
@@ -55,7 +55,8 @@ func TestDecodeProtobuf(t *testing.T) {
 				AgentIp: &pbflow.IP{
 					IpFamily: &pbflow.IP_Ipv4{Ipv4: 0x0a090807},
 				},
-				Flags: 0x100,
+				Flags:    0x100,
+				DnsErrno: 0,
 			},
 			expected: &config.GenericMap{
 				"FlowDirection":   1,
@@ -76,6 +77,7 @@ func TestDecodeProtobuf(t *testing.T) {
 				"TimeFlowEndMs":   someTime.UnixMilli(),
 				"Interface":       "eth0",
 				"AgentIP":         "10.9.8.7",
+				"DnsErrno":        uint32(0),
 			},
 		},
 		{
@@ -109,6 +111,7 @@ func TestDecodeProtobuf(t *testing.T) {
 				AgentIp: &pbflow.IP{
 					IpFamily: &pbflow.IP_Ipv4{Ipv4: 0x0a090807},
 				},
+				DnsErrno: 0,
 			},
 			expected: &config.GenericMap{
 				"FlowDirection":   1,
@@ -128,6 +131,7 @@ func TestDecodeProtobuf(t *testing.T) {
 				"TimeFlowEndMs":   someTime.UnixMilli(),
 				"Interface":       "eth0",
 				"AgentIP":         "10.9.8.7",
+				"DnsErrno":        uint32(0),
 			},
 		},
 		{
@@ -161,6 +165,7 @@ func TestDecodeProtobuf(t *testing.T) {
 				},
 				IcmpType: 8,
 				IcmpCode: 0,
+				DnsErrno: 0,
 			},
 			expected: &config.GenericMap{
 				"FlowDirection":   1,
@@ -180,6 +185,7 @@ func TestDecodeProtobuf(t *testing.T) {
 				"AgentIP":         "10.9.8.7",
 				"IcmpType":        uint32(8),
 				"IcmpCode":        uint32(0),
+				"DnsErrno":        uint32(0),
 			},
 		},
 		{
@@ -213,6 +219,7 @@ func TestDecodeProtobuf(t *testing.T) {
 				},
 				IcmpType: 128,
 				IcmpCode: 0,
+				DnsErrno: 0,
 			},
 			expected: &config.GenericMap{
 				"FlowDirection":   1,
@@ -232,6 +239,7 @@ func TestDecodeProtobuf(t *testing.T) {
 				"AgentIP":         "101:101:101:101:101:101:101:101",
 				"IcmpType":        uint32(128),
 				"IcmpCode":        uint32(0),
+				"DnsErrno":        uint32(0),
 			},
 		},
 		{
@@ -264,6 +272,7 @@ func TestDecodeProtobuf(t *testing.T) {
 				AgentIp: &pbflow.IP{
 					IpFamily: &pbflow.IP_Ipv4{Ipv4: 0x0a090807},
 				},
+				DnsErrno: 0,
 			},
 			expected: &config.GenericMap{
 				"FlowDirection":   1,
@@ -277,6 +286,7 @@ func TestDecodeProtobuf(t *testing.T) {
 				"TimeFlowEndMs":   someTime.UnixMilli(),
 				"Interface":       "eth0",
 				"AgentIP":         "10.9.8.7",
+				"DnsErrno":        uint32(0),
 			},
 		},
 		{
@@ -319,6 +329,7 @@ func TestDecodeProtobuf(t *testing.T) {
 				DnsLatency:             durationpb.New(someDuration),
 				DnsId:                  1,
 				DnsFlags:               0x8001,
+				DnsErrno:               0,
 				TimeFlowRtt:            durationpb.New(someDuration),
 			},
 			expected: &config.GenericMap{
@@ -349,6 +360,7 @@ func TestDecodeProtobuf(t *testing.T) {
 				"DnsId":                  uint32(1),
 				"DnsFlags":               uint32(0x8001),
 				"DnsFlagsResponseCode":   "FormErr",
+				"DnsErrno":               uint32(0),
 				"TimeFlowRttNs":          someDuration.Nanoseconds(),
 			},
 		},
@@ -407,6 +419,7 @@ func TestPBFlowToMap(t *testing.T) {
 		DnsLatency:             durationpb.New(someDuration),
 		DnsId:                  1,
 		DnsFlags:               0x80,
+		DnsErrno:               0,
 		TimeFlowRtt:            durationpb.New(someDuration),
 	}
 
@@ -441,6 +454,7 @@ func TestPBFlowToMap(t *testing.T) {
 		"DnsId":                  uint32(1),
 		"DnsFlags":               uint32(0x80),
 		"DnsFlagsResponseCode":   "NoError",
+		"DnsErrno":               uint32(0),
 		"TimeFlowRttNs":          someDuration.Nanoseconds(),
 	}, out)
 
diff --git a/pkg/ebpf/bpf_bpfeb.go b/pkg/ebpf/bpf_bpfeb.go
index bb10a159179776cc442fbc4a294b3aad8dc84688..7f6ceebd822a3b5265cb5213a5112bf5b88edd4d 100644
--- a/pkg/ebpf/bpf_bpfeb.go
+++ b/pkg/ebpf/bpf_bpfeb.go
@@ -25,6 +25,7 @@ type BpfDnsRecordT struct {
 	Id      uint16
 	Flags   uint16
 	Latency uint64
+	Errno   uint8
 }
 
 type BpfFlowId BpfFlowIdT
diff --git a/pkg/ebpf/bpf_bpfeb.o b/pkg/ebpf/bpf_bpfeb.o
index 12b4001b8b2cf7624ef8cbbdfb3d4375a891a48f..0af59e932379b347f41e3564b964d6d3cb0ded49 100644
Binary files a/pkg/ebpf/bpf_bpfeb.o and b/pkg/ebpf/bpf_bpfeb.o differ
diff --git a/pkg/ebpf/bpf_bpfel.go b/pkg/ebpf/bpf_bpfel.go
index 8556d19a5a1c3245c922e45cae829831f1c31789..0f869406bc35fb37b5da483cf068b7b795b25526 100644
--- a/pkg/ebpf/bpf_bpfel.go
+++ b/pkg/ebpf/bpf_bpfel.go
@@ -25,6 +25,7 @@ type BpfDnsRecordT struct {
 	Id      uint16
 	Flags   uint16
 	Latency uint64
+	Errno   uint8
 }
 
 type BpfFlowId BpfFlowIdT
diff --git a/pkg/ebpf/bpf_bpfel.o b/pkg/ebpf/bpf_bpfel.o
index 5e001e1de72aa19a7028827941ae9dc6cfda9b3b..f938b3e4570b74b99c7b31e183abbd731f169f01 100644
Binary files a/pkg/ebpf/bpf_bpfel.o and b/pkg/ebpf/bpf_bpfel.o differ
diff --git a/pkg/exporter/proto.go b/pkg/exporter/proto.go
index b8d47be2f88fa09d3e9317d73e1ee018d40d93b9..800971dc61db0704a80010d63b22ba69def71acc 100644
--- a/pkg/exporter/proto.go
+++ b/pkg/exporter/proto.go
@@ -79,6 +79,7 @@ func v4FlowToPB(fr *flow.Record) *pbflow.Record {
 		PktDropLatestDropCause: fr.Metrics.PktDrops.LatestDropCause,
 		DnsId:                  uint32(fr.Metrics.DnsRecord.Id),
 		DnsFlags:               uint32(fr.Metrics.DnsRecord.Flags),
+		DnsErrno:               uint32(fr.Metrics.DnsRecord.Errno),
 		TimeFlowRtt:            durationpb.New(fr.TimeFlowRtt),
 	}
 	if fr.Metrics.DnsRecord.Latency != 0 {
@@ -128,6 +129,7 @@ func v6FlowToPB(fr *flow.Record) *pbflow.Record {
 		PktDropLatestDropCause: fr.Metrics.PktDrops.LatestDropCause,
 		DnsId:                  uint32(fr.Metrics.DnsRecord.Id),
 		DnsFlags:               uint32(fr.Metrics.DnsRecord.Flags),
+		DnsErrno:               uint32(fr.Metrics.DnsRecord.Errno),
 		TimeFlowRtt:            durationpb.New(fr.TimeFlowRtt),
 	}
 	if fr.Metrics.DnsRecord.Latency != 0 {
diff --git a/pkg/flow/record.go b/pkg/flow/record.go
index 54461c602e83dcfd963c6b1030d726694b5a40e8..cd5b3c2b6de494e98bdf36ebab024d6b736f3e1f 100644
--- a/pkg/flow/record.go
+++ b/pkg/flow/record.go
@@ -115,6 +115,10 @@ 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
diff --git a/pkg/flow/record_test.go b/pkg/flow/record_test.go
index 8709af0b6ac66dce6f19fcb550aa5477b901fc78..316bbe69948f287cc9350c08b0fffbadae239c0b 100644
--- a/pkg/flow/record_test.go
+++ b/pkg/flow/record_test.go
@@ -43,6 +43,7 @@ func TestRecordBinaryEncoding(t *testing.T) {
 		01, 00, // id
 		0x80, 00, // flags
 		0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, // latency
+		0x00, // errno
 		// u64 flow_rtt
 		0xad, 0xde, 0xef, 0xbe, 0xef, 0xbe, 0xad, 0xde,
 	}))
@@ -82,6 +83,7 @@ func TestRecordBinaryEncoding(t *testing.T) {
 				Id:      0x0001,
 				Flags:   0x0080,
 				Latency: 0x1817161514131211,
+				Errno:   0,
 			},
 			FlowRtt: 0xdeadbeefbeefdead,
 		},
diff --git a/pkg/pbflow/flow.pb.go b/pkg/pbflow/flow.pb.go
index 16ad2116c0a63a50e85fe451f0b546dce03fd9f4..a0ed4ddcd1d9f1c9f0e09c7888ea9ee18a5614bb 100644
--- a/pkg/pbflow/flow.pb.go
+++ b/pkg/pbflow/flow.pb.go
@@ -191,6 +191,7 @@ type Record struct {
 	DnsFlags               uint32               `protobuf:"varint,22,opt,name=dns_flags,json=dnsFlags,proto3" json:"dns_flags,omitempty"`
 	DnsLatency             *durationpb.Duration `protobuf:"bytes,23,opt,name=dns_latency,json=dnsLatency,proto3" json:"dns_latency,omitempty"`
 	TimeFlowRtt            *durationpb.Duration `protobuf:"bytes,24,opt,name=time_flow_rtt,json=timeFlowRtt,proto3" json:"time_flow_rtt,omitempty"`
+	DnsErrno               uint32               `protobuf:"varint,25,opt,name=dns_errno,json=dnsErrno,proto3" json:"dns_errno,omitempty"`
 }
 
 func (x *Record) Reset() {
@@ -393,6 +394,13 @@ func (x *Record) GetTimeFlowRtt() *durationpb.Duration {
 	return nil
 }
 
+func (x *Record) GetDnsErrno() uint32 {
+	if x != nil {
+		return x.DnsErrno
+	}
+	return 0
+}
+
 type DataLink struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -670,7 +678,7 @@ var file_proto_flow_proto_rawDesc = []byte{
 	0x07, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x12, 0x28, 0x0a, 0x07, 0x65, 0x6e, 0x74, 0x72,
 	0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x70, 0x62, 0x66, 0x6c,
 	0x6f, 0x77, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69,
-	0x65, 0x73, 0x22, 0xef, 0x07, 0x0a, 0x06, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x21, 0x0a,
+	0x65, 0x73, 0x22, 0x8c, 0x08, 0x0a, 0x06, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x21, 0x0a,
 	0x0c, 0x65, 0x74, 0x68, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x01, 0x20,
 	0x01, 0x28, 0x0d, 0x52, 0x0b, 0x65, 0x74, 0x68, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c,
 	0x12, 0x2f, 0x0a, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20,
@@ -733,35 +741,37 @@ var file_proto_flow_proto_rawDesc = []byte{
 	0x6f, 0x77, 0x5f, 0x72, 0x74, 0x74, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67,
 	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44,
 	0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x74, 0x69, 0x6d, 0x65, 0x46, 0x6c, 0x6f,
-	0x77, 0x52, 0x74, 0x74, 0x22, 0x3c, 0x0a, 0x08, 0x44, 0x61, 0x74, 0x61, 0x4c, 0x69, 0x6e, 0x6b,
-	0x12, 0x17, 0x0a, 0x07, 0x73, 0x72, 0x63, 0x5f, 0x6d, 0x61, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28,
-	0x04, 0x52, 0x06, 0x73, 0x72, 0x63, 0x4d, 0x61, 0x63, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x73, 0x74,
-	0x5f, 0x6d, 0x61, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x64, 0x73, 0x74, 0x4d,
-	0x61, 0x63, 0x22, 0x6b, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x25, 0x0a,
-	0x08, 0x73, 0x72, 0x63, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
-	0x0a, 0x2e, 0x70, 0x62, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x49, 0x50, 0x52, 0x07, 0x73, 0x72, 0x63,
-	0x41, 0x64, 0x64, 0x72, 0x12, 0x25, 0x0a, 0x08, 0x64, 0x73, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72,
-	0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x70, 0x62, 0x66, 0x6c, 0x6f, 0x77, 0x2e,
-	0x49, 0x50, 0x52, 0x07, 0x64, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x64,
-	0x73, 0x63, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x64, 0x73, 0x63, 0x70, 0x22,
-	0x3d, 0x0a, 0x02, 0x49, 0x50, 0x12, 0x14, 0x0a, 0x04, 0x69, 0x70, 0x76, 0x34, 0x18, 0x01, 0x20,
-	0x01, 0x28, 0x07, 0x48, 0x00, 0x52, 0x04, 0x69, 0x70, 0x76, 0x34, 0x12, 0x14, 0x0a, 0x04, 0x69,
-	0x70, 0x76, 0x36, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x04, 0x69, 0x70, 0x76,
-	0x36, 0x42, 0x0b, 0x0a, 0x09, 0x69, 0x70, 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x22, 0x5d,
-	0x0a, 0x09, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x73,
-	0x72, 0x63, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x73,
-	0x72, 0x63, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x64, 0x73, 0x74, 0x5f, 0x70, 0x6f,
-	0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x64, 0x73, 0x74, 0x50, 0x6f, 0x72,
-	0x74, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x03, 0x20,
-	0x01, 0x28, 0x0d, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2a, 0x24, 0x0a,
-	0x09, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e,
-	0x47, 0x52, 0x45, 0x53, 0x53, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x45, 0x47, 0x52, 0x45, 0x53,
-	0x53, 0x10, 0x01, 0x32, 0x3e, 0x0a, 0x09, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72,
-	0x12, 0x31, 0x0a, 0x04, 0x53, 0x65, 0x6e, 0x64, 0x12, 0x0f, 0x2e, 0x70, 0x62, 0x66, 0x6c, 0x6f,
-	0x77, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x1a, 0x16, 0x2e, 0x70, 0x62, 0x66, 0x6c,
-	0x6f, 0x77, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x70, 0x6c,
-	0x79, 0x22, 0x00, 0x42, 0x0a, 0x5a, 0x08, 0x2e, 0x2f, 0x70, 0x62, 0x66, 0x6c, 0x6f, 0x77, 0x62,
-	0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x77, 0x52, 0x74, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x6e, 0x73, 0x5f, 0x65, 0x72, 0x72, 0x6e,
+	0x6f, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x64, 0x6e, 0x73, 0x45, 0x72, 0x72, 0x6e,
+	0x6f, 0x22, 0x3c, 0x0a, 0x08, 0x44, 0x61, 0x74, 0x61, 0x4c, 0x69, 0x6e, 0x6b, 0x12, 0x17, 0x0a,
+	0x07, 0x73, 0x72, 0x63, 0x5f, 0x6d, 0x61, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06,
+	0x73, 0x72, 0x63, 0x4d, 0x61, 0x63, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x73, 0x74, 0x5f, 0x6d, 0x61,
+	0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x64, 0x73, 0x74, 0x4d, 0x61, 0x63, 0x22,
+	0x6b, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x25, 0x0a, 0x08, 0x73, 0x72,
+	0x63, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x70,
+	0x62, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x49, 0x50, 0x52, 0x07, 0x73, 0x72, 0x63, 0x41, 0x64, 0x64,
+	0x72, 0x12, 0x25, 0x0a, 0x08, 0x64, 0x73, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x02, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x70, 0x62, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x49, 0x50, 0x52,
+	0x07, 0x64, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x73, 0x63, 0x70,
+	0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x64, 0x73, 0x63, 0x70, 0x22, 0x3d, 0x0a, 0x02,
+	0x49, 0x50, 0x12, 0x14, 0x0a, 0x04, 0x69, 0x70, 0x76, 0x34, 0x18, 0x01, 0x20, 0x01, 0x28, 0x07,
+	0x48, 0x00, 0x52, 0x04, 0x69, 0x70, 0x76, 0x34, 0x12, 0x14, 0x0a, 0x04, 0x69, 0x70, 0x76, 0x36,
+	0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x04, 0x69, 0x70, 0x76, 0x36, 0x42, 0x0b,
+	0x0a, 0x09, 0x69, 0x70, 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x22, 0x5d, 0x0a, 0x09, 0x54,
+	0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x72, 0x63, 0x5f,
+	0x70, 0x6f, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x73, 0x72, 0x63, 0x50,
+	0x6f, 0x72, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x64, 0x73, 0x74, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x64, 0x73, 0x74, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1a,
+	0x0a, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d,
+	0x52, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2a, 0x24, 0x0a, 0x09, 0x44, 0x69,
+	0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x47, 0x52, 0x45,
+	0x53, 0x53, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x45, 0x47, 0x52, 0x45, 0x53, 0x53, 0x10, 0x01,
+	0x32, 0x3e, 0x0a, 0x09, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x31, 0x0a,
+	0x04, 0x53, 0x65, 0x6e, 0x64, 0x12, 0x0f, 0x2e, 0x70, 0x62, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x52,
+	0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x1a, 0x16, 0x2e, 0x70, 0x62, 0x66, 0x6c, 0x6f, 0x77, 0x2e,
+	0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00,
+	0x42, 0x0a, 0x5a, 0x08, 0x2e, 0x2f, 0x70, 0x62, 0x66, 0x6c, 0x6f, 0x77, 0x62, 0x06, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
diff --git a/proto/flow.proto b/proto/flow.proto
index 35803d7d64cbca507b5c001ec6a1a00753ff1082..bf3209caf69e4dba21578d578fcf17d7e5341e88 100644
--- a/proto/flow.proto
+++ b/proto/flow.proto
@@ -53,6 +53,7 @@ message Record {
   uint32 dns_flags = 22;
   google.protobuf.Duration dns_latency = 23;
   google.protobuf.Duration time_flow_rtt = 24;
+  uint32 dns_errno = 25;
 }
 
 message DataLink {