diff --git a/proxy/vless/encoding/encoding.go b/proxy/vless/encoding/encoding.go index 1c07eb31d..e6d0f6665 100644 --- a/proxy/vless/encoding/encoding.go +++ b/proxy/vless/encoding/encoding.go @@ -14,6 +14,7 @@ import ( "v2ray.com/core/common/net" "v2ray.com/core/common/protocol" "v2ray.com/core/common/signal" + "v2ray.com/core/features/stats" "v2ray.com/core/proxy/vless" "v2ray.com/core/transport/internet/xtls" ) @@ -173,18 +174,23 @@ func DecodeResponseHeader(reader io.Reader, request *protocol.RequestHeader) (*A return responseAddons, nil } -func ReadV(reader buf.Reader, writer buf.Writer, timer signal.ActivityUpdater, conn *xtls.Conn, rawConn syscall.RawConn) error { +func ReadV(reader buf.Reader, writer buf.Writer, timer signal.ActivityUpdater, conn *xtls.Conn, rawConn syscall.RawConn, counter stats.Counter) error { err := func() error { + var ct stats.Counter for { if conn.DirectIn { conn.DirectIn = false reader = buf.NewReadVReader(conn.Connection, rawConn) + ct = counter if conn.SHOW { fmt.Println(conn.MARK, "ReadV") } } buffer, err := reader.ReadMultiBuffer() if !buffer.IsEmpty() { + if ct != nil { + ct.Add(int64(buffer.Len())) + } timer.Update() if werr := writer.WriteMultiBuffer(buffer); werr != nil { return werr diff --git a/proxy/vless/inbound/inbound.go b/proxy/vless/inbound/inbound.go index 5d29ef0f3..c35cb1406 100644 --- a/proxy/vless/inbound/inbound.go +++ b/proxy/vless/inbound/inbound.go @@ -27,6 +27,7 @@ import ( feature_inbound "v2ray.com/core/features/inbound" "v2ray.com/core/features/policy" "v2ray.com/core/features/routing" + "v2ray.com/core/features/stats" "v2ray.com/core/proxy/vless" "v2ray.com/core/proxy/vless/encoding" "v2ray.com/core/transport/internet" @@ -145,8 +146,10 @@ func (*Handler) Network() []net.Network { // Process implements proxy.Inbound.Process(). func (h *Handler) Process(ctx context.Context, network net.Network, connection internet.Connection, dispatcher routing.Dispatcher) error { sid := session.ExportIDToError(ctx) + iConn := connection - if statConn, ok := iConn.(*internet.StatCouterConnection); ok { + statConn, ok := iConn.(*internet.StatCouterConnection) + if ok { iConn = statConn.Connection } @@ -438,7 +441,11 @@ func (h *Handler) Process(ctx context.Context, network net.Network, connection i var err error if rawConn != nil { - err = encoding.ReadV(clientReader, serverWriter, timer, iConn.(*xtls.Conn), rawConn) + var counter stats.Counter + if statConn != nil { + counter = statConn.ReadCounter + } + err = encoding.ReadV(clientReader, serverWriter, timer, iConn.(*xtls.Conn), rawConn, counter) } else { // from clientReader.ReadMultiBuffer to serverWriter.WriteMultiBufer err = buf.Copy(clientReader, serverWriter, buf.UpdateActivity(timer)) diff --git a/proxy/vless/outbound/outbound.go b/proxy/vless/outbound/outbound.go index 9dc1e1942..b738e950f 100644 --- a/proxy/vless/outbound/outbound.go +++ b/proxy/vless/outbound/outbound.go @@ -20,6 +20,7 @@ import ( "v2ray.com/core/common/signal" "v2ray.com/core/common/task" "v2ray.com/core/features/policy" + "v2ray.com/core/features/stats" "v2ray.com/core/proxy/vless" "v2ray.com/core/proxy/vless/encoding" "v2ray.com/core/transport" @@ -91,7 +92,8 @@ func (h *Handler) Process(ctx context.Context, link *transport.Link, dialer inte defer conn.Close() iConn := conn - if statConn, ok := iConn.(*internet.StatCouterConnection); ok { + statConn, ok := iConn.(*internet.StatCouterConnection) + if ok { iConn = statConn.Connection } @@ -213,7 +215,11 @@ func (h *Handler) Process(ctx context.Context, link *transport.Link, dialer inte serverReader := encoding.DecodeBodyAddons(conn, request, responseAddons) if rawConn != nil { - err = encoding.ReadV(serverReader, clientWriter, timer, iConn.(*xtls.Conn), rawConn) + var counter stats.Counter + if statConn != nil { + counter = statConn.ReadCounter + } + err = encoding.ReadV(serverReader, clientWriter, timer, iConn.(*xtls.Conn), rawConn, counter) } else { // from serverReader.ReadMultiBuffer to clientWriter.WriteMultiBufer err = buf.Copy(serverReader, clientWriter, buf.UpdateActivity(timer))