diff options
Diffstat (limited to 'middleware/loadbalance/loadbalance.go')
-rw-r--r-- | middleware/loadbalance/loadbalance.go | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/middleware/loadbalance/loadbalance.go b/middleware/loadbalance/loadbalance.go index c81ad0c8a..e1bee25fd 100644 --- a/middleware/loadbalance/loadbalance.go +++ b/middleware/loadbalance/loadbalance.go @@ -14,18 +14,21 @@ func (r *RoundRobinResponseWriter) WriteMsg(res *dns.Msg) error { if res.Rcode != dns.RcodeSuccess { return r.ResponseWriter.WriteMsg(res) } - if len(res.Answer) < 2 { // don't even bother - return r.ResponseWriter.WriteMsg(res) - } - // put CNAMEs first, randomize a/aaaa's and put packet back together. - // TODO(miek): check family and give v6 more prio? + res.Answer = roundRobin(res.Answer) + res.Extra = roundRobin(res.Extra) + + return r.ResponseWriter.WriteMsg(res) +} + +func roundRobin(in []dns.RR) []dns.RR { cname := []dns.RR{} address := []dns.RR{} rest := []dns.RR{} - for _, r := range res.Answer { + for _, r := range in { switch r.Header().Rrtype { case dns.TypeCNAME: + // d d d d DNAME and friends here as well? cname = append(cname, r) case dns.TypeA, dns.TypeAAAA: address = append(address, r) @@ -36,7 +39,7 @@ func (r *RoundRobinResponseWriter) WriteMsg(res *dns.Msg) error { switch l := len(address); l { case 0, 1: - return r.ResponseWriter.WriteMsg(res) + break case 2: if dns.Id()%2 == 0 { address[0], address[1] = address[1], address[0] @@ -51,9 +54,9 @@ func (r *RoundRobinResponseWriter) WriteMsg(res *dns.Msg) error { address[q], address[p] = address[p], address[q] } } - res.Answer = append(cname, rest...) - res.Answer = append(res.Answer, address...) - return r.ResponseWriter.WriteMsg(res) + out := append(cname, rest...) + out = append(out, address...) + return out } // Should we pack and unpack here to fiddle with the packet... Not likely. |