mirror of
https://github.com/shtorm-7/sing-box-extended.git
synced 2026-05-14 00:51:12 +03:00
129 lines
3.1 KiB
Go
129 lines
3.1 KiB
Go
package v2raykcp
|
|
|
|
import (
|
|
"crypto/cipher"
|
|
|
|
"github.com/sagernet/sing-box/option"
|
|
)
|
|
|
|
// Config stores the configurations for KCP transport
|
|
type Config struct {
|
|
MTU uint32
|
|
TTI uint32
|
|
UplinkCapacity uint32
|
|
DownlinkCapacity uint32
|
|
Congestion bool
|
|
ReadBufferSize uint32
|
|
WriteBufferSize uint32
|
|
HeaderType string
|
|
Seed string
|
|
}
|
|
|
|
// NewConfig creates a new Config from options
|
|
func NewConfig(options option.V2RayKCPOptions) *Config {
|
|
return &Config{
|
|
MTU: options.GetMTU(),
|
|
TTI: options.GetTTI(),
|
|
UplinkCapacity: options.GetUplinkCapacity(),
|
|
DownlinkCapacity: options.GetDownlinkCapacity(),
|
|
Congestion: options.Congestion,
|
|
ReadBufferSize: options.GetReadBufferSize(),
|
|
WriteBufferSize: options.GetWriteBufferSize(),
|
|
HeaderType: options.GetHeaderType(),
|
|
Seed: options.Seed,
|
|
}
|
|
}
|
|
|
|
// GetMTUValue returns the value of MTU settings.
|
|
func (c *Config) GetMTUValue() uint32 {
|
|
if c == nil || c.MTU == 0 {
|
|
return 1350
|
|
}
|
|
return c.MTU
|
|
}
|
|
|
|
// GetTTIValue returns the value of TTI settings.
|
|
func (c *Config) GetTTIValue() uint32 {
|
|
if c == nil || c.TTI == 0 {
|
|
return 50
|
|
}
|
|
return c.TTI
|
|
}
|
|
|
|
// GetUplinkCapacityValue returns the value of UplinkCapacity settings.
|
|
func (c *Config) GetUplinkCapacityValue() uint32 {
|
|
if c == nil || c.UplinkCapacity == 0 {
|
|
return 12
|
|
}
|
|
return c.UplinkCapacity
|
|
}
|
|
|
|
// GetDownlinkCapacityValue returns the value of DownlinkCapacity settings.
|
|
func (c *Config) GetDownlinkCapacityValue() uint32 {
|
|
if c == nil || c.DownlinkCapacity == 0 {
|
|
return 100
|
|
}
|
|
return c.DownlinkCapacity
|
|
}
|
|
|
|
// GetWriteBufferSize returns the size of WriterBuffer in bytes.
|
|
func (c *Config) GetWriteBufferSize() uint32 {
|
|
if c == nil || c.WriteBufferSize == 0 {
|
|
return 2 * 1024 * 1024
|
|
}
|
|
return c.WriteBufferSize * 1024 * 1024
|
|
}
|
|
|
|
// GetReadBufferSize returns the size of ReadBuffer in bytes.
|
|
func (c *Config) GetReadBufferSize() uint32 {
|
|
if c == nil || c.ReadBufferSize == 0 {
|
|
return 2 * 1024 * 1024
|
|
}
|
|
return c.ReadBufferSize * 1024 * 1024
|
|
}
|
|
|
|
// GetSecurity returns the security settings.
|
|
func (c *Config) GetSecurity() (cipher.AEAD, error) {
|
|
if c.Seed != "" {
|
|
return NewAEADAESGCMBasedOnSeed(c.Seed), nil
|
|
}
|
|
return NewSimpleAuthenticator(), nil
|
|
}
|
|
|
|
// GetHeaderType returns the header type
|
|
func (c *Config) GetHeaderType() string {
|
|
if c.HeaderType == "" {
|
|
return "none"
|
|
}
|
|
return c.HeaderType
|
|
}
|
|
|
|
// GetPacketHeader builds a new PacketHeader for this config.
|
|
func (c *Config) GetPacketHeader() PacketHeader {
|
|
return NewPacketHeader(c.GetHeaderType())
|
|
}
|
|
|
|
func (c *Config) GetSendingInFlightSize() uint32 {
|
|
size := c.GetUplinkCapacityValue() * 1024 * 1024 / c.GetMTUValue() / (1000 / c.GetTTIValue())
|
|
if size < 8 {
|
|
size = 8
|
|
}
|
|
return size
|
|
}
|
|
|
|
func (c *Config) GetSendingBufferSize() uint32 {
|
|
return c.GetWriteBufferSize() / c.GetMTUValue()
|
|
}
|
|
|
|
func (c *Config) GetReceivingInFlightSize() uint32 {
|
|
size := c.GetDownlinkCapacityValue() * 1024 * 1024 / c.GetMTUValue() / (1000 / c.GetTTIValue())
|
|
if size < 8 {
|
|
size = 8
|
|
}
|
|
return size
|
|
}
|
|
|
|
func (c *Config) GetReceivingBufferSize() uint32 {
|
|
return c.GetReadBufferSize() / c.GetMTUValue()
|
|
}
|