kcp

package
v2.4.2+incompatible Latest Latest
Warning

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

Go to latest
Published: Oct 24, 2016 License: MIT Imports: 24 Imported by: 0

Documentation

Overview

Package kcp is a generated protocol buffer package.

It is generated from these files:

v2ray.com/core/transport/internet/kcp/config.proto

It has these top-level messages:

MTU
TTI
UplinkCapacity
DownlinkCapacity
WriteBuffer
ReadBuffer
Config

Package kcp - A Fast and Reliable ARQ Protocol

Acknowledgement:

skywind3000@github for inventing the KCP protocol
xtaci@github for translating to Golang

Index

Constants

View Source
const (
	NumDistro  = 5
	DistroSize = 1600
)
View Source
const (
	DataSegmentOverhead = 18
)

Variables

View Source
var (
	ErrIOTimeout        = errors.New("Read/Write timeout")
	ErrClosedListener   = errors.New("Listener closed.")
	ErrClosedConnection = errors.New("Connection closed.")
)

Functions

func AllocateBuffer

func AllocateBuffer() *alloc.Buffer

func ListenKCP

func ListenKCP(address v2net.Address, port v2net.Port, options internet.ListenOptions) (internet.Listener, error)

func NewSimpleAuthenticator

func NewSimpleAuthenticator() internet.Authenticator

Types

type AckList

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

func NewAckList

func NewAckList(writer SegmentWriter) *AckList

func (*AckList) Add

func (this *AckList) Add(number uint32, timestamp uint32)

func (*AckList) Clear

func (this *AckList) Clear(una uint32)

func (*AckList) Flush

func (this *AckList) Flush(current uint32, rto uint32)

type AckSegment

type AckSegment struct {
	Conv            uint16
	Option          SegmentOption
	ReceivingWindow uint32
	ReceivingNext   uint32
	Timestamp       uint32
	Count           byte
	NumberList      []uint32
}

func NewAckSegment

func NewAckSegment() *AckSegment

func (*AckSegment) ByteSize

func (this *AckSegment) ByteSize() int

func (*AckSegment) Bytes

func (this *AckSegment) Bytes(b []byte) []byte

func (*AckSegment) IsFull

func (this *AckSegment) IsFull() bool

func (*AckSegment) PutNumber

func (this *AckSegment) PutNumber(number uint32)

func (*AckSegment) PutTimestamp

func (this *AckSegment) PutTimestamp(timestamp uint32)

func (*AckSegment) Release

func (this *AckSegment) Release()

type AuthenticationWriter

type AuthenticationWriter struct {
	Authenticator internet.Authenticator
	Writer        io.Writer
	Config        *Config
}

func (*AuthenticationWriter) Mtu

func (this *AuthenticationWriter) Mtu() uint32

func (*AuthenticationWriter) Release

func (this *AuthenticationWriter) Release()

func (*AuthenticationWriter) Write

func (this *AuthenticationWriter) Write(payload *alloc.Buffer) error

type Buffer

type Buffer struct {
	sync.Mutex
	// contains filtered or unexported fields
}

func NewBuffer

func NewBuffer() *Buffer

func (*Buffer) Allocate

func (this *Buffer) Allocate() *alloc.Buffer

func (*Buffer) Free

func (this *Buffer) Free(b *alloc.Buffer)

func (*Buffer) IsEmpty

func (this *Buffer) IsEmpty() bool

func (*Buffer) Release

func (this *Buffer) Release()

func (*Buffer) ReleaseBuffer

func (this *Buffer) ReleaseBuffer()

type BufferedSegmentWriter

type BufferedSegmentWriter struct {
	sync.Mutex
	// contains filtered or unexported fields
}

func NewSegmentWriter

func NewSegmentWriter(writer *AuthenticationWriter) *BufferedSegmentWriter

func (*BufferedSegmentWriter) Flush

func (this *BufferedSegmentWriter) Flush()

func (*BufferedSegmentWriter) FlushWithoutLock

func (this *BufferedSegmentWriter) FlushWithoutLock()

func (*BufferedSegmentWriter) Write

func (this *BufferedSegmentWriter) Write(seg Segment)

type CmdOnlySegment

type CmdOnlySegment struct {
	Conv         uint16
	Command      Command
	Option       SegmentOption
	SendingNext  uint32
	ReceivinNext uint32
	PeerRTO      uint32
}

func NewCmdOnlySegment

func NewCmdOnlySegment() *CmdOnlySegment

