From e06186309ce8fdb8614aa982ba45aaf325099f98 Mon Sep 17 00:00:00 2001 From: George Tankersley Date: Thu, 21 May 2020 19:07:37 -0400 Subject: [PATCH] dnsseed: separate IPv4 and IPv6 responses --- dnsseed/dnsseed.go | 11 ++++++++++- zcash/address_book.go | 13 ++++++++++++- zcash/client.go | 9 +++++++-- 3 files changed, 29 insertions(+), 4 deletions(-) diff --git a/dnsseed/dnsseed.go b/dnsseed/dnsseed.go index 76da4e6..40866c5 100644 --- a/dnsseed/dnsseed.go +++ b/dnsseed/dnsseed.go @@ -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) diff --git a/zcash/address_book.go b/zcash/address_book.go index 16e1f2a..a38b269 100644 --- a/zcash/address_book.go +++ b/zcash/address_book.go @@ -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 } diff --git a/zcash/client.go b/zcash/client.go index 34fd63a..8e5d27e 100644 --- a/zcash/client.go +++ b/zcash/client.go @@ -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.