mirror of
https://github.com/hanzokms/turn.git
synced 2026-10-30 20:50:36 +00:00
74 lines
2.0 KiB
Go
74 lines
2.0 KiB
Go
// SPDX-FileCopyrightText: 2023 The Pion community <https://pion.ly>
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package turn
|
|
|
|
import (
|
|
"fmt"
|
|
"net"
|
|
"strconv"
|
|
|
|
"github.com/pion/transport/v3"
|
|
"github.com/pion/transport/v3/stdnet"
|
|
)
|
|
|
|
// RelayAddressGeneratorStatic can be used to return static IP address each time a relay is created.
|
|
// This can be used when you have a single static IP address that you want to use.
|
|
type RelayAddressGeneratorStatic struct {
|
|
// RelayAddress is the IP returned to the user when the relay is created
|
|
RelayAddress net.IP
|
|
|
|
// Address is passed to Listen/ListenPacket when creating the Relay
|
|
Address string
|
|
|
|
Net transport.Net
|
|
}
|
|
|
|
// Validate is called on server startup and confirms the RelayAddressGenerator is properly configured.
|
|
func (r *RelayAddressGeneratorStatic) Validate() error {
|
|
if r.Net == nil {
|
|
var err error
|
|
r.Net, err = stdnet.NewNet()
|
|
if err != nil {
|
|
return fmt.Errorf("failed to create network: %w", err)
|
|
}
|
|
}
|
|
|
|
switch {
|
|
case r.RelayAddress == nil:
|
|
return errRelayAddressInvalid
|
|
case r.Address == "":
|
|
return errListeningAddressInvalid
|
|
default:
|
|
return nil
|
|
}
|
|
}
|
|
|
|
// AllocatePacketConn generates a new PacketConn to receive traffic on and the IP/Port
|
|
// to populate the allocation response with.
|
|
func (r *RelayAddressGeneratorStatic) AllocatePacketConn(
|
|
network string,
|
|
requestedPort int,
|
|
) (net.PacketConn, net.Addr, error) {
|
|
conn, err := r.Net.ListenPacket(network, r.Address+":"+strconv.Itoa(requestedPort))
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
|
|
// Replace actual listening IP with the user requested one of RelayAddressGeneratorStatic
|
|
relayAddr, ok := conn.LocalAddr().(*net.UDPAddr)
|
|
if !ok {
|
|
return nil, nil, errNilConn
|
|
}
|
|
|
|
relayAddr.IP = r.RelayAddress
|
|
|
|
return conn, relayAddr, nil
|
|
}
|
|
|
|
// AllocateConn generates a new Conn to receive traffic on and the IP/Port
|
|
// to populate the allocation response with.
|
|
func (r *RelayAddressGeneratorStatic) AllocateConn(string, int) (net.Conn, net.Addr, error) {
|
|
return nil, nil, errTODO
|
|
}
|