func (*CmdOnlySegment) ByteSize

func (this *CmdOnlySegment) ByteSize() int

func (*CmdOnlySegment) Bytes

func (this *CmdOnlySegment) Bytes(b []byte) []byte

func (*CmdOnlySegment) Release

func (this *CmdOnlySegment) Release()

type Command

type Command byte
const (
	CommandACK       Command = 0
	CommandData      Command = 1
	CommandTerminate Command = 2
	CommandPing      Command = 3
)

type Config

type Config struct {
	Mtu              *MTU                                    `protobuf:"bytes,1,opt,name=mtu" json:"mtu,omitempty"`
	Tti              *TTI                                    `protobuf:"bytes,2,opt,name=tti" json:"tti,omitempty"`
	UplinkCapacity   *UplinkCapacity                         `protobuf:"bytes,3,opt,name=uplink_capacity,json=uplinkCapacity" json:"uplink_capacity,omitempty"`
	DownlinkCapacity *DownlinkCapacity                       `protobuf:"bytes,4,opt,name=downlink_capacity,json=downlinkCapacity" json:"downlink_capacity,omitempty"`
	Congestion       bool                                    `protobuf:"varint,5,opt,name=congestion" json:"congestion,omitempty"`
	WriteBuffer      *WriteBuffer                            `protobuf:"bytes,6,opt,name=write_buffer,json=writeBuffer" json:"write_buffer,omitempty"`
	ReadBuffer       *ReadBuffer                             `protobuf:"bytes,7,opt,name=read_buffer,json=readBuffer" json:"read_buffer,omitempty"`
	HeaderConfig     *v2ray_core_common_loader.TypedSettings `protobuf:"bytes,8,opt,name=header_config,json=headerConfig" json:"header_config,omitempty"`
}

func (*Config) Descriptor

func (*Config) Descriptor() ([]byte, []int)

func (*Config) GetAuthenticator

func (this *Config) GetAuthenticator() (internet.Authenticator, error)

func (*Config) GetDownlinkCapacity

func (m *Config) GetDownlinkCapacity() *DownlinkCapacity

func (*Config) GetHeaderConfig

func (m *Config) GetHeaderConfig() *v2ray_core_common_loader.TypedSettings

func (*Config) GetMtu

func (m *Config) GetMtu() *MTU

func (*Config) GetReadBuffer

func (m *Config) GetReadBuffer() *ReadBuffer

func (*Config) GetReceivingBufferSize

func (this *Config) GetReceivingBufferSize() uint32

func (*Config) GetReceivingInFlightSize

func (this *Config) GetReceivingInFlightSize() uint32

func (*Config) GetSendingBufferSize

func (this *Config) GetSendingBufferSize() uint32

func (*Config) GetSendingInFlightSize

func (this *Config) GetSendingInFlightSize() uint32

func (*Config) GetTti

func (m *Config) GetTti() *TTI

func (*Config) GetUplinkCapacity

func (m *Config) GetUplinkCapacity() *UplinkCapacity

func (*Config) GetWriteBuffer

func (m *Config) GetWriteBuffer() *WriteBuffer

func (*Config) ProtoMessage

func (*Config) ProtoMessage()

func (*Config) Reset

func (m *Config) Reset()

func (*Config) String

func (m *Config) String() string

type Connection

type Connection struct {
	Config *Config
	// contains filtered or unexported fields
}

Connection is a KCP connection over UDP.

func NewConnection

func NewConnection(conv uint16, writerCloser io.WriteCloser, local *net.UDPAddr, remote *net.UDPAddr, block internet.Authenticator, config *Config) *Connection

NewConnection create a new KCP connection between local and remote.

func (*Connection) Close

func (this *Connection) Close() error

Close closes the connection.

func (*Connection) Elapsed

func (this *Connection) Elapsed() uint32

func (*Connection) FetchInputFrom

func (this *Connection) FetchInputFrom(conn io.Reader)

func (*Connection) HandleOption

func (this *Connection) HandleOption(opt SegmentOption)

func (*Connection) Input

func (this *Connection) Input(data []byte) int

Input when you received a low level packet (eg. UDP packet), call it

func (*Connection) LocalAddr

func (this *Connection) LocalAddr() net.Addr

LocalAddr returns the local network address. The Addr returned is shared by all invocations of LocalAddr, so do not modify it.

func (*Connection) OnPeerClosed

func (this *Connection) OnPeerClosed()

func (*Connection) Ping

