dnsseed: separate IPv4 and IPv6 responses

This commit is contained in:
George Tankersley 2020-05-21 19:07:37 -04:00
parent 28d329c835
commit e06186309c
3 changed files with 29 additions and 4 deletions

View File

@ -2,6 +2,7 @@ package dnsseed
import (
"context"
"net"
"github.com/coredns/coredns/plugin"
"github.com/coredns/coredns/request"
@ -34,7 +35,15 @@ func (zs ZcashSeeder) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns
return plugin.NextOrFailure(zs.Name(), zs.Next, ctx, w, r)
}
peerIPs := zs.seeder.Addresses(25)
var peerIPs []net.IP
switch state.QType() {
case dns.TypeA:
peerIPs = zs.seeder.Addresses(25)
case dns.TypeAAAA:
peerIPs = zs.seeder.AddressesV6(25)
default:
return dns.RcodeNotImplemented, nil
}
a := new(dns.Msg)
a.SetReply(r)

View File

@ -169,7 +169,7 @@ func (bk *AddressBook) waitForAddresses(n int, done chan struct{}) {
// GetAddressList returns a slice of n valid addresses in random order.
// If there aren't enough known addresses, it returns as many as we have.
func (bk *AddressBook) shuffleAddressList(n int) []net.IP {
func (bk *AddressBook) shuffleAddressList(n int, v6 bool) []net.IP {
bk.addrState.RLock()
defer bk.addrState.RUnlock()
@ -177,6 +177,17 @@ func (bk *AddressBook) shuffleAddressList(n int) []net.IP {
for k, v := range bk.peers {
if _, blacklisted := bk.blacklist[k]; blacklisted {
// Check in case we've accidentally registered a bad peer
continue
}
if v6 && v.netaddr.IP.To4() != nil {
// skip IPv4 addresses if we're asked for v6
continue
}
if !v6 && v.netaddr.IP.To4() == nil {
// skip IPv6 addresses if we're asked for v4
continue
}

View File

@ -368,9 +368,14 @@ func (s *Seeder) Ready() bool {
return s.WaitForAddresses(minimumReadyAddresses, 1*time.Millisecond) == nil
}
// Addresses returns a slice of n addresses or as many as we have if it's less than that.
// Addresses returns a slice of n IPv4 addresses or as many as we have if it's less than that.
func (s *Seeder) Addresses(n int) []net.IP {
return s.addrBook.shuffleAddressList(n)
return s.addrBook.shuffleAddressList(n, false)
}
// AddressesV6 returns a slice of n IPv6 addresses or as many as we have if it's less than that.
func (s *Seeder) AddressesV6(n int) []net.IP {
return s.addrBook.shuffleAddressList(n, true)
}
// testBlacklist adds a peer to the blacklist directly, for testing.