Skip to content

Commit b848604

Browse files
committed
dnsx: preserve summary as sent by actual dns transports
decorative transports such as alg, cacher, dns64, resolver may meddle with summaries, but ideally, we want to preserve the original summary as transformed by an actual transport (doh, dot, upstream, goos, bootstrap etc) as-is.
1 parent ce0f210 commit b848604

3 files changed

Lines changed: 26 additions & 31 deletions

File tree

intra/dnsx/alg.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -934,8 +934,8 @@ func (t *dnsgateway) q(t1, t2 Transport, preset []netip.Addr, network, uid strin
934934

935935
// todo: skip alg for undelegated domains like ipv4only.arpa?
936936
if !hasq || !hasans || !rgood || ans0000 || dontalg {
937-
log.D("alg: skip; query %s<>%s[%s]:%s:%d / a:%d, dnssec(do? %t /ad? %t) self(%t) dontalg(%t) hasq(%t) hasans(%t) rgood(%t), ans0000(%t)",
938-
smm.ID, idstr(t1), uid, qname, qtyp, xdns.Len(ansin), smm.DO, smm.AD, uidself, dontalg, hasq, hasans, rgood, ans0000)
937+
log.D("alg: skip; query %s<>%s[%s]:%s:%d / a:%d + rdata: %s + status: %d, dnssec(do? %t /ad? %t) self(%t) dontalg(%t) hasq(%t) hasans(%t) rgood(%t), ans0000(%t)",
938+
smm.ID, idstr(t1), uid, qname, qtyp, xdns.Len(ansin), smm.RData, smm.Status, smm.DO, smm.AD, uidself, dontalg, hasq, hasans, rgood, ans0000)
939939
return ansin, nil
940940
}
941941

@@ -1854,14 +1854,16 @@ func Req(t Transport, network string, q *dns.Msg, smm *x.DNSSummary) (*dns.Msg,
18541854
r, err := t.Query(network, q, smm)
18551855

18561856
if r == nil {
1857-
log.V("alg: Req: %s:%d no answer; rdata: %s, rcode: %d; err? %v", qname, qtyp, smm.RData, smm.Status, err)
1857+
log.V("alg: Req: %s:%d no answer; by: %s, rdata: %s, status: %d; err? %v",
1858+
qname, qtyp, smm.ID, smm.RData, smm.Status, err)
18581859
return nil, err // err may be nil
18591860
}
18601861
if !xdns.IsServFailOrInvalid(r) {
18611862
return r, nil
18621863
}
18631864

1864-
log.V("alg: Req: %s:%d servfail; status: %d, rdata: %s, rcode %d", qname, qtyp, smm.RData, smm.Status, xdns.Rcode(r))
1865+
log.V("alg: Req: %s:%d servfail; by: %s, rdata: %d, status: %s, rcode %d",
1866+
qname, qtyp, smm.ID, smm.RData, smm.Status, xdns.Rcode(r))
18651867
return r, err
18661868
}
18671869

intra/dnsx/cacher.go

Lines changed: 18 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -380,54 +380,51 @@ func (t *ctransport) fetch(network string, q *dns.Msg, smmout *x.DNSSummary, cb
380380
}
381381
}()
382382

383-
cc := &cres{ans: nil, s: copySummary(smm2)}
383+
ccx := &cres{ans: nil, s: copySummary(smm2)}
384384
cc, err := t.reqbarrier.DoIt(key, func() (_ *cres, qerr error) {
385385
reqsent = true
386386
// ans may be nil
387-
cc.ans, qerr = Req(t.Transport, network, q, smm2)
388-
cc.s = copySummary(smm2) // copy summary to cc
387+
ccx.ans, qerr = Req(t.Transport, network, q, smm2)
388+
ccx.s = copySummary(smm2) // copy summary to cc
389389
t.hangoverCheckpoint()
390390
// cb.put no-ops when ans is nil or rcode != success (0)
391-
cb.put(key, cc)
392-
return cc, qerr
391+
cb.put(key, ccx)
392+
return ccx, qerr
393393
})
394394