func (this *Connection) Ping(current uint32, cmd Command)

func (*Connection) Read

func (this *Connection) Read(b []byte) (int, error)

Read implements the Conn Read method.

func (*Connection) RemoteAddr

func (this *Connection) RemoteAddr() net.Addr

RemoteAddr returns the remote network address. The Addr returned is shared by all invocations of RemoteAddr, so do not modify it.

func (*Connection) Reusable

func (this *Connection) Reusable() bool

func (*Connection) SetDeadline

func (this *Connection) SetDeadline(t time.Time) error

SetDeadline sets the deadline associated with the listener. A zero time value disables the deadline.

func (*Connection) SetReadDeadline

func (this *Connection) SetReadDeadline(t time.Time) error

SetReadDeadline implements the Conn SetReadDeadline method.

func (*Connection) SetReusable

func (this *Connection) SetReusable(b bool)

func (*Connection) SetState

func (this *Connection) SetState(state State)

func (*Connection) SetWriteDeadline

func (this *Connection) SetWriteDeadline(t time.Time) error

SetWriteDeadline implements the Conn SetWriteDeadline method.

func (*Connection) State

func (this *Connection) State() State

func (*Connection) Terminate

func (this *Connection) Terminate()

func (*Connection) Write

func (this *Connection) Write(b []byte) (int, error)

Write implements the Conn Write method.

type DataSegment

type DataSegment struct {
	Conv        uint16
	Option      SegmentOption
	Timestamp   uint32
	Number      uint32
	SendingNext uint32
	Data        *alloc.Buffer
	// contains filtered or unexported fields
}

func NewDataSegment

func NewDataSegment() *DataSegment

func (*DataSegment) ByteSize

func (this *DataSegment) ByteSize() int

func (*DataSegment) Bytes

func (this *DataSegment) Bytes(b []byte) []byte

func (*DataSegment) Release

func (this *DataSegment) Release()

type DownlinkCapacity

type DownlinkCapacity struct {
	Value uint32 `protobuf:"varint,1,opt,name=value" json:"value,omitempty"`
}

Downlink capacity, in MB.

func (*DownlinkCapacity) Descriptor

func (*DownlinkCapacity) Descriptor() ([]byte, []int)

func (*DownlinkCapacity) GetValue

func (this *DownlinkCapacity) GetValue() uint32

func (*DownlinkCapacity) ProtoMessage

func (*DownlinkCapacity) ProtoMessage()

func (*DownlinkCapacity) Reset

func (m *DownlinkCapacity) Reset()

func (*DownlinkCapacity) String

func (m *DownlinkCapacity) String() string

type Listener

type Listener struct {
	sync.Mutex
	// contains filtered or unexported fields
}

Listener defines a server listening for connections

func NewListener

func NewListener(address v2net.Address, port v2net.Port, options internet.ListenOptions) (*Listener, error)

func (*Listener) Accept

func (this *Listener) Accept() (internet.Connection, error)

Accept implements the Accept method in the Listener interface; it waits for the next call and returns a generic Conn.

func (*Listener) ActiveConnections

func (this *Listener) ActiveConnections() int

func (*Listener) Addr

func (this *Listener) Addr() net.Addr

Addr returns the listener's network address, The Addr returned is shared by all invocations of Addr, so do not modify it.

func (*Listener) Close

func (this *Listener) Close() error

Close stops listening on the UDP address. Already Accepted connections are not closed.

func (*Listener) OnReceive

func (this *Listener) OnReceive(payload *alloc.Buffer, session *proxy.SessionInfo)

func (*Listener) Remove

func (this *Listener) Remove(dest string)

type MTU

type MTU struct {
	Value uint32 `protobuf:"varint,1,opt,name=value" json:"value,omitempty"`
}

Maximum Transmission Unit, in bytes.

func (*MTU) Descriptor

func (*MTU) Descriptor() ([]byte, []int)

func (*MTU) GetValue

func (this *MTU) GetValue() uint32

func (*MTU) ProtoMessage

func (*MTU) ProtoMessage()

func (*MTU) Reset

func (m *MTU) Reset()

func (*MTU) String

func (m *MTU) String() string

type ReadBuffer

type ReadBuffer struct {
	// Buffer size in bytes.
	Size uint32 `protobuf:"varint,1,opt,name=size" json:"size,omitempty"`
}

func (*ReadBuffer) Descriptor

func (*ReadBuffer) Descriptor() ([]byte, []int)

