ice_kai

package module
v2.0.16-a Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 29, 2021 License: MIT Imports: 28 Imported by: 0

README


Pion ICE

A Go implementation of ICE

Pion transport Slack Widget
Build Status GoDoc Coverage Status Go Report Card


Roadmap

The library is used as a part of our WebRTC implementation. Please refer to that roadmap to track our major milestones.

Community

Pion has an active community on the Golang Slack. Sign up and join the #pion channel for discussions and support. You can also use Pion mailing list.

We are always looking to support your projects. Please reach out if you have something to build!

If you need commercial support or don't want to use public methods you can contact us at team@pion.ly

Contributing

Check out the contributing wiki to join the group of amazing people making this project possible:

License

MIT License - see LICENSE for full text

Documentation

Overview

Package ice implements the Interactive Connectivity Establishment (ICE) protocol defined in rfc5245.

Package ice ...

Package ice ...

Index

Constants

View Source
const (
	// ComponentRTP indicates that the candidate is used for RTP
	ComponentRTP uint16 = 1 + iota
	// ComponentRTCP indicates that the candidate is used for RTCP
	ComponentRTCP
)
View Source
const (
	// CandidatePairStateWaiting means a check has not been performed for
	// this pair
	CandidatePairStateWaiting = iota + 1

	// CandidatePairStateInProgress means a check has been sent for this pair,
	// but the transaction is in progress.
	CandidatePairStateInProgress

	// CandidatePairStateFailed means a check for this pair was already done
	// and failed, either never producing any response or producing an unrecoverable
	// failure response.
	CandidatePairStateFailed

	// CandidatePairStateSucceeded means a check for this pair was already
	// done and produced a successful result.
	CandidatePairStateSucceeded
)
View Source
const (
	// ConnectionStateNew ICE agent is gathering addresses
	ConnectionStateNew = iota + 1

	// ConnectionStateChecking ICE agent has been given local and remote candidates, and is attempting to find a match
	ConnectionStateChecking

	// ConnectionStateConnected ICE agent has a pairing, but is still checking other pairs
	ConnectionStateConnected

	// ConnectionStateCompleted ICE agent has finished
	ConnectionStateCompleted

	// ConnectionStateFailed ICE agent never could successfully connect
	ConnectionStateFailed

	// ConnectionStateDisconnected ICE agent connected successfully, but has entered a failed state
	ConnectionStateDisconnected

	// ConnectionStateClosed ICE agent has finished and is no longer handling requests
	ConnectionStateClosed
)

List of supported States

View Source
const Unknown = iota

Unknown defines default public constant to use for "enum" like struct comparisons when no value was defined.

Variables

View Source
var (
	// ErrUnknownType indicates an error with Unknown info.
	ErrUnknownType = errors.New("Unknown")

	// ErrSchemeType indicates the scheme type could not be parsed.
	ErrSchemeType = errors.New("unknown scheme type")

	// ErrSTUNQuery indicates query arguments are provided in a STUN URL.
	ErrSTUNQuery = errors.New("queries not supported in stun address")

	// ErrInvalidQuery indicates an malformed query is provided.
	ErrInvalidQuery = errors.New("invalid query")

	// ErrHost indicates malformed hostname is provided.
	ErrHost = errors.New("invalid hostname")

	// ErrPort indicates malformed port is provided.
	ErrPort = errors.New("invalid port")

	// ErrLocalUfragInsufficientBits indicates local username fragment insufficient bits are provided.
	// Have to be at least 24 bits long
	ErrLocalUfragInsufficientBits = errors.New("local username fragment is less than 24 bits long")

	// ErrLocalPwdInsufficientBits indicates local passoword insufficient bits are provided.
	// Have to be at least 128 bits long
	ErrLocalPwdInsufficientBits = errors.New("local password is less than 128 bits long")

	// ErrProtoType indicates an unsupported transport type was provided.
	ErrProtoType = errors.New("invalid transport protocol type")

	// ErrClosed indicates the agent is closed
	ErrClosed = errors.New("the agent is closed")

	// ErrNoCandidatePairs indicates agent does not have a valid candidate pair
	ErrNoCandidatePairs = errors.New("no candidate pairs available")

	// ErrCanceledByCaller indicates agent connection was canceled by the caller
	ErrCanceledByCaller = errors.New("connecting canceled by caller")

	// ErrMultipleStart indicates agent was started twice
	ErrMultipleStart = errors.New("attempted to start agent twice")

	// ErrRemoteUfragEmpty indicates agent was started with an empty remote ufrag
	ErrRemoteUfragEmpty = errors.New("remote ufrag is empty")

	// ErrRemotePwdEmpty indicates agent was started with an empty remote pwd
	ErrRemotePwdEmpty = errors.New("remote pwd is empty")

	// ErrNoOnCandidateHandler indicates agent was started without OnCandidate
	ErrNoOnCandidateHandler = errors.New("no OnCandidate provided")

	// ErrMultipleGatherAttempted indicates GatherCandidates has been called multiple times
	ErrMultipleGatherAttempted = errors.New("attempting to gather candidates during gathering state")

	// ErrUsernameEmpty indicates agent was give TURN URL with an empty Username
	ErrUsernameEmpty = errors.New("username is empty")

	// ErrPasswordEmpty indicates agent was give TURN URL with an empty Password
	ErrPasswordEmpty = errors.New("password is empty")

	// ErrAddressParseFailed indicates we were unable to parse a candidate address
	ErrAddressParseFailed = errors.New("failed to parse address")

	// ErrLiteUsingNonHostCandidates indicates non host candidates were selected for a lite agent
	ErrLiteUsingNonHostCandidates = errors.New("lite agents must only use host candidates")

	// ErrUselessUrlsProvided indicates that one or more URL was provided to the agent but no host
	// candidate required them
	ErrUselessUrlsProvided = errors.New("agent does not need URL with selected candidate types")

	// ErrUnsupportedNAT1To1IPCandidateType indicates that the specified NAT1To1IPCandidateType is
	// unsupported
	ErrUnsupportedNAT1To1IPCandidateType = errors.New("unsupported 1:1 NAT IP candidate type")

	// ErrInvalidNAT1To1IPMapping indicates that the given 1:1 NAT IP mapping is invalid
	ErrInvalidNAT1To1IPMapping = errors.New("invalid 1:1 NAT IP mapping")

	// ErrExternalMappedIPNotFound in NAT1To1IPMapping
	ErrExternalMappedIPNotFound = errors.New("external mapped IP not found")

	// ErrMulticastDNSWithNAT1To1IPMapping indicates that the mDNS gathering cannot be used along
	// with 1:1 NAT IP mapping for host candidate.
	ErrMulticastDNSWithNAT1To1IPMapping = errors.New("mDNS gathering cannot be used with 1:1 NAT IP mapping for host candidate")

	// ErrIneffectiveNAT1To1IPMappingHost indicates that 1:1 NAT IP mapping for host candidate is
	// requested, but the host candidate type is disabled.
	ErrIneffectiveNAT1To1IPMappingHost = errors.New("1:1 NAT IP mapping for host candidate ineffective")

	// ErrIneffectiveNAT1To1IPMappingSrflx indicates that 1:1 NAT IP mapping for srflx candidate is
	// requested, but the srflx candidate type is disabled.
	ErrIneffectiveNAT1To1IPMappingSrflx = errors.New("1:1 NAT IP mapping for srflx candidate ineffective")

	// ErrInvalidMulticastDNSHostName indicates an invalid MulticastDNSHostName
	ErrInvalidMulticastDNSHostName = errors.New("invalid mDNS HostName, must end with .local and can only contain a single '.'")

	// ErrRestartWhenGathering indicates Restart was called when Agent is in GatheringStateGathering
	ErrRestartWhenGathering = errors.New("ICE Agent can not be restarted when gathering")

	// ErrRunCanceled indicates a run operation was canceled by its individual done
	ErrRunCanceled = errors.New("run was canceled by done")

	// ErrTCPMuxNotInitialized indicates TCPMux is not initialized and that invalidTCPMux is used.
	ErrTCPMuxNotInitialized = errors.New("TCPMux is not initialized")

	// ErrTCPRemoteAddrAlreadyExists indicates we already have the connection with same remote addr.
	ErrTCPRemoteAddrAlreadyExists = errors.New("conn with same remote addr already exists")
)

