Skip to content

Commit

Permalink
[MM-44062] Move STUN logic to rtcd (#67)
Browse files Browse the repository at this point in the history
* Move STUN logic to rtcd

* Update rtcd
  • Loading branch information
streamer45 authored May 10, 2022
1 parent 8a50238 commit fd6a63c
Show file tree
Hide file tree
Showing 5 changed files with 7 additions and 105 deletions.
4 changes: 2 additions & 2 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,7 @@ require (
require (
github.com/mattermost/logr/v2 v2.0.15
github.com/mattermost/mattermost-plugin-api v0.0.27
github.com/mattermost/rtcd v0.4.0
github.com/pion/stun v0.3.5
github.com/mattermost/rtcd v0.4.1-0.20220510065451-52a5335634f5
github.com/rudderlabs/analytics-go v3.3.2+incompatible
golang.org/x/time v0.0.0-20201208040808-7e3f01d25324
)
Expand Down Expand Up @@ -73,6 +72,7 @@ require (
github.com/pion/sctp v1.8.2 // indirect
github.com/pion/sdp/v3 v3.0.4 // indirect
github.com/pion/srtp/v2 v2.0.6-0.20211031173006-1d7627ee3ca0 // indirect
github.com/pion/stun v0.3.5 // indirect
github.com/pion/transport v0.13.0 // indirect
github.com/pion/turn/v2 v2.0.8 // indirect
github.com/pion/udp v0.1.1 // indirect
Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -974,8 +974,8 @@ github.com/mattermost/mattermost-server/v6 v6.6.0 h1:47XbXSJu9fdbhZWG5bQ5dj3ySrI
github.com/mattermost/mattermost-server/v6 v6.6.0/go.mod h1:oR6UCRo+SEvnfN2FEOdzHs1UljrskyCKU8tWeKlxgMo=
github.com/mattermost/morph v0.0.0-20220401091636-39f834798da8/go.mod h1:jxM3g1bx+k2Thz7jofcHguBS8TZn5Pc+o5MGmORObhw=
github.com/mattermost/rsc v0.0.0-20160330161541-bbaefb05eaa0/go.mod h1:nV5bfVpT//+B1RPD2JvRnxbkLmJEYXmRaaVl15fsXjs=
github.com/mattermost/rtcd v0.4.0 h1:ljshFDTKUMKq0LvgDEv+zGDkvKn5elSyghU6emo7bqo=
github.com/mattermost/rtcd v0.4.0/go.mod h1:yjK6nfY+CPzAXBKGrHPOiX8o1PY5eJjPUpQIbtCE8HU=
github.com/mattermost/rtcd v0.4.1-0.20220510065451-52a5335634f5 h1:uI/RlPBk/ODljOVUm/c2wp8tYtPxSJmyFVvVlSaxuRo=
github.com/mattermost/rtcd v0.4.1-0.20220510065451-52a5335634f5/go.mod h1:yjK6nfY+CPzAXBKGrHPOiX8o1PY5eJjPUpQIbtCE8HU=
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
Expand Down
16 changes: 3 additions & 13 deletions server/activate.go
Original file line number Diff line number Diff line change
Expand Up @@ -85,19 +85,10 @@ func (p *Plugin) OnActivate() error {
}()
}

var err error
publicHost := cfg.ICEHostOverride
if publicHost == "" {
publicHost, err = getPublicIP(*cfg.UDPServerPort, cfg.ICEServers)
if err != nil {
p.LogError(err.Error())
return err
}
}

rtcServer, err := rtc.NewServer(rtc.ServerConfig{
ICEPortUDP: *cfg.UDPServerPort,
ICEHostOverride: publicHost,
ICEHostOverride: cfg.ICEHostOverride,
ICEServers: cfg.ICEServers,
}, newLogger(p), p.metrics.RTCMetrics())
if err != nil {
p.LogError(err.Error())
Expand All @@ -112,12 +103,11 @@ func (p *Plugin) OnActivate() error {
p.mut.Lock()
p.nodeID = status.ClusterId
p.rtcServer = rtcServer
p.hostIP = publicHost
p.mut.Unlock()

go p.clusterEventsHandler()

p.LogDebug("activate", "ClusterID", status.ClusterId, "publicHost", publicHost)
p.LogDebug("activate", "ClusterID", status.ClusterId)
}

go p.wsWriter()
Expand Down
1 change: 0 additions & 1 deletion server/plugin.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,6 @@ type Plugin struct {
stopCh chan struct{}
clusterEvCh chan model.PluginClusterEvent
sessions map[string]*session
hostIP string

rtcServer *rtc.Server
rtcdClient *rtcd.Client
Expand Down
87 changes: 0 additions & 87 deletions server/utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,8 @@ import (
"compress/zlib"
"fmt"
"io"
"net"
"net/url"
"strings"
"time"

"github.com/pion/stun"
)

const (
Expand Down Expand Up @@ -66,89 +62,6 @@ func (p *Plugin) kvSetAtomic(key string, cb func(data []byte) ([]byte, error)) e
}
}

func getPublicIP(port int, iceServers []string) (string, error) {
conn, err := net.ListenUDP("udp4", &net.UDPAddr{
Port: port,
})
if err != nil {
return "", err
}
defer conn.Close()

var stunURL string
for _, u := range iceServers {
if strings.HasPrefix(u, "stun:") {
stunURL = u
}
}
if stunURL == "" {
return "", fmt.Errorf("no STUN server URL was found")
}
serverURL := stunURL[strings.Index(stunURL, ":")+1:]
serverAddr, err := net.ResolveUDPAddr("udp", serverURL)
if err != nil {
return "", fmt.Errorf("failed to resolve stun host: %w", err)
}

xoraddr, err := getXORMappedAddr(conn, serverAddr, 5*time.Second)
if err != nil {
return "", fmt.Errorf("failed to get public address: %w", err)
}

return xoraddr.IP.String(), nil
}

func getXORMappedAddr(conn net.PacketConn, serverAddr net.Addr, deadline time.Duration) (*stun.XORMappedAddress, error) {
if deadline > 0 {
if err := conn.SetReadDeadline(time.Now().Add(deadline)); err != nil {
return nil, err
}
}
defer func() {
if deadline > 0 {
_ = conn.SetReadDeadline(time.Time{})
}
}()
resp, err := stunRequest(
func(p []byte) (int, error) {
n, _, errr := conn.ReadFrom(p)
return n, errr
},
func(b []byte) (int, error) {
return conn.WriteTo(b, serverAddr)
},
)
if err != nil {
return nil, err
}
var addr stun.XORMappedAddress
if err = addr.GetFrom(resp); err != nil {
return nil, err
}
return &addr, nil
}

func stunRequest(read func([]byte) (int, error), write func([]byte) (int, error)) (*stun.Message, error) {
req, err := stun.Build(stun.BindingRequest, stun.TransactionID)
if err != nil {
return nil, err
}
if _, err = write(req.Raw); err != nil {
return nil, err
}
const maxMessageSize = 1280
bs := make([]byte, maxMessageSize)
n, err := read(bs)
if err != nil {
return nil, err
}
res := &stun.Message{Raw: bs[:n]}
if err := res.Decode(); err != nil {
return nil, err
}
return res, nil
}

func unpackSDPData(data []byte) ([]byte, error) {
buf := bytes.NewBuffer(data)
rd, err := zlib.NewReader(buf)
Expand Down

0 comments on commit fd6a63c

Please sign in to comment.