Refactor into separate client and server classes

This commit is contained in:
Bryan Boreham committed 2014-10-08 11:30:42 +01:00
1 parent c3eed5d807
commit 37924f9f9b
4 files changed
+74 -44

No files matched your search

+16 -8
View File
@@ -26,20 +26,21 @@ func makeDNSReply(r *dns.Msg, name string, addr net.IP) *dns.Msg {
return m
}
var mdnsClient *weavedns.MDNSClient
var (
mdnsClient *weavedns.MDNSClient
mdnsServer *weavedns.MDNSServer
)
func handleMDNS(w dns.ResponseWriter, r *dns.Msg) {
// Here we have to handle both requests incoming, responses to queries
// we sent out, and responses to queries that other nodes sent
if len(r.Answer) > 0 {
mdnsClient.ResponseCallback(r)
} else if len(r.Question) > 0 {
// Ignore answers to other questions
if len(r.Answer) == 0 && len(r.Question) > 0 {
q := r.Question[0]
ip, err := zone.MatchLocal(q.Name)
if err == nil {
m := makeDNSReply(r, q.Name, ip)
mdnsClient.SendResponse(m)
mdnsServer.SendResponse(m)
} else if mdnsClient.IsInflightQuery(r) {
log.Println("Inflight Query", w.RemoteAddr(), w.LocalAddr())
// ignore this - it's our own query received via multicast
} else {
log.Printf("Failed MDNS lookup for %s", q.Name)
@@ -135,7 +136,14 @@ func main() {
} else {
log.Printf("Using mDNS on %s", ifaceName)
}
mdnsClient.Start()
err = mdnsClient.Start(iface)
if err != nil {
log.Fatal(err)
}
mdnsServer, err = weavedns.NewMDNSServer()
if err != nil {
log.Fatal(err)
}
go dns.ActivateAndServe(nil, conn, MDNSServeMux)
+18 -11
View File
@@ -59,7 +59,6 @@ type mDNSQueryInfo struct {
func NewMDNSClient() (*MDNSClient, error) {
conn, err := net.ListenUDP("udp4", &net.UDPAddr{IP: net.IPv4zero, Port: 0})
if err != nil {
log.Println(err)
return nil, err
}
retval := &MDNSClient{
@@ -69,10 +68,27 @@ func NewMDNSClient() (*MDNSClient, error) {
return retval, nil
}
func (c *MDNSClient) Start() {
func (c *MDNSClient) Start(ifi *net.Interface) error {
multicast, err := LinkLocalMulticastListener(ifi)
if err != nil {
return err
}
handleMDNS := func(w dns.ResponseWriter, r *dns.Msg) {
//log.Println("client received:", r)
// Only handle responses here
if len(r.Answer) > 0 {
c.ResponseCallback(r)
}
}
go dns.ActivateAndServe(nil, multicast, dns.HandlerFunc(handleMDNS))
queryChan := make(chan *MDNSInteraction, 4)
c.queryChan = queryChan
go c.queryLoop(queryChan)
return nil
}
func LinkLocalMulticastListener(ifi *net.Interface) (net.PacketConn, error) {
@@ -80,15 +96,6 @@ func LinkLocalMulticastListener(ifi *net.Interface) (net.PacketConn, error) {
return conn, err
}
func (c *MDNSClient) SendResponse(m *dns.Msg) error {
buf, err := m.Pack()
if err != nil {
return err
}
_, err = c.conn.WriteTo(buf, c.addr)
return err
}
// ACTOR client API
const (
+10 -25
View File
@@ -10,11 +10,6 @@ import (
var (
test_addr = net.ParseIP("9.8.7.6")
sendconn *net.UDPConn
sendAddr = &net.UDPAddr{
IP: net.ParseIP(ipv4mdns),
Port: 0,
}
)
func minimalServer(w dns.ResponseWriter, req *dns.Msg) {
@@ -39,7 +34,13 @@ func minimalServer(w dns.ResponseWriter, req *dns.Msg) {
log.Fatal("Nil buffer")
}
//log.Println("minimalServer sending:", buf)
_, err = sendconn.WriteTo(buf, ipv4Addr)
// 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.DialUDP("udp", nil, ipv4Addr)
if err != nil {
log.Fatal(err)
}
_, err = sendconn.Write(buf)
sendconn.Close()
if err != nil {
log.Fatal(err)
}
@@ -62,24 +63,7 @@ func TestSimpleQuery(t *testing.T) {
if err != nil {
t.Fatal(err)
}
mdnsClient.Start()
mux := dns.NewServeMux()
handleMDNS := func(w dns.ResponseWriter, r *dns.Msg) {
//log.Println("test received:", r)
// Only handle responses here
if len(r.Answer) > 0 {
mdnsClient.ResponseCallback(r)
}
}
mux.HandleFunc("weave", handleMDNS)
multicast, err := net.ListenMulticastUDP("udp", nil, ipv4Addr)
if err != nil {
t.Fatal(err)
}
go dns.ActivateAndServe(nil, multicast, mux)
sendconn, err = net.ListenUDP("udp", sendAddr)
err = mdnsClient.Start(nil)
if err != nil {
t.Fatal(err)
}
@@ -98,9 +82,10 @@ func TestSimpleQuery(t *testing.T) {
received_addr = resp.Addr
}
}()
mdnsClient.SendQuery("test.weave.", dns.TypeA, channel)
time.Sleep(1 * time.Second)
time.Sleep(200 * time.Millisecond)
if !received_addr.Equal(test_addr) {
t.Log("Unexpected result for test.weave", received_addr)
+30
View File
@@ -0,0 +1,30 @@
package weavedns
import (
"github.com/miekg/dns"
"net"
)
type MDNSServer struct {
sendconn *net.UDPConn
}
func NewMDNSServer() (*MDNSServer, error) {
//log.Println("minimalServer sending:", buf)
// 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})
if err != nil {
return nil, err
}
retval := &MDNSServer{sendconn: sendconn}
return retval, nil
}
func (s *MDNSServer) SendResponse(m *dns.Msg) error {
buf, err := m.Pack()
if err != nil {
return err
}
_, err = s.sendconn.WriteTo(buf, ipv4Addr)
return err
}