Functions

func GetHKDFUfragPwd

func GetHKDFUfragPwd(HkdfSecret []byte, HkdfSalt []byte, HkdfInfoPrefix []byte) ([]string, error)

Types

type Agent

type Agent struct {

	// Pseudo random reader
	UfragReader io.Reader
	PwdReader   io.Reader
	// contains filtered or unexported fields
}

Agent represents the ICE agent

func NewAgent

func NewAgent(config *AgentConfig) (*Agent, error)

NewAgent creates a new Agent

func (*Agent) Accept

func (a *Agent) Accept(ctx context.Context, remoteUfrag, remotePwd string) (*Conn, error)

Accept connects to the remote agent, acting as the controlled ice agent. Accept blocks until at least one ice candidate pair has successfully connected.

func (*Agent) AddRemoteCandidate

func (a *Agent) AddRemoteCandidate(c Candidate) error

AddRemoteCandidate adds a new remote candidate

func (*Agent) Close

func (a *Agent) Close() error

Close cleans up the Agent

func (*Agent) Dial

func (a *Agent) Dial(ctx context.Context, remoteUfrag, remotePwd string) (*Conn, error)

Dial connects to the remote agent, acting as the controlling ice agent. Dial blocks until at least one ice candidate pair has successfully connected.

func (*Agent) GatherCandidates

func (a *Agent) GatherCandidates() error

GatherCandidates initiates the trickle based gathering process.

func (*Agent) GetCandidatePairsStats

func (a *Agent) GetCandidatePairsStats() []CandidatePairStats

GetCandidatePairsStats returns a list of candidate pair stats

func (*Agent) GetLocalCandidates

func (a *Agent) GetLocalCandidates() ([]Candidate, error)

GetLocalCandidates returns the local candidates

func (*Agent) GetLocalCandidatesStats

func (a *Agent) GetLocalCandidatesStats() []CandidateStats

GetLocalCandidatesStats returns a list of local candidates stats

func (*Agent) GetLocalUserCredentials

func (a *Agent) GetLocalUserCredentials() (frag string, pwd string, err error)

GetLocalUserCredentials returns the local user credentials

func (*Agent) GetRemoteCandidatesStats

func (a *Agent) GetRemoteCandidatesStats() []CandidateStats

GetRemoteCandidatesStats returns a list of remote candidates stats

func (*Agent) GetRemoteUserCredentials

func (a *Agent) GetRemoteUserCredentials() (frag string, pwd string, err error)

GetRemoteUserCredentials returns the remote user credentials

func (*Agent) OnCandidate

func (a *Agent) OnCandidate(f func(Candidate)) error

OnCandidate sets a handler that is fired when new candidates gathered. When the gathering process complete the last candidate is nil.

func (*Agent) OnConnectionStateChange

func (a *Agent) OnConnectionStateChange(f func(ConnectionState)) error

OnConnectionStateChange sets a handler that is fired when the connection state changes

func (*Agent) OnSelectedCandidatePairChange

func (a *Agent) OnSelectedCandidatePairChange(f func(Candidate, Candidate)) error

OnSelectedCandidatePairChange sets a handler that is fired when the final candidate pair is selected

func (*Agent) Restart

func (a *Agent) Restart(ufrag, pwd string) error

Restart restarts the ICE Agent with the provided ufrag/pwd If no ufrag/pwd is provided the Agent will generate one itself

Restart must only be called when GatheringState is GatheringStateComplete a user must then call GatherCandidates explicitly to start generating new ones

func (*Agent) SetRemoteCredentials

func (a *Agent) SetRemoteCredentials(remoteUfrag, remotePwd string) error

SetRemoteCredentials sets the credentials of the remote agent

type AgentConfig