395395
cachedres, fresh := cb.freshCopy(key) // always prefer value from cache
396396
cachehit := cachedres != nil
397397
// nil ans when Transport returns err (no servfail) and cache is empty
398-
hasans := cachedres != nil && cachedres.ans != nil
398+
cachedans := cachedres != nil && cachedres.ans != nil
399+
400+
// if there's no network connectivity (in hangover for 10s) don't
401+
// return cached/barriered response, instead return an error
402+
inhangover := t.hangover.Exceeds(httl)
399403

400404
// expect fresh values, except on verrs
401-
logwif(!fresh)("cache: barrier: (k: %s) hit? %t / hasans? %t / stale? %t; sent? %t, barrier: %s (cache: %s); qerr? %v",
402-
key, cachehit, hasans, !fresh, reqsent, cc, cachedres, err)
405+
logwif(cachehit && !fresh || err != nil)("cache: barrier: (k: %s) hit? %t / hitans? %t / stale? %t / sent? %t / hangover? %t, barrier: %s (cache: %s); qerr? %v",
406+
key, cachehit, cachedans, !fresh, reqsent, inhangover, cc, cachedres, err)
403407

404-
if !cachehit || !hasans { // cc.Val may be uncacheable (ex: rcode != 0)
405-
cachedres = cc.copy() // cc (cres) never nil; but cc.ans may be nil
408+
if !cachehit || !cachedans { // cc.Val may be uncacheable (ex: rcode != 0)
409+
cachedres = cc // cc (cres) never nil; but cc.ans may be nil
406410
}
407411

408-
// if there's no network connectivity (in hangover for 10s) don't
409-
// return cached/barriered response, instead return an error
410-
inhangover := t.hangover.Exceeds(httl)
411412
if inhangover {
412413
err = core.JoinErr(err, errHangover)
413414
log.W("cache: barrier: hangover(k: %s); sent? %t, discard ans (has? %t)",
414-
key, reqsent, hasans)
415-
if cachehit {
416-
fillSummary(cachedres.s, smm2)
417-
}
415+
key, reqsent, cachedans)
416+
fillSummary(cachedres.s, smm2)
418417
// mimic send fail
419418
smm2.Msg = err.Error()
420-
smm2.RCode = dns.RcodeServerFailure
419+
smm2.RCode = dns.RcodeBadTime
421420
smm2.Status = SendFailed
422421
// do not return any response (stall / drop silently)
423422
return nil, err
424423
}
425424

426425
// fres may be nil
427426
fres, cachedsmm, ferr := asResponse(q, cachedres, fresh)
428-
if cachehit { // fill from cachedsmm despite any err if cache was hit
429-
fillSummary(cachedsmm, smm2) // cachedsmm may itself be smm2
430-
}
427+
fillSummary(cachedsmm, smm2) // cachedsmm may itself be smm2
431428

432429
return fres, core.JoinErr(err, ferr)
433430
}
@@ -504,7 +501,6 @@ func (t *ctransport) Query(network string, q *dns.Msg, smm *x.DNSSummary) (*dns.
504501
t.Unlock()
505502

506503
response, err = t.fetch(network, q, smm, cb, key)
507-
508504
} else {
509505
err = errMissingQueryName // not really a transport error
510506
}
@@ -561,9 +557,6 @@ func fillSummary(s *x.DNSSummary, out *x.DNSSummary) {
561557
if out == nil || s == out {
562558
return
563559
}
564-
if s == out {
565-
return
566-
}
567560

568561
// prefer out
569562

intra/doh/doh.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -753,8 +753,8 @@ func (t *transport) Query(network string, q *dns.Msg, smm *x.DNSSummary) (r *dns
753753
if err != nil {
754754
smm.Msg = err.Error()
755755
}
756-
log.V("doh: (p/px/via %s/%s/%s); a:%d/sz:%d/pad:%d, q: %s:%s, data: %s, via: %s, err? %v",
757-
network, pid, rpid, xdns.Len(r), xdns.Size(r), xdns.EDNS0PadLen(r), smm.QName, smm.QType, smm.RData, smm.PID, err)
756+
log.V("doh: (p/px/via %s/%s/%s); a:%d/sz:%d/pad:%d, q: %s:%d, data: %s, code: %d, via: %s, err? %v",
757+
network, pid, rpid, xdns.Len(r), xdns.Size(r), xdns.EDNS0PadLen(r), smm.QName, smm.QType, smm.RData, smm.RCode, smm.PID, err)
758758
return r, err
759759
}
760760

0 commit comments

Comments
 (0)