From 8521fdea0e4cff0cb1e41c2ca62c3e9960b60c9d Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Fri, 10 Oct 2014 16:31:09 +0100 Subject: [PATCH] Reply with array of addresses for delegated query --- server/mdns_server.go | 16 ++++++++++------ server/server.go | 13 ++++++++++--- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/server/mdns_server.go b/server/mdns_server.go index b9ccd6ba..d289b642 100644 --- a/server/mdns_server.go +++ b/server/mdns_server.go @@ -24,14 +24,18 @@ func NewMDNSServer(zone *ZoneDb) (*MDNSServer, error) { return retval, nil } -func makeDNSReply(r *dns.Msg, name string, addr net.IP) *dns.Msg { +func makeDNSReply(r *dns.Msg, name string, addrs []net.IP) *dns.Msg { m := new(dns.Msg) m.SetReply(r) m.RecursionAvailable = true - hdr := dns.RR_Header{Name: name, Rrtype: dns.TypeA, - Class: dns.ClassINET, Ttl: 3600} - a := &dns.A{hdr, addr} - m.Answer = append(m.Answer, a) + m.Answer = make([]dns.RR, len(addrs)) + for i, addr := range addrs { + if ip4 := addr.To4(); ip4 != nil { + hdr := dns.RR_Header{Name: name, Rrtype: dns.TypeA, + Class: dns.ClassINET, Ttl: 3600} + m.Answer[i] = &dns.A{hdr, addr} + } + } return m } @@ -56,7 +60,7 @@ func (s *MDNSServer) Start(ifi *net.Interface) error { q := r.Question[0] ip, err := s.zone.MatchLocal(q.Name) if err == nil { - m := makeDNSReply(r, q.Name, ip) + m := makeDNSReply(r, q.Name, []net.IP{ip}) s.SendResponse(m) } else if s.addrIsLocal(w.RemoteAddr()) { // ignore this - it's our own query received via multicast diff --git a/server/server.go b/server/server.go index 36adf65c..9a67701f 100644 --- a/server/server.go +++ b/server/server.go @@ -52,7 +52,7 @@ func queryHandler(zone Zone, mdnsClient *MDNSClient) dns.HandlerFunc { q := r.Question[0] ip, err := zone.MatchLocal(q.Name) if err == nil { - m := makeDNSReply(r, q.Name, ip) + m := makeDNSReply(r, q.Name, []net.IP{ip}) w.WriteMsg(m) } else { log.Printf("Failed lookup for %s; sending mDNS query", q.Name) @@ -62,7 +62,7 @@ func queryHandler(zone Zone, mdnsClient *MDNSClient) dns.HandlerFunc { // Loop terminates when channel is closed by MDNSClient on timeout for resp := range channel { log.Printf("Got address response %s to query %s addr %s", resp.Name, q.Name, resp.Addr) - m := makeDNSReply(r, resp.Name, resp.Addr) + m := makeDNSReply(r, resp.Name, []net.IP{resp.Addr}) w.WriteMsg(m) } }() @@ -77,7 +77,14 @@ func notUsHandler() dns.HandlerFunc { q := r.Question[0] addrs, err := net.LookupIP(q.Name) if err == nil { - m := makeDNSReply(r, q.Name, addrs[0]) + // Filter out ipv6 addresses + filtered := make([]net.IP, 0) + for _, addr := range addrs { + if ip4 := addr.To4(); ip4 != nil { + filtered = append(filtered, ip4) + } + } + m := makeDNSReply(r, q.Name, filtered) w.WriteMsg(m) } else { m := makeDNSFailResponse(r)