type AgentConfig struct {
	Urls []*URL

	// PortMin and PortMax are optional. Leave them 0 for the default UDP port allocation strategy.
	PortMin uint16
	PortMax uint16

	// LocalUfrag and LocalPwd values used to perform connectivity
	// checks.  The values MUST be unguessable, with at least 128 bits of
	// random number generator output used to generate the password, and
	// at least 24 bits of output to generate the username fragment.
	LocalUfrag string
	LocalPwd   string

	// MulticastDNSMode controls mDNS behavior for the ICE agent
	MulticastDNSMode MulticastDNSMode

	// MulticastDNSHostName controls the hostname for this agent. If none is specified a random one will be generated
	MulticastDNSHostName string

	// DisconnectedTimeout defaults to 5 seconds when this property is nil.
	// If the duration is 0, the ICE Agent will never go to disconnected
	DisconnectedTimeout *time.Duration

	// FailedTimeout defaults to 25 seconds when this property is nil.
	// If the duration is 0, we will never go to failed.
	FailedTimeout *time.Duration

	// KeepaliveInterval determines how often should we send ICE
	// keepalives (should be less then connectiontimeout above)
	// when this is nil, it defaults to 10 seconds.
	// A keepalive interval of 0 means we never send keepalive packets
	KeepaliveInterval *time.Duration

	// NetworkTypes is an optional configuration for disabling or enabling
	// support for specific network types.
	NetworkTypes []NetworkType

	// CandidateTypes is an optional configuration for disabling or enabling
	// support for specific candidate types.
	CandidateTypes []CandidateType

	LoggerFactory logging.LoggerFactory

	// MaxBindingRequests is the max amount of binding requests the agent will send
	// over a candidate pair for validation or nomination, if after MaxBindingRequests
	// the candidate is yet to answer a binding request or a nomination we set the pair as failed
	MaxBindingRequests *uint16

	// Lite agents do not perform connectivity check and only provide host candidates.
	Lite bool

	// NAT1To1IPCandidateType is used along with NAT1To1IPs to specify which candidate type
	// the 1:1 NAT IP addresses should be mapped to.
	// If unspecified or CandidateTypeHost, NAT1To1IPs are used to replace host candidate IPs.
	// If CandidateTypeServerReflexive, it will insert a srflx candidate (as if it was dervied
	// from a STUN server) with its port number being the one for the actual host candidate.
	// Other values will result in an error.
	NAT1To1IPCandidateType CandidateType

	// NAT1To1IPs contains a list of public IP addresses that are to be used as a host
	// candidate or srflx candidate. This is used typically for servers that are behind
	// 1:1 D-NAT (e.g. AWS EC2 instances) and to eliminate the need of server reflexisive
	// candidate gathering.
	NAT1To1IPs []string

	// HostAcceptanceMinWait specify a minimum wait time before selecting host candidates
	HostAcceptanceMinWait *time.Duration
	// HostAcceptanceMinWait specify a minimum wait time before selecting srflx candidates
	SrflxAcceptanceMinWait *time.Duration
	// HostAcceptanceMinWait specify a minimum wait time before selecting prflx candidates
	PrflxAcceptanceMinWait *time.Duration
	// HostAcceptanceMinWait specify a minimum wait time before selecting relay candidates
	RelayAcceptanceMinWait *time.Duration

	// Net is the our abstracted network interface for internal development purpose only
	// (see github.com/pion/transport/vnet)
	Net *vnet.Net

	// InterfaceFilter is a function that you can use in order to  whitelist or blacklist
	// the interfaces which are used to gather ICE candidates.
	InterfaceFilter func(string) bool

	// InsecureSkipVerify controls if self-signed certificates are accepted when connecting
	// to TURN servers via TLS or DTLS
	InsecureSkipVerify bool

	// TCPMux will be used for multiplexing incoming TCP connections for ICE TCP.
	// Currently only passive candidates are supported. This functionality is
	// experimental and the API might change in the future.
	TCPMux TCPMux

	// Proxy Dialer is a dialer that should be implemented by the user based on golang.org/x/net/proxy
	// dial interface in order to support corporate proxies
	ProxyDialer proxy.Dialer

	// Pseudo random params
	HkdfSecret     []byte
	HkdfSalt       []byte
	HkdfInfoPrefix []byte
	// contains filtered or unexported fields
}

AgentConfig collects the arguments to ice.Agent construction into a single structure, for future-proofness of the interface

type AttrControl

type AttrControl struct {
	Role       Role
	Tiebreaker uint64
}

AttrControl is helper that wraps ICE-{CONTROLLED,CONTROLLING}.

func (AttrControl) AddTo

func (c AttrControl) AddTo(m *stun.Message) error

AddTo adds ICE-CONTROLLED or ICE-CONTROLLING attribute depending on Role.

func (*AttrControl) GetFrom

func (c *AttrControl) GetFrom(m *stun.Message) error

GetFrom decodes Role and Tiebreaker value from message.

type AttrControlled

type AttrControlled uint64

AttrControlled represents ICE-CONTROLLED attribute.

func (AttrControlled) AddTo

func (c AttrControlled) AddTo(m *stun.Message) error

AddTo adds ICE-CONTROLLED to message.

func (*AttrControlled) GetFrom

func (c *AttrControlled) GetFrom(m *stun.Message) error

GetFrom decodes ICE-CONTROLLED from message.

type AttrControlling

type AttrControlling uint64

AttrControlling represents ICE-CONTROLLING attribute.

func (AttrControlling) AddTo

func (c AttrControlling) AddTo(m *stun.Message) error

AddTo adds ICE-CONTROLLING to message.

func (*AttrControlling) GetFrom

func (c *AttrControlling) GetFrom(m *stun.Message) error

GetFrom decodes ICE-CONTROLLING from message.

type Candidate

type Candidate interface {
	// An arbitrary string used in the freezing algorithm to
	// group similar candidates.  It is the same for two candidates that
	// have the same type, base IP address, protocol (UDP, TCP, etc.),
	// and STUN or TURN server.
	Foundation() string

	// ID is a unique identifier for just this candidate
	// Unlike the foundation this is different for each candidate
	ID() string

	// A component is a piece of a data stream.
	// An example is one for RTP, and one for RTCP
	Component() uint16
	SetComponent(uint16)

	// The last time this candidate received traffic
	LastReceived() time.Time

	// The last time this candidate sent traffic
	LastSent() time.Time

	NetworkType() NetworkType
	Address() string
	Port() int

	Priority() uint32

	// A transport address related to a
	//  candidate, which is useful for diagnostics and other purposes
	RelatedAddress() *CandidateRelatedAddress

	String() string
	Type() CandidateType
	TCPType() TCPType

	Equal(other Candidate) bool

	Marshal() string
	// contains filtered or unexported methods
}

Candidate represents an ICE candidate

func UnmarshalCandidate

func UnmarshalCandidate(raw string) (Candidate, error)

UnmarshalCandidate creates a Candidate from its string representation

type CandidateHost

type CandidateHost struct {
	// contains filtered or unexported fields
}

CandidateHost is a candidate of type host

