@@ -367,7 +367,7 @@ func (r *resolver) Add(dt x.DNSTransport) (ok bool) {
367367 caching = true
368368 }
369369 r .Unlock ()
370- core .Go ("r.onAdd" , func () { r .listener .OnDNSAdded (tid ) })
370+ core .Go ("r.onAdd." + tid , func () { r .listener .OnDNSAdded (tid ) })
371371 ok = true
372372 case DNS53 , DOH , DOT , ODOH :
373373 r .Lock ()
@@ -391,10 +391,10 @@ func (r *resolver) Add(dt x.DNSTransport) (ok bool) {
391391 if tid == System || tid == Goos {
392392 // TODO: add other resolvers?
393393 // always add64 after having added the system transport
394- core .Gx ("r.Add64" , func () { r .Add64 (tid ) })
394+ core .Gx ("r.Add64." + tid , func () { r .Add64 (tid ) })
395395 }
396396
397- core .Go ("r.onAdd" , func () { r .listener .OnDNSAdded (tid ) })
397+ core .Go ("r.onAdd." + tid , func () { r .listener .OnDNSAdded (tid ) })
398398 ok = true
399399 default :
400400 log .E ("dns: unknown transport(%s) type: %s" , t .ID (), t .Type ())
@@ -478,7 +478,7 @@ func (r *resolver) Remove(tid string) (ok bool) {
478478
479479 if hasTransport {
480480 if id == System || id == Goos {
481- core .Gx ("r.Remove64" , func () { r .Remove64 (id ) })
481+ core .Gx ("r.Remove64." + tid , func () { r .Remove64 (id ) })
482482 }
483483 r .Lock ()
484484 r .stopIfExistsLocked (id )
@@ -499,7 +499,7 @@ func (r *resolver) Remove(tid string) (ok bool) {
499499 }
500500
501501 if hasTransport {
502- core .Go ("r.onRemove" , func () { r .listener .OnDNSRemoved (id ) })
502+ core .Go ("r.onRemove." + tid , func () { r .listener .OnDNSRemoved (id ) })
503503 }
504504
505505 return hasTransport
@@ -616,7 +616,34 @@ func (r *resolver) forward(q []byte, who, fid, uid string, chosenids ...string)
616616 return nil , NoDNS , errMissingQueryName
617617 }
618618
619- pref , oqcompleted := core .Grx ("r.onQuery" , func (_ context.Context ) (* x.DNSOpts , error ) {
619+ // when PtMode forces protocol translation, resolve AAAA in parallel
620+ // so that dns64/nat64 caches are warm for subsequent translations.
621+ pt := settings .PtMode .Load ()
622+ if who == OriginTunnel && xdns .IsAQType (uint16 (qtyp )) && ptmodeIsForce (pt ) {
623+ msg6 := xdns .Request6FromRequest4 (msg )
624+ smm6 := copySummary (ogsmm )
625+ smm6 .QType = int (dns .TypeAAAA )
626+ fid6 := core .Rand64 ()
627+
628+ if log .Verbose {
629+ log .V ("dns: fwd: for %s; force6 for %s:%s:%d; ptmode=%s" , uid , fid6 , qname , qtyp , pt )
630+ }
631+
632+ core .Gx ("r.fwd.aaaa." + fid6 + "." + qname , func () {
633+ _ , _ , _ = r .forwardInner (msg6 , smm6 , who , fid6 , uid , chosenids ... )
634+ })
635+ }
636+
637+ return r .forwardInner (msg , ogsmm , who , fid , uid , chosenids ... )
638+ }
639+
640+ func (r * resolver ) forwardInner (msg * dns.Msg , ogsmm * x.DNSSummary , who , fid , uid string , chosenids ... string ) ([]byte , string , error ) {
641+ starttime := time .Now ()
642+
643+ qname := ogsmm .QName
644+ qtyp := ogsmm .QType
645+
646+ pref , oqcompleted := core .Grx ("r.onQuery." + fid + "." + qname , func (_ context.Context ) (* x.DNSOpts , error ) {
620647 return r .listener .OnQuery (who , uid , qname , qtyp ), nil
621648 }, listenerTimeout )
622649 if ! oqcompleted || pref == nil {
@@ -799,7 +826,7 @@ runagain:
799826 }
800827
801828 if run == 1 {
802- pref2 , ouacompleted := core .Grx ("r.onUA." + qname , func (_ context.Context ) (* x.DNSOpts , error ) {
829+ pref2 , ouacompleted := core .Grx ("r.onUA." + fid + "." + qname , func (_ context.Context ) (* x.DNSOpts , error ) {
803830 return r .listener .OnUpstreamAnswer (who , smm , pref .Copy (), realips ), nil
804831 }, answerTimeout )
805832 if ! ouacompleted {
@@ -1086,7 +1113,7 @@ func (r *resolver) accept(c io.ReadWriteCloser, uid, fid string) (rx, tx int64,
10861113 frees := free
10871114 cnts := cnt
10881115 wg .Add (1 )
1089- core .Gx ("r.accept.do" , func () {
1116+ core .Gx ("r.accept.do." + fid , func () {
10901117 defer wg .Done ()
10911118 defer frees ()
10921119 m , err := r .dnstcp (qs , c , uid , fid )
@@ -1917,3 +1944,7 @@ func GetIPCsv(t Transport) string {
19171944 }
19181945 return sb .String ()
19191946}
1947+
1948+ func ptmodeIsForce (pt int32 ) bool {
1949+ return pt == settings .PtModeForce || pt == settings .PtModeForce46 || pt == settings .PtModeForce64
1950+ }
0 commit comments