diff --git a/nameserver/server.go b/nameserver/server.go index 9a1726e5..fd15bb3d 100644 --- a/nameserver/server.go +++ b/nameserver/server.go @@ -61,10 +61,15 @@ func (s *DNSServer) Start() error { err = mdnsClient.Start(s.iface) checkFatal(err) - LocalServeMux := dns.NewServeMux() - LocalServeMux.HandleFunc(LOCAL_DOMAIN, s.queryHandler([]Lookup{s.zone, mdnsClient})) - LocalServeMux.HandleFunc(RDNS_DOMAIN, s.rdnsHandler([]Lookup{s.zone, mdnsClient})) - LocalServeMux.HandleFunc(".", s.notUsHandler()) + // create two DNS request multiplexerers, depending on the protocol used by clients + // (we use the same protocol for asking upstream servers) + mux := func(client *dns.Client) *dns.ServeMux { + m := dns.NewServeMux() + m.HandleFunc(LOCAL_DOMAIN, s.queryHandler([]Lookup{s.zone, mdnsClient})) + m.HandleFunc(RDNS_DOMAIN, s.rdnsHandler([]Lookup{s.zone, mdnsClient}, client)) + m.HandleFunc(".", s.notUsHandler(client)) + return m + } mdnsServer, err := NewMDNSServer(s.zone) checkFatal(err) @@ -73,8 +78,8 @@ func (s *DNSServer) Start() error { checkFatal(err) address := fmt.Sprintf(":%d", s.port) - s.udpSrv = &dns.Server{Addr: address, Net: "udp", Handler: LocalServeMux} - s.tcpSrv = &dns.Server{Addr: address, Net: "tcp", Handler: LocalServeMux} + s.udpSrv = &dns.Server{Addr: address, Net: "udp", Handler: mux(&dns.Client{Net: "udp", UDPSize: UDPBufSize})} + s.tcpSrv = &dns.Server{Addr: address, Net: "tcp", Handler: mux(&dns.Client{Net: "tcp"})} go func() { Info.Printf("Listening for DNS on %s (UDP)", address) @@ -121,8 +126,8 @@ func (s *DNSServer) queryHandler(lookups []Lookup) dns.HandlerFunc { } } -func (s *DNSServer) rdnsHandler(lookups []Lookup) dns.HandlerFunc { - fallback := s.notUsHandler() +func (s *DNSServer) rdnsHandler(lookups []Lookup, client *dns.Client) dns.HandlerFunc { + fallback := s.notUsHandler(client) return func(w dns.ResponseWriter, r *dns.Msg) { q := r.Question[0] Debug.Printf("Reverse query: %+v", q) @@ -144,9 +149,7 @@ func (s *DNSServer) rdnsHandler(lookups []Lookup) dns.HandlerFunc { // When we receive a request for a name outside of our '.weave.local.' // domain, ask the configured DNS server as a fallback. -func (s *DNSServer) notUsHandler() dns.HandlerFunc { - dnsClient := new(dns.Client) - dnsClient.UDPSize = UDPBufSize +func (s *DNSServer) notUsHandler(dnsClient *dns.Client) dns.HandlerFunc { return func(w dns.ResponseWriter, r *dns.Msg) { q := r.Question[0] Debug.Printf("[dns msgid %d] Fallback query: %+v", r.MsgHdr.Id, q)