add sockopts config

This commit is contained in:
ginuerzh
2022-03-29 23:04:12 +08:00
parent 78089d8887
commit 47cfc087e9
11 changed files with 115 additions and 36 deletions

View File

@ -19,24 +19,33 @@ var (
)
type Route struct {
chain *Chain
ifceName string
nodes []*Node
logger logger.Logger
chain *Chain
nodes []*Node
logger logger.Logger
}
func (r *Route) addNode(node *Node) {
r.nodes = append(r.nodes, node)
}
func (r *Route) Dial(ctx context.Context, network, address string) (net.Conn, error) {
func (r *Route) Dial(ctx context.Context, network, address string, opts ...DialOption) (net.Conn, error) {
var options DialOptions
for _, opt := range opts {
opt(&options)
}
if r.Len() == 0 {
netd := dialer.NetDialer{
Timeout: 30 * time.Second,
Timeout: options.Timeout,
Interface: options.Interface,
}
if options.SockOpts != nil {
netd.Mark = options.SockOpts.Mark
}
if r != nil {
netd.Interface = r.ifceName
netd.Logger = r.logger
}
return netd.Dial(ctx, network, address)
}
@ -198,3 +207,29 @@ func (r *Route) bindLocal(ctx context.Context, network, address string, opts ...
return nil, err
}
}
type DialOptions struct {
Timeout time.Duration
Interface string
SockOpts *SockOpts
}
type DialOption func(opts *DialOptions)
func TimeoutDialOption(d time.Duration) DialOption {
return func(opts *DialOptions) {
opts.Timeout = d
}
}
func InterfaceDialOption(ifName string) DialOption {
return func(opts *DialOptions) {
opts.Interface = ifName
}
}
func SockOptsDialOption(so *SockOpts) DialOption {
return func(opts *DialOptions) {
opts.SockOpts = so
}
}

View File

@ -13,10 +13,15 @@ import (
"github.com/go-gost/core/resolver"
)
type SockOpts struct {
Mark int
}
type Router struct {
ifceName string
sockOpts *SockOpts
timeout time.Duration
retries int
ifceName string
chain Chainer
resolver resolver.Resolver
hosts hosts.HostMapper
@ -38,6 +43,11 @@ func (r *Router) WithInterface(ifceName string) *Router {
return r
}
func (r *Router) WithSockOpts(so *SockOpts) *Router {
r.sockOpts = so
return r
}
func (r *Router) WithChain(chain Chainer) *Router {
r.chain = chain
return r
@ -109,10 +119,11 @@ func (r *Router) dial(ctx context.Context, network, address string) (conn net.Co
if route == nil {
route = &Route{}
}
route.ifceName = r.ifceName
route.logger = r.logger
conn, err = route.Dial(ctx, network, address)
conn, err = route.Dial(ctx, network, address,
InterfaceDialOption(r.ifceName),
SockOptsDialOption(r.sockOpts),
)
if err == nil {
break
}

View File

@ -13,6 +13,7 @@ import (
type Transport struct {
addr string
ifceName string
sockOpts *SockOpts
route *Route
dialer dialer.Dialer
connector connector.Connector
@ -29,6 +30,11 @@ func (tr *Transport) WithInterface(ifceName string) *Transport {
return tr
}
func (tr *Transport) WithSockOpts(so *SockOpts) *Transport {
tr.sockOpts = so
return tr
}
func (tr *Transport) WithDialer(dialer dialer.Dialer) *Transport {
tr.dialer = dialer
return tr
@ -42,7 +48,10 @@ func (tr *Transport) WithConnector(connector connector.Connector) *Transport {
func (tr *Transport) Dial(ctx context.Context, addr string) (net.Conn, error) {
netd := &net_dialer.NetDialer{
Interface: tr.ifceName,
Timeout: 30 * time.Second,
Timeout: 15 * time.Second,
}
if tr.sockOpts != nil {
netd.Mark = tr.sockOpts.Mark
}
if tr.route.Len() > 0 {
netd.DialFunc = func(ctx context.Context, network, addr string) (net.Conn, error) {