Skip to content

Commit d4dfaa9

Browse files
author
Vadym Vikulin
committed
RCL-56 interfaces addresses fix
1 parent 0ce76f6 commit d4dfaa9

File tree

8 files changed

+74
-36
lines changed

8 files changed

+74
-36
lines changed

.github/workflows/ci.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ jobs:
5151
strategy:
5252
fail-fast: false
5353
matrix:
54-
goversion: ["1.20", "1.21"]
54+
goversion: ["1.21", "1.22"]
5555

5656
name: Build & Test (Linux, Go ${{ matrix.goversion }})
5757
needs: [lint]
@@ -81,7 +81,7 @@ jobs:
8181
strategy:
8282
fail-fast: false
8383
matrix:
84-
goversion: ["1.21"]
84+
goversion: ["1.22"]
8585

8686
name: Build & Test (Windows, Go ${{ matrix.goversion }})
8787
needs: [lint]
@@ -105,7 +105,7 @@ jobs:
105105
strategy:
106106
fail-fast: false
107107
matrix:
108-
goversion: ["1.21"]
108+
goversion: ["1.22"]
109109

110110
name: Build & Test (macOS, Go ${{ matrix.goversion }})
111111
needs: [lint]

contrib/mobile/mobile_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ package mobile
22

33
import "testing"
44

5-
func TestStartYggdrasil(t *testing.T) {
5+
func TestStartMesh(t *testing.T) {
66
mesh := &Mesh{}
7-
if err := mesh.StartAutoconfigure(); err != nil {
7+
if err := mesh.StartAutoconfigure(14); err != nil {
88
t.Fatalf("Failed to start RiV-mesh: %s", err)
99
}
1010
t.Log("Address:", mesh.GetAddressString())

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ require gerace.dev/zipfs v0.2.0
2525
require (
2626
github.com/slonm/tableprinter v0.0.0-20230107100804-643098716018
2727
github.com/vorot93/golang-signals v0.0.0-20170221070717-d9e83421ce45
28-
github.com/wlynxg/anet v0.0.2
28+
github.com/wlynxg/anet v0.0.3
2929
golang.org/x/exp v0.0.0-20221217163422-3c43f8badb15
3030
golang.zx2c4.com/wintun v0.0.0-20211104114900-415007cec224
3131
)

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,8 @@ github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f h1:p4VB7kIXpOQvV
7777
github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0=
7878
github.com/vorot93/golang-signals v0.0.0-20170221070717-d9e83421ce45 h1:hB/hkjwf3BQnZE6Wk3SBwMJz0NqnGdwXoNzHVSYb0N0=
7979
github.com/vorot93/golang-signals v0.0.0-20170221070717-d9e83421ce45/go.mod h1:dfjQkJsG5auteUbnfLIcU72Y/z8tj7DuW9fik8f2Zn0=
80-
github.com/wlynxg/anet v0.0.2 h1:kH9s2huwMsED3eQknbL7gQBoW2Gsh5FCD/ceucpaIbk=
81-
github.com/wlynxg/anet v0.0.2/go.mod h1:eay5PRQr7fIVAMbTbchTnO9gG65Hg/uYGdc7mguHxoA=
80+
github.com/wlynxg/anet v0.0.3 h1:PvR53psxFXstc12jelG6f1Lv4MWqE0tI76/hHGjh9rg=
81+
github.com/wlynxg/anet v0.0.3/go.mod h1:eay5PRQr7fIVAMbTbchTnO9gG65Hg/uYGdc7mguHxoA=
8282
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
8383
go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw=
8484
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=

src/core/link_tcp.go

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import (
88
"strings"
99
"time"
1010

11+
"github.com/wlynxg/anet"
12+
1113
"github.com/Arceliar/phony"
1214
)
1315

@@ -142,15 +144,28 @@ func (l *linkTCP) dialerFor(dst *net.TCPAddr, sintf string) (*net.Dialer, error)
142144
Control: l.tcpContext,
143145
}
144146
if sintf != "" {
145-
dialer.Control = l.getControl(sintf)
146-
ief, err := net.InterfaceByName(sintf)
147+
i, err := anet.Interfaces()
147148
if err != nil {
148-
return nil, fmt.Errorf("interface %q not found", sintf)
149+
return nil, fmt.Errorf("interfaces error: %w", err)
150+
}
151+
var ief net.Interface
152+
found := false
153+
for _, ie := range i {
154+
if ie.Name == sintf {
155+
ief = ie
156+
found = true
157+
break
158+
}
159+
}
160+
if !found {
161+
return nil, fmt.Errorf("interface %s not found", sintf)
149162
}
163+
dialer.Control = l.getControl(sintf)
164+
150165
if ief.Flags&net.FlagUp == 0 {
151166
return nil, fmt.Errorf("interface %q is not up", sintf)
152167
}
153-
addrs, err := ief.Addrs()
168+
addrs, err := anet.InterfaceAddrsByInterface(&ief)
154169
if err != nil {
155170
return nil, fmt.Errorf("interface %q addresses not available: %w", sintf, err)
156171
}

src/defaults/defaults.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import (
1515
type MulticastInterfaceConfig = config.MulticastInterfaceConfig
1616
type NetworkDomainConfig = config.NetworkDomainConfig
1717

18-
var defaultConfig = "" // LDFLAGS='-X github.com/yggdrasil-network/yggdrasil-go/src/defaults.defaultConfig=/path/to/config
18+
var defaultConfig = "" // LDFLAGS='-X github.com/RiV-chain/RiV-mesh/src/defaults.defaultConfig=/path/to/config
1919

2020
type defaultParameters struct {
2121
//Default Http address

src/multicast/multicast.go

Lines changed: 43 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
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

8182
func (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+
}

src/multicast/multicast_darwin_cgo.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ void StartAWDLBrowsing() {
1313
serviceBrowser = [[NSNetServiceBrowser alloc] init];
1414
serviceBrowser.includesPeerToPeer = YES;
1515
}
16-
[serviceBrowser searchForServicesOfType:@"_yggdrasil._tcp" inDomain:@""];
16+
[serviceBrowser searchForServicesOfType:@"_mesh._tcp" inDomain:@""];
1717
}
1818
void StopAWDLBrowsing() {
1919
if (serviceBrowser == nil) {
@@ -39,8 +39,8 @@ func (m *Multicast) _multicastStarted() {
3939
return
4040
}
4141
C.StopAWDLBrowsing()
42-
for intf := range m._interfaces {
43-
if intf == "awdl0" {
42+
for _, info := range m._interfaces {
43+
if info.iface.Name == "awdl0" {
4444
C.StartAWDLBrowsing()
4545
break
4646
}

0 commit comments

Comments
 (0)