Reply with array of addresses for delegated query

This commit is contained in:
Bryan Boreham committed 2014-10-10 16:31:09 +01:00
1 parent b5214f65e7
commit 8521fdea0e
2 files changed
+20 -9

No files matched your search

+10 -6
View File
@@ -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
+10 -3
View File
@@ -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)