net/dns/resolver, ipn/ipnlocal: wire up peerapi DoH server to DNS forwarder

Updates #1713

Change-Id: Ia4ed9d8c9cef0e70aa6d30f2852eaab80f5f695a
Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
This commit is contained in:
Brad Fitzpatrick
2021-11-23 09:58:34 -08:00
committed by Brad Fitzpatrick
parent 9bb91cb977
commit 25525b7754
3 changed files with 196 additions and 7 deletions

View File

@@ -546,8 +546,26 @@ type forwardQuery struct {
// ...
}
// forward forwards the query to all upstream nameservers and returns the first response.
// forward forwards the query to all upstream nameservers and waits for
// the first response.
//
// It either sends to f.responses and returns nil, or returns a
// non-nil error (without sending to the channel).
func (f *forwarder) forward(query packet) error {
ctx, cancel := context.WithTimeout(f.ctx, responseTimeout)
defer cancel()
return f.forwardWithDestChan(ctx, query, f.responses)
}
// forward forwards the query to all upstream nameservers and waits
// for the first response.
//
// It either sends to responseChan and returns nil, or returns a
// non-nil error (without sending to the channel).
//
// If backupResolvers are specified, they're used in the case that no
// upstreams are available.
func (f *forwarder) forwardWithDestChan(ctx context.Context, query packet, responseChan chan<- packet, backupResolvers ...resolverAndDelay) error {
domain, err := nameFromQuery(query.bs)
if err != nil {
return err
@@ -564,6 +582,9 @@ func (f *forwarder) forward(query packet) error {
clampEDNSSize(query.bs, maxResponseBytes)
resolvers := f.resolvers(domain)
if len(resolvers) == 0 {
resolvers = backupResolvers
}
if len(resolvers) == 0 {
return errNoUpstreams
}
@@ -575,9 +596,6 @@ func (f *forwarder) forward(query packet) error {
}
defer fq.closeOnCtxDone.Close()
ctx, cancel := context.WithTimeout(f.ctx, responseTimeout)
defer cancel()
resc := make(chan []byte, 1)
var (
mu sync.Mutex
@@ -616,7 +634,7 @@ func (f *forwarder) forward(query packet) error {
select {
case <-ctx.Done():
return ctx.Err()
case f.responses <- packet{v, query.addr}:
case responseChan <- packet{v, query.addr}:
return nil
}
case <-ctx.Done():