func NewCandidateHost

func NewCandidateHost(config *CandidateHostConfig) (*CandidateHost, error)

NewCandidateHost creates a new host candidate

func (*CandidateHost) Address

func (c *CandidateHost) Address() string

Address returns Candidate Address

func (*CandidateHost) Component

func (c *CandidateHost) Component() uint16

Component returns candidate component

func (*CandidateHost) Deadline

func (c *CandidateHost) Deadline() (deadline time.Time, ok bool)

Deadline implements context.Context

func (*CandidateHost) Done

func (c *CandidateHost) Done() <-chan struct{}

Done implements context.Context

func (*CandidateHost) Equal

func (c *CandidateHost) Equal(other Candidate) bool

Equal is used to compare two candidateBases

func (*CandidateHost) Err

func (c *CandidateHost) Err() error

Err implements context.Context

func (*CandidateHost) Foundation

func (c *CandidateHost) Foundation() string

func (*CandidateHost) ID

func (c *CandidateHost) ID() string

ID returns Candidate ID

func (*CandidateHost) LastReceived

func (c *CandidateHost) LastReceived() time.Time

LastReceived returns a time.Time indicating the last time this candidate was received

func (*CandidateHost) LastSent

func (c *CandidateHost) LastSent() time.Time

LastSent returns a time.Time indicating the last time this candidate was sent

func (*CandidateHost) LocalPreference

func (c *CandidateHost) LocalPreference() uint16

LocalPreference returns the local preference for this candidate

func (*CandidateHost) Marshal

func (c *CandidateHost) Marshal() string

Marshal returns the string representation of the ICECandidate

func (*CandidateHost) NetworkType

func (c *CandidateHost) NetworkType() NetworkType

NetworkType returns candidate NetworkType

func (*CandidateHost) Port

func (c *CandidateHost) Port() int

Port returns Candidate Port

func (*CandidateHost) Priority

func (c *CandidateHost) Priority() uint32

Priority computes the priority for this ICE Candidate

func (*CandidateHost) RelatedAddress

func (c *CandidateHost) RelatedAddress() *CandidateRelatedAddress

RelatedAddress returns *CandidateRelatedAddress

func (*CandidateHost) SetComponent

func (c *CandidateHost) SetComponent(component uint16)

func (*CandidateHost) String

func (c *CandidateHost) String() string

String makes the candidateBase printable

func (*CandidateHost) TCPType

func (c *CandidateHost) TCPType() TCPType

func (*CandidateHost) Type

func (c *CandidateHost) Type() CandidateType

Type returns candidate type

func (*CandidateHost) Value

func (c *CandidateHost) Value(key interface{}) interface{}

Value implements context.Context

type CandidateHostConfig

type CandidateHostConfig struct {
	CandidateID string
	Network     string
	Address     string
	Port        int
	Component   uint16
	Priority    uint32
	Foundation  string
	TCPType     TCPType
}

CandidateHostConfig is the config required to create a new CandidateHost

type CandidatePairState

type CandidatePairState int

CandidatePairState represent the ICE candidate pair state

func (CandidatePairState) String

func (c CandidatePairState) String() string

type CandidatePairStats

type CandidatePairStats struct {
	// Timestamp is the timestamp associated with this object.
	Timestamp time.Time

	// LocalCandidateID is the ID of the local candidate
	LocalCandidateID string

	// RemoteCandidateID is the ID of the remote candidate
	RemoteCandidateID string

	// State represents the state of the checklist for the local and remote
	// candidates in a pair.
	State CandidatePairState

	// Nominated is true when this valid pair that should be used for media
	// if it is the highest-priority one amongst those whose nominated flag is set
	Nominated bool

	// PacketsSent represents the total number of packets sent on this candidate pair.
	PacketsSent uint32

	// PacketsReceived represents the total number of packets received on this candidate pair.
	PacketsReceived uint32

	// BytesSent represents the total number of payload bytes sent on this candidate pair
	// not including headers or padding.
	BytesSent uint64

	// BytesReceived represents the total number of payload bytes received on this candidate pair
	// not including headers or padding.
	BytesReceived uint64

	// LastPacketSentTimestamp represents the timestamp at which the last packet was
	// sent on this particular candidate pair, excluding STUN packets.
	LastPacketSentTimestamp time.Time

	// LastPacketReceivedTimestamp represents the timestamp at which the last packet
	// was received on this particular candidate pair, excluding STUN packets.
	LastPacketReceivedTimestamp time.Time

	// FirstRequestTimestamp represents the timestamp at which the first STUN request
	// was sent on this particular candidate pair.
	FirstRequestTimestamp time.Time

	// LastRequestTimestamp represents the timestamp at which the last STUN request
	// was sent on this particular candidate pair. The average interval between two
	// consecutive connectivity checks sent can be calculated with
	// (LastRequestTimestamp - FirstRequestTimestamp) / RequestsSent.
	LastRequestTimestamp time.Time

	// LastResponseTimestamp represents the timestamp at which the last STUN response
	// was received on this particular candidate pair.
	LastResponseTimestamp time.Time

	// TotalRoundTripTime represents the sum of all round trip time measurements
	// in seconds since the beginning of the session, based on STUN connectivity
	// check responses (ResponsesReceived), including those that reply to requests
	// that are sent in order to verify consent. The average round trip time can
	// be computed from TotalRoundTripTime by dividing it by ResponsesReceived.
	TotalRoundTripTime float64

	// CurrentRoundTripTime represents the latest round trip time measured in seconds,
	// computed from both STUN connectivity checks, including those that are sent
	// for consent verification.
	CurrentRoundTripTime float64

	// AvailableOutgoingBitrate is calculated by the underlying congestion control
	// by combining the available bitrate for all the outgoing RTP streams using
	// this candidate pair. The bitrate measurement does not count the size of the
	// IP or other transport layers like TCP or UDP. It is similar to the TIAS defined
	// in RFC 3890, i.e., it is measured in bits per second and the bitrate is calculated
	// over a 1 second window.
	AvailableOutgoingBitrate float64

	// AvailableIncomingBitrate is calculated by the underlying congestion control
	// by combining the available bitrate for all the incoming RTP streams using
	// this candidate pair. The bitrate measurement does not count the size of the
	// IP or other transport layers like TCP or UDP. It is similar to the TIAS defined
	// in  RFC 3890, i.e., it is measured in bits per second and the bitrate is
	// calculated over a 1 second window.
	AvailableIncomingBitrate float64

	// CircuitBreakerTriggerCount represents the number of times the circuit breaker
	// is triggered for this particular 5-tuple, ceasing transmission.
	CircuitBreakerTriggerCount uint32

	// RequestsReceived represents the total number of connectivity check requests
	// received (including retransmissions). It is impossible for the receiver to
	// tell whether the request was sent in order to check connectivity or check
	// consent, so all connectivity checks requests are counted here.
	RequestsReceived uint64

	// RequestsSent represents the total number of connectivity check requests
	// sent (not including retransmissions).
	RequestsSent uint64

	// ResponsesReceived represents the total number of connectivity check responses received.
	ResponsesReceived uint64

	// ResponsesSent epresents the total number of connectivity check responses sent.
	// Since we cannot distinguish connectivity check requests and consent requests,
	// all responses are counted.
	ResponsesSent uint64

	// RetransmissionsReceived represents the total number of connectivity check
	// request retransmissions received.
	RetransmissionsReceived uint64

	// RetransmissionsSent represents the total number of connectivity check
	// request retransmissions sent.
	RetransmissionsSent uint64

	// ConsentRequestsSent represents the total number of consent requests sent.
	ConsentRequestsSent uint64

	// ConsentExpiredTimestamp represents the timestamp at which the latest valid
	// STUN binding response expired.
	ConsentExpiredTimestamp time.Time
}

