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 {