Files
webrtc/internal/network/port-send.go

59 lines
1.5 KiB
Go

package network
import (
"fmt"
"net"
"github.com/pions/webrtc/internal/srtp"
"github.com/pions/webrtc/pkg/rtp"
)
func (p *port) sendRTP(packet *rtp.Packet, dst net.Addr) {
p.m.certPairLock.RLock()
defer p.m.certPairLock.RUnlock()
if p.m.certPair == nil {
fmt.Println("Tried to send SRTP packet but no DTLS state to handle it")
return
}
contextMapKey := dst.String() + ":" + fmt.Sprint(packet.SSRC)
p.m.srtpContextsLock.Lock()
srtpContext, ok := p.m.srtpContexts[contextMapKey]
if !ok {
var err error
srtpContext, err = srtp.CreateContext([]byte(p.m.certPair.ClientWriteKey[0:16]), []byte(p.m.certPair.ClientWriteKey[16:]), p.m.certPair.Profile, packet.SSRC)
if err != nil {
fmt.Println("Failed to build SRTP context")
return
}
p.m.srtpContexts[contextMapKey] = srtpContext
}
p.m.srtpContextsLock.Unlock()
if ok := srtpContext.EncryptPacket(packet); ok {
raw, err := packet.Marshal()
if err != nil {
fmt.Printf("Failed to marshal packet: %s \n", err.Error())
}
if _, err := p.conn.WriteTo(raw, nil, dst); err != nil {
fmt.Printf("Failed to send packet: %s \n", err.Error())
}
} else {
fmt.Println("Failed to encrypt packet")
}
}
func (p *port) sendICE(buf []byte, dst net.Addr) {
if _, err := p.conn.WriteTo(buf, nil, dst); err != nil {
fmt.Printf("Failed to send packet: %s \n", err.Error())
}
}
func (p *port) sendSCTP(buf []byte, dst fmt.Stringer) {
_, err := p.m.dtlsState.Send(buf, p.listeningAddr.String(), dst.String())
if err != nil {
fmt.Println(err)
}
}