@@ -2,6 +2,7 @@ package mux
22
33import (
44 "context"
5+ "encoding/binary"
56 "io"
67 "time"
78
@@ -16,6 +17,7 @@ import (
1617 "github.com/xtls/xray-core/core"
1718 "github.com/xtls/xray-core/features/routing"
1819 "github.com/xtls/xray-core/transport"
20+ "github.com/xtls/xray-core/transport/internet/brutal"
1921 "github.com/xtls/xray-core/transport/pipe"
2022)
2123
@@ -333,6 +335,40 @@ func (w *ServerWorker) handleStatusEnd(meta *FrameMetadata, reader *buf.Buffered
333335 return nil
334336}
335337
338+ // note: do not return error, just log it
339+ func (w * ServerWorker ) HandleSetBrutal (ctx context.Context , meta * FrameMetadata , reader * buf.BufferedReader ) error {
340+ if meta .Option .Has (OptionData ) == false {
341+ errors .LogError (ctx , "SetBrutal frame missing data" )
342+ return nil
343+ }
344+ chunkReader := NewStreamReader (reader )
345+ data , err := chunkReader .ReadMultiBuffer ()
346+ if err != nil {
347+ errors .LogError (ctx , "unexpected error when reading brutal data: " , err )
348+ }
349+ speed := binary .BigEndian .Uint64 (data .Bytes ())
350+
351+ inbound := session .InboundFromContext (ctx )
352+ if inbound == nil || inbound .Conn == nil {
353+ errors .LogError (ctx , "no inbound connection found for brutal set" )
354+ return nil
355+ }
356+ conn := inbound .Conn
357+ tcpConn , ok := conn .(* net.TCPConn )
358+ if ! ok {
359+ errors .LogError (ctx , "brutal can only be set on TCP connections" )
360+ return nil
361+ }
362+ err = brutal .SetBrutal (tcpConn , speed )
363+ if err != nil {
364+ errors .LogError (ctx , "failed to set brutal: " , err )
365+ return nil
366+ } else {
367+ errors .LogInfo (ctx , "successfully set brutal speed: " , speed )
368+ }
369+ return nil
370+ }
371+
336372func (w * ServerWorker ) handleFrame (ctx context.Context , reader * buf.BufferedReader ) error {
337373 var meta FrameMetadata
338374 err := meta .Unmarshal (reader , session .IsReverseMuxFromContext (ctx ))
@@ -349,6 +385,8 @@ func (w *ServerWorker) handleFrame(ctx context.Context, reader *buf.BufferedRead
349385 err = w .handleStatusNew (session .ContextWithIsReverseMux (ctx , false ), & meta , reader )
350386 case SessionStatusKeep :
351387 err = w .handleStatusKeep (& meta , reader )
388+ case SessionStatusSetBrutal :
389+ err = w .HandleSetBrutal (ctx , & meta , reader )
352390 default :
353391 status := meta .SessionStatus
354392 return errors .New ("unknown status: " , status ).AtError ()
0 commit comments