dnsseed: separate IPv4 and IPv6 responses
This commit is contained in:
parent
28d329c835
commit
e06186309c
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
|
Loading…
Reference in New Issue