mirror of https://github.com/cbeuw/Cloak
Fix buffer size handling.
- For local buffers, it must be set on the LISTENING socket. - For remote buffers, it must be set BEFORE dialing.
This commit is contained in:
parent
870455200a
commit
2531e8cea5
|
|
@ -8,10 +8,10 @@ import (
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/cbeuw/Cloak/internal/common"
|
||||||
"net"
|
"net"
|
||||||
"os"
|
"os"
|
||||||
|
"syscall"
|
||||||
"github.com/cbeuw/Cloak/internal/common"
|
|
||||||
|
|
||||||
"github.com/cbeuw/Cloak/internal/client"
|
"github.com/cbeuw/Cloak/internal/client"
|
||||||
mux "github.com/cbeuw/Cloak/internal/multiplex"
|
mux "github.com/cbeuw/Cloak/internal/multiplex"
|
||||||
|
|
@ -154,7 +154,37 @@ func main() {
|
||||||
|
|
||||||
var seshMaker func() *mux.Session
|
var seshMaker func() *mux.Session
|
||||||
|
|
||||||
d := &net.Dialer{Control: protector, KeepAlive: remoteConfig.KeepAlive}
|
control := func(network string, address string, rawConn syscall.RawConn) error {
|
||||||
|
if !authInfo.Unordered {
|
||||||
|
sendBufferSize := remoteConfig.TcpSendBuffer
|
||||||
|
receiveBufferSize := remoteConfig.TcpReceiveBuffer
|
||||||
|
|
||||||
|
err := rawConn.Control(func(fd uintptr) {
|
||||||
|
if sendBufferSize > 0 {
|
||||||
|
log.Debugf("Setting remote connection tcp send buffer: %d", sendBufferSize)
|
||||||
|
err := syscall.SetsockoptInt(common.Platformfd(fd), syscall.SOL_SOCKET, syscall.SO_SNDBUF, sendBufferSize)
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("setsocketopt SO_SNDBUF: %s\n", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if receiveBufferSize > 0 {
|
||||||
|
log.Debugf("Setting remote connection tcp receive buffer: %d", receiveBufferSize)
|
||||||
|
err = syscall.SetsockoptInt(common.Platformfd(fd), syscall.SOL_SOCKET, syscall.SO_RCVBUF, receiveBufferSize)
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("setsocketopt SO_RCVBUF: %s\n", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return protector(network, address, rawConn)
|
||||||
|
}
|
||||||
|
|
||||||
|
d := &net.Dialer{Control: control, KeepAlive: remoteConfig.KeepAlive}
|
||||||
|
|
||||||
if adminUID != nil {
|
if adminUID != nil {
|
||||||
log.Infof("API base is %v", localConfig.LocalAddr)
|
log.Infof("API base is %v", localConfig.LocalAddr)
|
||||||
|
|
@ -199,8 +229,43 @@ func main() {
|
||||||
} else {
|
} else {
|
||||||
listener, err := net.Listen("tcp", localConfig.LocalAddr)
|
listener, err := net.Listen("tcp", localConfig.LocalAddr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
client.RouteTCP(listener, localConfig.Timeout, remoteConfig.Singleplex, localConfig.TcpSendBuffer, localConfig.TcpReceiveBuffer, seshMaker)
|
|
||||||
|
tcpListener, ok := listener.(*net.TCPListener)
|
||||||
|
if !ok {
|
||||||
|
panic("Unknown listener type")
|
||||||
|
}
|
||||||
|
|
||||||
|
syscallConn, err := tcpListener.SyscallConn()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
sendBufferSize := localConfig.TcpSendBuffer
|
||||||
|
receiveBufferSize := localConfig.TcpReceiveBuffer
|
||||||
|
|
||||||
|
err = syscallConn.Control(func(fd uintptr) {
|
||||||
|
if sendBufferSize > 0 {
|
||||||
|
log.Debugf("Setting remote connection tcp send buffer: %d", sendBufferSize)
|
||||||
|
err := syscall.SetsockoptInt(common.Platformfd(fd), syscall.SOL_SOCKET, syscall.SO_SNDBUF, sendBufferSize)
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("setsocketopt SO_SNDBUF: %s\n", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if receiveBufferSize > 0 {
|
||||||
|
log.Debugf("Setting remote connection tcp receive buffer: %d", receiveBufferSize)
|
||||||
|
err = syscall.SetsockoptInt(common.Platformfd(fd), syscall.SOL_SOCKET, syscall.SO_RCVBUF, receiveBufferSize)
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("setsocketopt SO_RCVBUF: %s\n", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
client.RouteTCP(listener, localConfig.Timeout, remoteConfig.Singleplex, seshMaker)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -32,9 +32,6 @@ func MakeSession(connConfig RemoteConnConfig, authInfo AuthInfo, dialer common.D
|
||||||
goto makeconn
|
goto makeconn
|
||||||
}
|
}
|
||||||
|
|
||||||
sendBufferSize := connConfig.TcpSendBuffer
|
|
||||||
receiveBufferSize := connConfig.TcpReceiveBuffer
|
|
||||||
|
|
||||||
tcpConn, ok := remoteConn.(*net.TCPConn)
|
tcpConn, ok := remoteConn.(*net.TCPConn)
|
||||||
if ok {
|
if ok {
|
||||||
syscallConn, err := tcpConn.SyscallConn()
|
syscallConn, err := tcpConn.SyscallConn()
|
||||||
|
|
@ -43,22 +40,6 @@ func MakeSession(connConfig RemoteConnConfig, authInfo AuthInfo, dialer common.D
|
||||||
}
|
}
|
||||||
|
|
||||||
err = syscallConn.Control(func(fd uintptr) {
|
err = syscallConn.Control(func(fd uintptr) {
|
||||||
if sendBufferSize > 0 {
|
|
||||||
log.Debugf("Setting remote connection tcp send buffer: %d", sendBufferSize)
|
|
||||||
err := syscall.SetsockoptInt(common.Platformfd(fd), syscall.SOL_SOCKET, syscall.SO_SNDBUF, sendBufferSize)
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("setsocketopt SO_SNDBUF: %s\n", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if receiveBufferSize > 0 {
|
|
||||||
log.Debugf("Setting remote connection tcp receive buffer: %d", receiveBufferSize)
|
|
||||||
err = syscall.SetsockoptInt(common.Platformfd(fd), syscall.SOL_SOCKET, syscall.SO_RCVBUF, receiveBufferSize)
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("setsocketopt SO_RCVBUF: %s\n", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
err = syscall.SetsockoptInt(common.Platformfd(fd), syscall.IPPROTO_TCP, syscall.TCP_NODELAY, 1)
|
err = syscall.SetsockoptInt(common.Platformfd(fd), syscall.IPPROTO_TCP, syscall.TCP_NODELAY, 1)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Errorf("setsocketopt TCP_NODELAY: %s\n", err)
|
log.Errorf("setsocketopt TCP_NODELAY: %s\n", err)
|
||||||
|
|
|
||||||
|
|
@ -96,7 +96,7 @@ func RouteUDP(bindFunc func() (*net.UDPConn, error), streamTimeout time.Duration
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func RouteTCP(listener net.Listener, streamTimeout time.Duration, singleplex bool, sendBufferSize int, receiveBufferSize int, newSeshFunc func() *mux.Session) {
|
func RouteTCP(listener net.Listener, streamTimeout time.Duration, singleplex bool, newSeshFunc func() *mux.Session) {
|
||||||
var sesh *mux.Session
|
var sesh *mux.Session
|
||||||
for {
|
for {
|
||||||
localConn, err := listener.Accept()
|
localConn, err := listener.Accept()
|
||||||
|
|
@ -114,22 +114,6 @@ func RouteTCP(listener net.Listener, streamTimeout time.Duration, singleplex boo
|
||||||
}
|
}
|
||||||
|
|
||||||
err = syscallConn.Control(func(fd uintptr) {
|
err = syscallConn.Control(func(fd uintptr) {
|
||||||
if sendBufferSize > 0 {
|
|
||||||
log.Debugf("Setting loopback connection tcp send buffer: %d", sendBufferSize)
|
|
||||||
err := syscall.SetsockoptInt(common.Platformfd(fd), syscall.SOL_SOCKET, syscall.SO_SNDBUF, sendBufferSize)
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("setsocketopt SO_SNDBUF: %s\n", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if receiveBufferSize > 0 {
|
|
||||||
log.Debugf("Setting loopback connection tcp receive buffer: %d", receiveBufferSize)
|
|
||||||
err = syscall.SetsockoptInt(common.Platformfd(fd), syscall.SOL_SOCKET, syscall.SO_RCVBUF, receiveBufferSize)
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("setsocketopt SO_RCVBUF: %s\n", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
err = syscall.SetsockoptInt(common.Platformfd(fd), syscall.IPPROTO_TCP, syscall.TCP_NODELAY, 1)
|
err = syscall.SetsockoptInt(common.Platformfd(fd), syscall.IPPROTO_TCP, syscall.TCP_NODELAY, 1)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Errorf("setsocketopt TCP_NODELAY: %s\n", err)
|
log.Errorf("setsocketopt TCP_NODELAY: %s\n", err)
|
||||||
|
|
|
||||||
|
|
@ -207,7 +207,7 @@ func establishSession(lcc client.LocalConnConfig, rcc client.RemoteConnConfig, a
|
||||||
} else {
|
} else {
|
||||||
var proxyToCkClientL *connutil.PipeListener
|
var proxyToCkClientL *connutil.PipeListener
|
||||||
proxyToCkClientD, proxyToCkClientL = connutil.DialerListener(10 * 1024)
|
proxyToCkClientD, proxyToCkClientL = connutil.DialerListener(10 * 1024)
|
||||||
go client.RouteTCP(proxyToCkClientL, lcc.Timeout, rcc.Singleplex, 0, 0, clientSeshMaker)
|
go client.RouteTCP(proxyToCkClientL, lcc.Timeout, rcc.Singleplex, clientSeshMaker)
|
||||||
}
|
}
|
||||||
|
|
||||||
// set up server
|
// set up server
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue