From 31323f7c481f88d40a8b0369ca04cc3f6c76b9cd Mon Sep 17 00:00:00 2001 From: Kai Danielmeier Date: Tue, 25 Feb 2025 12:58:38 +0100 Subject: [PATCH 1/6] Add windows multicast fix --- server.go | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/server.go b/server.go index d895acd1..da15d0f8 100644 --- a/server.go +++ b/server.go @@ -773,6 +773,15 @@ 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.HardwareAddr.String() == "00:00:00:00:00:00:00:E0" { + 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: %v", err) + } + } default: iface, _ := net.InterfaceByIndex(ifIndex) if err := s.ipv4conn.SetMulticastInterface(iface); err != nil { @@ -785,6 +794,15 @@ func (s *Server) multicastResponse(msg *dns.Msg, ifIndex int) error { switch runtime.GOOS { case "darwin", "ios", "linux": wcm.IfIndex = intf.Index + case "windows": + iface, _ := net.InterfaceByIndex(ifIndex) + if iface.HardwareAddr.String() == "00:00:00:00:00:00:00:E0" { + 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: %v", err) + } + } default: if err := s.ipv4conn.SetMulticastInterface(&intf); err != nil { log.Printf("[WARN] mdns: Failed to set multicast interface: %v", err) From 2a4fb5ef2bdbd105e217de9cb7c1dbbe0e296f3a Mon Sep 17 00:00:00 2001 From: Kai Danielmeier Date: Tue, 25 Feb 2025 13:34:07 +0100 Subject: [PATCH 2/6] update mod --- go.mod | 3 ++- go.sum | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) 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= From 696ebe4720ceb8bddbb3ad095eee106256d14396 Mon Sep 17 00:00:00 2001 From: Kai Danielmeier Date: Tue, 25 Feb 2025 13:40:39 +0100 Subject: [PATCH 3/6] Fix loop --- server.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/server.go b/server.go index da15d0f8..1262f992 100644 --- a/server.go +++ b/server.go @@ -795,11 +795,10 @@ func (s *Server) multicastResponse(msg *dns.Msg, ifIndex int) error { case "darwin", "ios", "linux": wcm.IfIndex = intf.Index case "windows": - iface, _ := net.InterfaceByIndex(ifIndex) - if iface.HardwareAddr.String() == "00:00:00:00:00:00:00:E0" { + if intf.HardwareAddr.String() == "00:00:00:00:00:00:00:E0" { log.Println("Skipping Teredo interface on windows") } else { - if err := s.ipv4conn.SetMulticastInterface(iface); err != nil { + if err := s.ipv4conn.SetMulticastInterface(&intf); err != nil { log.Printf("[WARN] mdns: Failed to set multicast interface: %v", err) } } From 4418025cd8efd66d2cbed5ccbb191de3d13c2e06 Mon Sep 17 00:00:00 2001 From: Kai Danielmeier Date: Tue, 25 Feb 2025 14:48:46 +0100 Subject: [PATCH 4/6] Filter Teredo interface --- client.go | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/client.go b/client.go index c0b2cae1..f2c82a55 100644 --- a/client.go +++ b/client.go @@ -446,6 +446,14 @@ 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: %v", err) + } + } default: if err := c.ipv4conn.SetMulticastInterface(&c.ifaces[ifi]); err != nil { log.Printf("[WARN] mdns: Failed to set multicast interface: %v", err) @@ -463,6 +471,14 @@ 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: %v", err) + } + } default: if err := c.ipv6conn.SetMulticastInterface(&c.ifaces[ifi]); err != nil { log.Printf("[WARN] mdns: Failed to set multicast interface: %v", err) From 7addbaf0b984c76e9f872559cc8c0f5f2ee45e6e Mon Sep 17 00:00:00 2001 From: Kai Danielmeier Date: Tue, 25 Feb 2025 14:54:59 +0100 Subject: [PATCH 5/6] More Teredo fixes --- server.go | 33 +++++++++++++++++++++++++-------- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/server.go b/server.go index 1262f992..68266eba 100644 --- a/server.go +++ b/server.go @@ -775,17 +775,17 @@ func (s *Server) multicastResponse(msg *dns.Msg, ifIndex int) error { wcm.IfIndex = ifIndex case "windows": iface, _ := net.InterfaceByIndex(ifIndex) - if iface.HardwareAddr.String() == "00:00:00:00:00:00:00:E0" { + 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: %v", err) + 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) @@ -795,16 +795,16 @@ func (s *Server) multicastResponse(msg *dns.Msg, ifIndex int) error { case "darwin", "ios", "linux": wcm.IfIndex = intf.Index case "windows": - if intf.HardwareAddr.String() == "00:00:00:00:00:00:00:E0" { + 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: %v", err) + 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) @@ -821,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) @@ -833,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) From 4c14d6be193bcff7ce3f0b7dc9eea4b1218d7ac6 Mon Sep 17 00:00:00 2001 From: Kai Danielmeier Date: Tue, 25 Feb 2025 15:00:54 +0100 Subject: [PATCH 6/6] Optimize logging --- client.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/client.go b/client.go index f2c82a55..a560063a 100644 --- a/client.go +++ b/client.go @@ -451,12 +451,12 @@ func (c *client) sendQuery(msg *dns.Msg) error { 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: %v", err) + 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) @@ -476,12 +476,12 @@ func (c *client) sendQuery(msg *dns.Msg) error { 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: %v", err) + 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)