diff --git a/server/dns.go b/server/dns.go new file mode 100644 index 00000000..24444b71 --- /dev/null +++ b/server/dns.go @@ -0,0 +1,30 @@ +package weavedns + +import ( + "github.com/miekg/dns" + "net" +) + +const ( + localTTL uint32 = 300 // somewhat arbitrary; we don't expect anyone + // downstream to cache results +) + +func makeDNSReply(r *dns.Msg, name string, qtype uint16, addrs []net.IP) *dns.Msg { + m := new(dns.Msg) + m.SetReply(r) + m.RecursionAvailable = true + hdr := dns.RR_Header{Name: name, Rrtype: qtype, Class: dns.ClassINET, Ttl: localTTL} + 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 +} diff --git a/server/mdns_server.go b/server/mdns_server.go index f335ea6f..f4956ee8 100644 --- a/server/mdns_server.go +++ b/server/mdns_server.go @@ -11,11 +11,6 @@ type MDNSServer struct { zone Zone } -const ( - localTTL uint32 = 300 // somewhat arbitrary; we don't expect anyone - // downstream to cache results -) - func NewMDNSServer(zone Zone) (*MDNSServer, error) { // This is a bit of a kludge - per the RFC we should send responses from 5353, but that doesn't seem to work sendconn, err := net.ListenUDP("udp4", &net.UDPAddr{IP: net.IPv4zero, Port: 0}) @@ -27,25 +22,6 @@ func NewMDNSServer(zone Zone) (*MDNSServer, error) { return retval, nil } -func makeDNSReply(r *dns.Msg, name string, qtype uint16, addrs []net.IP) *dns.Msg { - m := new(dns.Msg) - m.SetReply(r) - m.RecursionAvailable = true - hdr := dns.RR_Header{Name: name, Rrtype: qtype, Class: dns.ClassINET, Ttl: localTTL} - 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 -} - // Return true if testaddr is a UDP address with IP matching my local i/f func (s *MDNSServer) addrIsLocal(testaddr net.Addr) bool { if udpaddr, ok := testaddr.(*net.UDPAddr); ok {