Skip to content

Commit

Permalink
🔫 darwin: set TCP_FASTOPEN_FORCE_ENABLE
Browse files Browse the repository at this point in the history
This disables the absolutely brutal TFO backoff mechanism.
  • Loading branch information
database64128 committed Mar 2, 2023
1 parent 695e4df commit c980f6b
Showing 1 changed file with 40 additions and 11 deletions.
51 changes: 40 additions & 11 deletions tfo_darwin.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,44 @@ import (
"golang.org/x/sys/unix"
)

const TCP_FASTOPEN_FORCE_ENABLE = 0x218

// setTFOForceEnable disables the absolutely brutal TFO backoff mechanism.
func setTFOForceEnable(fd uintptr) error {
return unix.SetsockoptInt(int(fd), unix.IPPROTO_TCP, TCP_FASTOPEN_FORCE_ENABLE, 1)
}

func SetTFOListener(fd uintptr) error {
return unix.SetsockoptInt(int(fd), unix.IPPROTO_TCP, unix.TCP_FASTOPEN, 1)
}

func (lc *ListenConfig) listenTFO(ctx context.Context, network, address string) (net.Listener, error) {
// darwin requires setting TCP_FASTOPEN after bind() and listen() calls.
ln, err := lc.ListenConfig.Listen(ctx, network, address)
// When setting TCP_FASTOPEN_FORCE_ENABLE, the socket must be in the TCPS_CLOSED state.
// This means setting it before listen().
//
// However, setting TCP_FASTOPEN requires being in the TCPS_LISTEN state,
// which means setting it after listen().
llc := *lc
llc.Control = func(network, address string, c syscall.RawConn) (err error) {
if lc.Control != nil {
if err = lc.Control(network, address, c); err != nil {
return err
}
}

if cerr := c.Control(func(fd uintptr) {
err = setTFOForceEnable(fd)
}); cerr != nil {
return cerr
}

if err != nil {
return wrapSyscallError("setsockopt", err)
}
return nil
}

ln, err := llc.ListenConfig.Listen(ctx, network, address)
if err != nil {
return nil, err
}
Expand All @@ -25,25 +56,23 @@ func (lc *ListenConfig) listenTFO(ctx context.Context, network, address string)
return nil, err
}

var innerErr error

if err = rawConn.Control(func(fd uintptr) {
innerErr = SetTFOListener(fd)
}); err != nil {
if cerr := rawConn.Control(func(fd uintptr) {
err = SetTFOListener(fd)
}); cerr != nil {
ln.Close()
return nil, err
return nil, cerr
}

if innerErr != nil {
if err != nil {
ln.Close()
return nil, innerErr
return nil, wrapSyscallError("setsockopt", err)
}

return ln, nil
}

func SetTFODialer(fd uintptr) error {
return nil
return setTFOForceEnable(fd)
}

func socket(domain int) (fd int, err error) {
Expand Down

0 comments on commit c980f6b

Please sign in to comment.