CandidatePairStats contains ICE candidate pair statistics

type CandidatePeerReflexive

type CandidatePeerReflexive struct {
	// contains filtered or unexported fields
}

CandidatePeerReflexive ...

func NewCandidatePeerReflexive

func NewCandidatePeerReflexive(config *CandidatePeerReflexiveConfig) (*CandidatePeerReflexive, error)

NewCandidatePeerReflexive creates a new peer reflective candidate

func (*CandidatePeerReflexive) Address

func (c *CandidatePeerReflexive) Address() string

Address returns Candidate Address

func (*CandidatePeerReflexive) Component

func (c *CandidatePeerReflexive) Component() uint16

Component returns candidate component

func (*CandidatePeerReflexive) Deadline

func (c *CandidatePeerReflexive) Deadline() (deadline time.Time, ok bool)

Deadline implements context.Context

func (*CandidatePeerReflexive) Done

func (c *CandidatePeerReflexive) Done() <-chan struct{}

Done implements context.Context

func (*CandidatePeerReflexive) Equal

func (c *CandidatePeerReflexive) Equal(other Candidate) bool

Equal is used to compare two candidateBases

func (*CandidatePeerReflexive) Err

func (c *CandidatePeerReflexive) Err() error

Err implements context.Context

func (*CandidatePeerReflexive) Foundation

func (c *CandidatePeerReflexive) Foundation() string

func (*CandidatePeerReflexive) ID

func (c *CandidatePeerReflexive) ID() string

ID returns Candidate ID

func (*CandidatePeerReflexive) LastReceived

func (c *CandidatePeerReflexive) LastReceived() time.Time

LastReceived returns a time.Time indicating the last time this candidate was received

func (*CandidatePeerReflexive) LastSent

func (c *CandidatePeerReflexive) LastSent() time.Time

LastSent returns a time.Time indicating the last time this candidate was sent

func (*CandidatePeerReflexive) LocalPreference

func (c *CandidatePeerReflexive) LocalPreference() uint16

LocalPreference returns the local preference for this candidate

func (*CandidatePeerReflexive) Marshal

func (c *CandidatePeerReflexive) Marshal() string

Marshal returns the string representation of the ICECandidate

func (*CandidatePeerReflexive) NetworkType

func (c *CandidatePeerReflexive) NetworkType() NetworkType

NetworkType returns candidate NetworkType

func (*CandidatePeerReflexive) Port

func (c *CandidatePeerReflexive) Port() int

Port returns Candidate Port

func (*CandidatePeerReflexive) Priority

func (c *CandidatePeerReflexive) Priority() uint32

Priority computes the priority for this ICE Candidate

func (*CandidatePeerReflexive) RelatedAddress

func (c *CandidatePeerReflexive) RelatedAddress() *CandidateRelatedAddress

RelatedAddress returns *CandidateRelatedAddress

func (*CandidatePeerReflexive) SetComponent

func (c *CandidatePeerReflexive) SetComponent(component uint16)

func (*CandidatePeerReflexive) String

func (c *CandidatePeerReflexive) String() string

String makes the candidateBase printable

func (*CandidatePeerReflexive) TCPType

func (c *CandidatePeerReflexive) TCPType() TCPType

func (*CandidatePeerReflexive) Type

func (c *CandidatePeerReflexive) Type() CandidateType

Type returns candidate type

func (*CandidatePeerReflexive) Value

func (c *CandidatePeerReflexive) Value(key interface{}) interface{}

Value implements context.Context

type CandidatePeerReflexiveConfig

type CandidatePeerReflexiveConfig struct {
	CandidateID string
	Network     string
	Address     string
	Port        int
	Component   uint16
	Priority    uint32
	Foundation  string
	RelAddr     string
	RelPort     int
}

CandidatePeerReflexiveConfig is the config required to create a new CandidatePeerReflexive

type CandidateRelatedAddress

type CandidateRelatedAddress struct {
	Address string
	Port    int
}

CandidateRelatedAddress convey transport addresses related to the candidate, useful for diagnostics and other purposes.

func (*CandidateRelatedAddress) Equal

Equal allows comparing two CandidateRelatedAddresses. The CandidateRelatedAddress are allowed to be nil.

func (*CandidateRelatedAddress) String

func (c *CandidateRelatedAddress) String() string

String makes CandidateRelatedAddress printable

type CandidateRelay

type CandidateRelay struct {
	// contains filtered or unexported fields
}

CandidateRelay ...

func NewCandidateRelay

func NewCandidateRelay(config *CandidateRelayConfig) (*CandidateRelay, error)

NewCandidateRelay creates a new relay candidate

func (*CandidateRelay) Address

func (c *CandidateRelay) Address() string

Address returns Candidate Address

func (*CandidateRelay) Component

func (c *CandidateRelay) Component() uint16

Component returns candidate component

func (*CandidateRelay) Deadline

func (c *CandidateRelay) Deadline() (deadline time.Time, ok bool)

