peerstate

package
v0.0.0-...-e527117 Latest Latest
Warning

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

Go to latest
Published: Oct 23, 2025 License: MIT Imports: 12 Imported by: 0

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

View Source
const (
	EstablishmentTimeout             = time.Second * 10
	EstablishmentRetryMax            = time.Minute * 10
	EstablishedPingTimeout           = time.Second * 5
	ConnectionInactivityTimeout      = time.Minute
	EstablishingPingMinInterval      = time.Millisecond * 900
	BurstEstablishingPingMinInterval = time.Millisecond * 200
)
View Source
const EstablishedPingInterval = time.Second * 2

Variables

This section is empty.

Functions

func L

func L(s PeerState) *slog.Logger

L stands for Log

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) Name

func (b *Booting) Name() string

func (*Booting) OnDirect

func (b *Booting) OnDirect(ap netip.AddrPort, clearMsg *msgsess.ClearMessage) PeerState

func (*Booting) OnRelay

func (b *Booting) OnRelay(relay int64, peer key.NodePublic, clearMsg *msgsess.ClearMessage) PeerState

func (*Booting) OnTick

func (b *Booting) OnTick() PeerState

type EstHalf

type EstHalf struct {
	*EstablishingCommon
}

func (*EstHalf) Name

func (e *EstHalf) Name() string

func (*EstHalf) OnDirect

func (e *EstHalf) OnDirect(ap netip.AddrPort, clearMsg *msgsess.ClearMessage) PeerState

func (*EstHalf) OnRelay

func (e *EstHalf) OnRelay(relay int64, peer key.NodePublic, clearMsg *msgsess.ClearMessage) PeerState

func (*EstHalf) OnTick

func (e *EstHalf) OnTick() 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) Name

func (i *Inactive) Name() string

func (*Inactive) OnDirect

func (i *Inactive) OnDirect(ap netip.AddrPort, clearMsg *msgsess.ClearMessage) PeerState

func (*Inactive) OnRelay

func (i *Inactive) OnRelay(relay int64, peer key.NodePublic, clearMsg *msgsess.ClearMessage) PeerState

func (*Inactive) OnTick

func (i *Inactive) OnTick() 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 LogTransition(from, to PeerState) PeerState

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)

func (*PingTracker) Has

func (pt *PingTracker) Has(ap netip.AddrPort) bool

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) Name

func (t *Teardown) Name() string

func (*Teardown) OnDirect

func (t *Teardown) OnDirect(ap netip.AddrPort, clearMsg *msgsess.ClearMessage) PeerState

func (*Teardown) OnRelay

func (t *Teardown) OnRelay(relay int64, peer key.NodePublic, clearMsg *msgsess.ClearMessage) PeerState

func (*Teardown) OnTick

func (t *Teardown) OnTick() PeerState

type Trying

type Trying struct {
	*StateCommon
	// contains filtered or unexported fields
}

func (*Trying) Name

func (t *Trying) Name() string

func (*Trying) OnDirect

func (t *Trying) OnDirect(ap netip.AddrPort, clearMsg *msgsess.ClearMessage) PeerState

func (*Trying) OnRelay

func (t *Trying) OnRelay(relay int64, peer key.NodePublic, clearMsg *msgsess.ClearMessage) PeerState

func (*Trying) OnTick

func (t *Trying) OnTick() 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

Jump to

Keyboard shortcuts

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