Init commit

This commit is contained in:
世界
2022-06-30 21:27:56 +08:00
commit cfa35e5a92
39 changed files with 2202 additions and 0 deletions

46
common/dialer/dialer.go Normal file
View File

@@ -0,0 +1,46 @@
package dialer
import (
"context"
"net"
"time"
"github.com/database64128/tfo-go"
"github.com/sagernet/sing-box/config"
"github.com/sagernet/sing/common/control"
M "github.com/sagernet/sing/common/metadata"
N "github.com/sagernet/sing/common/network"
)
type defaultDialer struct {
tfo.Dialer
net.ListenConfig
}
func (d *defaultDialer) DialContext(ctx context.Context, network string, address M.Socksaddr) (net.Conn, error) {
return d.Dialer.DialContext(ctx, network, address.String())
}
func (d *defaultDialer) ListenPacket(ctx context.Context) (net.PacketConn, error) {
return d.ListenConfig.ListenPacket(ctx, "udp", "")
}
func newDialer(options config.DialerOptions) N.Dialer {
var dialer net.Dialer
var listener net.ListenConfig
if options.BindInterface != "" {
dialer.Control = control.Append(dialer.Control, control.BindToInterface(options.BindInterface))
listener.Control = control.Append(listener.Control, control.BindToInterface(options.BindInterface))
}
if options.RoutingMark != 0 {
dialer.Control = control.Append(dialer.Control, control.RoutingMark(options.RoutingMark))
listener.Control = control.Append(listener.Control, control.RoutingMark(options.RoutingMark))
}
if options.ReuseAddr {
listener.Control = control.Append(listener.Control, control.ReuseAddr())
}
if options.ConnectTimeout != 0 {
dialer.Timeout = time.Duration(options.ConnectTimeout) * time.Second
}
return &defaultDialer{tfo.Dialer{Dialer: dialer, DisableTFO: !options.TCPFastOpen}, listener}
}

59
common/dialer/lazy.go Normal file
View File

@@ -0,0 +1,59 @@
package dialer
import (
"context"
"net"
"sync"
"github.com/sagernet/sing-box/adapter"
"github.com/sagernet/sing-box/config"
E "github.com/sagernet/sing/common/exceptions"
M "github.com/sagernet/sing/common/metadata"
N "github.com/sagernet/sing/common/network"
)
type LazyDialer struct {
router adapter.Router
options config.DialerOptions
dialer N.Dialer
initOnce sync.Once
initErr error
}
func NewDialer(router adapter.Router, options config.DialerOptions) N.Dialer {
return &LazyDialer{
router: router,
options: options,
}
}
func (d *LazyDialer) Dialer() (N.Dialer, error) {
d.initOnce.Do(func() {
if d.options.Detour != "" {
var loaded bool
d.dialer, loaded = d.router.Outbound(d.options.Detour)
if !loaded {
d.initErr = E.New("outbound detour not found: ", d.options.Detour)
}
} else {
d.dialer = newDialer(d.options)
}
})
return d.dialer, d.initErr
}
func (d *LazyDialer) DialContext(ctx context.Context, network string, destination M.Socksaddr) (net.Conn, error) {
dialer, err := d.Dialer()
if err != nil {
return nil, err
}
return dialer.DialContext(ctx, network, destination)
}
func (d *LazyDialer) ListenPacket(ctx context.Context) (net.PacketConn, error) {
dialer, err := d.Dialer()
if err != nil {
return nil, err
}
return dialer.ListenPacket(ctx)
}