From eb782436b3a4f50cc30049c8908a9debbe729eb8 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Fri, 23 Dec 2016 00:24:28 +0100 Subject: [PATCH] proto option for C# namespace --- app/dispatcher/config.proto | 1 + app/dns/config.proto | 1 + app/router/config.proto | 1 + app/web/config.proto | 1 + common/net/address.proto | 1 + common/net/destination.proto | 1 + common/net/network.proto | 1 + common/net/port.proto | 1 + common/protocol/headers.proto | 1 + common/protocol/server_spec.proto | 1 + common/protocol/user.proto | 1 + common/serial/typed_message.proto | 1 + config.proto | 1 + proxy/blackhole/config.proto | 1 + proxy/dokodemo/config.proto | 1 + proxy/freedom/config.proto | 1 + proxy/http/config.proto | 1 + proxy/shadowsocks/config.proto | 1 + proxy/socks/config.proto | 1 + proxy/vmess/account.proto | 2 +- proxy/vmess/inbound/config.proto | 1 + proxy/vmess/outbound/config.proto | 1 + transport/config.proto | 1 + transport/internet/config.proto | 1 + transport/internet/headers/http/config.proto | 1 + transport/internet/headers/noop/config.proto | 1 + transport/internet/headers/srtp/config.proto | 1 + transport/internet/headers/utp/config.proto | 1 + transport/internet/kcp/config.proto | 1 + transport/internet/kcp/congestion.go | 155 +++++++++++++++++++ transport/internet/tcp/config.proto | 1 + transport/internet/tls/config.proto | 1 + transport/internet/ws/config.proto | 1 + 33 files changed, 187 insertions(+), 1 deletion(-) create mode 100644 transport/internet/kcp/congestion.go diff --git a/app/dispatcher/config.proto b/app/dispatcher/config.proto index 9550ed41..7074b920 100644 --- a/app/dispatcher/config.proto +++ b/app/dispatcher/config.proto @@ -1,6 +1,7 @@ syntax = "proto3"; package v2ray.core.app.dispatcher; +option csharp_namespace = "V2Ray.Core.App.Dispatcher"; option go_package = "dispatcher"; option java_package = "com.v2ray.core.app.dispatcher"; option java_outer_classname = "ConfigProto"; diff --git a/app/dns/config.proto b/app/dns/config.proto index 3d9c7639..8f13895c 100644 --- a/app/dns/config.proto +++ b/app/dns/config.proto @@ -1,6 +1,7 @@ syntax = "proto3"; package v2ray.core.app.dns; +option csharp_namespace = "V2Ray.Core.App.Dns"; option go_package = "dns"; option java_package = "com.v2ray.core.app.dns"; option java_outer_classname = "ConfigProto"; diff --git a/app/router/config.proto b/app/router/config.proto index 06b74979..15c81cfb 100644 --- a/app/router/config.proto +++ b/app/router/config.proto @@ -1,6 +1,7 @@ syntax = "proto3"; package v2ray.core.app.router; +option csharp_namespace = "V2Ray.Core.App.Router"; option go_package = "router"; option java_package = "com.v2ray.core.app.router"; option java_outer_classname = "ConfigProto"; diff --git a/app/web/config.proto b/app/web/config.proto index e905a34a..7f80da31 100644 --- a/app/web/config.proto +++ b/app/web/config.proto @@ -1,6 +1,7 @@ syntax = "proto3"; package v2ray.core.app.web; +option csharp_namespace = "V2Ray.Core.App.Web"; option go_package = "web"; option java_package = "com.v2ray.core.app.web"; option java_outer_classname = "ConfigProto"; diff --git a/common/net/address.proto b/common/net/address.proto index 368eafa5..9208fb61 100644 --- a/common/net/address.proto +++ b/common/net/address.proto @@ -1,6 +1,7 @@ syntax = "proto3"; package v2ray.core.common.net; +option csharp_namespace = "V2Ray.Core.Common.Net"; option go_package = "net"; option java_package = "com.v2ray.core.common.net"; option java_outer_classname = "AddressProto"; diff --git a/common/net/destination.proto b/common/net/destination.proto index feb623ad..d61cb232 100644 --- a/common/net/destination.proto +++ b/common/net/destination.proto @@ -1,6 +1,7 @@ syntax = "proto3"; package v2ray.core.common.net; +option csharp_namespace = "V2Ray.Core.Common.Net"; option go_package = "net"; option java_package = "com.v2ray.core.common.net"; option java_outer_classname = "DestinationProto"; diff --git a/common/net/network.proto b/common/net/network.proto index 2d911f4e..6c14a74f 100644 --- a/common/net/network.proto +++ b/common/net/network.proto @@ -1,6 +1,7 @@ syntax = "proto3"; package v2ray.core.common.net; +option csharp_namespace = "V2Ray.Core.Common.Net"; option go_package = "net"; option java_package = "com.v2ray.core.common.net"; option java_outer_classname = "NetworkProto"; diff --git a/common/net/port.proto b/common/net/port.proto index 1f0e7b1c..be2a4863 100644 --- a/common/net/port.proto +++ b/common/net/port.proto @@ -1,6 +1,7 @@ syntax = "proto3"; package v2ray.core.common.net; +option csharp_namespace = "V2Ray.Core.Common.Net"; option go_package = "net"; option java_package = "com.v2ray.core.common.net"; option java_outer_classname = "PortProto"; diff --git a/common/protocol/headers.proto b/common/protocol/headers.proto index 25c5fdce..c48b2fe1 100644 --- a/common/protocol/headers.proto +++ b/common/protocol/headers.proto @@ -1,6 +1,7 @@ syntax = "proto3"; package v2ray.core.common.protocol; +option csharp_namespace = "V2Ray.Core.Common.Protocol"; option go_package = "protocol"; option java_package = "com.v2ray.core.common.protocol"; option java_outer_classname = "HeadersProto"; diff --git a/common/protocol/server_spec.proto b/common/protocol/server_spec.proto index d88fc552..41fd512d 100644 --- a/common/protocol/server_spec.proto +++ b/common/protocol/server_spec.proto @@ -1,6 +1,7 @@ syntax = "proto3"; package v2ray.core.common.protocol; +option csharp_namespace = "V2Ray.Core.Common.Protocol"; option go_package = "protocol"; option java_package = "com.v2ray.core.common.protocol"; option java_outer_classname = "ServerSpecProto"; diff --git a/common/protocol/user.proto b/common/protocol/user.proto index 57ec5c0e..ddbb72a9 100644 --- a/common/protocol/user.proto +++ b/common/protocol/user.proto @@ -1,6 +1,7 @@ syntax = "proto3"; package v2ray.core.common.protocol; +option csharp_namespace = "V2Ray.Core.Common.Protocol"; option go_package = "protocol"; option java_package = "com.v2ray.core.common.protocol"; option java_outer_classname = "UserProto"; diff --git a/common/serial/typed_message.proto b/common/serial/typed_message.proto index 4cb3f0ef..fba8e029 100644 --- a/common/serial/typed_message.proto +++ b/common/serial/typed_message.proto @@ -1,6 +1,7 @@ syntax = "proto3"; package v2ray.core.common.serial; +option csharp_namespace = "V2Ray.Core.Common.Serial"; option go_package = "serial"; option java_package = "com.v2ray.core.common.serial"; option java_outer_classname = "TypedMessageProto"; diff --git a/config.proto b/config.proto index 00d38fb7..db5089fd 100644 --- a/config.proto +++ b/config.proto @@ -1,6 +1,7 @@ syntax = "proto3"; package v2ray.core; +option csharp_namespace = "V2Ray.Core"; option go_package = "core"; option java_package = "com.v2ray.core"; option java_outer_classname = "ConfigProto"; diff --git a/proxy/blackhole/config.proto b/proxy/blackhole/config.proto index e51786db..a8c43082 100644 --- a/proxy/blackhole/config.proto +++ b/proxy/blackhole/config.proto @@ -1,6 +1,7 @@ syntax = "proto3"; package v2ray.core.proxy.blackhole; +option csharp_namespace = "V2Ray.Core.Proxy.Blackhole"; option go_package = "blackhole"; option java_package = "com.v2ray.core.proxy.blackhole"; option java_outer_classname = "ConfigProto"; diff --git a/proxy/dokodemo/config.proto b/proxy/dokodemo/config.proto index bc1052e2..26e05c80 100644 --- a/proxy/dokodemo/config.proto +++ b/proxy/dokodemo/config.proto @@ -1,6 +1,7 @@ syntax = "proto3"; package v2ray.core.proxy.dokodemo; +option csharp_namespace = "V2Ray.Core.Proxy.Dokodemo"; option go_package = "dokodemo"; option java_package = "com.v2ray.core.proxy.dokodemo"; option java_outer_classname = "ConfigProto"; diff --git a/proxy/freedom/config.proto b/proxy/freedom/config.proto index 4a8c51cd..32467c96 100644 --- a/proxy/freedom/config.proto +++ b/proxy/freedom/config.proto @@ -1,6 +1,7 @@ syntax = "proto3"; package v2ray.core.proxy.freedom; +option csharp_namespace = "V2Ray.Core.Proxy.Freedom"; option go_package = "freedom"; option java_package = "com.v2ray.core.proxy.freedom"; option java_outer_classname = "ConfigProto"; diff --git a/proxy/http/config.proto b/proxy/http/config.proto index b323aa65..1c892ae7 100644 --- a/proxy/http/config.proto +++ b/proxy/http/config.proto @@ -1,6 +1,7 @@ syntax = "proto3"; package v2ray.core.proxy.http; +option csharp_namespace = "V2Ray.Core.Proxy.Http"; option go_package = "http"; option java_package = "com.v2ray.core.proxy.http"; option java_outer_classname = "ConfigProto"; diff --git a/proxy/shadowsocks/config.proto b/proxy/shadowsocks/config.proto index d2ed34be..29572958 100644 --- a/proxy/shadowsocks/config.proto +++ b/proxy/shadowsocks/config.proto @@ -1,6 +1,7 @@ syntax = "proto3"; package v2ray.core.proxy.shadowsocks; +option csharp_namespace = "V2Ray.Core.Proxy.Shadowsocks"; option go_package = "shadowsocks"; option java_package = "com.v2ray.core.proxy.shadowsocks"; option java_outer_classname = "ConfigProto"; diff --git a/proxy/socks/config.proto b/proxy/socks/config.proto index ff51bf2c..3d6f7b96 100644 --- a/proxy/socks/config.proto +++ b/proxy/socks/config.proto @@ -1,6 +1,7 @@ syntax = "proto3"; package v2ray.core.proxy.socks; +option csharp_namespace = "V2Ray.Core.Proxy.Socks"; option go_package = "socks"; option java_package = "com.v2ray.core.proxy.socks"; option java_outer_classname = "ConfigProto"; diff --git a/proxy/vmess/account.proto b/proxy/vmess/account.proto index 900c2860..984a346b 100644 --- a/proxy/vmess/account.proto +++ b/proxy/vmess/account.proto @@ -1,8 +1,8 @@ syntax = "proto3"; package v2ray.core.proxy.vmess; +option csharp_namespace = "V2Ray.Core.Proxy.Vmess"; option go_package = "vmess"; - option java_package = "com.v2ray.core.proxy.vmess"; option java_outer_classname = "AccountProto"; diff --git a/proxy/vmess/inbound/config.proto b/proxy/vmess/inbound/config.proto index 4690f011..147258b5 100644 --- a/proxy/vmess/inbound/config.proto +++ b/proxy/vmess/inbound/config.proto @@ -1,6 +1,7 @@ syntax = "proto3"; package v2ray.core.proxy.vmess.inbound; +option csharp_namespace = "V2Ray.Core.Proxy.Vmess.Inbound"; option go_package = "inbound"; option java_package = "com.v2ray.core.proxy.vmess.inbound"; option java_outer_classname = "ConfigProto"; diff --git a/proxy/vmess/outbound/config.proto b/proxy/vmess/outbound/config.proto index d103fcc5..ca240adf 100644 --- a/proxy/vmess/outbound/config.proto +++ b/proxy/vmess/outbound/config.proto @@ -1,6 +1,7 @@ syntax = "proto3"; package v2ray.core.proxy.vmess.outbound; +option csharp_namespace = "V2Ray.Core.Proxy.Vmess.Outbound"; option go_package = "outbound"; option java_package = "com.v2ray.core.proxy.vmess.outbound"; option java_outer_classname = "ConfigProto"; diff --git a/transport/config.proto b/transport/config.proto index 5ddd3a0f..598b2f1c 100644 --- a/transport/config.proto +++ b/transport/config.proto @@ -1,6 +1,7 @@ syntax = "proto3"; package v2ray.core.transport; +option csharp_namespace = "V2Ray.Core.Transport"; option go_package = "transport"; option java_package = "com.v2ray.core.transport"; option java_outer_classname = "ConfigProto"; diff --git a/transport/internet/config.proto b/transport/internet/config.proto index f98dabea..3f360e8f 100644 --- a/transport/internet/config.proto +++ b/transport/internet/config.proto @@ -1,6 +1,7 @@ syntax = "proto3"; package v2ray.core.transport.internet; +option csharp_namespace = "V2Ray.Core.Transport.Internet"; option go_package = "internet"; option java_package = "com.v2ray.core.transport.internet"; diff --git a/transport/internet/headers/http/config.proto b/transport/internet/headers/http/config.proto index e7f51c9e..18b08f08 100644 --- a/transport/internet/headers/http/config.proto +++ b/transport/internet/headers/http/config.proto @@ -1,6 +1,7 @@ syntax = "proto3"; package v2ray.core.transport.internet.headers.http; +option csharp_namespace = "V2Ray.Core.Transport.Internet.Headers.Http"; option go_package = "http"; option java_package = "com.v2ray.core.transport.internet.headers.http"; option java_outer_classname = "ConfigProto"; diff --git a/transport/internet/headers/noop/config.proto b/transport/internet/headers/noop/config.proto index 0a4a7050..3e2bcec1 100644 --- a/transport/internet/headers/noop/config.proto +++ b/transport/internet/headers/noop/config.proto @@ -1,6 +1,7 @@ syntax = "proto3"; package v2ray.core.transport.internet.headers.noop; +option csharp_namespace = "V2Ray.Core.Transport.Internet.Headers.Noop"; option go_package = "noop"; option java_package = "com.v2ray.core.transport.internet.headers.noop"; option java_outer_classname = "ConfigProto"; diff --git a/transport/internet/headers/srtp/config.proto b/transport/internet/headers/srtp/config.proto index d46bec58..a8ae0235 100644 --- a/transport/internet/headers/srtp/config.proto +++ b/transport/internet/headers/srtp/config.proto @@ -1,6 +1,7 @@ syntax = "proto3"; package v2ray.core.transport.internet.headers.srtp; +option csharp_namespace = "V2Ray.Core.Transport.Internet.Headers.Srtp"; option go_package = "srtp"; option java_package = "com.v2ray.core.transport.internet.headers.srtp"; option java_outer_classname = "ConfigProto"; diff --git a/transport/internet/headers/utp/config.proto b/transport/internet/headers/utp/config.proto index ad3d8cab..81b79438 100644 --- a/transport/internet/headers/utp/config.proto +++ b/transport/internet/headers/utp/config.proto @@ -1,6 +1,7 @@ syntax = "proto3"; package v2ray.core.transport.internet.headers.utp; +option csharp_namespace = "V2Ray.Core.Transport.Internet.Headers.Utp"; option go_package = "utp"; option java_package = "com.v2ray.core.transport.internet.headers.utp"; option java_outer_classname = "ConfigProto"; diff --git a/transport/internet/kcp/config.proto b/transport/internet/kcp/config.proto index 2c8c0da4..8d51fad0 100644 --- a/transport/internet/kcp/config.proto +++ b/transport/internet/kcp/config.proto @@ -1,6 +1,7 @@ syntax = "proto3"; package v2ray.core.transport.internet.kcp; +option csharp_namespace = "V2Ray.Core.Transport.Internet.Kcp"; option go_package = "kcp"; option java_package = "com.v2ray.core.transport.internet.kcp"; option java_outer_classname = "ConfigProto"; diff --git a/transport/internet/kcp/congestion.go b/transport/internet/kcp/congestion.go new file mode 100644 index 00000000..99525fd3 --- /dev/null +++ b/transport/internet/kcp/congestion.go @@ -0,0 +1,155 @@ +package kcp + +import ( + "sync" +) + +const ( + defaultRTT = 100 + queueSize = 10 +) + +type Queue struct { + value [queueSize]uint32 + start uint32 + length uint32 +} + +func (v *Queue) Push(value uint32) { + if v.length < queueSize { + v.value[v.length] = value + v.length++ + return + } + v.value[v.start] = value + v.start++ + if v.start == queueSize { + v.start = 0 + } +} + +func (v *Queue) Max() uint32 { + max := v.value[0] + for i := 1; i < queueSize; i++ { + if v.value[i] > max { + max = v.value[i] + } + } + return max +} + +func (v *Queue) Min() uint32 { + max := v.value[0] + for i := 1; i < queueSize; i++ { + if v.value[i] < max { + max = v.value[i] + } + } + return max +} + +type CongestionState byte + +const ( + CongestionStateRTTProbe CongestionState = iota + CongestionStateBandwidthProbe + CongestionStateTransfer +) + +type Congestion struct { + sync.RWMutex + + state CongestionState + stateSince uint32 + limit uint32 // bytes per 1000 seconds + + rtt uint32 // millisec + rttHistory Queue + rttUpdateTime uint32 + + initialThroughput uint32 // bytes per 1000 seconds + + cycleStartTime uint32 + cycleBytesConfirmed uint32 + cycleBytesSent uint32 + cycleBytesLimit uint32 + + cycle uint32 + bestCycleBytesConfirmed uint32 + bestCycleBytesSent uint32 +} + +func (v *Congestion) SetState(current uint32, state CongestionState) { + v.state = state + v.stateSince = current +} + +func (v *Congestion) Update(current uint32) { + switch v.state { + case CongestionStateRTTProbe: + if v.rtt > 0 { + v.SetState(current, CongestionStateBandwidthProbe) + v.cycleStartTime = current + v.cycleBytesConfirmed = 0 + v.cycleBytesSent = 0 + v.cycleBytesLimit = v.initialThroughput * v.rtt / 1000 / 1000 + } + case CongestionStateBandwidthProbe: + if current-v.cycleStartTime >= v.rtt { + + } + } +} + +func (v *Congestion) AddBytesConfirmed(current uint32, bytesConfirmed uint32) { + v.Lock() + defer v.Unlock() + + v.cycleBytesConfirmed += bytesConfirmed + v.Update(current) +} + +func (v *Congestion) UpdateRTT(current uint32, rtt uint32) { + v.Lock() + defer v.Unlock() + + if v.state == CongestionStateRTTProbe || rtt < v.rtt { + v.rtt = rtt + v.rttUpdateTime = current + } + + v.Update(current) +} + +func (v *Congestion) GetBytesLimit() uint32 { + v.RLock() + defer v.RUnlock() + + if v.state == CongestionStateRTTProbe { + return v.initialThroughput/1000/(1000/defaultRTT) - v.cycleBytesSent + } + + return v.cycleBytesLimit +} + +func (v *Congestion) RoundTripTime() uint32 { + v.RLock() + defer v.RUnlock() + + if v.state == CongestionStateRTTProbe { + return defaultRTT + } + + return v.rtt +} + +func (v *Congestion) Timeout() uint32 { + v.RLock() + defer v.RUnlock() + + if v.state == CongestionStateRTTProbe { + return defaultRTT * 3 / 2 + } + + return v.rtt * 3 / 2 +} diff --git a/transport/internet/tcp/config.proto b/transport/internet/tcp/config.proto index c99aed50..2b051ad5 100644 --- a/transport/internet/tcp/config.proto +++ b/transport/internet/tcp/config.proto @@ -1,6 +1,7 @@ syntax = "proto3"; package v2ray.core.transport.internet.tcp; +option csharp_namespace = "V2Ray.Core.Transport.Internet.Tcp"; option go_package = "tcp"; option java_package = "com.v2ray.core.transport.internet.tcp"; option java_outer_classname = "ConfigProto"; diff --git a/transport/internet/tls/config.proto b/transport/internet/tls/config.proto index e6c627db..23c72954 100644 --- a/transport/internet/tls/config.proto +++ b/transport/internet/tls/config.proto @@ -1,6 +1,7 @@ syntax = "proto3"; package v2ray.core.transport.internet.tls; +option csharp_namespace = "V2Ray.Core.Transport.Internet.Tls"; option go_package = "tls"; option java_package = "com.v2ray.core.transport.internet.tls"; option java_outer_classname = "ConfigProto"; diff --git a/transport/internet/ws/config.proto b/transport/internet/ws/config.proto index a1c8bacd..bfc2b984 100644 --- a/transport/internet/ws/config.proto +++ b/transport/internet/ws/config.proto @@ -1,6 +1,7 @@ syntax = "proto3"; package v2ray.core.transport.internet.ws; +option csharp_namespace = "V2Ray.Core.Transport.Internet.Ws"; option go_package = "ws"; option java_package = "com.v2ray.core.transport.internet.ws"; option java_outer_classname = "ConfigProto";