Skip to content

Commit 3780a0e

Browse files
committed
dnsx/resolver: use secondary transport as fallback
1 parent 9865dfe commit 3780a0e

2 files changed

Lines changed: 29 additions & 23 deletions

File tree

intra/dnsx/transport.go

Lines changed: 27 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -594,20 +594,24 @@ runagain:
594594
log.V("dns: fwd: 1 for %s (%s); query %s:%d, r%d; [prefs:%v; chosen:%v]", uid, who, qname, qtyp, run, pref, chosenids)
595595

596596
id, sid, pids, presetIPs := r.preferencesFrom(qname, uint16(qtyp), pref, chosenids...)
597-
t := r.determineTransport(id) // id may be empty if pref is nil
598597

599-
log.V("dns: fwd: 2 for %s; query %s:%d, r%d; [prefs:%v; chosen:%v]; id? %s, sid? %s, pid? %s, ips? %v",
600-
uid, qname, qtyp, run, pref, chosenids, id, sid, pids, presetIPs)
598+
t := r.determineTransport(id) // id may be empty if pref is nil
599+
t2 := r.determineTransport(sid) // sid may be empty
600+
hasT1 := t != nil && !core.IsNil(t) // primary transport
601+
hasT2 := t2 != nil && !core.IsNil(t2) // secondary transport
601602

602-
if t == nil || core.IsNil(t) {
603-
smm.Latency = time.Since(starttime).Seconds()
604-
smm.Status = TransportError
605-
smm.Msg = strings.Join(append(chosenids, id, sid, errNoSuchTransport.Error()), ";")
606-
return nil, NoDNS, errNoSuchTransport
607-
}
608-
var t2 Transport
609-
if len(sid) > 0 {
610-
t2 = r.determineTransport(sid)
603+
log.V("dns: fwd: 2 for %s; query %s:%d, r%d; [prefs:%v; chosen:%v]; id? %s (%t), sid? %s (%t), pid? %s, ips? %v",
604+
uid, qname, qtyp, run, pref, chosenids, id, hasT1, sid, hasT2, pids, presetIPs)
605+
606+
if !hasT1 {
607+
if !hasT2 {
608+
smm.Latency = time.Since(starttime).Seconds()
609+
smm.Status = TransportError
610+
smm.Msg = strings.Join(append(chosenids, id, sid, errNoSuchTransport.Error()), ";")
611+
return nil, NoDNS, errNoSuchTransport
612+
}
613+
t = t2
614+
t2 = nil
611615
}
612616

613617
smm.Type = t.Type()
@@ -628,11 +632,11 @@ runagain:
628632
} else {
629633
smm.Msg = errNop.Error()
630634
}
631-
log.V("dns: fwd: 3 for %s; r%d, query blocked %s:%d by %s", uid, run, qname, qtyp, blocklists)
635+
log.V("dns: fwd: 3 %s for %s; r%d, query blocked %s:%d by %s", smm.ID, uid, run, qname, qtyp, blocklists)
632636
return b, smm.ID, e
633637
}
634638
} else {
635-
log.V("dns: fwd: 4 for %s; r%d, query NOT blocked %s:%d; why? %v", uid, run, qname, qtyp, err)
639+
log.V("dns: fwd: 4 %s for %s; r%d, query NOT blocked %s:%d; why? %v", smm.ID, uid, run, qname, qtyp, err)
636640
}
637641

638642
var res2 []byte
@@ -653,7 +657,7 @@ runagain:
653657

