99 "fmt"
1010 "net"
1111 "net/url"
12+ "strconv"
1213 "time"
1314
1415 "github.com/wlynxg/anet"
@@ -30,8 +31,8 @@ type Multicast struct {
3031 log * log.Logger
3132 sock * ipv6.PacketConn
3233 _isOpen bool
33- _listeners map [string ]* listenerInfo
34- _interfaces map [string ]* interfaceInfo
34+ _listeners map [int ]* listenerInfo
35+ _interfaces map [int ]* interfaceInfo
3536 _timer * time.Timer
3637 config struct {
3738 _groupAddr GroupAddress
@@ -62,8 +63,8 @@ func New(core *core.Core, log *log.Logger, opts ...SetupOption) (*Multicast, err
6263 m := & Multicast {
6364 core : core ,
6465 log : log ,
65- _listeners : make (map [string ]* listenerInfo ),
66- _interfaces : make (map [string ]* interfaceInfo ),
66+ _listeners : make (map [int ]* listenerInfo ),
67+ _interfaces : make (map [int ]* interfaceInfo ),
6768 }
6869 m .SetOsVersion ()
6970 m .config ._interfaces = map [MulticastInterface ]struct {}{}
@@ -79,6 +80,7 @@ func New(core *core.Core, log *log.Logger, opts ...SetupOption) (*Multicast, err
7980}
8081
8182func (m * Multicast ) _start () error {
83+ m .log .Infoln ("Starting multicasting" )
8284 if m ._isOpen {
8385 return fmt .Errorf ("multicast module is already started" )
8486 }
@@ -89,10 +91,11 @@ func (m *Multicast) _start() error {
8991 if ! anyEnabled {
9092 return nil
9193 }
92- m .log .Debugln ("Starting multicast module" )
93- defer m .log .Debugln ("Started multicast module" )
94+ m .log .Infoln ("Starting multicast module" )
95+ defer m .log .Infoln ("Started multicast module" )
9496 addr , err := net .ResolveUDPAddr ("udp" , string (m .config ._groupAddr ))
9597 if err != nil {
98+ m .log .Infoln ("ResolveTCPAddr failed on" , string (m .config ._groupAddr ), "due to error:" , err )
9699 return err
97100 }
98101 listenString := fmt .Sprintf ("[::]:%v" , addr .Port )
@@ -101,11 +104,13 @@ func (m *Multicast) _start() error {
101104 }
102105 conn , err := lc .ListenPacket (context .Background (), "udp6" , listenString )
103106 if err != nil {
107+ m .log .Infoln ("ListenPacket failed on" , listenString , "due to error:" , err )
104108 return err
105109 }
106110 m .sock = ipv6 .NewPacketConn (conn )
107111 if err = m .sock .SetControlMessage (ipv6 .FlagDst , true ); err != nil { // nolint:staticcheck
108112 // Windows can't set this flag, so we need to handle it in other ways
113+ m .log .Infoln ("SetControlMessage failed due to error:" , err )
109114 }
110115
111116 m ._isOpen = true
@@ -149,7 +154,7 @@ func (m *Multicast) _updateInterfaces() {
149154 for name , info := range interfaces {
150155 addrs , err := anet .InterfaceAddrsByInterface (& info .iface )
151156 if err != nil {
152- m .log .Warnf ("Failed up get addresses for interface %s: %s" , name , err )
157+ m .log .Warnf ("Failed up get addresses for interface %s: %s" , info . iface . Name , err )
153158 delete (interfaces , name )
154159 continue
155160 }
@@ -170,8 +175,8 @@ func (m *Multicast) Interfaces() map[string]net.Interface {
170175}
171176
172177// getAllowedInterfaces returns the currently known/enabled multicast interfaces.
173- func (m * Multicast ) _getAllowedInterfaces () map [string ]* interfaceInfo {
174- interfaces := make (map [string ]* interfaceInfo )
178+ func (m * Multicast ) _getAllowedInterfaces () map [int ]* interfaceInfo {
179+ interfaces := make (map [int ]* interfaceInfo )
175180 // Ask the system for network interfaces
176181 allifaces , err := anet .Interfaces ()
177182 if err != nil {
@@ -198,7 +203,7 @@ func (m *Multicast) _getAllowedInterfaces() map[string]*interfaceInfo {
198203 if ! ifcfg .Regex .MatchString (iface .Name ) {
199204 continue
200205 }
201- interfaces [iface .Name ] = & interfaceInfo {
206+ interfaces [iface .Index ] = & interfaceInfo {
202207 iface : iface ,
203208 beacon : ifcfg .Beacon ,
204209 listen : ifcfg .Listen ,
@@ -252,6 +257,7 @@ func (m *Multicast) _announce() {
252257 found := false
253258 listenaddr , err := net .ResolveTCPAddr ("tcp6" , info .listener .Listener .Addr ().String ())
254259 if err != nil {
260+ m .log .Infoln ("ResolveTCPAddr on" , info .listener .Listener .Addr ().String (), "due to error:" , err )
255261 stop ()
256262 continue
257263 }
@@ -297,24 +303,24 @@ func (m *Multicast) _announce() {
297303 }
298304 // Try and see if we already have a TCP listener for this interface
299305 var linfo * listenerInfo
300- if nfo , ok := m ._listeners [iface .Name ]; ! ok || nfo .listener .Listener == nil {
306+ if nfo , ok := m ._listeners [iface .Index ]; ! ok || nfo .listener .Listener == nil {
301307 // No listener was found - let's create one
302308 urlString := fmt .Sprintf ("tls://[%s]:%d" , addrIP , info .port )
303309 u , err := url .Parse (urlString )
304310 if err != nil {
305311 panic (err )
306312 }
307313 if li , err := m .core .Listen (u , iface .Name ); err == nil {
308- m .log .Debugln ("Started multicasting on" , iface .Name )
314+ m .log .Infoln ("Started multicasting on" , iface .Name )
309315 // Store the listener so that we can stop it later if needed
310316 linfo = & listenerInfo {listener : li , time : time .Now (), port : info .port }
311- m ._listeners [iface .Name ] = linfo
317+ m ._listeners [iface .Index ] = linfo
312318 } else {
313- m .log .Warnln ("Not multicasting on" , iface .Name , "due to error:" , err )
319+ m .log .Infoln ("Not multicasting on" , iface .Name , "due to error:" , err )
314320 }
315321 } else {
316322 // An existing listener was found
317- linfo = m ._listeners [iface .Name ]
323+ linfo = m ._listeners [iface .Index ]
318324 }
319325 // Make sure nothing above failed for some reason
320326 if linfo == nil {
@@ -334,6 +340,8 @@ func (m *Multicast) _announce() {
334340 binary .BigEndian .PutUint16 (pbs , uint16 (a .Port ))
335341 msg = append (msg , pbs ... )
336342 _ , _ = m .sock .WriteTo (msg , nil , destAddr )
343+ } else {
344+ m .log .Infoln ("ResolveTCPAddr failed on" , iface .Name , "due to error:" , err )
337345 }
338346 if linfo .interval .Seconds () < 15 {
339347 linfo .interval += time .Second
@@ -389,26 +397,41 @@ func (m *Multicast) listen() {
389397 anAddr := net.TCPAddr {IP : ip , Port : int (port )}
390398 addr , err := net .ResolveTCPAddr ("tcp6" , anAddr .String ())
391399 if err != nil {
400+ m .log .Infoln ("ResolveTCPAddr failed on" , anAddr .String ())
392401 continue
393402 }
394403 from := fromAddr .(* net.UDPAddr )
395404 if ! from .IP .Equal (addr .IP ) {
396405 continue
397406 }
398- var interfaces map [string ]* interfaceInfo
407+ var interfaces map [int ]* interfaceInfo
399408 phony .Block (m , func () {
400409 interfaces = m ._interfaces
401410 })
402- if info , ok := interfaces [from .Zone ]; ok && info .listen {
411+ zone , err := strconv .Atoi (from .Zone )
412+ if err != nil {
413+ continue
414+ }
415+ if info , ok := interfaces [zone ]; ok && info .listen {
403416 addr .Zone = ""
404417 pin := fmt .Sprintf ("/?key=%s&priority=%d" , hex .EncodeToString (key ), info .priority )
405418 u , err := url .Parse ("tls://" + addr .String () + pin )
406419 if err != nil {
407- m .log .Debugln ("Call from multicast failed, parse error:" , addr .String (), err )
420+ m .log .Infoln ("Call from multicast failed, parse error:" , addr .String (), err )
408421 }
409- if err := m .core .CallPeer (u , from . Zone ); err != nil {
410- m .log .Debugln ("Call from multicast failed:" , err )
422+ if err := m .core .CallPeer (u , info . iface . Name ); err != nil {
423+ m .log .Infoln ("Call from multicast failed:" , err )
411424 }
425+ } else {
426+ m .log .Infoln ("Multicat: " , ok , from .String (), m .createKeyValuePairs (interfaces ))
412427 }
413428 }
414429}
430+
431+ func (m * Multicast ) createKeyValuePairs (map_ map [int ]* interfaceInfo ) string {
432+ b := new (bytes.Buffer )
433+ for key , value := range map_ {
434+ fmt .Fprintf (b , "%d=\" %s\" \n " , key , value .iface .Name )
435+ }
436+ return b .String ()
437+ }
0 commit comments