Track addresses

This commit is contained in:
Neil Alexander 2020-05-31 18:30:03 +01:00
parent 153a7a5768
commit 6995b989e3
No known key found for this signature in database
GPG key ID: A02A2019A2BB0944

View file

@ -35,6 +35,9 @@ func (m *Multicast) _multicastStarted() {
go func() { go func() {
defer fmt.Println("No longer listening for netlink changes") defer fmt.Println("No longer listening for netlink changes")
indexToIntf := map[int]string{}
for { for {
current := m.config.GetCurrent() current := m.config.GetCurrent()
exprs := current.MulticastInterfaces exprs := current.MulticastInterfaces
@ -61,18 +64,24 @@ func (m *Multicast) _multicastStarted() {
add = add && match add = add && match
if add { if add {
indexToIntf[attrs.Index] = attrs.Name
m.Act(nil, func() { m.Act(nil, func() {
iface, err := net.InterfaceByIndex(attrs.Index)
if err != nil {
return
}
fmt.Println("Link added:", attrs.Name) fmt.Println("Link added:", attrs.Name)
if iface, err := net.InterfaceByName(attrs.Name); err == nil { if info, ok := m._interfaces[attrs.Name]; ok {
if addrs, err := iface.Addrs(); err == nil { info.iface = *iface
m._interfaces[attrs.Name] = interfaceInfo{ m._interfaces[attrs.Name] = info
iface: *iface, } else {
addrs: addrs, m._interfaces[attrs.Name] = interfaceInfo{
} iface: *iface,
} }
} }
}) })
} else { } else {
delete(indexToIntf, attrs.Index)
m.Act(nil, func() { m.Act(nil, func() {
fmt.Println("Link removed:", attrs.Name) fmt.Println("Link removed:", attrs.Name)
delete(m._interfaces, attrs.Name) delete(m._interfaces, attrs.Name)
@ -80,9 +89,34 @@ func (m *Multicast) _multicastStarted() {
} }
case change := <-addrChanges: case change := <-addrChanges:
m.Act(nil, func() { name, ok := indexToIntf[change.LinkIndex]
fmt.Println("Addr changed:", change) if !ok {
}) return
}
add := true
add = add && change.NewAddr
add = add && change.LinkAddress.IP.IsLinkLocalUnicast()
if add {
m.Act(nil, func() {
fmt.Println("Addr added:", change)
if info, ok := m._interfaces[name]; ok {
info.addrs = append(info.addrs, &net.IPAddr{
IP: change.LinkAddress.IP,
Zone: name,
})
m._interfaces[name] = info
}
})
} else {
m.Act(nil, func() {
fmt.Println("Addr removed:", change)
if info, ok := m._interfaces[name]; ok {
info.addrs = nil
m._interfaces[name] = info
}
})
}
case <-linkClose: case <-linkClose:
return return