func (*ReadBuffer) GetSize

func (this *ReadBuffer) GetSize() uint32

func (*ReadBuffer) ProtoMessage

func (*ReadBuffer) ProtoMessage()

func (*ReadBuffer) Reset

func (m *ReadBuffer) Reset()

func (*ReadBuffer) String

func (m *ReadBuffer) String() string

type ReceivingWindow

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

func NewReceivingWindow

func NewReceivingWindow(size uint32) *ReceivingWindow

func (*ReceivingWindow) Advance

func (this *ReceivingWindow) Advance()

func (*ReceivingWindow) Position

func (this *ReceivingWindow) Position(idx uint32) uint32

func (*ReceivingWindow) Remove

func (this *ReceivingWindow) Remove(idx uint32) *DataSegment

func (*ReceivingWindow) RemoveFirst

func (this *ReceivingWindow) RemoveFirst() *DataSegment

func (*ReceivingWindow) Set

func (this *ReceivingWindow) Set(idx uint32, value *DataSegment) bool

func (*ReceivingWindow) Size

func (this *ReceivingWindow) Size() uint32

type ReceivingWorker

type ReceivingWorker struct {
	sync.RWMutex
	// contains filtered or unexported fields
}

func NewReceivingWorker

func NewReceivingWorker(kcp *Connection) *ReceivingWorker

func (*ReceivingWorker) CloseRead

func (this *ReceivingWorker) CloseRead()

func (*ReceivingWorker) Flush

func (this *ReceivingWorker) Flush(current uint32)

func (*ReceivingWorker) ProcessSegment

func (this *ReceivingWorker) ProcessSegment(seg *DataSegment)

func (*ReceivingWorker) ProcessSendingNext

func (this *ReceivingWorker) ProcessSendingNext(number uint32)

func (*ReceivingWorker) Read

func (this *ReceivingWorker) Read(b []byte) int

func (*ReceivingWorker) UpdateNecessary

func (this *ReceivingWorker) UpdateNecessary() bool

func (*ReceivingWorker) Write

func (this *ReceivingWorker) Write(seg Segment)

type RoundTripInfo

type RoundTripInfo struct {
	sync.RWMutex
	// contains filtered or unexported fields
}

func (*RoundTripInfo) SmoothedTime

func (this *RoundTripInfo) SmoothedTime() uint32

func (*RoundTripInfo) Timeout

func (this *RoundTripInfo) Timeout() uint32

func (*RoundTripInfo) Update

func (this *RoundTripInfo) Update(rtt uint32, current uint32)

func (*RoundTripInfo) UpdatePeerRTO

func (this *RoundTripInfo) UpdatePeerRTO(rto uint32, current uint32)

type Segment

type Segment interface {
	common.Releasable
	ByteSize() int
	Bytes([]byte) []byte
}

func ReadSegment

func ReadSegment(buf []byte) (Segment, []byte)

type SegmentOption

type SegmentOption byte
const (
	SegmentOptionClose SegmentOption = 1
)

type SegmentWriter

type SegmentWriter interface {
	Write(seg Segment)
}

type SendingWindow

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

func NewSendingWindow

func NewSendingWindow(size uint32, writer SegmentWriter, onPacketLoss func(uint32)) *SendingWindow

func (*SendingWindow) Clear

func (this *SendingWindow) Clear(una uint32)

func (*SendingWindow) First

func (this *SendingWindow) First() *DataSegment

func (*SendingWindow) Flush

func (this *SendingWindow) Flush(current uint32, rto uint32, maxInFlightSize uint32)

func (*SendingWindow) HandleFastAck

func (this *SendingWindow) HandleFastAck(number uint32, rto uint32)

func (*SendingWindow) IsEmpty

func (this *SendingWindow) IsEmpty() bool

func (*SendingWindow) IsFull

func (this *SendingWindow) IsFull() bool

func (*SendingWindow) Len

func (this *SendingWindow) Len() int

func (*SendingWindow) Push

func (this *SendingWindow) Push(seg *DataSegment)

func (*SendingWindow) Remove

func (this *SendingWindow) Remove(idx uint32)

func (*SendingWindow) Size

func (this *SendingWindow) Size() uint32

type SendingWorker

type SendingWorker struct {
	sync.RWMutex
	// contains filtered or unexported fields
}

func NewSendingWorker

func NewSendingWorker(kcp *Connection) *SendingWorker

func (*SendingWorker) CloseWrite

