Documentation
¶
Overview ¶
Package peer_state contains a state machine that tries to drive a direct connection with another peer to establishment.
In short, it tries to NAT-punch opportunistically, backing off, handling glare, and only establishing a connection after a full loop has been established. The same happens on the other peer, and direct connections are retried once pongs haven't been received for 5 seconds (with pings at 2 second intervals).
See [peer_state.mermaid] for a primary reference of this state machine.
Index ¶
- Constants
- func L(s PeerState) *slog.Logger
- func LogDirectMessage(s PeerState, ap netip.AddrPort, clearMsg *msgsess.ClearMessage)
- func LogRelayMessage(s PeerState, relay int64, peer key.NodePublic, clearMsg *msgsess.ClearMessage)
- type Booting
- type EstHalf
- type EstHalfIng
- type EstPreTransmit
- type EstRendezAck
- type EstRendezGot
- type EstTransmitting
- type Established
- func (e *Established) GetEndpoint() netip.AddrPort
- func (e *Established) Name() string
- func (e *Established) OnDirect(ap netip.AddrPort, clearMsg *msgsess.ClearMessage) PeerState
- func (e *Established) OnRelay(relay int64, peer key.NodePublic, clearMsg *msgsess.ClearMessage) PeerState
- func (e *Established) OnTick() PeerState
- type EstablishingCommon
- type Finalizing
- type Inactive
- type PeerState
- type PingTracker
- type StateCommon
- type Teardown
- type Trying
- type WaitingForInfo
Constants ¶
const ( EstablishmentTimeout = time.Second * 10 EstablishmentRetryMax = time.Minute * 10 EstablishedPingTimeout = time.Second * 5 ConnectionInactivityTimeout = time.Minute EstablishingPingMinInterval = time.Millisecond * 900 BurstEstablishingPingMinInterval = time.Millisecond * 200 )
const EstablishedPingInterval = time.Second * 2
Variables ¶
This section is empty.
Functions ¶
func LogDirectMessage ¶
func LogDirectMessage(s PeerState, ap netip.AddrPort, clearMsg *msgsess.ClearMessage)
func LogRelayMessage ¶
func LogRelayMessage(s PeerState, relay int64, peer key.NodePublic, clearMsg *msgsess.ClearMessage)
Types ¶
type Booting ¶
type Booting struct {
*StateCommon
// contains filtered or unexported fields
}
func (*Booting) OnRelay ¶
func (b *Booting) OnRelay(relay int64, peer key.NodePublic, clearMsg *msgsess.ClearMessage) PeerState
type EstHalf ¶
type EstHalf struct {
*EstablishingCommon
}
func (*EstHalf) OnRelay ¶
func (e *EstHalf) OnRelay(relay int64, peer key.NodePublic, clearMsg *msgsess.ClearMessage) PeerState
type EstHalfIng ¶
type EstHalfIng struct {
*EstablishingCommon
// contains filtered or unexported fields
}
func (*EstHalfIng) Name ¶
func (e *EstHalfIng) Name() string
func (*EstHalfIng) OnDirect ¶
func (e *EstHalfIng) OnDirect(ap netip.AddrPort, clearMsg *msgsess.ClearMessage) PeerState
func (*EstHalfIng) OnRelay ¶
func (e *EstHalfIng) OnRelay(relay int64, peer key.NodePublic, clearMsg *msgsess.ClearMessage) PeerState
func (*EstHalfIng) OnTick ¶
func (e *EstHalfIng) OnTick() PeerState
type EstPreTransmit ¶
type EstPreTransmit struct {
*EstablishingCommon
}
func (*EstPreTransmit) Name ¶
func (e *EstPreTransmit) Name() string
func (*EstPreTransmit) OnDirect ¶
func (e *EstPreTransmit) OnDirect(ap netip.AddrPort, clearMsg *msgsess.ClearMessage) PeerState
func (*EstPreTransmit) OnRelay ¶
func (e *EstPreTransmit) OnRelay(relay int64, peer key.NodePublic, clearMsg *msgsess.ClearMessage) PeerState
func (*EstPreTransmit) OnTick ¶
func (e *EstPreTransmit) OnTick() PeerState
type EstRendezAck ¶
type EstRendezAck struct {
*EstablishingCommon
}
func (*EstRendezAck) Name ¶
func (e *EstRendezAck) Name() string
func (*EstRendezAck) OnDirect ¶
func (e *EstRendezAck) OnDirect(ap netip.AddrPort, clearMsg *msgsess.ClearMessage) PeerState
func (*EstRendezAck) OnRelay ¶
func (e *EstRendezAck) OnRelay(relay int64, peer key.NodePublic, clearMsg *msgsess.ClearMessage) PeerState
func (*EstRendezAck) OnTick ¶
func (e *EstRendezAck) OnTick() PeerState
type EstRendezGot ¶
type EstRendezGot struct {
*EstablishingCommon
// contains filtered or unexported fields
}
EstRendezGot is a transient state that immediately transitions to EstRendezAck after the first OnTick
func (*EstRendezGot) Name ¶
func (e *EstRendezGot) Name() string
func (*EstRendezGot) OnDirect ¶
func (e *EstRendezGot) OnDirect(ap netip.AddrPort, clearMsg *msgsess.ClearMessage) PeerState
func (*EstRendezGot) OnRelay ¶
func (e *EstRendezGot) OnRelay(relay int64, peer key.NodePublic, clearMsg *msgsess.ClearMessage) PeerState
func (*EstRendezGot) OnTick ¶
func (e *EstRendezGot) OnTick() PeerState
type EstTransmitting ¶
type EstTransmitting struct {
*EstablishingCommon
}
func (*EstTransmitting) Name ¶
func (e *EstTransmitting) Name() string
func (*EstTransmitting) OnDirect ¶
func (e *EstTransmitting) OnDirect(ap netip.AddrPort, clearMsg *msgsess.ClearMessage) PeerState
func (*EstTransmitting) OnRelay ¶
func (e *EstTransmitting) OnRelay(relay int64, peer key.NodePublic, clearMsg *msgsess.ClearMessage) PeerState
func (*EstTransmitting) OnTick ¶
func (e *EstTransmitting) OnTick() PeerState
type Established ¶
type Established struct {
*StateCommon
// contains filtered or unexported fields
}
func (*Established) GetEndpoint ¶
func (e *Established) GetEndpoint() netip.AddrPort
func (*Established) Name ¶
func (e *Established) Name() string
func (*Established) OnDirect ¶
func (e *Established) OnDirect(ap netip.AddrPort, clearMsg *msgsess.ClearMessage) PeerState
func (*Established) OnRelay ¶
func (e *Established) OnRelay(relay int64, peer key.NodePublic, clearMsg *msgsess.ClearMessage) PeerState
func (*Established) OnTick ¶
func (e *Established) OnTick() PeerState
type EstablishingCommon ¶
type EstablishingCommon struct {
*StateCommon
// contains filtered or unexported fields
}
type Finalizing ¶
type Finalizing struct {
*EstablishingCommon
// contains filtered or unexported fields
}
func (*Finalizing) Name ¶
func (f *Finalizing) Name() string
func (*Finalizing) OnDirect ¶
func (f *Finalizing) OnDirect(ap netip.AddrPort, clearMsg *msgsess.ClearMessage) PeerState
func (*Finalizing) OnRelay ¶
func (f *Finalizing) OnRelay(relay int64, peer key.NodePublic, clearMsg *msgsess.ClearMessage) PeerState
func (*Finalizing) OnTick ¶
func (f *Finalizing) OnTick() PeerState
type Inactive ¶
type Inactive struct {
*StateCommon
}
func (*Inactive) OnRelay ¶
func (i *Inactive) OnRelay(relay int64, peer key.NodePublic, clearMsg *msgsess.ClearMessage) PeerState
type PeerState ¶
type PeerState interface {
OnTick() PeerState
OnDirect(ap netip.AddrPort, clearMsg *msgsess.ClearMessage) PeerState
OnRelay(relay int64, peer key.NodePublic, clearMsg *msgsess.ClearMessage) PeerState
// Name returns a lower-case name to be used in logging.
Name() string
// Peer returns the peer for which this state is being managed for.
Peer() key.NodePublic
}
PeerState defines an interface with which a PeerState can be driven.
The PeerState return value is effectively a nullable; if its nil, then keep the current state. If it's non-nil, replace the state for the peer with the state returned.
func LogTransition ¶
func MakeWaiting ¶
func MakeWaiting(tm ifaces.TrafficManagerActor, peer key.NodePublic) PeerState
type PingTracker ¶
type PingTracker struct {
// contains filtered or unexported fields
}
func NewPingTracker ¶
func NewPingTracker() *PingTracker
func (*PingTracker) BestAddrPort ¶
func (pt *PingTracker) BestAddrPort() (netip.AddrPort, error)
func (*PingTracker) GotPong ¶
func (pt *PingTracker) GotPong(ap netip.AddrPort)
type StateCommon ¶
type StateCommon struct {
// contains filtered or unexported fields
}
func (*StateCommon) Peer ¶
func (sc *StateCommon) Peer() key.NodePublic
type Teardown ¶
type Teardown struct {
*StateCommon
// contains filtered or unexported fields
}
func (*Teardown) OnRelay ¶
func (t *Teardown) OnRelay(relay int64, peer key.NodePublic, clearMsg *msgsess.ClearMessage) PeerState
type Trying ¶
type Trying struct {
*StateCommon
// contains filtered or unexported fields
}
func (*Trying) OnRelay ¶
func (t *Trying) OnRelay(relay int64, peer key.NodePublic, clearMsg *msgsess.ClearMessage) PeerState
type WaitingForInfo ¶
type WaitingForInfo struct {
*StateCommon
}
func (*WaitingForInfo) Name ¶
func (w *WaitingForInfo) Name() string
func (*WaitingForInfo) OnDirect ¶
func (w *WaitingForInfo) OnDirect(ap netip.AddrPort, clearMsg *msgsess.ClearMessage) PeerState
func (*WaitingForInfo) OnRelay ¶
func (w *WaitingForInfo) OnRelay(relay int64, peer key.NodePublic, clearMsg *msgsess.ClearMessage) PeerState
func (*WaitingForInfo) OnTick ¶
func (w *WaitingForInfo) OnTick() PeerState