Skip to content

Commit d95e25a

Browse files
authored
dns parser: set RCODE only in DNS responses (#885)
* set RCODE only in DNS responses * prometheus logger: ignore default rcode in counter
1 parent 466760d commit d95e25a

File tree

4 files changed

+45
-9
lines changed

4 files changed

+45
-9
lines changed

Diff for: README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<p align="center">
22
<img src="https://goreportcard.com/badge/github.com/dmachard/go-dns-collector" alt="Go Report"/>
33
<img src="https://img.shields.io/badge/go%20version-min%201.21-green" alt="Go version"/>
4-
<img src="https://img.shields.io/badge/go%20tests-508-green" alt="Go tests"/>
4+
<img src="https://img.shields.io/badge/go%20tests-509-green" alt="Go tests"/>
55
<img src="https://img.shields.io/badge/go%20bench-21-green" alt="Go bench"/>
66
<img src="https://img.shields.io/badge/go%20lines-31977-green" alt="Go lines"/>
77
</p>

Diff for: dnsutils/dns_parser.go

+4-1
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,10 @@ func DecodePayload(dm *DNSMessage, header *DNSHeader, config *pkgconfig.Config)
163163
}
164164

165165
dm.DNS.ID = header.ID
166-
dm.DNS.Rcode = RcodeToString(header.Rcode)
166+
// set rcode only with response
167+
if header.Qr == 1 {
168+
dm.DNS.Rcode = RcodeToString(header.Rcode)
169+
}
167170
dm.DNS.Opcode = header.Opcode
168171

169172
// update dnstap operation if the opcode is equal to 5 (dns update)

Diff for: dnsutils/dns_parser_payload_test.go

+34-3
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@ func TestDecodePayload_QueryHappy(t *testing.T) {
4343

4444
if dm.DNS.ID != 0x9e84 ||
4545
dm.DNS.Opcode != 0 ||
46-
dm.DNS.Rcode != RcodeToString(0) ||
4746
dm.DNS.Flags.QR ||
4847
dm.DNS.Flags.TC ||
4948
dm.DNS.Flags.AA ||
@@ -72,7 +71,6 @@ func TestDecodePayload_QueryHappy(t *testing.T) {
7271
len(dm.DNS.DNSRRs.Records) != 0 {
7372
t.Errorf("Unexpected sections parsed")
7473
}
75-
7674
}
7775
func TestDecodePayload_QueryInvalid(t *testing.T) {
7876
payload := []byte{
@@ -996,7 +994,6 @@ func TestDecodePayload_Truncated(t *testing.T) {
996994
if dm.DNS.MalformedPacket != true {
997995
t.Errorf("expected packet to be malformed")
998996
}
999-
1000997
}
1001998

1002999
// Dynamic query (UPDATE)
@@ -1086,3 +1083,37 @@ func TestDecodePayload_MDNSResponseWithNoQuestion(t *testing.T) {
10861083
t.Error("expected no error on decode", err)
10871084
}
10881085
}
1086+
1087+
// Rcode should not be set on query
1088+
func TestDecodePayload_Query_NoRcode(t *testing.T) {
1089+
payload := []byte{
1090+
// transaction ID
1091+
0xb1, 0x17,
1092+
// flags
1093+
0x01, 0x00,
1094+
// questions
1095+
0x00, 0x01,
1096+
// answer
1097+
0x00, 0x00,
1098+
// authority
1099+
0x00, 0x00,
1100+
// additional
1101+
0x00, 0x00,
1102+
// queries
1103+
0x00, 0x00, 0x06, 0x00, 0x01,
1104+
}
1105+
1106+
dm := DNSMessage{}
1107+
dm.Init()
1108+
dm.DNS.Payload = payload
1109+
dm.DNS.Length = len(payload)
1110+
1111+
// decode header and paylo
1112+
header, _ := DecodeDNS(payload)
1113+
DecodePayload(&dm, &header, pkgconfig.GetDefaultConfig())
1114+
1115+
// check the rcode
1116+
if dm.DNS.Rcode != "-" {
1117+
t.Errorf("invalid rcode: %s", dm.DNS.Rcode)
1118+
}
1119+
}

Diff for: workers/prometheus.go

+6-4
Original file line numberDiff line numberDiff line change
@@ -372,10 +372,12 @@ func (w *PrometheusCountersSet) Record(dm dnsutils.DNSMessage) {
372372
w.epsCounters.TotalQtypes[dm.DNS.Qtype]++
373373
}
374374

375-
if _, exists := w.epsCounters.TotalRcodes[dm.DNS.Rcode]; !exists {
376-
w.epsCounters.TotalRcodes[dm.DNS.Rcode] = 1
377-
} else {
378-
w.epsCounters.TotalRcodes[dm.DNS.Rcode]++
375+
if dm.DNS.Rcode != "-" {
376+
if _, exists := w.epsCounters.TotalRcodes[dm.DNS.Rcode]; !exists {
377+
w.epsCounters.TotalRcodes[dm.DNS.Rcode] = 1
378+
} else {
379+
w.epsCounters.TotalRcodes[dm.DNS.Rcode]++
380+
}
379381
}
380382

381383
if _, exists := w.epsCounters.TotalOperations[dm.DNSTap.Operation]; !exists {

0 commit comments

Comments
 (0)