-
Notifications
You must be signed in to change notification settings - Fork 151
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Move util.go to more appropriately named files
Move util.go to more appropriately named files
- Loading branch information
Showing
8 changed files
with
123 additions
and
132 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,48 @@ | ||
package ice | ||
|
||
import "net" | ||
|
||
func parseMulticastAnswerAddr(in net.Addr) (net.IP, bool) { | ||
switch addr := in.(type) { | ||
case *net.IPAddr: | ||
return addr.IP, true | ||
case *net.UDPAddr: | ||
return addr.IP, true | ||
case *net.TCPAddr: | ||
return addr.IP, true | ||
} | ||
return nil, false | ||
} | ||
|
||
func parseAddr(in net.Addr) (net.IP, int, NetworkType, bool) { | ||
switch addr := in.(type) { | ||
case *net.UDPAddr: | ||
return addr.IP, addr.Port, NetworkTypeUDP4, true | ||
case *net.TCPAddr: | ||
return addr.IP, addr.Port, NetworkTypeTCP4, true | ||
} | ||
return nil, 0, 0, false | ||
} | ||
|
||
func createAddr(network NetworkType, ip net.IP, port int) net.Addr { | ||
switch { | ||
case network.IsTCP(): | ||
return &net.TCPAddr{IP: ip, Port: port} | ||
default: | ||
return &net.UDPAddr{IP: ip, Port: port} | ||
} | ||
} | ||
|
||
func addrEqual(a, b net.Addr) bool { | ||
aIP, aPort, aType, aOk := parseAddr(a) | ||
if !aOk { | ||
return false | ||
} | ||
|
||
bIP, bPort, bType, bOk := parseAddr(b) | ||
if !bOk { | ||
return false | ||
} | ||
|
||
return aType == bType && aIP.Equal(bIP) && aPort == bPort | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,69 @@ | ||
// Package stun contains ICE specific STUN code | ||
package stun | ||
|
||
import ( | ||
"errors" | ||
"fmt" | ||
"net" | ||
"time" | ||
|
||
"github.com/pion/stun" | ||
) | ||
|
||
var ( | ||
errGetXorMappedAddrResponse = errors.New("failed to get XOR-MAPPED-ADDRESS response") | ||
errMismatchUsername = errors.New("username mismatch") | ||
) | ||
|
||
// GetXORMappedAddr initiates a stun requests to serverAddr using conn, reads the response and returns | ||
// the XORMappedAddress returned by the STUN server. | ||
func GetXORMappedAddr(conn net.PacketConn, serverAddr net.Addr, timeout time.Duration) (*stun.XORMappedAddress, error) { | ||
if timeout > 0 { | ||
if err := conn.SetReadDeadline(time.Now().Add(timeout)); err != nil { | ||
return nil, err | ||
} | ||
|
||
// Reset timeout after completion | ||
defer conn.SetReadDeadline(time.Time{}) //nolint:errcheck | ||
} | ||
|
||
req, err := stun.Build(stun.BindingRequest, stun.TransactionID) | ||
if err != nil { | ||
return nil, err | ||
} | ||
|
||
if _, err = conn.WriteTo(req.Raw, serverAddr); err != nil { | ||
return nil, err | ||
} | ||
|
||
const maxMessageSize = 1280 | ||
buf := make([]byte, maxMessageSize) | ||
n, _, err := conn.ReadFrom(buf) | ||
if err != nil { | ||
return nil, err | ||
} | ||
|
||
res := &stun.Message{Raw: buf[:n]} | ||
if err = res.Decode(); err != nil { | ||
return nil, err | ||
} | ||
|
||
var addr stun.XORMappedAddress | ||
if err = addr.GetFrom(res); err != nil { | ||
return nil, fmt.Errorf("%w: %v", errGetXorMappedAddrResponse, err) | ||
} | ||
|
||
return &addr, nil | ||
} | ||
|
||
// AssertUsername checks that the given STUN message m has a USERNAME attribute with a given value | ||
func AssertUsername(m *stun.Message, expectedUsername string) error { | ||
var username stun.Username | ||
if err := username.GetFrom(m); err != nil { | ||
return err | ||
} else if string(username) != expectedUsername { | ||
return fmt.Errorf("%w expected(%x) actual(%x)", errMismatchUsername, expectedUsername, string(username)) | ||
} | ||
|
||
return nil | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
File renamed without changes.