diff --git a/server/mdns_server.go b/server/mdns_server.go index 42249b09..4bb8fe10 100644 --- a/server/mdns_server.go +++ b/server/mdns_server.go @@ -24,16 +24,20 @@ func NewMDNSServer(zone Zone) (*MDNSServer, error) { return retval, nil } -func makeDNSReply(r *dns.Msg, name string, addrs []net.IP) *dns.Msg { +func makeDNSReply(r *dns.Msg, name string, qtype uint16, addrs []net.IP) *dns.Msg { m := new(dns.Msg) m.SetReply(r) m.RecursionAvailable = true - 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} + hdr := dns.RR_Header{Name: name, Rrtype: qtype, Class: dns.ClassINET, Ttl: 3600} + for _, addr := range addrs { + if qtype == dns.TypeA { + if ip4 := addr.To4(); ip4 != nil { + m.Answer = append(m.Answer, &dns.A{hdr, addr}) + } + } else if qtype == dns.TypeAAAA { + if ip4 := addr.To4(); ip4 == nil { + m.Answer = append(m.Answer, &dns.AAAA{hdr, addr}) + } } } return m @@ -60,7 +64,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, []net.IP{ip}) + m := makeDNSReply(r, q.Name, dns.TypeA, []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 ab38a9d4..357ac196 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, []net.IP{ip}) + m := makeDNSReply(r, q.Name, dns.TypeA, []net.IP{ip}) w.WriteMsg(m) } else { log.Printf("Failed lookup for %s; sending mDNS query", q.Name) @@ -67,7 +67,7 @@ func queryHandler(zone Zone, mdnsClient *MDNSClient) dns.HandlerFunc { } var response_msg *dns.Msg if len(replies) > 0 { - response_msg = makeDNSReply(r, q.Name, replies) + response_msg = makeDNSReply(r, q.Name, dns.TypeA, replies) } else { response_msg = makeDNSFailResponse(r) } @@ -79,20 +79,17 @@ func queryHandler(zone Zone, mdnsClient *MDNSClient) dns.HandlerFunc { } } +/* When we receive a request for a name outside of our '.weave' domain, call + the underlying lookup mechanism and return the answer(s) it gives. + Unfortunately, this means that TTLs from a real DNS server are lost - FIXME. +*/ func notUsHandler() dns.HandlerFunc { return func(w dns.ResponseWriter, r *dns.Msg) { q := r.Question[0] addrs, err := net.LookupIP(q.Name) var response_msg *dns.Msg if err == nil { - // Filter out ipv6 addresses - filtered := make([]net.IP, 0) - for _, addr := range addrs { - if ip4 := addr.To4(); ip4 != nil { - filtered = append(filtered, ip4) - } - } - response_msg = makeDNSReply(r, q.Name, filtered) + response_msg = makeDNSReply(r, q.Name, q.Qtype, addrs) } else { response_msg = makeDNSFailResponse(r) }