mirror of
https://github.com/yggdrasil-network/yggdrasil-go
synced 2024-11-10 15:30:34 +03:00
Return new copy of interfaces on each Interfaces() call
This commit is contained in:
parent
54f1804101
commit
27b3b9b49b
@ -5,7 +5,7 @@ import "github.com/yggdrasil-network/yggdrasil-go/src/admin"
|
||||
func (m *Multicast) SetupAdminHandlers(a *admin.AdminSocket) {
|
||||
a.AddHandler("getMulticastInterfaces", []string{}, func(in admin.Info) (admin.Info, error) {
|
||||
var intfs []string
|
||||
for _, v := range m.GetInterfaces() {
|
||||
for _, v := range m.Interfaces() {
|
||||
intfs = append(intfs, v.Name)
|
||||
}
|
||||
return admin.Info{"multicast_interfaces": intfs}, nil
|
||||
|
@ -5,7 +5,6 @@ import (
|
||||
"fmt"
|
||||
"net"
|
||||
"regexp"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/gologme/log"
|
||||
@ -20,16 +19,13 @@ import (
|
||||
// configured multicast interface, Yggdrasil will attempt to peer with that node
|
||||
// automatically.
|
||||
type Multicast struct {
|
||||
core *yggdrasil.Core
|
||||
config *config.NodeState
|
||||
log *log.Logger
|
||||
sock *ipv6.PacketConn
|
||||
groupAddr string
|
||||
listeners map[string]*yggdrasil.TcpListener
|
||||
listenPort uint16
|
||||
interfaces map[string]net.Interface
|
||||
interfacesMutex sync.RWMutex
|
||||
interfacesTime time.Time
|
||||
core *yggdrasil.Core
|
||||
config *config.NodeState
|
||||
log *log.Logger
|
||||
sock *ipv6.PacketConn
|
||||
groupAddr string
|
||||
listeners map[string]*yggdrasil.TcpListener
|
||||
listenPort uint16
|
||||
}
|
||||
|
||||
// Init prepares the multicast interface for use.
|
||||
@ -38,23 +34,9 @@ func (m *Multicast) Init(core *yggdrasil.Core, state *config.NodeState, log *log
|
||||
m.config = state
|
||||
m.log = log
|
||||
m.listeners = make(map[string]*yggdrasil.TcpListener)
|
||||
m.interfaces = make(map[string]net.Interface)
|
||||
current, _ := m.config.Get()
|
||||
m.listenPort = current.LinkLocalTCPPort
|
||||
m.groupAddr = "[ff02::114]:9001"
|
||||
// Perform our first check for multicast interfaces
|
||||
if count := m.UpdateInterfaces(); count != 0 {
|
||||
m.log.Infoln("Found", count, "multicast interface(s)")
|
||||
} else {
|
||||
m.log.Infoln("Multicast is not enabled on any interfaces")
|
||||
}
|
||||
// Keep checking quietly every minute in case they change
|
||||
go func() {
|
||||
for {
|
||||
time.Sleep(time.Minute)
|
||||
m.UpdateInterfaces()
|
||||
}
|
||||
}()
|
||||
return nil
|
||||
}
|
||||
|
||||
@ -96,40 +78,19 @@ func (m *Multicast) Stop() error {
|
||||
// needed.
|
||||
func (m *Multicast) UpdateConfig(config *config.NodeConfig) {
|
||||
m.log.Debugln("Reloading multicast configuration...")
|
||||
|
||||
m.config.Replace(*config)
|
||||
|
||||
m.log.Infoln("Multicast configuration reloaded successfully")
|
||||
|
||||
if count := m.UpdateInterfaces(); count != 0 {
|
||||
m.log.Infoln("Found", count, "multicast interface(s)")
|
||||
} else {
|
||||
m.log.Infoln("Multicast is not enabled on any interfaces")
|
||||
}
|
||||
}
|
||||
|
||||
// GetInterfaces returns the currently known/enabled multicast interfaces. It is
|
||||
// expected that UpdateInterfaces has been called at least once before calling
|
||||
// this method.
|
||||
func (m *Multicast) GetInterfaces() map[string]net.Interface {
|
||||
m.interfacesMutex.RLock()
|
||||
defer m.interfacesMutex.RUnlock()
|
||||
return m.interfaces
|
||||
}
|
||||
|
||||
// UpdateInterfaces re-enumerates the available multicast interfaces on the
|
||||
// system, using the current MulticastInterfaces config option as a template.
|
||||
// The number of selected interfaces is returned.
|
||||
func (m *Multicast) UpdateInterfaces() int {
|
||||
m.interfacesMutex.Lock()
|
||||
defer m.interfacesMutex.Unlock()
|
||||
func (m *Multicast) Interfaces() map[string]net.Interface {
|
||||
interfaces := make(map[string]net.Interface)
|
||||
// Get interface expressions from config
|
||||
current, _ := m.config.Get()
|
||||
exprs := current.MulticastInterfaces
|
||||
// Ask the system for network interfaces
|
||||
for i := range m.interfaces {
|
||||
delete(m.interfaces, i)
|
||||
}
|
||||
allifaces, err := net.Interfaces()
|
||||
if err != nil {
|
||||
panic(err)
|
||||
@ -156,12 +117,11 @@ func (m *Multicast) UpdateInterfaces() int {
|
||||
}
|
||||
// Does the interface match the regular expression? Store it if so
|
||||
if e.MatchString(iface.Name) {
|
||||
m.interfaces[iface.Name] = iface
|
||||
interfaces[iface.Name] = iface
|
||||
}
|
||||
}
|
||||
}
|
||||
m.interfacesTime = time.Now()
|
||||
return len(m.interfaces)
|
||||
return interfaces
|
||||
}
|
||||
|
||||
func (m *Multicast) announce() {
|
||||
@ -174,7 +134,7 @@ func (m *Multicast) announce() {
|
||||
panic(err)
|
||||
}
|
||||
for {
|
||||
interfaces := m.GetInterfaces()
|
||||
interfaces := m.Interfaces()
|
||||
// There might be interfaces that we configured listeners for but are no
|
||||
// longer up - if that's the case then we should stop the listeners
|
||||
for name, listener := range m.listeners {
|
||||
@ -308,7 +268,7 @@ func (m *Multicast) listen() {
|
||||
if addr.IP.String() != from.IP.String() {
|
||||
continue
|
||||
}
|
||||
if _, ok := m.GetInterfaces()[from.Zone]; ok {
|
||||
if _, ok := m.Interfaces()[from.Zone]; ok {
|
||||
addr.Zone = ""
|
||||
if err := m.core.CallPeer("tcp://"+addr.String(), from.Zone); err != nil {
|
||||
m.log.Debugln("Call from multicast failed:", err)
|
||||
|
@ -38,8 +38,8 @@ func (m *Multicast) multicastStarted() {
|
||||
awdlGoroutineStarted = true
|
||||
for {
|
||||
C.StopAWDLBrowsing()
|
||||
for _, intf := range m.GetInterfaces() {
|
||||
if intf.Name == "awdl0" {
|
||||
for intf := range m.Interfaces() {
|
||||
if intf == "awdl0" {
|
||||
m.log.Infoln("Multicast discovery is using AWDL discovery")
|
||||
C.StartAWDLBrowsing()
|
||||
break
|
||||
|
Loading…
Reference in New Issue
Block a user