Skip to content
Open

brutal #6254

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 31 additions & 0 deletions infra/conf/transport_internet.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package conf
import (
"context"
"encoding/base64"
"encoding/binary"
"encoding/hex"
"encoding/json"
"math"
Expand All @@ -22,6 +23,7 @@ import (
"github.com/xtls/xray-core/common/platform/filesystem"
"github.com/xtls/xray-core/common/serial"
"github.com/xtls/xray-core/transport/internet"
"github.com/xtls/xray-core/transport/internet/finalmask/brutal"
"github.com/xtls/xray-core/transport/internet/finalmask/fragment"
"github.com/xtls/xray-core/transport/internet/finalmask/header/custom"
"github.com/xtls/xray-core/transport/internet/finalmask/mkcp/aes128gcm"
Expand Down Expand Up @@ -1230,6 +1232,7 @@ var (
customVarNamePattern = regexp.MustCompile(`^[A-Za-z_][A-Za-z0-9_]*$`)

tcpmaskLoader = NewJSONConfigLoader(ConfigCreatorCache{
"force-brutal": func() interface{} { return new(Brutal) },
"header-custom": func() interface{} { return new(HeaderCustomTCP) },
"fragment": func() interface{} { return new(FragmentMask) },
"sudoku": func() interface{} { return new(Sudoku) },
Expand All @@ -1247,6 +1250,34 @@ var (
}, "type", "settings")
)

type Brutal struct {
Rate uint64 `json:"rate"`
Cwnd uint32 `json:"cwnd"`
}

func (c *Brutal) Build() (proto.Message, error) {
rate := c.Rate
cwnd := c.Cwnd
if rate == 0 {
rate = 125000
}
if cwnd == 0 {
cwnd = 20
}
if rate < 62500 {
return nil, errors.New("invalid rate ", rate)
}
if cwnd < 5 || cwnd > 80 {
return nil, errors.New("invalid cwnd ", cwnd)
}
params := make([]byte, 16)
binary.NativeEndian.PutUint64(params, rate)
binary.NativeEndian.PutUint32(params[8:], cwnd)
return &brutal.Config{
Params: params,
}, nil
}

type TCPItem struct {
Delay Int32Range `json:"delay"`
Rand int32 `json:"rand"`
Expand Down
13 changes: 13 additions & 0 deletions transport/internet/finalmask/brutal/config.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package brutal

import "net"

func (c *Config) TCP() {}

func (c *Config) WrapConnClient(raw net.Conn) (net.Conn, error) {
return NewConn(c, raw)
}

func (c *Config) WrapConnServer(raw net.Conn) (net.Conn, error) {
return NewConn(c, raw)
}
123 changes: 123 additions & 0 deletions transport/internet/finalmask/brutal/config.pb.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

11 changes: 11 additions & 0 deletions transport/internet/finalmask/brutal/config.proto
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
syntax = "proto3";

package xray.transport.internet.finalmask.brutal;
option csharp_namespace = "Xray.Transport.Internet.Finalmask.Brutal";
option go_package = "github.com/xtls/xray-core/transport/internet/finalmask/brutal";
option java_package = "com.xray.transport.internet.finalmask.brutal";
option java_multiple_files = true;

message Config {
bytes params = 1;
}
15 changes: 15 additions & 0 deletions transport/internet/finalmask/brutal/conn.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
//go:build !linux

package brutal

import (
"context"
"net"

"github.com/xtls/xray-core/common/errors"
)

func NewConn(c *Config, raw net.Conn) (net.Conn, error) {
errors.LogError(context.Background(), "unsupported system")
return raw, nil
}
39 changes: 39 additions & 0 deletions transport/internet/finalmask/brutal/conn_linux.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
//go:build linux

package brutal

import (
"context"
"net"
"reflect"

"github.com/pires/go-proxyproto"
"github.com/xtls/xray-core/common"
"github.com/xtls/xray-core/common/errors"
"golang.org/x/sys/unix"
)

func NewConn(c *Config, raw net.Conn) (net.Conn, error) {
conn := raw
if pc, ok := conn.(*proxyproto.Conn); ok {
conn = pc.Raw()
}
if _, ok := conn.(*net.TCPConn); !ok {
errors.LogError(context.Background(), "unsupported conn ", reflect.TypeOf(conn))
}
sysConn := common.Must2(conn.(*net.TCPConn).SyscallConn())
err := sysConn.Control(func(fd uintptr) {
if err := unix.SetsockoptString(int(fd), unix.IPPROTO_TCP, unix.TCP_CONGESTION, "brutal"); err != nil {
errors.LogErrorInner(context.Background(), err, "failed to set congestion")
return
}
if err := unix.SetsockoptString(int(fd), unix.IPPROTO_TCP, 23301, string(c.Params)); err != nil {
errors.LogErrorInner(context.Background(), err, "failed to set params")
return
}
})
if err != nil {
errors.LogErrorInner(context.Background(), err, "failed to control connection")
}
return raw, nil
}
2 changes: 1 addition & 1 deletion transport/internet/finalmask/finalmask.go
Original file line number Diff line number Diff line change
Expand Up @@ -256,7 +256,7 @@ func (l *tcpListener) Accept() (net.Conn, error) {

newConn, err := l.m.WrapConnServer(conn)
if err != nil {
errors.LogDebugInner(context.Background(), err, "mask err")
errors.LogErrorInner(context.Background(), err, "[mask] failed to wrap connection")
_ = conn.Close()
return nil, err
}
Expand Down
Loading