Deadline implements context.Context

func (*CandidateRelay) Done

func (c *CandidateRelay) Done() <-chan struct{}

Done implements context.Context

func (*CandidateRelay) Equal

func (c *CandidateRelay) Equal(other Candidate) bool

Equal is used to compare two candidateBases

func (*CandidateRelay) Err

func (c *CandidateRelay) Err() error

Err implements context.Context

func (*CandidateRelay) Foundation

func (c *CandidateRelay) Foundation() string

func (*CandidateRelay) ID

func (c *CandidateRelay) ID() string

ID returns Candidate ID

func (*CandidateRelay) LastReceived

func (c *CandidateRelay) LastReceived() time.Time

LastReceived returns a time.Time indicating the last time this candidate was received

func (*CandidateRelay) LastSent

func (c *CandidateRelay) LastSent() time.Time

LastSent returns a time.Time indicating the last time this candidate was sent

func (*CandidateRelay) LocalPreference

func (c *CandidateRelay) LocalPreference() uint16

LocalPreference returns the local preference for this candidate

func (*CandidateRelay) Marshal

func (c *CandidateRelay) Marshal() string

Marshal returns the string representation of the ICECandidate

func (*CandidateRelay) NetworkType

func (c *CandidateRelay) NetworkType() NetworkType

NetworkType returns candidate NetworkType

func (*CandidateRelay) Port

func (c *CandidateRelay) Port() int

Port returns Candidate Port

func (*CandidateRelay) Priority

func (c *CandidateRelay) Priority() uint32

Priority computes the priority for this ICE Candidate

func (*CandidateRelay) RelatedAddress

func (c *CandidateRelay) RelatedAddress() *CandidateRelatedAddress

RelatedAddress returns *CandidateRelatedAddress

func (*CandidateRelay) SetComponent

func (c *CandidateRelay) SetComponent(component uint16)

func (*CandidateRelay) String

func (c *CandidateRelay) String() string

String makes the candidateBase printable

func (*CandidateRelay) TCPType

func (c *CandidateRelay) TCPType() TCPType

func (*CandidateRelay) Type

func (c *CandidateRelay) Type() CandidateType

Type returns candidate type

func (*CandidateRelay) Value

func (c *CandidateRelay) Value(key interface{}) interface{}

Value implements context.Context

type CandidateRelayConfig

type CandidateRelayConfig struct {
	CandidateID string
	Network     string
	Address     string
	Port        int
	Component   uint16
	Priority    uint32
	Foundation  string
	RelAddr     string
	RelPort     int
	OnClose     func() error
}

CandidateRelayConfig is the config required to create a new CandidateRelay

type CandidateServerReflexive

type CandidateServerReflexive struct {
	// contains filtered or unexported fields
}

CandidateServerReflexive ...

func NewCandidateServerReflexive

func NewCandidateServerReflexive(config *CandidateServerReflexiveConfig) (*CandidateServerReflexive, error)

NewCandidateServerReflexive creates a new server reflective candidate

func (*CandidateServerReflexive) Address

func (c *CandidateServerReflexive) Address() string

Address returns Candidate Address

func (*CandidateServerReflexive) Component

func (c *CandidateServerReflexive) Component() uint16

Component returns candidate component

func (*CandidateServerReflexive) Deadline

func (c *CandidateServerReflexive) Deadline() (deadline time.Time, ok bool)

Deadline implements context.Context

func (*CandidateServerReflexive) Done

func (c *CandidateServerReflexive) Done() <-chan struct{}

Done implements context.Context

func (*CandidateServerReflexive) Equal

func (c *CandidateServerReflexive) Equal(other Candidate) bool

Equal is used to compare two candidateBases

func (*CandidateServerReflexive) Err

func (c *CandidateServerReflexive) Err() error

Err implements context.Context

func (*CandidateServerReflexive) Foundation

func (c *CandidateServerReflexive) Foundation() string

func (*CandidateServerReflexive) ID

func (c *CandidateServerReflexive) ID() string

ID returns Candidate ID

func (*CandidateServerReflexive) LastReceived

func (c *CandidateServerReflexive) LastReceived() time.Time

LastReceived returns a time.Time indicating the last time this candidate was received

func (*CandidateServerReflexive) LastSent

func (c *CandidateServerReflexive) LastSent() time.Time

LastSent returns a time.Time indicating the last time this candidate was sent

func (*CandidateServerReflexive) LocalPreference

func (c *CandidateServerReflexive) LocalPreference() uint16

LocalPreference returns the local preference for this candidate

func (*CandidateServerReflexive) Marshal

func (c *CandidateServerReflexive) Marshal() string

Marshal returns the string representation of the ICECandidate

func (*CandidateServerReflexive) NetworkType

func (c *CandidateServerReflexive) NetworkType() NetworkType

NetworkType returns candidate NetworkType

func (*CandidateServerReflexive) Port

func (c *CandidateServerReflexive) Port() int

Port returns Candidate Port

func (*CandidateServerReflexive) Priority

func (c *CandidateServerReflexive) Priority() uint32

Priority computes the priority for this ICE Candidate

func (*CandidateServerReflexive) RelatedAddress

func (c *CandidateServerReflexive) RelatedAddress() *CandidateRelatedAddress

RelatedAddress returns *CandidateRelatedAddress

func (*CandidateServerReflexive) SetComponent

func (c *CandidateServerReflexive) SetComponent(component uint16)

func (*CandidateServerReflexive) String

func (c *CandidateServerReflexive) String() string

String makes the candidateBase printable

func (*CandidateServerReflexive) TCPType

func (c *CandidateServerReflexive) TCPType() TCPType

func (*CandidateServerReflexive) Type

func (c *CandidateServerReflexive) Type() CandidateType

Type returns candidate type

func (*CandidateServerReflexive) Value

func (c *CandidateServerReflexive) Value(key interface{}) interface{}

Value implements context.Context

type CandidateServerReflexiveConfig

type CandidateServerReflexiveConfig struct {
	CandidateID string
	Network     string
	Address     string
	Port        int
	Component   uint16
	Priority    uint32
	Foundation  string
	RelAddr     string
	RelPort     int
}

CandidateServerReflexiveConfig is the config required to create a new CandidateServerReflexive

type CandidateStats

