From a0e8b4cec5a08c03f33310116f0ebb51ea74a7be Mon Sep 17 00:00:00 2001 From: Ian Gulliver Date: Fri, 23 Jan 2026 00:32:07 -0800 Subject: [PATCH] fix mdns to use A record IPs and create interfaces for IP-only nodes Co-Authored-By: Claude Opus 4.5 --- mdns.go | 32 ++++++++++++++------------------ nodes.go | 18 +++++++++++++----- 2 files changed, 27 insertions(+), 23 deletions(-) diff --git a/mdns.go b/mdns.go index da3a0e7..fcdf34b 100644 --- a/mdns.go +++ b/mdns.go @@ -84,8 +84,6 @@ func (t *Tendrils) handleMDNSPacket(ifaceName string, srcIP net.IP, data []byte) } func (t *Tendrils) processMDNSResponse(ifaceName string, srcIP net.IP, msg *dns.Msg) { - var hostname string - allRecords := append(msg.Answer, msg.Extra...) if t.DebugMDNS { @@ -103,10 +101,6 @@ func (t *Tendrils) processMDNSResponse(ifaceName string, srcIP net.IP, msg *dns. case *dns.A: name := strings.TrimSuffix(r.Hdr.Name, ".") aRecords[name] = r.A - localName := strings.TrimSuffix(name, ".local") - if localName != "" && r.A.Equal(srcIP) { - hostname = localName - } case *dns.AAAA: continue case *dns.PTR: @@ -115,19 +109,16 @@ func (t *Tendrils) processMDNSResponse(ifaceName string, srcIP net.IP, msg *dns. if name != "" { danteNames[name] = true } - } else { - name := strings.TrimSuffix(r.Ptr, ".local.") - name = strings.TrimSuffix(name, ".") - if hostname == "" && name != "" && !strings.HasPrefix(name, "_") { - hostname = name - } } case *dns.SRV: if isDanteService(r.Hdr.Name) { name := extractDanteName(r.Hdr.Name) target := strings.TrimSuffix(r.Target, ".") - if name != "" && target != "" { - srvTargets[name] = target + if name != "" { + danteNames[name] = true + if target != "" { + srvTargets[name] = target + } } } } @@ -147,11 +138,16 @@ func (t *Tendrils) processMDNSResponse(ifaceName string, srcIP net.IP, msg *dns. t.nodes.UpdateDante(name, ip) } - if len(danteNames) == 0 && hostname != "" { - if t.DebugMDNS { - log.Printf("[mdns] %s: %s -> %s", ifaceName, srcIP, hostname) + if len(danteNames) == 0 { + for aName, ip := range aRecords { + hostname := strings.TrimSuffix(aName, ".local") + if hostname != "" && hostname != aName { + if t.DebugMDNS { + log.Printf("[mdns] %s: %s -> %s", ifaceName, ip, hostname) + } + t.nodes.Update(nil, nil, []net.IP{ip}, "", hostname, "mdns") + } } - t.nodes.Update(nil, nil, []net.IP{srcIP}, "", hostname, "mdns") } } diff --git a/nodes.go b/nodes.go index 2e61e4e..e9ef760 100644 --- a/nodes.go +++ b/nodes.go @@ -102,12 +102,12 @@ type PoEBudget struct { } type Node struct { - Name string - Interfaces map[string]*Interface - MACTable map[string]string // peer MAC -> local interface name - PoEBudget *PoEBudget + Name string + Interfaces map[string]*Interface + MACTable map[string]string // peer MAC -> local interface name + PoEBudget *PoEBudget IsDanteClockMaster bool - pollTrigger chan struct{} + pollTrigger chan struct{} } func (n *Node) String() string { @@ -283,6 +283,14 @@ func (n *Nodes) Update(target *Node, mac net.HardwareAddr, ips []net.IP, ifaceNa ipKey := ip.String() if _, exists := n.ipIndex[ipKey]; !exists { n.ipIndex[ipKey] = targetID + iface, exists := node.Interfaces[ipKey] + if !exists { + iface = &Interface{ + IPs: map[string]net.IP{}, + } + node.Interfaces[ipKey] = iface + } + iface.IPs[ipKey] = ip added = append(added, "ip="+ipKey) go n.t.requestARP(ip) }