/
driver_net.go
75 lines (59 loc) · 1.34 KB
/
driver_net.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
package bertybridge
import (
"net"
"runtime"
"strings"
"go.uber.org/zap"
"berty.tech/berty/v2/go/pkg/osversion"
)
type NativeNetDriver interface {
InterfaceAddrs() (*NetAddrs, error)
}
type inetAddrs struct {
netaddrs NativeNetDriver
logger *zap.Logger
}
func (ia *inetAddrs) InterfaceAddrs() ([]net.Addr, error) {
if runtime.GOOS != "android" || osversion.GetVersion().Major() < 30 {
return net.InterfaceAddrs()
}
na, err := ia.netaddrs.InterfaceAddrs()
if err != nil {
return nil, err
}
addrs := []net.Addr{}
for _, addr := range na.addrs {
if addr == "" {
continue
}
// skip interface name
ips := strings.Split(addr, "%")
if len(ips) == 0 {
ia.logger.Debug("empty addr while parsing interface addrs")
continue
}
ip := ips[0]
// resolve ip
v, err := net.ResolveIPAddr("ip", ip)
if err != nil {
ia.logger.Warn("unable to resolve addr", zap.String("addr", ip))
continue
}
addrs = append(addrs, v)
}
fields := make([]string, len(addrs))
for i, addr := range addrs {
fields[i] = addr.String()
}
ia.logger.Debug("driver interface resolved addrs", zap.Strings("addrs", fields))
return addrs, nil
}
type NetAddrs struct {
addrs []string
}
func NewNetAddrs() *NetAddrs {
return &NetAddrs{addrs: []string{}}
}
func (n *NetAddrs) AppendAddr(addr string) {
n.addrs = append(n.addrs, addr)
}