type CandidateStats struct {
	// Timestamp is the timestamp associated with this object.
	Timestamp time.Time

	// ID is the candidate ID
	ID string

	// NetworkType represents the type of network interface used by the base of a
	// local candidate (the address the ICE agent sends from). Only present for
	// local candidates; it's not possible to know what type of network interface
	// a remote candidate is using.
	//
	// Note:
	// This stat only tells you about the network interface used by the first "hop";
	// it's possible that a connection will be bottlenecked by another type of network.
	// For example, when using Wi-Fi tethering, the networkType of the relevant candidate
	// would be "wifi", even when the next hop is over a cellular connection.
	NetworkType NetworkType

	// IP is the IP address of the candidate, allowing for IPv4 addresses and
	// IPv6 addresses, but fully qualified domain names (FQDNs) are not allowed.
	IP string

	// Port is the port number of the candidate.
	Port int

	// CandidateType is the "Type" field of the ICECandidate.
	CandidateType CandidateType

	// Priority is the "Priority" field of the ICECandidate.
	Priority uint32

	// URL is the URL of the TURN or STUN server indicated in the that translated
	// this IP address. It is the URL address surfaced in an PeerConnectionICEEvent.
	URL string

	// RelayProtocol is the protocol used by the endpoint to communicate with the
	// TURN server. This is only present for local candidates. Valid values for
	// the TURN URL protocol is one of udp, tcp, or tls.
	RelayProtocol string

	// Deleted is true if the candidate has been deleted/freed. For host candidates,
	// this means that any network resources (typically a socket) associated with the
	// candidate have been released. For TURN candidates, this means the TURN allocation
	// is no longer active.
	//
	// Only defined for local candidates. For remote candidates, this property is not applicable.
	Deleted bool
}

CandidateStats contains ICE candidate statistics related to the ICETransport objects.

type CandidateType

type CandidateType byte

CandidateType represents the type of candidate

const (
	CandidateTypeUnspecified CandidateType = iota
	CandidateTypeHost
	CandidateTypeServerReflexive
	CandidateTypePeerReflexive
	CandidateTypeRelay
)

CandidateType enum

func (CandidateType) Preference

func (c CandidateType) Preference() uint16

Preference returns the preference weight of a CandidateType

4.1.2.2. Guidelines for Choosing Type and Local Preferences The RECOMMENDED values are 126 for host candidates, 100 for server reflexive candidates, 110 for peer reflexive candidates, and 0 for relayed candidates.

func (CandidateType) String

func (c CandidateType) String() string

String makes CandidateType printable

type Conn

type Conn struct {
	// contains filtered or unexported fields
}

Conn represents the ICE connection. At the moment the lifetime of the Conn is equal to the Agent.

func (*Conn) BytesReceived

func (c *Conn) BytesReceived() uint64

BytesReceived returns the number of bytes received

func (*Conn) BytesSent

func (c *Conn) BytesSent() uint64

BytesSent returns the number of bytes sent

func (*Conn) Close

func (c *Conn) Close() error

Close implements the Conn Close method. It is used to close the connection. Any calls to Read and Write will be unblocked and return an error.

func (*Conn) LocalAddr

func (c *Conn) LocalAddr() net.Addr

LocalAddr returns the local address of the current selected pair or nil if there is none.

func (*Conn) Read

func (c *Conn) Read(p []byte) (int, error)

Read implements the Conn Read method.

func (*Conn) RemoteAddr

func (c *Conn) RemoteAddr() net.Addr

RemoteAddr returns the remote address of the current selected pair or nil if there is none.

func (*Conn) SetDeadline

func (c *Conn) SetDeadline(t time.Time) error

SetDeadline is a stub

func (*Conn) SetReadDeadline

func (c *Conn) SetReadDeadline(t time.Time) error

SetReadDeadline is a stub

func (*Conn) SetWriteDeadline

func (c *Conn) SetWriteDeadline(t time.Time) error

SetWriteDeadline is a stub

func (*Conn) Write

func (c *Conn) Write(p []byte) (int, error)

Write implements the Conn Write method.

type ConnectionState

type ConnectionState int

ConnectionState is an enum showing the state of a ICE Connection

func (ConnectionState) String

func (c ConnectionState) String() string

type GatheringState

type GatheringState int

GatheringState describes the state of the candidate gathering process

const (
	// GatheringStateNew indicates candidate gatering is not yet started
	GatheringStateNew GatheringState = iota + 1

	// GatheringStateGathering indicates candidate gatering is ongoing
	GatheringStateGathering

	// GatheringStateComplete indicates candidate gatering has been completed
	GatheringStateComplete
)

func (GatheringState) String

func (t GatheringState) String() string

type MulticastDNSMode

type MulticastDNSMode byte

MulticastDNSMode represents the different Multicast modes ICE can run in

const (
	// MulticastDNSModeDisabled means remote mDNS candidates will be discarded, and local host candidates will use IPs
	MulticastDNSModeDisabled MulticastDNSMode = iota + 1

	// MulticastDNSModeQueryOnly means remote mDNS candidates will be accepted, and local host candidates will use IPs
	MulticastDNSModeQueryOnly

	// MulticastDNSModeQueryAndGather means remote mDNS candidates will be accepted, and local host candidates will use mDNS
	MulticastDNSModeQueryAndGather
)

MulticastDNSMode enum

type NetworkType

type NetworkType int

NetworkType represents the type of network

const (
	// NetworkTypeUDP4 indicates UDP over IPv4.
	NetworkTypeUDP4 NetworkType = iota + 1

	// NetworkTypeUDP6 indicates UDP over IPv6.
	NetworkTypeUDP6

	// NetworkTypeTCP4 indicates TCP over IPv4.
	NetworkTypeTCP4

	// NetworkTypeTCP6 indicates TCP over IPv6.
	NetworkTypeTCP6
)

func (NetworkType) IsIPv4

func (t NetworkType) IsIPv4() bool

IsIPv4 returns whether the network type is IPv4 or not.

func (NetworkType) IsIPv6

func (t NetworkType) IsIPv6() bool

IsIPv6 returns whether the network type is IPv6 or not.

func (NetworkType) IsReliable

func (t NetworkType) IsReliable() bool

IsReliable returns true if the network is reliable

func (NetworkType) IsTCP

func (t NetworkType) IsTCP() bool

IsTCP returns true when network is TCP4 or TCP6.

func (NetworkType) IsUDP

func (t NetworkType) IsUDP() bool

IsUDP returns true when network is UDP4 or UDP6.

