diff --git a/client.go b/client.go index c0b2cae1..a560063a 100644 --- a/client.go +++ b/client.go @@ -446,9 +446,17 @@ func (c *client) sendQuery(msg *dns.Msg) error { switch runtime.GOOS { case "darwin", "ios", "linux": wcm.IfIndex = c.ifaces[ifi].Index + case "windows": + if c.ifaces[ifi].Name == "Teredo Tunneling Pseudo-Interface" { + log.Println("Skipping Teredo interface") + } else { + if err := c.ipv4conn.SetMulticastInterface(&c.ifaces[ifi]); err != nil { + log.Printf("[WARN] mdns: Failed to set multicast interface %s: %v", c.ifaces[ifi].Name, err) + } + } default: if err := c.ipv4conn.SetMulticastInterface(&c.ifaces[ifi]); err != nil { - log.Printf("[WARN] mdns: Failed to set multicast interface: %v", err) + log.Printf("[WARN] mdns: Failed to set multicast interface %s: %v", c.ifaces[ifi].Name, err) } } c.ipv4conn.WriteTo(buf, &wcm, ipv4Addr) @@ -463,9 +471,17 @@ func (c *client) sendQuery(msg *dns.Msg) error { switch runtime.GOOS { case "darwin", "ios", "linux": wcm.IfIndex = c.ifaces[ifi].Index + case "windows": + if c.ifaces[ifi].Name == "Teredo Tunneling Pseudo-Interface" { + log.Println("Skipping Teredo interface") + } else { + if err := c.ipv4conn.SetMulticastInterface(&c.ifaces[ifi]); err != nil { + log.Printf("[WARN] mdns: Failed to set multicast interface %s: %v", c.ifaces[ifi].Name, err) + } + } default: if err := c.ipv6conn.SetMulticastInterface(&c.ifaces[ifi]); err != nil { - log.Printf("[WARN] mdns: Failed to set multicast interface: %v", err) + log.Printf("[WARN] mdns: Failed to set multicast interface %s: %v", c.ifaces[ifi].Name, err) } } c.ipv6conn.WriteTo(buf, &wcm, ipv6Addr) diff --git a/go.mod b/go.mod index aebd1233..e5d0c92c 100644 --- a/go.mod +++ b/go.mod @@ -1,8 +1,9 @@ -module github.com/libp2p/zeroconf/v2 +module github.com/kdanielm/zeroconf go 1.21 require ( + github.com/libp2p/zeroconf/v2 v2.2.0 github.com/miekg/dns v1.1.43 golang.org/x/net v0.0.0-20210423184538-5f58ad60dda6 ) diff --git a/go.sum b/go.sum index 5008dd13..26f91e59 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,5 @@ +github.com/libp2p/zeroconf/v2 v2.2.0 h1:Cup06Jv6u81HLhIj1KasuNM/RHHrJ8T7wOTS4+Tv53Q= +github.com/libp2p/zeroconf/v2 v2.2.0/go.mod h1:fuJqLnUwZTshS3U/bMRJ3+ow/v9oid1n0DmyYyNO1Xs= github.com/miekg/dns v1.1.43 h1:JKfpVSCB84vrAmHzyrsxB5NAr5kLoMXZArPSw7Qlgyg= github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= diff --git a/server.go b/server.go index d895acd1..68266eba 100644 --- a/server.go +++ b/server.go @@ -773,10 +773,19 @@ func (s *Server) multicastResponse(msg *dns.Msg, ifIndex int) error { switch runtime.GOOS { case "darwin", "ios", "linux": wcm.IfIndex = ifIndex + case "windows": + iface, _ := net.InterfaceByIndex(ifIndex) + if iface.Name == "Teredo Tunneling Pseudo-Interface" { + log.Println("Skipping Teredo interface on windows") + } else { + if err := s.ipv4conn.SetMulticastInterface(iface); err != nil { + log.Printf("[WARN] mdns: Failed to set multicast interface %s: %v", iface.Name, err) + } + } default: iface, _ := net.InterfaceByIndex(ifIndex) if err := s.ipv4conn.SetMulticastInterface(iface); err != nil { - log.Printf("[WARN] mdns: Failed to set multicast interface: %v", err) + log.Printf("[WARN] mdns: Failed to set multicast interface %s: %v", iface.Name, err) } } s.ipv4conn.WriteTo(buf, &wcm, ipv4Addr) @@ -785,9 +794,17 @@ func (s *Server) multicastResponse(msg *dns.Msg, ifIndex int) error { switch runtime.GOOS { case "darwin", "ios", "linux": wcm.IfIndex = intf.Index + case "windows": + if intf.Name == "Teredo Tunneling Pseudo-Interface" { + log.Println("Skipping Teredo interface on windows") + } else { + if err := s.ipv4conn.SetMulticastInterface(&intf); err != nil { + log.Printf("[WARN] mdns: Failed to set multicast interface %s: %v", intf.Name, err) + } + } default: if err := s.ipv4conn.SetMulticastInterface(&intf); err != nil { - log.Printf("[WARN] mdns: Failed to set multicast interface: %v", err) + log.Printf("[WARN] mdns: Failed to set multicast interface %s: %v", intf.Name, err) } } s.ipv4conn.WriteTo(buf, &wcm, ipv4Addr) @@ -804,10 +821,19 @@ func (s *Server) multicastResponse(msg *dns.Msg, ifIndex int) error { switch runtime.GOOS { case "darwin", "ios", "linux": wcm.IfIndex = ifIndex + case "windows": + iface, _ := net.InterfaceByIndex(ifIndex) + if iface.Name == "Teredo Tunneling Pseudo-Interface" { + log.Println("Skipping Teredo interface on windows") + } else { + if err := s.ipv4conn.SetMulticastInterface(iface); err != nil { + log.Printf("[WARN] mdns: Failed to set multicast interface %s: %v", iface.Name, err) + } + } default: iface, _ := net.InterfaceByIndex(ifIndex) if err := s.ipv6conn.SetMulticastInterface(iface); err != nil { - log.Printf("[WARN] mdns: Failed to set multicast interface: %v", err) + log.Printf("[WARN] mdns: Failed to set multicast interface %s: %v", iface.Name, err) } } s.ipv6conn.WriteTo(buf, &wcm, ipv6Addr) @@ -816,9 +842,17 @@ func (s *Server) multicastResponse(msg *dns.Msg, ifIndex int) error { switch runtime.GOOS { case "darwin", "ios", "linux": wcm.IfIndex = intf.Index + case "windows": + if intf.Name == "Teredo Tunneling Pseudo-Interface" { + log.Println("Skipping Teredo interface on windows") + } else { + if err := s.ipv4conn.SetMulticastInterface(&intf); err != nil { + log.Printf("[WARN] mdns: Failed to set multicast interface %s: %v", intf.Name, err) + } + } default: if err := s.ipv6conn.SetMulticastInterface(&intf); err != nil { - log.Printf("[WARN] mdns: Failed to set multicast interface: %v", err) + log.Printf("[WARN] mdns: Failed to set multicast interface %s: %v", intf.Name, err) } } s.ipv6conn.WriteTo(buf, &wcm, ipv6Addr)