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
package bidder
import (
"fmt"
"path/filepath"
"github.com/johnandersen777/socialweb-computer-kcp/internal/component"
"github.com/johnandersen777/socialweb-computer-kcp/internal/guestnet"
core "github.com/johnandersen777/socialweb-computer-kcp/internal/market/bidder"
)
const webrtcPortsDir = "webrtc-udp-ports"
type webrtcPorts struct {
reg *component.PortRegistry
}
var _ core.GuestUDPPorts = webrtcPorts{}
// ponytail: one webrtc UDP port registry per bidder state dir; two bidders on one host share the range only through the bind probe; upgrade to a host-wide registry when one host runs several bidders with webrtc guests
func (s *Service) webrtcPorts() (core.GuestUDPPorts, error) {
ports := s.spec.GuestNetwork.WebRTCUDPPortRange()
if ports.Min < guestnet.HighUDPMinPort || ports.Max > 65535 || ports.Max < ports.Min {
return nil, fmt.Errorf("bidder: spec.guestNetwork.webrtcUDPPorts %d-%d is not a range from %d to 65535", ports.Min, ports.Max, guestnet.HighUDPMinPort)
}
reg, err := component.OpenPortRegistry(component.PortRegistryOptions{StateDir: filepath.Join(s.stateDir(), webrtcPortsDir),
First: int(ports.Min), Last: int(ports.Max), Host: "0.0.0.0", Network: "udp"})
if err != nil {
return nil, fmt.Errorf("bidder: the webrtc UDP port registry: %w", err)
}
return webrtcPorts{reg: reg}, nil
}
func (w webrtcPorts) Allocate(name string) (int, error) {
lease, err := w.reg.Allocate(name)
return lease.Port, err
}
func (w webrtcPorts) Release(name string) error { return w.reg.Release(name) }
func (w webrtcPorts) Held() []string {
leases := w.reg.Leases()
out := make([]string, 0, len(leases))
for _, l := range leases {
out = append(out, l.Name)
}
return out
}
func (s *Service) lanAddresses() []string {
out, err := guestnet.HostLANAddresses()
if err != nil {
s.log.Warn("the bidder cannot list the host's LAN addresses; the guest's webrtc gets no forwarded LAN UDP port", "err", err)
return nil
}
return out
}