adnl

package
v1.18.0 Latest Latest
Warning

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

Go to latest
Published: Jul 14, 2026 License: MIT Imports: 24 Imported by: 57

Documentation

Index

Constants

View Source
const BasePayloadMTU = 1024
View Source
const HugePacketMaxSz = 1024*8 + 128
View Source
const MaxMTU = 1500 - 40 - 8 // max is for ipv6 over ethernet

Variables

View Source
var DefaultListener = func(addr string) (net.PacketConn, error) {
	lp, err := net.ListenPacket("udp", addr)
	if err != nil {
		return nil, err
	}

	if conn, ok := lp.(*net.UDPConn); ok {
		if err := conn.SetReadBuffer(DefaultUDPBufferSize); err != nil {
			if Logger != nil {
				Logger("[ADNL] failed to set read buffer:", err)
			}
		}
		if err := conn.SetWriteBuffer(DefaultUDPBufferSize); err != nil {
			if Logger != nil {
				Logger("[ADNL] failed to set write buffer:", err)
			}
		}
	}

	return NewSyncConn(lp, PacketsBufferSize), nil
}
View Source
var DefaultMaxPendingPeers = 8192
View Source
var DefaultPendingPeerTTL = 30 * time.Second
View Source
var DefaultUDPBufferSize = 32 << 20
View Source
var ErrPacketBiggerThanMTU = fmt.Errorf("packet bigger than MTU")
View Source
var ErrPeerConnClosed = errors.New("peer connection was closed")
View Source
var ErrTooShortData = errors.New("too short data")
View Source
var Logger func(v ...any)
View Source
var PacketsBufferSize = 128 * 1024

Functions

This section is empty.

Types

type ADNL

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

func (*ADNL) Answer

func (a *ADNL) Answer(ctx context.Context, queryID []byte, result tl.Serializable) error

func (*ADNL) Close

func (a *ADNL) Close()

func (*ADNL) GetAddressList

func (a *ADNL) GetAddressList() address.List

func (*ADNL) GetCloserCtx added in v1.11.0

func (a *ADNL) GetCloserCtx() context.Context

func (*ADNL) GetDisconnectHandler added in v1.9.3

func (a *ADNL) GetDisconnectHandler() func(addr string, key ed25519.PublicKey)

func (*ADNL) GetID added in v1.5.1

func (a *ADNL) GetID() []byte

func (*ADNL) GetPubKey added in v1.11.1

func (a *ADNL) GetPubKey() ed25519.PublicKey

func (*ADNL) GetQueryHandler added in v1.7.0

func (a *ADNL) GetQueryHandler() func(msg *MessageQuery) error

func (*ADNL) Ping added in v1.13.0

func (a *ADNL) Ping(ctx context.Context) (time.Duration, error)

func (*ADNL) Query

func (a *ADNL) Query(ctx context.Context, req, result tl.Serializable) error

func (*ADNL) Reinit added in v1.11.1

func (a *ADNL) Reinit()

func (*ADNL) RemoteAddr

func (a *ADNL) RemoteAddr() string

func (*ADNL) SendCustomMessage

func (a *ADNL) SendCustomMessage(_ context.Context, req tl.Serializable) error

func (*ADNL) SendNop added in v1.18.0

func (a *ADNL) SendNop(_ context.Context) error

func (*ADNL) SetAddresses

func (a *ADNL) SetAddresses(list address.List)

func (*ADNL) SetChannelReadyHandler

func (a *ADNL) SetChannelReadyHandler(handler func(ch *Channel))

func (*ADNL) SetCustomMessageHandler

func (a *ADNL) SetCustomMessageHandler(handler func(msg *MessageCustom) error)

func (*ADNL) SetDisconnectHandler

func (a *ADNL) SetDisconnectHandler(handler func(addr string, key ed25519.PublicKey))

func (*ADNL) SetQueryHandler

func (a *ADNL) SetQueryHandler(handler func(msg *MessageQuery) error)

func (*ADNL) Stats added in v1.18.0

func (a *ADNL) Stats() PeerStats

type Channel

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

func (*Channel) SendCustomMessage

func (c *Channel) SendCustomMessage(ctx context.Context, req tl.Serializable) error

type CustomMessageHandler

type CustomMessageHandler func(msg *MessageCustom) error

type DisconnectHandler

type DisconnectHandler func(addr string, key ed25519.PublicKey)

type Gateway added in v1.6.0

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

func NewGateway added in v1.6.0

func NewGateway(key ed25519.PrivateKey) *Gateway

func NewGatewayWithNetManager added in v1.12.0

func NewGatewayWithNetManager(key ed25519.PrivateKey, reader NetManager) *Gateway

func (*Gateway) Close added in v1.6.0

func (g *Gateway) Close() error

func (*Gateway) GetActivePeers added in v1.11.1

func (g *Gateway) GetActivePeers() []Peer

func (*Gateway) GetAddressList added in v1.6.0

func (g *Gateway) GetAddressList() address.List

func (*Gateway) GetID added in v1.8.0

func (g *Gateway) GetID() []byte

func (*Gateway) GetPublicKey added in v1.17.0

func (g *Gateway) GetPublicKey() ed25519.PublicKey

func (*Gateway) RegisterClient added in v1.6.0

func (g *Gateway) RegisterClient(addr string, key ed25519.PublicKey) (Peer, error)

func (*Gateway) SetAddressList added in v1.12.0

func (g *Gateway) SetAddressList(addresses []address.Address)

func (*Gateway) SetConnectionHandler added in v1.6.0

func (g *Gateway) SetConnectionHandler(handler func(client Peer) error)

func (*Gateway) StartClient added in v1.6.0

func (g *Gateway) StartClient(listenThreads ...int) (err error)

func (*Gateway) StartServer added in v1.6.0

func (g *Gateway) StartServer(listenAddr string, listenThreads ...int) (err error)

type MessageAnswer

type MessageAnswer struct {
	ID   []byte `tl:"int256"`
	Data any    `tl:"bytes struct boxed"`
}

func (*MessageAnswer) Parse added in v1.18.0

func (m *MessageAnswer) Parse(data []byte) ([]byte, error)

func (*MessageAnswer) ParseNoCopy added in v1.18.0

func (m *MessageAnswer) ParseNoCopy(data []byte) ([]byte, error)

func (MessageAnswer) Serialize added in v1.18.0

func (m MessageAnswer) Serialize(buf *bytes.Buffer) error

type MessageConfirmChannel

type MessageConfirmChannel struct {
	Key     []byte `tl:"int256"`
	PeerKey []byte `tl:"int256"`
	Date    int32  `tl:"int"`
}

type MessageCreateChannel

type MessageCreateChannel struct {
	Key  []byte `tl:"int256"`
	Date int32  `tl:"int"`
}

type MessageCustom

type MessageCustom struct {
	Data any `tl:"bytes struct boxed"`
}

func (*MessageCustom) Parse added in v1.18.0

func (m *MessageCustom) Parse(data []byte) ([]byte, error)

func (*MessageCustom) ParseNoCopy added in v1.18.0

func (m *MessageCustom) ParseNoCopy(data []byte) ([]byte, error)

func (MessageCustom) Serialize added in v1.18.0

func (m MessageCustom) Serialize(buf *bytes.Buffer) error

type MessageNop

type MessageNop struct{}

type MessagePart

type MessagePart struct {
	Hash      []byte `tl:"int256"`
	TotalSize int32  `tl:"int"`
	Offset    int32  `tl:"int"`
	Data      []byte `tl:"bytes"`
}

type MessagePing

type MessagePing struct {
	Value int64 `tl:"long"`
}

type MessagePong

type MessagePong struct {
	Value int64 `tl:"long"`
}

type MessageQuery

type MessageQuery struct {
	ID   []byte `tl:"int256"`
	Data any    `tl:"bytes struct boxed"`
}

func (*MessageQuery) Parse added in v1.18.0

func (m *MessageQuery) Parse(data []byte) ([]byte, error)

func (*MessageQuery) ParseNoCopy added in v1.18.0

func (m *MessageQuery) ParseNoCopy(data []byte) ([]byte, error)

func (MessageQuery) Serialize added in v1.18.0

func (m MessageQuery) Serialize(buf *bytes.Buffer) error

type MessageReinit

type MessageReinit struct {
	Date int32 `tl:"int"`
}

type MultiNetManager added in v1.12.0

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

func NewMultiNetReader added in v1.12.0

func NewMultiNetReader(conn net.PacketConn) *MultiNetManager

func (*MultiNetManager) Close added in v1.13.0

func (m *MultiNetManager) Close()

func (*MultiNetManager) CloseConnection added in v1.12.0

func (m *MultiNetManager) CloseConnection(gate *Gateway)

func (*MultiNetManager) Free added in v1.12.0

func (m *MultiNetManager) Free(p *UDPPacket)

func (*MultiNetManager) GetReaderChan added in v1.12.0

func (m *MultiNetManager) GetReaderChan(gate *Gateway) <-chan *UDPPacket

func (*MultiNetManager) InitConnection added in v1.12.0

func (m *MultiNetManager) InitConnection(gate *Gateway, addr string) error

func (*MultiNetManager) WritePacket added in v1.12.0

func (m *MultiNetManager) WritePacket(gate *Gateway, p []byte, addr net.Addr) (n int, err error)

type NetManager added in v1.12.0

type NetManager interface {
	Free(p *UDPPacket)
	GetReaderChan(gate *Gateway) <-chan *UDPPacket
	InitConnection(gate *Gateway, addr string) error
	CloseConnection(gate *Gateway)
	WritePacket(gate *Gateway, p []byte, addr net.Addr) (n int, err error)
	Close()
}

type Node added in v1.17.0

type Node struct {
	ID        any           `tl:"struct boxed [pub.ed25519,pub.aes]"`
	AddrList  *address.List `tl:"struct"`
	Version   int32         `tl:"int"`
	Signature []byte        `tl:"bytes"`
}

func (*Node) CheckSignature added in v1.17.0

func (n *Node) CheckSignature() error

type PacketContent

type PacketContent struct {
	Rand1                       []byte
	From                        *keys.PublicKeyED25519
	FromIDShort                 []byte
	Messages                    []any
	Address                     *address.List
	PriorityAddress             *address.List
	Seqno                       *int64
	ConfirmSeqno                *int64
	RecvAddrListVersion         *int32
	RecvPriorityAddrListVersion *int32
	ReinitDate                  *int32
	DstReinitDate               *int32
	Signature                   []byte
	Rand2                       []byte
	// contains filtered or unexported fields
}

func (*PacketContent) ConfirmSeqnoValue added in v1.17.0

func (p *PacketContent) ConfirmSeqnoValue() int64

func (*PacketContent) DstReinitDateValue added in v1.17.0

func (p *PacketContent) DstReinitDateValue() int32

func (*PacketContent) ReinitDateValue added in v1.17.0

func (p *PacketContent) ReinitDateValue() int32

func (*PacketContent) SeqnoValue added in v1.17.0

func (p *PacketContent) SeqnoValue() int64

func (*PacketContent) Serialize

func (p *PacketContent) Serialize(buf *bytes.Buffer) (int, error)

type PacketWriter added in v1.11.0

type PacketWriter interface {
	Write(b []byte, deadline time.Time) (n int, err error)
	Close() error
}

type Peer added in v1.6.0

type Peer interface {
	SetCustomMessageHandler(handler func(msg *MessageCustom) error)
	SetQueryHandler(handler func(msg *MessageQuery) error)
	GetDisconnectHandler() func(addr string, key ed25519.PublicKey)
	SetDisconnectHandler(handler func(addr string, key ed25519.PublicKey))
	SendCustomMessage(ctx context.Context, req tl.Serializable) error
	SendNop(ctx context.Context) error
	Query(ctx context.Context, req, result tl.Serializable) error
	Answer(ctx context.Context, queryID []byte, result tl.Serializable) error
	Ping(ctx context.Context) (time.Duration, error)
	GetQueryHandler() func(msg *MessageQuery) error
	GetCloserCtx() context.Context
	SetAddresses(addresses address.List)
	RemoteAddr() string
	GetID() []byte
	GetPubKey() ed25519.PublicKey
	Stats() PeerStats
	Reinit()
	Close()
}

type PeerChannelState added in v1.18.0

type PeerChannelState uint8

PeerChannelState is the current channel negotiation state.

const (
	PeerChannelStateUnknown PeerChannelState = iota
	PeerChannelStateNone
	PeerChannelStatePending
	PeerChannelStateReady
)

type PeerChannelStats added in v1.18.0

type PeerChannelStats struct {
	State PeerChannelState
}

PeerChannelStats describes the encrypted ADNL channel state.

type PeerInboundStats added in v1.18.0

type PeerInboundStats struct {
	Packets          uint64
	Bytes            uint64
	ProcessingErrors uint64
	LastPacketAt     time.Time
	LastErrorAt      time.Time
}

PeerInboundStats describes authenticated ADNL datagrams attributed to the peer.

type PeerOutboundStats added in v1.18.0

type PeerOutboundStats struct {
	Packets      uint64
	Bytes        uint64
	WriteErrors  uint64
	LastPacketAt time.Time
	LastErrorAt  time.Time
}

PeerOutboundStats describes ADNL datagrams accepted by the packet writer.

type PeerReinitializationStats added in v1.18.0

type PeerReinitializationStats struct {
	LocalEpoch           int32
	PeerEpoch            int32
	PeerEvents           uint64
	RootRecoveryAttempts uint64
	LastPeerEventAt      time.Time
	LastRootRecoveryAt   time.Time
}

PeerReinitializationStats contains current protocol epochs and cumulative recovery events.

type PeerSequenceStats added in v1.18.0

type PeerSequenceStats struct {
	// LocalSeqno is the highest locally allocated ADNL sequence number.
	LocalSeqno int64
	// PeerSeqno is the highest ADNL sequence number received from the peer.
	PeerSeqno int64
	// ConfirmedByPeerSeqno is the highest local sequence number reported by the peer.
	ConfirmedByPeerSeqno int64
}

PeerSequenceStats contains the current ADNL sequence and confirmation state.

type PeerStats added in v1.18.0

type PeerStats struct {
	CapturedAt       time.Time
	CreatedAt        time.Time
	Closed           bool
	Channel          PeerChannelStats
	Inbound          PeerInboundStats
	Outbound         PeerOutboundStats
	Sequences        PeerSequenceStats
	Reinitialization PeerReinitializationStats
}

PeerStats is a point-in-time snapshot of an ADNL peer state. Counters are cumulative for the lifetime of the peer and are not reset by Reinit.

type QueryHandler

type QueryHandler func(msg *MessageQuery) error

type SingleNetManager added in v1.12.0

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

func NewSingleNetReader added in v1.12.0

func NewSingleNetReader(connector func(addr string) (net.PacketConn, error)) *SingleNetManager

func (*SingleNetManager) Close added in v1.13.0

func (s *SingleNetManager) Close()

func (*SingleNetManager) CloseConnection added in v1.12.0

func (s *SingleNetManager) CloseConnection(gate *Gateway)

func (*SingleNetManager) Free added in v1.12.0

func (s *SingleNetManager) Free(p *UDPPacket)

func (*SingleNetManager) GetReaderChan added in v1.12.0

func (s *SingleNetManager) GetReaderChan(gate *Gateway) <-chan *UDPPacket

func (*SingleNetManager) InitConnection added in v1.12.0

func (s *SingleNetManager) InitConnection(gate *Gateway, addr string) error

func (*SingleNetManager) WritePacket added in v1.12.0

func (s *SingleNetManager) WritePacket(gate *Gateway, p []byte, addr net.Addr) (n int, err error)

type SyncConn added in v1.11.0

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

func NewSyncConn added in v1.11.0

func NewSyncConn(conn net.PacketConn, packetsBufSz int) *SyncConn

func (*SyncConn) Close added in v1.11.0

func (s *SyncConn) Close() error

func (*SyncConn) LocalAddr added in v1.11.0

func (s *SyncConn) LocalAddr() net.Addr

func (*SyncConn) ReadFrom added in v1.11.0

func (s *SyncConn) ReadFrom(p []byte) (n int, addr net.Addr, err error)

func (*SyncConn) SetDeadline added in v1.11.0

func (s *SyncConn) SetDeadline(t time.Time) error

func (*SyncConn) SetReadDeadline added in v1.11.0

func (s *SyncConn) SetReadDeadline(t time.Time) error

func (*SyncConn) SetWriteDeadline added in v1.11.0

func (s *SyncConn) SetWriteDeadline(t time.Time) error

func (*SyncConn) WriteTo added in v1.11.0

func (s *SyncConn) WriteTo(p []byte, addr net.Addr) (n int, err error)

type UDPPacket added in v1.12.0

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

Directories

Path Synopsis
Package quic implements the TON QUIC transport: RFC 7250 raw-public-key (Ed25519/ADNL) mutual authentication over QUIC v1, with the quic.message/quic.query/quic.answer framing used by the reference C++ node.
Package quic implements the TON QUIC transport: RFC 7250 raw-public-key (Ed25519/ADNL) mutual authentication over QUIC v1, with the quic.message/quic.query/quic.answer framing used by the reference C++ node.

Jump to

Keyboard shortcuts

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