func (this *SendingWorker) CloseWrite()

func (*SendingWorker) FindFirstUnacknowledged

func (this *SendingWorker) FindFirstUnacknowledged()

Private: Visible for testing.

func (*SendingWorker) Flush

func (this *SendingWorker) Flush(current uint32)

func (*SendingWorker) IsEmpty

func (this *SendingWorker) IsEmpty() bool

func (*SendingWorker) OnPacketLoss

func (this *SendingWorker) OnPacketLoss(lossRate uint32)

func (*SendingWorker) ProcessAck

func (this *SendingWorker) ProcessAck(number uint32)

Private: Visible for testing.

func (*SendingWorker) ProcessReceivingNext

func (this *SendingWorker) ProcessReceivingNext(nextNumber uint32)

func (*SendingWorker) ProcessReceivingNextWithoutLock

func (this *SendingWorker) ProcessReceivingNextWithoutLock(nextNumber uint32)

func (*SendingWorker) ProcessSegment

func (this *SendingWorker) ProcessSegment(current uint32, seg *AckSegment, rto uint32)

func (*SendingWorker) Push

func (this *SendingWorker) Push(b []byte) int

func (*SendingWorker) UpdateNecessary

func (this *SendingWorker) UpdateNecessary() bool

func (*SendingWorker) Write

func (this *SendingWorker) Write(seg Segment)

Private: Visible for testing.

type SimpleAuthenticator

type SimpleAuthenticator struct{}

func (*SimpleAuthenticator) Open

func (this *SimpleAuthenticator) Open(buffer *alloc.Buffer) bool

func (*SimpleAuthenticator) Overhead

func (this *SimpleAuthenticator) Overhead() int

func (*SimpleAuthenticator) Seal

func (this *SimpleAuthenticator) Seal(buffer *alloc.Buffer)

type State

type State int32
const (
	StateActive          State = 0
	StateReadyToClose    State = 1
	StatePeerClosed      State = 2
	StateTerminating     State = 3
	StatePeerTerminating State = 4
	StateTerminated      State = 5
)

func (State) Is

func (this State) Is(states ...State) bool

type TTI

type TTI struct {
	Value uint32 `protobuf:"varint,1,opt,name=value" json:"value,omitempty"`
}

Transmission Time Interview, in milli-sec.

func (*TTI) Descriptor

func (*TTI) Descriptor() ([]byte, []int)

func (*TTI) GetValue

func (this *TTI) GetValue() uint32

func (*TTI) ProtoMessage

func (*TTI) ProtoMessage()

func (*TTI) Reset

func (m *TTI) Reset()

func (*TTI) String

func (m *TTI) String() string

type Updater

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

func NewUpdater

func NewUpdater(interval uint32, shouldContinue predicate.Predicate, shouldTerminate predicate.Predicate, updateFunc func()) *Updater

func (*Updater) Run

func (this *Updater) Run()

func (*Updater) WakeUp

func (this *Updater) WakeUp()

type UplinkCapacity

type UplinkCapacity struct {
	Value uint32 `protobuf:"varint,1,opt,name=value" json:"value,omitempty"`
}

Uplink capacity, in MB.

func (*UplinkCapacity) Descriptor

func (*UplinkCapacity) Descriptor() ([]byte, []int)

func (*UplinkCapacity) GetValue

func (this *UplinkCapacity) GetValue() uint32

func (*UplinkCapacity) ProtoMessage

func (*UplinkCapacity) ProtoMessage()

func (*UplinkCapacity) Reset

func (m *UplinkCapacity) Reset()

func (*UplinkCapacity) String

func (m *UplinkCapacity) String() string

type WriteBuffer

type WriteBuffer struct {
	// Buffer size in bytes.
	Size uint32 `protobuf:"varint,1,opt,name=size" json:"size,omitempty"`
}

func (*WriteBuffer) Descriptor

func (*WriteBuffer) Descriptor() ([]byte, []int)

func (*WriteBuffer) GetSize

func (this *WriteBuffer) GetSize() uint32

func (*WriteBuffer) ProtoMessage

func (*WriteBuffer) ProtoMessage()

func (*WriteBuffer) Reset

func (m *WriteBuffer) Reset()

func (*WriteBuffer) String

func (m *WriteBuffer) String() string

type Writer

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

func (*Writer) Close

func (this *Writer) Close() error

func (*Writer) Write

func (this *Writer) Write(payload []byte) (int, error)

Jump to

Keyboard shortcuts

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