fix mdns to use A record IPs and create interfaces for IP-only nodes

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Ian Gulliver
2026-01-23 00:32:07 -08:00
parent 2fa2fcd57d
commit a0e8b4cec5
2 changed files with 27 additions and 23 deletions

32
mdns.go
View File

@@ -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")
}
}

View File

@@ -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)
}