func (NetworkType) NetworkShort

func (t NetworkType) NetworkShort() string

NetworkShort returns the short network description

func (NetworkType) String

func (t NetworkType) String() string

type PriorityAttr

type PriorityAttr uint32

PriorityAttr represents PRIORITY attribute.

func (PriorityAttr) AddTo

func (p PriorityAttr) AddTo(m *stun.Message) error

AddTo adds PRIORITY attribute to message.

func (*PriorityAttr) GetFrom

func (p *PriorityAttr) GetFrom(m *stun.Message) error

GetFrom decodes PRIORITY attribute from message.

type ProtoType

type ProtoType int

ProtoType indicates the transport protocol type that is used in the ice.URL structure.

const (
	// ProtoTypeUDP indicates the URL uses a UDP transport.
	ProtoTypeUDP ProtoType = iota + 1

	// ProtoTypeTCP indicates the URL uses a TCP transport.
	ProtoTypeTCP
)

func NewProtoType

func NewProtoType(raw string) ProtoType

NewProtoType defines a procedure for creating a new ProtoType from a raw string naming the transport protocol type.

func (ProtoType) String

func (t ProtoType) String() string

type Role

type Role byte

Role represents ICE agent role, which can be controlling or controlled.

const (
	Controlling Role = iota
	Controlled
)

Possible ICE agent roles.

func (Role) MarshalText

func (r Role) MarshalText() (text []byte, err error)

MarshalText implements TextMarshaler.

func (Role) String

func (r Role) String() string

func (*Role) UnmarshalText

func (r *Role) UnmarshalText(text []byte) error

UnmarshalText implements TextUnmarshaler.

type SchemeType

type SchemeType int

SchemeType indicates the type of server used in the ice.URL structure.

const (
	// SchemeTypeSTUN indicates the URL represents a STUN server.
	SchemeTypeSTUN SchemeType = iota + 1

	// SchemeTypeSTUNS indicates the URL represents a STUNS (secure) server.
	SchemeTypeSTUNS

	// SchemeTypeTURN indicates the URL represents a TURN server.
	SchemeTypeTURN

	// SchemeTypeTURNS indicates the URL represents a TURNS (secure) server.
	SchemeTypeTURNS
)

func NewSchemeType

func NewSchemeType(raw string) SchemeType

NewSchemeType defines a procedure for creating a new SchemeType from a raw string naming the scheme type.

func (SchemeType) String

func (t SchemeType) String() string

type TCPMux

type TCPMux interface {
	io.Closer
	GetConnByUfrag(ufrag string) (net.PacketConn, error)
	RemoveConnByUfrag(ufrag string)
}

TCPMux is allows grouping multiple TCP net.Conns and using them like UDP net.PacketConns. The main implementation of this is TCPMuxDefault, and this interface exists to:

  1. prevent SEGV panics when TCPMuxDefault is not initialized by using the invalidTCPMux implementation, and
  2. allow mocking in tests.

type TCPMuxDefault

type TCPMuxDefault struct {
	// contains filtered or unexported fields
}

TCPMuxDefault muxes TCP net.Conns into net.PacketConns and groups them by Ufrag. It is a default implementation of TCPMux interface.

func NewTCPMuxDefault

func NewTCPMuxDefault(params TCPMuxParams) *TCPMuxDefault

NewTCPMuxDefault creates a new instance of TCPMuxDefault.

func (*TCPMuxDefault) Close

func (m *TCPMuxDefault) Close() error

Close closes the listener and waits for all goroutines to exit.

func (*TCPMuxDefault) GetConnByUfrag

func (m *TCPMuxDefault) GetConnByUfrag(ufrag string) (net.PacketConn, error)

GetConnByUfrag retrieves an existing or creates a new net.PacketConn.

func (*TCPMuxDefault) LocalAddr

func (m *TCPMuxDefault) LocalAddr() net.Addr

LocalAddr returns the listening address of this TCPMuxDefault.

func (*TCPMuxDefault) RemoveConnByUfrag

func (m *TCPMuxDefault) RemoveConnByUfrag(ufrag string)

RemoveConnByUfrag closes and removes a net.PacketConn by Ufrag.

type TCPMuxParams

type TCPMuxParams struct {
	Listener       net.Listener
	Logger         logging.LeveledLogger
	ReadBufferSize int
}

TCPMuxParams are parameters for TCPMux.

type TCPType

type TCPType int

TCPType is the type of ICE TCP candidate as described in ttps://tools.ietf.org/html/rfc6544#section-4.5

const (
	// TCPTypeUnspecified is the default value. For example UDP candidates do not
	// need this field.
	TCPTypeUnspecified TCPType = iota
	// TCPTypeActive is active TCP candidate, which initiates TCP connections.
	TCPTypeActive
	// TCPTypePassive is passive TCP candidate, only accepts TCP connections.
	TCPTypePassive
	// TCPTypeSimultaneousOpen is like active and passive at the same time.
	TCPTypeSimultaneousOpen
)

func NewTCPType

func NewTCPType(value string) TCPType

NewTCPType creates a new TCPType from string.

func (TCPType) String

func (t TCPType) String() string

type URL

type URL struct {
	Scheme   SchemeType
	Host     string
	Port     int
	Username string
	Password string
	Proto    ProtoType
}

URL represents a STUN (rfc7064) or TURN (rfc7065) URL

func ParseURL

func ParseURL(raw string) (*URL, error)

ParseURL parses a STUN or TURN urls following the ABNF syntax described in https://tools.ietf.org/html/rfc7064 and https://tools.ietf.org/html/rfc7065 respectively.

func (URL) IsSecure

func (u URL) IsSecure() bool

IsSecure returns whether the this URL's scheme describes secure scheme or not.

func (URL) String

func (u URL) String() string

type UseCandidateAttr

type UseCandidateAttr struct{}

UseCandidateAttr represents USE-CANDIDATE attribute.

func UseCandidate

func UseCandidate() UseCandidateAttr

UseCandidate is shorthand for UseCandidateAttr.

func (UseCandidateAttr) AddTo

func (UseCandidateAttr) AddTo(m *stun.Message) error

AddTo adds USE-CANDIDATE attribute to message.

func (UseCandidateAttr) IsSet

func (UseCandidateAttr) IsSet(m *stun.Message) bool

IsSet returns true if USE-CANDIDATE attribute is set.

Directories

Path Synopsis
examples

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL