Skip to content

Commit 9e81e78

Browse files
authored
[client] Fix/v4 stun routing (#4430)
Deduplicate STUN package sending. Originally, because every peer shared the same UDP address, the library could not distinguish which STUN message was associated with which candidate. As a result, the Pion library responded from all candidates for every STUN message.
1 parent 7aef0f6 commit 9e81e78

24 files changed

+300
-178
lines changed

client/iface/bind/ice_bind.go

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
"golang.org/x/net/ipv6"
1616
wgConn "golang.zx2c4.com/wireguard/conn"
1717

18+
"github.com/netbirdio/netbird/client/iface/udpmux"
1819
"github.com/netbirdio/netbird/client/iface/wgaddr"
1920
nbnet "github.com/netbirdio/netbird/util/net"
2021
)
@@ -44,7 +45,7 @@ type ICEBind struct {
4445
RecvChan chan RecvMessage
4546

4647
transportNet transport.Net
47-
filterFn FilterFn
48+
filterFn udpmux.FilterFn
4849
endpoints map[netip.Addr]net.Conn
4950
endpointsMu sync.Mutex
5051
// every time when Close() is called (i.e. BindUpdate()) we need to close exit from the receiveRelayed and create a
@@ -54,13 +55,13 @@ type ICEBind struct {
5455
closed bool
5556

5657
muUDPMux sync.Mutex
57-
udpMux *UniversalUDPMuxDefault
58+
udpMux *udpmux.UniversalUDPMuxDefault
5859
address wgaddr.Address
5960
mtu uint16
6061
activityRecorder *ActivityRecorder
6162
}
6263

63-
func NewICEBind(transportNet transport.Net, filterFn FilterFn, address wgaddr.Address, mtu uint16) *ICEBind {
64+
func NewICEBind(transportNet transport.Net, filterFn udpmux.FilterFn, address wgaddr.Address, mtu uint16) *ICEBind {
6465
b, _ := wgConn.NewStdNetBind().(*wgConn.StdNetBind)
6566
ib := &ICEBind{
6667
StdNetBind: b,
@@ -115,7 +116,7 @@ func (s *ICEBind) ActivityRecorder() *ActivityRecorder {
115116
}
116117

117118
// GetICEMux returns the ICE UDPMux that was created and used by ICEBind
118-
func (s *ICEBind) GetICEMux() (*UniversalUDPMuxDefault, error) {
119+
func (s *ICEBind) GetICEMux() (*udpmux.UniversalUDPMuxDefault, error) {
119120
s.muUDPMux.Lock()
120121
defer s.muUDPMux.Unlock()
121122
if s.udpMux == nil {
@@ -158,8 +159,8 @@ func (s *ICEBind) createIPv4ReceiverFn(pc *ipv4.PacketConn, conn *net.UDPConn, r
158159
s.muUDPMux.Lock()
159160
defer s.muUDPMux.Unlock()
160161

161-
s.udpMux = NewUniversalUDPMuxDefault(
162-
UniversalUDPMuxParams{
162+
s.udpMux = udpmux.NewUniversalUDPMuxDefault(
163+
udpmux.UniversalUDPMuxParams{
163164
UDPConn: nbnet.WrapPacketConn(conn),
164165
Net: s.transportNet,
165166
FilterFn: s.filterFn,

client/iface/bind/udp_mux_ios.go

Lines changed: 0 additions & 7 deletions
This file was deleted.

client/iface/device.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,14 @@ import (
77

88
wgdevice "golang.zx2c4.com/wireguard/device"
99

10-
"github.com/netbirdio/netbird/client/iface/bind"
1110
"github.com/netbirdio/netbird/client/iface/device"
11+
"github.com/netbirdio/netbird/client/iface/udpmux"
1212
"github.com/netbirdio/netbird/client/iface/wgaddr"
1313
)
1414

1515
type WGTunDevice interface {
1616
Create() (device.WGConfigurer, error)
17-
Up() (*bind.UniversalUDPMuxDefault, error)
17+
Up() (*udpmux.UniversalUDPMuxDefault, error)
1818
UpdateAddr(address wgaddr.Address) error
1919
WgAddress() wgaddr.Address
2020
MTU() uint16

client/iface/device/device_android.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313

1414
"github.com/netbirdio/netbird/client/iface/bind"
1515
"github.com/netbirdio/netbird/client/iface/configurer"
16+
"github.com/netbirdio/netbird/client/iface/udpmux"
1617
"github.com/netbirdio/netbird/client/iface/wgaddr"
1718
)
1819

@@ -29,7 +30,7 @@ type WGTunDevice struct {
2930
name string
3031
device *device.Device
3132
filteredDevice *FilteredDevice
32-
udpMux *bind.UniversalUDPMuxDefault
33+
udpMux *udpmux.UniversalUDPMuxDefault
3334
configurer WGConfigurer
3435
}
3536

@@ -88,7 +89,7 @@ func (t *WGTunDevice) Create(routes []string, dns string, searchDomains []string
8889
}
8990
return t.configurer, nil
9091
}
91-
func (t *WGTunDevice) Up() (*bind.UniversalUDPMuxDefault, error) {
92+
func (t *WGTunDevice) Up() (*udpmux.UniversalUDPMuxDefault, error) {
9293
err := t.device.Up()
9394
if err != nil {
9495
return nil, err

client/iface/device/device_darwin.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313

1414
"github.com/netbirdio/netbird/client/iface/bind"
1515
"github.com/netbirdio/netbird/client/iface/configurer"
16+
"github.com/netbirdio/netbird/client/iface/udpmux"
1617
"github.com/netbirdio/netbird/client/iface/wgaddr"
1718
)
1819

@@ -26,7 +27,7 @@ type TunDevice struct {
2627

2728
device *device.Device
2829
filteredDevice *FilteredDevice
29-
udpMux *bind.UniversalUDPMuxDefault
30+
udpMux *udpmux.UniversalUDPMuxDefault
3031
configurer WGConfigurer
3132
}
3233

@@ -71,7 +72,7 @@ func (t *TunDevice) Create() (WGConfigurer, error) {
7172
return t.configurer, nil
7273
}
7374

74-
func (t *TunDevice) Up() (*bind.UniversalUDPMuxDefault, error) {
75+
func (t *TunDevice) Up() (*udpmux.UniversalUDPMuxDefault, error) {
7576
err := t.device.Up()
7677
if err != nil {
7778
return nil, err

client/iface/device/device_ios.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414

1515
"github.com/netbirdio/netbird/client/iface/bind"
1616
"github.com/netbirdio/netbird/client/iface/configurer"
17+
"github.com/netbirdio/netbird/client/iface/udpmux"
1718
"github.com/netbirdio/netbird/client/iface/wgaddr"
1819
)
1920

@@ -28,7 +29,7 @@ type TunDevice struct {
2829

2930
device *device.Device
3031
filteredDevice *FilteredDevice
31-
udpMux *bind.UniversalUDPMuxDefault
32+
udpMux *udpmux.UniversalUDPMuxDefault
3233
configurer WGConfigurer
3334
}
3435

@@ -83,7 +84,7 @@ func (t *TunDevice) Create() (WGConfigurer, error) {
8384
return t.configurer, nil
8485
}
8586

86-
func (t *TunDevice) Up() (*bind.UniversalUDPMuxDefault, error) {
87+
func (t *TunDevice) Up() (*udpmux.UniversalUDPMuxDefault, error) {
8788
err := t.device.Up()
8889
if err != nil {
8990
return nil, err

client/iface/device/device_kernel_unix.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ import (
1212
"golang.zx2c4.com/wireguard/device"
1313
"golang.zx2c4.com/wireguard/tun/netstack"
1414

15-
"github.com/netbirdio/netbird/client/iface/bind"
1615
"github.com/netbirdio/netbird/client/iface/configurer"
16+
"github.com/netbirdio/netbird/client/iface/udpmux"
1717
"github.com/netbirdio/netbird/client/iface/wgaddr"
1818
"github.com/netbirdio/netbird/sharedsock"
1919
nbnet "github.com/netbirdio/netbird/util/net"
@@ -31,9 +31,9 @@ type TunKernelDevice struct {
3131

3232
link *wgLink
3333
udpMuxConn net.PacketConn
34-
udpMux *bind.UniversalUDPMuxDefault
34+
udpMux *udpmux.UniversalUDPMuxDefault
3535

36-
filterFn bind.FilterFn
36+
filterFn udpmux.FilterFn
3737
}
3838

3939
func NewKernelDevice(name string, address wgaddr.Address, wgPort int, key string, mtu uint16, transportNet transport.Net) *TunKernelDevice {
@@ -79,7 +79,7 @@ func (t *TunKernelDevice) Create() (WGConfigurer, error) {
7979
return configurer, nil
8080
}
8181

82-
func (t *TunKernelDevice) Up() (*bind.UniversalUDPMuxDefault, error) {
82+
func (t *TunKernelDevice) Up() (*udpmux.UniversalUDPMuxDefault, error) {
8383
if t.udpMux != nil {
8484
return t.udpMux, nil
8585
}
@@ -106,14 +106,14 @@ func (t *TunKernelDevice) Up() (*bind.UniversalUDPMuxDefault, error) {
106106
udpConn = nbnet.WrapPacketConn(rawSock)
107107
}
108108

109-
bindParams := bind.UniversalUDPMuxParams{
109+
bindParams := udpmux.UniversalUDPMuxParams{
110110
UDPConn: udpConn,
111111
Net: t.transportNet,
112112
FilterFn: t.filterFn,
113113
WGAddress: t.address,
114114
MTU: t.mtu,
115115
}
116-
mux := bind.NewUniversalUDPMuxDefault(bindParams)
116+
mux := udpmux.NewUniversalUDPMuxDefault(bindParams)
117117
go mux.ReadFromConn(t.ctx)
118118
t.udpMuxConn = rawSock
119119
t.udpMux = mux

client/iface/device/device_netstack.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"github.com/netbirdio/netbird/client/iface/bind"
1111
"github.com/netbirdio/netbird/client/iface/configurer"
1212
nbnetstack "github.com/netbirdio/netbird/client/iface/netstack"
13+
"github.com/netbirdio/netbird/client/iface/udpmux"
1314
"github.com/netbirdio/netbird/client/iface/wgaddr"
1415
nbnet "github.com/netbirdio/netbird/util/net"
1516
)
@@ -26,7 +27,7 @@ type TunNetstackDevice struct {
2627
device *device.Device
2728
filteredDevice *FilteredDevice
2829
nsTun *nbnetstack.NetStackTun
29-
udpMux *bind.UniversalUDPMuxDefault
30+
udpMux *udpmux.UniversalUDPMuxDefault
3031
configurer WGConfigurer
3132

3233
net *netstack.Net
@@ -80,7 +81,7 @@ func (t *TunNetstackDevice) create() (WGConfigurer, error) {
8081
return t.configurer, nil
8182
}
8283

83-
func (t *TunNetstackDevice) Up() (*bind.UniversalUDPMuxDefault, error) {
84+
func (t *TunNetstackDevice) Up() (*udpmux.UniversalUDPMuxDefault, error) {
8485
if t.device == nil {
8586
return nil, fmt.Errorf("device is not ready yet")
8687
}

client/iface/device/device_usp_unix.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212

1313
"github.com/netbirdio/netbird/client/iface/bind"
1414
"github.com/netbirdio/netbird/client/iface/configurer"
15+
"github.com/netbirdio/netbird/client/iface/udpmux"
1516
"github.com/netbirdio/netbird/client/iface/wgaddr"
1617
)
1718

@@ -25,7 +26,7 @@ type USPDevice struct {
2526

2627
device *device.Device
2728
filteredDevice *FilteredDevice
28-
udpMux *bind.UniversalUDPMuxDefault
29+
udpMux *udpmux.UniversalUDPMuxDefault
2930
configurer WGConfigurer
3031
}
3132

@@ -74,7 +75,7 @@ func (t *USPDevice) Create() (WGConfigurer, error) {
7475
return t.configurer, nil
7576
}
7677

77-
func (t *USPDevice) Up() (*bind.UniversalUDPMuxDefault, error) {
78+
func (t *USPDevice) Up() (*udpmux.UniversalUDPMuxDefault, error) {
7879
if t.device == nil {
7980
return nil, fmt.Errorf("device is not ready yet")
8081
}

client/iface/device/device_windows.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313

1414
"github.com/netbirdio/netbird/client/iface/bind"
1515
"github.com/netbirdio/netbird/client/iface/configurer"
16+
"github.com/netbirdio/netbird/client/iface/udpmux"
1617
"github.com/netbirdio/netbird/client/iface/wgaddr"
1718
)
1819

@@ -29,7 +30,7 @@ type TunDevice struct {
2930
device *device.Device
3031
nativeTunDevice *tun.NativeTun
3132
filteredDevice *FilteredDevice
32-
udpMux *bind.UniversalUDPMuxDefault
33+
udpMux *udpmux.UniversalUDPMuxDefault
3334
configurer WGConfigurer
3435
}
3536

@@ -104,7 +105,7 @@ func (t *TunDevice) Create() (WGConfigurer, error) {
104105
return t.configurer, nil
105106
}
106107

107-
func (t *TunDevice) Up() (*bind.UniversalUDPMuxDefault, error) {
108+
func (t *TunDevice) Up() (*udpmux.UniversalUDPMuxDefault, error) {
108109
err := t.device.Up()
109110
if err != nil {
110111
return nil, err

0 commit comments

Comments
 (0)