@@ -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 }
0 commit comments