654658
if nonalg == nil || err != nil { // TODO: servfail?
655659
if isAlgErr(err) { // alg errs not set when gw.translate is off
656-
log.W("dns: fwd: for %s; r%d, alg error %s for %s:%d", uid, run, err, qname, qtyp)
660+
log.W("dns: fwd: 5 %s for %s; r%d, alg error %s for %s:%d", smm.ID, uid, run, err, qname, qtyp)
657661
smm.Status = NoResponse
658662
} else if smm.Status == Start {
659663
smm.Status = InternalError
@@ -709,7 +713,7 @@ runagain:
709713
smm.Msg = err.Error()
710714
}
711715

712-
log.V("dns: fwd: 5 for %s[%s]; query %s:%d, r%d, smm[data: %s, status: %d] blocked",
716+
log.V("dns: fwd: 6 for %s[%s]; query %s:%d, r%d, smm[data: %s, status: %d] blocked",
713717
smm.ID, uid, qname, qtyp, run, smm.RData, smm.Status)
714718
return res2, smm.ID, err
715719
}
@@ -718,7 +722,7 @@ runagain:
718722
ansblocked := xdns.AQuadAUnspecified(ans1)
719723

720724
if settings.Debug {
721-
log.V("dns: fwd: 6 for %s[%s]; query %s:%d, r%d, ips: %s; smm[data: %s, status: %d]; new-ans? %t, blocklists? %t, blocked? %t",
725+
log.V("dns: fwd: 7 for %s[%s]; query %s:%d, r%d, ips: %s; smm[data: %s, status: %d]; new-ans? %t, blocklists? %t, blocked? %t",
722726
smm.ID, uid, qname, qtyp, run, realips, smm.RData, smm.Status, isnewans, hasblocklists, ansblocked)
723727
}
724728

@@ -727,7 +731,7 @@ runagain:
727731
return r.listener.OnUpstreamAnswer(smm, pref.Copy(), realips), nil
728732
}, listenerTimeout)
729733
if !ouacompleted {
730-
log.W("dns: fwd: for %s[%s]; preferences2 missing for %s:%d; ips? %s", smm.ID, uid, qname, qtyp, realips)
734+
log.W("dns: fwd: 8 for %s[%s]; preferences2 missing for %s:%d; ips? %s", smm.ID, uid, qname, qtyp, realips)
731735
smm.Status = ClientError
732736
smm.Msg = errOnUpstreamAnswerTimeout.Error()
733737
smm.ID = NoDNS
@@ -739,7 +743,7 @@ runagain:
739743
goto runagain // re-run with new pids
740744
}
741745

742-
log.V("dns: fwd: 7 for %s[%s], r%d; preferences2 skipped for %s:%d [ips? %s]: %v",
746+
log.V("dns: fwd: 9 for %s[%s], r%d; preferences2 skipped for %s:%d [ips? %s]: %v",
743747
smm.ID, uid, run, qname, qtyp, realips, pref2)
744748
}
745749

@@ -836,13 +840,15 @@ func (r *resolver) determineTransport(id string) Transport {
836840
tf = r.transports[Default]
837841
r.RUnlock()
838842

843+
// id1 may be CT+Default which doesn't exist and so tf (Default) must be used
844+
isanydefault := isAnyDefault(id0, id1)
839845
mayusedefault := canUseDefaultDNS(id0)
840846
if t0 != nil && (t1 == nil || !mayusedefault || activeTransport(t0)) {
841847
return t0
842848
} else if t1 != nil && (!mayusedefault || activeTransport(t1)) {
843849
log.W("dns: fwd: %s missing or inactive; using %s instead", id0, id1)
844850
return t1
845-
} else if tf != nil && mayusedefault {
851+
} else if tf != nil && (mayusedefault || isanydefault) {
846852
log.W("dns: fwd: %s & %s missing or inactive; using default", id0, id1)
847853
return tf // todo: assert tf != nil?
848854
}
@@ -1173,7 +1179,7 @@ func (r *resolver) preferencesFrom(qname string, qtyp uint16, s *x.DNSOpts, chos
11731179
id1 = reqid
11741180
id2 = ""
11751181
} else if isAnyFixed(x...) || isAnyFixed(xx...) {
1176-
if id1 != Fixed && id1 != cacheprefix+Fixed { // Fixed must always be the primary transport
1182+
if id1 != Fixed && id1 != CT+Fixed { // Fixed must always be the primary transport
11771183
id2 = id1
11781184
id1 = Fixed
11791185
}

intra/ipn/wgproxy.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1642,7 +1642,7 @@ func (h *wgtun) listener(op wg.PktDir, err error) (ended bool) {
16421642
}
16431643

16441644
if s == TUP && op != wg.Opn { // ignore all else but open
1645-
h.statusReason.Store("TUP: waiting for wgconn")
1645+
h.statusReason.Store("TUP: waiting to connect")
16461646
return
16471647
}
16481648

@@ -1715,7 +1715,7 @@ func (h *wgtun) listener(op wg.PktDir, err error) (ended bool) {
17151715
h.latestGoodRead.Store(now)
17161716
} else if op.Write() {
17171717
h.latestGoodWrite.Store(now)
1718-
}
1718+
} // else: open, close, drop, etc
17191719
}
17201720

17211721
// s may also be TOK (for successful handshakes but not for transport data)

0 commit comments

Comments
 (0)